2022-04-08 21:24:54 +08:00
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 n = 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 n . stats . forEach ( function ( e ) { e . name == t && ( i = e ) } ) , null != i ? t + "<br/>流量:" + i . formattedBytes + "<br/>流量占比:" + i . percent + "%<br/>请求数:" + i . formattedCountRequests + "<br/>攻击数:" + i . formattedCountAttackRequests : t } } , data : this . stats . map ( function ( e ) { let t = parseFloat ( e . percent ) / n . maxPercent , i = 3 * ( t = t < n . minOpacity ? n . minOpacity : t ) ; 1 < i && ( i = 1 ) ; let s = n . vIsAttack ? "#B03A5B" : "#276AC6" ; return { name : e . name , value : e . bytes , percent : parseFloat ( e . percent ) , itemStyle : { areaColor : s , opacity : t } , emphasis : { itemStyle : { areaColor : s , opacity : i } , label : { show : ! 0 , formatter : function ( e ) { return e . name } } } , label : { show : ! 1 , formatter : function ( e ) { return e . name == n . selectedCountryName ? e . name : "" } , fontSize : "10px" , color : "#fff" , backgroundColor : "#8B9BD3" , padding : [ 2 , 2 , 2 , 2 ] } } } ) , nameMap : window . WorldCountriesMap } ] } ) , this . chart . resize ( ) } , selectCountry : function ( s ) { if ( null != this . chart ) { let e = this . chart . getOption ( ) , i = this ; e . series [ 0 ] . data . forEach ( function ( e ) { let t = e . percent / i . maxPercent ; if ( t < i . minOpacity && ( t = i . minOpacity ) , e . name == s ) { if ( e . isSelected ) return e . itemStyle . opacity = t , e . isSelected = ! 1 , e . label . show = ! 1 , void ( i . selectedCountryName = "" ) ; e . isSelected = ! 0 , i . selectedCountryName = s , ( t = 1 < ( t *= 3 ) ? 1 : t ) < . 5 && ( t = . 5 ) , e . itemStyle . opacity = t , e . label . show = ! 0 } else e . itemStyle . opacity = t , e . isSelected = ! 1 , e . label . show = ! 1 } ) , this . chart . setOption ( e ) } } , select : function ( e ) { this . selectCountry ( e . countryName ) } } , template : ` <div>
2021-12-06 08:55:47 +08:00
< table style = "width: 100%; border: 0; padding: 0; margin: 0" >
< tbody >
< tr >
2021-12-05 20:59:07 +08:00
< td >
2021-12-06 08:55:47 +08:00
< div class = "traffic-map-box" id = "traffic-map-box" > < / d i v >
2021-12-05 20:59:07 +08:00
< / t d >
2021-12-06 08:55:47 +08:00
< td style = "width: 14em" v - if = "!screenIsNarrow" >
< traffic - map - box - table : v - stats = "stats" : v - is - attack = "isAttack" @ select = "select" > < / t r a f f i c - m a p - b o x - t a b l e >
2021-12-05 20:59:07 +08:00
< / t d >
< / t r >
2021-12-06 08:55:47 +08:00
< / t b o d y >
< tbody v - if = "screenIsNarrow" >
< tr >
< td colspan = "2" >
2021-12-12 17:14:46 +08:00
< traffic - map - box - table : v - stats = "stats" : v - is - attack = "isAttack" : v - screen - is - narrow = "true" @ select = "select" > < / t r a f f i c - m a p - b o x - t a b l e >
2021-12-06 08:55:47 +08:00
< / t d >
< / t r >
< / t b o d y >
2021-12-05 20:59:07 +08:00
< / t a b l e >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " t r a f f i c - m a p - b o x - t a b l e " , { p r o p s : [ " v - s t a t s " , " v - i s - a t t a c k " , " v - s c r e e n - i s - n a r r o w " ] , d a t a : f u n c t i o n ( ) { r e t u r n { s t a t s : t h i s . v S t a t s , i s A t t a c k : t h i s . v I s A t t a c k } } , m e t h o d s : { s e l e c t : f u n c t i o n ( e ) { t h i s . $ e m i t ( " s e l e c t " , { c o u n t r y N a m e : e } ) } } , t e m p l a t e : ` < d i v s t y l e = " o v e r f l o w - y : a u t o " : s t y l e = " { ' m a x - h e i g h t ' : v S c r e e n I s N a r r o w ? ' a u t o ' : ' 1 6 e m ' } " c l a s s = " n a r r o w - s c r o l l b a r " >
2021-12-06 08:55:47 +08:00
< table class = "ui table selectable" >
< thead >
< tr >
< th colspan = "2" > 国家 / 地区排行 & nbsp ; < tip - icon content = "只有开启了统计的服务才会有记录。" > < / t i p - i c o n > < / t h >
< / t r >
< / t h e a d >
< tbody v - if = "stats.length == 0" >
< tr >
< td colspan = "2" > 暂无数据 < / t d >
< / t r >
< / t b o d y >
< tbody >
< tr v - for = "(stat, index) in stats.slice(0, 10)" >
< td @ click . prevent = "select(stat.name)" style = "cursor: pointer" colspan = "2" >
< div class = "ui progress bar" : class = "{red: vIsAttack, blue:!vIsAttack}" style = "margin-bottom: 0.3em" >
< div class = "bar" style = "min-width: 0; height: 4px;" : style = "{width: stat.percent + '%'}" > < / d i v >
< / d i v >
< div > { { stat . name } } < / d i v >
< div > < span class = "grey" > { { stat . percent } } % < / s p a n >
< span class = "small grey" v - if = "isAttack" > { { stat . formattedCountAttackRequests } } < / s p a n >
< span class = "small grey" v - if = "!isAttack" > ( { { stat . formattedBytes } } ) < / s p a n > < / d i v >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
2022-05-19 17:14:19 +08:00
< /div>`}),Vue.component("ddos-protection-ports-config-box",{props:["v-ports"],data:function(){let e=this.vPorts;return{ports:e=null==e?[]:e,isAdding:!1,addingPort:{port:"",description:""}}},methods:{add:function(){this.isAdding=!0;let e=this;setTimeout(function(){e.$refs.addingPortInput.focus()})},confirm:function(){var e=this.addingPort.port;if(0==e.length)this.warn("请输入端口号");else if(/ ^ \ d + $ / . test ( e ) ) { let i = parseInt ( e , 10 ) ; if ( i <= 0 ) this . warn ( "请输入正确的端口号" ) ; else if ( 65535 < i ) this . warn ( "请输入正确的端口号" ) ; else { let t = ! 1 ; this . ports . forEach ( function ( e ) { e . port == i && ( t = ! 0 ) } ) , t ? this . warn ( "端口号已经存在" ) : ( this . ports . push ( { port : i , description : this . addingPort . description } ) , this . notifyChange ( ) , this . cancel ( ) ) } } else this . warn ( "请输入正确的端口号" ) } , cancel : function ( ) { this . isAdding = ! 1 , this . addingPort = { port : "" , description : "" } } , remove : function ( e ) { this . ports . $remove ( e ) , this . notifyChange ( ) } , warn : function ( e ) { let t = this ; teaweb . warn ( e , function ( ) { t . $refs . addingPortInput . focus ( ) } ) } , notifyChange : function ( ) { this . $emit ( "change" , this . ports ) } } , template : ` <div>
< div v - if = "ports.length > 0" >
< div class = "ui label basic tiny" v - for = "(portConfig, index) in ports" >
{ { portConfig . port } } < span class = "grey small" v - if = "portConfig.description.length > 0" > ( { { portConfig . description } } ) < /span> <a href="" @click.prevent="remove(index)" title="删除"><i class="icon remove"></i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div v - if = "isAdding" >
< div class = "ui fields inline" >
< div class = "ui field" >
< div class = "ui input left labeled" >
< span class = "ui label" > 端口 < / s p a n >
< input type = "text" v - model = "addingPort.port" ref = "addingPortInput" maxlength = "5" size = "5" placeholder = "端口号" @ keyup . enter = "confirm" @ keypress . enter . prevent = "1" / >
< / d i v >
< / d i v >
< div class = "ui field" >
< div class = "ui input left labeled" >
< span class = "ui label" > 备注 < / s p a n >
< input type = "text" v - model = "addingPort.description" maxlength = "12" size = "12" placeholder = "备注(可选)" @ keyup . enter = "confirm" @ keypress . enter . prevent = "1" / >
< / d i v >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirm" > 确定 < / b u t t o n >
& nbsp ; < a href = "" @ click . prevent = "cancel()" > 取消 < / a >
< / d i v >
< / d i v >
< / d i v >
< div v - if = "!isAdding" >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - c l u s t e r s - l a b e l s " , { p r o p s : [ " v - p r i m a r y - c l u s t e r " , " v - s e c o n d a r y - c l u s t e r s " , " s i z e " ] , d a t a : f u n c t i o n ( ) { v a r e = t h i s . v P r i m a r y C l u s t e r ; l e t t = t h i s . v S e c o n d a r y C l u s t e r s , i = ( n u l l = = t & & ( t = [ ] ) , t h i s . s i z e ) ; r e t u r n n u l l = = i & & ( i = " s m a l l " ) , { c l u s t e r : e , s e c o n d a r y C l u s t e r s : t , l a b e l S i z e : i } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< a v - if = "cluster != null" : href = "'/clusters/cluster?clusterId=' + cluster.id" title = "主集群" style = "margin-bottom: 0.3em;" >
< span class = "ui label basic grey" : class = "labelSize" v - if = "labelSize != 'tiny'" > { { cluster . name } } < / s p a n >
< grey - label v - if = "labelSize == 'tiny'" > { { cluster . name } } < / g r e y - l a b e l >
< / a >
< a v - for = "c in secondaryClusters" : href = "'/clusters/cluster?clusterId=' + c.id" : class = "labelSize" title = "从集群" >
< span class = "ui label basic grey" : class = "labelSize" v - if = "labelSize != 'tiny'" > { { c . name } } < / s p a n >
< grey - label v - if = "labelSize == 'tiny'" > { { c . name } } < / g r e y - l a b e l >
< / a >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " c l u s t e r - s e l e c t o r " , { p r o p s : [ " v - c l u s t e r - i d " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / c l u s t e r s / o p t i o n s " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . c l u s t e r s = e . d a t a . c l u s t e r s } ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C l u s t e r I d ; r e t u r n { c l u s t e r s : [ ] , c l u s t e r I d : e = n u l l = = e ? 0 : e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< select class = "ui dropdown" style = "max-width: 10em" name = "clusterId" v - model = "clusterId" >
< option value = "0" > [ 选择集群 ] < / o p t i o n >
< option v - for = "cluster in clusters" : value = "cluster.id" > { { cluster . name } } < / o p t i o n >
< / s e l e c t >
2022-05-19 17:14:19 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - d d o s - p r o t e c t i o n - c o n f i g - b o x " , { p r o p s : [ " v - d d o s - p r o t e c t i o n - c o n f i g " , " v - d e f a u l t - c o n f i g s " , " v - i s - n o d e " , " v - c l u s t e r - i s - o n " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v D d o s P r o t e c t i o n C o n f i g ; r e t u r n n u l l = = ( e = n u l l = = e ? { t c p : { i s P r i o r : ! 1 , i s O n : ! 1 , m a x C o n n e c t i o n s : 0 , m a x C o n n e c t i o n s P e r I P : 0 , n e w C o n n e c t i o n s R a t e : 0 , a l l o w I P L i s t : [ ] , p o r t s : [ ] } } : e ) . t c p & & ( e . t c p = { i s P r i o r : ! 1 , i s O n : ! 1 , m a x C o n n e c t i o n s : 0 , m a x C o n n e c t i o n s P e r I P : 0 , n e w C o n n e c t i o n s R a t e : 0 , a l l o w I P L i s t : [ ] , p o r t s : [ ] } ) , { c o n f i g : e , d e f a u l t C o n f i g s : t h i s . v D e f a u l t C o n f i g s , i s N o d e : t h i s . v I s N o d e , i s A d d i n g P o r t : ! 1 } } , m e t h o d s : { c h a n g e T C P P o r t s : f u n c t i o n ( e ) { t h i s . c o n f i g . t c p . p o r t s = e } , c h a n g e T C P A l l o w I P L i s t : f u n c t i o n ( e ) { t h i s . c o n f i g . t c p . a l l o w I P L i s t = e } } , t e m p l a t e : ` < d i v >
< input type = "hidden" name = "ddosProtectionJSON" : value = "JSON.stringify(config)" / >
< p class = "comment" > 功能说明 : 此功能为 < strong > 试验性质 < / s t r o n g > , 目 前 仅 能 防 御 简 单 的 D D o S 攻 击 , 试 验 期 间 建 议 仅 在 被 攻 击 时 启 用 , 仅 支 持 已 安 装 < c o d e - l a b e l > n f t a b l e s v 0 . 9 < / c o d e - l a b e l > 以 上 的 L i n u x 系 统 。 < p r o - w a r n i n g - l a b e l > < / p r o - w a r n i n g - l a b e l > < / p >
< div class = "ui message" v - if = "vClusterIsOn" > 当前节点所在集群已设置DDoS防护 。 < / d i v >
< h4 > TCP设置 < / h 4 >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "config.tcp" v - if = "isNode" > < / p r i o r - c h e c k b o x >
< tbody v - show = "config.tcp.isPrior || !isNode" >
< tr >
< td class = "title" > 启用 < / t d >
< td >
< checkbox v - model = "config.tcp.isOn" > < / c h e c k b o x >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "config.tcp.isOn && (config.tcp.isPrior || !isNode)" >
< tr >
< td class = "title" > 单节点TCP最大连接数 < / t d >
< td >
< digit - input name = "tcpMaxConnections" v - model = "config.tcp.maxConnections" maxlength = "6" size = "6" style = "width: 6em" > < / d i g i t - i n p u t >
< p class = "comment" > 单个节点可以接受的TCP最大连接数 。 如果为0 , 则默认为 { { defaultConfigs . tcpMaxConnections } } 。 < / p >
< / t d >
< / t r >
< tr >
< td > 单IP TCP最大连接数 < / t d >
< td >
< digit - input name = "tcpMaxConnectionsPerIP" v - model = "config.tcp.maxConnectionsPerIP" maxlength = "6" size = "6" style = "width: 6em" > < / d i g i t - i n p u t >
< p class = "comment" > 单个IP可以连接到节点的TCP最大连接数 。 如果为0 , 则默认为 { { defaultConfigs . tcpMaxConnectionsPerIP } } ; 最小值为 { { defaultConfigs . tcpMinConnectionsPerIP } } 。 < / p >
< / t d >
< / t r >
< tr >
< td > 单IP TCP新连接速率 < / t d >
< td >
< div class = "ui input right labeled" >
< digit - input name = "tcpNewConnectionsRate" v - model = "config.tcp.newConnectionsRate" maxlength = "6" size = "6" style = "width: 6em" : min = "defaultConfigs.tcpNewConnectionsMinRate" > < / d i g i t - i n p u t >
< span class = "ui label" > 个新连接 / 每分钟 < / s p a n >
< / d i v >
< p class = "comment" > 单个IP可以创建TCP新连接的速率 。 如果为0 , 则默认为 { { defaultConfigs . tcpNewConnectionsRate } } ; 最小值为 { { defaultConfigs . tcpNewConnectionsMinRate } } 。 < / p >
< / t d >
< / t r >
< tr >
< td > TCP端口列表 < / t d >
< td >
< ddos - protection - ports - config - box : v - ports = "config.tcp.ports" @ change = "changeTCPPorts" > < / d d o s - p r o t e c t i o n - p o r t s - c o n f i g - b o x >
2022-06-09 19:45:09 +08:00
< p class = "comment" > 在这些端口上使用当前配置 。 默认为80和443两个端口 。 < / p >
2022-05-19 17:14:19 +08:00
< / t d >
< / t r >
< tr >
< td > IP白名单 < / t d >
< td >
< ddos - protection - ip - list - config - box : v - ip - list = "config.tcp.allowIPList" @ change = "changeTCPAllowIPList" > < / d d o s - p r o t e c t i o n - i p - l i s t - c o n f i g - b o x >
< p class = "comment" > 在白名单中的IP不受当前设置的限制 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
< /div>`}),Vue.component("ddos-protection-ip-list-config-box",{props:["v-ip-list"],data:function(){let e=this.vIpList;return{list:e=null==e?[]:e,isAdding:!1,addingIP:{ip:"",description:""}}},methods:{add:function(){this.isAdding=!0;let e=this;setTimeout(function(){e.$refs.addingIPInput.focus()})},confirm:function(){let i=this.addingIP.ip;if(0==i.length)this.warn("请输入IP");else{let t=!1;if(this.list.forEach(function(e){e.ip==i&&(t=!0)}),t)this.warn("IP '"+i+"'已经存在");else{let e=this;Tea.Vue.$post("/ui / validateIPs ").params({ips:[i]}).success(function(){e.list.push({ip:i,description:e.addingIP.description}),e.notifyChange(),e.cancel()}).fail(function(){e.warn(" 请输入正确的IP ")})}}},cancel:function(){this.isAdding=!1,this.addingIP={ip:" ",description:" "}},remove:function(e){this.list.$remove(e),this.notifyChange()},warn:function(e){let t=this;teaweb.warn(e,function(){t.$refs.addingIPInput.focus()})},notifyChange:function(){this.$emit(" change " , this . list ) } } , template : ` <div>
< div v - if = "list.length > 0" >
< div class = "ui label basic tiny" v - for = "(ipConfig, index) in list" >
{ { ipConfig . ip } } < span class = "grey small" v - if = "ipConfig.description.length > 0" > ( { { ipConfig . description } } ) < /span> <a href="" @click.prevent="remove(index)" title="删除"><i class="icon remove"></i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div v - if = "isAdding" >
< div class = "ui fields inline" >
< div class = "ui field" >
< div class = "ui input left labeled" >
< span class = "ui label" > IP < / s p a n >
< input type = "text" v - model = "addingIP.ip" ref = "addingIPInput" maxlength = "40" size = "20" placeholder = "IP" @ keyup . enter = "confirm" @ keypress . enter . prevent = "1" / >
< / d i v >
< / d i v >
< div class = "ui field" >
< div class = "ui input left labeled" >
< span class = "ui label" > 备注 < / s p a n >
< input type = "text" v - model = "addingIP.description" maxlength = "10" size = "10" placeholder = "备注(可选)" @ keyup . enter = "confirm" @ keypress . enter . prevent = "1" / >
< / d i v >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirm" > 确定 < / b u t t o n >
& nbsp ; < a href = "" @ click . prevent = "cancel()" > 取消 < / a >
< / d i v >
< / d i v >
< / d i v >
< div v - if = "!isAdding" >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - c l u s t e r - c o m b o - b o x " , { p r o p s : [ " v - c l u s t e r - i d " ] , d a t a : f u n c t i o n ( ) { l e t t = t h i s ; r e t u r n T e a . a c t i o n ( " / c l u s t e r s / o p t i o n s " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . c l u s t e r s = e . d a t a . c l u s t e r s } ) , { c l u s t e r s : [ ] } } , m e t h o d s : { c h a n g e : f u n c t i o n ( e ) { n u l l = = e ? t h i s . $ e m i t ( " c h a n g e " , 0 ) : t h i s . $ e m i t ( " c h a n g e " , e . v a l u e ) } } , t e m p l a t e : ` < d i v v - i f = " c l u s t e r s . l e n g t h > 0 " s t y l e = " m i n - w i d t h : 1 0 . 4 e m " >
2022-01-11 15:28:50 +08:00
< combo - box title = "集群" placeholder = "集群名称" : v - items = "clusters" name = "clusterId" : v - value = "vClusterId" @ change = "change" > < / c o m b o - b o x >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - c l u s t e r s - s e l e c t o r " , { p r o p s : [ " v - p r i m a r y - c l u s t e r " , " v - s e c o n d a r y - c l u s t e r s " ] , d a t a : f u n c t i o n ( ) { v a r e = t h i s . v P r i m a r y C l u s t e r ; l e t t = t h i s . v S e c o n d a r y C l u s t e r s ; r e t u r n n u l l = = t & & ( t = [ ] ) , { p r i m a r y C l u s t e r I d : n u l l = = e ? 0 : e . i d , s e c o n d a r y C l u s t e r I d s : t . m a p ( f u n c t i o n ( e ) { r e t u r n e . i d } ) , p r i m a r y C l u s t e r : e , s e c o n d a r y C l u s t e r s : t } } , m e t h o d s : { a d d P r i m a r y : f u n c t i o n ( ) { l e t t = t h i s , e = [ t h i s . p r i m a r y C l u s t e r I d ] . c o n c a t ( t h i s . s e c o n d a r y C l u s t e r I d s ) ; t e a w e b . p o p u p ( " / c l u s t e r s / s e l e c t P o p u p ? s e l e c t e d C l u s t e r I d s = " + e . j o i n ( " , " ) + " & m o d e = s i n g l e " , { h e i g h t : " 3 0 e m " , w i d t h : " 5 0 e m " , c a l l b a c k : f u n c t i o n ( e ) { n u l l ! = e . d a t a . c l u s t e r & & ( t . p r i m a r y C l u s t e r = e . d a t a . c l u s t e r , t . p r i m a r y C l u s t e r I d = t . p r i m a r y C l u s t e r . i d , t . n o t i f y C h a n g e ( ) ) } } ) } , r e m o v e P r i m a r y : f u n c t i o n ( ) { t h i s . p r i m a r y C l u s t e r I d = 0 , t h i s . p r i m a r y C l u s t e r = n u l l , t h i s . n o t i f y C h a n g e ( ) } , a d d S e c o n d a r y : f u n c t i o n ( ) { l e t t = t h i s , e = [ t h i s . p r i m a r y C l u s t e r I d ] . c o n c a t ( t h i s . s e c o n d a r y C l u s t e r I d s ) ; t e a w e b . p o p u p ( " / c l u s t e r s / s e l e c t P o p u p ? s e l e c t e d C l u s t e r I d s = " + e . j o i n ( " , " ) + " & m o d e = m u l t i p l e " , { h e i g h t : " 3 0 e m " , w i d t h : " 5 0 e m " , c a l l b a c k : f u n c t i o n ( e ) { n u l l ! = e . d a t a . c l u s t e r & & ( t . s e c o n d a r y C l u s t e r I d s . p u s h ( e . d a t a . c l u s t e r . i d ) , t . s e c o n d a r y C l u s t e r s . p u s h ( e . d a t a . c l u s t e r ) , t . n o t i f y C h a n g e ( ) ) } } ) } , r e m o v e S e c o n d a r y : f u n c t i o n ( e ) { t h i s . s e c o n d a r y C l u s t e r I d s . $ r e m o v e ( e ) , t h i s . s e c o n d a r y C l u s t e r s . $ r e m o v e ( e ) , t h i s . n o t i f y C h a n g e ( ) } , n o t i f y C h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , { c l u s t e r I d : t h i s . p r i m a r y C l u s t e r I d } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "primaryClusterId" : value = "primaryClusterId" / >
< input type = "hidden" name = "secondaryClusterIds" : value = "JSON.stringify(secondaryClusterIds)" / >
< table class = "ui table" >
< tr >
< td class = "title" > 主集群 < / t d >
< td >
< div v - if = "primaryCluster != null" >
< div class = "ui label basic small" > { { primaryCluster . name } } & nbsp ; < a href = "" title = "删除" @ click . prevent = "removePrimary" > < i class = "icon remove small" > < / i > < / a > < / d i v >
< / d i v >
< div style = "margin-top: 0.6em" v - if = "primaryClusterId == 0" >
< button class = "ui button tiny" type = "button" @ click . prevent = "addPrimary" > + < / b u t t o n >
< / d i v >
< p class = "comment" > 多个集群配置有冲突时 , 优先使用主集群配置 。 < / p >
< / t d >
< / t r >
< tr >
< td > 从集群 < / t d >
< td >
< div v - if = "secondaryClusters.length > 0" >
< div class = "ui label basic small" v - for = "(cluster, index) in secondaryClusters" > < span class = "grey" > { { cluster . name } } < /span> <a href="" title="删除" @click.prevent="removeSecondary(index)"><i class="icon remove small"></i > < / a > < / d i v >
< / d i v >
< div style = "margin-top: 0.6em" >
< button class = "ui button tiny" type = "button" @ click . prevent = "addSecondary" > + < / b u t t o n >
< / d i v >
< / t d >
< / t r >
< / t a b l e >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m e s s a g e - m e d i a - s e l e c t o r " , { p r o p s : [ " v - m e d i a - t y p e " ] , m o u n t e d : f u n c t i o n ( ) { l e t i = t h i s ; T e a . a c t i o n ( " / a d m i n s / r e c i p i e n t s / m e d i a O p t i o n s " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { i . m e d i a s = e . d a t a . m e d i a s , 0 < i . m e d i a T y p e . l e n g t h & & ( n u l l ! = ( e = i . m e d i a s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . t y p e = = i . m e d i a T y p e } ) ) & & ( i . d e s c r i p t i o n = e . d e s c r i p t i o n ) ) } ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v M e d i a T y p e ; r e t u r n { m e d i a s : [ ] , d e s c r i p t i o n : " " , m e d i a T y p e : e = n u l l = = e ? " " : e } } , w a t c h : { m e d i a T y p e : f u n c t i o n ( i ) { v a r e = t h i s . m e d i a s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . t y p e = = i } ) ; t h i s . d e s c r i p t i o n = n u l l = = e ? " " : e . d e s c r i p t i o n , t h i s . $ e m i t ( " c h a n g e " , e ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< select class = "ui dropdown auto-width" name = "mediaType" v - model = "mediaType" >
< option value = "" > [ 选择媒介类型 ] < / o p t i o n >
< option v - for = "media in medias" : value = "media.type" > { { media . name } } < / o p t i o n >
< / s e l e c t >
< p class = "comment" v - html = "description" > < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m e s s a g e - r e c e i v e r s - b o x " , { p r o p s : [ " v - n o d e - c l u s t e r - i d " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / c l u s t e r s / c l u s t e r / s e t t i n g s / m e s s a g e / s e l e c t e d R e c e i v e r s " ) . p a r a m s ( { c l u s t e r I d : t h i s . c l u s t e r I d } ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . r e c e i v e r s = e . d a t a . r e c e i v e r s } ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v N o d e C l u s t e r I d ; r e t u r n { c l u s t e r I d : e = n u l l = = e ? 0 : e , r e c e i v e r s : [ ] } } , m e t h o d s : { a d d R e c e i v e r : f u n c t i o n ( ) { l e t t = t h i s , i = [ ] , s = [ ] ; t h i s . r e c e i v e r s . f o r E a c h ( f u n c t i o n ( e ) { " r e c i p i e n t " = = e . t y p e ? i . p u s h ( e . i d . t o S t r i n g ( ) ) : " g r o u p " = = e . t y p e & & s . p u s h ( e . i d . t o S t r i n g ( ) ) } ) , t e a w e b . p o p u p ( " / c l u s t e r s / c l u s t e r / s e t t i n g s / m e s s a g e / s e l e c t R e c e i v e r P o p u p ? r e c i p i e n t I d s = " + i . j o i n ( " , " ) + " & g r o u p I d s = " + s . j o i n ( " , " ) , { c a l l b a c k : f u n c t i o n ( e ) { t . r e c e i v e r s . p u s h ( e . d a t a ) } } ) } , r e m o v e R e c e i v e r : f u n c t i o n ( e ) { t h i s . r e c e i v e r s . $ r e m o v e ( e ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "receiversJSON" : value = "JSON.stringify(receivers)" / >
< div v - if = "receivers.length > 0" >
< div v - for = "(receiver, index) in receivers" class = "ui label basic small" >
< span v - if = "receiver.type == 'group'" > 分组 : < / s p a n > { { r e c e i v e r . n a m e } } < s p a n c l a s s = " g r e y s m a l l " v - i f = " r e c e i v e r . s u b N a m e ! = n u l l & & r e c e i v e r . s u b N a m e . l e n g t h > 0 " > ( { { r e c e i v e r . s u b N a m e } } ) < / s p a n > & n b s p ; < a h r e f = " " t i t l e = " 删 除 " @ c l i c k . p r e v e n t = " r e m o v e R e c e i v e r ( i n d e x ) " > < i c l a s s = " i c o n r e m o v e " > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< button type = "button" class = "ui button tiny" @ click . prevent = "addReceiver" > + < / b u t t o n >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m e s s a g e - r e c i p i e n t - g r o u p - s e l e c t o r " , { p r o p s : [ " v - g r o u p s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v G r o u p s , t = [ ] ; r e t u r n 0 < ( e = n u l l = = e ? [ ] : e ) . l e n g t h & & ( t = e . m a p ( f u n c t i o n ( e ) { r e t u r n e . i d . t o S t r i n g ( ) } ) . j o i n ( " , " ) ) , { g r o u p s : e , g r o u p I d s : t } } , m e t h o d s : { a d d G r o u p : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / a d m i n s / r e c i p i e n t s / g r o u p s / s e l e c t P o p u p ? g r o u p I d s = " + t h i s . g r o u p I d s , { c a l l b a c k : f u n c t i o n ( e ) { t . g r o u p s . p u s h ( e . d a t a . g r o u p ) , t . u p d a t e ( ) } } ) } , r e m o v e G r o u p : f u n c t i o n ( e ) { t h i s . g r o u p s . $ r e m o v e ( e ) , t h i s . u p d a t e ( ) } , u p d a t e : f u n c t i o n ( ) { l e t t = [ ] ; 0 < t h i s . g r o u p s . l e n g t h & & t h i s . g r o u p s . f o r E a c h ( f u n c t i o n ( e ) { t . p u s h ( e . i d ) } ) , t h i s . g r o u p I d s = t . j o i n ( " , " ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "groupIds" : value = "groupIds" / >
< div v - if = "groups.length > 0" >
< div >
< div v - for = "(group, index) in groups" class = "ui label small basic" >
{ { group . name } } & nbsp ; < a href = "" title = "删除" @ click . prevent = "removeGroup(index)" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< button class = "ui button tiny" type = "button" @ click . prevent = "addGroup()" > + < / b u t t o n >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m e s s a g e - m e d i a - i n s t a n c e - s e l e c t o r " , { p r o p s : [ " v - i n s t a n c e - i d " ] , m o u n t e d : f u n c t i o n ( ) { l e t i = t h i s ; T e a . a c t i o n ( " / a d m i n s / r e c i p i e n t s / i n s t a n c e s / o p t i o n s " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { i . i n s t a n c e s = e . d a t a . i n s t a n c e s , 0 < i . i n s t a n c e I d & & ( n u l l ! = ( e = i . i n s t a n c e s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . i d = = i . i n s t a n c e I d } ) ) & & ( i . d e s c r i p t i o n = e . d e s c r i p t i o n , i . u p d a t e ( e . i d ) ) ) } ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v I n s t a n c e I d ; r e t u r n { i n s t a n c e s : [ ] , d e s c r i p t i o n : " " , i n s t a n c e I d : e = n u l l = = e ? 0 : e } } , w a t c h : { i n s t a n c e I d : f u n c t i o n ( e ) { t h i s . u p d a t e ( e ) } } , m e t h o d s : { u p d a t e : f u n c t i o n ( i ) { v a r e = t h i s . i n s t a n c e s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . i d = = i } ) ; t h i s . d e s c r i p t i o n = n u l l = = e ? " " : e . d e s c r i p t i o n , t h i s . $ e m i t ( " c h a n g e " , e ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< select class = "ui dropdown auto-width" name = "instanceId" v - model = "instanceId" >
< option value = "0" > [ 选择媒介 ] < / o p t i o n >
< option v - for = "instance in instances" : value = "instance.id" > { { instance . name } } ( { { instance . media . name } } ) < / o p t i o n >
< / s e l e c t >
< p class = "comment" v - html = "description" > < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m e s s a g e - r o w " , { p r o p s : [ " v - m e s s a g e " , " v - c a n - c l o s e " ] , d a t a : f u n c t i o n ( ) { v a r e = t h i s . v M e s s a g e . p a r a m s ; l e t t = n u l l ; r e t u r n n u l l ! = e & & 0 < e . l e n g t h & & ( t = J S O N . p a r s e ( e ) ) , { m e s s a g e : t h i s . v M e s s a g e , p a r a m s : t , i s C l o s i n g : ! 1 } } , m e t h o d s : { v i e w C e r t : f u n c t i o n ( e ) { t e a w e b . p o p u p ( " / s e r v e r s / c e r t s / c e r t P o p u p ? c e r t I d = " + e , { h e i g h t : " 2 8 e m " , w i d t h : " 4 8 e m " } ) } , r e a d M e s s a g e : f u n c t i o n ( e ) { l e t t = t h i s ; T e a . a c t i o n ( " / m e s s a g e s / r e a d P a g e " ) . p a r a m s ( { m e s s a g e I d s : [ e ] } ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( ) { n u l l ! = w i n d o w . p a r e n t . T e a & & n u l l ! = w i n d o w . p a r e n t . T e a . V u e & & w i n d o w . p a r e n t . T e a . V u e . c h e c k M e s s a g e s O n c e ( ) , t . v C a n C l o s e & & " u n d e f i n e d " ! = t y p e o f N o t i f y P o p u p ? ( t . i s C l o s i n g = ! 0 , s e t T i m e o u t ( f u n c t i o n ( ) { N o t i f y P o p u p ( { } ) } , 1 e 3 ) ) : t e a w e b . r e l o a d ( ) } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< table class = "ui table selectable" v - if = "!isClosing" >
< tr : class = "{error: message.level == 'error', positive: message.level == 'success', warning: message.level == 'warning'}" >
< td style = "position: relative" >
< strong > { { message . datetime } } < / s t r o n g >
< span v - if = "message.cluster != null && message.cluster.id != null" >
< span > | < / s p a n >
< a : href = "'/clusters/cluster?clusterId=' + message.cluster.id" target = "_top" v - if = "message.role == 'node'" > 集群 : { { message . cluster . name } } < / a >
< a : href = "'/ns/clusters/cluster?clusterId=' + message.cluster.id" target = "_top" v - if = "message.role == 'dns'" > DNS集群 : { { message . cluster . name } } < / a >
< / s p a n >
< span v - if = "message.node != null && message.node.id != null" >
< span > | < / s p a n >
< a : href = "'/clusters/cluster/node?clusterId=' + message.cluster.id + '&nodeId=' + message.node.id" target = "_top" v - if = "message.role == 'node'" > 节点 : { { message . node . name } } < / a >
< a : href = "'/ns/clusters/cluster/node?clusterId=' + message.cluster.id + '&nodeId=' + message.node.id" target = "_top" v - if = "message.role == 'dns'" > DNS节点 : { { message . node . name } } < / a >
< / s p a n >
< a href = "" style = "position: absolute; right: 1em" @ click . prevent = "readMessage(message.id)" title = "标为已读" > < i class = "icon check" > < / i > < / a >
< / t d >
< / t r >
< tr : class = "{error: message.level == 'error', positive: message.level == 'success', warning: message.level == 'warning'}" >
< td >
{ { message . body } }
<!-- 健康检查 -- >
< div v - if = "message.type == 'HealthCheckFailed'" style = "margin-top: 0.8em" >
< a : href = "'/clusters/cluster/node?clusterId=' + message.cluster.id + '&nodeId=' + param.node.id" v - for = "param in params" class = "ui label small basic" style = "margin-bottom: 0.5em" target = "_top" > { { param . node . name } } : { { param . error } } < / a >
< / d i v >
<!-- 集群DNS设置 -- >
< div v - if = "message.type == 'ClusterDNSSyncFailed'" style = "margin-top: 0.8em" >
< a : href = "'/dns/clusters/cluster?clusterId=' + message.cluster.id" target = "_top" > 查看问题 & raquo ; < / a >
< / d i v >
<!-- 证书即将过期 -- >
< div v - if = "message.type == 'SSLCertExpiring'" style = "margin-top: 0.8em" >
< a href = "" @ click . prevent = "viewCert(params.certId)" target = "_top" > 查看证书 < / a > & n b s p ; | & n b s p ; < a : h r e f = " ' / s e r v e r s / c e r t s / a c m e ' " v - i f = " p a r a m s ! = n u l l & & p a r a m s . a c m e T a s k I d > 0 " t a r g e t = " _ t o p " > 查 看 任 务 & r a q u o ; < / a >
< / d i v >
<!-- 证书续期成功 -- >
< div v - if = "message.type == 'SSLCertACMETaskSuccess'" style = "margin-top: 0.8em" >
< a href = "" @ click . prevent = "viewCert(params.certId)" target = "_top" > 查看证书 < / a > & n b s p ; | & n b s p ; < a : h r e f = " ' / s e r v e r s / c e r t s / a c m e ' " v - i f = " p a r a m s ! = n u l l & & p a r a m s . a c m e T a s k I d > 0 " t a r g e t = " _ t o p " > 查 看 任 务 & r a q u o ; < / a >
< / d i v >
<!-- 证书续期失败 -- >
< div v - if = "message.type == 'SSLCertACMETaskFailed'" style = "margin-top: 0.8em" >
< a href = "" @ click . prevent = "viewCert(params.certId)" target = "_top" > 查看证书 < / a > & n b s p ; | & n b s p ; < a : h r e f = " ' / s e r v e r s / c e r t s / a c m e ' " v - i f = " p a r a m s ! = n u l l & & p a r a m s . a c m e T a s k I d > 0 " t a r g e t = " _ t o p " > 查 看 任 务 & r a q u o ; < / a >
< / d i v >
2021-12-01 17:19:50 +08:00
<!-- 网站域名审核 -- >
< div v - if = "message.type == 'serverNamesRequireAuditing'" style = "margin-top: 0.8em" >
< a : href = "'/servers/server/settings/serverNames?serverId=' + params.serverId" target = "_top" > 去审核 < / a > < / a >
< / d i v >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-08-08 16:26:12 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - d o m a i n - g r o u p - s e l e c t o r " , { p r o p s : [ " v - d o m a i n - g r o u p - i d " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v D o m a i n G r o u p I d ; r e t u r n { u s e r I d : 0 , g r o u p I d : e = n u l l = = e ? 0 : e } } , m e t h o d s : { c h a n g e : f u n c t i o n ( e ) { n u l l ! = e ? t h i s . $ e m i t ( " c h a n g e " , e . i d ) : t h i s . $ e m i t ( " c h a n g e " , 0 ) } , r e l o a d : f u n c t i o n ( e ) { t h i s . u s e r I d = e , t h i s . $ r e f s . c o m b o B o x . c l e a r ( ) , t h i s . $ r e f s . c o m b o B o x . s e t D a t a U R L ( " / n s / d o m a i n s / g r o u p s / o p t i o n s ? u s e r I d = " + e ) , t h i s . $ r e f s . c o m b o B o x . r e l o a d D a t a ( ) } } , t e m p l a t e : ` < d i v >
< combo - box
data - url = "/ns/domains/groups/options"
placeholder = "选择分组"
data - key = "groups"
name = "groupId"
: v - value = "groupId"
@ change = "change"
ref = "comboBox" >
< / c o m b o - b o x >
2022-08-09 21:04:30 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - r o u t e s - s e l e c t o r " , { p r o p s : [ " v - r o u t e s " , " n a m e " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / n s / r o u t e s / o p t i o n s " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . r o u t e s = e . d a t a . r o u t e s } ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R o u t e s , t = ( n u l l = = e & & ( e = [ ] ) , t h i s . n a m e ) ; r e t u r n { r o u t e C o d e : " d e f a u l t " , i n p u t N a m e : t = " s t r i n g " = = t y p e o f t & & 0 ! = t . l e n g t h ? t : " r o u t e C o d e s " , r o u t e s : [ ] , i s A d d i n g : ! 1 , r o u t e T y p e : " d e f a u l t " , s e l e c t e d R o u t e s : e } } , w a t c h : { r o u t e T y p e : f u n c t i o n ( t ) { t h i s . r o u t e C o d e = " " ; l e t i = t h i s ; t h i s . r o u t e s . f o r E a c h ( f u n c t i o n ( e ) { e . t y p e = = t & & 0 = = i . r o u t e C o d e . l e n g t h & & ( i . r o u t e C o d e = e . c o d e ) } ) } } , m e t h o d s : { a d d : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 0 , t h i s . r o u t e T y p e = " d e f a u l t " , t h i s . r o u t e C o d e = " d e f a u l t " , t h i s . $ e m i t ( " a d d " ) } , c a n c e l : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 , t h i s . $ e m i t ( " c a n c e l " ) } , c o n f i r m : f u n c t i o n ( ) { i f ( 0 ! = t h i s . r o u t e C o d e . l e n g t h ) { l e t t = t h i s ; t h i s . r o u t e s . f o r E a c h ( f u n c t i o n ( e ) { e . c o d e = = t . r o u t e C o d e & & t . s e l e c t e d R o u t e s . p u s h ( e ) } ) , t h i s . $ e m i t ( " c h a n g e " , t h i s . s e l e c t e d R o u t e s ) , t h i s . c a n c e l ( ) } } , r e m o v e : f u n c t i o n ( e ) { t h i s . s e l e c t e d R o u t e s . $ r e m o v e ( e ) , t h i s . $ e m i t ( " c h a n g e " , t h i s . s e l e c t e d R o u t e s ) } } , t e m p l a t e : ` < d i v >
< div v - show = "selectedRoutes.length > 0" >
2021-11-22 12:08:53 +08:00
< div class = "ui label basic text small" v - for = "(route, index) in selectedRoutes" style = "margin-bottom: 0.3em" >
2022-08-09 21:04:30 +08:00
< input type = "hidden" : name = "inputName" : value = "route.code" / >
2021-11-22 12:08:53 +08:00
{ { route . name } } & nbsp ; < a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div v - if = "isAdding" style = "margin-bottom: 1em" >
< div class = "ui fields inline" >
< div class = "ui field" >
< select class = "ui dropdown" v - model = "routeType" >
< option value = "default" > [ 默认线路 ] < / o p t i o n >
< option value = "user" > 自定义线路 < / o p t i o n >
< option value = "isp" > 运营商 < / o p t i o n >
< option value = "china" > 中国省市 < / o p t i o n >
< option value = "world" > 全球国家地区 < / o p t i o n >
< / s e l e c t >
< / d i v >
< div class = "ui field" >
< select class = "ui dropdown" v - model = "routeCode" style = "width: 10em" >
< option v - for = "route in routes" : value = "route.code" v - if = "route.type == routeType" > { { route . name } } < / o p t i o n >
< / s e l e c t >
< / d i v >
< div class = "ui field" >
< button type = "button" class = "ui button tiny" @ click . prevent = "confirm" > 确定 < / b u t t o n >
& nbsp ; < a href = "" title = "取消" @ click . prevent = "cancel" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< / d i v >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - r e c u r s i o n - c o n f i g - b o x " , { p r o p s : [ " v - r e c u r s i o n - c o n f i g " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R e c u r s i o n C o n f i g ; r e t u r n n u l l = = ( e = n u l l = = e ? { i s O n : ! 1 , h o s t s : [ ] , a l l o w D o m a i n s : [ ] , d e n y D o m a i n s : [ ] , u s e L o c a l H o s t s : ! 1 } : e ) . h o s t s & & ( e . h o s t s = [ ] ) , n u l l = = e . a l l o w D o m a i n s & & ( e . a l l o w D o m a i n s = [ ] ) , n u l l = = e . d e n y D o m a i n s & & ( e . d e n y D o m a i n s = [ ] ) , { c o n f i g : e , h o s t I s A d d i n g : ! 1 , h o s t : " " , u p d a t i n g H o s t : n u l l } } , m e t h o d s : { c h a n g e H o s t s : f u n c t i o n ( e ) { t h i s . c o n f i g . h o s t s = e } , c h a n g e A l l o w D o m a i n s : f u n c t i o n ( e ) { t h i s . c o n f i g . a l l o w D o m a i n s = e } , c h a n g e D e n y D o m a i n s : f u n c t i o n ( e ) { t h i s . c o n f i g . d e n y D o m a i n s = e } , r e m o v e H o s t : f u n c t i o n ( e ) { t h i s . c o n f i g . h o s t s . $ r e m o v e ( e ) } , a d d H o s t : f u n c t i o n ( ) { v a r t ; t h i s . u p d a t i n g H o s t = n u l l , t h i s . h o s t = " " , t h i s . h o s t I s A d d i n g = ! t h i s . h o s t I s A d d i n g , t h i s . h o s t I s A d d i n g & & ( t = t h i s , s e t T i m e o u t ( f u n c t i o n ( ) { l e t e = t . $ r e f s . h o s t R e f ; n u l l ! = e & & e . f o c u s ( ) } , 2 0 0 ) ) } , u p d a t e H o s t : f u n c t i o n ( e ) { v a r t ; t h i s . u p d a t i n g H o s t = e , t h i s . h o s t = e . h o s t , t h i s . h o s t I s A d d i n g = ! t h i s . h o s t I s A d d i n g , t h i s . h o s t I s A d d i n g & & ( t = t h i s , s e t T i m e o u t ( f u n c t i o n ( ) { l e t e = t . $ r e f s . h o s t R e f ; n u l l ! = e & & e . f o c u s ( ) } , 2 0 0 ) ) } , c o n f i r m H o s t : f u n c t i o n ( ) { 0 = = t h i s . h o s t . l e n g t h ? t e a w e b . w a r n ( " 请 输 入 D N S 地 址 " ) : ( t h i s . h o s t I s A d d i n g = ! 1 , n u l l = = t h i s . u p d a t i n g H o s t ? t h i s . c o n f i g . h o s t s . p u s h ( { h o s t : t h i s . h o s t } ) : t h i s . u p d a t i n g H o s t . h o s t = t h i s . h o s t ) } , c a n c e l H o s t : f u n c t i o n ( ) { t h i s . h o s t I s A d d i n g = ! 1 } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "recursionJSON" : value = "JSON.stringify(config)" / >
< table class = "ui table definition selectable" >
< tbody >
< tr >
2022-06-05 17:12:54 +08:00
< td class = "title" > 启用 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" name = "isOn" value = "1" v - model = "config.isOn" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 启用后 , 如果找不到某个域名的解析记录 , 则向上一级DNS查找 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "config.isOn" >
< tr >
< td > 从节点本机读取 < br / > 上级DNS主机 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" name = "useLocalHosts" value = "1" v - model = "config.useLocalHosts" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 选中后 , 节点会试图从 < code - label > / e t c / r e s o l v . c o n f < / c o d e - l a b e l > 文 件 中 读 取 D N S 配 置 。 < / p >
< / t d >
< / t r >
< tr v - show = "!config.useLocalHosts" >
< td > 上级DNS主机地址 * < / t d >
< td >
< div v - if = "config.hosts.length > 0" >
< div v - for = "(host, index) in config.hosts" class = "ui label tiny basic" >
{ { host . host } } & nbsp ;
< a href = "" title = "修改" @ click . prevent = "updateHost(host)" > < i class = "icon pencil tiny" > < / i > < / a >
< a href = "" title = "删除" @ click . prevent = "removeHost(index)" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div v - if = "hostIsAdding" >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" placeholder = "DNS主机地址" v - model = "host" ref = "hostRef" @ keyup . enter = "confirmHost" @ keypress . enter . prevent = "1" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmHost" > 确认 < /button> <a href="" title="取消" @click.prevent="cancelHost"><i class="icon remove small"></i > < / a >
< / d i v >
< / d i v >
< / d i v >
< div style = "margin-top: 0.5em" >
< button type = "button" class = "ui button tiny" @ click . prevent = "addHost" > + < / b u t t o n >
< / d i v >
< / t d >
< / t r >
< tr >
< td > 允许的域名 < / t d >
< td > < values - box name = "allowDomains" : values = "config.allowDomains" @ change = "changeAllowDomains" > < / v a l u e s - b o x >
< p class = "comment" > 支持星号通配符 , 比如 < code - label > * . example . org < / c o d e - l a b e l > 。 < / p >
< / t d >
< / t r >
< tr >
< td > 不允许的域名 < / t d >
< td >
< values - box name = "denyDomains" : values = "config.denyDomains" @ change = "changeDenyDomains" > < / v a l u e s - b o x >
< p class = "comment" > 支持星号通配符 , 比如 < code - label > * . example . org < / c o d e - l a b e l > 。 优 先 级 比 允 许 的 域 名 高 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - a c c e s s - l o g - r e f - b o x " , { p r o p s : [ " v - a c c e s s - l o g - r e f " , " v - i s - p a r e n t " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v A c c e s s L o g R e f ; r e t u r n v o i d 0 = = = ( e = n u l l = = e ? { i s O n : ! 1 , i s P r i o r : ! 1 , l o g M i s s i n g D o m a i n s : ! 1 } : e ) . l o g M i s s i n g D o m a i n s & & ( e . l o g M i s s i n g D o m a i n s = ! 1 ) , { c o n f i g : e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "accessLogJSON" : value = "JSON.stringify(config)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "config" v - if = "!vIsParent" > < / p r i o r - c h e c k b o x >
< tbody v - show = "vIsParent || config.isPrior" >
< tr >
2022-06-05 17:12:54 +08:00
< td class = "title" > 启用 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< checkbox name = "isOn" value = "1" v - model = "config.isOn" > < / c h e c k b o x >
< / t d >
< / t r >
< tr >
< td > 记录所有访问 < / t d >
< td >
< checkbox name = "logMissingDomains" value = "1" v - model = "config.logMissingDomains" > < / c h e c k b o x >
< p class = "comment" > 包括对没有在系统里创建的域名访问 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-06-29 17:00:05 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - r o u t e - r a n g e s - b o x " , { p r o p s : [ " v - r a n g e s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R a n g e s ; r e t u r n { r a n g e s : e = n u l l = = e ? [ ] : e , i s A d d i n g : ! 1 , i s A d d i n g B a t c h : ! 1 , r a n g e T y p e : " i p R a n g e " , i s R e v e r s e : ! 1 , i p R a n g e F r o m : " " , i p R a n g e T o : " " , b a t c h I P R a n g e : " " , i p C I D R : " " , b a t c h I P C I D R : " " , r e g i o n s : [ ] , r e g i o n T y p e : " c o u n t r y " } } , m e t h o d s : { a d d I P R a n g e : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 0 ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . i p R a n g e F r o m . f o c u s ( ) } , 1 0 0 ) } , a d d C I D R : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 0 ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . i p C I D R . f o c u s ( ) } , 1 0 0 ) } , a d d R e g i o n s : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 0 } , a d d R e g i o n : f u n c t i o n ( e ) { t h i s . r e g i o n T y p e = e } , r e m o v e : f u n c t i o n ( e ) { t h i s . r a n g e s . $ r e m o v e ( e ) } , c a n c e l I P R a n g e : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 , t h i s . i p R a n g e F r o m = " " , t h i s . i p R a n g e T o = " " , t h i s . i s R e v e r s e = ! 1 } , c a n c e l I P C I D R : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 , t h i s . i p C I D R = " " , t h i s . i s R e v e r s e = ! 1 } , c a n c e l R e g i o n s : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 , t h i s . r e g i o n s = [ ] , t h i s . r e g i o n T y p e = " c o u n t r y " , t h i s . i s R e v e r s e = ! 1 } , c o n f i r m I P R a n g e : f u n c t i o n ( ) { l e t e = t h i s ; t h i s . i p R a n g e F r o m = t h i s . i p R a n g e F r o m . t r i m ( ) , t h i s . v a l i d a t e I P ( t h i s . i p R a n g e F r o m ) ? ( t h i s . i p R a n g e T o = t h i s . i p R a n g e T o . t r i m ( ) , t h i s . v a l i d a t e I P ( t h i s . i p R a n g e T o ) ? ( t h i s . r a n g e s . p u s h ( { t y p e : " i p R a n g e " , p a r a m s : { i p F r o m : t h i s . i p R a n g e F r o m , i p T o : t h i s . i p R a n g e T o , i s R e v e r s e : t h i s . i s R e v e r s e } } ) , t h i s . c a n c e l I P R a n g e ( ) ) : t e a w e b . w a r n ( " 结 束 I P 填 写 错 误 " , f u n c t i o n ( ) { e . $ r e f s . i p R a n g e T o . f o c u s ( ) } ) ) : t e a w e b . w a r n ( " 开 始 I P 填 写 错 误 " , f u n c t i o n ( ) { e . $ r e f s . i p R a n g e F r o m . f o c u s ( ) } ) } , c o n f i r m I P C I D R : f u n c t i o n ( ) { l e t e = t h i s ; 0 = = t h i s . i p C I D R . l e n g t h ? t e a w e b . w a r n ( " 请 填 写 C I D R " , f u n c t i o n ( ) { e . $ r e f s . i p C I D R . f o c u s ( ) } ) : t h i s . v a l i d a t e C I D R ( t h i s . i p C I D R ) ? ( t h i s . r a n g e s . p u s h ( { t y p e : " c i d r " , p a r a m s : { c i d r : t h i s . i p C I D R , i s R e v e r s e : t h i s . i s R e v e r s e } } ) , t h i s . c a n c e l I P C I D R ( ) ) : t e a w e b . w a r n ( " 请 输 入 正 确 的 C I D R " , f u n c t i o n ( ) { e . $ r e f s . i p C I D R . f o c u s ( ) } ) } , c o n f i r m R e g i o n s : f u n c t i o n ( ) { 0 = = t h i s . r e g i o n s . l e n g t h | | t h i s . r a n g e s . p u s h ( { t y p e : " r e g i o n " , p a r a m s : { r e g i o n s : t h i s . r e g i o n s , i s R e v e r s e : t h i s . i s R e v e r s e } } ) , t h i s . c a n c e l R e g i o n s ( ) } , a d d B a t c h I P R a n g e : f u n c t i o n ( ) { t h i s . i s A d d i n g B a t c h = ! 0 ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . b a t c h I P R a n g e . f o c u s ( ) } , 1 0 0 ) } , a d d B a t c h C I D R : f u n c t i o n ( ) { t h i s . i s A d d i n g B a t c h = ! 0 ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . b a t c h I P C I D R . f o c u s ( ) } , 1 0 0 ) } , c a n c e l B a t c h I P R a n g e : f u n c t i o n ( ) { t h i s . i s A d d i n g B a t c h = ! 1 , t h i s . b a t c h I P R a n g e = " " , t h i s . i s R e v e r s e = ! 1 } , c a n c e l B a t c h I P C I D R : f u n c t i o n ( ) { t h i s . i s A d d i n g B a t c h = ! 1 , t h i s . b a t c h I P C I D R = " " , t h i s . i s R e v e r s e = ! 1 } , c o n f i r m B a t c h I P R a n g e : f u n c t i o n ( ) { l e t a = t h i s , e = t h i s . b a t c h I P R a n g e ; i f ( 0 = = e . l e n g t h ) t e a w e b . w a r n ( " 请 填 写 要 加 入 的 I P 范 围 " , f u n c t i o n ( ) { a . $ r e f s . b a t c h I P R a n g e . f o c u s ( ) } ) ; e l s e { l e t n = [ ] , o = " " ; e . s p l i t ( " \ n " ) . f o r E a c h ( f u n c t i o n ( t ) { i f ( 0 ! = ( t = t . t r i m ( ) ) . l e n g t h ) { l e t e = ( t = t . r e p l a c e ( " , " , " , " ) ) . s p l i t ( " , " ) ; v a r i , s ; 2 ! = e . l e n g t h ? o = t : ( i = e [ 0 ] . t r i m ( ) , s = e [ 1 ] . t r i m ( ) , a . v a l i d a t e I P ( i ) & & a . v a l i d a t e I P ( s ) ? n . p u s h ( { t y p e : " i p R a n g e " , p a r a m s : { i p F r o m : i , i p T o : s , i s R e v e r s e : a . i s R e v e r s e } } ) : o = t ) } } ) , 0 < o . l e n g t h ? t e a w e b . w a r n ( " ' " + o + " ' 格 式 错 误 " , f u n c t i o n ( ) { a . $ r e f s . b a t c h I P R a n g e . f o c u s ( ) } ) : ( n . f o r E a c h ( f u n c t i o n ( e ) { a . r a n g e s . p u s h ( e ) } ) , t h i s . c a n c e l B a t c h I P R a n g e ( ) ) } } , c o n f i r m B a t c h I P C I D R : f u n c t i o n ( ) { l e t n = t h i s , e = t h i s . b a t c h I P C I D R ; i f ( 0 = = e . l e n g t h ) t e a w e b . w a r n ( " 请 填 写 要 加 入 的 C I D R " , f u n c t i o n ( ) { n . $ r e f s . b a t c h I P C I D R . f o c u s ( ) } ) ; e l s e { l e t i = [ ] , s = " " ; e . s p l i t ( " \ n " ) . f o r E a c h ( f u n c t i o n ( e ) { v a r t = e . t r i m ( ) ; 0 ! = t . l e n g t h & & ( n . v a l i d a t e C I D R ( t ) ? i . p u s h ( { t y p e : " c i d r " , p a r a m s : { c i d r : t , i s R e v e r s e : n . i s R e v e r s e } } ) : s = e ) } ) , 0 < s . l e n g t h ? t e a w e b . w a r n ( " ' " + s + " ' 格 式 错 误 " , f u n c t i o n ( ) { n . $ r e f s . b a t c h I P C I D R . f o c u s ( ) } ) : ( i . f o r E a c h ( f u n c t i o n ( e ) { n . r a n g e s . p u s h ( e ) } ) , t h i s . c a n c e l B a t c h I P C I D R ( ) ) } } , s e l e c t R e g i o n C o u n t r y : f u n c t i o n ( e ) { n u l l ! = e & & ( t h i s . r e g i o n s . p u s h ( { t y p e : " c o u n t r y " , i d : e . i d , n a m e : e . n a m e } ) , t h i s . $ r e f s . r e g i o n C o u n t r y C o m b o B o x . c l e a r ( ) ) } , s e l e c t R e g i o n P r o v i n c e : f u n c t i o n ( e ) { n u l l ! = e & & ( t h i s . r e g i o n s . p u s h ( { t y p e : " p r o v i n c e " , i d : e . i d , n a m e : e . n a m e } ) , t h i s . $ r e f s . r e g i o n P r o v i n c e C o m b o B o x . c l e a r ( ) ) } , s e l e c t R e g i o n C i t y : f u n c t i o n ( e ) { n u l l ! = e & & ( t h i s . r e g i o n s . p u s h ( { t y p e : " c i t y " , i d : e . i d , n a m e : e . n a m e } ) , t h i s . $ r e f s . r e g i o n C i t y C o m b o B o x . c l e a r ( ) ) } , s e l e c t R e g i o n P r o v i d e r : f u n c t i o n ( e ) { n u l l ! = e & & ( t h i s . r e g i o n s . p u s h ( { t y p e : " p r o v i d e r " , i d : e . i d , n a m e : e . n a m e } ) , t h i s . $ r e f s . r e g i o n P r o v i d e r C o m b o B o x . c l e a r ( ) ) } , r e m o v e R e g i o n : f u n c t i o n ( e ) { t h i s . r e g i o n s . $ r e m o v e ( e ) } , v a l i d a t e I P : f u n c t i o n ( i ) { i f ( 0 ! = i . l e n g t h ) { i f ( 0 < = i . i n d e x O f ( " : " ) ) { l e t e = i . s p l i t ( " : " ) ; i f ( 8 < e . l e n g t h ) r e t u r n ! 1 ; l e t t
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "rangesJSON" : value = "JSON.stringify(ranges)" / >
< div v - if = "ranges.length > 0" >
2022-06-16 19:32:40 +08:00
< div class = "ui label tiny basic" v - for = "(range, index) in ranges" style = "margin-bottom: 0.3em" >
2022-06-29 17:00:05 +08:00
< span class = "red" v - if = "range.params.isReverse" > [ 排除 ] < / s p a n >
2021-11-22 12:08:53 +08:00
< span v - if = "range.type == 'ipRange'" > IP范围 : < / s p a n >
2022-06-29 17:00:05 +08:00
< span v - if = "range.type == 'cidr'" > CIDR : < / s p a n >
< span v - if = "range.type == 'region'" > 区域 : < / s p a n >
< span v - if = "range.type == 'ipRange'" > { { range . params . ipFrom } } - { { range . params . ipTo } } < / s p a n >
< span v - if = "range.type == 'cidr'" > { { range . params . cidr } } < / s p a n >
< span v - if = "range.type == 'region'" > < span v - for = "(region, index) in range.params.regions" > { { region . name } } < span v - if = "index < range.params.regions.length - 1" > , < / s p a n > < / s p a n > < / s p a n >
& nbsp ; < a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove small" > < / i > < / a >
2021-11-22 12:08:53 +08:00
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
2022-06-29 17:00:05 +08:00
<!-- IP范围 -- >
< div v - if = "rangeType == 'ipRange'" >
<!-- 添加单个IP范围 -- >
< div style = "margin-bottom: 1em" v - show = "isAdding" >
< table class = "ui table" >
< tr >
< td class = "title" > 开始IP * < / t d >
< td >
< input type = "text" placeholder = "开始IP" maxlength = "40" size = "40" style = "width: 15em" v - model = "ipRangeFrom" ref = "ipRangeFrom" @ keyup . enter = "confirmIPRange" @ keypress . enter . prevent = "1" / >
< / t d >
< / t r >
< tr >
< td > 结束IP * < / t d >
< td >
< input type = "text" placeholder = "结束IP" maxlength = "40" size = "40" style = "width: 15em" v - model = "ipRangeTo" ref = "ipRangeTo" @ keyup . enter = "confirmIPRange" @ keypress . enter . prevent = "1" / >
< / t d >
< / t r >
< tr >
< td > 排除 < / t d >
< td >
< checkbox v - model = "isReverse" > < / c h e c k b o x >
< p class = "comment" > 选中后表示线路中排除当前条件 。 < / p >
< / t d >
< / t r >
< / t a b l e >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmIPRange" > 确定 < / b u t t o n > & n b s p ;
< a href = "" @ click . prevent = "cancelIPRange" title = "取消" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
<!-- 添加多个IP范围 -- >
< div style = "margin-bottom: 1em" v - show = "isAddingBatch" >
< table class = "ui table" >
< tr >
< td class = "title" > IP范围列表 * < / t d >
< td >
< textarea rows = "5" ref = "batchIPRange" v - model = "batchIPRange" > < / t e x t a r e a >
< p class = "comment" > 每行一条 , 格式为 < code - label > 开始IP , 结束IP < / c o d e - l a b e l > , 比 如 < c o d e - l a b e l > 1 9 2 . 1 6 8 . 1 . 1 0 0 , 1 9 2 . 1 6 8 . 1 . 2 0 0 < / c o d e - l a b e l > 。 < / p >
< / t d >
< / t r >
< tr >
< td > 排除 < / t d >
< td >
< checkbox v - model = "isReverse" > < / c h e c k b o x >
< p class = "comment" > 选中后表示线路中排除当前条件 。 < / p >
< / t d >
< / t r >
< / t a b l e >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmBatchIPRange" > 确定 < / b u t t o n > & n b s p ;
< a href = "" @ click . prevent = "cancelBatchIPRange" title = "取消" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< div v - if = "!isAdding && !isAddingBatch" >
< button class = "ui button tiny" type = "button" @ click . prevent = "addIPRange" > 添加单个IP范围 < / b u t t o n > & n b s p ;
< button class = "ui button tiny" type = "button" @ click . prevent = "addBatchIPRange" > 批量添加IP范围 < / b u t t o n >
2021-11-22 12:08:53 +08:00
< / d i v >
< / d i v >
2022-06-29 17:00:05 +08:00
<!-- CIDR -- >
< div v - if = "rangeType == 'cidr'" >
<!-- 添加单个IP范围 -- >
< div style = "margin-bottom: 1em" v - show = "isAdding" >
< table class = "ui table" >
< tr >
< td class = "title" > CIDR * < / t d >
< td >
< input type = "text" placeholder = "IP/MASK" maxlength = "40" size = "40" style = "width: 15em" v - model = "ipCIDR" ref = "ipCIDR" @ keyup . enter = "confirmIPCIDR" @ keypress . enter . prevent = "1" / >
< p class = "comment" > 类似于 < code - label > 192.168 . 2.1 / 24 < / c o d e - l a b e l > 。 < / p >
< / t d >
< / t r >
< tr >
< td > 排除 < / t d >
< td >
< checkbox v - model = "isReverse" > < / c h e c k b o x >
< p class = "comment" > 选中后表示线路中排除当前条件 。 < / p >
< / t d >
< / t r >
< / t a b l e >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmIPCIDR" > 确定 < / b u t t o n > & n b s p ;
< a href = "" @ click . prevent = "cancelIPCIDR" title = "取消" > < i class = "icon remove small" > < / i > < / a >
2022-06-16 19:32:40 +08:00
< / d i v >
2022-06-29 17:00:05 +08:00
<!-- 添加多个IP范围 -- >
< div style = "margin-bottom: 1em" v - show = "isAddingBatch" >
< table class = "ui table" >
< tr >
< td class = "title" > IP范围列表 * < / t d >
< td >
< textarea rows = "5" ref = "batchIPCIDR" v - model = "batchIPCIDR" > < / t e x t a r e a >
< p class = "comment" > 每行一条 , 格式为 < code - label > IP / MASK < / c o d e - l a b e l > , 比 如 < c o d e - l a b e l > 1 9 2 . 1 6 8 . 2 . 1 / 2 4 < / c o d e - l a b e l > 。 < / p >
< / t d >
< / t r >
< tr >
< td > 排除 < / t d >
< td >
< checkbox v - model = "isReverse" > < / c h e c k b o x >
< p class = "comment" > 选中后表示线路中排除当前条件 。 < / p >
< / t d >
< / t r >
< / t a b l e >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmBatchIPCIDR" > 确定 < / b u t t o n > & n b s p ;
< a href = "" @ click . prevent = "cancelBatchIPCIDR" title = "取消" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< div v - if = "!isAdding && !isAddingBatch" >
< button class = "ui button tiny" type = "button" @ click . prevent = "addCIDR" > 添加单个CIDR < / b u t t o n > & n b s p ;
< button class = "ui button tiny" type = "button" @ click . prevent = "addBatchCIDR" > 批量添加CIDR < / b u t t o n >
2022-06-16 19:32:40 +08:00
< / d i v >
< / d i v >
2021-11-22 12:08:53 +08:00
2022-06-29 17:00:05 +08:00
<!-- 区域 -- >
< div v - if = "rangeType == 'region'" >
<!-- 添加区域 -- >
< div v - if = "isAdding" >
< table class = "ui table" >
< tr >
< td > 已添加 < / t d >
< td >
< div v - for = "(region, index) in regions" class = "ui label small basic" >
{ { region . name } } < a href = "" title = "删除" @ click . prevent = "removeRegion(index)" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / t d >
< / t r >
< tr >
< td class = "title" > 添加新 < span v - if = "regionType == 'country'" > 国家 / 地区 < / s p a n > < s p a n v - i f = " r e g i o n T y p e = = ' p r o v i n c e ' " > 省 份 < / s p a n > < s p a n v - i f = " r e g i o n T y p e = = ' c i t y ' " > 城 市 < / s p a n > < s p a n v - i f = " r e g i o n T y p e = = ' p r o v i d e r ' " > I S P < / s p a n >
* < / t d >
< td >
<!-- region country name -- >
< div v - if = "regionType == 'country'" >
< combo - box title = "" width = "14em" data - url = "/ui/countryOptions" data - key = "countries" placeholder = "点这里选择国家/地区" @ change = "selectRegionCountry" ref = "regionCountryComboBox" key = "combo-box-country" > < / c o m b o - b o x >
< / d i v >
<!-- region province name -- >
< div v - if = "regionType == 'province'" >
< combo - box title = "" data - url = "/ui/provinceOptions" data - key = "provinces" placeholder = "点这里选择省份" @ change = "selectRegionProvince" ref = "regionProvinceComboBox" key = "combo-box-province" > < / c o m b o - b o x >
< / d i v >
<!-- region city name -- >
< div v - if = "regionType == 'city'" >
< combo - box title = "" data - url = "/ui/cityOptions" data - key = "cities" placeholder = "点这里选择城市" @ change = "selectRegionCity" ref = "regionCityComboBox" key = "combo-box-city" > < / c o m b o - b o x >
< / d i v >
<!-- ISP Name -- >
< div v - if = "regionType == 'provider'" >
< combo - box title = "" data - url = "/ui/providerOptions" data - key = "providers" placeholder = "点这里选择ISP" @ change = "selectRegionProvider" ref = "regionProviderComboBox" key = "combo-box-isp" > < / c o m b o - b o x >
< / d i v >
< div style = "margin-top: 1em" >
< button class = "ui button tiny basic" : class = "{blue: regionType == 'country'}" type = "button" @ click . prevent = "addRegion('country')" > 添加国家 / 地区 < / b u t t o n > & n b s p ;
< button class = "ui button tiny basic" : class = "{blue: regionType == 'province'}" type = "button" @ click . prevent = "addRegion('province')" > 添加省份 < / b u t t o n > & n b s p ;
< button class = "ui button tiny basic" : class = "{blue: regionType == 'city'}" type = "button" @ click . prevent = "addRegion('city')" > 添加城市 < / b u t t o n > & n b s p ;
< button class = "ui button tiny basic" : class = "{blue: regionType == 'provider'}" type = "button" @ click . prevent = "addRegion('provider')" > ISP < / b u t t o n > & n b s p ;
< / d i v >
< / t d >
< / t r >
< tr >
< td > 排除 < / t d >
< td >
< checkbox v - model = "isReverse" > < / c h e c k b o x >
< p class = "comment" > 选中后表示线路中排除当前条件 。 < / p >
< / t d >
< / t r >
< / t a b l e >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmRegions" > 确定 < / b u t t o n > & n b s p ;
< a href = "" @ click . prevent = "cancelRegions" title = "取消" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< div v - if = "!isAdding && !isAddingBatch" >
< button class = "ui button tiny" type = "button" @ click . prevent = "addRegions" > 添加区域 < / b u t t o n > & n b s p ;
< / d i v >
2022-06-16 19:32:40 +08:00
< / d i v >
2022-08-09 21:04:30 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - c r e a t e - r e c o r d s - t a b l e " , { p r o p s : [ " v - t y p e s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v T y p e s ; r e t u r n { t y p e s : e = n u l l = = e ? [ ] : e , r e c o r d s : [ { n a m e : " " , t y p e : " A " , v a l u e : " " , r o u t e C o d e s : [ ] , t t l : 6 0 0 , i n d e x : 0 } ] , l a s t I n d e x : 0 , i s A d d i n g R o u t e s : ! 1 } } , m e t h o d s : { a d d : f u n c t i o n ( ) { t h i s . r e c o r d s . p u s h ( { n a m e : " " , t y p e : " A " , v a l u e : " " , r o u t e C o d e s : [ ] , t t l : 6 0 0 , i n d e x : + + t h i s . l a s t I n d e x } ) ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . n a m e I n p u t s . $ l a s t ( ) . f o c u s ( ) } , 1 0 0 ) } , r e m o v e : f u n c t i o n ( e ) { t h i s . r e c o r d s . $ r e m o v e ( e ) } , a d d R o u t e s : f u n c t i o n ( ) { t h i s . i s A d d i n g R o u t e s = ! 0 } , c a n c e l R o u t e s : f u n c t i o n ( ) { l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . i s A d d i n g R o u t e s = ! 1 } , 1 e 3 ) } , c h a n g e R o u t e s : f u n c t i o n ( e , t ) { e . r o u t e C o d e s = n u l l = = t ? [ ] : t . m a p ( f u n c t i o n ( e ) { r e t u r n e . c o d e } ) } } , t e m p l a t e : ` < d i v >
< input type = "hidden" name = "recordsJSON" : value = "JSON.stringify(records)" / >
< table class = "ui table selectable celled" style = "max-width: 60em" >
< thead class = "full-width" >
< tr >
< th style = "width:10em" > 记录名 < / t h >
< th style = "width:7em" > 记录类型 < / t h >
< th > 线路 < / t h >
< th v - if = "!isAddingRoutes" > 记录值 < / t h >
< th v - if = "!isAddingRoutes" > TTL < / t h >
< th class = "one op" v - if = "!isAddingRoutes" > 操作 < / t h >
< / t r >
< / t h e a d >
< tr v - for = "(record, index) in records" : key = "record.index" >
< td >
< input type = "text" style = "width:10em" v - model = "record.name" ref = "nameInputs" / >
< / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "record.type" >
< option v - for = "type in types" : value = "type.type" > { { type . type } } < / o p t i o n >
< / s e l e c t >
< / t d >
< td >
< ns - routes - selector @ add = "addRoutes" @ cancel = "cancelRoutes" @ change = "changeRoutes(record, $event)" > < / n s - r o u t e s - s e l e c t o r >
< / t d >
< td v - if = "!isAddingRoutes" >
< input type = "text" style = "width:10em" maxlength = "512" v - model = "record.value" / >
< / t d >
< td v - if = "!isAddingRoutes" >
< div class = "ui input right labeled" >
< input type = "text" v - model = "record.ttl" style = "width:5em" maxlength = "8" / >
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
< / t d >
< td v - if = "!isAddingRoutes" >
< a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove" > < / i > < / a >
< / t d >
< / t r >
< / t a b l e >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - r o u t e - s e l e c t o r " , { p r o p s : [ " v - r o u t e - c o d e " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / n s / r o u t e s / o p t i o n s " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . r o u t e s = e . d a t a . r o u t e s } ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R o u t e C o d e ; r e t u r n { r o u t e C o d e : e = n u l l = = e ? " " : e , r o u t e s : [ ] } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div v - if = "routes.length > 0" >
< select class = "ui dropdown" name = "routeCode" v - model = "routeCode" >
< option value = "" > [ 线路 ] < / o p t i o n >
< option v - for = "route in routes" : value = "route.code" > { { route . name } } < / o p t i o n >
< / s e l e c t >
< / d i v >
2022-08-08 16:26:12 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - u s e r - s e l e c t o r " , { p r o p s : [ " v - u s e r - i d " ] , d a t a : f u n c t i o n ( ) { r e t u r n { } } , m e t h o d s : { c h a n g e : f u n c t i o n ( e ) { t h i s . $ e m i t ( " c h a n g e " , e ) } } , t e m p l a t e : ` < d i v >
< user - selector : v - user - id = "vUserId" data - url = "/ns/users/options" @ change = "change" > < / u s e r - s e l e c t o r >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - a c c e s s - l o g - b o x " , { p r o p s : [ " v - a c c e s s - l o g " , " v - k e y w o r d " ] , d a t a : f u n c t i o n ( ) { r e t u r n { a c c e s s L o g : t h i s . v A c c e s s L o g } } , m e t h o d s : { s h o w L o g : f u n c t i o n ( ) { l e t e = t h i s ; v a r t = t h i s . a c c e s s L o g . r e q u e s t I d ; t h i s . $ p a r e n t . $ c h i l d r e n . f o r E a c h ( f u n c t i o n ( e ) { n u l l ! = e . d e s e l e c t & & e . d e s e l e c t ( ) } ) , t h i s . s e l e c t ( ) , t e a w e b . p o p u p ( " / n s / c l u s t e r s / a c c e s s L o g s / v i e w P o p u p ? r e q u e s t I d = " + t , { w i d t h : " 5 0 e m " , h e i g h t : " 2 4 e m " , o n C l o s e : f u n c t i o n ( ) { e . d e s e l e c t ( ) } } ) } , s e l e c t : f u n c t i o n ( ) { t h i s . $ r e f s . b o x . p a r e n t N o d e . s t y l e . c s s T e x t = " b a c k g r o u n d : r g b a ( 0 , 0 , 0 , 0 . 1 ) " } , d e s e l e c t : f u n c t i o n ( ) { t h i s . $ r e f s . b o x . p a r e n t N o d e . s t y l e . c s s T e x t = " " } } , t e m p l a t e : ` < d i v c l a s s = " a c c e s s - l o g - r o w " : s t y l e = " { ' c o l o r ' : ( ! a c c e s s L o g . i s R e c u r s i v e & & ( a c c e s s L o g . n s R e c o r d I d = = n u l l | | a c c e s s L o g . n s R e c o r d I d = = 0 ) | | ( a c c e s s L o g . i s R e c u r s i v e & & a c c e s s L o g . r e c o r d V a l u e ! = n u l l & & a c c e s s L o g . r e c o r d V a l u e . l e n g t h = = 0 ) ) ? ' # d c 1 4 3 c ' : ' ' } " r e f = " b o x " >
2022-07-27 20:20:04 +08:00
< span v - if = "accessLog.region != null && accessLog.region.length > 0" class = "grey" > [ { { accessLog . region } } ] < / s p a n > < k e y w o r d : v - w o r d = " v K e y w o r d " > { { a c c e s s L o g . r e m o t e A d d r } } < / k e y w o r d > [ { { a c c e s s L o g . t i m e L o c a l } } ] [ { { a c c e s s L o g . n e t w o r k i n g } } ] < e m > { { a c c e s s L o g . q u e s t i o n T y p e } } < k e y w o r d : v - w o r d = " v K e y w o r d " > { { a c c e s s L o g . q u e s t i o n N a m e } } < / k e y w o r d > < / e m > - & g t ;
< span v - if = "accessLog.recordType != null && accessLog.recordType.length > 0" > < em > { { accessLog . recordType } } < keyword : v - word = "vKeyword" > { { accessLog . recordValue } } < / k e y w o r d > < / e m > < / s p a n >
< span v - else class = "disabled" > & nbsp ; [ 没有记录 ] < / s p a n >
<!-- & nbsp ; < a href = "" @ click . prevent = "showLog" title = "查看详情" > < i class = "icon expand" > < / i > < / a > - - >
2021-11-22 12:08:53 +08:00
< div v - if = "(accessLog.nsRoutes != null && accessLog.nsRoutes.length > 0) || accessLog.isRecursive" style = "margin-top: 0.3em" >
< span class = "ui label tiny basic grey" v - for = "route in accessLog.nsRoutes" > 线路 : { { route . name } } < / s p a n >
< span class = "ui label tiny basic grey" v - if = "accessLog.isRecursive" > 递归DNS < / s p a n >
< / d i v >
< div v - if = "accessLog.error != null && accessLog.error.length > 0" style = "color:#dc143c" >
< i class = "icon warning circle" > < / i > 错 误 : [ { { a c c e s s L o g . e r r o r } } ]
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - c l u s t e r - s e l e c t o r " , { p r o p s : [ " v - c l u s t e r - i d " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / n s / c l u s t e r s / o p t i o n s " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . c l u s t e r s = e . d a t a . c l u s t e r s } ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C l u s t e r I d ; r e t u r n { c l u s t e r s : [ ] , c l u s t e r I d : e = n u l l = = e ? 0 : e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< select class = "ui dropdown auto-width" name = "clusterId" v - model = "clusterId" >
< option value = "0" > [ 选择集群 ] < / o p t i o n >
< option v - for = "cluster in clusters" : value = "cluster.id" > { { cluster . name } } < / o p t i o n >
< / s e l e c t >
2022-07-27 20:20:04 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n s - c l u s t e r - c o m b o - b o x " , { p r o p s : [ " v - c l u s t e r - i d " ] , d a t a : f u n c t i o n ( ) { l e t t = t h i s ; r e t u r n T e a . a c t i o n ( " / n s / c l u s t e r s / o p t i o n s " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . c l u s t e r s = e . d a t a . c l u s t e r s } ) , { c l u s t e r s : [ ] } } , m e t h o d s : { c h a n g e : f u n c t i o n ( e ) { n u l l = = e ? t h i s . $ e m i t ( " c h a n g e " , 0 ) : t h i s . $ e m i t ( " c h a n g e " , e . v a l u e ) } } , t e m p l a t e : ` < d i v v - i f = " c l u s t e r s . l e n g t h > 0 " s t y l e = " m i n - w i d t h : 1 0 . 4 e m " >
< combo - box title = "集群" placeholder = "集群名称" : v - items = "clusters" name = "clusterId" : v - value = "vClusterId" @ change = "change" > < / c o m b o - b o x >
2022-08-08 16:26:12 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " p l a n - u s e r - s e l e c t o r " , { p r o p s : [ " v - u s e r - i d " ] , d a t a : f u n c t i o n ( ) { r e t u r n { } } , m e t h o d s : { c h a n g e : f u n c t i o n ( e ) { t h i s . $ e m i t ( " c h a n g e " , e ) } } , t e m p l a t e : ` < d i v >
< user - selector : v - user - id = "vUserId" data - url = "/plans/users/options" @ change = "change" > < / u s e r - s e l e c t o r >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " p l a n - p r i c e - v i e w " , { p r o p s : [ " v - p l a n " ] , d a t a : f u n c t i o n ( ) { r e t u r n { p l a n : t h i s . v P l a n } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< span v - if = "plan.priceType == 'period'" >
2022-02-17 17:24:23 +08:00
按时间周期计费
< div >
< span class = "grey small" >
< span v - if = "plan.monthlyPrice > 0" > 月度 : ¥ { { plan . monthlyPrice } } 元 < br / > < / s p a n >
< span v - if = "plan.seasonallyPrice > 0" > 季度 : ¥ { { plan . seasonallyPrice } } 元 < br / > < / s p a n >
< span v - if = "plan.yearlyPrice > 0" > 年度 : ¥ { { plan . yearlyPrice } } 元 < / s p a n >
< / s p a n >
< / d i v >
2021-11-22 12:08:53 +08:00
< / s p a n >
< span v - if = "plan.priceType == 'traffic'" >
2022-02-17 17:24:23 +08:00
按流量计费
< div >
< span class = "grey small" > 基础价格 : ¥ { { plan . trafficPrice . base } } 元 / GB < / s p a n >
< / d i v >
2021-11-22 12:08:53 +08:00
< / s p a n >
2022-02-17 17:24:23 +08:00
< div v - if = "plan.priceType == 'bandwidth' && plan.bandwidthPrice != null && plan.bandwidthPrice.percentile > 0" >
按 { { plan . bandwidthPrice . percentile } } th带宽计费
< div >
< div v - for = "range in plan.bandwidthPrice.ranges" >
2022-07-17 21:19:45 +08:00
< span class = "small grey" > { { range . minMB } } - < span v - if = "range.maxMB > 0" > { { range . maxMB } } MB < / s p a n > < s p a n v - e l s e > & i n f i n ; < / s p a n > : < s p a n v - i f = " r a n g e . t o t a l P r i c e > 0 " > { { r a n g e . t o t a l P r i c e } } 元 < / s p a n > < s p a n v - e l s e = " " > { { r a n g e . p r i c e P e r M B } } 元 / M B < / s p a n > < / s p a n >
2022-02-17 17:24:23 +08:00
< / d i v >
< / d i v >
< / d i v >
2022-07-17 21:19:45 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " p l a n - b a n d w i d t h - r a n g e s " , { p r o p s : [ " v - r a n g e s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R a n g e s ; r e t u r n { r a n g e s : e = n u l l = = e ? [ ] : e , i s A d d i n g : ! 1 , m i n M B : " " , m a x M B : " " , p r i c e P e r M B : " " , t o t a l P r i c e : " " , a d d i n g R a n g e : { m i n M B : 0 , m a x M B : 0 , p r i c e P e r M B : 0 , t o t a l P r i c e : 0 } } } , m e t h o d s : { a d d : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! t h i s . i s A d d i n g ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . m i n M B . f o c u s ( ) } ) } , c a n c e l A d d i n g : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 } , c o n f i r m : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 , t h i s . m i n M B = " " , t h i s . m a x M B = " " , t h i s . p r i c e P e r M B = " " , t h i s . t o t a l P r i c e = " " , t h i s . r a n g e s . p u s h ( t h i s . a d d i n g R a n g e ) , t h i s . r a n g e s . $ s o r t ( f u n c t i o n ( e , t ) { r e t u r n e . m i n M B < t . m i n M B ? - 1 : e . m i n M B = = t . m i n M B ? 0 = = t . m a x M B | | e . m a x M B < t . m a x M B ? - 1 : 0 : 1 } ) , t h i s . c h a n g e ( ) , t h i s . a d d i n g R a n g e = { m i n M B : 0 , m a x M B : 0 , p r i c e P e r M B : 0 , t o t a l P r i c e : 0 } } , r e m o v e : f u n c t i o n ( e ) { t h i s . r a n g e s . $ r e m o v e ( e ) , t h i s . c h a n g e ( ) } , c h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . r a n g e s ) } } , w a t c h : { m i n M B : f u n c t i o n ( e ) { l e t t = p a r s e I n t ( e . t o S t r i n g ( ) ) ; ( i s N a N ( t ) | | t < 0 ) & & ( t = 0 ) , t h i s . a d d i n g R a n g e . m i n M B = t } , m a x M B : f u n c t i o n ( e ) { l e t t = p a r s e I n t ( e . t o S t r i n g ( ) ) ; ( i s N a N ( t ) | | t < 0 ) & & ( t = 0 ) , t h i s . a d d i n g R a n g e . m a x M B = t } , p r i c e P e r M B : f u n c t i o n ( e ) { l e t t = p a r s e F l o a t ( e . t o S t r i n g ( ) ) ; ( i s N a N ( t ) | | t < 0 ) & & ( t = 0 ) , t h i s . a d d i n g R a n g e . p r i c e P e r M B = t } , t o t a l P r i c e : f u n c t i o n ( e ) { l e t t = p a r s e F l o a t ( e . t o S t r i n g ( ) ) ; ( i s N a N ( t ) | | t < 0 ) & & ( t = 0 ) , t h i s . a d d i n g R a n g e . t o t a l P r i c e = t } } , t e m p l a t e : ` < d i v >
2022-02-17 17:24:23 +08:00
<!-- 已有价格 -- >
< div v - if = "ranges.length > 0" >
< div class = "ui label basic small" v - for = "(range, index) in ranges" style = "margin-bottom: 0.5em" >
2022-07-17 21:19:45 +08:00
{ { range . minMB } } MB - < span v - if = "range.maxMB > 0" > { { range . maxMB } } MB < / s p a n > < s p a n v - e l s e > & i n f i n ; < / s p a n > & n b s p ; 价 格 : < s p a n v - i f = " r a n g e . t o t a l P r i c e > 0 " > { { r a n g e . t o t a l P r i c e } } 元 < / s p a n > < s p a n v - e l s e = " " > { { r a n g e . p r i c e P e r M B } } 元 / M B < / s p a n >
2022-02-17 17:24:23 +08:00
& nbsp ; < a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
<!-- 添加 -- >
< div v - if = "isAdding" >
< table class = "ui table" >
< tr >
2022-07-17 21:19:45 +08:00
< td class = "title" > 带宽下限 * < / t d >
2022-02-17 17:24:23 +08:00
< td >
< div class = "ui input right labeled" >
< input type = "text" placeholder = "最小带宽" style = "width: 7em" maxlength = "10" ref = "minMB" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" v - model = "minMB" / >
< span class = "ui label" > MB < / s p a n >
< / d i v >
< / t d >
< / t r >
< tr >
2022-07-17 21:19:45 +08:00
< td class = "title" > 带宽上限 * < / t d >
2022-02-17 17:24:23 +08:00
< td >
< div class = "ui input right labeled" >
< input type = "text" placeholder = "最大带宽" style = "width: 7em" maxlength = "10" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" v - model = "maxMB" / >
< span class = "ui label" > MB < / s p a n >
< / d i v >
< p class = "comment" > 如果填0 , 表示上不封顶 。 < / p >
< / t d >
< / t r >
2022-07-17 21:19:45 +08:00
< tr >
< td > 总价格 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" placeholder = "总价格" style = "width: 7em" maxlength = "10" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" v - model = "totalPrice" / >
< span class = "ui label" > 元 / MB < / s p a n >
< / d i v >
< p class = "comment" > 和单位价格二选一 。 < / p >
< / t d >
< / t r >
2022-02-17 17:24:23 +08:00
< tr >
< td class = "title" > 单位价格 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" placeholder = "单位价格" style = "width: 7em" maxlength = "10" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" v - model = "pricePerMB" / >
< span class = "ui label" > 元 / MB < / s p a n >
< / d i v >
2022-07-17 21:19:45 +08:00
< p class = "comment" > 和总价格二选一 。 如果设置了单位价格 , 那么 "总价格 = 单位价格 x 带宽" 。 < / p >
2022-02-17 17:24:23 +08:00
< / t d >
< / t r >
< / t a b l e >
< button class = "ui button small" type = "button" @ click . prevent = "confirm" > 确定 < / b u t t o n > & n b s p ;
< a href = "" title = "取消" @ click . prevent = "cancelAdding" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
<!-- 按钮 -- >
< div v - if = "!isAdding" >
< button class = "ui button small" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-07-27 20:20:04 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " p l a n - p r i c e - c o n f i g - b o x " , { p r o p s : [ " v - p r i c e - t y p e " , " v - m o n t h l y - p r i c e " , " v - s e a s o n a l l y - p r i c e " , " v - y e a r l y - p r i c e " , " v - t r a f f i c - p r i c e " , " v - b a n d w i d t h - p r i c e " , " v - d i s a b l e - p e r i o d " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v P r i c e T y p e , t = ( n u l l = = e & & ( e = " b a n d w i d t h " ) , 0 ) , i = t h i s . v M o n t h l y P r i c e , s = ( n u l l = = i | | i < = 0 ? i = " " : ( i = i . t o S t r i n g ( ) , t = p a r s e F l o a t ( i ) , i s N a N ( t ) & & ( t = 0 ) ) , 0 ) , n = t h i s . v S e a s o n a l l y P r i c e , o = ( n u l l = = n | | n < = 0 ? n = " " : ( n = n . t o S t r i n g ( ) , s = p a r s e F l o a t ( n ) , i s N a N ( s ) & & ( s = 0 ) ) , 0 ) , a = t h i s . v Y e a r l y P r i c e , l = ( n u l l = = a | | a < = 0 ? a = " " : ( a = a . t o S t r i n g ( ) , o = p a r s e F l o a t ( a ) , i s N a N ( o ) & & ( o = 0 ) ) , t h i s . v T r a f f i c P r i c e ) , c = 0 , r = ( n u l l ! = l ? c = l . b a s e : l = { b a s e : 0 } , " " ) , d = ( 0 < c & & ( r = c . t o S t r i n g ( ) ) , t h i s . v B a n d w i d t h P r i c e ) ; r e t u r n n u l l = = d ? d = { p e r c e n t i l e : 9 5 , r a n g e s : [ ] } : n u l l = = d . r a n g e s & & ( d . r a n g e s = [ ] ) , { p r i c e T y p e : e , m o n t h l y P r i c e : i , s e a s o n a l l y P r i c e : n , y e a r l y P r i c e : a , m o n t h l y P r i c e N u m b e r : t , s e a s o n a l l y P r i c e N u m b e r : s , y e a r l y P r i c e N u m b e r : o , t r a f f i c P r i c e B a s e : r , t r a f f i c P r i c e : l , b a n d w i d t h P r i c e : d , b a n d w i d t h P e r c e n t i l e : d . p e r c e n t i l e } } , m e t h o d s : { c h a n g e B a n d w i d t h P r i c e R a n g e s : f u n c t i o n ( e ) { t h i s . b a n d w i d t h P r i c e . r a n g e s = e } } , w a t c h : { m o n t h l y P r i c e : f u n c t i o n ( e ) { l e t t = p a r s e F l o a t ( e ) ; i s N a N ( t ) & & ( t = 0 ) , t h i s . m o n t h l y P r i c e N u m b e r = t } , s e a s o n a l l y P r i c e : f u n c t i o n ( e ) { l e t t = p a r s e F l o a t ( e ) ; i s N a N ( t ) & & ( t = 0 ) , t h i s . s e a s o n a l l y P r i c e N u m b e r = t } , y e a r l y P r i c e : f u n c t i o n ( e ) { l e t t = p a r s e F l o a t ( e ) ; i s N a N ( t ) & & ( t = 0 ) , t h i s . y e a r l y P r i c e N u m b e r = t } , t r a f f i c P r i c e B a s e : f u n c t i o n ( e ) { l e t t = p a r s e F l o a t ( e ) ; i s N a N ( t ) & & ( t = 0 ) , t h i s . t r a f f i c P r i c e . b a s e = t } , b a n d w i d t h P e r c e n t i l e : f u n c t i o n ( e ) { l e t t = p a r s e I n t ( e ) ; i s N a N ( t ) | | t < = 0 ? t = 9 5 : 1 0 0 < t & & ( t = 1 0 0 ) , t h i s . b a n d w i d t h P r i c e . p e r c e n t i l e = t } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "priceType" : value = "priceType" / >
< input type = "hidden" name = "monthlyPrice" : value = "monthlyPriceNumber" / >
< input type = "hidden" name = "seasonallyPrice" : value = "seasonallyPriceNumber" / >
< input type = "hidden" name = "yearlyPrice" : value = "yearlyPriceNumber" / >
< input type = "hidden" name = "trafficPriceJSON" : value = "JSON.stringify(trafficPrice)" / >
2022-02-17 17:24:23 +08:00
< input type = "hidden" name = "bandwidthPriceJSON" : value = "JSON.stringify(bandwidthPrice)" / >
2021-11-22 12:08:53 +08:00
< div >
2022-02-17 17:24:23 +08:00
< radio : v - value = "'bandwidth'" : value = "priceType" v - model = "priceType" > & nbsp ; 按带宽 < / r a d i o > & n b s p ;
< radio : v - value = "'traffic'" : value = "priceType" v - model = "priceType" > & nbsp ; 按流量 < / r a d i o > & n b s p ;
< radio : v - value = "'period'" : value = "priceType" v - model = "priceType" v - show = "typeof(vDisablePeriod) != 'boolean' || !vDisablePeriod" > & nbsp ; 按时间周期 < / r a d i o >
2021-11-22 12:08:53 +08:00
< / d i v >
<!-- 按时间周期 -- >
< div v - show = "priceType == 'period'" >
< div class = "ui divider" > < / d i v >
< table class = "ui table" >
< tr >
< td class = "title" > 月度价格 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" style = "width: 7em" maxlength = "10" v - model = "monthlyPrice" / >
< span class = "ui label" > 元 < / s p a n >
< / d i v >
< / t d >
< / t r >
< tr >
< td class = "title" > 季度价格 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" style = "width: 7em" maxlength = "10" v - model = "seasonallyPrice" / >
< span class = "ui label" > 元 < / s p a n >
< / d i v >
< / t d >
< / t r >
< tr >
< td class = "title" > 年度价格 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" style = "width: 7em" maxlength = "10" v - model = "yearlyPrice" / >
< span class = "ui label" > 元 < / s p a n >
< / d i v >
< / t d >
< / t r >
< / t a b l e >
< / d i v >
<!-- 按流量 -- >
< div v - show = "priceType =='traffic'" >
< div class = "ui divider" > < / d i v >
< table class = "ui table" >
< tr >
2022-02-17 17:24:23 +08:00
< td class = "title" > 基础流量费用 * < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui input right labeled" >
< input type = "text" v - model = "trafficPriceBase" maxlength = "10" style = "width: 7em" / >
< span class = "ui label" > 元 / GB < / s p a n >
< / d i v >
< / t d >
< / t r >
< / t a b l e >
< / d i v >
2022-02-17 17:24:23 +08:00
<!-- 按带宽 -- >
< div v - show = "priceType == 'bandwidth'" >
< div class = "ui divider" > < / d i v >
< table class = "ui table" >
< tr >
< td class = "title" > 带宽百分位 * < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" style = "width: 4em" maxlength = "3" v - model = "bandwidthPercentile" / >
< span class = "ui label" > th < / s p a n >
< / d i v >
< / t d >
< / t r >
< tr >
< td > 带宽价格 < / t d >
< td >
< plan - bandwidth - ranges : v - ranges = "bandwidthPrice.ranges" @ change = "changeBandwidthPriceRanges" > < / p l a n - b a n d w i d t h - r a n g e s >
< / t d >
< / t r >
< / t a b l e >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - s t a t - c o n f i g - b o x " , { p r o p s : [ " v - s t a t - c o n f i g " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v S t a t C o n f i g ; r e t u r n { s t a t : e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 } : e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "statJSON" : value = "JSON.stringify(stat)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "stat" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || stat.isPrior" >
< tr >
< td class = "title" > 是否开启统计 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "stat.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - r e q u e s t - c o n d s - b o x " , { p r o p s : [ " v - c o n d s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C o n d s ; r e t u r n { c o n d s : e = n u l l = = e ? { i s O n : ! 0 , c o n n e c t o r : " o r " , g r o u p s : [ ] } : e , c o m p o n e n t s : w i n d o w . R E Q U E S T _ C O N D _ C O M P O N E N T S } } , m e t h o d s : { c h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . c o n d s ) } , a d d G r o u p : f u n c t i o n ( ) { w i n d o w . U P D A T I N G _ C O N D _ G R O U P = n u l l ; l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / c o n d s / a d d G r o u p P o p u p " , { h e i g h t : " 3 0 e m " , c a l l b a c k : f u n c t i o n ( e ) { t . c o n d s . g r o u p s . p u s h ( e . d a t a . g r o u p ) , t . c h a n g e ( ) } } ) } , u p d a t e G r o u p : f u n c t i o n ( t , e ) { w i n d o w . U P D A T I N G _ C O N D _ G R O U P = e ; l e t i = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / c o n d s / a d d G r o u p P o p u p " , { h e i g h t : " 3 0 e m " , c a l l b a c k : f u n c t i o n ( e ) { V u e . s e t ( i . c o n d s . g r o u p s , t , e . d a t a . g r o u p ) , i . c h a n g e ( ) } } ) } , r e m o v e G r o u p : f u n c t i o n ( e ) { l e t t = t h i s ; t e a w e b . c o n f i r m ( " 确 定 要 删 除 这 一 组 条 件 吗 ? " , f u n c t i o n ( ) { t . c o n d s . g r o u p s . $ r e m o v e ( e ) , t . c h a n g e ( ) } ) } , t y p e N a m e : f u n c t i o n ( i ) { v a r e = t h i s . c o m p o n e n t s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . t y p e = = i . t y p e } ) ; r e t u r n n u l l ! = e ? e . n a m e : i . p a r a m + " " + i . o p e r a t o r } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "condsJSON" : value = "JSON.stringify(conds)" / >
< div v - if = "conds.groups.length > 0" >
< table class = "ui table" >
< tr v - for = "(group, groupIndex) in conds.groups" >
< td class = "title" : class = "{'color-border':conds.connector == 'and'}" : style = "{'border-bottom':(groupIndex < conds.groups.length-1) ? '1px solid rgba(34,36,38,.15)':''}" > 分组 { { groupIndex + 1 } } < / t d >
2022-02-17 17:24:23 +08:00
< td style = "background: white; word-break: break-all" : style = "{'border-bottom':(groupIndex < conds.groups.length-1) ? '1px solid rgba(34,36,38,.15)':''}" >
2021-11-22 12:08:53 +08:00
< var v - for = "(cond, index) in group.conds" style = "font-style: normal;display: inline-block; margin-bottom:0.5em" >
< span class = "ui label tiny" >
< var v - if = "cond.type.length == 0 || cond.type == 'params'" style = "font-style: normal" > { { cond . param } } < var > { { cond . operator } } < / v a r > < / v a r >
< var v - if = "cond.type.length > 0 && cond.type != 'params'" style = "font-style: normal" > { { typeName ( cond ) } } : < / v a r >
{ { cond . value } }
2021-12-12 17:14:46 +08:00
< sup v - if = "cond.isCaseInsensitive" title = "不区分大小写" > < i class = "icon info small" > < / i > < / s u p >
2021-11-22 12:08:53 +08:00
< / s p a n >
< var v - if = "index < group.conds.length - 1" > { { group . connector } } & nbsp ; < / v a r >
< / v a r >
< / t d >
< td style = "width: 5em; background: white" : style = "{'border-bottom':(groupIndex < conds.groups.length-1) ? '1px solid rgba(34,36,38,.15)':''}" >
< a href = "" title = "修改分组" @ click . prevent = "updateGroup(groupIndex, group)" > < i class = "icon pencil small" > < / i > < / a > < a h r e f = " " t i t l e = " 删 除 分 组 " @ c l i c k . p r e v e n t = " r e m o v e G r o u p ( g r o u p I n d e x ) " > < i c l a s s = " i c o n r e m o v e " > < / i > < / a >
< / t d >
< / t r >
< / t a b l e >
< div class = "ui divider" > < / d i v >
< / d i v >
<!-- 分组之间关系 -- >
< table class = "ui table" v - if = "conds.groups.length > 1" >
< tr >
< td class = "title" > 分组之间关系 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "conds.connector" >
< option value = "and" > 和 < / o p t i o n >
< option value = "or" > 或 < / o p t i o n >
< / s e l e c t >
< p class = "comment" >
< span v - if = "conds.connector == 'or'" > 只要满足其中一个条件分组即可 。 < / s p a n >
< span v - if = "conds.connector == 'and'" > 需要满足所有条件分组 。 < / s p a n >
< / p >
< / t d >
< / t r >
< / t a b l e >
< div >
< button class = "ui button tiny" type = "button" @ click . prevent = "addGroup()" > + 添加分组 < / b u t t o n >
< / d i v >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " s s l - c o n f i g - b o x " , { p r o p s : [ " v - s s l - p o l i c y " , " v - p r o t o c o l " , " v - s e r v e r - i d " ] , c r e a t e d : f u n c t i o n ( ) { l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . s o r t a b l e C i p h e r S u i t e s ( ) } , 1 0 0 ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v S s l P o l i c y , t = ( n u l l = = e ? e = { i d : 0 , i s O n : ! 0 , c e r t R e f s : [ ] , c e r t s : [ ] , c l i e n t C A R e f s : [ ] , c l i e n t C A C e r t s : [ ] , c l i e n t A u t h T y p e : 0 , m i n V e r s i o n : " T L S 1 . 1 " , h s t s : n u l l , c i p h e r S u i t e s I s O n : ! 1 , c i p h e r S u i t e s : [ ] , h t t p 2 E n a b l e d : ! 0 , o c s p I s O n : ! 1 } : ( n u l l = = e . c e r t R e f s & & ( e . c e r t R e f s = [ ] ) , n u l l = = e . c e r t s & & ( e . c e r t s = [ ] ) , n u l l = = e . c l i e n t C A R e f s & & ( e . c l i e n t C A R e f s = [ ] ) , n u l l = = e . c l i e n t C A C e r t s & & ( e . c l i e n t C A C e r t s = [ ] ) , n u l l = = e . c i p h e r S u i t e s & & ( e . c i p h e r S u i t e s = [ ] ) ) , e . h s t s ) ; r e t u r n n u l l = = t & & ( t = { i s O n : ! 1 , m a x A g e : 3 1 5 3 6 e 3 , i n c l u d e S u b D o m a i n s : ! 1 , p r e l o a d : ! 1 , d o m a i n s : [ ] } ) , { p o l i c y : e , h s t s : t , h s t s O p t i o n s V i s i b l e : ! 1 , h s t s D o m a i n A d d i n g : ! 1 , a d d i n g H s t s D o m a i n : " " , h s t s D o m a i n E d i t i n g I n d e x : - 1 , a l l V e r s i o n s : w i n d o w . S S L _ A L L _ V E R S I O N S , a l l C i p h e r S u i t e s : w i n d o w . S S L _ A L L _ C I P H E R _ S U I T E S . $ c o p y ( ) , m o d e r n C i p h e r S u i t e s : w i n d o w . S S L _ M O D E R N _ C I P H E R _ S U I T E S , i n t e r m e d i a t e C i p h e r S u i t e s : w i n d o w . S S L _ I N T E R M E D I A T E _ C I P H E R _ S U I T E S , a l l C l i e n t A u t h T y p e s : w i n d o w . S S L _ A L L _ C L I E N T _ A U T H _ T Y P E S , c i p h e r S u i t e s V i s i b l e : ! 1 , m o r e O p t i o n s V i s i b l e : ! 1 } } , w a t c h : { h s t s : { d e e p : ! 0 , h a n d l e r : f u n c t i o n ( ) { t h i s . p o l i c y . h s t s = t h i s . h s t s } } } , m e t h o d s : { r e m o v e C e r t : f u n c t i o n ( e ) { l e t t = t h i s ; t e a w e b . c o n f i r m ( " 确 定 删 除 此 证 书 吗 ? 证 书 数 据 仍 然 保 留 , 只 是 当 前 服 务 不 再 使 用 此 证 书 。 " , f u n c t i o n ( ) { t . p o l i c y . c e r t R e f s . $ r e m o v e ( e ) , t . p o l i c y . c e r t s . $ r e m o v e ( e ) } ) } , s e l e c t C e r t : f u n c t i o n ( ) { l e t t = t h i s , i = [ ] ; n u l l ! = t h i s . p o l i c y & & 0 < t h i s . p o l i c y . c e r t s . l e n g t h & & t h i s . p o l i c y . c e r t s . f o r E a c h ( f u n c t i o n ( e ) { i . p u s h ( e . i d . t o S t r i n g ( ) ) } ) , t e a w e b . p o p u p ( " / s e r v e r s / c e r t s / s e l e c t P o p u p ? s e l e c t e d C e r t I d s = " + i , { w i d t h : " 5 0 e m " , h e i g h t : " 3 0 e m " , c a l l b a c k : f u n c t i o n ( e ) { t . p o l i c y . c e r t R e f s . p u s h ( e . d a t a . c e r t R e f ) , t . p o l i c y . c e r t s . p u s h ( e . d a t a . c e r t ) } } ) } , u p l o a d C e r t : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / c e r t s / u p l o a d P o p u p " , { h e i g h t : " 2 8 e m " , c a l l b a c k : f u n c t i o n ( e ) { t e a w e b . s u c c e s s ( " 上 传 成 功 " , f u n c t i o n ( ) { t . p o l i c y . c e r t R e f s . p u s h ( e . d a t a . c e r t R e f ) , t . p o l i c y . c e r t s . p u s h ( e . d a t a . c e r t ) } ) } } ) } , r e q u e s t C e r t : f u n c t i o n ( ) { l e t t = [ ] , e = ( n u l l ! = t h i s . p o l i c y & & 0 < t h i s . p o l i c y . c e r t s . l e n g t h & & t h i s . p o l i c y . c e r t s . f o r E a c h ( f u n c t i o n ( e ) { t . $ p u s h A l l ( e . d n s N a m e s ) } ) , t h i s ) ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / h t t p s / r e q u e s t C e r t P o p u p ? s e r v e r I d = " + t h i s . v S e r v e r I d + " & e x c l u d e S e r v e r N a m e s = " + t . j o i n ( " , " ) , { c a l l b a c k : f u n c t i o n ( ) { e . p o l i c y . c e r t R e f s . p u s h ( r e s p . d a t a . c e r t R e f ) , e . p o l i c y . c e r t s . p u s h ( r e s p . d a t a . c e r t ) } } ) } , c h a n g e O p t i o n s V i s i b l e : f u n c t i o n ( ) { t h i s . m o r e O p t i o n s V i s i b l e = ! t h i s . m o r e O p t i o n s V i s i b l e } , f o r m a t T i m e : f u n c t i o n ( e ) { r e t u r n n e w D a t e ( 1 e 3 * e ) . f o r m a t ( " Y - m - d " ) } , f o r m a t C i p h e r S u i t e : f u n c t i o n ( e ) { r e t u r n e . r e p l a c e ( / ( A E S | 3 D E S ) / , ' < v a r s t y l e = " f o n t - w e i g h t : b o l d " > $ 1 < / v a r > ' ) } , a d d C i p h e r S u i t e : f u n c t i o n ( e ) { t h i s . p o l i c y . c i p h e r S u i t e s . $ c o n t a i n s ( e ) | | t h i s . p o l i c y . c i p h e r S u i t e s . p u s h ( e ) , t h i s . a l l C i p h e r S u i t e s . $ r e m o v e V a l u e ( e ) } , r e m o v e C i p h e r S u i t e : f u n c t i o n ( e ) { l e t i = t h i s ; t e a w e b . c o n f i r m ( " 确 定 要 删 除 此 套 件 吗 ? " , f u n c t i o n ( ) { i . p o l i c y . c i p h e r S u i t e s . $ r e m o v e V a l u e ( e ) , i . a l l C i p h e r S u i t e s = w i n d o w . S S L _ A L L _ C I P H E R _ S U I T E S . $ f i n d A l l ( f u n c t i o n ( e , t ) { r e t u r n ! i . p o l i c y . c i p h e r S u i t e s . $ c o n t a i n s ( t ) } ) } ) } , c l e a r C i p h e r S u i t e s : f u n c t i o n ( ) { l e t e = t h i s ; t e a w e b . c o n f i r m ( " 确 定 要 清 除 所 有 已 选 套 件 吗 ? " , f u n c t i o n ( ) { e . p o l i c y . c i p h e r S u i t e s = [ ] , e . a l l C i p h e r S u i t e s = w i n d o w . S S L _ A L L _ C I P H E R _ S U I T E S . $ c o p y ( ) } ) } , a d d B a t c h C i p h e r S u i t e s : f u n c t i o n ( e ) { v a r i = t h i s ; t e a w e b . c o n f i r m ( " 确 定 要 批 量 添 加 套 件 ? " , f u n c t i o n ( ) { e . $ e a c h ( f u n c t i o n ( e , t ) { i . p o l i c y . c i p h e r S u i t e s . $ c o n t a i n s ( t ) | | i . p o l i c y . c i p h e r S u i t e s . p u s h ( t ) } ) } ) } , s o r t a b l e C i p h e r S u i t e s : f u n c t i o n ( ) { v a r e = d o c u m e n t . q u e r y S e l e c t o r ( " . c i p h e r - s u i t e s - b o x " ) ; S o r t a b l e . c r e a t e ( e , { d r a g g a b l e : " . l a b e l " , h a n d l e : " . i c o n . h a n d l e " , o n S t a r t : f u n c t i o n ( ) { } , o n U p d a t e : f u n c t i o n ( e ) { } } ) } , s h o w A l l C i p h e r S u i t e s : f u n c t i o n ( ) { t h i s . c i p h e r S u i t e s V i s i b l e = ! t h i s . c i p h e r S u i t e s V i s i b l e } , s h o w M o r e H S T S : f u n c t i o n ( ) { t h i s . h s t s O p t i o n s V i s i b l e = ! t h i s . h s t s O p t i o n s V i s i b l e , t h i s . h s t s O p t i o n s V i s i b l e & & t h i s . c h a n g e H S T S M a x A g e ( ) } , c h a n g e H S T S M a x A g e : f u n c t i o n ( ) { v a r e = t h i s . h s t s . m a x A g e ; i s N a N ( e ) ? t h i s . h s t s . d a y s = " - " : ( t h i s . h s t s . d a y s = p a r s e I n t ( e / 8 6 4 0 0 ) , ( i s N a N ( t h i s . h s t s . d a y s ) | | t h i s . h s t s . d a y s < 0 ) & & ( t h i s . h s t s . d a y s = " - " ) ) } , s e t H S T S M a x A g e : f u n c t i o n ( e ) { t h i s . h s t s . m a x A g e = e , t h i s . c h a n g e H S T S M a x A g e ( ) } , a d d H s t s D o m a i n : f u n c t i o n ( ) { t h i s . h s t s D o m a i n A d d i n g = ! 0 , t h i s . h s t s D o m a i n E d i t i n g I n d e x = - 1 ;
2021-11-22 12:08:53 +08:00
< h4 > SSL / TLS相关配置 < / h 4 >
< input type = "hidden" name = "sslPolicyJSON" : value = "JSON.stringify(policy)" / >
< table class = "ui table definition selectable" >
< tbody >
< tr v - show = "vProtocol == 'https'" >
< td class = "title" > 启用HTTP / 2 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" value = "1" v - model = "policy.http2Enabled" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< tr >
< td class = "title" > 选择证书 < / t d >
< td >
< div v - if = "policy.certs != null && policy.certs.length > 0" >
2022-06-08 20:11:38 +08:00
< div class = "ui label small basic" v - for = "(cert, index) in policy.certs" style = "margin-top: 0.2em" >
2021-11-22 12:08:53 +08:00
{ { cert . name } } / { { cert . dnsNames } } / 有效至 { { formatTime ( cert . timeEndAt ) } } & nbsp ; < a href = "" title = "删除" @ click . prevent = "removeCert(index)" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div v - else >
< span class = "red" > 选择或上传证书后 < span v - if = "vProtocol == 'https'" > HTTPS < / s p a n > < s p a n v - i f = " v P r o t o c o l = = ' t l s ' " > T L S < / s p a n > 服 务 才 能 生 效 。 < / s p a n >
< div class = "ui divider" > < / d i v >
< / d i v >
< button class = "ui button tiny" type = "button" @ click . prevent = "selectCert()" > 选择已有证书 < / b u t t o n > & n b s p ;
< button class = "ui button tiny" type = "button" @ click . prevent = "uploadCert()" > 上传新证书 < / b u t t o n > & n b s p ;
< button class = "ui button tiny" type = "button" @ click . prevent = "requestCert()" v - if = "vServerId != null && vServerId > 0" > 申请免费证书 < / b u t t o n >
< / t d >
< / t r >
< tr >
< td > TLS最低版本 < / t d >
< td >
< select v - model = "policy.minVersion" class = "ui dropdown auto-width" >
< option v - for = "version in allVersions" : value = "version" > { { version } } < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< / t b o d y >
< more - options - tbody @ change = "changeOptionsVisible" > < / m o r e - o p t i o n s - t b o d y >
< tbody v - show = "moreOptionsVisible" >
<!-- 加密套件 -- >
< tr >
< td > 加密算法套件 < em > ( CipherSuites ) < / e m > < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" value = "1" v - model = "policy.cipherSuitesIsOn" / >
< label > 是否要自定义 < / l a b e l >
< / d i v >
< div v - show = "policy.cipherSuitesIsOn" >
< div class = "ui divider" > < / d i v >
< div class = "cipher-suites-box" >
已添加套件 ( { { policy . cipherSuites . length } } ) :
< div v - for = "cipherSuite in policy.cipherSuites" class = "ui label tiny basic" style = "margin-bottom: 0.5em" >
< input type = "hidden" name = "cipherSuites" : value = "cipherSuite" / >
< span v - html = "formatCipherSuite(cipherSuite)" > < /span> <a href="" title="删除套件" @click.prevent="removeCipherSuite(cipherSuite)"><i class="icon remove"></i > < / a >
< a href = "" title = "拖动改变顺序" > < i class = "icon bars handle" > < / i > < / a >
< / d i v >
< / d i v >
< div >
< div class = "ui divider" > < / d i v >
< span v - if = "policy.cipherSuites.length > 0" > < a href = "" @ click . prevent = "clearCipherSuites()" > [ 清除所有已选套件 ] < / a > & n b s p ; < / s p a n >
< a href = "" @ click . prevent = "addBatchCipherSuites(modernCipherSuites)" > [ 添加推荐套件 ] < / a > & n b s p ;
< a href = "" @ click . prevent = "addBatchCipherSuites(intermediateCipherSuites)" > [ 添加兼容套件 ] < / a >
< div class = "ui divider" > < / d i v >
< / d i v >
< div class = "cipher-all-suites-box" >
< a href = "" @ click . prevent = "showAllCipherSuites()" > < span v - if = "policy.cipherSuites.length == 0" > 所有 < /span>可选套件({{allCipherSuites.length}}) <i class="icon angle" :class="{down:!cipherSuitesVisible, up:cipherSuitesVisible}"></i > < / a >
< a href = "" v - if = "cipherSuitesVisible" v - for = "cipherSuite in allCipherSuites" class = "ui label tiny" title = "点击添加到自定义套件中" @ click . prevent = "addCipherSuite(cipherSuite)" v - html = "formatCipherSuite(cipherSuite)" style = "margin-bottom:0.5em" > < / a >
< / d i v >
< p class = "comment" v - if = "cipherSuitesVisible" > 点击可选套件添加 。 < / p >
< / d i v >
< / t d >
< / t r >
<!-- HSTS -- >
< tr v - show = "vProtocol == 'https'" >
< td : class = "{'color-border':hsts.isOn}" > 是否开启HSTS < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" name = "hstsOn" v - model = "hsts.isOn" value = "1" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" >
开启后 , 会自动在响应Header中加入
< span class = "ui label small" > Strict - Transport - Security :
< var v - if = "!hsts.isOn" > ... < / v a r >
< var v - if = "hsts.isOn" > < span > max - age = < / s p a n > { { h s t s . m a x A g e } } < / v a r >
< var v - if = "hsts.isOn && hsts.includeSubDomains" > ; includeSubDomains < / v a r >
< var v - if = "hsts.isOn && hsts.preload" > ; preload < / v a r >
< / s p a n >
< span v - if = "hsts.isOn" >
< a href = "" @ click . prevent = "showMoreHSTS()" > 修改 < i class = "icon angle" : class = "{down:!hstsOptionsVisible, up:hstsOptionsVisible}" > < / i > < / a >
< / s p a n >
< / p >
< / t d >
< / t r >
2021-12-18 17:23:55 +08:00
< tr v - show = "hsts.isOn && hstsOptionsVisible" >
< td class = "color-border" > HSTS有效时间 < em > ( max - age ) < / e m > < / t d >
< td >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" name = "hstsMaxAge" v - model = "hsts.maxAge" maxlength = "10" size = "10" @ input = "changeHSTSMaxAge()" / >
< / d i v >
< div class = "ui field" >
秒
< / d i v >
< div class = "ui field" > { { hsts . days } } 天 < / d i v >
< / d i v >
< p class = "comment" >
< a href = "" @ click . prevent = "setHSTSMaxAge(31536000)" : class = "{active:hsts.maxAge == 31536000}" > [ 1 年 / 365 天 ] < / a > & n b s p ; & n b s p ;
< a href = "" @ click . prevent = "setHSTSMaxAge(15768000)" : class = "{active:hsts.maxAge == 15768000}" > [ 6 个月 / 182.5 天 ] < / a > & n b s p ; & n b s p ;
< a href = "" @ click . prevent = "setHSTSMaxAge(2592000)" : class = "{active:hsts.maxAge == 2592000}" > [ 1 个月 / 30 天 ] < / a >
< / p >
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
< tr v - show = "hsts.isOn && hstsOptionsVisible" >
< td class = "color-border" > HSTS包含子域名 < em > ( includeSubDomains ) < / e m > < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" name = "hstsIncludeSubDomains" value = "1" v - model = "hsts.includeSubDomains" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< tr v - show = "hsts.isOn && hstsOptionsVisible" >
< td class = "color-border" > HSTS预加载 < em > ( preload ) < / e m > < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" name = "hstsPreload" value = "1" v - model = "hsts.preload" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< tr v - show = "hsts.isOn && hstsOptionsVisible" >
< td class = "color-border" > HSTS生效的域名 < / t d >
< td colspan = "2" >
< div class = "names-box" >
< span class = "ui label tiny basic" v - for = "(domain, arrayIndex) in hsts.domains" : class = "{blue:hstsDomainEditingIndex == arrayIndex}" > { { domain } }
< input type = "hidden" name = "hstsDomains" : value = "domain" / > & nbsp ;
< a href = "" @ click . prevent = "editHstsDomain(arrayIndex)" title = "修改" > < i class = "icon pencil" > < / i > < / a >
< a href = "" @ click . prevent = "removeHstsDomain(arrayIndex)" title = "删除" > < i class = "icon remove" > < / i > < / a >
< / s p a n >
< / d i v >
< div class = "ui fields inline" v - if = "hstsDomainAdding" style = "margin-top:0.8em" >
< div class = "ui field" >
< input type = "text" name = "addingHstsDomain" ref = "addingHstsDomain" style = "width:16em" maxlength = "100" placeholder = "域名, 比如example.com" @ keyup . enter = "confirmAddHstsDomain()" @ keypress . enter . prevent = "1" v - model = "addingHstsDomain" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click = "confirmAddHstsDomain()" > 确定 < / b u t t o n >
& nbsp ; < a href = "" @ click . prevent = "cancelHstsDomainAdding()" > 取消 < / a >
< / d i v >
< / d i v >
< div class = "ui field" style = "margin-top: 1em" >
< button class = "ui button tiny" type = "button" @ click = "addHstsDomain()" > + < / b u t t o n >
< / d i v >
< p class = "comment" > 如果没有设置域名的话 , 则默认支持所有的域名 。 < / p >
< / t d >
< / t r >
2022-03-10 21:32:56 +08:00
<!-- OCSP -- >
< tr >
< td > OCSP Stapling < / t d >
< td > < checkbox name = "ocspIsOn" v - model = "policy.ocspIsOn" > < / c h e c k b o x >
< p class = "comment" > 选中表示启用OCSP Stapling 。 < / p >
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
<!-- 客户端认证 -- >
< tr >
< td > 客户端认证方式 < / t d >
< td >
< select name = "clientAuthType" v - model = "policy.clientAuthType" class = "ui dropdown auto-width" >
< option v - for = "authType in allClientAuthTypes" : value = "authType.type" > { { authType . name } } < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< tr >
< td > 客户端认证CA证书 < / t d >
< td >
< div v - if = "policy.clientCACerts != null && policy.clientCACerts.length > 0" >
< div class = "ui label small" v - for = "(cert, index) in policy.clientCACerts" >
{ { cert . name } } / { { cert . dnsNames } } / 有效至 { { formatTime ( cert . timeEndAt ) } } & nbsp ; < a href = "" title = "删除" @ click . prevent = "removeClientCACert()" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< button class = "ui button tiny" type = "button" @ click . prevent = "selectClientCACert()" > 选择已有证书 < / b u t t o n > & n b s p ;
< button class = "ui button tiny" type = "button" @ click . prevent = "uploadClientCACert()" > 上传新证书 < / b u t t o n >
< p class = "comment" > 用来校验客户端证书以增强安全性 , 通常不需要设置 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "ui margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - f i r e w a l l - a c t i o n s - v i e w " , { p r o p s : [ " v - a c t i o n s " ] , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div v - for = "action in vActions" style = "margin-bottom: 0.3em" >
< span : class = "{red: action.category == 'block', orange: action.category == 'verify', green: action.category == 'allow'}" > { { action . name } } ( { { action . code . toUpperCase ( ) } } ) < / s p a n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - r e q u e s t - s c r i p t s - c o n f i g - b o x " , { p r o p s : [ " v R e q u e s t S c r i p t s C o n f i g " , " v - i s - l o c a t i o n " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R e q u e s t S c r i p t s C o n f i g ; r e t u r n { c o n f i g : e = n u l l = = e ? { } : e } } , m e t h o d s : { c h a n g e I n i t G r o u p : f u n c t i o n ( e ) { t h i s . c o n f i g . i n i t G r o u p = e , t h i s . $ f o r c e U p d a t e ( ) } , c h a n g e R e q u e s t G r o u p : f u n c t i o n ( e ) { t h i s . c o n f i g . r e q u e s t G r o u p = e , t h i s . $ f o r c e U p d a t e ( ) } } , t e m p l a t e : ` < d i v >
2021-12-31 15:20:59 +08:00
< input type = "hidden" name = "requestScriptsJSON" : value = "JSON.stringify(config)" / >
< div class = "margin" > < / d i v >
2022-01-05 15:54:22 +08:00
< h4 style = "margin-bottom: 0" > 请求初始化 < / h 4 >
< p class = "comment" > 在请求刚初始化时调用 , 此时自定义Header等尚未生效 。 < / p >
2021-12-31 15:20:59 +08:00
< div >
2022-03-26 22:10:34 +08:00
< script - group - config - box : v - group = "config.initGroup" @ change = "changeInitGroup" : v - is - location = "vIsLocation" > < / s c r i p t - g r o u p - c o n f i g - b o x >
2021-12-31 15:20:59 +08:00
< / d i v >
2022-01-05 15:54:22 +08:00
< h4 style = "margin-bottom: 0" > 准备发送请求 < / h 4 >
< p class = "comment" > 在准备执行请求或者转发请求之前调用 , 此时自定义Header 、 源站等已准备好 。 < / p >
2021-12-31 15:20:59 +08:00
< div >
2022-03-26 22:10:34 +08:00
< script - group - config - box : v - group = "config.requestGroup" @ change = "changeRequestGroup" : v - is - location = "vIsLocation" > < / s c r i p t - g r o u p - c o n f i g - b o x >
2021-12-31 15:20:59 +08:00
< / d i v >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - f i r e w a l l - r u l e - l a b e l " , { p r o p s : [ " v - r u l e " ] , d a t a : f u n c t i o n ( ) { r e t u r n { r u l e : t h i s . v R u l e } } , m e t h o d s : { s h o w E r r : f u n c t i o n ( e ) { t e a w e b . p o p u p T i p ( ' 规 则 校 验 错 误 , 请 修 正 : < s p a n c l a s s = " r e d " > ' + t e a w e b . e n c o d e H T M L ( e ) + " < / s p a n > " ) } } , t e m p l a t e : ` < d i v >
2022-01-11 12:04:03 +08:00
< div class = "ui label tiny basic" style = "line-height: 1.5" >
2021-11-22 12:08:53 +08:00
{ { rule . name } } [ { { rule . param } } ]
<!-- cc2 -- >
< span v - if = "rule.param == '\${cc2}'" >
{ { rule . checkpointOptions . period } } 秒 / { { rule . checkpointOptions . threshold } } 请求
< / s p a n >
<!-- refererBlock -- >
< span v - if = "rule.param == '\${refererBlock}'" >
{ { rule . checkpointOptions . allowDomains } }
< / s p a n >
< span v - else >
< span v - if = "rule.paramFilters != null && rule.paramFilters.length > 0" v - for = "paramFilter in rule.paramFilters" > | { { paramFilter . code } } < / s p a n >
< var : class = "{dash:rule.isCaseInsensitive}" : title = "rule.isCaseInsensitive ? '大小写不敏感':''" v - if = "!rule.isComposed" > { { rule . operator } } < / v a r >
{ { rule . value } }
< / s p a n >
2022-01-11 12:04:03 +08:00
<!-- description -- >
< span v - if = "rule.description != null && rule.description.length > 0" class = "grey small" > ( { { rule . description } } ) < / s p a n >
2021-11-22 12:08:53 +08:00
< a href = "" v - if = "rule.err != null && rule.err.length > 0" @ click . prevent = "showErr(rule.err)" style = "color: #db2828; opacity: 1; border-bottom: 1px #db2828 dashed; margin-left: 0.5em" > 规则错误 < / a >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c a c h e - r e f s - b o x " , { p r o p s : [ " v - c a c h e - r e f s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C a c h e R e f s ; r e t u r n { r e f s : e = n u l l = = e ? [ ] : e } } , m e t h o d s : { t i m e U n i t N a m e : f u n c t i o n ( e ) { s w i t c h ( e ) { c a s e " m s " : r e t u r n " 毫 秒 " ; c a s e " s e c o n d " : r e t u r n " 秒 " ; c a s e " m i n u t e " : r e t u r n " 分 钟 " ; c a s e " h o u r " : r e t u r n " 小 时 " ; c a s e " d a y " : r e t u r n " 天 " ; c a s e " w e e k " : r e t u r n " 周 " } r e t u r n e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "refsJSON" : value = "JSON.stringify(refs)" / >
< p class = "comment" v - if = "refs.length == 0" > 暂时还没有缓存条件 。 < / p >
< div v - show = "refs.length > 0" >
< table class = "ui table selectable celled" >
< thead >
< tr >
< th > 缓存条件 < / t h >
< th class = "two wide" > 分组关系 < / t h >
< th class = "width10" > 缓存时间 < / t h >
< / t r >
< tr v - for = "(cacheRef, index) in refs" >
2022-04-08 20:49:33 +08:00
< td : class = "{'color-border': cacheRef.conds.connector == 'and', disabled: !cacheRef.isOn}" : style = "{'border-left':cacheRef.isReverse ? '1px #db2828 solid' : ''}" >
< http - request - conds - view : v - conds = "cacheRef.conds" : class = "{disabled: !cacheRef.isOn}" > < / h t t p - r e q u e s t - c o n d s - v i e w >
2021-11-22 12:08:53 +08:00
< grey - label v - if = "cacheRef.minSize != null && cacheRef.minSize.count > 0" >
{ { cacheRef . minSize . count } } { { cacheRef . minSize . unit } }
< span v - if = "cacheRef.maxSize != null && cacheRef.maxSize.count > 0" > - { { cacheRef . maxSize . count } } { { cacheRef . maxSize . unit } } < / s p a n >
< / g r e y - l a b e l >
< grey - label v - else - if = "cacheRef.maxSize != null && cacheRef.maxSize.count > 0" > 0 - { { cacheRef . maxSize . count } } { { cacheRef . maxSize . unit } } < / g r e y - l a b e l >
2021-12-08 10:03:27 +08:00
< grey - label v - if = "cacheRef.methods != null && cacheRef.methods.length > 0" > { { cacheRef . methods . join ( ", " ) } } < / g r e y - l a b e l >
2021-12-08 19:13:54 +08:00
< grey - label v - if = "cacheRef.expiresTime != null && cacheRef.expiresTime.isPrior && cacheRef.expiresTime.isOn" > Expires < / g r e y - l a b e l >
2021-11-22 12:08:53 +08:00
< grey - label v - if = "cacheRef.status != null && cacheRef.status.length > 0 && (cacheRef.status.length > 1 || cacheRef.status[0] != 200)" > 状态码 : { { cacheRef . status . map ( function ( v ) { return v . toString ( ) } ) . join ( ", " ) } } < / g r e y - l a b e l >
2022-03-04 17:00:01 +08:00
< grey - label v - if = "cacheRef.allowPartialContent" > 区间缓存 < / g r e y - l a b e l >
2022-08-08 16:26:12 +08:00
< grey - label v - if = "cacheRef.enableIfNoneMatch" > If - None - Match < / g r e y - l a b e l >
< grey - label v - if = "cacheRef.enableIfModifiedSince" > If - Modified - Since < / g r e y - l a b e l >
2021-11-22 12:08:53 +08:00
< / t d >
2022-04-08 20:49:33 +08:00
< td : class = "{disabled: !cacheRef.isOn}" >
2021-11-22 12:08:53 +08:00
< span v - if = "cacheRef.conds.connector == 'and'" > 和 < / s p a n >
< span v - if = "cacheRef.conds.connector == 'or'" > 或 < / s p a n >
< / t d >
2022-04-08 20:49:33 +08:00
< td : class = "{disabled: !cacheRef.isOn}" >
2021-11-22 12:08:53 +08:00
< span v - if = "!cacheRef.isReverse" > { { cacheRef . life . count } } { { timeUnitName ( cacheRef . life . unit ) } } < / s p a n >
< span v - else class = "red" > 不缓存 < / s p a n >
< / t d >
< / t r >
< / t h e a d >
< / t a b l e >
< / d i v >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " s s l - c e r t s - b o x " , { p r o p s : [ " v - c e r t s " , " v - c e r t " , " v - p r o t o c o l " , " v - v i e w - s i z e " , " v - s i n g l e - m o d e " , " v - d e s c r i p t i o n " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C e r t s , t = ( n u l l = = e & & ( e = [ ] ) , n u l l ! = t h i s . v C e r t & & e . p u s h ( t h i s . v C e r t ) , t h i s . v D e s c r i p t i o n ) ; r e t u r n n u l l ! = t & & " s t r i n g " = = t y p e o f t | | ( t = " " ) , { c e r t s : e , d e s c r i p t i o n : t } } , m e t h o d s : { c e r t I d s : f u n c t i o n ( ) { r e t u r n t h i s . c e r t s . m a p ( f u n c t i o n ( e ) { r e t u r n e . i d } ) } , r e m o v e C e r t : f u n c t i o n ( e ) { l e t t = t h i s ; t e a w e b . c o n f i r m ( " 确 定 删 除 此 证 书 吗 ? 证 书 数 据 仍 然 保 留 , 只 是 当 前 服 务 不 再 使 用 此 证 书 。 " , f u n c t i o n ( ) { t . c e r t s . $ r e m o v e ( e ) } ) } , s e l e c t C e r t : f u n c t i o n ( ) { l e t t = t h i s , e = " 5 0 e m " , i = " 3 0 e m " , s = t h i s . v V i e w S i z e ; " m i n i " = = ( s = n u l l = = s ? " n o r m a l " : s ) & & ( e = " 3 5 e m " , i = " 2 0 e m " ) , t e a w e b . p o p u p ( " / s e r v e r s / c e r t s / s e l e c t P o p u p ? v i e w S i z e = " + s , { w i d t h : e , h e i g h t : i , c a l l b a c k : f u n c t i o n ( e ) { t . c e r t s . p u s h ( e . d a t a . c e r t ) } } ) } , u p l o a d C e r t : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / c e r t s / u p l o a d P o p u p " , { h e i g h t : " 2 8 e m " , c a l l b a c k : f u n c t i o n ( e ) { t e a w e b . s u c c e s s ( " 上 传 成 功 " , f u n c t i o n ( ) { t . c e r t s . p u s h ( e . d a t a . c e r t ) } ) } } ) } , f o r m a t T i m e : f u n c t i o n ( e ) { r e t u r n n e w D a t e ( 1 e 3 * e ) . f o r m a t ( " Y - m - d " ) } , b u t t o n s V i s i b l e : f u n c t i o n ( ) { r e t u r n n u l l = = t h i s . v S i n g l e M o d e | | ! t h i s . v S i n g l e M o d e | | n u l l = = t h i s . c e r t s | | 0 = = t h i s . c e r t s . l e n g t h } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "certIdsJSON" : value = "JSON.stringify(certIds())" / >
< div v - if = "certs != null && certs.length > 0" >
2022-01-16 20:04:11 +08:00
< div class = "ui label small basic" v - for = "(cert, index) in certs" >
2021-11-22 12:08:53 +08:00
{ { cert . name } } / { { cert . dnsNames } } / 有效至 { { formatTime ( cert . timeEndAt ) } } & nbsp ; < a href = "" title = "删除" @ click . prevent = "removeCert(index)" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div class = "ui divider" v - if = "buttonsVisible()" > < / d i v >
< / d i v >
< div v - else >
2022-01-16 20:04:11 +08:00
< span class = "red" v - if = "description.length == 0" > 选择或上传证书后 < span v - if = "vProtocol == 'https'" > HTTPS < / s p a n > < s p a n v - i f = " v P r o t o c o l = = ' t l s ' " > T L S < / s p a n > 服 务 才 能 生 效 。 < / s p a n >
< span class = "grey" v - if = "description.length > 0" > { { description } } < / s p a n >
2021-11-22 12:08:53 +08:00
< div class = "ui divider" v - if = "buttonsVisible()" > < / d i v >
< / d i v >
< div v - if = "buttonsVisible()" >
< button class = "ui button tiny" type = "button" @ click . prevent = "selectCert()" > 选择已有证书 < / b u t t o n > & n b s p ;
< button class = "ui button tiny" type = "button" @ click . prevent = "uploadCert()" > 上传新证书 < / b u t t o n > & n b s p ;
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - h o s t - r e d i r e c t - b o x " , { p r o p s : [ " v - r e d i r e c t s " ] , m o u n t e d : f u n c t i o n ( ) { l e t s = t h i s ; s o r t T a b l e ( f u n c t i o n ( e ) { l e t i = [ ] ; e . f o r E a c h ( f u n c t i o n ( t ) { s . r e d i r e c t s . f o r E a c h ( f u n c t i o n ( e ) { e . i d = = t & & i . p u s h ( e ) } ) } ) , s . u p d a t e R e d i r e c t s ( i ) } ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R e d i r e c t s , t = ( n u l l = = e & & ( e = [ ] ) , 0 ) ; r e t u r n e . f o r E a c h ( f u n c t i o n ( e ) { t + + , e . i d = t } ) , { r e d i r e c t s : e , s t a t u s O p t i o n s : [ { c o d e : 3 0 1 , t e x t : " M o v e d P e r m a n e n t l y " } , { c o d e : 3 0 8 , t e x t : " P e r m a n e n t R e d i r e c t " } , { c o d e : 3 0 2 , t e x t : " F o u n d " } , { c o d e : 3 0 3 , t e x t : " S e e O t h e r " } , { c o d e : 3 0 7 , t e x t : " T e m p o r a r y R e d i r e c t " } ] , i d : t } } , m e t h o d s : { a d d : f u n c t i o n ( ) { l e t t = t h i s ; w i n d o w . U P D A T I N G _ R E D I R E C T = n u l l , t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / r e d i r e c t s / c r e a t e P o p u p " , { w i d t h : " 5 0 e m " , h e i g h t : " 3 0 e m " , c a l l b a c k : f u n c t i o n ( e ) { t . i d + + , e . d a t a . r e d i r e c t . i d = t . i d , t . r e d i r e c t s . p u s h ( e . d a t a . r e d i r e c t ) , t . c h a n g e ( ) } } ) } , u p d a t e : f u n c t i o n ( t , i ) { l e t s = t h i s ; w i n d o w . U P D A T I N G _ R E D I R E C T = i , t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / r e d i r e c t s / c r e a t e P o p u p " , { w i d t h : " 5 0 e m " , h e i g h t : " 3 0 e m " , c a l l b a c k : f u n c t i o n ( e ) { e . d a t a . r e d i r e c t . i d = i . i d , V u e . s e t ( s . r e d i r e c t s , t , e . d a t a . r e d i r e c t ) , s . c h a n g e ( ) } } ) } , r e m o v e : f u n c t i o n ( e ) { l e t t = t h i s ; t e a w e b . c o n f i r m ( " 确 定 要 删 除 这 条 跳 转 规 则 吗 ? " , f u n c t i o n ( ) { t . r e d i r e c t s . $ r e m o v e ( e ) , t . c h a n g e ( ) } ) } , c h a n g e : f u n c t i o n ( ) { l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ e m i t ( " c h a n g e " , e . r e d i r e c t s ) } , 1 0 0 ) } , u p d a t e R e d i r e c t s : f u n c t i o n ( e ) { t h i s . r e d i r e c t s = e , t h i s . c h a n g e ( ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "hostRedirectsJSON" : value = "JSON.stringify(redirects)" / >
< first - menu >
< menu - item @ click . prevent = "add" > [ 创建 ] < / m e n u - i t e m >
< / f i r s t - m e n u >
< div class = "margin" > < / d i v >
< p class = "comment" v - if = "redirects.length == 0" > 暂时还没有URL跳转规则 。 < / p >
< div v - show = "redirects.length > 0" >
< table class = "ui table celled selectable" id = "sortable-table" >
< thead >
< tr >
< th style = "width: 1em" > < / t h >
< th > 跳转前URL < / t h >
< th style = "width: 1em" > < / t h >
< th > 跳转后URL < / t h >
< th > 匹配模式 < / t h >
< th > HTTP状态码 < / t h >
< th class = "two wide" > 状态 < / t h >
< th class = "two op" > 操作 < / t h >
< / t r >
< / t h e a d >
< tbody v - for = "(redirect, index) in redirects" : key = "redirect.id" : v - id = "redirect.id" >
< tr >
< td style = "text-align: center;" > < i class = "icon bars handle grey" > < / i > < / t d >
< td >
{ { redirect . beforeURL } }
< div style = "margin-top: 0.5em" v - if = "redirect.conds != null && redirect.conds.groups != null && redirect.conds.groups.length > 0" >
< span class = "ui label text basic tiny" > 匹配条件 < / s p a n >
< / d i v >
< / t d >
< td nowrap = "" > - & gt ; < / t d >
< td > { { redirect . afterURL } } < / t d >
< td >
< span v - if = "redirect.matchPrefix" > 匹配前缀 < / s p a n >
< span v - if = "redirect.matchRegexp" > 正则匹配 < / s p a n >
< span v - if = "!redirect.matchPrefix && !redirect.matchRegexp" > 精准匹配 < / s p a n >
< / t d >
< td >
< span v - if = "redirect.status > 0" > { { redirect . status } } < / s p a n >
< span v - else class = "disabled" > 默认 < / s p a n >
< / t d >
< td > < label - on : v - is - on = "redirect.isOn" > < / l a b e l - o n > < / t d >
< td >
< a href = "" @ click . prevent = "update(index, redirect)" > 修改 < / a > & n b s p ;
< a href = "" @ click . prevent = "remove(index)" > 删除 < / a >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< p class = "comment" v - if = "redirects.length > 1" > 所有规则匹配顺序为从上到下 , 可以拖动左侧的 < i class = "icon bars" > < / i > 排 序 。 < / p >
< / d i v >
< div class = "margin" > < / d i v >
2022-08-08 16:26:12 +08:00
< /div>`}),Vue.component("http-cache-ref-box",{props:["v-cache-ref","v-is-reverse"],mounted:function(){this.$refs.variablesDescriber.update(this.ref.key)},data:function(){let e=this.vCacheRef;return null==(e=null==e?{isOn:!0,cachePolicyId:0,key:"${scheme}:/ / $ { host } $ { requestPath } $ { isArgs } $ { args } ",life:{count:2,unit:" hour "},status:[200],maxSize:{count:32,unit:" mb "},minSize:{count:0,unit:" kb "},skipCacheControlValues:[" private "," no - cache "," no - store "],skipSetCookie:!0,enableRequestCachePragma:!1,conds:null,allowChunkedEncoding:!0,allowPartialContent:!1,enableIfNoneMatch:!1,enableIfModifiedSince:!1,isReverse:this.vIsReverse,methods:[],expiresTime:{isPrior:!1,isOn:!1,overwrite:!0,autoCalculate:!0,duration:{count:-1,unit:" hour "}}}:e).key&&(e.key=" "),null==e.methods&&(e.methods=[]),null==e.life&&(e.life={count:2,unit:" hour "}),null==e.maxSize&&(e.maxSize={count:32,unit:" mb "}),null==e.minSize&&(e.minSize={count:0,unit:" kb " } ) , { ref : e , moreOptionsVisible : ! 1 } } , methods : { changeOptionsVisible : function ( e ) { this . moreOptionsVisible = e } , changeLife : function ( e ) { this . ref . life = e } , changeMaxSize : function ( e ) { this . ref . maxSize = e } , changeMinSize : function ( e ) { this . ref . minSize = e } , changeConds : function ( e ) { this . ref . conds = e } , changeStatusList : function ( e ) { let t = [ ] ; e . forEach ( function ( e ) { e = parseInt ( e ) ; isNaN ( e ) || e < 100 || 999 < e || t . push ( e ) } ) , this . ref . status = t } , changeMethods : function ( e ) { this . ref . methods = e . map ( function ( e ) { return e . toUpperCase ( ) } ) } , changeKey : function ( e ) { this . $refs . variablesDescriber . update ( e ) } , changeExpiresTime : function ( e ) { this . ref . expiresTime = e } } , template : ` <tbody>
2021-11-22 12:08:53 +08:00
< tr >
< td class = "title" > 匹配条件分组 * < / t d >
< td >
< http - request - conds - box : v - conds = "ref.conds" @ change = "changeConds" > < / h t t p - r e q u e s t - c o n d s - b o x >
< input type = "hidden" name = "cacheRefJSON" : value = "JSON.stringify(ref)" / >
< / t d >
< / t r >
< tr v - show = "!vIsReverse" >
< td > 缓存有效期 * < / t d >
< td >
< time - duration - box : v - value = "ref.life" @ change = "changeLife" > < / t i m e - d u r a t i o n - b o x >
< / t d >
< / t r >
< tr v - show = "!vIsReverse" >
< td > 缓存Key * < / t d >
< td >
2021-12-08 10:03:27 +08:00
< input type = "text" v - model = "ref.key" @ input = "changeKey(ref.key)" / >
< p class = "comment" > 用来区分不同缓存内容的唯一Key 。 < request - variables - describer ref = "variablesDescriber" > < / r e q u e s t - v a r i a b l e s - d e s c r i b e r > 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr v - show = "!vIsReverse" >
< td colspan = "2" > < more - options - indicator @ change = "changeOptionsVisible" > < / m o r e - o p t i o n s - i n d i c a t o r > < / t d >
< / t r >
2021-12-08 10:03:27 +08:00
< tr v - show = "moreOptionsVisible && !vIsReverse" >
2021-12-08 19:13:54 +08:00
< td > 请求方法限制 < / t d >
2021-12-08 10:03:27 +08:00
< td >
< values - box size = "5" maxlength = "10" : values = "ref.methods" @ change = "changeMethods" > < / v a l u e s - b o x >
< p class = "comment" > 允许请求的缓存方法 , 默认支持所有的请求方法 。 < / p >
< / t d >
< / t r >
2021-12-08 19:13:54 +08:00
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 客户端过期时间 < em > ( Expires ) < / e m > < / t d >
< td >
< http - expires - time - config - box : v - expires - time = "ref.expiresTime" @ change = "changeExpiresTime" > < / h t t p - e x p i r e s - t i m e - c o n f i g - b o x >
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 可缓存的最大内容尺寸 < / t d >
< td >
< size - capacity - box : v - value = "ref.maxSize" @ change = "changeMaxSize" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > 内容尺寸如果高于此值则不缓存 。 < / p >
< / t d >
< / t r >
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 可缓存的最小内容尺寸 < / t d >
< td >
< size - capacity - box : v - value = "ref.minSize" @ change = "changeMinSize" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > 内容尺寸如果低于此值则不缓存 。 < / p >
< / t d >
< / t r >
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 支持分片内容 < / t d >
< td >
< checkbox name = "allowChunkedEncoding" value = "1" v - model = "ref.allowChunkedEncoding" > < / c h e c k b o x >
2022-03-03 19:32:11 +08:00
< p class = "comment" > 选中后 , Gzip等压缩后的Chunked内容可以直接缓存 , 无需检查内容长度 。 < / p >
< / t d >
< / t r >
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 支持缓存区间内容 < / t d >
< td >
< checkbox name = "allowPartialContent" value = "1" v - model = "ref.allowPartialContent" > < / c h e c k b o x >
< p class = "comment" > 选中后 , 支持缓存源站返回的某个区间的内容 , 该内容通过 < code - label > 206 Partial Content < / c o d e - l a b e l > 状 态 码 返 回 。 此 功 能 目 前 为 < c o d e - l a b e l > 试 验 性 质 < / c o d e - l a b e l > 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 状态码列表 < / t d >
< td >
< values - box name = "statusList" size = "3" maxlength = "3" : values = "ref.status" @ change = "changeStatusList" > < / v a l u e s - b o x >
< p class = "comment" > 允许缓存的HTTP状态码列表 。 < / p >
< / t d >
< / t r >
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 跳过的Cache - Control值 < / t d >
< td >
< values - box name = "skipResponseCacheControlValues" size = "10" maxlength = "100" : values = "ref.skipCacheControlValues" > < / v a l u e s - b o x >
< p class = "comment" > 当响应的Cache - Control为这些值时不缓存响应内容 , 而且不区分大小写 。 < / p >
< / t d >
< / t r >
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 跳过Set - Cookie < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" value = "1" v - model = "ref.skipSetCookie" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 选中后 , 当响应的Header中有Set - Cookie时不缓存响应内容 。 < / p >
< / t d >
< / t r >
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 支持请求no - cache刷新 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" name = "enableRequestCachePragma" value = "1" v - model = "ref.enableRequestCachePragma" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 选中后 , 当请求的Header中含有Pragma : no - cache或Cache - Control : no - cache时 , 会跳过缓存直接读取源内容 。 < / p >
< / t d >
< / t r >
2022-08-08 16:26:12 +08:00
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 允许If - None - Match回源 < / t d >
< td >
< checkbox v - model = "ref.enableIfNoneMatch" > < / c h e c k b o x >
< p class = "comment" > 特殊情况下才需要开启 , 可能会降低缓存命中率 。 < / p >
< / t d >
< / t r >
< tr v - show = "moreOptionsVisible && !vIsReverse" >
< td > 允许If - Modified - Since回源 < / t d >
< td >
< checkbox v - model = "ref.enableIfModifiedSince" > < / c h e c k b o x >
< p class = "comment" > 特殊情况下才需要开启 , 可能会降低缓存命中率 。 < / p >
< / t d >
< / t r >
2022-04-08 21:24:54 +08:00
< / t b o d y > ` } ) , V u e . c o m p o n e n t ( " h t t p - r e q u e s t - l i m i t - c o n f i g - b o x " , { p r o p s : [ " v - r e q u e s t - l i m i t - c o n f i g " , " v - i s - g r o u p " , " v - i s - l o c a t i o n " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R e q u e s t L i m i t C o n f i g ; r e t u r n { c o n f i g : e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 , m a x C o n n s : 0 , m a x C o n n s P e r I P : 0 , m a x B o d y S i z e : { c o u n t : - 1 , u n i t : " k b " } , o u t B a n d w i d t h P e r C o n n : { c o u n t : - 1 , u n i t : " k b " } } : e , m a x C o n n s : e . m a x C o n n s , m a x C o n n s P e r I P : e . m a x C o n n s P e r I P } } , w a t c h : { m a x C o n n s : f u n c t i o n ( e ) { e = p a r s e I n t ( e , 1 0 ) ; i s N a N ( e ) ? t h i s . c o n f i g . m a x C o n n s = 0 : t h i s . c o n f i g . m a x C o n n s = e < 0 ? 0 : e } , m a x C o n n s P e r I P : f u n c t i o n ( e ) { e = p a r s e I n t ( e , 1 0 ) ; i s N a N ( e ) ? t h i s . c o n f i g . m a x C o n n s P e r I P = 0 : t h i s . c o n f i g . m a x C o n n s P e r I P = e < 0 ? 0 : e } } , m e t h o d s : { i s O n : f u n c t i o n ( ) { r e t u r n ( ! t h i s . v I s L o c a t i o n & & ! t h i s . v I s G r o u p | | t h i s . c o n f i g . i s P r i o r ) & & t h i s . c o n f i g . i s O n } } , t e m p l a t e : ` < d i v >
2021-12-12 11:46:09 +08:00
< input type = "hidden" name = "requestLimitJSON" : value = "JSON.stringify(config)" / >
< table class = "ui table selectable definition" >
2021-12-12 17:14:46 +08:00
< prior - checkbox : v - config = "config" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || config.isPrior" >
2021-12-12 11:46:09 +08:00
< tr >
2022-08-08 16:26:12 +08:00
< td class = "title" > 启用 < / t d >
2021-12-12 11:46:09 +08:00
< td >
< checkbox v - model = "config.isOn" > < / c h e c k b o x >
< / t d >
< / t r >
< / t b o d y >
2021-12-12 17:14:46 +08:00
< tbody v - show = "isOn()" >
2021-12-12 11:46:09 +08:00
< tr >
< td > 最大并发连接数 < / t d >
< td >
< input type = "text" maxlength = "6" v - model = "maxConns" / >
2022-08-08 16:26:12 +08:00
< p class = "comment" > 当前服务最大并发连接数 , 超出此限制则响应用户 < code - label > 429 < / c o d e - l a b e l > 代 码 。 为 0 表 示 不 限 制 。 < / p >
2021-12-12 11:46:09 +08:00
< / t d >
< / t r >
< tr >
< td > 单IP最大并发连接数 < / t d >
< td >
< input type = "text" maxlength = "6" v - model = "maxConnsPerIP" / >
2022-08-08 16:26:12 +08:00
< p class = "comment" > 单IP最大连接数 , 统计单个IP总连接数时不区分服务 , 超出此限制则响应用户 < code - label > 429 < / c o d e - l a b e l > 代 码 。 为 0 表 示 不 限 制 。 < / p >
2021-12-12 11:46:09 +08:00
< / t d >
< / t r >
< tr >
< td > 单连接带宽限制 < / t d >
< td >
< size - capacity - box : v - value = "config.outBandwidthPerConn" : v - supported - units = "['byte', 'kb', 'mb']" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > 客户端单个请求每秒可以读取的下行流量 。 < / p >
< / t d >
< / t r >
< tr >
< td > 单请求最大尺寸 < / t d >
< td >
< size - capacity - box : v - value = "config.maxBodySize" : v - supported - units = "['byte', 'kb', 'mb', 'gb']" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > 单个请求能发送的最大内容尺寸 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - h e a d e r - r e p l a c e - v a l u e s " , { p r o p s : [ " v - r e p l a c e - v a l u e s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R e p l a c e V a l u e s ; r e t u r n { v a l u e s : e = n u l l = = e ? [ ] : e , i s A d d i n g : ! 1 , a d d i n g V a l u e : { p a t t e r n : " " , r e p l a c e m e n t : " " , i s C a s e I n s e n s i t i v e : ! 1 , i s R e g e x p : ! 1 } } } , m e t h o d s : { a d d : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 0 ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . p a t t e r n . f o c u s ( ) } ) } , r e m o v e : f u n c t i o n ( e ) { t h i s . v a l u e s . $ r e m o v e ( e ) } , c o n f i r m : f u n c t i o n ( ) { l e t e = t h i s ; 0 = = t h i s . a d d i n g V a l u e . p a t t e r n . l e n g t h ? t e a w e b . w a r n ( " 替 换 前 内 容 不 能 为 空 " , f u n c t i o n ( ) { e . $ r e f s . p a t t e r n . f o c u s ( ) } ) : ( t h i s . v a l u e s . p u s h ( t h i s . a d d i n g V a l u e ) , t h i s . c a n c e l ( ) ) } , c a n c e l : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 , t h i s . a d d i n g V a l u e = { p a t t e r n : " " , r e p l a c e m e n t : " " , i s C a s e I n s e n s i t i v e : ! 1 , i s R e g e x p : ! 1 } } } , t e m p l a t e : ` < d i v >
2021-12-15 09:56:18 +08:00
< input type = "hidden" name = "replaceValuesJSON" : value = "JSON.stringify(values)" / >
< div >
< div v - for = "(value, index) in values" class = "ui label small" style = "margin-bottom: 0.5em" >
< var > { { value . pattern } } < /var><sup v-if="value.isCaseInsensitive" title="不区分大小写"><i class="icon info tiny"></i > < / s u p > = & g t ; < v a r v - i f = " v a l u e . r e p l a c e m e n t . l e n g t h > 0 " > { { v a l u e . r e p l a c e m e n t } } < / v a r > < v a r v - e l s e > < s p a n c l a s s = " s m a l l g r e y " > [ 空 ] < / s p a n > < / v a r >
< a href = "" @ click . prevent = "remove(index)" title = "删除" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< div v - if = "isAdding" >
< table class = "ui table" >
< tr >
< td class = "title" > 替换前内容 * < / t d >
< td > < input type = "text" v - model = "addingValue.pattern" placeholder = "替换前内容" ref = "pattern" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / > < / t d >
< / t r >
< tr >
< td > 替换后内容 < / t d >
< td > < input type = "text" v - model = "addingValue.replacement" placeholder = "替换后内容" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / > < / t d >
< / t r >
< tr >
< td > 是否忽略大小写 < / t d >
< td >
< checkbox v - model = "addingValue.isCaseInsensitive" > < / c h e c k b o x >
< / t d >
< / t r >
< / t a b l e >
< div >
< button type = "button" class = "ui button tiny" @ click . prevent = "confirm" > 确定 < / b u t t o n > & n b s p ;
< a href = "" title = "取消" @ click . prevent = "cancel" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< div v - if = "!isAdding" >
< button type = "button" class = "ui button tiny" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-05-05 11:25:23 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - r e q u e s t - c o n d s - v i e w " , { p r o p s : [ " v - c o n d s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C o n d s , t = ( n u l l = = e & & ( e = { i s O n : ! 0 , c o n n e c t o r : " o r " , g r o u p s : [ ] } ) , t h i s ) ; r e t u r n e . g r o u p s . f o r E a c h ( f u n c t i o n ( e ) { e . c o n d s . f o r E a c h ( f u n c t i o n ( e ) { e . t y p e N a m e = t . t y p e N a m e ( e ) } ) } ) , { i n i t C o n d s : e } } , c o m p u t e d : { c o n d s : f u n c t i o n ( ) { r e t u r n t h i s . i n i t C o n d s } } , m e t h o d s : { t y p e N a m e : f u n c t i o n ( i ) { v a r e = w i n d o w . R E Q U E S T _ C O N D _ C O M P O N E N T S . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . t y p e = = i . t y p e } ) ; r e t u r n n u l l ! = e ? e . n a m e : i . p a r a m + " " + i . o p e r a t o r } , u p d a t e C o n d s : f u n c t i o n ( e ) { t h i s . i n i t C o n d s = e } , n o t i f y C h a n g e : f u n c t i o n ( ) { l e t t = t h i s ; t h i s . i n i t C o n d s . g r o u p s . f o r E a c h ( f u n c t i o n ( e ) { e . c o n d s . f o r E a c h ( f u n c t i o n ( e ) { e . t y p e N a m e = t . t y p e N a m e ( e ) } ) } ) , t h i s . $ f o r c e U p d a t e ( ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div v - if = "conds.groups.length > 0" >
< div v - for = "(group, groupIndex) in conds.groups" >
< var v - for = "(cond, index) in group.conds" style = "font-style: normal;display: inline-block; margin-bottom:0.5em" >
< span class = "ui label small basic" style = "line-height: 1.5" >
< var v - if = "cond.type.length == 0 || cond.type == 'params'" style = "font-style: normal" > { { cond . param } } < var > { { cond . operator } } < / v a r > < / v a r >
< var v - if = "cond.type.length > 0 && cond.type != 'params'" style = "font-style: normal" > { { cond . typeName } } : < / v a r >
{ { cond . value } }
2021-12-12 17:14:46 +08:00
< sup v - if = "cond.isCaseInsensitive" title = "不区分大小写" > < i class = "icon info small" > < / i > < / s u p >
2021-11-22 12:08:53 +08:00
< / s p a n >
< var v - if = "index < group.conds.length - 1" > { { group . connector } } & nbsp ; < / v a r >
< / v a r >
< div class = "ui divider" v - if = "groupIndex != conds.groups.length - 1" style = "margin-top:0.3em;margin-bottom:0.5em" > < / d i v >
< div >
< span class = "ui label tiny olive" v - if = "group.description != null && group.description.length > 0" > { { group . description } } < / s p a n >
< / d i v >
< / d i v >
< / d i v >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - f i r e w a l l - c o n f i g - b o x " , { p r o p s : [ " v - f i r e w a l l - c o n f i g " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " , " v - f i r e w a l l - p o l i c y " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v F i r e w a l l C o n f i g ; r e t u r n { f i r e w a l l : e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 , f i r e w a l l P o l i c y I d : 0 } : e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "firewallJSON" : value = "JSON.stringify(firewall)" / >
< table class = "ui table selectable definition" >
< prior - checkbox : v - config = "firewall" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || firewall.isPrior" >
< tr v - show = "!vIsGroup" >
< td > WAF策略 < / t d >
< td >
< div v - if = "vFirewallPolicy != null" > { { vFirewallPolicy . name } } < span v - if = "vFirewallPolicy.modeInfo != null" > & nbsp ; < span : class = "{green: vFirewallPolicy.modeInfo.code == 'defend', blue: vFirewallPolicy.modeInfo.code == 'observe', grey: vFirewallPolicy.modeInfo.code == 'bypass'}" > [ { { vFirewallPolicy . modeInfo . name } } ] < / s p a n > & n b s p ; < / s p a n > < l i n k - i c o n : h r e f = " ' / s e r v e r s / c o m p o n e n t s / w a f / p o l i c y ? f i r e w a l l P o l i c y I d = ' + v F i r e w a l l P o l i c y . i d " > < / l i n k - i c o n >
< p class = "comment" > 使用当前服务所在集群的设置 。 < / p >
< / d i v >
< span v - else class = "red" > 当前集群没有设置WAF策略 , 当前配置无法生效 。 < / s p a n >
< / t d >
< / t r >
< tr >
2022-03-16 22:48:04 +08:00
< td class = "title" > 启用WAF < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "firewall.isOn" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 启用WAF之后 , 各项WAF设置才会生效 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-24 15:24:15 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m e t r i c - c h a r t " , { p r o p s : [ " v - c h a r t " , " v - s t a t s " , " v - i t e m " ] , m o u n t e d : f u n c t i o n ( ) { t h i s . l o a d ( ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v S t a t s ; v a r t ; 0 < ( e = n u l l = = e ? [ ] : e ) . l e n g t h & & ( ( t = e . $ s u m ( f u n c t i o n ( e , t ) { r e t u r n t . v a l u e } ) ) < e [ 0 ] . t o t a l & & " p i e " = = t h i s . v C h a r t . t y p e & & e . p u s h ( { k e y s : [ " 其 他 " ] , v a l u e : e [ 0 ] . t o t a l - t , t o t a l : e [ 0 ] . t o t a l , t i m e : e [ 0 ] . t i m e } ) ) , ( e = 0 < t h i s . v C h a r t . m a x I t e m s ? e . s l i c e ( 0 , t h i s . v C h a r t . m a x I t e m s ) : e . s l i c e ( 0 , 1 0 ) ) . $ r s o r t ( f u n c t i o n ( e , t ) { r e t u r n e . v a l u e - t . v a l u e } ) ; l e t i = 1 0 0 ; r e t u r n 0 < t h i s . v C h a r t . w i d t h D i v & & ( i = 1 0 0 / t h i s . v C h a r t . w i d t h D i v ) , { c h a r t : t h i s . v C h a r t , s t a t s : e , i t e m : t h i s . v I t e m , w i d t h : i + " % " , c h a r t I d : " m e t r i c - c h a r t - " + t h i s . v C h a r t . i d , v a l u e T y p e N a m e : n u l l ! = t h i s . v I t e m & & n u l l ! = t h i s . v I t e m . v a l u e T y p e N a m e & & 0 < t h i s . v I t e m . v a l u e T y p e N a m e . l e n g t h ? t h i s . v I t e m . v a l u e T y p e N a m e : " " } } , m e t h o d s : { l o a d : f u n c t i o n ( ) { v a r e = d o c u m e n t . g e t E l e m e n t B y I d ( t h i s . c h a r t I d ) ; n u l l = = e | | 0 = = e . o f f s e t W i d t h | | 0 = = e . o f f s e t H e i g h t ? s e t T i m e o u t ( t h i s . l o a d , 1 0 0 ) : t h i s . r e n d e r ( e ) } , r e n d e r : f u n c t i o n ( e ) { l e t t = e c h a r t s . i n i t ( e ) ; s w i t c h ( w i n d o w . a d d E v e n t L i s t e n e r ( " r e s i z e " , f u n c t i o n ( ) { t . r e s i z e ( ) } ) , t h i s . c h a r t . t y p e ) { c a s e " p i e " : t h i s . r e n d e r P i e ( t ) ; b r e a k ; c a s e " b a r " : t h i s . r e n d e r B a r ( t ) ; b r e a k ; c a s e " t i m e B a r " : t h i s . r e n d e r T i m e B a r ( t ) ; b r e a k ; c a s e " t i m e L i n e " : t h i s . r e n d e r T i m e L i n e ( t ) ; b r e a k ; c a s e " t a b l e " : t h i s . r e n d e r T a b l e ( t ) } } , r e n d e r P i e : f u n c t i o n ( e ) { v a r t = t h i s . s t a t s . m a p ( f u n c t i o n ( e ) { r e t u r n { n a m e : e . k e y s [ 0 ] , v a l u e : e . v a l u e } } ) ; l e t s = t h i s ; e . s e t O p t i o n ( { t o o l t i p : { s h o w : ! 0 , t r i g g e r : " i t e m " , f o r m a t t e r : f u n c t i o n ( e ) { e = s . s t a t s [ e . d a t a I n d e x ] ; l e t t = 0 , i = ( 0 < e . t o t a l & & ( t = M a t h . r o u n d ( 1 0 0 * e . v a l u e / e . t o t a l * 1 0 0 ) / 1 0 0 ) , e . v a l u e ) ; s w i t c h ( s . i t e m . v a l u e T y p e ) { c a s e " b y t e " : i = t e a w e b . f o r m a t B y t e s ( i ) ; b r e a k ; c a s e " c o u n t " : i = t e a w e b . f o r m a t N u m b e r ( i ) } r e t u r n e . k e y s [ 0 ] + " < b r / > " + s . v a l u e T y p e N a m e + " : " + i + " < b r / > 占 比 : " + t + " % " } } , s e r i e s : [ { n a m e : n a m e , t y p e : " p i e " , d a t a : t , a r e a S t y l e : { } , c o l o r : [ " # 9 D D 3 E 8 " , " # B 2 D B 9 E " , " # F 3 9 4 9 4 " , " # F B D 8 8 A " , " # 8 7 9 B D 7 " ] } ] } ) } , r e n d e r T i m e B a r : f u n c t i o n ( e ) { t h i s . s t a t s . $ s o r t ( f u n c t i o n ( e , t ) { r e t u r n e . t i m e < t . t i m e ? - 1 : 1 } ) ; l e t t = t h i s . s t a t s . m a p ( f u n c t i o n ( e ) { r e t u r n e . v a l u e } ) , i = { u n i t : " " , d i v i d e r : 1 } ; s w i t c h ( t h i s . i t e m . v a l u e T y p e ) { c a s e " c o u n t " : i = t e a w e b . c o u n t A x i s ( t , f u n c t i o n ( e ) { r e t u r n e } ) ; b r e a k ; c a s e " b y t e " : i = t e a w e b . b y t e s A x i s ( t , f u n c t i o n ( e ) { r e t u r n e } ) } l e t s = t h i s ; e . s e t O p t i o n ( { x A x i s : { d a t a : t h i s . s t a t s . m a p ( f u n c t i o n ( e ) { r e t u r n s . f o r m a t T i m e ( e . t i m e ) } ) } , y A x i s : { a x i s L a b e l : { f o r m a t t e r : f u n c t i o n ( e ) { r e t u r n e + i . u n i t } } } , t o o l t i p : { s h o w : ! 0 , t r i g g e r : " i t e m " , f o r m a t t e r : f u n c t i o n ( e ) { e = s . s t a t s [ e . d a t a I n d e x ] ; l e t t = e . v a l u e ; r e t u r n " b y t e " = = = s . i t e m . v a l u e T y p e & & ( t = t e a w e b . f o r m a t B y t e s ( t ) ) , s . f o r m a t T i m e ( e . t i m e ) + " : " + t } } , g r i d : { l e f t : 5 0 , t o p : 1 0 , r i g h t : 2 0 , b o t t o m : 2 5 } , s e r i e s : [ { n a m e : n a m e , t y p e : " b a r " , d a t a : t . m a p ( f u n c t i o n ( e ) { r e t u r n e / i . d i v i d e r } ) , i t e m S t y l e : { c o l o r : t e a w e b . D e f a u l t C h a r t C o l o r } , a r e a S t y l e : { } , b a r W i d t h : " 2 0 e m " } ] } ) } , r e n d e r T i m e L i n e : f u n c t i o n ( e ) { t h i s . s t a t s . $ s o r t ( f u n c t i o n ( e , t ) { r e t u r n e . t i m e < t . t i m e ? - 1 : 1 } ) ; l e t t = t h i s . s t a t s . m a p ( f u n c t i o n ( e ) { r e t u r n e . v a l u e } ) , i = { u n i t : " " , d i v i d e r : 1 } ; s w i t c h ( t h i s . i t e m . v a l u e T y p e ) { c a s e " c o u n t " : i = t e a w e b . c o u n t A x i s ( t , f u n c t i o n ( e ) { r e t u r n e } ) ; b r e a k ; c a s e " b y t e " : i = t e a w e b . b y t e s A x i s ( t , f u n c t i o n ( e ) { r e t u r n e } ) } l e t s = t h i s ; e . s e t O p t i o n ( { x A x i s : { d a t a : t h i s . s t a t s . m a p ( f u n c t i o n ( e ) { r e t u r n s . f o r m a t T i m e ( e . t i m e ) } ) } , y A x i s : { a x i s L a b e l : { f o r m a t t e r : f u n c t i o n ( e ) { r e t u r n e + i . u n i t } } } , t o o l t i p : { s h o w : ! 0 , t r i g g e r : " i t e m " , f o r m a t t e r : f u n c t i o n ( e ) { e = s . s t a t s [ e . d a t a I n d e x ] ; l e t t = e . v a l u e ; r e t u r n " b y t e " = = = s . i t e m . v a l u e T y p e & & ( t = t e a w e b . f o r m a t B y t e s ( t ) ) , s . f o r m a t T i m e ( e . t i m e ) + " : " + t } } , g r i d : { l e f t : 5 0 , t o p : 1 0 , r i g h t : 2 0 , b o t t o m : 2 5 } , s e r i e s : [ { n a m e : n a m e , t y p e : " l i n e " , d a t a : t . m a p ( f u n c t i o n ( e ) { r e t u r n e / i . d i v i d e r } ) , i t e m S t y l e : { c o l o r : t e a w e b . D e f a u l t C h a r t C o l o r } , a r e a S t y l e : { } } ] } ) } , r e n d e r B a r : f u n c t i o n ( e ) { l e t t = t h i s . s t a t s . m a p ( f u n c t i o n ( e ) { r e t u r n e . v a l u e } ) , i = { u n i t : " " , d i v i d e r : 1 } ; s w i t c h ( t h i s . i t e m . v a l u e T y p e ) { c a s e " c o u n t " : i = t e a w e b . c o u n t A x i s ( t , f u n c t i o n ( e ) { r e t u r n e } ) ; b r e a k ; c a s e " b y t e " : i = t e a w e b . b y t e s A x i s ( t , f u n c t i o n ( e ) { r e t u r n e } ) } l e t s = 2 4 , n = 0 ; v a r o = t e a w e b . x R o t a t i o n ( e , t h i s . s t a t s . m a p ( f u n c t i o n ( e ) { r e t u r n e . k e y s [ 0 ] } ) ) ; n u l l ! = o & & ( s = o [ 0 ] , n = o [ 1 ] ) ; l e t a = t h i s ; i f ( e . s e t O p t i o n ( { x A x i s : { d a t a : t h i s . s t a t s . m a p ( f u n c t i o n ( e ) { r e t u r n e . k e y s [ 0 ] } ) , a x i s L a b e l : { i n t e r v a l : 0 , r o t a t e : n } } , t o o l t i p : { s h o w : ! 0 , t r i g g e r : " i t e m " , f o r m a t t e r : f u n c t i o n ( e ) { e = a . s t a t s [ e . d a t a I n d e x ] ; l e t t = 0 , i = ( 0 < e . t o t a l & & ( t = M a t h . r o u n d ( 1 0 0 * e . v a l u e / e . t o t a l * 1 0 0 ) / 1 0 0 ) , e . v a l u e ) ; s w i t c h ( a . i t e m . v a l u e T y p e ) { c a s e " b y t e " : i = t e a w e b . f o r m a t B y t e s ( i ) ; b r e a k ;
2021-11-22 12:08:53 +08:00
< thead >
< tr >
< th > 对象 < / t h >
< th > 数值 < / t h >
< th > 占比 < / t h >
< / t r >
2022-04-08 21:24:54 +08:00
< / t h e a d > ` , n = t h i s ; t h i s . s t a t s . f o r E a c h ( f u n c t i o n ( e ) { l e t t = e . v a l u e , i = ( " b y t e " = = = n . i t e m . v a l u e T y p e & & ( t = t e a w e b . f o r m a t B y t e s ( t ) ) , s + = " < t r > < t d > " + e . k e y s [ 0 ] + " < / t d > < t d > " + t + " < / t d > " , 0 ) ; 0 < e . t o t a l & & ( i = M a t h . r o u n d ( 1 0 0 * e . v a l u e / e . t o t a l * 1 0 0 ) / 1 0 0 ) , s = s + ( ' < t d > < d i v c l a s s = " u i p r o g r e s s b l u e " > < d i v c l a s s = " b a r " s t y l e = " m i n - w i d t h : 0 ; h e i g h t : 4 p x ; w i d t h : ' + i + ' % " > < / d i v > < / d i v > ' + i ) + " % < / t d > < / t r > " } ) , s + = " < / t a b l e > " , d o c u m e n t . g e t E l e m e n t B y I d ( t h i s . c h a r t I d ) . i n n e r H T M L = s } , f o r m a t T i m e : f u n c t i o n ( e ) { i f ( n u l l = = e ) r e t u r n " " ; s w i t c h ( t h i s . i t e m . p e r i o d U n i t ) { c a s e " m o n t h " : c a s e " w e e k " : r e t u r n e . s u b s t r i n g ( 0 , 4 ) + " - " + e . s u b s t r i n g ( 4 , 6 ) ; c a s e " d a y " : r e t u r n e . s u b s t r i n g ( 0 , 4 ) + " - " + e . s u b s t r i n g ( 4 , 6 ) + " - " + e . s u b s t r i n g ( 6 , 8 ) ; c a s e " h o u r " : r e t u r n e . s u b s t r i n g ( 0 , 4 ) + " - " + e . s u b s t r i n g ( 4 , 6 ) + " - " + e . s u b s t r i n g ( 6 , 8 ) + " " + e . s u b s t r i n g ( 8 , 1 0 ) ; c a s e " m i n u t e " : r e t u r n e . s u b s t r i n g ( 0 , 4 ) + " - " + e . s u b s t r i n g ( 4 , 6 ) + " - " + e . s u b s t r i n g ( 6 , 8 ) + " " + e . s u b s t r i n g ( 8 , 1 0 ) + " : " + e . s u b s t r i n g ( 1 0 , 1 2 ) } r e t u r n e } } , t e m p l a t e : ` < d i v s t y l e = " f l o a t : l e f t " : s t y l e = " { ' w i d t h ' : w i d t h } " >
2021-11-22 12:08:53 +08:00
< h4 > { { chart . name } } < span > ( { { valueTypeName } } ) < / s p a n > < / h 4 >
< div class = "ui divider" > < / d i v >
2021-12-05 20:59:07 +08:00
< div style = "height: 14em; padding-bottom: 1em; " : id = "chartId" : class = "{'scroll-box': chart.type == 'table'}" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m e t r i c - b o a r d " , { t e m p l a t e : " < d i v > < s l o t > < / s l o t > < / d i v > " } ) , V u e . c o m p o n e n t ( " h t t p - c a c h e - c o n f i g - b o x " , { p r o p s : [ " v - c a c h e - c o n f i g " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " , " v - c a c h e - p o l i c y " , " v - w e b - i d " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C a c h e C o n f i g ; r e t u r n n u l l = = ( e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 , a d d S t a t u s H e a d e r : ! 0 , a d d A g e H e a d e r : ! 1 , e n a b l e C a c h e C o n t r o l M a x A g e : ! 1 , c a c h e R e f s : [ ] , p u r g e I s O n : ! 1 , p u r g e K e y : " " , d i s a b l e P o l i c y R e f s : ! 1 } : e ) . c a c h e R e f s & & ( e . c a c h e R e f s = [ ] ) , { c a c h e C o n f i g : e , m o r e O p t i o n s V i s i b l e : ! 1 , e n a b l e P o l i c y R e f s : ! e . d i s a b l e P o l i c y R e f s } } , w a t c h : { e n a b l e P o l i c y R e f s : f u n c t i o n ( e ) { t h i s . c a c h e C o n f i g . d i s a b l e P o l i c y R e f s = ! e } } , m e t h o d s : { i s O n : f u n c t i o n ( ) { r e t u r n ( ! t h i s . v I s L o c a t i o n & & ! t h i s . v I s G r o u p | | t h i s . c a c h e C o n f i g . i s P r i o r ) & & t h i s . c a c h e C o n f i g . i s O n } , i s P l u s : f u n c t i o n ( ) { r e t u r n T e a . V u e . t e a I s P l u s } , g e n e r a t e P u r g e K e y : f u n c t i o n ( ) { l e t e = M a t h . r a n d o m ( ) . t o S t r i n g ( ) + M a t h . r a n d o m ( ) . t o S t r i n g ( ) , t = e . r e p l a c e ( / 0 \ . / g , " " ) . r e p l a c e ( / \ . / g , " " ) , i = " " ; f o r ( l e t e = 0 ; e < t . l e n g t h ; e + + ) i + = S t r i n g . f r o m C h a r C o d e ( p a r s e I n t ( t . s u b s t r i n g ( e , e + 1 ) ) + ( M a t h . r a n d o m ( ) < . 5 ? " a " : " A " ) . c h a r C o d e A t ( 0 ) ) ; t h i s . c a c h e C o n f i g . p u r g e K e y = i } , s h o w M o r e O p t i o n s : f u n c t i o n ( ) { t h i s . m o r e O p t i o n s V i s i b l e = ! t h i s . m o r e O p t i o n s V i s i b l e } , c h a n g e S t a l e : f u n c t i o n ( e ) { t h i s . c a c h e C o n f i g . s t a l e = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "cacheJSON" : value = "JSON.stringify(cacheConfig)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "cacheConfig" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || cacheConfig.isPrior" >
< tr v - show = "!vIsGroup" >
< td > 缓存策略 < / t d >
< td >
< div v - if = "vCachePolicy != null" > { { vCachePolicy . name } } < link - icon : href = "'/servers/components/cache/policy?cachePolicyId=' + vCachePolicy.id" > < / l i n k - i c o n >
< p class = "comment" > 使用当前服务所在集群的设置 。 < / p >
< / d i v >
< span v - else class = "red" > 当前集群没有设置缓存策略 , 当前配置无法生效 。 < / s p a n >
< / t d >
< / t r >
< tr >
2022-03-16 22:48:04 +08:00
< td class = "title" > 启用缓存 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "cacheConfig.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "isOn()" >
< tr >
< td colspan = "2" >
< a href = "" @ click . prevent = "showMoreOptions" > < span v - if = "moreOptionsVisible" > 收起选项 < / s p a n > < s p a n v - e l s e > 更 多 选 项 < / s p a n > < i c l a s s = " i c o n a n g l e " : c l a s s = " { u p : m o r e O p t i o n s V i s i b l e , d o w n : ! m o r e O p t i o n s V i s i b l e } " > < / i > < / a >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "isOn() && moreOptionsVisible" >
2022-03-03 19:32:11 +08:00
< tr >
< td > 使用默认缓存条件 < / t d >
< td >
< checkbox v - model = "enablePolicyRefs" > < / c h e c k b o x >
< p class = "comment" > 选中后使用系统中已经定义的默认缓存条件 。 < / p >
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
< tr >
2021-12-02 09:54:31 +08:00
< td > 添加X - Cache Header < / t d >
2021-11-22 12:08:53 +08:00
< td >
< checkbox v - model = "cacheConfig.addStatusHeader" > < / c h e c k b o x >
2021-12-02 09:54:31 +08:00
< p class = "comment" > 选中后自动在响应Header中增加 < code - label > X - Cache : BYPASS | MISS | HIT | PURGE < / c o d e - l a b e l > 。 < / p >
< / t d >
< / t r >
< tr >
< td > 添加Age Header < / t d >
< td >
< checkbox v - model = "cacheConfig.addAgeHeader" > < / c h e c k b o x >
2022-03-21 08:23:34 +08:00
< p class = "comment" > 选中后自动在响应Header中增加 < code - label > Age : [ 存活时间秒数 ] < / c o d e - l a b e l > 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
2021-12-02 10:18:22 +08:00
< tr >
< td > 支持源站控制有效时间 < / t d >
< td >
< checkbox v - model = "cacheConfig.enableCacheControlMaxAge" > < / c h e c k b o x >
< p class = "comment" > 选中后表示支持源站在Header中设置的 < code - label > Cache - Control : max - age = [ 有效时间秒数 ] < / c o d e - l a b e l > 。 < / p >
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
< tr >
2021-12-17 14:17:48 +08:00
< td class = "color-border" > 允许PURGE < / t d >
2021-11-22 12:08:53 +08:00
< td >
< checkbox v - model = "cacheConfig.purgeIsOn" > < / c h e c k b o x >
< p class = "comment" > 允许使用PURGE方法清除某个URL缓存 。 < / p >
< / t d >
< / t r >
< tr v - show = "cacheConfig.purgeIsOn" >
2021-12-17 14:17:48 +08:00
< td class = "color-border" > PURGE Key * < / t d >
2021-11-22 12:08:53 +08:00
< td >
< input type = "text" maxlength = "200" v - model = "cacheConfig.purgeKey" / >
2022-06-05 17:12:54 +08:00
< p class = "comment" > < a href = "" @ click . prevent = "generatePurgeKey" > [ 随机生成 ] < / a > 。 需 要 在 P U R G E 方 法 调 用 时 加 入 < c o d e - l a b e l > X - E d g e - P u r g e - K e y : { { c a c h e C o n f i g . p u r g e K e y } } < / c o d e - l a b e l > H e a d e r 。 只 能 包 含 字 符 、 数 字 、 下 划 线 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
2021-12-17 14:17:48 +08:00
< div v - if = "isOn() && moreOptionsVisible && isPlus()" >
< h4 > 过时缓存策略 < / h 4 >
< http - cache - stale - config : v - cache - stale - config = "cacheConfig.stale" @ change = "changeStale" > < / h t t p - c a c h e - s t a l e - c o n f i g >
< / d i v >
< div v - show = "isOn()" style = "margin-top: 1em" >
2021-11-22 12:08:53 +08:00
< h4 > 缓存条件 < / h 4 >
2022-04-08 20:49:33 +08:00
< http - cache - refs - config - box : v - cache - config = "cacheConfig" : v - cache - refs = "cacheConfig.cacheRefs" : v - web - id = "vWebId" > < / h t t p - c a c h e - r e f s - c o n f i g - b o x >
2021-11-22 12:08:53 +08:00
< / d i v >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) ; l e t d e f a u l t G e n e r a l H e a d e r s = [ " C a c h e - C o n t r o l " , " C o n n e c t i o n " , " D a t e " , " P r a g m a " , " T r a i l e r " , " T r a n s f e r - E n c o d i n g " , " U p g r a d e " , " V i a " , " W a r n i n g " ] ; f u n c t i o n s o r t T a b l e ( n ) { l e t e = d o c u m e n t . c r e a t e E l e m e n t ( " s c r i p t " ) ; e . s e t A t t r i b u t e ( " s r c " , " / j s / s o r t a b l e . m i n . j s " ) , e . a d d E v e n t L i s t e n e r ( " l o a d " , f u n c t i o n ( ) { l e t s = d o c u m e n t . q u e r y S e l e c t o r ( " # s o r t a b l e - t a b l e " ) ; n u l l ! = s & & S o r t a b l e . c r e a t e ( s , { d r a g g a b l e : " t b o d y " , h a n d l e : " . i c o n . h a n d l e " , o n S t a r t : f u n c t i o n ( ) { } , o n U p d a t e : f u n c t i o n ( e ) { l e t t = s . q u e r y S e l e c t o r A l l ( " t b o d y " ) , i = [ ] ; t . f o r E a c h ( f u n c t i o n ( e ) { i . p u s h ( p a r s e I n t ( e . g e t A t t r i b u t e ( " v - i d " ) ) ) } ) , n ( i ) } } ) } ) , d o c u m e n t . h e a d . a p p e n d C h i l d ( e ) } f u n c t i o n s o r t L o a d ( e ) { l e t t = d o c u m e n t . c r e a t e E l e m e n t ( " s c r i p t " ) ; t . s e t A t t r i b u t e ( " s r c " , " / j s / s o r t a b l e . m i n . j s " ) , t . a d d E v e n t L i s t e n e r ( " l o a d " , f u n c t i o n ( ) { " f u n c t i o n " = = t y p e o f e & & e ( ) } ) , d o c u m e n t . h e a d . a p p e n d C h i l d ( t ) } f u n c t i o n e m i t C l i c k ( e , a r g u m e n t s ) { l e t t = [ " c l i c k " ] ; f o r ( l e t e = 0 ; e < a r g u m e n t s . l e n g t h ; e + + ) t . p u s h ( a r g u m e n t s [ e ] ) ; e . $ e m i t . a p p l y ( e , t ) } V u e . c o m p o n e n t ( " h t t p - c o n d - g e n e r a l - h e a d e r - l e n g t h " , { p r o p s : [ " v - c h e c k p o i n t " ] , d a t a : f u n c t i o n ( ) { l e t e = n u l l , t = n u l l ; v a r i ; n u l l ! = w i n d o w . p a r e n t . U P D A T I N G _ R U L E & & ( n u l l ! = ( i = w i n d o w . p a r e n t . U P D A T I N G _ R U L E . c h e c k p o i n t O p t i o n s ) . h e a d e r s & & A r r a y . $ i s A r r a y ( i . h e a d e r s ) & & ( e = i . h e a d e r s ) , n u l l ! = i . l e n g t h & & ( t = i . l e n g t h ) ) , n u l l = = e & & ( e = d e f a u l t G e n e r a l H e a d e r s ) , n u l l = = t & & ( t = 1 2 8 ) ; l e t s = t h i s ; r e t u r n s e t T i m e o u t ( f u n c t i o n ( ) { s . c h a n g e ( ) } , 1 0 0 ) , { h e a d e r s : e , l e n g t h : t } } , w a t c h : { l e n g t h : f u n c t i o n ( e ) { l e t t = p a r s e I n t ( e ) ; ( t = i s N a N ( t ) ? 0 : t ) < 0 & & ( t = 0 ) , t h i s . l e n g t h = t , t h i s . c h a n g e ( ) } } , m e t h o d s : { c h a n g e : f u n c t i o n ( ) { t h i s . v C h e c k p o i n t . o p t i o n s = [ { c o d e : " h e a d e r s " , v a l u e : t h i s . h e a d e r s } , { c o d e : " l e n g t h " , v a l u e : t h i s . l e n g t h } ] } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< table class = "ui table" >
< tr >
< td class = "title" > 通用Header列表 < / t d >
< td >
< values - box : values = "headers" : placeholder = "'Header'" @ change = "change" > < / v a l u e s - b o x >
< p class = "comment" > 需要检查的Header列表 。 < / p >
< / t d >
< / t r >
< tr >
< td > Header值超出长度 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" name = "" style = "width: 5em" v - model = "length" maxlength = "6" / >
< span class = "ui label" > 字节 < / s p a n >
< / d i v >
< p class = "comment" > 超出此长度认为匹配成功 , 0 表示不限制 。 < / p >
< / t d >
< / t r >
< / t a b l e >
2022-07-17 21:19:45 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - f i r e w a l l - c h e c k p o i n t - c c " , { p r o p s : [ " v - c h e c k p o i n t " ] , d a t a : f u n c t i o n ( ) { l e t e = [ ] , t = 6 0 , i = 1 e 3 , s = ! 1 , n = { } , o = ( n u l l = = ( n = n u l l ! = w i n d o w . p a r e n t . U P D A T I N G _ R U L E ? w i n d o w . p a r e n t . U P D A T I N G _ R U L E . c h e c k p o i n t O p t i o n s : n ) & & ( n = { } ) , 0 = = ( e = n u l l ! = n . k e y s ? n . k e y s : e ) . l e n g t h & & ( e = [ " $ { r e m o t e A d d r } " , " $ { r e q u e s t P a t h } " ] ) , n u l l ! = n . p e r i o d & & ( t = n . p e r i o d ) , n u l l ! = n . t h r e s h o l d & & ( i = n . t h r e s h o l d ) , n u l l ! = n . i g n o r e C o m m o n F i l e s & & " b o o l e a n " = = t y p e o f n . i g n o r e C o m m o n F i l e s & & ( s = n . i g n o r e C o m m o n F i l e s ) , t h i s ) ; r e t u r n s e t T i m e o u t ( f u n c t i o n ( ) { o . c h a n g e ( ) } , 1 0 0 ) , { k e y s : e , p e r i o d : t , t h r e s h o l d : i , i g n o r e C o m m o n F i l e s : s , o p t i o n s : { } , v a l u e : i } } , w a t c h : { p e r i o d : f u n c t i o n ( ) { t h i s . c h a n g e ( ) } , t h r e s h o l d : f u n c t i o n ( ) { t h i s . c h a n g e ( ) } , i g n o r e C o m m o n F i l e s : f u n c t i o n ( ) { t h i s . c h a n g e ( ) } } , m e t h o d s : { c h a n g e K e y s : f u n c t i o n ( e ) { t h i s . k e y s = e , t h i s . c h a n g e ( ) } , c h a n g e : f u n c t i o n ( ) { l e t e = p a r s e I n t ( t h i s . p e r i o d . t o S t r i n g ( ) ) , t = ( ( i s N a N ( e ) | | e < = 0 ) & & ( e = 6 0 ) , p a r s e I n t ( t h i s . t h r e s h o l d . t o S t r i n g ( ) ) ) , i = ( ( i s N a N ( t ) | | t < = 0 ) & & ( t = 1 e 3 ) , t h i s . v a l u e = t , t h i s . i g n o r e C o m m o n F i l e s ) ; " b o o l e a n " ! = t y p e o f i & & ( i = ! 1 ) , t h i s . v C h e c k p o i n t . o p t i o n s = [ { c o d e : " k e y s " , v a l u e : t h i s . k e y s } , { c o d e : " p e r i o d " , v a l u e : e } , { c o d e : " t h r e s h o l d " , v a l u e : t } , { c o d e : " i g n o r e C o m m o n F i l e s " , v a l u e : i } ] } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "operator" value = "gt" / >
< input type = "hidden" name = "value" : value = "value" / >
< table class = "ui table" >
< tr >
< td class = "title" > 统计对象组合 * < / t d >
< td >
< metric - keys - config - box : v - keys = "keys" @ change = "changeKeys" > < / m e t r i c - k e y s - c o n f i g - b o x >
< / t d >
< / t r >
< tr >
< td > 统计周期 * < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" v - model = "period" style = "width: 6em" maxlength = "8" / >
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
< / t d >
< / t r >
< tr >
< td > 阈值 * < / t d >
< td >
< input type = "text" v - model = "threshold" style = "width: 6em" maxlength = "8" / >
< / t d >
< / t r >
2022-07-17 21:19:45 +08:00
< tr >
< td > 忽略常见文件 < / t d >
< td >
< checkbox v - model = "ignoreCommonFiles" > < / c h e c k b o x >
2022-07-26 08:56:37 +08:00
< p class = "comment" > 忽略js 、 css 、 jpg等常见在网页里被引用的文件名 。 < / p >
2022-07-17 21:19:45 +08:00
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
< / t a b l e >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - f i r e w a l l - c h e c k p o i n t - r e f e r e r - b l o c k " , { p r o p s : [ " v - c h e c k p o i n t " ] , d a t a : f u n c t i o n ( ) { l e t e = ! 0 , t = ! 0 , i = [ ] , s = { } , n = ( " b o o l e a n " = = t y p e o f ( s = n u l l = = ( s = n u l l ! = w i n d o w . p a r e n t . U P D A T I N G _ R U L E ? w i n d o w . p a r e n t . U P D A T I N G _ R U L E . c h e c k p o i n t O p t i o n s : s ) ? { } : s ) . a l l o w E m p t y & & ( e = s . a l l o w E m p t y ) , " b o o l e a n " = = t y p e o f s . a l l o w S a m e D o m a i n & & ( t = s . a l l o w S a m e D o m a i n ) , n u l l ! = s . a l l o w D o m a i n s & & " o b j e c t " = = t y p e o f s . a l l o w D o m a i n s & & ( i = s . a l l o w D o m a i n s ) , t h i s ) ; r e t u r n s e t T i m e o u t ( f u n c t i o n ( ) { n . c h a n g e ( ) } , 1 0 0 ) , { a l l o w E m p t y : e , a l l o w S a m e D o m a i n : t , a l l o w D o m a i n s : i , o p t i o n s : { } , v a l u e : 0 } } , w a t c h : { a l l o w E m p t y : f u n c t i o n ( ) { t h i s . c h a n g e ( ) } , a l l o w S a m e D o m a i n : f u n c t i o n ( ) { t h i s . c h a n g e ( ) } } , m e t h o d s : { c h a n g e A l l o w D o m a i n s : f u n c t i o n ( e ) { t h i s . a l l o w D o m a i n s = e , t h i s . c h a n g e ( ) } , c h a n g e : f u n c t i o n ( ) { t h i s . v C h e c k p o i n t . o p t i o n s = [ { c o d e : " a l l o w E m p t y " , v a l u e : t h i s . a l l o w E m p t y } , { c o d e : " a l l o w S a m e D o m a i n " , v a l u e : t h i s . a l l o w S a m e D o m a i n } , { c o d e : " a l l o w D o m a i n s " , v a l u e : t h i s . a l l o w D o m a i n s } ] } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "operator" value = "eq" / >
< input type = "hidden" name = "value" : value = "value" / >
< table class = "ui table" >
< tr >
< td class = "title" > 来源域名允许为空 < / t d >
< td >
< checkbox v - model = "allowEmpty" > < / c h e c k b o x >
< p class = "comment" > 允许不带来源的访问 。 < / p >
< / t d >
< / t r >
< tr >
< td > 来源域名允许一致 < / t d >
< td >
< checkbox v - model = "allowSameDomain" > < / c h e c k b o x >
< p class = "comment" > 允许来源域名和当前访问的域名一致 , 相当于在站内访问 。 < / p >
< / t d >
< / t r >
< tr >
< td > 允许的来源域名 < / t d >
< td >
< values - box : values = "allowDomains" @ change = "changeAllowDomains" > < / v a l u e s - b o x >
< p class = "comment" > 允许的来源域名列表 , 比如 < code - label > example . com < / c o d e - l a b e l > 、 < c o d e - l a b e l > * . e x a m p l e . c o m < / c o d e - l a b e l > 。 单 个 星 号 < c o d e - l a b e l > * < / c o d e - l a b e l > 表 示 允 许 所 有 域 名 。 < / p >
< / t d >
< / t r >
< / t a b l e >
2022-04-18 14:32:20 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - a c c e s s - l o g - p a r t i t i o n s - b o x " , { p r o p s : [ " v - p a r t i t i o n " , " v - d a y " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / s e r v e r s / l o g s / p a r t i t i o n D a t a " ) . p a r a m s ( { d a y : t h i s . v D a y } ) . s u c c e s s ( f u n c t i o n ( e ) { t . p a r t i t i o n s = [ ] , e . d a t a . p a r t i t i o n s . r e v e r s e ( ) . f o r E a c h ( f u n c t i o n ( e ) { t . p a r t i t i o n s . p u s h ( { c o d e : e , i s D i s a b l e d : ! 1 } ) } ) , 0 < t . p a r t i t i o n s . l e n g t h & & ( n u l l = = t . v P a r t i t i o n | | t . v P a r t i t i o n < 0 ) & & ( t . s e l e c t e d P a r t i t i o n = t . p a r t i t i o n s [ 0 ] . c o d e ) } ) . p o s t ( ) } , d a t a : f u n c t i o n ( ) { r e t u r n { p a r t i t i o n s : [ ] , s e l e c t e d P a r t i t i o n : t h i s . v P a r t i t i o n } } , m e t h o d s : { u r l : f u n c t i o n ( e ) { l e t t = w i n d o w . l o c a t i o n . t o S t r i n g ( ) ; r e t u r n 0 < ( t = ( t = ( t = ( t = t . r e p l a c e ( / \ ? p a r t i t i o n = - ? \ d + / , " ? " ) ) . r e p l a c e ( / \ ? r e q u e s t I d = - ? \ d + / , " ? " ) ) . r e p l a c e ( / & p a r t i t i o n = - ? \ d + / , " " ) ) . r e p l a c e ( / & r e q u e s t I d = - ? \ d + / , " " ) ) . i n d e x O f ( " ? " ) ? t + = " & p a r t i t i o n = " + e : t + = " ? p a r t i t i o n = " + e , t } , d i s a b l e : f u n c t i o n ( t ) { t h i s . p a r t i t i o n s . f o r E a c h ( f u n c t i o n ( e ) { e . c o d e = = t & & ( e . i s D i s a b l e d = ! 0 ) } ) } } , t e m p l a t e : ` < d i v v - i f = " p a r t i t i o n s . l e n g t h > 1 " >
2022-04-17 16:40:29 +08:00
< div class = "ui divider" style = "margin-bottom: 0" > < / d i v >
< div class = "ui menu text small blue" style = "margin-bottom: 0; margin-top: 0" >
2022-04-18 14:32:20 +08:00
< a v - for = "(p, index) in partitions" : href = "url(p.code)" class = "item" : class = "{active: selectedPartition == p.code, disabled: p.isDisabled}" > 分表 { { p . code + 1 } } & nbsp ; & nbsp ; < span class = "disabled" v - if = "index != partitions.length - 1" > | < / s p a n > < / a >
2022-04-17 16:40:29 +08:00
< / d i v >
< div class = "ui divider" style = "margin-top: 0" > < / d i v >
2022-05-05 11:25:23 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c a c h e - r e f s - c o n f i g - b o x " , { p r o p s : [ " v - c a c h e - r e f s " , " v - c a c h e - c o n f i g " , " v - c a c h e - p o l i c y - i d " , " v - w e b - i d " ] , m o u n t e d : f u n c t i o n ( ) { l e t s = t h i s ; s o r t T a b l e ( f u n c t i o n ( e ) { l e t i = [ ] ; e . f o r E a c h ( f u n c t i o n ( t ) { s . r e f s . f o r E a c h ( f u n c t i o n ( e ) { e . i d = = t & & i . p u s h ( e ) } ) } ) , s . u p d a t e R e f s ( i ) , s . c h a n g e ( ) } ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C a c h e R e f s , t = ( n u l l = = e & & ( e = [ ] ) , 0 ) ; r e t u r n e . f o r E a c h ( f u n c t i o n ( e ) { t + + , e . i d = t } ) , { r e f s : e , i d : t } } , m e t h o d s : { a d d R e f : f u n c t i o n ( e ) { w i n d o w . U P D A T I N G _ C A C H E _ R E F = n u l l ; l e t t = w i n d o w . i n n e r W i d t h , i = ( 1 0 2 4 < t & & ( t = 1 0 2 4 ) , w i n d o w . i n n e r H e i g h t ) , n = ( 5 0 0 < i & & ( i = 5 0 0 ) , t h i s ) ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / c a c h e / c r e a t e P o p u p ? i s R e v e r s e = " + ( e ? 1 : 0 ) , { w i d t h : t + " p x " , h e i g h t : i + " p x " , c a l l b a c k : f u n c t i o n ( e ) { l e t s = e . d a t a . c a c h e R e f ; i f ( n u l l ! = s . c o n d s ) { i f ( n . i d + + , s . i d = n . i d , s . i s R e v e r s e ) { l e t t = [ ] , i = ! 1 ; n . r e f s . f o r E a c h ( f u n c t i o n ( e ) { e . i s R e v e r s e | | i | | ( t . p u s h ( s ) , i = ! 0 ) , t . p u s h ( e ) } ) , i | | t . p u s h ( s ) , n . u p d a t e R e f s ( t ) } e l s e n . r e f s . p u s h ( s ) ; n . c h a n g e ( ) } } } ) } , u p d a t e R e f : f u n c t i o n ( t , e ) { w i n d o w . U P D A T I N G _ C A C H E _ R E F = e ; l e t i = w i n d o w . i n n e r W i d t h , s = ( 1 0 2 4 < i & & ( i = 1 0 2 4 ) , w i n d o w . i n n e r H e i g h t ) , n = ( 5 0 0 < s & & ( s = 5 0 0 ) , t h i s ) ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / c a c h e / c r e a t e P o p u p " , { w i d t h : i + " p x " , h e i g h t : s + " p x " , c a l l b a c k : f u n c t i o n ( e ) { e . d a t a . c a c h e R e f . i d = n . r e f s [ t ] . i d , V u e . s e t ( n . r e f s , t , e . d a t a . c a c h e R e f ) , n . c h a n g e ( ) , n . $ r e f s . c a c h e R e f [ t ] . u p d a t e C o n d s ( e . d a t a . c a c h e R e f . c o n d s ) , n . $ r e f s . c a c h e R e f [ t ] . n o t i f y C h a n g e ( ) } } ) } , d i s a b l e R e f : f u n c t i o n ( e ) { e . i s O n = ! 1 , t h i s . c h a n g e ( ) } , e n a b l e R e f : f u n c t i o n ( e ) { e . i s O n = ! 0 , t h i s . c h a n g e ( ) } , r e m o v e R e f : f u n c t i o n ( e ) { l e t t = t h i s ; t e a w e b . c o n f i r m ( " 确 定 要 删 除 此 缓 存 设 置 吗 ? " , f u n c t i o n ( ) { t . r e f s . $ r e m o v e ( e ) , t . c h a n g e ( ) } ) } , u p d a t e R e f s : f u n c t i o n ( e ) { t h i s . r e f s = e , n u l l ! = t h i s . v C a c h e C o n f i g & & ( t h i s . v C a c h e C o n f i g . c a c h e R e f s = e ) } , t i m e U n i t N a m e : f u n c t i o n ( e ) { s w i t c h ( e ) { c a s e " m s " : r e t u r n " 毫 秒 " ; c a s e " s e c o n d " : r e t u r n " 秒 " ; c a s e " m i n u t e " : r e t u r n " 分 钟 " ; c a s e " h o u r " : r e t u r n " 小 时 " ; c a s e " d a y " : r e t u r n " 天 " ; c a s e " w e e k " : r e t u r n " 周 " } r e t u r n e } , c h a n g e : f u n c t i o n ( ) { t h i s . $ f o r c e U p d a t e ( ) , n u l l ! = t h i s . v C a c h e P o l i c y I d & & 0 < t h i s . v C a c h e P o l i c y I d ? T e a . a c t i o n ( " / s e r v e r s / c o m p o n e n t s / c a c h e / u p d a t e R e f s " ) . p a r a m s ( { c a c h e P o l i c y I d : t h i s . v C a c h e P o l i c y I d , r e f s J S O N : J S O N . s t r i n g i f y ( t h i s . r e f s ) } ) . p o s t ( ) : n u l l ! = t h i s . v W e b I d & & 0 < t h i s . v W e b I d & & T e a . a c t i o n ( " / s e r v e r s / s e r v e r / s e t t i n g s / c a c h e / u p d a t e R e f s " ) . p a r a m s ( { w e b I d : t h i s . v W e b I d , r e f s J S O N : J S O N . s t r i n g i f y ( t h i s . r e f s ) } ) . s u c c e s s ( f u n c t i o n ( e ) { e . d a t a . i s U p d a t e d & & t e a w e b . s u c c e s s T o a s t ( " 保 存 成 功 " ) } ) . p o s t ( ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "refsJSON" : value = "JSON.stringify(refs)" / >
< div >
< p class = "comment" v - if = "refs.length == 0" > 暂时还没有缓存条件 。 < / p >
< table class = "ui table selectable celled" v - show = "refs.length > 0" id = "sortable-table" >
< thead >
< tr >
< th style = "width:1em" > < / t h >
< th > 缓存条件 < / t h >
< th class = "two wide" > 分组关系 < / t h >
< th class = "width10" > 缓存时间 < / t h >
2022-04-08 20:49:33 +08:00
< th class = "three op" > 操作 < / t h >
2021-11-22 12:08:53 +08:00
< / t r >
< / t h e a d >
< tbody v - for = "(cacheRef, index) in refs" : key = "cacheRef.id" : v - id = "cacheRef.id" >
< tr >
< td style = "text-align: center;" > < i class = "icon bars handle grey" > < / i > < / t d >
2022-04-08 20:49:33 +08:00
< td : class = "{'color-border': cacheRef.conds.connector == 'and', disabled: !cacheRef.isOn}" : style = "{'border-left':cacheRef.isReverse ? '1px #db2828 solid' : ''}" >
< http - request - conds - view : v - conds = "cacheRef.conds" ref = "cacheRef" : class = "{disabled: !cacheRef.isOn}" > < / h t t p - r e q u e s t - c o n d s - v i e w >
2021-11-22 12:08:53 +08:00
< grey - label v - if = "cacheRef.minSize != null && cacheRef.minSize.count > 0" >
{ { cacheRef . minSize . count } } { { cacheRef . minSize . unit } }
< span v - if = "cacheRef.maxSize != null && cacheRef.maxSize.count > 0" > - { { cacheRef . maxSize . count } } { { cacheRef . maxSize . unit } } < / s p a n >
< / g r e y - l a b e l >
< grey - label v - else - if = "cacheRef.maxSize != null && cacheRef.maxSize.count > 0" > 0 - { { cacheRef . maxSize . count } } { { cacheRef . maxSize . unit } } < / g r e y - l a b e l >
2021-12-08 10:03:27 +08:00
< grey - label v - if = "cacheRef.methods != null && cacheRef.methods.length > 0" > { { cacheRef . methods . join ( ", " ) } } < / g r e y - l a b e l >
2021-12-08 19:13:54 +08:00
< grey - label v - if = "cacheRef.expiresTime != null && cacheRef.expiresTime.isPrior && cacheRef.expiresTime.isOn" > Expires < / g r e y - l a b e l >
2021-11-22 12:08:53 +08:00
< grey - label v - if = "cacheRef.status != null && cacheRef.status.length > 0 && (cacheRef.status.length > 1 || cacheRef.status[0] != 200)" > 状态码 : { { cacheRef . status . map ( function ( v ) { return v . toString ( ) } ) . join ( ", " ) } } < / g r e y - l a b e l >
2022-03-04 17:00:01 +08:00
< grey - label v - if = "cacheRef.allowPartialContent" > 区间缓存 < / g r e y - l a b e l >
2022-08-08 16:26:12 +08:00
< grey - label v - if = "cacheRef.enableIfNoneMatch" > If - None - Match < / g r e y - l a b e l >
< grey - label v - if = "cacheRef.enableIfModifiedSince" > If - Modified - Since < / g r e y - l a b e l >
2021-11-22 12:08:53 +08:00
< / t d >
2022-04-08 20:49:33 +08:00
< td : class = "{disabled: !cacheRef.isOn}" >
2021-11-22 12:08:53 +08:00
< span v - if = "cacheRef.conds.connector == 'and'" > 和 < / s p a n >
< span v - if = "cacheRef.conds.connector == 'or'" > 或 < / s p a n >
< / t d >
2022-04-08 20:49:33 +08:00
< td : class = "{disabled: !cacheRef.isOn}" >
2021-11-22 12:08:53 +08:00
< span v - if = "!cacheRef.isReverse" > { { cacheRef . life . count } } { { timeUnitName ( cacheRef . life . unit ) } } < / s p a n >
< span v - else class = "red" > 不缓存 < / s p a n >
< / t d >
< td >
< a href = "" @ click . prevent = "updateRef(index, cacheRef)" > 修改 < / a > & n b s p ;
2022-04-08 20:49:33 +08:00
< a href = "" v - if = "cacheRef.isOn" @ click . prevent = "disableRef(cacheRef)" > 暂停 < / a > < a h r e f = " " v - i f = " ! c a c h e R e f . i s O n " @ c l i c k . p r e v e n t = " e n a b l e R e f ( c a c h e R e f ) " > < s p a n c l a s s = " r e d " > 恢 复 < / s p a n > < / a > & n b s p ;
2021-11-22 12:08:53 +08:00
< a href = "" @ click . prevent = "removeRef(index)" > 删除 < / a >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
2021-12-08 10:03:27 +08:00
< p class = "comment" v - if = "refs.length > 1" > 所有条件匹配顺序为从上到下 , 可以拖动左侧的 < i class = "icon bars" > < / i > 排 序 。 服 务 设 置 的 优 先 级 比 全 局 缓 存 策 略 设 置 的 优 先 级 要 高 。 < / p >
2021-11-22 12:08:53 +08:00
2022-01-14 10:46:02 +08:00
< button class = "ui button tiny" @ click . prevent = "addRef(false)" type = "button" > + 添加缓存设置 < / b u t t o n > & n b s p ; & n b s p ; < a h r e f = " " @ c l i c k . p r e v e n t = " a d d R e f ( t r u e ) " > + 添 加 不 缓 存 设 置 < / a >
2021-11-22 12:08:53 +08:00
< / d i v >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " o r i g i n - l i s t - b o x " , { p r o p s : [ " v - p r i m a r y - o r i g i n s " , " v - b a c k u p - o r i g i n s " , " v - s e r v e r - t y p e " , " v - p a r a m s " ] , d a t a : f u n c t i o n ( ) { r e t u r n { p r i m a r y O r i g i n s : t h i s . v P r i m a r y O r i g i n s , b a c k u p O r i g i n s : t h i s . v B a c k u p O r i g i n s } } , m e t h o d s : { c r e a t e P r i m a r y O r i g i n : f u n c t i o n ( ) { t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / o r i g i n s / a d d P o p u p ? o r i g i n T y p e = p r i m a r y & " + t h i s . v P a r a m s , { h e i g h t : " 2 7 e m " , c a l l b a c k : f u n c t i o n ( e ) { t e a w e b . s u c c e s s ( " 保 存 成 功 " , f u n c t i o n ( ) { w i n d o w . l o c a t i o n . r e l o a d ( ) } ) } } ) } , c r e a t e B a c k u p O r i g i n : f u n c t i o n ( ) { t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / o r i g i n s / a d d P o p u p ? o r i g i n T y p e = b a c k u p & " + t h i s . v P a r a m s , { h e i g h t : " 2 7 e m " , c a l l b a c k : f u n c t i o n ( e ) { t e a w e b . s u c c e s s ( " 保 存 成 功 " , f u n c t i o n ( ) { w i n d o w . l o c a t i o n . r e l o a d ( ) } ) } } ) } , u p d a t e O r i g i n : f u n c t i o n ( e , t ) { t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / o r i g i n s / u p d a t e P o p u p ? o r i g i n T y p e = " + t + " & " + t h i s . v P a r a m s + " & o r i g i n I d = " + e , { h e i g h t : " 2 7 e m " , c a l l b a c k : f u n c t i o n ( e ) { t e a w e b . s u c c e s s ( " 保 存 成 功 " , f u n c t i o n ( ) { w i n d o w . l o c a t i o n . r e l o a d ( ) } ) } } ) } , d e l e t e O r i g i n : f u n c t i o n ( e , t ) { l e t i = t h i s ; t e a w e b . c o n f i r m ( " 确 定 要 删 除 此 源 站 吗 ? " , f u n c t i o n ( ) { T e a . a c t i o n ( " / s e r v e r s / s e r v e r / s e t t i n g s / o r i g i n s / d e l e t e ? " + i . v P a r a m s + " & o r i g i n I d = " + e + " & o r i g i n T y p e = " + t ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( ) { t e a w e b . s u c c e s s ( " 删 除 成 功 " , f u n c t i o n ( ) { w i n d o w . l o c a t i o n . r e l o a d ( ) } ) } ) } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< h3 > 主要源站 < a href = "" @ click . prevent = "createPrimaryOrigin()" > [ 添加主要源站 ] < / a > < / h 3 >
< p class = "comment" v - if = "primaryOrigins.length == 0" > 暂时还没有主要源站 。 < / p >
< origin - list - table v - if = "primaryOrigins.length > 0" : v - origins = "vPrimaryOrigins" : v - origin - type = "'primary'" @ deleteOrigin = "deleteOrigin" @ updateOrigin = "updateOrigin" > < / o r i g i n - l i s t - t a b l e >
< h3 > 备用源站 < a href = "" @ click . prevent = "createBackupOrigin()" > [ 添加备用源站 ] < / a > < / h 3 >
< p class = "comment" v - if = "backupOrigins.length == 0" : v - origins = "primaryOrigins" > 暂时还没有备用源站 。 < / p >
< origin - list - table v - if = "backupOrigins.length > 0" : v - origins = "backupOrigins" : v - origin - type = "'backup'" @ deleteOrigin = "deleteOrigin" @ updateOrigin = "updateOrigin" > < / o r i g i n - l i s t - t a b l e >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " o r i g i n - l i s t - t a b l e " , { p r o p s : [ " v - o r i g i n s " , " v - o r i g i n - t y p e " ] , d a t a : f u n c t i o n ( ) { r e t u r n { } } , m e t h o d s : { d e l e t e O r i g i n : f u n c t i o n ( e ) { t h i s . $ e m i t ( " d e l e t e O r i g i n " , e , t h i s . v O r i g i n T y p e ) } , u p d a t e O r i g i n : f u n c t i o n ( e ) { t h i s . $ e m i t ( " u p d a t e O r i g i n " , e , t h i s . v O r i g i n T y p e ) } } , t e m p l a t e : `
2021-11-22 12:08:53 +08:00
< table class = "ui table selectable" >
< thead >
< tr >
< th > 源站地址 < / t h >
< th > 权重 < / t h >
< th class = "width10" > 状态 < / t h >
< th class = "two op" > 操作 < / t h >
< / t r >
< / t h e a d >
< tr v - for = "origin in vOrigins" >
2022-08-08 16:26:12 +08:00
< td : class = "{disabled:!origin.isOn}" >
< a href = "" @ click . prevent = "updateOrigin(origin.id)" : class = "{disabled:!origin.isOn}" > { { origin . addr } } & nbsp ; < i class = "icon expand small" > < / i > < / a >
2022-07-12 13:55:00 +08:00
< div style = "margin-top: 0.3em" v - if = "origin.name.length > 0 || origin.hasCert || (origin.host != null && origin.host.length > 0) || origin.followPort || (origin.domains != null && origin.domains.length > 0)" >
2022-03-17 19:59:58 +08:00
< tiny - basic - label v - if = "origin.name.length > 0" > { { origin . name } } < / t i n y - b a s i c - l a b e l >
< tiny - basic - label v - if = "origin.hasCert" > 证书 < / t i n y - b a s i c - l a b e l >
< tiny - basic - label v - if = "origin.host != null && origin.host.length > 0" > 主机名 : { { origin . host } } < / t i n y - b a s i c - l a b e l >
2022-07-12 13:55:00 +08:00
< tiny - basic - label v - if = "origin.followPort" > 端口跟随 < / t i n y - b a s i c - l a b e l >
2022-03-17 19:59:58 +08:00
< span v - if = "origin.domains != null && origin.domains.length > 0" > < tiny - basic - label v - for = "domain in origin.domains" > 匹配 : { { domain } } < / t i n y - b a s i c - l a b e l > < / s p a n >
2022-01-16 20:04:11 +08:00
< / d i v >
2021-11-22 12:08:53 +08:00
< / t d >
< td : class = "{disabled:!origin.isOn}" > { { origin . weight } } < / t d >
< td >
< label - on : v - is - on = "origin.isOn" > < / l a b e l - o n >
< / t d >
< td >
< a href = "" @ click . prevent = "updateOrigin(origin.id)" > 修改 < / a > & n b s p ;
< a href = "" @ click . prevent = "deleteOrigin(origin.id)" > 删除 < / a >
< / t d >
< / t r >
2022-04-08 21:24:54 +08:00
< / t a b l e > ` } ) , V u e . c o m p o n e n t ( " h t t p - f i r e w a l l - p o l i c y - s e l e c t o r " , { p r o p s : [ " v - h t t p - f i r e w a l l - p o l i c y " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / s e r v e r s / c o m p o n e n t s / w a f / c o u n t " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . c o u n t = e . d a t a . c o u n t } ) } , d a t a : f u n c t i o n ( ) { r e t u r n { c o u n t : 0 , f i r e w a l l P o l i c y : t h i s . v H t t p F i r e w a l l P o l i c y } } , m e t h o d s : { r e m o v e : f u n c t i o n ( ) { t h i s . f i r e w a l l P o l i c y = n u l l } , s e l e c t : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / c o m p o n e n t s / w a f / s e l e c t P o p u p " , { c a l l b a c k : f u n c t i o n ( e ) { t . f i r e w a l l P o l i c y = e . d a t a . f i r e w a l l P o l i c y } } ) } , c r e a t e : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / c o m p o n e n t s / w a f / c r e a t e P o p u p " , { h e i g h t : " 2 6 e m " , c a l l b a c k : f u n c t i o n ( e ) { t . f i r e w a l l P o l i c y = e . d a t a . f i r e w a l l P o l i c y } } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div v - if = "firewallPolicy != null" class = "ui label basic" >
< input type = "hidden" name = "httpFirewallPolicyId" : value = "firewallPolicy.id" / >
{ { firewallPolicy . name } } & nbsp ; < a : href = "'/servers/components/waf/policy?firewallPolicyId=' + firewallPolicy.id" target = "_blank" title = "修改" > < i class = "icon pencil small" > < / i > < / a > & n b s p ; < a h r e f = " " @ c l i c k . p r e v e n t = " r e m o v e ( ) " t i t l e = " 删 除 " > < i c l a s s = " i c o n r e m o v e s m a l l " > < / i > < / a >
< / d i v >
< div v - if = "firewallPolicy == null" >
< span v - if = "count > 0" > < a href = "" @ click . prevent = "select" > [ 选择已有策略 ] < / a > & n b s p ; & n b s p ; < / s p a n > < a h r e f = " " @ c l i c k . p r e v e n t = " c r e a t e " > [ 创 建 新 策 略 ] < / a >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - w e b s o c k e t - b o x " , { p r o p s : [ " v - w e b s o c k e t - r e f " , " v - w e b s o c k e t - c o n f i g " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v W e b s o c k e t R e f , t = ( n u l l = = e & & ( e = { i s P r i o r : ! 1 , i s O n : ! 1 , w e b s o c k e t I d : 0 } ) , t h i s . v W e b s o c k e t C o n f i g ) ; r e t u r n n u l l = = t ? t = { i d : 0 , i s O n : ! 1 , h a n d s h a k e T i m e o u t : { c o u n t : 3 0 , u n i t : " s e c o n d " } , a l l o w A l l O r i g i n s : ! 0 , a l l o w e d O r i g i n s : [ ] , r e q u e s t S a m e O r i g i n : ! 0 , r e q u e s t O r i g i n : " " } : ( n u l l = = t . h a n d s h a k e T i m e o u t & & ( t . h a n d s h a k e T i m e o u t = { c o u n t : 3 0 , u n i t : " s e c o n d " } ) , n u l l = = t . a l l o w e d O r i g i n s & & ( t . a l l o w e d O r i g i n s = [ ] ) ) , { w e b s o c k e t R e f : e , w e b s o c k e t C o n f i g : t , h a n d s h a k e T i m e o u t C o u n t S t r i n g : t . h a n d s h a k e T i m e o u t . c o u n t . t o S t r i n g ( ) , a d v a n c e d V i s i b l e : ! 1 } } , w a t c h : { h a n d s h a k e T i m e o u t C o u n t S t r i n g : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) ; ! i s N a N ( e ) & & 0 < = e ? t h i s . w e b s o c k e t C o n f i g . h a n d s h a k e T i m e o u t . c o u n t = e : t h i s . w e b s o c k e t C o n f i g . h a n d s h a k e T i m e o u t . c o u n t = 0 } } , m e t h o d s : { i s O n : f u n c t i o n ( ) { r e t u r n ( ! t h i s . v I s L o c a t i o n & & ! t h i s . v I s G r o u p | | t h i s . w e b s o c k e t R e f . i s P r i o r ) & & t h i s . w e b s o c k e t R e f . i s O n } , c h a n g e A d v a n c e d V i s i b l e : f u n c t i o n ( e ) { t h i s . a d v a n c e d V i s i b l e = e } , c r e a t e O r i g i n : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / w e b s o c k e t / c r e a t e O r i g i n " , { h e i g h t : " 1 2 . 5 e m " , c a l l b a c k : f u n c t i o n ( e ) { t . w e b s o c k e t C o n f i g . a l l o w e d O r i g i n s . p u s h ( e . d a t a . o r i g i n ) } } ) } , r e m o v e O r i g i n : f u n c t i o n ( e ) { t h i s . w e b s o c k e t C o n f i g . a l l o w e d O r i g i n s . $ r e m o v e ( e ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "websocketRefJSON" : value = "JSON.stringify(websocketRef)" / >
< input type = "hidden" name = "websocketJSON" : value = "JSON.stringify(websocketConfig)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "websocketRef" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "((!vIsLocation && !vIsGroup) || websocketRef.isPrior)" >
< tr >
2022-06-05 17:12:54 +08:00
< td class = "title" > 启用配置 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "websocketRef.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "isOn()" >
< tr >
< td class = "color-border" > 允许所有来源域 < em > ( Origin ) < / e m > < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "websocketConfig.allowAllOrigins" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 选中表示允许所有的来源域 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "isOn() && !websocketConfig.allowAllOrigins" >
< tr >
< td class = "color-border" > 允许的来源域列表 < em > ( Origin ) < / e m > < / t d >
< td >
< div v - if = "websocketConfig.allowedOrigins.length > 0" >
< div class = "ui label tiny" v - for = "(origin, index) in websocketConfig.allowedOrigins" >
{ { origin } } < a href = "" title = "删除" @ click . prevent = "removeOrigin(index)" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< button class = "ui button tiny" type = "button" @ click . prevent = "createOrigin()" > + < / b u t t o n >
< p class = "comment" > 只允许在列表中的来源域名访问Websocket服务 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< more - options - tbody @ change = "changeAdvancedVisible" v - show = "isOn()" > < / m o r e - o p t i o n s - t b o d y >
< tbody v - show = "isOn() && advancedVisible" >
< tr >
< td class = "color-border" > 是否传递请求来源域 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "websocketConfig.requestSameOrigin" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 选中表示把接收到的请求中的 < span class = "ui label tiny" > Origin < / s p a n > 字 段 传 递 到 源 站 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "isOn() && advancedVisible && !websocketConfig.requestSameOrigin" >
< tr >
< td class = "color-border" > 指定传递的来源域 < / t d >
< td >
< input type = "text" v - model = "websocketConfig.requestOrigin" maxlength = "200" / >
< p class = "comment" > 指定向源站传递的 < span class = "ui label tiny" > Origin < / s p a n > 字 段 值 。 < / p >
< / t d >
< / t r >
< / t b o d y >
<!-- TODO 这个选项暂时保留 -- >
< tbody v - show = "isOn() && false" >
< tr >
< td > 握手超时时间 < em > ( Handshake ) < / e m > < / t d >
< td >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" maxlength = "10" v - model = "handshakeTimeoutCountString" style = "width:6em" / >
< / d i v >
< div class = "ui field" >
秒
< / d i v >
< / d i v >
< p class = "comment" > 0 表示使用默认的时间设置 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - r e w r i t e - r u l e - l i s t " , { p r o p s : [ " v - w e b - i d " , " v - r e w r i t e - r u l e s " ] , m o u n t e d : f u n c t i o n ( ) { s e t T i m e o u t ( t h i s . s o r t , 1 e 3 ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R e w r i t e R u l e s ; r e t u r n { r e w r i t e R u l e s : e = n u l l = = e ? [ ] : e } } , m e t h o d s : { u p d a t e R e w r i t e R u l e : f u n c t i o n ( e ) { t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / r e w r i t e / u p d a t e P o p u p ? w e b I d = " + t h i s . v W e b I d + " & r e w r i t e R u l e I d = " + e , { h e i g h t : " 2 6 e m " , c a l l b a c k : f u n c t i o n ( ) { w i n d o w . l o c a t i o n . r e l o a d ( ) } } ) } , d e l e t e R e w r i t e R u l e : f u n c t i o n ( e ) { l e t t = t h i s ; t e a w e b . c o n f i r m ( " 确 定 要 删 除 此 重 写 规 则 吗 ? " , f u n c t i o n ( ) { T e a . a c t i o n ( " / s e r v e r s / s e r v e r / s e t t i n g s / r e w r i t e / d e l e t e " ) . p a r a m s ( { w e b I d : t . v W e b I d , r e w r i t e R u l e I d : e } ) . p o s t ( ) . r e f r e s h ( ) } ) } , s o r t : f u n c t i o n ( ) { i f ( 0 ! = t h i s . r e w r i t e R u l e s . l e n g t h ) { l e t t = t h i s ; s o r t T a b l e ( f u n c t i o n ( e ) { T e a . a c t i o n ( " / s e r v e r s / s e r v e r / s e t t i n g s / r e w r i t e / s o r t " ) . p o s t ( ) . p a r a m s ( { w e b I d : t . v W e b I d , r e w r i t e R u l e I d s : e } ) . s u c c e s s ( f u n c t i o n ( ) { t e a w e b . s u c c e s s ( " 保 存 成 功 " ) } ) } ) } } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div class = "margin" > < / d i v >
< p class = "comment" v - if = "rewriteRules.length == 0" > 暂时还没有重写规则 。 < / p >
< table class = "ui table selectable" v - if = "rewriteRules.length > 0" id = "sortable-table" >
< thead >
< tr >
< th style = "width:1em" > < / t h >
< th > 匹配规则 < / t h >
< th > 转发目标 < / t h >
< th > 转发方式 < / t h >
< th class = "two wide" > 状态 < / t h >
< th class = "two op" > 操作 < / t h >
< / t r >
< / t h e a d >
< tbody v - for = "rule in rewriteRules" : v - id = "rule.id" >
< tr >
< td > < i class = "icon bars grey handle" > < / i > < / t d >
< td > { { rule . pattern } }
< br / >
< http - rewrite - labels - label class = "ui label tiny" v - if = "rule.isBreak" > BREAK < / h t t p - r e w r i t e - l a b e l s - l a b e l >
< http - rewrite - labels - label class = "ui label tiny" v - if = "rule.mode == 'redirect' && rule.redirectStatus != 307" > { { rule . redirectStatus } } < / h t t p - r e w r i t e - l a b e l s - l a b e l >
< http - rewrite - labels - label class = "ui label tiny" v - if = "rule.proxyHost.length > 0" > Host : { { rule . proxyHost } } < / h t t p - r e w r i t e - l a b e l s - l a b e l >
< / t d >
< td > { { rule . replace } } < / t d >
< td >
< span v - if = "rule.mode == 'proxy'" > 隐式 < / s p a n >
< span v - if = "rule.mode == 'redirect'" > 显示 < / s p a n >
< / t d >
< td >
< label - on : v - is - on = "rule.isOn" > < / l a b e l - o n >
< / t d >
< td >
< a href = "" @ click . prevent = "updateRewriteRule(rule.id)" > 修改 < / a > & n b s p ;
< a href = "" @ click . prevent = "deleteRewriteRule(rule.id)" > 删除 < / a >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< p class = "comment" v - if = "rewriteRules.length > 0" > 拖动左侧的 < i class = "icon bars grey" > < / i > 图 标 可 以 对 重 写 规 则 进 行 排 序 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - r e w r i t e - l a b e l s - l a b e l " , { p r o p s : [ " v - c l a s s " ] , t e m p l a t e : ' < s p a n c l a s s = " u i l a b e l t i n y " : c l a s s = " v C l a s s " s t y l e = " f o n t - s i z e : 0 . 7 e m ; p a d d i n g : 4 p x ; m a r g i n - t o p : 0 . 3 e m ; m a r g i n - b o t t o m : 0 . 3 e m " > < s l o t > < / s l o t > < / s p a n > ' } ) , V u e . c o m p o n e n t ( " s e r v e r - n a m e - b o x " , { p r o p s : [ " v - s e r v e r - n a m e s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v S e r v e r N a m e s ; r e t u r n { s e r v e r N a m e s : e = n u l l = = e ? [ ] : e , i s S e a r c h i n g : ! 1 , k e y w o r d : " " } } , m e t h o d s : { a d d S e r v e r N a m e : f u n c t i o n ( ) { w i n d o w . U P D A T I N G _ S E R V E R _ N A M E = n u l l ; l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / a d d S e r v e r N a m e P o p u p " , { c a l l b a c k : f u n c t i o n ( e ) { e = e . d a t a . s e r v e r N a m e ; t . s e r v e r N a m e s . p u s h ( e ) } } ) } , r e m o v e S e r v e r N a m e : f u n c t i o n ( e ) { t h i s . s e r v e r N a m e s . $ r e m o v e ( e ) } , u p d a t e S e r v e r N a m e : f u n c t i o n ( t , e ) { w i n d o w . U P D A T I N G _ S E R V E R _ N A M E = e ; l e t i = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / a d d S e r v e r N a m e P o p u p " , { c a l l b a c k : f u n c t i o n ( e ) { e = e . d a t a . s e r v e r N a m e ; V u e . s e t ( i . s e r v e r N a m e s , t , e ) } } ) } , s h o w S e a r c h B o x : f u n c t i o n ( ) { i f ( t h i s . i s S e a r c h i n g = ! t h i s . i s S e a r c h i n g , t h i s . i s S e a r c h i n g ) { l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . k e y w o r d R e f . f o c u s ( ) } , 2 0 0 ) } e l s e t h i s . k e y w o r d = " " } } , w a t c h : { k e y w o r d : f u n c t i o n ( i ) { t h i s . s e r v e r N a m e s . f o r E a c h ( f u n c t i o n ( e ) { i f ( 0 = = i . l e n g t h ) e . i s S h o w i n g = ! 0 ; e l s e i f ( n u l l = = e . s u b N a m e s | | 0 = = e . s u b N a m e s . l e n g t h ) t e a w e b . m a t c h ( e . n a m e , i ) | | ( e . i s S h o w i n g = ! 1 ) ; e l s e { l e t t = ! 1 ; e . s u b N a m e s . f o r E a c h ( f u n c t i o n ( e ) { t e a w e b . m a t c h ( e , i ) & & ( t = ! 0 ) } ) , e . i s S h o w i n g = t } } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "serverNames" : value = "JSON.stringify(serverNames)" / >
< div v - if = "serverNames.length > 0" >
2022-04-14 16:58:57 +08:00
< div v - for = "(serverName, index) in serverNames" class = "ui label small basic" : class = "{hidden: serverName.isShowing === false}" >
2021-11-22 12:08:53 +08:00
< em v - if = "serverName.type != 'full'" > { { serverName . type } } < / e m >
< span v - if = "serverName.subNames == null || serverName.subNames.length == 0" : class = "{disabled: serverName.isShowing === false}" > { { serverName . name } } < / s p a n >
< span v - else : class = "{disabled: serverName.isShowing === false}" > { { serverName . subNames [ 0 ] } } 等 { { serverName . subNames . length } } 个域名 < / s p a n >
< a href = "" title = "修改" @ click . prevent = "updateServerName(index, serverName)" > < i class = "icon pencil small" > < / i > < / a > < a h r e f = " " t i t l e = " 删 除 " @ c l i c k . p r e v e n t = " r e m o v e S e r v e r N a m e ( i n d e x ) " > < i c l a s s = " i c o n r e m o v e " > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div class = "ui fields inline" >
< div class = "ui field" > < a href = "" @ click . prevent = "addServerName()" > [ 添加域名绑定 ] < / a > < / d i v >
< div class = "ui field" v - if = "serverNames.length > 0" > < span class = "grey" > | < / s p a n > < / d i v >
< div class = "ui field" v - if = "serverNames.length > 0" >
< a href = "" @ click . prevent = "showSearchBox()" v - if = "!isSearching" > < i class = "icon search small" > < / i > < / a >
< a href = "" @ click . prevent = "showSearchBox()" v - if = "isSearching" > < i class = "icon close small" > < / i > < / a >
< / d i v >
< div class = "ui field" v - if = "isSearching" >
< input type = "text" placeholder = "搜索域名" ref = "keywordRef" class = "ui input tiny" v - model = "keyword" / >
< / d i v >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c a c h e - s t a l e - c o n f i g " , { p r o p s : [ " v - c a c h e - s t a l e - c o n f i g " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C a c h e S t a l e C o n f i g ; r e t u r n { c o n f i g : e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 , s t a t u s : [ ] , s u p p o r t S t a l e I f E r r o r H e a d e r : ! 0 , l i f e : { c o u n t : 1 , u n i t : " d a y " } } : e } } , w a t c h : { c o n f i g : { d e e p : ! 0 , h a n d l e r : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . c o n f i g ) } } } , m e t h o d s : { } , t e m p l a t e : ` < t a b l e c l a s s = " u i t a b l e d e f i n i t i o n s e l e c t a b l e " >
2021-12-17 14:17:48 +08:00
< tbody >
< tr >
< td class = "title" > 启用过时缓存 < / t d >
< td >
< checkbox v - model = "config.isOn" > < / c h e c k b o x >
2022-04-04 19:46:12 +08:00
< p class = "comment" > < plus - label > < / p l u s - l a b e l > 选 中 后 , 在 更 新 缓 存 失 败 后 会 尝 试 读 取 过 时 的 缓 存 。 < / p >
2021-12-17 14:17:48 +08:00
< / t d >
< / t r >
< tr v - show = "config.isOn" >
< td > 有效期 < / t d >
< td >
< time - duration - box : v - value = "config.life" > < / t i m e - d u r a t i o n - b o x >
< p class = "comment" > 缓存在过期之后 , 仍然保留的时间 。 < / p >
< / t d >
< / t r >
< tr v - show = "config.isOn" >
< td > 状态码 < / t d >
< td > < http - status - box : v - status - list = "config.status" > < / h t t p - s t a t u s - b o x >
< p class = "comment" > 在这些状态码出现时使用过时缓存 , 默认支持 < code - label > 50 x < / c o d e - l a b e l > 状 态 码 。 < / p >
< / t d >
< / t r >
< tr v - show = "config.isOn" >
< td > 支持stale - if - error < / t d >
< td >
< checkbox v - model = "config.supportStaleIfErrorHeader" > < / c h e c k b o x >
< p class = "comment" > 选中后 , 支持在Cache - Control中通过 < code - label > stale - if - error < / c o d e - l a b e l > 指 定 过 时 缓 存 有 效 期 。 < / p >
< / t d >
< / t r >
< / t b o d y >
2022-05-21 20:00:39 +08:00
< / t a b l e > ` } ) , V u e . c o m p o n e n t ( " f i r e w a l l - s y n - f l o o d - c o n f i g - v i e w e r " , { p r o p s : [ " v - s y n - f l o o d - c o n f i g " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v S y n F l o o d C o n f i g ; r e t u r n { c o n f i g : e = n u l l = = e ? { i s O n : ! 1 , m i n A t t e m p t s : 1 0 , t i m e o u t S e c o n d s : 6 0 0 , i g n o r e L o c a l : ! 0 } : e } } , t e m p l a t e : ` < d i v >
< span v - if = "config.isOn" >
已启用 / < span > 空连接次数 : { { config . minAttempts } } 次 / 分钟 < /span> / 封禁时间 : { { config . timeoutSeconds } } 秒 < span v - if = "config.ignoreLocal" > / 忽 略 局 域 网 访 问 < / s p a n >
< / s p a n >
< span v - else > 未启用 < / s p a n >
< /div>`}),Vue.component("domains-box",{props:["v-domains"],data:function(){let e=this.vDomains;return{domains:e=null==e?[]:e,isAdding:!1,addingDomain:""}},methods:{add:function(){this.isAdding=!0;let e=this;setTimeout(function(){e.$refs.addingDomain.focus()},100)},confirm:function(){let t=this;if(this.addingDomain=this.addingDomain.replace(/ \ s / g , "" ) , 0 == this . addingDomain . length ) teaweb . warn ( "请输入要添加的域名" , function ( ) { t . $refs . addingDomain . focus ( ) } ) ; else { if ( "~" == this . addingDomain [ 0 ] ) { var e = this . addingDomain . substring ( 1 ) ; try { new RegExp ( e ) } catch ( e ) { return void teaweb . warn ( "正则表达式错误:" + e . message , function ( ) { t . $refs . addingDomain . focus ( ) } ) } } this . domains . push ( this . addingDomain ) , this . cancel ( ) } } , remove : function ( e ) { this . domains . $remove ( e ) } , cancel : function ( ) { this . isAdding = ! 1 , this . addingDomain = "" } } , template : ` <div>
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "domainsJSON" : value = "JSON.stringify(domains)" / >
< div v - if = "domains.length > 0" >
< span class = "ui label small basic" v - for = "(domain, index) in domains" >
< span v - if = "domain.length > 0 && domain[0] == '~'" class = "grey" style = "font-style: normal" > [ 正则 ] < / s p a n >
< span v - if = "domain.length > 0 && domain[0] == '.'" class = "grey" style = "font-style: normal" > [ 后缀 ] < / s p a n >
< span v - if = "domain.length > 0 && domain[0] == '*'" class = "grey" style = "font-style: normal" > [ 泛域名 ] < / s p a n >
{ { domain } }
& nbsp ; < a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove small" > < / i > < / a >
< / s p a n >
< div class = "ui divider" > < / d i v >
< / d i v >
< div v - if = "isAdding" >
< div class = "ui fields" >
< div class = "ui field" >
< input type = "text" v - model = "addingDomain" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" ref = "addingDomain" placeholder = "*.xxx.com" size = "30" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirm" > 确定 < / b u t t o n >
& nbsp ; < a href = "" title = "取消" @ click . prevent = "cancel" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< p class = "comment" > 支持普通域名 ( < code - label > example . com < / c o d e - l a b e l > ) 、 泛 域 名 ( < c o d e - l a b e l > * . e x a m p l e . c o m < / c o d e - l a b e l > ) 、 域 名 后 缀 ( 以 点 号 开 头 , 如 < c o d e - l a b e l > . e x a m p l e . c o m < / c o d e - l a b e l > ) 和 正 则 表 达 式 ( 以 波 浪 号 开 头 , 如 < c o d e - l a b e l > ~ . * . e x a m p l e . c o m < / c o d e - l a b e l > ) 。 < / p >
< div class = "ui divider" > < / d i v >
< / d i v >
< div style = "margin-top: 0.5em" v - if = "!isAdding" >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - r e d i r e c t - t o - h t t p s - b o x " , { p r o p s : [ " v - r e d i r e c t - t o - h t t p s - c o n f i g " , " v - i s - l o c a t i o n " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R e d i r e c t T o H t t p s C o n f i g ; r e t u r n n u l l = = e ? e = { i s P r i o r : ! 1 , i s O n : ! 1 , h o s t : " " , p o r t : 0 , s t a t u s : 0 , o n l y D o m a i n s : [ ] , e x c e p t D o m a i n s : [ ] } : ( n u l l = = e . o n l y D o m a i n s & & ( e . o n l y D o m a i n s = [ ] ) , n u l l = = e . e x c e p t D o m a i n s & & ( e . e x c e p t D o m a i n s = [ ] ) ) , { r e d i r e c t T o H t t p s C o n f i g : e , p o r t S t r i n g : 0 < e . p o r t ? e . p o r t . t o S t r i n g ( ) : " " , m o r e O p t i o n s V i s i b l e : ! 1 , s t a t u s O p t i o n s : [ { c o d e : 3 0 1 , t e x t : " M o v e d P e r m a n e n t l y " } , { c o d e : 3 0 8 , t e x t : " P e r m a n e n t R e d i r e c t " } , { c o d e : 3 0 2 , t e x t : " F o u n d " } , { c o d e : 3 0 3 , t e x t : " S e e O t h e r " } , { c o d e : 3 0 7 , t e x t : " T e m p o r a r y R e d i r e c t " } ] } } , w a t c h : { " r e d i r e c t T o H t t p s C o n f i g . s t a t u s " : f u n c t i o n ( ) { t h i s . r e d i r e c t T o H t t p s C o n f i g . s t a t u s = p a r s e I n t ( t h i s . r e d i r e c t T o H t t p s C o n f i g . s t a t u s ) } , p o r t S t r i n g : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) ; i s N a N ( e ) ? t h i s . r e d i r e c t T o H t t p s C o n f i g . p o r t = 0 : t h i s . r e d i r e c t T o H t t p s C o n f i g . p o r t = e } } , m e t h o d s : { c h a n g e M o r e O p t i o n s : f u n c t i o n ( e ) { t h i s . m o r e O p t i o n s V i s i b l e = e } , c h a n g e O n l y D o m a i n s : f u n c t i o n ( e ) { t h i s . r e d i r e c t T o H t t p s C o n f i g . o n l y D o m a i n s = e , t h i s . $ f o r c e U p d a t e ( ) } , c h a n g e E x c e p t D o m a i n s : f u n c t i o n ( e ) { t h i s . r e d i r e c t T o H t t p s C o n f i g . e x c e p t D o m a i n s = e , t h i s . $ f o r c e U p d a t e ( ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "redirectToHTTPSJSON" : value = "JSON.stringify(redirectToHttpsConfig)" / >
<!-- Location -- >
< table class = "ui table selectable definition" v - if = "vIsLocation" >
< prior - checkbox : v - config = "redirectToHttpsConfig" > < / p r i o r - c h e c k b o x >
< tbody v - show = "redirectToHttpsConfig.isPrior" >
< tr >
< td class = "title" > 自动跳转到HTTPS < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "redirectToHttpsConfig.isOn" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 开启后 , 所有HTTP的请求都会自动跳转到对应的HTTPS URL上 , < more - options - angle @ change = "changeMoreOptions" > < / m o r e - o p t i o n s - a n g l e > < / p >
<!-- TODO 如果已经设置了特殊设置 , 需要在界面上显示 -- >
< table class = "ui table" v - show = "moreOptionsVisible" >
< tr >
< td class = "title" > 状态码 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "redirectToHttpsConfig.status" >
< option value = "0" > [ 使用默认 ] < / o p t i o n >
< option v - for = "option in statusOptions" : value = "option.code" > { { option . code } } { { option . text } } < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< tr >
< td > 域名或IP地址 < / t d >
< td >
< input type = "text" name = "host" v - model = "redirectToHttpsConfig.host" / >
< p class = "comment" > 默认和用户正在访问的域名或IP地址一致 。 < / p >
< / t d >
< / t r >
< tr >
< td > 端口 < / t d >
< td >
< input type = "text" name = "port" v - model = "portString" maxlength = "5" style = "width:6em" / >
< p class = "comment" > 默认端口为443 。 < / p >
< / t d >
< / t r >
< / t a b l e >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
<!-- 非Location -- >
< div v - if = "!vIsLocation" >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "redirectToHttpsConfig.isOn" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 开启后 , 所有HTTP的请求都会自动跳转到对应的HTTPS URL上 , < more - options - angle @ change = "changeMoreOptions" > < / m o r e - o p t i o n s - a n g l e > < / p >
<!-- TODO 如果已经设置了特殊设置 , 需要在界面上显示 -- >
< table class = "ui table" v - show = "moreOptionsVisible" >
< tr >
< td class = "title" > 状态码 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "redirectToHttpsConfig.status" >
< option value = "0" > [ 使用默认 ] < / o p t i o n >
< option v - for = "option in statusOptions" : value = "option.code" > { { option . code } } { { option . text } } < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< tr >
< td > 跳转后域名或IP地址 < / t d >
< td >
< input type = "text" name = "host" v - model = "redirectToHttpsConfig.host" / >
< p class = "comment" > 默认和用户正在访问的域名或IP地址一致 , 不填写就表示使用当前的域名 。 < / p >
< / t d >
< / t r >
< tr >
< td > 端口 < / t d >
< td >
< input type = "text" name = "port" v - model = "portString" maxlength = "5" style = "width:6em" / >
< p class = "comment" > 默认端口为443 。 < / p >
< / t d >
< / t r >
< tr >
< td > 允许的域名 < / t d >
< td >
< values - box : values = "redirectToHttpsConfig.onlyDomains" @ change = "changeOnlyDomains" > < / v a l u e s - b o x >
< p class = "comment" > 如果填写了允许的域名 , 那么只有这些域名可以自动跳转 。 < / p >
< / t d >
< / t r >
< tr >
< td > 排除的域名 < / t d >
< td >
< values - box : values = "redirectToHttpsConfig.exceptDomains" @ change = "changeExceptDomains" > < / v a l u e s - b o x >
< p class = "comment" > 如果填写了排除的域名 , 那么这些域名将不跳转 。 < / p >
< / t d >
< / t r >
< / t a b l e >
< / d i v >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - f i r e w a l l - a c t i o n s - b o x " , { p r o p s : [ " v - a c t i o n s " , " v - f i r e w a l l - p o l i c y " , " v - a c t i o n - c o n f i g s " ] , m o u n t e d : f u n c t i o n ( ) { l e t o = t h i s ; T e a . a c t i o n ( " / s e r v e r s / i p l i s t s / l e v e l O p t i o n s " ) . s u c c e s s ( f u n c t i o n ( e ) { o . i p L i s t L e v e l s = e . d a t a . l e v e l s } ) . p o s t ( ) , t h i s . l o a d J S ( f u n c t i o n ( ) { l e t n = d o c u m e n t . g e t E l e m e n t B y I d ( " a c t i o n s - b o x " ) ; S o r t a b l e . c r e a t e ( n , { d r a g g a b l e : " . l a b e l " , h a n d l e : " . i c o n . h a n d l e " , o n S t a r t : f u n c t i o n ( ) { o . c a n c e l ( ) } , o n U p d a t e : f u n c t i o n ( e ) { l e t t = n . g e t E l e m e n t s B y C l a s s N a m e ( " l a b e l " ) , i = [ ] ; f o r ( l e t e = 0 ; e < t . l e n g t h ; e + + ) { v a r s = p a r s e I n t ( t [ e ] . g e t A t t r i b u t e ( " d a t a - i n d e x " ) ) ; i . p u s h ( o . c o n f i g s [ s ] ) } o . c o n f i g s = i } } ) } ) } , d a t a : f u n c t i o n ( ) { n u l l = = t h i s . v F i r e w a l l P o l i c y . i n b o u n d & & ( t h i s . v F i r e w a l l P o l i c y . i n b o u n d = { } ) , n u l l = = t h i s . v F i r e w a l l P o l i c y . i n b o u n d . g r o u p s & & ( t h i s . v F i r e w a l l P o l i c y . i n b o u n d . g r o u p s = [ ] ) ; l e t t = 0 , e = [ ] ; n u l l ! = t h i s . v A c t i o n C o n f i g s & & ( e = t h i s . v A c t i o n C o n f i g s ) . f o r E a c h ( f u n c t i o n ( e ) { e . i d = t + + } ) ; v a r i = ` < ! D O C T Y P E h t m l >
2021-11-22 12:08:53 +08:00
< html >
2021-12-05 20:59:07 +08:00
< title > 403 Forbidden < / t i t l e >
2021-11-22 12:08:53 +08:00
< body >
2021-12-05 20:59:07 +08:00
< h1 > 403 Forbidden < / h 1 >
< address > Request ID : \ $ { requestId } . < / a d d r e s s >
2021-11-22 12:08:53 +08:00
< / b o d y >
2022-04-08 21:24:54 +08:00
< / h t m l > ` ; r e t u r n { i d : t , a c t i o n s : t h i s . v A c t i o n s , c o n f i g s : e , i s A d d i n g : ! 1 , e d i t i n g I n d e x : - 1 , a c t i o n : n u l l , a c t i o n C o d e : " " , a c t i o n O p t i o n s : { } , i p L i s t L e v e l s : [ ] , b l o c k T i m e o u t : " " , b l o c k S c o p e : " g l o b a l " , c a p t c h a L i f e : " " , c a p t c h a M a x F a i l s : " " , c a p t c h a F a i l B l o c k T i m e o u t : " " , g e t 3 0 2 L i f e : " " , p o s t 3 0 7 L i f e : " " , r e c o r d I P T y p e : " b l a c k " , r e c o r d I P L e v e l : " c r i t i c a l " , r e c o r d I P T i m e o u t : " " , r e c o r d I P L i s t I d : 0 , r e c o r d I P L i s t N a m e : " " , t a g T a g s : [ ] , p a g e S t a t u s : 4 0 3 , p a g e B o d y : i , d e f a u l t P a g e B o d y : i , g o G r o u p N a m e : " " , g o G r o u p I d : 0 , g o G r o u p : n u l l , g o S e t I d : 0 , g o S e t N a m e : " " } } , w a t c h : { a c t i o n C o d e : f u n c t i o n ( i ) { t h i s . a c t i o n = t h i s . a c t i o n s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . c o d e = = i } ) , t h i s . a c t i o n O p t i o n s = { } } , b l o c k T i m e o u t : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) , i s N a N ( e ) ? t h i s . a c t i o n O p t i o n s . t i m e o u t = 0 : t h i s . a c t i o n O p t i o n s . t i m e o u t = e } , b l o c k S c o p e : f u n c t i o n ( e ) { t h i s . a c t i o n O p t i o n s . s c o p e = e } , c a p t c h a L i f e : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) , i s N a N ( e ) ? t h i s . a c t i o n O p t i o n s . l i f e = 0 : t h i s . a c t i o n O p t i o n s . l i f e = e } , c a p t c h a M a x F a i l s : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) , i s N a N ( e ) ? t h i s . a c t i o n O p t i o n s . m a x F a i l s = 0 : t h i s . a c t i o n O p t i o n s . m a x F a i l s = e } , c a p t c h a F a i l B l o c k T i m e o u t : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) , i s N a N ( e ) ? t h i s . a c t i o n O p t i o n s . f a i l B l o c k T i m e o u t = 0 : t h i s . a c t i o n O p t i o n s . f a i l B l o c k T i m e o u t = e } , g e t 3 0 2 L i f e : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) , i s N a N ( e ) ? t h i s . a c t i o n O p t i o n s . l i f e = 0 : t h i s . a c t i o n O p t i o n s . l i f e = e } , p o s t 3 0 7 L i f e : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) , i s N a N ( e ) ? t h i s . a c t i o n O p t i o n s . l i f e = 0 : t h i s . a c t i o n O p t i o n s . l i f e = e } , r e c o r d I P T y p e : f u n c t i o n ( e ) { t h i s . r e c o r d I P L i s t I d = 0 } , r e c o r d I P T i m e o u t : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) , i s N a N ( e ) ? t h i s . a c t i o n O p t i o n s . t i m e o u t = 0 : t h i s . a c t i o n O p t i o n s . t i m e o u t = e } , g o G r o u p I d : f u n c t i o n ( i ) { v a r e = t h i s . v F i r e w a l l P o l i c y . i n b o u n d . g r o u p s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . i d = = i } ) ; t h i s . g o G r o u p = e , t h i s . g o G r o u p N a m e = n u l l = = e ? " " : e . n a m e , t h i s . g o S e t I d = 0 , t h i s . g o S e t N a m e = " " } , g o S e t I d : f u n c t i o n ( i ) { v a r e ; n u l l ! = t h i s . g o G r o u p & & ( n u l l = = ( e = t h i s . g o G r o u p . s e t s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . i d = = i } ) ) ? ( t h i s . g o S e t I d = 0 , t h i s . g o S e t N a m e = " " ) : t h i s . g o S e t N a m e = e . n a m e ) } } , m e t h o d s : { a d d : f u n c t i o n ( ) { t h i s . a c t i o n = n u l l , t h i s . a c t i o n C o d e = " b l o c k " , t h i s . i s A d d i n g = ! 0 , t h i s . a c t i o n O p t i o n s = { } , t h i s . b l o c k T i m e o u t = " " , t h i s . b l o c k S c o p e = " g l o b a l " , t h i s . c a p t c h a L i f e = " " , t h i s . c a p t c h a M a x F a i l s = " " , t h i s . c a p t c h a F a i l B l o c k T i m e o u t = " " , t h i s . g e t 3 0 2 L i f e = " " , t h i s . p o s t 3 0 7 L i f e = " " , t h i s . r e c o r d I P L e v e l = " c r i t i c a l " , t h i s . r e c o r d I P T y p e = " b l a c k " , t h i s . r e c o r d I P T i m e o u t = " " , t h i s . r e c o r d I P L i s t I d = 0 , t h i s . r e c o r d I P L i s t N a m e = " " , t h i s . t a g T a g s = [ ] , t h i s . p a g e S t a t u s = 4 0 3 , t h i s . p a g e B o d y = t h i s . d e f a u l t P a g e B o d y , t h i s . g o G r o u p N a m e = " " , t h i s . g o G r o u p I d = 0 , t h i s . g o G r o u p = n u l l , t h i s . g o S e t I d = 0 , t h i s . g o S e t N a m e = " " ; l e t i = t h i s ; t h i s . a c t i o n = t h i s . v A c t i o n s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . c o d e = = i . a c t i o n C o d e } ) , t h i s . s c r o l l ( ) } , r e m o v e : f u n c t i o n ( e ) { t h i s . i s A d d i n g = ! 1 , t h i s . e d i t i n g I n d e x = - 1 , t h i s . c o n f i g s . $ r e m o v e ( e ) } , u p d a t e : f u n c t i o n ( e , i ) { i f ( t h i s . i s A d d i n g & & t h i s . e d i t i n g I n d e x = = e ) t h i s . c a n c e l ( ) ; e l s e { s w i t c h ( t h i s . a d d ( ) , t h i s . i s A d d i n g = ! 0 , t h i s . e d i t i n g I n d e x = e , t h i s . a c t i o n C o d e = i . c o d e , i . c o d e ) { c a s e " b l o c k " : t h i s . b l o c k T i m e o u t = " " , ( n u l l ! = i . o p t i o n s . t i m e o u t | | 0 < i . o p t i o n s . t i m e o u t ) & & ( t h i s . b l o c k T i m e o u t = i . o p t i o n s . t i m e o u t . t o S t r i n g ( ) ) , n u l l ! = i . o p t i o n s . s c o p e & & 0 < i . o p t i o n s . s c o p e . l e n g t h ? t h i s . b l o c k S c o p e = i . o p t i o n s . s c o p e : t h i s . b l o c k S c o p e = " g l o b a l " ; b r e a k ; c a s e " a l l o w " : c a s e " l o g " : b r e a k ; c a s e " c a p t c h a " : t h i s . c a p t c h a L i f e = " " , ( n u l l ! = i . o p t i o n s . l i f e | | 0 < i . o p t i o n s . l i f e ) & & ( t h i s . c a p t c h a L i f e = i . o p t i o n s . l i f e . t o S t r i n g ( ) ) , t h i s . c a p t c h a M a x F a i l s = " " , ( n u l l ! = i . o p t i o n s . m a x F a i l s | | 0 < i . o p t i o n s . m a x F a i l s ) & & ( t h i s . c a p t c h a M a x F a i l s = i . o p t i o n s . m a x F a i l s . t o S t r i n g ( ) ) , t h i s . c a p t c h a F a i l B l o c k T i m e o u t = " " , ( n u l l ! = i . o p t i o n s . f a i l B l o c k T i m e o u t | | 0 < i . o p t i o n s . f a i l B l o c k T i m e o u t ) & & ( t h i s . c a p t c h a F a i l B l o c k T i m e o u t = i . o p t i o n s . f a i l B l o c k T i m e o u t . t o S t r i n g ( ) ) ; b r e a k ; c a s e " n o t i f y " : b r e a k ; c a s e " g e t _ 3 0 2 " : t h i s . g e t 3 0 2 L i f e = " " , ( n u l l ! = i . o p t i o n s . l i f e | | 0 < i . o p t i o n s . l i f e ) & & ( t h i s . g e t 3 0 2 L i f e = i . o p t i o n s . l i f e . t o S t r i n g ( ) ) ; b r e a k ; c a s e " p o s t _ 3 0 7 " : t h i s . p o s t 3 0 7 L i f e = " " , ( n u l l ! = i . o p t i o n s . l i f e | | 0 < i . o p t i o n s . l i f e ) & & ( t h i s . p o s t 3 0 7 L i f e = i . o p t i o n s . l i f e . t o S t r i n g ( ) ) ; b r e a k ; c a s e " r e c o r d _ i p " : i f ( n u l l ! = i . o p t i o n s ) { t h i s . r e c o r d I P L e v e l = i . o p t i o n s . l e v e l , t h i s . r e c o r d I P T y p e = i . o p t i o n s . t y p e , 0 < i . o p t i o n s . t i m e o u t & & ( t h i s . r e c o r d I P T i m e o u t = i . o p t i o n s . t i m e o u t . t o S t r i n g ( ) ) ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . r e c o r d I P L i s t I d = i . o p t i o n s . i p L i s t I d , e . r e c o r d I P L i s t N a m e = i . o p t i o n s . i p L i s t N a m e } ) } b r e a k ; c a s e " t a g " : t h i s . t a g T a g s = [ ] , n u l l ! = i . o p t i o n s . t a g s & & ( t h i s . t a g T a g s = i . o p t i o n s . t a g s ) ; b r e a k ; c a s e " p a g e " : t h i s . p a g e S t a t u s = 4 0 3
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "actionsJSON" : value = "JSON.stringify(configs)" / >
< div v - show = "configs.length > 0" style = "margin-bottom: 0.5em" id = "actions-box" >
< div v - for = "(config, index) in configs" : data - index = "index" : key = "config.id" class = "ui label small basic" : class = "{blue: index == editingIndex}" style = "margin-bottom: 0.4em" >
{ { config . name } } < span class = "small" > ( { { config . code . toUpperCase ( ) } } ) < / s p a n >
<!-- block -- >
< span v - if = "config.code == 'block' && config.options.timeout > 0" > : 有效期 { { config . options . timeout } } 秒 < / s p a n >
<!-- captcha -- >
2022-05-20 22:07:04 +08:00
< span v - if = "config.code == 'captcha' && config.options.life > 0" > : 有效期 { { config . options . life } } 秒
< span v - if = "config.options.maxFails > 0" > / 最 多 失 败 { { c o n f i g . o p t i o n s . m a x F a i l s } } 次 < / s p a n >
< / s p a n >
2021-11-22 12:08:53 +08:00
<!-- get 302 -- >
< span v - if = "config.code == 'get_302' && config.options.life > 0" > : 有效期 { { config . options . life } } 秒 < / s p a n >
<!-- post 307 -- >
< span v - if = "config.code == 'post_307' && config.options.life > 0" > : 有效期 { { config . options . life } } 秒 < / s p a n >
<!-- record _ip -- >
< span v - if = "config.code == 'record_ip'" > : { { config . options . ipListName } } < / s p a n >
<!-- tag -- >
< span v - if = "config.code == 'tag'" > : { { config . options . tags . join ( ", " ) } } < / s p a n >
<!-- page -- >
< span v - if = "config.code == 'page'" > : [ { { config . options . status } } ] < / s p a n >
<!-- go _group -- >
< span v - if = "config.code == 'go_group'" > : { { config . options . groupName } } < / s p a n >
<!-- go _set -- >
< span v - if = "config.code == 'go_set'" > : { { config . options . groupName } } / { { config . options . setName } } < / s p a n >
<!-- 范围 -- >
< span v - if = "config.options.scope != null && config.options.scope.length > 0" class = "small grey" >
& nbsp ;
< span v - if = "config.options.scope == 'global'" > [ 所有服务 ] < / s p a n >
< span v - if = "config.options.scope == 'service'" > [ 当前服务 ] < / s p a n >
< / s p a n >
<!-- 操作按钮 -- >
& nbsp ; < a href = "" title = "修改" @ click . prevent = "update(index, config)" > < i class = "icon pencil small" > < / i > < / a > & n b s p ; < a h r e f = " " t i t l e = " 删 除 " @ c l i c k . p r e v e n t = " r e m o v e ( i n d e x ) " > < i c l a s s = " i c o n r e m o v e s m a l l " > < / i > < / a > & n b s p ; < a h r e f = " " t i t l e = " 拖 动 改 变 顺 序 " > < i c l a s s = " i c o n b a r s h a n d l e " > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div style = "margin-bottom: 0.5em" v - if = "isAdding" >
< table class = "ui table" : class = "{blue: editingIndex > -1}" >
< tr >
< td class = "title" > 动作类型 * < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "actionCode" >
< option v - for = "action in actions" : value = "action.code" > { { action . name } } ( { { action . code . toUpperCase ( ) } } ) < / o p t i o n >
< / s e l e c t >
< p class = "comment" v - if = "action != null && action.description.length > 0" > { { action . description } } < / p >
< / t d >
< / t r >
<!-- block -- >
< tr v - if = "actionCode == 'block'" >
< td > 封锁时间 < / t d >
< td >
< div class = "ui input right labeled" >
2022-01-05 15:54:22 +08:00
< input type = "text" style = "width: 5em" maxlength = "9" v - model = "blockTimeout" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
2021-11-22 12:08:53 +08:00
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
< / t d >
< / t r >
< tr v - if = "actionCode == 'block'" >
< td > 封锁范围 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "blockScope" >
< option value = "service" > 当前服务 < / o p t i o n >
< option value = "global" > 所有服务 < / o p t i o n >
< / s e l e c t >
2022-03-14 16:24:09 +08:00
< p class = "comment" v - if = "blockScope == 'service'" > 只封锁用户对当前网站服务的访问 , 其他服务不受影响 。 < / p >
< p class = "comment" v - if = "blockScope =='global'" > 封锁用户对所有网站服务的访问 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
<!-- captcha -- >
< tr v - if = "actionCode == 'captcha'" >
< td > 有效时间 < / t d >
< td >
< div class = "ui input right labeled" >
2022-01-05 15:54:22 +08:00
< input type = "text" style = "width: 5em" maxlength = "9" v - model = "captchaLife" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
2021-11-22 12:08:53 +08:00
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
2022-05-21 20:00:39 +08:00
< p class = "comment" > 验证通过后在这个时间内不再验证 ; 如果为空或者为0表示默认 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
2022-01-16 16:54:20 +08:00
< tr v - if = "actionCode == 'captcha'" >
< td > 最多失败次数 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" style = "width: 5em" maxlength = "9" v - model = "captchaMaxFails" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
< span class = "ui label" > 次 < / s p a n >
< / d i v >
2022-05-21 20:00:39 +08:00
< p class = "comment" > 允许用户失败尝试的最多次数 , 超过这个次数将被自动加入黑名单 ; 如果为空或者为0表示默认 。 < / p >
2022-01-16 16:54:20 +08:00
< / t d >
< / t r >
< tr v - if = "actionCode == 'captcha'" >
< td > 失败拦截时间 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" style = "width: 5em" maxlength = "9" v - model = "captchaFailBlockTimeout" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
2022-05-21 20:00:39 +08:00
< p class = "comment" > 在达到最多失败次数 ( 大于0 ) 时 , 自动拦截的时间 ; 如果为空或者为0表示默认 。 < / p >
2022-01-16 16:54:20 +08:00
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
<!-- get _302 -- >
< tr v - if = "actionCode == 'get_302'" >
< td > 有效时间 < / t d >
< td >
< div class = "ui input right labeled" >
2022-01-05 15:54:22 +08:00
< input type = "text" style = "width: 5em" maxlength = "9" v - model = "get302Life" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
2021-11-22 12:08:53 +08:00
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
< p class = "comment" > 验证通过后在这个时间内不再验证 。 < / p >
< / t d >
< / t r >
<!-- post _307 -- >
< tr v - if = "actionCode == 'post_307'" >
< td > 有效时间 < / t d >
< td >
< div class = "ui input right labeled" >
2022-01-05 15:54:22 +08:00
< input type = "text" style = "width: 5em" maxlength = "9" v - model = "post307Life" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
2021-11-22 12:08:53 +08:00
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
< p class = "comment" > 验证通过后在这个时间内不再验证 。 < / p >
< / t d >
< / t r >
<!-- record _ip -- >
< tr v - if = "actionCode == 'record_ip'" >
< td > IP名单类型 * < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "recordIPType" >
< option value = "black" > 黑名单 < / o p t i o n >
< option value = "white" > 白名单 < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< tr v - if = "actionCode == 'record_ip'" >
< td > 选择IP名单 * < / t d >
< td >
< div v - if = "recordIPListId > 0" class = "ui label basic small" > { { recordIPListName } } < a href = "" @ click . prevent = "removeRecordIPList" > < i class = "icon remove small" > < / i > < / a > < / d i v >
< button type = "button" class = "ui button tiny" @ click . prevent = "selectRecordIPList" > + < / b u t t o n >
< p class = "comment" > 如不选择 , 则自动添加到当前策略的IP名单中 。 < / p >
< / t d >
< / t r >
< tr v - if = "actionCode == 'record_ip'" >
< td > 级别 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "recordIPLevel" >
< option v - for = "level in ipListLevels" : value = "level.code" > { { level . name } } < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< tr v - if = "actionCode == 'record_ip'" >
< td > 超时时间 < / t d >
< td >
< div class = "ui input right labeled" >
2022-01-05 15:54:22 +08:00
< input type = "text" style = "width: 6em" maxlength = "9" v - model = "recordIPTimeout" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
2021-11-22 12:08:53 +08:00
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
< p class = "comment" > 0 表示不超时 。 < / p >
< / t d >
< / t r >
<!-- tag -- >
< tr v - if = "actionCode == 'tag'" >
< td > 标签 * < / t d >
< td >
< values - box @ change = "changeTags" : values = "tagTags" > < / v a l u e s - b o x >
< / t d >
< / t r >
<!-- page -- >
< tr v - if = "actionCode == 'page'" >
< td > 状态码 * < / t d >
< td > < input type = "text" style = "width: 4em" maxlength = "3" v - model = "pageStatus" / > < / t d >
< / t r >
< tr v - if = "actionCode == 'page'" >
< td > 网页内容 < / t d >
< td >
< textarea v - model = "pageBody" > < / t e x t a r e a >
< / t d >
< / t r >
<!-- 规则分组 -- >
< tr v - if = "actionCode == 'go_group'" >
< td > 下一个分组 * < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "goGroupId" >
< option value = "0" > [ 选择分组 ] < / o p t i o n >
< option v - for = "group in vFirewallPolicy.inbound.groups" : value = "group.id" > { { group . name } } < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
<!-- 规则集 -- >
< tr v - if = "actionCode == 'go_set'" >
< td > 下一个分组 * < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "goGroupId" >
< option value = "0" > [ 选择分组 ] < / o p t i o n >
< option v - for = "group in vFirewallPolicy.inbound.groups" : value = "group.id" > { { group . name } } < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< tr v - if = "actionCode == 'go_set' && goGroup != null" >
< td > 下一个规则集 * < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "goSetId" >
< option value = "0" > [ 选择规则集 ] < / o p t i o n >
< option v - for = "set in goGroup.sets" : value = "set.id" > { { set . name } } < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< / t a b l e >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirm" > 确定 < / b u t t o n > & n b s p ;
< a href = "" @ click . prevent = "cancel" title = "取消" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< div v - if = "!isAdding" >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
< p class = "comment" > 系统总是会先执行记录日志 、 标签等不会修改请求的动作 , 再执行阻止 、 验证码等可能改变请求的动作 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - a u t h - c o n f i g - b o x " , { p r o p s : [ " v - a u t h - c o n f i g " , " v - i s - l o c a t i o n " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v A u t h C o n f i g ; r e t u r n n u l l = = ( e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 } : e ) . p o l i c y R e f s & & ( e . p o l i c y R e f s = [ ] ) , { a u t h C o n f i g : e } } , m e t h o d s : { i s O n : f u n c t i o n ( ) { r e t u r n ( ! t h i s . v I s L o c a t i o n | | t h i s . a u t h C o n f i g . i s P r i o r ) & & t h i s . a u t h C o n f i g . i s O n } , a d d : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / a c c e s s / c r e a t e P o p u p " , { c a l l b a c k : f u n c t i o n ( e ) { t . a u t h C o n f i g . p o l i c y R e f s . p u s h ( e . d a t a . p o l i c y R e f ) } , h e i g h t : " 2 8 e m " } ) } , u p d a t e : f u n c t i o n ( e , t ) { t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / a c c e s s / u p d a t e P o p u p ? p o l i c y I d = " + t , { c a l l b a c k : f u n c t i o n ( e ) { t e a w e b . s u c c e s s ( " 保 存 成 功 " , f u n c t i o n ( ) { t e a w e b . r e l o a d ( ) } ) } , h e i g h t : " 2 8 e m " } ) } , r e m o v e : f u n c t i o n ( e ) { t h i s . a u t h C o n f i g . p o l i c y R e f s . $ r e m o v e ( e ) } , m e t h o d N a m e : f u n c t i o n ( e ) { s w i t c h ( e ) { c a s e " b a s i c A u t h " : r e t u r n " B a s i c A u t h " ; c a s e " s u b R e q u e s t " : r e t u r n " 子 请 求 " } r e t u r n " " } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "authJSON" : value = "JSON.stringify(authConfig)" / >
< table class = "ui table selectable definition" >
< prior - checkbox : v - config = "authConfig" v - if = "vIsLocation" > < / p r i o r - c h e c k b o x >
< tbody v - show = "!vIsLocation || authConfig.isPrior" >
< tr >
< td class = "title" > 启用认证 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "authConfig.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
<!-- 认证方式 -- >
< div v - show = "isOn()" >
< h4 > 认证方式 < / h 4 >
< table class = "ui table selectable celled" v - show = "authConfig.policyRefs.length > 0" >
< thead >
< tr >
< th class = "three wide" > 名称 < / t h >
< th class = "three wide" > 认证方法 < / t h >
< th > 参数 < / t h >
< th class = "two wide" > 状态 < / t h >
< th class = "two op" > 操作 < / t h >
< / t r >
< / t h e a d >
< tbody v - for = "(ref, index) in authConfig.policyRefs" : key = "ref.authPolicyId" >
< tr >
< td > { { ref . authPolicy . name } } < / t d >
< td >
{ { methodName ( ref . authPolicy . type ) } }
< / t d >
< td >
< span v - if = "ref.authPolicy.type == 'basicAuth'" > { { ref . authPolicy . params . users . length } } 个用户 < / s p a n >
< span v - if = "ref.authPolicy.type == 'subRequest'" >
< span v - if = "ref.authPolicy.params.method.length > 0" class = "grey" > [ { { ref . authPolicy . params . method } } ] < / s p a n >
{ { ref . authPolicy . params . url } }
< / s p a n >
< / t d >
< td >
< label - on : v - is - on = "ref.authPolicy.isOn" > < / l a b e l - o n >
< / t d >
< td >
< a href = "" @ click . prevent = "update(index, ref.authPolicyId)" > 修改 < / a > & n b s p ;
< a href = "" @ click . prevent = "remove(index)" > 删除 < / a >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< button class = "ui button small" type = "button" @ click . prevent = "add" > + 添加认证方式 < / b u t t o n >
< / d i v >
< div class = "margin" > < / d i v >
2022-08-08 16:26:12 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " u s e r - s e l e c t o r " , { p r o p s : [ " v - u s e r - i d " , " d a t a - u r l " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v U s e r I d , t = ( n u l l = = e & & ( e = 0 ) , t h i s . d a t a U r l ) ; r e t u r n n u l l ! = t & & 0 ! = t . l e n g t h | | ( t = " / s e r v e r s / u s e r s / o p t i o n s " ) , { u s e r s : [ ] , u s e r I d : e , d a t a U R L : t } } , m e t h o d s : { c h a n g e : f u n c t i o n ( e ) { n u l l ! = e ? t h i s . $ e m i t ( " c h a n g e " , e . i d ) : t h i s . $ e m i t ( " c h a n g e " , 0 ) } } , t e m p l a t e : ` < d i v >
< combo - box placeholder = "选择用户" : data - url = "dataURL" : data - key = "'users'" data - search = "on" name = "userId" : v - value = "userId" @ change = "change" > < / c o m b o - b o x >
2022-05-05 11:25:23 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " u a m - c o n f i g - b o x " , { p r o p s : [ " v - u a m - c o n f i g " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v U a m C o n f i g ; r e t u r n { c o n f i g : e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 } : e } } , t e m p l a t e : ` < d i v >
2022-03-29 21:25:33 +08:00
< input type = "hidden" name = "uamJSON" : value = "JSON.stringify(config)" / >
< table class = "ui table definition selectable" >
2022-05-05 11:25:23 +08:00
< prior - checkbox : v - config = "config" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "((!vIsLocation && !vIsGroup) || config.isPrior)" >
< tr >
< td class = "title" > 启用5秒盾 < / t d >
< td >
< checkbox v - model = "config.isOn" > < / c h e c k b o x >
< p class = "comment" > < plus - label > < / p l u s - l a b e l > 启 用 后 , 访 问 网 站 时 , 自 动 检 查 浏 览 器 环 境 , 阻 止 非 正 常 访 问 。 < / p >
< / t d >
< / t r >
< / t b o d y >
2022-03-29 21:25:33 +08:00
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - h e a d e r - p o l i c y - b o x " , { p r o p s : [ " v - r e q u e s t - h e a d e r - p o l i c y " , " v - r e q u e s t - h e a d e r - r e f " , " v - r e s p o n s e - h e a d e r - p o l i c y " , " v - r e s p o n s e - h e a d e r - r e f " , " v - p a r a m s " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " , " v - h a s - g r o u p - r e q u e s t - c o n f i g " , " v - h a s - g r o u p - r e s p o n s e - c o n f i g " , " v - g r o u p - s e t t i n g - u r l " ] , d a t a : f u n c t i o n ( ) { l e t e = " r e s p o n s e " ; " # r e q u e s t " = = w i n d o w . l o c a t i o n . h a s h & & ( e = " r e q u e s t " ) ; l e t t = t h i s . v R e q u e s t H e a d e r R e f , i = ( n u l l = = t & & ( t = { i s P r i o r : ! 1 , i s O n : ! 0 , h e a d e r P o l i c y I d : 0 } ) , t h i s . v R e s p o n s e H e a d e r R e f ) , s = ( n u l l = = i & & ( i = { i s P r i o r : ! 1 , i s O n : ! 0 , h e a d e r P o l i c y I d : 0 } ) , [ ] ) , n = [ ] ; v a r o = t h i s . v R e q u e s t H e a d e r P o l i c y ; n u l l ! = o & & ( n u l l ! = o . s e t H e a d e r s & & ( s = o . s e t H e a d e r s ) , n u l l ! = o . d e l e t e H e a d e r s & & ( n = o . d e l e t e H e a d e r s ) ) ; l e t a = [ ] , l = [ ] ; o = t h i s . v R e s p o n s e H e a d e r P o l i c y ; r e t u r n n u l l ! = o & & ( n u l l ! = o . s e t H e a d e r s & & ( a = o . s e t H e a d e r s ) , n u l l ! = o . d e l e t e H e a d e r s & & ( l = o . d e l e t e H e a d e r s ) ) , { t y p e : e , t y p e N a m e : " r e q u e s t " = = e ? " 请 求 " : " 响 应 " , r e q u e s t H e a d e r R e f : t , r e s p o n s e H e a d e r R e f : i , r e q u e s t S e t t i n g H e a d e r s : s , r e q u e s t D e l e t i n g H e a d e r s : n , r e s p o n s e S e t t i n g H e a d e r s : a , r e s p o n s e D e l e t i n g H e a d e r s : l } } , m e t h o d s : { s e l e c t T y p e : f u n c t i o n ( e ) { t h i s . t y p e = e , w i n d o w . l o c a t i o n . h a s h = " # " + e , w i n d o w . l o c a t i o n . r e l o a d ( ) } , a d d S e t t i n g H e a d e r : f u n c t i o n ( e ) { t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / h e a d e r s / c r e a t e S e t P o p u p ? " + t h i s . v P a r a m s + " & h e a d e r P o l i c y I d = " + e + " & t y p e = " + t h i s . t y p e , { c a l l b a c k : f u n c t i o n ( ) { t e a w e b . s u c c e s s R e f r e s h ( " 保 存 成 功 " ) } } ) } , a d d D e l e t i n g H e a d e r : f u n c t i o n ( e , t ) { t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / h e a d e r s / c r e a t e D e l e t e P o p u p ? " + t h i s . v P a r a m s + " & h e a d e r P o l i c y I d = " + e + " & t y p e = " + t , { c a l l b a c k : f u n c t i o n ( ) { t e a w e b . s u c c e s s R e f r e s h ( " 保 存 成 功 " ) } } ) } , u p d a t e S e t t i n g P o p u p : f u n c t i o n ( e , t ) { t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / h e a d e r s / u p d a t e S e t P o p u p ? " + t h i s . v P a r a m s + " & h e a d e r P o l i c y I d = " + e + " & h e a d e r I d = " + t + " & t y p e = " + t h i s . t y p e , { c a l l b a c k : f u n c t i o n ( ) { t e a w e b . s u c c e s s R e f r e s h ( " 保 存 成 功 " ) } } ) } , d e l e t e D e l e t i n g H e a d e r : f u n c t i o n ( e , t ) { t e a w e b . c o n f i r m ( " 确 定 要 删 除 ' " + t + " ' 吗 ? " , f u n c t i o n ( ) { T e a . a c t i o n ( " / s e r v e r s / s e r v e r / s e t t i n g s / h e a d e r s / d e l e t e D e l e t i n g H e a d e r " ) . p a r a m s ( { h e a d e r P o l i c y I d : e , h e a d e r N a m e : t } ) . p o s t ( ) . r e f r e s h ( ) } ) } , d e l e t e H e a d e r : f u n c t i o n ( e , t , i ) { t e a w e b . c o n f i r m ( " 确 定 要 删 除 此 H e a d e r 吗 ? " , f u n c t i o n ( ) { t h i s . $ p o s t ( " / s e r v e r s / s e r v e r / s e t t i n g s / h e a d e r s / d e l e t e " ) . p a r a m s ( { h e a d e r P o l i c y I d : e , t y p e : t , h e a d e r I d : i } ) . r e f r e s h ( ) } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div class = "ui menu tabular small" >
< a class = "item" : class = "{active:type == 'response'}" @ click . prevent = "selectType('response')" > 响应Header < span v - if = "responseSettingHeaders.length > 0" > ( { { responseSettingHeaders . length } } ) < / s p a n > < / a >
2021-12-15 09:56:18 +08:00
< a class = "item" : class = "{active:type == 'request'}" @ click . prevent = "selectType('request')" > 请求Header < span v - if = "requestSettingHeaders.length > 0" > ( { { requestSettingHeaders . length } } ) < / s p a n > < / a >
2021-11-22 12:08:53 +08:00
< / d i v >
< div class = "margin" > < / d i v >
< input type = "hidden" name = "type" : value = "type" / >
<!-- 请求 -- >
< div v - if = "(vIsLocation || vIsGroup) && type == 'request'" >
< input type = "hidden" name = "requestHeaderJSON" : value = "JSON.stringify(requestHeaderRef)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "requestHeaderRef" > < / p r i o r - c h e c k b o x >
< / t a b l e >
< submit - btn > < / s u b m i t - b t n >
< / d i v >
< div v - if = "((!vIsLocation && !vIsGroup) || requestHeaderRef.isPrior) && type == 'request'" >
< div v - if = "vHasGroupRequestConfig" >
< div class = "margin" > < / d i v >
< warning - message > 由于已经在当前 < a : href = "vGroupSettingUrl + '#request'" > 服务分组 < / a > 中 进 行 了 对 应 的 配 置 , 在 这 里 的 配 置 将 不 会 生 效 。 < / w a r n i n g - m e s s a g e >
< / d i v >
< div : class = "{'opacity-mask': vHasGroupRequestConfig}" >
< h3 > 设置请求Header < a href = "" @ click . prevent = "addSettingHeader(vRequestHeaderPolicy.id)" > [ 添加新Header ] < / a > < / h 3 >
< p class = "comment" v - if = "requestSettingHeaders.length == 0" > 暂时还没有Header 。 < / p >
< table class = "ui table selectable celled" v - if = "requestSettingHeaders.length > 0" >
< thead >
< tr >
< th > 名称 < / t h >
< th > 值 < / t h >
< th class = "two op" > 操作 < / t h >
< / t r >
< / t h e a d >
< tr v - for = "header in requestSettingHeaders" >
2021-12-15 09:56:18 +08:00
< td class = "five wide" >
{ { header . name } }
< div >
< span v - if = "header.status != null && header.status.codes != null && !header.status.always" > < grey - label v - for = "code in header.status.codes" : key = "code" > { { code } } < / g r e y - l a b e l > < / s p a n >
< span v - if = "header.methods != null && header.methods.length > 0" > < grey - label v - for = "method in header.methods" : key = "method" > { { method } } < / g r e y - l a b e l > < / s p a n >
< span v - if = "header.domains != null && header.domains.length > 0" > < grey - label v - for = "domain in header.domains" : key = "domain" > { { domain } } < / g r e y - l a b e l > < / s p a n >
< grey - label v - if = "header.shouldAppend" > 附加 < / g r e y - l a b e l >
< grey - label v - if = "header.disableRedirect" > 跳转禁用 < / g r e y - l a b e l >
< grey - label v - if = "header.shouldReplace && header.replaceValues != null && header.replaceValues.length > 0" > 替换 < / g r e y - l a b e l >
< / d i v >
< / t d >
2021-11-22 12:08:53 +08:00
< td > { { header . value } } < / t d >
< td > < a href = "" @ click . prevent = "updateSettingPopup(vRequestHeaderPolicy.id, header.id)" > 修改 < / a > & n b s p ; < a h r e f = " " @ c l i c k . p r e v e n t = " d e l e t e H e a d e r ( v R e q u e s t H e a d e r P o l i c y . i d , ' s e t H e a d e r ' , h e a d e r . i d ) " > 删 除 < / a > < / t d >
< / t r >
< / t a b l e >
< h3 > 删除请求Header < / h 3 >
< p class = "comment" > 这里可以设置需要从请求中删除的Header 。 < / p >
< table class = "ui table definition selectable" >
< td class = "title" > 需要删除的Header < / t d >
< td >
< div v - if = "requestDeletingHeaders.length > 0" >
< div class = "ui label small basic" v - for = "headerName in requestDeletingHeaders" > { { headerName } } < a href = "" > < i class = "icon remove" title = "删除" @ click . prevent = "deleteDeletingHeader(vRequestHeaderPolicy.id, headerName)" > < / i > < / a > < / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< button class = "ui button small" type = "button" @ click . prevent = "addDeletingHeader(vRequestHeaderPolicy.id, 'request')" > + < / b u t t o n >
< / t d >
< / t a b l e >
< / d i v >
< / d i v >
<!-- 响应 -- >
< div v - if = "(vIsLocation || vIsGroup) && type == 'response'" >
< input type = "hidden" name = "responseHeaderJSON" : value = "JSON.stringify(responseHeaderRef)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "responseHeaderRef" > < / p r i o r - c h e c k b o x >
< / t a b l e >
< submit - btn > < / s u b m i t - b t n >
< / d i v >
2021-12-31 15:20:59 +08:00
< div v - if = "((!vIsLocation && !vIsGroup) || responseHeaderRef.isPrior) && type == 'response'" >
2021-11-22 12:08:53 +08:00
< div v - if = "vHasGroupResponseConfig" >
< div class = "margin" > < / d i v >
< warning - message > 由于已经在当前 < a : href = "vGroupSettingUrl + '#response'" > 服务分组 < / a > 中 进 行 了 对 应 的 配 置 , 在 这 里 的 配 置 将 不 会 生 效 。 < / w a r n i n g - m e s s a g e >
< / d i v >
< div : class = "{'opacity-mask': vHasGroupResponseConfig}" >
< h3 > 设置响应Header < a href = "" @ click . prevent = "addSettingHeader(vResponseHeaderPolicy.id)" > [ 添加新Header ] < / a > < / h 3 >
< p class = "comment" style = "margin-top: 0; padding-top: 0" > 将会覆盖已有的同名Header 。 < / p >
< p class = "comment" v - if = "responseSettingHeaders.length == 0" > 暂时还没有Header 。 < / p >
< table class = "ui table selectable celled" v - if = "responseSettingHeaders.length > 0" >
< thead >
< tr >
< th > 名称 < / t h >
< th > 值 < / t h >
< th class = "two op" > 操作 < / t h >
< / t r >
< / t h e a d >
< tr v - for = "header in responseSettingHeaders" >
2021-12-15 09:56:18 +08:00
< td class = "five wide" >
{ { header . name } }
< div >
< span v - if = "header.status != null && header.status.codes != null && !header.status.always" > < grey - label v - for = "code in header.status.codes" : key = "code" > { { code } } < / g r e y - l a b e l > < / s p a n >
< span v - if = "header.methods != null && header.methods.length > 0" > < grey - label v - for = "method in header.methods" : key = "method" > { { method } } < / g r e y - l a b e l > < / s p a n >
< span v - if = "header.domains != null && header.domains.length > 0" > < grey - label v - for = "domain in header.domains" : key = "domain" > { { domain } } < / g r e y - l a b e l > < / s p a n >
< grey - label v - if = "header.shouldAppend" > 附加 < / g r e y - l a b e l >
< grey - label v - if = "header.disableRedirect" > 跳转禁用 < / g r e y - l a b e l >
< grey - label v - if = "header.shouldReplace && header.replaceValues != null && header.replaceValues.length > 0" > 替换 < / g r e y - l a b e l >
< / d i v >
< / t d >
2021-11-22 12:08:53 +08:00
< td > { { header . value } } < / t d >
< td > < a href = "" @ click . prevent = "updateSettingPopup(vResponseHeaderPolicy.id, header.id)" > 修改 < / a > & n b s p ; < a h r e f = " " @ c l i c k . p r e v e n t = " d e l e t e H e a d e r ( v R e s p o n s e H e a d e r P o l i c y . i d , ' s e t H e a d e r ' , h e a d e r . i d ) " > 删 除 < / a > < / t d >
< / t r >
< / t a b l e >
< h3 > 删除响应Header < / h 3 >
< p class = "comment" > 这里可以设置需要从响应中删除的Header 。 < / p >
< table class = "ui table definition selectable" >
< td class = "title" > 需要删除的Header < / t d >
< td >
< div v - if = "responseDeletingHeaders.length > 0" >
< div class = "ui label small basic" v - for = "headerName in responseDeletingHeaders" > { { headerName } } < a href = "" > < i class = "icon remove" title = "删除" @ click . prevent = "deleteDeletingHeader(vResponseHeaderPolicy.id, headerName)" > < / i > < / a > < / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< button class = "ui button small" type = "button" @ click . prevent = "addDeletingHeader(vResponseHeaderPolicy.id, 'response')" > + < / b u t t o n >
< / t d >
< / t a b l e >
< / d i v >
< / d i v >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o m m o n - c o n f i g - b o x " , { p r o p s : [ " v - c o m m o n - c o n f i g " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C o m m o n C o n f i g ; r e t u r n { c o n f i g : e = n u l l = = e ? { m e r g e S l a s h e s : ! 1 } : e } } , t e m p l a t e : ` < d i v >
2021-11-27 17:06:03 +08:00
< table class = "ui table definition selectable" >
< tr >
< td class = "title" > 合并重复的路径分隔符 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" name = "mergeSlashes" value = "1" v - model = "config.mergeSlashes" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 合并URL中重复的路径分隔符为一个 , 比如 < code - label > //hello/world</code-label>中的<code-label>//</code-label>。</p>
< / t d >
< / t r >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c a c h e - p o l i c y - s e l e c t o r " , { p r o p s : [ " v - c a c h e - p o l i c y " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / s e r v e r s / c o m p o n e n t s / c a c h e / c o u n t " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . c o u n t = e . d a t a . c o u n t } ) } , d a t a : f u n c t i o n ( ) { r e t u r n { c o u n t : 0 , c a c h e P o l i c y : t h i s . v C a c h e P o l i c y } } , m e t h o d s : { r e m o v e : f u n c t i o n ( ) { t h i s . c a c h e P o l i c y = n u l l } , s e l e c t : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / c o m p o n e n t s / c a c h e / s e l e c t P o p u p " , { c a l l b a c k : f u n c t i o n ( e ) { t . c a c h e P o l i c y = e . d a t a . c a c h e P o l i c y } } ) } , c r e a t e : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / c o m p o n e n t s / c a c h e / c r e a t e P o p u p " , { h e i g h t : " 2 6 e m " , c a l l b a c k : f u n c t i o n ( e ) { t . c a c h e P o l i c y = e . d a t a . c a c h e P o l i c y } } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div v - if = "cachePolicy != null" class = "ui label basic" >
< input type = "hidden" name = "cachePolicyId" : value = "cachePolicy.id" / >
{ { cachePolicy . name } } & nbsp ; < a : href = "'/servers/components/cache/policy?cachePolicyId=' + cachePolicy.id" target = "_blank" title = "修改" > < i class = "icon pencil small" > < / i > < / a > & n b s p ; < a h r e f = " " @ c l i c k . p r e v e n t = " r e m o v e ( ) " t i t l e = " 删 除 " > < i c l a s s = " i c o n r e m o v e s m a l l " > < / i > < / a >
< / d i v >
< div v - if = "cachePolicy == null" >
< span v - if = "count > 0" > < a href = "" @ click . prevent = "select" > [ 选择已有策略 ] < / a > & n b s p ; & n b s p ; < / s p a n > < a h r e f = " " @ c l i c k . p r e v e n t = " c r e a t e " > [ 创 建 新 策 略 ] < / a >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - p a g e s - a n d - s h u t d o w n - b o x " , { p r o p s : [ " v - p a g e s " , " v - s h u t d o w n - c o n f i g " , " v - i s - l o c a t i o n " ] , d a t a : f u n c t i o n ( ) { l e t e = [ ] , t = ( n u l l ! = t h i s . v P a g e s & & ( e = t h i s . v P a g e s ) , { i s P r i o r : ! 1 , i s O n : ! 1 , b o d y T y p e : " u r l " , u r l : " " , b o d y : " " , s t a t u s : 0 } ) , i = ( n u l l ! = t h i s . v S h u t d o w n C o n f i g & & ( n u l l = = t h i s . v S h u t d o w n C o n f i g . b o d y & & ( t h i s . v S h u t d o w n C o n f i g . b o d y = " " ) , n u l l = = t h i s . v S h u t d o w n C o n f i g . b o d y T y p e & & ( t h i s . v S h u t d o w n C o n f i g . b o d y T y p e = " u r l " ) , t = t h i s . v S h u t d o w n C o n f i g ) , " " ) ; r e t u r n 0 < t . s t a t u s & & ( i = t . s t a t u s . t o S t r i n g ( ) ) , { p a g e s : e , s h u t d o w n C o n f i g : t , s h u t d o w n S t a t u s : i } } , w a t c h : { s h u t d o w n S t a t u s : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) ; ! i s N a N ( e ) & & 0 < e & & e < 1 e 3 ? t h i s . s h u t d o w n C o n f i g . s t a t u s = e : t h i s . s h u t d o w n C o n f i g . s t a t u s = 0 } } , m e t h o d s : { a d d P a g e : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / p a g e s / c r e a t e P o p u p " , { h e i g h t : " 2 6 e m " , c a l l b a c k : f u n c t i o n ( e ) { t . p a g e s . p u s h ( e . d a t a . p a g e ) } } ) } , u p d a t e P a g e : f u n c t i o n ( t , e ) { l e t i = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / p a g e s / u p d a t e P o p u p ? p a g e I d = " + e , { h e i g h t : " 2 6 e m " , c a l l b a c k : f u n c t i o n ( e ) { V u e . s e t ( i . p a g e s , t , e . d a t a . p a g e ) } } ) } , r e m o v e P a g e : f u n c t i o n ( e ) { l e t t = t h i s ; t e a w e b . c o n f i r m ( " 确 定 要 移 除 此 页 面 吗 ? " , f u n c t i o n ( ) { t . p a g e s . $ r e m o v e ( e ) } ) } , a d d S h u t d o w n H T M L T e m p l a t e : f u n c t i o n ( ) { t h i s . s h u t d o w n C o n f i g . b o d y = ` < ! D O C T Y P E h t m l >
2021-11-22 12:08:53 +08:00
< html >
< head >
2022-04-08 21:24:54 +08:00
< title > 升级中 < / t i t l e >
< meta http - equiv = "Content-Type" content = "text/html; charset=utf-8" / >
2021-11-22 12:08:53 +08:00
< / h e a d >
< body >
2021-12-05 20:59:07 +08:00
< h1 > 网站升级中 < / h 1 >
2021-11-22 12:08:53 +08:00
< p > 为了给您提供更好的服务 , 我们正在升级网站 , 请稍后重新访问 。 < / p >
2022-01-09 20:13:18 +08:00
< address > Request ID : \ $ { requestId } . < / a d d r e s s >
2021-11-22 12:08:53 +08:00
< / b o d y >
2022-04-08 21:24:54 +08:00
< / h t m l > ` } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "pagesJSON" : value = "JSON.stringify(pages)" / >
< input type = "hidden" name = "shutdownJSON" : value = "JSON.stringify(shutdownConfig)" / >
< table class = "ui table selectable definition" >
< tr >
2022-04-04 19:46:12 +08:00
< td class = "title" > 自定义页面 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div v - if = "pages.length > 0" >
< div class = "ui label small basic" v - for = "(page,index) in pages" >
{ { page . status } } - & gt ; < span v - if = "page.bodyType == 'url'" > { { page . url } } < / s p a n > < s p a n v - i f = " p a g e . b o d y T y p e = = ' h t m l ' " > [ H T M L 内 容 ] < / s p a n > < a h r e f = " " t i t l e = " 修 改 " @ c l i c k . p r e v e n t = " u p d a t e P a g e ( i n d e x , p a g e . i d ) " > < i c l a s s = " i c o n p e n c i l s m a l l " > < / i > < / a > < a h r e f = " " t i t l e = " 删 除 " @ c l i c k . p r e v e n t = " r e m o v e P a g e ( i n d e x ) " > < i c l a s s = " i c o n r e m o v e " > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div >
< button class = "ui button small" type = "button" @ click . prevent = "addPage()" > + < / b u t t o n >
< / d i v >
2022-04-04 19:46:12 +08:00
< p class = "comment" > 根据响应状态码返回一些自定义页面 , 比如404 , 500 等错误页面 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
< td > 临时关闭页面 < / t d >
< td >
< div >
< table class = "ui table selectable definition" >
< prior - checkbox : v - config = "shutdownConfig" v - if = "vIsLocation" > < / p r i o r - c h e c k b o x >
< tbody v - show = "!vIsLocation || shutdownConfig.isPrior" >
< tr >
2022-06-05 17:12:54 +08:00
< td class = "title" > 开启 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" value = "1" v - model = "shutdownConfig.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "(!vIsLocation || shutdownConfig.isPrior) && shutdownConfig.isOn" >
< tr >
< td > 内容类型 * < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "shutdownConfig.bodyType" >
< option value = "url" > 读取URL < / o p t i o n >
< option value = "html" > HTML < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< tr v - show = "shutdownConfig.bodyType == 'url'" >
< td class = "title" > 页面URL * < / t d >
< td >
< input type = "text" v - model = "shutdownConfig.url" placeholder = "页面文件路径或一个完整URL" / >
< p class = "comment" > 页面文件是相对于节点安装目录的页面文件比如pages / 40 x . html , 或者一个完整的URL 。 < / p >
< / t d >
< / t r >
< tr v - show = "shutdownConfig.bodyType == 'html'" >
< td > HTML * < / t d >
< td >
< textarea name = "body" ref = "shutdownHTMLBody" v - model = "shutdownConfig.body" > < / t e x t a r e a >
< p class = "comment" > < a href = "" @ click . prevent = "addShutdownHTMLTemplate" > [ 使用模板 ] < / a > 。 填 写 页 面 的 H T M L 内 容 , 支 持 请 求 变 量 。 < / p >
< / t d >
< / t r >
< tr >
< td > 状态码 < / t d >
< td > < input type = "text" size = "3" maxlength = "3" name = "shutdownStatus" style = "width:5.2em" placeholder = "状态码" v - model = "shutdownStatus" / > < / t d >
< / t r >
< / t b o d y >
< / t a b l e >
2021-12-12 11:46:09 +08:00
< p class = "comment" > 开启临时关闭页面时 , 所有请求都会直接显示此页面 。 可用于临时升级网站或者禁止用户访问某个网页 。 < / p >
2021-11-22 12:08:53 +08:00
< / d i v >
< / t d >
< / t r >
< / t a b l e >
< div class = "ui margin" > < / d i v >
2022-06-29 17:00:05 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o m p r e s s i o n - c o n f i g - b o x " , { p r o p s : [ " v - c o m p r e s s i o n - c o n f i g " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " ] , m o u n t e d : f u n c t i o n ( ) { l e t e = t h i s ; s o r t L o a d ( f u n c t i o n ( ) { e . i n i t S o r t a b l e T y p e s ( ) } ) } , d a t a : f u n c t i o n ( ) { l e t t = t h i s . v C o m p r e s s i o n C o n f i g , e = ( n u l l = = ( t = n u l l = = t ? { i s P r i o r : ! 1 , i s O n : ! 1 , u s e D e f a u l t T y p e s : ! 0 , t y p e s : [ " b r o t l i " , " g z i p " , " z s t d " , " d e f l a t e " ] , l e v e l : 5 , d e c o m p r e s s D a t a : ! 1 , g z i p R e f : n u l l , d e f l a t e R e f : n u l l , b r o t l i R e f : n u l l , m i n L e n g t h : { c o u n t : 0 , u n i t : " k b " } , m a x L e n g t h : { c o u n t : 0 , u n i t : " k b " } , m i m e T y p e s : [ " t e x t / * " , " a p p l i c a t i o n / * " , " f o n t / * " ] , e x t e n s i o n s : [ " . j s " , " . j s o n " , " . h t m l " , " . h t m " , " . x m l " , " . c s s " , " . w o f f 2 " , " . t x t " ] , c o n d s : n u l l } : t ) . t y p e s & & ( t . t y p e s = [ ] ) , n u l l = = t . m i m e T y p e s & & ( t . m i m e T y p e s = [ ] ) , n u l l = = t . e x t e n s i o n s & & ( t . e x t e n s i o n s = [ ] ) , [ { n a m e : " G z i p " , c o d e : " g z i p " , i s O n : ! 0 } , { n a m e : " D e f l a t e " , c o d e : " d e f l a t e " , i s O n : ! 0 } , { n a m e : " B r o t l i " , c o d e : " b r o t l i " , i s O n : ! 0 } , { n a m e : " Z S T D " , c o d e : " z s t d " , i s O n : ! 0 } ] ) , i = [ ] ; r e t u r n t . t y p e s . f o r E a c h ( f u n c t i o n ( t ) { e . f o r E a c h ( f u n c t i o n ( e ) { t = = e . c o d e & & ( e . i s O n = ! 0 , i . p u s h ( e ) ) } ) } ) , e . f o r E a c h ( f u n c t i o n ( e ) { t . t y p e s . $ c o n t a i n s ( e . c o d e ) | | ( e . i s O n = ! 1 , i . p u s h ( e ) ) } ) , { c o n f i g : t , m o r e O p t i o n s V i s i b l e : ! 1 , a l l T y p e s : i } } , w a t c h : { " c o n f i g . l e v e l " : f u n c t i o n ( e ) { l e t t = p a r s e I n t ( e ) ; i s N a N ( t ) | | t < 1 ? t = 1 : 1 0 < t & & ( t = 1 0 ) , t h i s . c o n f i g . l e v e l = t } } , m e t h o d s : { i s O n : f u n c t i o n ( ) { r e t u r n ( ! t h i s . v I s L o c a t i o n & & ! t h i s . v I s G r o u p | | t h i s . c o n f i g . i s P r i o r ) & & t h i s . c o n f i g . i s O n } , c h a n g e E x t e n s i o n s : f u n c t i o n ( i ) { i . f o r E a c h ( f u n c t i o n ( e , t ) { 0 < e . l e n g t h & & " . " ! = e [ 0 ] & & ( i [ t ] = " . " + e ) } ) , t h i s . c o n f i g . e x t e n s i o n s = i } , c h a n g e M i m e T y p e s : f u n c t i o n ( e ) { t h i s . c o n f i g . m i m e T y p e s = e } , c h a n g e A d v a n c e d V i s i b l e : f u n c t i o n ( ) { t h i s . m o r e O p t i o n s V i s i b l e = ! t h i s . m o r e O p t i o n s V i s i b l e } , c h a n g e C o n d s : f u n c t i o n ( e ) { t h i s . c o n f i g . c o n d s = e } , c h a n g e T y p e : f u n c t i o n ( ) { t h i s . c o n f i g . t y p e s = [ ] ; l e t t = t h i s ; t h i s . a l l T y p e s . f o r E a c h ( f u n c t i o n ( e ) { e . i s O n & & t . c o n f i g . t y p e s . p u s h ( e . c o d e ) } ) } , i n i t S o r t a b l e T y p e s : f u n c t i o n ( ) { l e t s = d o c u m e n t . q u e r y S e l e c t o r ( " # c o m p r e s s i o n - t y p e s - b o x " ) , n = t h i s ; S o r t a b l e . c r e a t e ( s , { d r a g g a b l e : " . c h e c k b o x " , h a n d l e : " . i c o n . h a n d l e " , o n S t a r t : f u n c t i o n ( ) { } , o n U p d a t e : f u n c t i o n ( e ) { l e t t = s . q u e r y S e l e c t o r A l l ( " . c h e c k b o x " ) , i = [ ] ; t . f o r E a c h ( f u n c t i o n ( e ) { e = e . g e t A t t r i b u t e ( " d a t a - c o d e " ) ; i . p u s h ( e ) } ) , n . c o n f i g . t y p e s = i } } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "compressionJSON" : value = "JSON.stringify(config)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "config" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || config.isPrior" >
< tr >
2022-06-05 17:12:54 +08:00
< td class = "title" > 启用 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" value = "1" v - model = "config.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "isOn()" >
< tr >
< td > 压缩级别 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "config.level" >
< option v - for = "i in 10" : value = "i" > { { i } } < / o p t i o n >
< / s e l e c t >
< p class = "comment" > 级别越高 , 压缩比例越大 。 < / p >
< / t d >
< / t r >
< tr >
< td > 支持的扩展名 < / t d >
< td >
< values - box : values = "config.extensions" @ change = "changeExtensions" placeholder = "比如 .html" > < / v a l u e s - b o x >
< p class = "comment" > 含有这些扩展名的URL将会被压缩 , 不区分大小写 。 < / p >
< / t d >
< / t r >
< tr >
< td > 支持的MimeType < / t d >
< td >
< values - box : values = "config.mimeTypes" @ change = "changeMimeTypes" placeholder = "比如 text/*" > < / v a l u e s - b o x >
< p class = "comment" > 响应的Content - Type里包含这些MimeType的内容将会被压缩 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< more - options - tbody @ change = "changeAdvancedVisible" v - if = "isOn()" > < / m o r e - o p t i o n s - t b o d y >
< tbody v - show = "isOn() && moreOptionsVisible" >
< tr >
< td > 压缩算法 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "config.useDefaultTypes" id = "compression-use-default" / >
2022-06-29 17:00:05 +08:00
< label v - if = "config.useDefaultTypes" for = "compression-use-default" > 使用默认顺序 < span class = "grey small" > ( brotli 、 gzip 、 zstd 、 deflate ) < / s p a n > < / l a b e l >
2021-11-22 12:08:53 +08:00
< label v - if = "!config.useDefaultTypes" for = "compression-use-default" > 使用默认顺序 < / l a b e l >
< / d i v >
< div v - show = "!config.useDefaultTypes" >
< div class = "ui divider" > < / d i v >
< div id = "compression-types-box" >
< div class = "ui checkbox" v - for = "t in allTypes" style = "margin-right: 2em" : data - code = "t.code" >
< input type = "checkbox" v - model = "t.isOn" : id = "'compression-type-' + t.code" @ change = "changeType" / >
< label : for = "'compression-type-' + t.code" > { { t . name } } & nbsp ; < i class = "icon list small grey handle" > < / i > < / l a b e l >
< / d i v >
< / d i v >
< / d i v >
2022-03-25 14:10:40 +08:00
< p class = "comment" v - show = "!config.useDefaultTypes" > 选择支持的压缩算法和优先顺序 , 拖动 < i class = "icon list small grey" > < / i > 图 表 排 序 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
< td > 支持已压缩内容 < / t d >
< td >
< checkbox v - model = "config.decompressData" > < / c h e c k b o x >
2022-03-25 14:10:40 +08:00
< p class = "comment" > 支持对已压缩内容尝试重新使用新的算法压缩 ; 不选中表示保留当前的压缩格式 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
< td > 内容最小长度 < / t d >
< td >
< size - capacity - box : v - name = "'minLength'" : v - value = "config.minLength" : v - unit = "'kb'" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > 0 表示不限制 , 内容长度从文件尺寸或Content - Length中获取 。 < / p >
< / t d >
< / t r >
< tr >
< td > 内容最大长度 < / t d >
< td >
< size - capacity - box : v - name = "'maxLength'" : v - value = "config.maxLength" : v - unit = "'mb'" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > 0 表示不限制 , 内容长度从文件尺寸或Content - Length中获取 。 < / p >
< / t d >
< / t r >
< tr >
< td > 匹配条件 < / t d >
< td >
< http - request - conds - box : v - conds = "config.conds" @ change = "changeConds" > < / h t t p - r e q u e s t - c o n d s - b o x >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< /div>`}),Vue.component("firewall-event-level-options",{props:["v-value"],mounted:function(){let t=this;Tea.action("/ui / eventLevelOptions ").post().success(function(e){t.levels=e.data.eventLevels,t.change()})},data:function(){let e=this.vValue;return{levels:[],description:" ",level:e=null!=e&&0!=e.length?e:" "}},methods:{change:function(){this.$emit(" change ");let i=this;var e=this.levels.$find(function(e,t){return t.code==i.level});this.description=null!=e?e.description:" " } } , template : ` <div>
2021-11-22 12:08:53 +08:00
< select class = "ui dropdown auto-width" name = "eventLevel" v - model = "level" @ change = "change" >
< option v - for = "level in levels" : value = "level.code" > { { level . name } } < / o p t i o n >
< / s e l e c t >
< p class = "comment" > { { description } } < / p >
2022-05-19 17:14:19 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " p r i o r - c h e c k b o x " , { p r o p s : [ " v - c o n f i g " , " d e s c r i p t i o n " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . d e s c r i p t i o n ; r e t u r n n u l l = = e & & ( e = " 打 开 后 可 以 覆 盖 父 级 或 子 级 配 置 " ) , { i s P r i o r : t h i s . v C o n f i g . i s P r i o r , r e a l D e s c r i p t i o n : e } } , w a t c h : { i s P r i o r : f u n c t i o n ( e ) { t h i s . v C o n f i g . i s P r i o r = e } } , t e m p l a t e : ` < t b o d y >
2021-11-22 12:08:53 +08:00
< tr : class = "{active:isPrior}" >
< td class = "title" > 打开独立配置 < / t d >
< td >
< div class = "ui toggle checkbox" >
< input type = "checkbox" v - model = "isPrior" / >
< label class = "red" > < / l a b e l >
< / d i v >
2022-05-19 17:14:19 +08:00
< p class = "comment" > < strong v - if = "isPrior" > [ 已打开 ] < / s t r o n g > { { r e a l D e s c r i p t i o n } } 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
2022-04-08 21:24:54 +08:00
< / t b o d y > ` } ) , V u e . c o m p o n e n t ( " h t t p - c h a r s e t s - b o x " , { p r o p s : [ " v - u s u a l - c h a r s e t s " , " v - a l l - c h a r s e t s " , " v - c h a r s e t - c o n f i g " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C h a r s e t C o n f i g ; r e t u r n { c h a r s e t C o n f i g : e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 , c h a r s e t : " " , i s U p p e r : ! 1 } : e , a d v a n c e d V i s i b l e : ! 1 } } , m e t h o d s : { c h a n g e A d v a n c e d V i s i b l e : f u n c t i o n ( e ) { t h i s . a d v a n c e d V i s i b l e = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "charsetJSON" : value = "JSON.stringify(charsetConfig)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "charsetConfig" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || charsetConfig.isPrior" >
< tr >
2022-06-05 17:12:54 +08:00
< td class = "title" > 启用 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "charsetConfig.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "((!vIsLocation && !vIsGroup) || charsetConfig.isPrior) && charsetConfig.isOn" >
< tr >
< td class = "title" > 选择字符编码 < / t d >
< td > < select class = "ui dropdown" style = "width:20em" name = "charset" v - model = "charsetConfig.charset" >
< option value = "" > [ 未选择 ] < / o p t i o n >
< optgroup label = "常用字符编码" > < / o p t g r o u p >
< option v - for = "charset in vUsualCharsets" : value = "charset.charset" > { { charset . charset } } ( { { charset . name } } ) < / o p t i o n >
< optgroup label = "全部字符编码" > < / o p t g r o u p >
< option v - for = "charset in vAllCharsets" : value = "charset.charset" > { { charset . charset } } ( { { charset . name } } ) < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< / t b o d y >
< more - options - tbody @ change = "changeAdvancedVisible" v - if = "((!vIsLocation && !vIsGroup) || charsetConfig.isPrior) && charsetConfig.isOn" > < / m o r e - o p t i o n s - t b o d y >
< tbody v - show = "((!vIsLocation && !vIsGroup) || charsetConfig.isPrior) && charsetConfig.isOn && advancedVisible" >
< tr >
< td > 字符编码是否大写 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "charsetConfig.isUpper" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 选中后将指定的字符编码转换为大写 , 比如默认为 < span class = "ui label tiny" > utf - 8 < / s p a n > , 选 中 后 将 改 为 < s p a n c l a s s = " u i l a b e l t i n y " > U T F - 8 < / s p a n > 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - e x p i r e s - t i m e - c o n f i g - b o x " , { p r o p s : [ " v - e x p i r e s - t i m e " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v E x p i r e s T i m e ; r e t u r n { e x p i r e s T i m e : e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 , o v e r w r i t e : ! 0 , a u t o C a l c u l a t e : ! 0 , d u r a t i o n : { c o u n t : - 1 , u n i t : " h o u r " } } : e } } , w a t c h : { " e x p i r e s T i m e . i s P r i o r " : f u n c t i o n ( ) { t h i s . n o t i f y C h a n g e ( ) } , " e x p i r e s T i m e . i s O n " : f u n c t i o n ( ) { t h i s . n o t i f y C h a n g e ( ) } , " e x p i r e s T i m e . o v e r w r i t e " : f u n c t i o n ( ) { t h i s . n o t i f y C h a n g e ( ) } , " e x p i r e s T i m e . a u t o C a l c u l a t e " : f u n c t i o n ( ) { t h i s . n o t i f y C h a n g e ( ) } } , m e t h o d s : { n o t i f y C h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . e x p i r e s T i m e ) } } , t e m p l a t e : ` < d i v >
2021-12-08 19:13:54 +08:00
< table class = "ui table" >
< prior - checkbox : v - config = "expiresTime" > < / p r i o r - c h e c k b o x >
< tbody v - show = "expiresTime.isPrior" >
< tr >
2022-06-05 17:12:54 +08:00
< td class = "title" > 启用 < / t d >
2021-12-08 19:13:54 +08:00
< td > < checkbox v - model = "expiresTime.isOn" > < / c h e c k b o x >
< p class = "comment" > 启用后 , 将会在响应的Header中添加 < code - label > Expires < / c o d e - l a b e l > 字 段 , 浏 览 器 据 此 会 将 内 容 缓 存 在 客 户 端 ; 同 时 , 在 管 理 后 台 执 行 清 理 缓 存 时 , 也 将 无 法 清 理 客 户 端 已 有 的 缓 存 。 < / p >
< / t d >
< / t r >
< tr v - show = "expiresTime.isPrior && expiresTime.isOn" >
< td > 覆盖源站设置 < / t d >
< td >
< checkbox v - model = "expiresTime.overwrite" > < / c h e c k b o x >
< p class = "comment" > 选中后 , 会覆盖源站Header中已有的 < code - label > Expires < / c o d e - l a b e l > 字 段 。 < / p >
< / t d >
< / t r >
< tr v - show = "expiresTime.isPrior && expiresTime.isOn" >
< td > 自动计算时间 < / t d >
< td > < checkbox v - model = "expiresTime.autoCalculate" > < / c h e c k b o x >
< p class = "comment" > 根据已设置的缓存有效期进行计算 。 < / p >
< / t d >
< / t r >
< tr v - show = "expiresTime.isPrior && expiresTime.isOn && !expiresTime.autoCalculate" >
< td > 强制缓存时间 < / t d >
< td >
< time - duration - box : v - value = "expiresTime.duration" @ change = "notifyChange" > < / t i m e - d u r a t i o n - b o x >
2021-12-12 11:46:09 +08:00
< p class = "comment" > 从客户端访问的时间开始要缓存的时长 。 < / p >
2021-12-08 19:13:54 +08:00
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
2022-06-25 19:31:23 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - a c c e s s - l o g - b o x " , { p r o p s : [ " v - a c c e s s - l o g " , " v - k e y w o r d " , " v - s h o w - s e r v e r - l i n k " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v A c c e s s L o g ; i f ( n u l l ! = e . h e a d e r & & n u l l ! = e . h e a d e r . U p g r a d e & & n u l l ! = e . h e a d e r . U p g r a d e . v a l u e s & & e . h e a d e r . U p g r a d e . v a l u e s . $ c o n t a i n s ( " w e b s o c k e t " ) & & ( " h t t p " = = e . s c h e m e ? e . s c h e m e = " w s " : " h t t p s " = = e . s c h e m e & & ( e . s c h e m e = " w s s " ) ) , n u l l ! = e . t a g s & & 0 < e . t a g s . l e n g t h ) { l e t s = { } ; e . t a g s = e . t a g s . $ f i l t e r ( f u n c t i o n ( e , t ) { v a r i = v o i d 0 = = = s [ t ] ; r e t u r n s [ t ] = ! 0 , i } ) } r e t u r n { a c c e s s L o g : e } } , m e t h o d s : { f o r m a t C o s t : f u n c t i o n ( e ) { i f ( n u l l = = e ) r e t u r n " 0 " ; l e t t = ( 1 e 3 * e ) . t o S t r i n g ( ) , i = t . s p l i t ( " . " ) ; r e t u r n i . l e n g t h < 2 ? t : i [ 0 ] + " . " + i [ 1 ] . s u b s t r i n g ( 0 , 3 ) } , s h o w L o g : f u n c t i o n ( ) { l e t e = t h i s ; v a r t = t h i s . a c c e s s L o g . r e q u e s t I d ; t h i s . $ p a r e n t . $ c h i l d r e n . f o r E a c h ( f u n c t i o n ( e ) { n u l l ! = e . d e s e l e c t & & e . d e s e l e c t ( ) } ) , t h i s . s e l e c t ( ) , t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / l o g / v i e w P o p u p ? r e q u e s t I d = " + t , { w i d t h : " 5 0 e m " , h e i g h t : " 2 8 e m " , o n C l o s e : f u n c t i o n ( ) { e . d e s e l e c t ( ) } } ) } , s e l e c t : f u n c t i o n ( ) { t h i s . $ r e f s . b o x . p a r e n t N o d e . s t y l e . c s s T e x t = " b a c k g r o u n d : r g b a ( 0 , 0 , 0 , 0 . 1 ) " } , d e s e l e c t : f u n c t i o n ( ) { t h i s . $ r e f s . b o x . p a r e n t N o d e . s t y l e . c s s T e x t = " " } , m i s m a t c h : f u n c t i o n ( ) { t e a w e b . w a r n ( " 当 前 访 问 没 有 匹 配 到 任 何 网 站 服 务 " ) } } , t e m p l a t e : ` < d i v s t y l e = " w o r d - b r e a k : b r e a k - a l l " : s t y l e = " { ' c o l o r ' : ( a c c e s s L o g . s t a t u s > = 4 0 0 ) ? ' # d c 1 4 3 c ' : ' ' } " r e f = " b o x " >
2022-04-21 18:38:47 +08:00
< div >
< a v - if = "accessLog.node != null && accessLog.node.nodeCluster != null" : href = "'/clusters/cluster/node?nodeId=' + accessLog.node.id + '&clusterId=' + accessLog.node.nodeCluster.id" title = "点击查看节点详情" target = "_top" > < span class = "grey" > [ { { accessLog . node . name } } < span v - if = "!accessLog.node.name.endsWith('节点')" > 节点 < / s p a n > ] < / s p a n > < / a >
2022-06-25 19:31:23 +08:00
<!-- 服务 -- >
< a : href = "'/servers/server/log?serverId=' + accessLog.serverId" title = "点击到网站服务" v - if = "vShowServerLink && accessLog.serverId > 0" > < span class = "grey" > [ 服务 ] < / s p a n > < / a >
< span v - if = "vShowServerLink && (accessLog.serverId == null || accessLog.serverId == 0)" @ click . prevent = "mismatch()" > < span class = "disabled" > [ 服务 ] < / s p a n > < / s p a n >
2022-04-21 18:38:47 +08:00
< span v - if = "accessLog.region != null && accessLog.region.length > 0" class = "grey" > < ip - box : v - ip = "accessLog.remoteAddr" > [ { { accessLog . region } } ] < / i p - b o x > < / s p a n > < i p - b o x > < k e y w o r d : v - w o r d = " v K e y w o r d " > { { a c c e s s L o g . r e m o t e A d d r } } < / k e y w o r d > < / i p - b o x > [ { { a c c e s s L o g . t i m e L o c a l } } ] < e m > & q u o t ; < k e y w o r d : v - w o r d = " v K e y w o r d " > { { a c c e s s L o g . r e q u e s t M e t h o d } } < / k e y w o r d > { { a c c e s s L o g . s c h e m e } } : / / < k e y w o r d : v - w o r d = " v K e y w o r d " > { { a c c e s s L o g . h o s t } } < / k e y w o r d > < k e y w o r d : v - w o r d = " v K e y w o r d " > { { a c c e s s L o g . r e q u e s t U R I } } < / k e y w o r d > < a : h r e f = " a c c e s s L o g . s c h e m e + ' : / / ' + a c c e s s L o g . h o s t + a c c e s s L o g . r e q u e s t U R I " t a r g e t = " _ b l a n k " t i t l e = " 新 窗 口 打 开 " c l a s s = " d i s a b l e d " > < i c l a s s = " e x t e r n a l i c o n t i n y " > < / i > < / a > { { a c c e s s L o g . p r o t o } } & q u o t ; < / e m > < k e y w o r d : v - w o r d = " v K e y w o r d " > { { a c c e s s L o g . s t a t u s } } < / k e y w o r d > < c o d e - l a b e l v - i f = " a c c e s s L o g . a t t r s ! = n u l l & & ( a c c e s s L o g . a t t r s [ ' c a c h e . s t a t u s ' ] = = ' H I T ' | | a c c e s s L o g . a t t r s [ ' c a c h e . s t a t u s ' ] = = ' S T A L E ' ) " > c a c h e { { a c c e s s L o g . a t t r s [ ' c a c h e . s t a t u s ' ] . t o L o w e r C a s e ( ) } } < / c o d e - l a b e l > < c o d e - l a b e l v - i f = " a c c e s s L o g . f i r e w a l l A c t i o n s ! = n u l l & & a c c e s s L o g . f i r e w a l l A c t i o n s . l e n g t h > 0 " > w a f { { a c c e s s L o g . f i r e w a l l A c t i o n s } } < / c o d e - l a b e l > < s p a n v - i f = " a c c e s s L o g . t a g s ! = n u l l & & a c c e s s L o g . t a g s . l e n g t h > 0 " > - < c o d e - l a b e l v - f o r = " t a g i n a c c e s s L o g . t a g s " : k e y = " t a g " > { { t a g } } < / c o d e - l a b e l > < / s p a n >
< span v - if = "accessLog.wafInfo != null" >
< a : href = "(accessLog.wafInfo.policy.serverId == 0) ? '/servers/components/waf/group?firewallPolicyId=' + accessLog.firewallPolicyId + '&type=inbound&groupId=' + accessLog.firewallRuleGroupId+ '#set' + accessLog.firewallRuleSetId : '/servers/server/settings/waf/group?serverId=' + accessLog.serverId + '&firewallPolicyId=' + accessLog.firewallPolicyId + '&type=inbound&groupId=' + accessLog.firewallRuleGroupId + '#set' + accessLog.firewallRuleSetId" target = "_blank" >
< code - label - plain >
2022-04-22 09:14:48 +08:00
< span >
WAF -
< span v - if = "accessLog.wafInfo.group != null" > { { accessLog . wafInfo . group . name } } - < / s p a n >
2022-04-21 18:38:47 +08:00
< span v - if = "accessLog.wafInfo.set != null" > { { accessLog . wafInfo . set . name } } < / s p a n >
< / s p a n >
< / c o d e - l a b e l - p l a i n >
< / a >
< / s p a n >
< span v - if = "accessLog.requestTime != null" > - 耗时 : { { formatCost ( accessLog . requestTime ) } } ms < / s p a n > < s p a n v - i f = " a c c e s s L o g . h u m a n T i m e ! = n u l l & & a c c e s s L o g . h u m a n T i m e . l e n g t h > 0 " c l a s s = " g r e y s m a l l " > & n b s p ; ( { { a c c e s s L o g . h u m a n T i m e } } ) < / s p a n >
& nbsp ; < a href = "" @ click . prevent = "showLog" title = "查看详情" > < i class = "icon expand" > < / i > < / a >
< / d i v >
2022-05-21 20:00:39 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - f i r e w a l l - b l o c k - o p t i o n s - v i e w e r " , { p r o p s : [ " v - b l o c k - o p t i o n s " ] , d a t a : f u n c t i o n ( ) { r e t u r n { o p t i o n s : t h i s . v B l o c k O p t i o n s } } , t e m p l a t e : ` < d i v >
< span v - if = "options == null" > 默认设置 < / s p a n >
< div v - else >
状态码 : { { options . statusCode } } / 提示内容 : < span v - if = "options.body != null && options.body.length > 0" > [ { { options . body . length } } 字符 ] < / s p a n > < s p a n v - e l s e c l a s s = " d i s a b l e d " > [ 无 ] < / s p a n > / 超 时 时 间 : { { o p t i o n s . t i m e o u t } } 秒
< / d i v >
2022-05-20 22:07:04 +08:00
< / d i v >
` }),Vue.component("http-access-log-config-box",{props:["v-access-log-config","v-fields","v-default-field-codes","v-is-location","v-is-group"],data:function(){let t=this,i=(setTimeout(function(){t.changeFields()},100),{isPrior:!1,isOn:!1,fields:[1,2,6,7],status1:!0,status2:!0,status3:!0,status4:!0,status5:!0,firewallOnly:!1,enableClientClosed:!1});return null!=this.vAccessLogConfig&&(i=this.vAccessLogConfig),this.vFields.forEach(function(e){null==t.vAccessLogConfig?e.isChecked=t.vDefaultFieldCodes. $ contains(e.code):e.isChecked=i.fields. $ contains(e.code)}),{accessLog:i,hasRequestBodyField:this.vFields. $ contains(8)}},methods:{changeFields:function(){this.accessLog.fields=this.vFields.filter(function(e){return e.isChecked}).map(function(e){return e.code}),this.hasRequestBodyField=this.accessLog.fields. $ contains(8)}},template: ` < div >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "accessLogJSON" : value = "JSON.stringify(accessLog)" / >
< table class = "ui table definition selectable" : class = "{'opacity-mask': this.accessLog.firewallOnly}" >
< prior - checkbox : v - config = "accessLog" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || accessLog.isPrior" >
< tr >
2022-04-21 18:38:47 +08:00
< td class = "title" > 开启访问日志 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "accessLog.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "((!vIsLocation && !vIsGroup) || accessLog.isPrior) && accessLog.isOn" >
< tr >
2021-12-08 10:03:27 +08:00
< td > 基础信息 < / t d >
< td > < p class = "comment" style = "padding-top: 0" > 默认记录客户端IP 、 请求URL等基础信息 。 < / p > < / t d >
< / t r >
< tr >
< td > 高级信息 < / t d >
2021-11-22 12:08:53 +08:00
< td >
2021-12-08 10:03:27 +08:00
< div class = "ui checkbox" v - for = "(field, index) in vFields" style = "width:10em;margin-bottom:0.8em" >
< input type = "checkbox" v - model = "field.isChecked" @ change = "changeFields" : id = "'access-log-field-' + index" / >
< label : for = "'access-log-field-' + index" > { { field . name } } < / l a b e l >
2021-11-22 12:08:53 +08:00
< / d i v >
2021-12-08 10:03:27 +08:00
< p class = "comment" > 在基础信息之外要存储的信息 。
< span class = "red" v - if = "hasRequestBodyField" > 记录 "请求Body" 将会显著消耗更多的系统资源 , 建议仅在调试时启用 , 最大记录尺寸为2MB 。 < / s p a n >
< / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
< td > 要存储的访问日志状态码 < / t d >
< td >
< div class = "ui checkbox" style = "width:3.5em" >
< input type = "checkbox" v - model = "accessLog.status1" / >
< label > 1 xx < / l a b e l >
< / d i v >
< div class = "ui checkbox" style = "width:3.5em" >
< input type = "checkbox" v - model = "accessLog.status2" / >
< label > 2 xx < / l a b e l >
< / d i v >
< div class = "ui checkbox" style = "width:3.5em" >
< input type = "checkbox" v - model = "accessLog.status3" / >
< label > 3 xx < / l a b e l >
< / d i v >
< div class = "ui checkbox" style = "width:3.5em" >
< input type = "checkbox" v - model = "accessLog.status4" / >
< label > 4 xx < / l a b e l >
< / d i v >
< div class = "ui checkbox" style = "width:3.5em" >
< input type = "checkbox" v - model = "accessLog.status5" / >
< label > 5 xx < / l a b e l >
< / d i v >
< / t d >
< / t r >
2021-12-02 09:54:31 +08:00
< tr >
< td > 记录客户端中断日志 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "accessLog.enableClientClosed" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 以 < code - label > 499 < / c o d e - l a b e l > 的 状 态 码 记 录 客 户 端 主 动 中 断 日 志 。 < / p >
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
< / t b o d y >
< / t a b l e >
< div v - show = "((!vIsLocation && !vIsGroup) || accessLog.isPrior) && accessLog.isOn" >
< h4 > WAF相关 < / h 4 >
< table class = "ui table definition selectable" >
< tr >
2022-04-21 18:38:47 +08:00
< td class = "title" > 只记录WAF相关日志 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< checkbox v - model = "accessLog.firewallOnly" > < / c h e c k b o x >
< p class = "comment" > 选中后只记录WAF相关的日志 。 通过此选项可有效减少访问日志数量 , 降低网络带宽和存储压力 。 < / p >
< / t d >
< / t r >
< / t a b l e >
< / d i v >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " t r a f f i c - l i m i t - v i e w " , { p r o p s : [ " v - t r a f f i c - l i m i t " ] , d a t a : f u n c t i o n ( ) { r e t u r n { c o n f i g : t h i s . v T r a f f i c L i m i t } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div v - if = "config.isOn" >
< span v - if = "config.dailySize != null && config.dailySize.count > 0" > 日流量限制 : { { config . dailySize . count } } { { config . dailySize . unit . toUpperCase ( ) } } < br / > < / s p a n >
< span v - if = "config.monthlySize != null && config.monthlySize.count > 0" > 月流量限制 : { { config . monthlySize . count } } { { config . monthlySize . unit . toUpperCase ( ) } } < br / > < / s p a n >
< / d i v >
< span v - else class = "disabled" > 没有限制 。 < / s p a n >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - a u t h - b a s i c - a u t h - u s e r - b o x " , { p r o p s : [ " v - u s e r s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v U s e r s ; r e t u r n { u s e r s : e = n u l l = = e ? [ ] : e , i s A d d i n g : ! 1 , u p d a t i n g I n d e x : - 1 , u s e r n a m e : " " , p a s s w o r d : " " } } , m e t h o d s : { a d d : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 0 , t h i s . u s e r n a m e = " " , t h i s . p a s s w o r d = " " ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . u s e r n a m e . f o c u s ( ) } , 1 0 0 ) } , c a n c e l : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 , t h i s . u p d a t i n g I n d e x = - 1 } , c o n f i r m : f u n c t i o n ( ) { l e t e = t h i s ; 0 = = t h i s . u s e r n a m e . l e n g t h ? t e a w e b . w a r n ( " 请 输 入 用 户 名 " , f u n c t i o n ( ) { e . $ r e f s . u s e r n a m e . f o c u s ( ) } ) : 0 = = t h i s . p a s s w o r d . l e n g t h ? t e a w e b . w a r n ( " 请 输 入 密 码 " , f u n c t i o n ( ) { e . $ r e f s . p a s s w o r d . f o c u s ( ) } ) : ( t h i s . u p d a t i n g I n d e x < 0 ? t h i s . u s e r s . p u s h ( { u s e r n a m e : t h i s . u s e r n a m e , p a s s w o r d : t h i s . p a s s w o r d } ) : ( t h i s . u s e r s [ t h i s . u p d a t i n g I n d e x ] . u s e r n a m e = t h i s . u s e r n a m e , t h i s . u s e r s [ t h i s . u p d a t i n g I n d e x ] . p a s s w o r d = t h i s . p a s s w o r d ) , t h i s . c a n c e l ( ) ) } , u p d a t e : f u n c t i o n ( e , t ) { t h i s . u p d a t i n g I n d e x = e , t h i s . i s A d d i n g = ! 0 , t h i s . u s e r n a m e = t . u s e r n a m e , t h i s . p a s s w o r d = t . p a s s w o r d ; l e t i = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { i . $ r e f s . u s e r n a m e . f o c u s ( ) } , 1 0 0 ) } , r e m o v e : f u n c t i o n ( e ) { t h i s . u s e r s . $ r e m o v e ( e ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "httpAuthBasicAuthUsersJSON" : value = "JSON.stringify(users)" / >
< div v - if = "users.length > 0" >
< div class = "ui label small basic" v - for = "(user, index) in users" >
{ { user . username } } < a href = "" title = "修改" @ click . prevent = "update(index, user)" > < i class = "icon pencil tiny" > < / i > < / a >
< a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div v - show = "isAdding" >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" placeholder = "用户名" v - model = "username" size = "15" ref = "username" / >
< / d i v >
< div class = "ui field" >
< input type = "password" placeholder = "密码" v - model = "password" size = "15" ref = "password" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirm" > 确定 < / b u t t o n > & n b s p ;
< a href = "" title = "取消" @ click . prevent = "cancel" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< / d i v >
< div v - if = "!isAdding" style = "margin-top: 1em" >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - l o c a t i o n - l a b e l s " , { p r o p s : [ " v - l o c a t i o n - c o n f i g " , " v - s e r v e r - i d " ] , d a t a : f u n c t i o n ( ) { r e t u r n { l o c a t i o n : t h i s . v L o c a t i o n C o n f i g } } , m e t h o d s : { c o n f i g I s O n : f u n c t i o n ( e ) { r e t u r n n u l l ! = e & & e . i s P r i o r & & e . i s O n } , r e f I s O n : f u n c t i o n ( e , t ) { r e t u r n t h i s . c o n f i g I s O n ( e ) & & n u l l ! = t & & t . i s O n } , l e n : f u n c t i o n ( e ) { r e t u r n n u l l = = e ? 0 : e . l e n g t h } , u r l : f u n c t i o n ( e ) { r e t u r n " / s e r v e r s / s e r v e r / s e t t i n g s / l o c a t i o n s " + e + " ? s e r v e r I d = " + t h i s . v S e r v e r I d + " & l o c a t i o n I d = " + t h i s . l o c a t i o n . i d } } , t e m p l a t e : ` < d i v c l a s s = " l a b e l s - b o x " >
2021-11-22 12:08:53 +08:00
<!-- 基本信息 -- >
< http - location - labels - label v - if = "location.name != null && location.name.length > 0" : class = "'olive'" : href = "url('/location')" > { { location . name } } < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
2021-12-12 17:14:46 +08:00
<!-- domains -- >
< div v - if = "location.domains != null && location.domains.length > 0" >
< grey - label v - for = "domain in location.domains" > { { domain } } < / g r e y - l a b e l >
< / d i v >
<!-- break -- >
2021-11-22 12:08:53 +08:00
< http - location - labels - label v - if = "location.isBreak" : href = "url('/location')" > BREAK < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
<!-- redirectToHTTPS -- >
< http - location - labels - label v - if = "location.web != null && configIsOn(location.web.redirectToHTTPS)" : href = "url('/http')" > 自动跳转HTTPS < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
<!-- Web -- >
< http - location - labels - label v - if = "location.web != null && configIsOn(location.web.root)" : href = "url('/web')" > 文档根目录 < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
<!-- 反向代理 -- >
< http - location - labels - label v - if = "refIsOn(location.reverseProxyRef, location.reverseProxy)" : v - href = "url('/reverseProxy')" > 反向代理 < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
<!-- WAF -- >
<!-- TODO -- >
<!-- Cache -- >
< http - location - labels - label v - if = "location.web != null && configIsOn(location.web.cache)" : v - href = "url('/cache')" > CACHE < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
<!-- Charset -- >
< http - location - labels - label v - if = "location.web != null && configIsOn(location.web.charset) && location.web.charset.charset.length > 0" : href = "url('/charset')" > { { location . web . charset . charset } } < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
<!-- 访问日志 -- >
<!-- TODO -- >
<!-- 统计 -- >
<!-- TODO -- >
<!-- Gzip -- >
< http - location - labels - label v - if = "location.web != null && refIsOn(location.web.gzipRef, location.web.gzip) && location.web.gzip.level > 0" : href = "url('/gzip')" > Gzip : { { location . web . gzip . level } } < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
<!-- HTTP Header -- >
< http - location - labels - label v - if = "location.web != null && refIsOn(location.web.requestHeaderPolicyRef, location.web.requestHeaderPolicy) && (len(location.web.requestHeaderPolicy.addHeaders) > 0 || len(location.web.requestHeaderPolicy.setHeaders) > 0 || len(location.web.requestHeaderPolicy.replaceHeaders) > 0 || len(location.web.requestHeaderPolicy.deleteHeaders) > 0)" : href = "url('/headers')" > 请求Header < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
< http - location - labels - label v - if = "location.web != null && refIsOn(location.web.responseHeaderPolicyRef, location.web.responseHeaderPolicy) && (len(location.web.responseHeaderPolicy.addHeaders) > 0 || len(location.web.responseHeaderPolicy.setHeaders) > 0 || len(location.web.responseHeaderPolicy.replaceHeaders) > 0 || len(location.web.responseHeaderPolicy.deleteHeaders) > 0)" : href = "url('/headers')" > 响应Header < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
<!-- Websocket -- >
< http - location - labels - label v - if = "location.web != null && refIsOn(location.web.websocketRef, location.web.websocket)" : href = "url('/websocket')" > Websocket < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
2022-03-26 22:10:34 +08:00
<!-- 请求脚本 -- >
< http - location - labels - label v - if = "location.web != null && location.web.requestScripts != null && ((location.web.requestScripts.initGroup != null && location.web.requestScripts.initGroup.isPrior) || (location.web.requestScripts.requestGroup != null && location.web.requestScripts.requestGroup.isPrior))" : href = "url('/requestScripts')" > 请求脚本 < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
2022-08-08 16:26:12 +08:00
<!-- 自定义访客IP地址 -- >
< http - location - labels - label v - if = "location.web != null && location.web.remoteAddr != null && location.web.remoteAddr.isPrior" : href = "url('/remoteAddr')" : class = "{disabled: !location.web.remoteAddr.isOn}" > 访客IP地址 < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
<!-- 请求限制 -- >
< http - location - labels - label v - if = "location.web != null && location.web.requestLimit != null && location.web.requestLimit.isPrior" : href = "url('/requestLimit')" : class = "{disabled: !location.web.requestLimit.isOn}" > 请求限制 < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
2022-04-04 19:46:12 +08:00
<!-- 自定义页面 -- >
2021-11-22 12:08:53 +08:00
< div v - if = "location.web != null && location.web.pages != null && location.web.pages.length > 0" >
< div v - for = "page in location.web.pages" : key = "page.id" > < http - location - labels - label : href = "url('/pages')" > PAGE [ 状态码 { { page . status [ 0 ] } } ] - & gt ; { { page . url } } < / h t t p - l o c a t i o n - l a b e l s - l a b e l > < / d i v >
< / d i v >
< div v - if = "location.web != null && configIsOn(location.web.shutdown)" >
< http - location - labels - label : v - class = "'red'" : href = "url('/pages')" > 临时关闭 < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
< / d i v >
<!-- 重写规则 -- >
< div v - if = "location.web != null && location.web.rewriteRules != null && location.web.rewriteRules.length > 0" >
< div v - for = "rewriteRule in location.web.rewriteRules" >
< http - location - labels - label : href = "url('/rewrite')" > REWRITE { { rewriteRule . pattern } } - & gt ; { { rewriteRule . replace } } < / h t t p - l o c a t i o n - l a b e l s - l a b e l >
< / d i v >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - l o c a t i o n - l a b e l s - l a b e l " , { p r o p s : [ " v - c l a s s " , " v - h r e f " ] , t e m p l a t e : ' < a : h r e f = " v H r e f " c l a s s = " u i l a b e l t i n y b a s i c " : c l a s s = " v C l a s s " s t y l e = " f o n t - s i z e : 0 . 7 e m ; p a d d i n g : 4 p x ; m a r g i n - t o p : 0 . 3 e m ; m a r g i n - b o t t o m : 0 . 3 e m " > < s l o t > < / s l o t > < / a > ' } ) , V u e . c o m p o n e n t ( " h t t p - g z i p - b o x " , { p r o p s : [ " v - g z i p - c o n f i g " , " v - g z i p - r e f " , " v - i s - l o c a t i o n " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v G z i p C o n f i g ; r e t u r n { g z i p : e = n u l l = = e ? { i s O n : ! 0 , l e v e l : 0 , m i n L e n g t h : n u l l , m a x L e n g t h : n u l l , c o n d s : n u l l } : e , a d v a n c e d V i s i b l e : ! 1 } } , m e t h o d s : { i s O n : f u n c t i o n ( ) { r e t u r n ( ! t h i s . v I s L o c a t i o n | | t h i s . v G z i p R e f . i s P r i o r ) & & t h i s . v G z i p R e f . i s O n } , c h a n g e A d v a n c e d V i s i b l e : f u n c t i o n ( e ) { t h i s . a d v a n c e d V i s i b l e = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "gzipRefJSON" : value = "JSON.stringify(vGzipRef)" / >
< table class = "ui table selectable definition" >
< prior - checkbox : v - config = "vGzipRef" v - if = "vIsLocation" > < / p r i o r - c h e c k b o x >
< tbody v - show = "!vIsLocation || vGzipRef.isPrior" >
< tr >
< td class = "title" > 启用Gzip压缩 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "vGzipRef.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "isOn()" >
< tr >
< td class = "title" > 压缩级别 < / t d >
< td >
< select class = "dropdown auto-width" name = "level" v - model = "gzip.level" >
< option value = "0" > 不压缩 < / o p t i o n >
< option v - for = "i in 9" : value = "i" > { { i } } < / o p t i o n >
< / s e l e c t >
< p class = "comment" > 级别越高 , 压缩比例越大 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< more - options - tbody @ change = "changeAdvancedVisible" v - if = "isOn()" > < / m o r e - o p t i o n s - t b o d y >
< tbody v - show = "isOn() && advancedVisible" >
< tr >
< td > Gzip内容最小长度 < / t d >
< td >
< size - capacity - box : v - name = "'minLength'" : v - value = "gzip.minLength" : v - unit = "'kb'" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > 0 表示不限制 , 内容长度从文件尺寸或Content - Length中获取 。 < / p >
< / t d >
< / t r >
< tr >
< td > Gzip内容最大长度 < / t d >
< td >
< size - capacity - box : v - name = "'maxLength'" : v - value = "gzip.maxLength" : v - unit = "'mb'" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > 0 表示不限制 , 内容长度从文件尺寸或Content - Length中获取 。 < / p >
< / t d >
< / t r >
< tr >
< td > 匹配条件 < / t d >
< td >
< http - request - conds - box : v - conds = "gzip.conds" > < / h t t p - r e q u e s t - c o n d s - b o x >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " s c r i p t - c o n f i g - b o x " , { p r o p s : [ " i d " , " v - s c r i p t - c o n f i g " , " c o m m e n t " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v S c r i p t C o n f i g ; r e t u r n 0 = = ( e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 , c o d e : " " } : e ) . c o d e . l e n g t h & & ( e . c o d e = " \ n \ n \ n \ n " ) , { c o n f i g : e } } , w a t c h : { " c o n f i g . i s O n " : f u n c t i o n ( ) { t h i s . c h a n g e ( ) } } , m e t h o d s : { c h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . c o n f i g ) } , c h a n g e C o d e : f u n c t i o n ( e ) { t h i s . c o n f i g . c o d e = e , t h i s . c h a n g e ( ) } } , t e m p l a t e : ` < d i v >
2021-12-31 15:20:59 +08:00
< table class = "ui table definition selectable" >
< tbody >
< tr >
< td class = "title" > 是否启用 < / t d >
< td > < checkbox v - model = "config.isOn" > < / c h e c k b o x > < / t d >
< / t r >
< / t b o d y >
< tbody >
< tr : style = "{opacity: !config.isOn ? 0.5 : 1}" >
< td > 脚本代码 < / t d >
< td > < source - code - box : id = "id" type = "text/javascript" : read - only = "false" @ change = "changeCode" > { { config . code } } < / s o u r c e - c o d e - b o x >
< p class = "comment" > { { comment } } < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " s s l - c e r t s - v i e w " , { p r o p s : [ " v - c e r t s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C e r t s ; r e t u r n { c e r t s : e = n u l l = = e ? [ ] : e } } , m e t h o d s : { f o r m a t T i m e : f u n c t i o n ( e ) { r e t u r n n e w D a t e ( 1 e 3 * e ) . f o r m a t ( " Y - m - d " ) } , v i e w C e r t : f u n c t i o n ( e ) { t e a w e b . p o p u p ( " / s e r v e r s / c e r t s / c e r t P o p u p ? c e r t I d = " + e , { h e i g h t : " 2 8 e m " , w i d t h : " 4 8 e m " } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div v - if = "certs != null && certs.length > 0" >
2022-05-05 11:25:23 +08:00
< div class = "ui label small basic" v - for = "(cert, index) in certs" >
{ { cert . name } } / { { cert . dnsNames } } / 有效至 { { formatTime ( cert . timeEndAt ) } } & nbsp ; < a href = "" title = "查看" @ click . prevent = "viewCert(cert.id)" > < i class = "icon expand blue" > < / i > < / a >
2021-11-22 12:08:53 +08:00
< / d i v >
< / d i v >
2022-05-20 22:07:04 +08:00
< /div>`}),Vue.component("http-firewall-captcha-options-viewer",{props:["v-captcha-options"],mounted:function(){this.updateSummary()},data:function(){let e=this.vCaptchaOptions;return{options:e=null==e?{life:0,maxFails:0,failBlockTimeout:0,failBlockScopeAll:!1,uiIsOn:!1,uiTitle:"",uiPrompt:"",uiButtonTitle:"",uiShowRequestId:!1,uiCss:"",uiFooter:"",uiBody:"",cookieId:"",lang:""}:e,summary:""}},methods:{updateSummary:function(){let e=[];0<this.options.life&&e.push("有效时间"+this.options.life+"秒"),0<this.options.maxFails&&e.push("最多失败"+this.options.maxFails+"次"),0<this.options.failBlockTimeout&&e.push("失败拦截"+this.options.failBlockTimeout+"秒"),this.options.failBlockScopeAll&&e.push("全局封禁"),this.options.uiIsOn&&e.push("定制UI"),0==e.length?this.summary="默认配置":this.summary=e.join(" / " ) } } , template : ` <div>{{summary}}</div>
2022-07-12 13:55:00 +08:00
` }),Vue.component("reverse-proxy-box",{props:["v-reverse-proxy-ref","v-reverse-proxy-config","v-is-location","v-is-group","v-family"],data:function(){let e=this.vReverseProxyRef,t=(null==e&&(e={isPrior:!1,isOn:!1,reverseProxyId:0}),this.vReverseProxyConfig),i=(null==(t=null==t?{requestPath:"",stripPrefix:"",requestURI:"",requestHost:"",requestHostType:0,requestHostExcludingPort:!1,addHeaders:[],connTimeout:{count:0,unit:"second"},readTimeout:{count:0,unit:"second"},idleTimeout:{count:0,unit:"second"},maxConns:0,maxIdleConns:0,followRedirects:!1}:t).addHeaders&&(t.addHeaders=[]),null==t.connTimeout&&(t.connTimeout={count:0,unit:"second"}),null==t.readTimeout&&(t.readTimeout={count:0,unit:"second"}),null==t.idleTimeout&&(t.idleTimeout={count:0,unit:"second"}),null==t.proxyProtocol&&Vue.set(t,"proxyProtocol",{isOn:!1,version:1}),[{name:"X-Real-IP",isChecked:!1},{name:"X-Forwarded-For",isChecked:!1},{name:"X-Forwarded-By",isChecked:!1},{name:"X-Forwarded-Host",isChecked:!1},{name:"X-Forwarded-Proto",isChecked:!1}]);return i.forEach(function(e){e.isChecked=t.addHeaders. $ contains(e.name)}),{reverseProxyRef:e,reverseProxyConfig:t,advancedVisible:!1,family:this.vFamily,forwardHeaders:i}},watch:{"reverseProxyConfig.requestHostType":function(e){let t=parseInt(e);isNaN(t)&&(t=0),this.reverseProxyConfig.requestHostType=t},"reverseProxyConfig.connTimeout.count":function(e){let t=parseInt(e);(isNaN(t)||t<0)&&(t=0),this.reverseProxyConfig.connTimeout.count=t},"reverseProxyConfig.readTimeout.count":function(e){let t=parseInt(e);(isNaN(t)||t<0)&&(t=0),this.reverseProxyConfig.readTimeout.count=t},"reverseProxyConfig.idleTimeout.count":function(e){let t=parseInt(e);(isNaN(t)||t<0)&&(t=0),this.reverseProxyConfig.idleTimeout.count=t},"reverseProxyConfig.maxConns":function(e){let t=parseInt(e);(isNaN(t)||t<0)&&(t=0),this.reverseProxyConfig.maxConns=t},"reverseProxyConfig.maxIdleConns":function(e){let t=parseInt(e);(isNaN(t)||t<0)&&(t=0),this.reverseProxyConfig.maxIdleConns=t},"reverseProxyConfig.proxyProtocol.version":function(e){let t=parseInt(e);isNaN(t)&&(t=1),this.reverseProxyConfig.proxyProtocol.version=t}},methods:{isOn:function(){return(!this.vIsLocation&&!this.vIsGroup||this.reverseProxyRef.isPrior)&&this.reverseProxyRef.isOn},changeAdvancedVisible:function(e){this.advancedVisible=e},changeAddHeader:function(){this.reverseProxyConfig.addHeaders=this.forwardHeaders.filter(function(e){return e.isChecked}).map(function(e){return e.name})}},template: ` < div >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "reverseProxyRefJSON" : value = "JSON.stringify(reverseProxyRef)" / >
< input type = "hidden" name = "reverseProxyJSON" : value = "JSON.stringify(reverseProxyConfig)" / >
< table class = "ui table selectable definition" >
< prior - checkbox : v - config = "reverseProxyRef" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || reverseProxyRef.isPrior" >
< tr >
2022-06-05 17:12:54 +08:00
< td class = "title" > 启用反向代理 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "reverseProxyRef.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< tr v - show = "family == null || family == 'http'" >
< td > 回源主机名 < em > ( Host ) < / e m > < / t d >
< td >
2022-07-12 13:55:00 +08:00
< radio : v - value = "0" v - model = "reverseProxyConfig.requestHostType" > 跟随CDN域名 < / r a d i o > & n b s p ;
2021-11-22 12:08:53 +08:00
< radio : v - value = "1" v - model = "reverseProxyConfig.requestHostType" > 跟随源站 < / r a d i o > & n b s p ;
< radio : v - value = "2" v - model = "reverseProxyConfig.requestHostType" > 自定义 < / r a d i o >
< div v - show = "reverseProxyConfig.requestHostType == 2" style = "margin-top: 0.8em" >
< input type = "text" placeholder = "比如example.com" v - model = "reverseProxyConfig.requestHost" / >
< / d i v >
< p class = "comment" > 请求源站时的Host , 用于修改源站接收到的域名
2022-07-12 13:55:00 +08:00
< span v - if = "reverseProxyConfig.requestHostType == 0" > , "跟随CDN域名" 是指源站接收到的域名和当前CDN访问域名保持一致 < / s p a n >
2021-11-22 12:08:53 +08:00
< span v - if = "reverseProxyConfig.requestHostType == 1" > , "跟随源站" 是指源站接收到的域名仍然是填写的源站地址中的信息 , 不随代理服务域名改变而改变 < / s p a n >
< span v - if = "reverseProxyConfig.requestHostType == 2" > , 自定义Host内容中支持请求变量 < / s p a n > 。 < / p >
< / t d >
< / t r >
2022-07-12 13:55:00 +08:00
< tr v - show = "family == null || family == 'http'" >
2022-07-17 21:19:45 +08:00
< td > 回源主机名移除端口 < / t d >
2022-07-12 13:55:00 +08:00
< td > < checkbox v - model = "reverseProxyConfig.requestHostExcludingPort" > < / c h e c k b o x >
< p class = "comment" > 选中后表示移除回源主机名中的端口部分 。 < / p >
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
< / t b o d y >
< more - options - tbody @ change = "changeAdvancedVisible" v - if = "isOn()" > < / m o r e - o p t i o n s - t b o d y >
< tbody v - show = "isOn() && advancedVisible" >
2022-03-14 16:24:09 +08:00
< tr v - show = "family == null || family == 'http'" >
< td > 回源跟随 < / t d >
< td >
< checkbox v - model = "reverseProxyConfig.followRedirects" > < / c h e c k b o x >
< p class = "comment" > 选中后 , 自动读取源站跳转后的网页内容 。 < / p >
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
< tr v - show = "family == null || family == 'http'" >
< td > 自动添加的Header < / t d >
< td >
< div >
< div style = "width: 14em; float: left; margin-bottom: 1em" v - for = "header in forwardHeaders" : key = "header.name" >
< checkbox v - model = "header.isChecked" @ input = "changeAddHeader" > { { header . name } } < / c h e c k b o x >
< / d i v >
< div style = "clear: both" > < / d i v >
< / d i v >
< p class = "comment" > 选中后 , 会自动向源站请求添加这些Header 。 < / p >
< / t d >
< / t r >
< tr v - show = "family == null || family == 'http'" >
< td > 请求URI < em > ( RequestURI ) < / e m > < / t d >
< td >
< input type = "text" placeholder = "\${requestURI}" v - model = "reverseProxyConfig.requestURI" / >
< p class = "comment" > \ $ { requestURI } 为完整的请求URI , 可以使用类似于 "\${requestURI}?arg1=value1&arg2=value2" 的形式添加你的参数 。 < / p >
< / t d >
< / t r >
< tr v - show = "family == null || family == 'http'" >
< td > 去除URL前缀 < em > ( StripPrefix ) < / e m > < / t d >
< td >
< input type = "text" v - model = "reverseProxyConfig.stripPrefix" placeholder = "/PREFIX" / >
< p class = "comment" > 可以把请求的路径部分前缀去除后再查找文件 , 比如把 < span class = "ui label tiny" > / w e b / a p p / i n d e x . h t m l < / s p a n > 去 除 前 缀 < s p a n c l a s s = " u i l a b e l t i n y " > / w e b < / s p a n > 后 就 变 成 < s p a n c l a s s = " u i l a b e l t i n y " > / a p p / i n d e x . h t m l < / s p a n > 。 < / p >
< / t d >
< / t r >
< tr v - if = "family == null || family == 'http'" >
< td > 是否自动刷新缓存区 < em > ( AutoFlush ) < / e m > < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "reverseProxyConfig.autoFlush" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 开启后将自动刷新缓冲区数据到客户端 , 在类似于SSE ( server - sent events ) 等场景下很有用 。 < / p >
< / t d >
< / t r >
< tr v - if = "family == null || family == 'http'" >
< td class = "color-border" > 源站连接失败超时时间 < / t d >
< td >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" name = "connTimeout" value = "10" size = "6" v - model = "reverseProxyConfig.connTimeout.count" / >
< / d i v >
< div class = "ui field" >
秒
< / d i v >
< / d i v >
< p class = "comment" > 连接源站失败的最大超时时间 , 0 表示不限制 。 < / p >
< / t d >
< / t r >
< tr v - if = "family == null || family == 'http'" >
< td class = "color-border" > 源站读取超时时间 < / t d >
< td >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" name = "readTimeout" value = "0" size = "6" v - model = "reverseProxyConfig.readTimeout.count" / >
< / d i v >
< div class = "ui field" >
秒
< / d i v >
< / d i v >
< p class = "comment" > 读取内容时的最大超时时间 , 0 表示不限制 。 < / p >
< / t d >
< / t r >
< tr v - if = "family == null || family == 'http'" >
< td class = "color-border" > 源站最大并发连接数 < / t d >
< td >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" name = "maxConns" value = "0" size = "6" maxlength = "10" v - model = "reverseProxyConfig.maxConns" / >
< / d i v >
< / d i v >
< p class = "comment" > 源站可以接受到的最大并发连接数 , 0 表示使用系统默认 。 < / p >
< / t d >
< / t r >
< tr v - if = "family == null || family == 'http'" >
< td class = "color-border" > 源站最大空闲连接数 < / t d >
< td >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" name = "maxIdleConns" value = "0" size = "6" maxlength = "10" v - model = "reverseProxyConfig.maxIdleConns" / >
< / d i v >
< / d i v >
< p class = "comment" > 当没有请求时 , 源站保持等待的最大空闲连接数量 , 0 表示使用系统默认 。 < / p >
< / t d >
< / t r >
< tr v - if = "family == null || family == 'http'" >
< td class = "color-border" > 源站最大空闲超时时间 < / t d >
< td >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" name = "idleTimeout" value = "0" size = "6" v - model = "reverseProxyConfig.idleTimeout.count" / >
< / d i v >
< div class = "ui field" >
秒
< / d i v >
< / d i v >
< p class = "comment" > 源站保持等待的空闲超时时间 , 0 表示使用默认时间 。 < / p >
< / t d >
< / t r >
< tr v - show = "family != 'unix'" >
< td > PROXY Protocol < / t d >
< td >
< checkbox name = "proxyProtocolIsOn" v - model = "reverseProxyConfig.proxyProtocol.isOn" > < / c h e c k b o x >
< p class = "comment" > 选中后表示启用PROXY Protocol , 每次连接源站时都会在头部写入客户端地址信息 。 < / p >
< / t d >
< / t r >
< tr v - show = "family != 'unix' && reverseProxyConfig.proxyProtocol.isOn" >
< td > PROXY Protocol版本 < / t d >
< td >
< select class = "ui dropdown auto-width" name = "proxyProtocolVersion" v - model = "reverseProxyConfig.proxyProtocol.version" >
< option value = "1" > 1 < / o p t i o n >
< option value = "2" > 2 < / o p t i o n >
< / s e l e c t >
< p class = "comment" v - if = "reverseProxyConfig.proxyProtocol.version == 1" > 发送类似于 < code - label > PROXY TCP4 192.168 . 1.1 192.168 . 1.10 32567 443 < / c o d e - l a b e l > 的 头 部 信 息 。 < / p >
< p class = "comment" v - if = "reverseProxyConfig.proxyProtocol.version == 2" > 发送二进制格式的头部信息 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - f i r e w a l l - p a r a m - f i l t e r s - b o x " , { p r o p s : [ " v - f i l t e r s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v F i l t e r s ; r e t u r n { f i l t e r s : e = n u l l = = e ? [ ] : e , i s A d d i n g : ! 1 , o p t i o n s : [ { n a m e : " M D 5 " , c o d e : " m d 5 " } , { n a m e : " U R L E n c o d e " , c o d e : " u r l E n c o d e " } , { n a m e : " U R L D e c o d e " , c o d e : " u r l D e c o d e " } , { n a m e : " B A S E 6 4 E n c o d e " , c o d e : " b a s e 6 4 E n c o d e " } , { n a m e : " B A S E 6 4 D e c o d e " , c o d e : " b a s e 6 4 D e c o d e " } , { n a m e : " U N I C O D E 编 码 " , c o d e : " u n i c o d e E n c o d e " } , { n a m e : " U N I C O D E 解 码 " , c o d e : " u n i c o d e D e c o d e " } , { n a m e : " H T M L 实 体 编 码 " , c o d e : " h t m l E s c a p e " } , { n a m e : " H T M L 实 体 解 码 " , c o d e : " h t m l U n e s c a p e " } , { n a m e : " 计 算 长 度 " , c o d e : " l e n g t h " } , { n a m e : " 十 六 进 制 - > 十 进 制 " , c o d e : " h e x 2 d e c " } , { n a m e : " 十 进 制 - > 十 六 进 制 " , c o d e : " d e c 2 h e x " } , { n a m e : " S H A 1 " , c o d e : " s h a 1 " } , { n a m e : " S H A 2 5 6 " , c o d e : " s h a 2 5 6 " } ] , a d d i n g C o d e : " " } } , m e t h o d s : { a d d : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 0 , t h i s . a d d i n g C o d e = " " } , c o n f i r m : f u n c t i o n ( ) { i f ( 0 ! = t h i s . a d d i n g C o d e . l e n g t h ) { l e t i = t h i s ; t h i s . f i l t e r s . p u s h ( t h i s . o p t i o n s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . c o d e = = i . a d d i n g C o d e } ) ) , t h i s . i s A d d i n g = ! 1 } } , c a n c e l : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 } , r e m o v e : f u n c t i o n ( e ) { t h i s . f i l t e r s . $ r e m o v e ( e ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "paramFiltersJSON" : value = "JSON.stringify(filters)" / >
< div v - if = "filters.length > 0" >
< div v - for = "(filter, index) in filters" class = "ui label small basic" >
{ { filter . name } } < a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div v - if = "isAdding" >
< div class = "ui fields inline" >
< div class = "ui field" >
< select class = "ui dropdown auto-width" v - model = "addingCode" >
< option value = "" > [ 请选择 ] < / o p t i o n >
< option v - for = "option in options" : value = "option.code" > { { option . name } } < / o p t i o n >
< / s e l e c t >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirm()" > 确定 < / b u t t o n >
& nbsp ; < a href = "" @ click . prevent = "cancel()" title = "取消" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< / d i v >
< / d i v >
< div v - if = "!isAdding" >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
< p class = "comment" > 可以对参数值进行特定的编解码处理 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - r e m o t e - a d d r - c o n f i g - b o x " , { p r o p s : [ " v - r e m o t e - a d d r - c o n f i g " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R e m o t e A d d r C o n f i g , t = " " ; r e t u r n ( e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 , v a l u e : " $ { r a w R e m o t e A d d r } " , i s C u s t o m i z e d : ! 1 } : e ) . i s C u s t o m i z e d | | " $ { r e m o t e A d d r } " ! = e . v a l u e & & " $ { r a w R e m o t e A d d r } " ! = e . v a l u e | | ( t = e . v a l u e ) , { c o n f i g : e , o p t i o n s : [ { n a m e : " 直 接 获 取 " , d e s c r i p t i o n : ' 用 户 直 接 访 问 边 缘 节 点 , 即 " 用 户 - - \ x 3 e 边 缘 节 点 " 模 式 , 这 时 候 可 以 直 接 从 连 接 中 读 取 到 真 实 的 I P 地 址 。 ' , v a l u e : " $ { r a w R e m o t e A d d r } " } , { n a m e : " 从 上 级 代 理 中 获 取 " , d e s c r i p t i o n : ' 用 户 和 边 缘 节 点 之 间 有 别 的 代 理 服 务 转 发 , 即 " 用 户 - - \ x 3 e [ 第 三 方 代 理 服 务 ] - - \ x 3 e 边 缘 节 点 " , 这 时 候 只 能 从 上 级 代 理 中 获 取 传 递 的 I P 地 址 。 ' , v a l u e : " $ { r e m o t e A d d r } " } , { n a m e : " [ 自 定 义 ] " , d e s c r i p t i o n : " 通 过 自 定 义 变 量 来 获 取 客 户 端 真 实 的 I P 地 址 。 " , v a l u e : " " } ] , o p t i o n V a l u e : t } } , m e t h o d s : { i s O n : f u n c t i o n ( ) { r e t u r n ( ! t h i s . v I s L o c a t i o n & & ! t h i s . v I s G r o u p | | t h i s . c o n f i g . i s P r i o r ) & & t h i s . c o n f i g . i s O n } , c h a n g e O p t i o n V a l u e : f u n c t i o n ( ) { 0 < t h i s . o p t i o n V a l u e . l e n g t h ? ( t h i s . c o n f i g . v a l u e = t h i s . o p t i o n V a l u e , t h i s . c o n f i g . i s C u s t o m i z e d = ! 1 ) : t h i s . c o n f i g . i s C u s t o m i z e d = ! 0 } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "remoteAddrJSON" : value = "JSON.stringify(config)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "config" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || config.isPrior" >
< tr >
< td class = "title" > 是否启用 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" value = "1" v - model = "config.isOn" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 选中后表示使用自定义的请求变量获取客户端IP 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "isOn()" >
< tr >
< td > 获取IP方式 * < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "optionValue" @ change = "changeOptionValue" >
< option v - for = "option in options" : value = "option.value" > { { option . name } } < / o p t i o n >
< / s e l e c t >
< p class = "comment" v - for = "option in options" v - if = "option.value == optionValue && option.description.length > 0" > { { option . description } } < / p >
< / t d >
< / t r >
< tr v - show = "optionValue.length == 0" >
< td > 读取IP变量值 * < / t d >
< td >
< input type = "hidden" v - model = "config.value" maxlength = "100" / >
< div v - if = "optionValue == ''" style = "margin-top: 1em" >
< input type = "text" v - model = "config.value" maxlength = "100" / >
< p class = "comment" > 通过此变量获取用户的IP地址 。 具体可用的请求变量列表可参考官方网站文档 。 < / p >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - a c c e s s - l o g - s e a r c h - b o x " , { p r o p s : [ " v - i p " , " v - d o m a i n " , " v - k e y w o r d " , " v - c l u s t e r - i d " , " v - n o d e - i d " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v I p , t = ( n u l l = = e & & ( e = " " ) , t h i s . v D o m a i n ) , i = ( n u l l = = t & & ( t = " " ) , t h i s . v K e y w o r d ) ; r e t u r n n u l l = = i & & ( i = " " ) , { i p : e , d o m a i n : t , k e y w o r d : i , c l u s t e r I d : t h i s . v C l u s t e r I d } } , m e t h o d s : { c l e a n I P : f u n c t i o n ( ) { t h i s . i p = " " , t h i s . s u b m i t ( ) } , c l e a n D o m a i n : f u n c t i o n ( ) { t h i s . d o m a i n = " " , t h i s . s u b m i t ( ) } , c l e a n K e y w o r d : f u n c t i o n ( ) { t h i s . k e y w o r d = " " , t h i s . s u b m i t ( ) } , s u b m i t : f u n c t i o n ( ) { l e t e = t h i s . $ e l . p a r e n t N o d e ; f o r ( ; ; ) { i f ( n u l l = = e ) b r e a k ; i f ( " F O R M " = = e . t a g N a m e ) b r e a k ; e = e . p a r e n t N o d e } n u l l ! = e & & s e t T i m e o u t ( f u n c t i o n ( ) { e . s u b m i t ( ) } , 5 0 0 ) } , c h a n g e C l u s t e r : f u n c t i o n ( e ) { t h i s . c l u s t e r I d = e } } , t e m p l a t e : ` < d i v s t y l e = " z - i n d e x : 1 0 " >
2021-11-22 12:08:53 +08:00
< div class = "margin" > < / d i v >
< div class = "ui fields inline" >
< div class = "ui field" >
< div class = "ui input left right labeled small" >
< span class = "ui label basic" style = "font-weight: normal" > IP < / s p a n >
< input type = "text" name = "ip" placeholder = "x.x.x.x" size = "15" v - model = "ip" / >
< a class = "ui label basic" : class = "{disabled: ip.length == 0}" @ click . prevent = "cleanIP" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< div class = "ui field" >
< div class = "ui input left right labeled small" >
< span class = "ui label basic" style = "font-weight: normal" > 域名 < / s p a n >
< input type = "text" name = "domain" placeholder = "xxx.com" size = "15" v - model = "domain" / >
< a class = "ui label basic" : class = "{disabled: domain.length == 0}" @ click . prevent = "cleanDomain" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< div class = "ui field" >
< div class = "ui input left right labeled small" >
< span class = "ui label basic" style = "font-weight: normal" > 关键词 < / s p a n >
2022-06-19 20:19:58 +08:00
< input type = "text" name = "keyword" v - model = "keyword" placeholder = "路径、UserAgent、请求ID等..." size = "30" / >
2021-11-22 12:08:53 +08:00
< a class = "ui label basic" : class = "{disabled: keyword.length == 0}" @ click . prevent = "cleanKeyword" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
2022-06-12 20:36:05 +08:00
< div class = "ui field" > < tip - icon content = "一些特殊的关键词:<br/>单个状态码: status:200<br/>状态码范围: status:500-504<br/>查询IP: ip:192.168.1.100<br/>查询URL: https://goedge.cn/docs<br/>查询路径部分: requestPath:/hello/world<br/>查询协议版本: proto:HTTP/1.1<br/>协议: scheme:http" > < / t i p - i c o n > < / d i v >
2022-01-11 12:04:03 +08:00
< / d i v >
< div class = "ui fields inline" style = "margin-top: 0.5em" >
2022-01-11 15:28:50 +08:00
< div class = "ui field" >
< node - cluster - combo - box : v - cluster - id = "clusterId" @ change = "changeCluster" > < / n o d e - c l u s t e r - c o m b o - b o x >
2022-01-11 12:04:03 +08:00
< / d i v >
2022-01-11 15:28:50 +08:00
< div class = "ui field" v - if = "clusterId > 0" >
< node - combo - box : v - cluster - id = "clusterId" : v - node - id = "vNodeId" > < / n o d e - c o m b o - b o x >
2022-01-11 12:04:03 +08:00
< / d i v >
2022-03-10 21:32:56 +08:00
< slot > < / s l o t >
2021-11-22 12:08:53 +08:00
< div class = "ui field" >
2022-01-11 12:04:03 +08:00
< button class = "ui button small" type = "submit" > 搜索日志 < / b u t t o n >
2021-11-22 12:08:53 +08:00
< / d i v >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m e t r i c - k e y - l a b e l " , { p r o p s : [ " v - k e y " ] , d a t a : f u n c t i o n ( ) { r e t u r n { k e y D e f s : w i n d o w . M E T R I C _ H T T P _ K E Y S } } , m e t h o d s : { k e y N a m e : f u n c t i o n ( i ) { l e t s = t h i s , n = " " ; v a r e = t h i s . k e y D e f s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . c o d e = = i | | ( i . s t a r t s W i t h ( " $ { a r g . " ) & & t . c o d e . s t a r t s W i t h ( " $ { a r g . " ) ? ( n = s . g e t S u b K e y ( " a r g . " , i ) , ! 0 ) : i . s t a r t s W i t h ( " $ { h e a d e r . " ) & & t . c o d e . s t a r t s W i t h ( " $ { h e a d e r . " ) ? ( n = s . g e t S u b K e y ( " h e a d e r . " , i ) , ! 0 ) : ! ( ! i . s t a r t s W i t h ( " $ { c o o k i e . " ) | | ! t . c o d e . s t a r t s W i t h ( " $ { c o o k i e . " ) ) & & ( n = s . g e t S u b K e y ( " c o o k i e . " , i ) , ! 0 ) ) } ) ; r e t u r n n u l l ! = e ? 0 < n . l e n g t h ? e . n a m e + " : " + n : e . n a m e : i } , g e t S u b K e y : f u n c t i o n ( e , t ) { v a r i = t . i n d e x O f ( e = " $ { " + e ) ; r e t u r n 0 < = i ? ( t = t . s u b s t r i n g ( i + e . l e n g t h ) ) . s u b s t r i n g ( 0 , t . l e n g t h - 1 ) : " " } } , t e m p l a t e : ` < d i v c l a s s = " u i l a b e l b a s i c s m a l l " >
2021-11-22 12:08:53 +08:00
{ { keyName ( this . vKey ) } }
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m e t r i c - k e y s - c o n f i g - b o x " , { p r o p s : [ " v - k e y s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v K e y s ; r e t u r n { k e y s : e = n u l l = = e ? [ ] : e , i s A d d i n g : ! 1 , k e y : " " , s u b K e y : " " , k e y D e s c r i p t i o n : " " , k e y D e f s : w i n d o w . M E T R I C _ H T T P _ K E Y S } } , w a t c h : { k e y s : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . k e y s ) } } , m e t h o d s : { c a n c e l : f u n c t i o n ( ) { t h i s . k e y = " " , t h i s . s u b K e y = " " , t h i s . k e y D e s c r i p t i o n = " " , t h i s . i s A d d i n g = ! 1 } , c o n f i r m : f u n c t i o n ( ) { i f ( 0 ! = t h i s . k e y . l e n g t h ) { i f ( 0 < t h i s . k e y . i n d e x O f ( " . N A M E " ) ) { i f ( 0 = = t h i s . s u b K e y . l e n g t h ) r e t u r n v o i d t e a w e b . w a r n ( " 请 输 入 参 数 值 " ) ; t h i s . k e y = t h i s . k e y . r e p l a c e ( " . N A M E " , " . " + t h i s . s u b K e y ) } t h i s . k e y s . p u s h ( t h i s . k e y ) , t h i s . c a n c e l ( ) } } , a d d : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 0 ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { n u l l ! = e . $ r e f s . k e y & & e . $ r e f s . k e y . f o c u s ( ) } , 1 0 0 ) } , r e m o v e : f u n c t i o n ( e ) { t h i s . k e y s . $ r e m o v e ( e ) } , c h a n g e K e y : f u n c t i o n ( ) { i f ( 0 ! = t h i s . k e y . l e n g t h ) { l e t i = t h i s ; v a r e = t h i s . k e y D e f s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . c o d e = = i . k e y } ) ; n u l l ! = e & & ( t h i s . k e y D e s c r i p t i o n = e . d e s c r i p t i o n ) } } , k e y N a m e : f u n c t i o n ( i ) { l e t s = t h i s , n = " " ; v a r e = t h i s . k e y D e f s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . c o d e = = i | | ( i . s t a r t s W i t h ( " $ { a r g . " ) & & t . c o d e . s t a r t s W i t h ( " $ { a r g . " ) ? ( n = s . g e t S u b K e y ( " a r g . " , i ) , ! 0 ) : i . s t a r t s W i t h ( " $ { h e a d e r . " ) & & t . c o d e . s t a r t s W i t h ( " $ { h e a d e r . " ) ? ( n = s . g e t S u b K e y ( " h e a d e r . " , i ) , ! 0 ) : ! ( ! i . s t a r t s W i t h ( " $ { c o o k i e . " ) | | ! t . c o d e . s t a r t s W i t h ( " $ { c o o k i e . " ) ) & & ( n = s . g e t S u b K e y ( " c o o k i e . " , i ) , ! 0 ) ) } ) ; r e t u r n n u l l ! = e ? 0 < n . l e n g t h ? e . n a m e + " : " + n : e . n a m e : i } , g e t S u b K e y : f u n c t i o n ( e , t ) { v a r i = t . i n d e x O f ( e = " $ { " + e ) ; r e t u r n 0 < = i ? ( t = t . s u b s t r i n g ( i + e . l e n g t h ) ) . s u b s t r i n g ( 0 , t . l e n g t h - 1 ) : " " } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "keysJSON" : value = "JSON.stringify(keys)" / >
< div >
< div v - for = "(key, index) in keys" class = "ui label small basic" >
{ { keyName ( key ) } } & nbsp ; < a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< div v - if = "isAdding" style = "margin-top: 1em" >
< div class = "ui fields inline" >
< div class = "ui field" >
< select class = "ui dropdown" v - model = "key" @ change = "changeKey" >
< option value = "" > [ 选择对象 ] < / o p t i o n >
< option v - for = "def in keyDefs" : value = "def.code" > { { def . name } } < / o p t i o n >
< / s e l e c t >
< / d i v >
< div class = "ui field" v - if = "key == '\${arg.NAME}'" >
< input type = "text" v - model = "subKey" placeholder = "参数名" size = "15" / >
< / d i v >
< div class = "ui field" v - if = "key == '\${header.NAME}'" >
< input type = "text" v - model = "subKey" placeholder = "Header名" size = "15" >
< / d i v >
< div class = "ui field" v - if = "key == '\${cookie.NAME}'" >
< input type = "text" v - model = "subKey" placeholder = "Cookie名" size = "15" >
< / d i v >
< div class = "ui field" >
< button type = "button" class = "ui button tiny" @ click . prevent = "confirm" > 确定 < / b u t t o n >
< a href = "" @ click . prevent = "cancel" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< p class = "comment" v - if = "keyDescription.length > 0" > { { keyDescription } } < / p >
< / d i v >
< div style = "margin-top: 1em" v - if = "!isAdding" >
< button type = "button" class = "ui button tiny" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - w e b - r o o t - b o x " , { p r o p s : [ " v - r o o t - c o n f i g " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R o o t C o n f i g ; r e t u r n n u l l = = ( e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 0 , d i r : " " , i n d e x e s : [ ] , s t r i p P r e f i x : " " , d e c o d e P a t h : ! 1 , i s B r e a k : ! 1 } : e ) . i n d e x e s & & ( e . i n d e x e s = [ ] ) , { r o o t C o n f i g : e , a d v a n c e d V i s i b l e : ! 1 } } , m e t h o d s : { c h a n g e A d v a n c e d V i s i b l e : f u n c t i o n ( e ) { t h i s . a d v a n c e d V i s i b l e = e } , a d d I n d e x : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / w e b / c r e a t e I n d e x " , { h e i g h t : " 1 0 e m " , c a l l b a c k : f u n c t i o n ( e ) { t . r o o t C o n f i g . i n d e x e s . p u s h ( e . d a t a . i n d e x ) } } ) } , r e m o v e I n d e x : f u n c t i o n ( e ) { t h i s . r o o t C o n f i g . i n d e x e s . $ r e m o v e ( e ) } , i s O n : f u n c t i o n ( ) { r e t u r n ( ! t h i s . v I s L o c a t i o n & & ! t h i s . v I s G r o u p | | t h i s . r o o t C o n f i g . i s P r i o r ) & & t h i s . r o o t C o n f i g . i s O n } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "rootJSON" : value = "JSON.stringify(rootConfig)" / >
< table class = "ui table selectable definition" >
< prior - checkbox : v - config = "rootConfig" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || rootConfig.isPrior" >
< tr >
< td class = "title" > 是否开启静态资源分发 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "rootConfig.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "isOn()" >
< tr >
< td class = "title" > 静态资源根目录 < / t d >
< td >
< input type = "text" name = "root" v - model = "rootConfig.dir" ref = "focus" placeholder = "类似于 /home/www" / >
< p class = "comment" > 可以访问此根目录下的静态资源 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< more - options - tbody @ change = "changeAdvancedVisible" v - if = "isOn()" > < / m o r e - o p t i o n s - t b o d y >
< tbody v - show = "isOn() && advancedVisible" >
< tr >
< td > 首页文件 < / t d >
< td >
<!-- TODO 支持排序 -- >
< div v - if = "rootConfig.indexes.length > 0" >
< div v - for = "(index, i) in rootConfig.indexes" class = "ui label tiny" >
{ { index } } < a href = "" title = "删除" @ click . prevent = "removeIndex(i)" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< button class = "ui button tiny" type = "button" @ click . prevent = "addIndex()" > + < / b u t t o n >
< p class = "comment" > 在URL中只有目录没有文件名时默认查找的首页文件 。 < / p >
< / t d >
< / t r >
< tr >
< td > 去除URL前缀 < / t d >
< td >
< input type = "text" v - model = "rootConfig.stripPrefix" placeholder = "/PREFIX" / >
< p class = "comment" > 可以把请求的路径部分前缀去除后再查找文件 , 比如把 < span class = "ui label tiny" > / w e b / a p p / i n d e x . h t m l < / s p a n > 去 除 前 缀 < s p a n c l a s s = " u i l a b e l t i n y " > / w e b < / s p a n > 后 就 变 成 < s p a n c l a s s = " u i l a b e l t i n y " > / a p p / i n d e x . h t m l < / s p a n > 。 < / p >
< / t d >
< / t r >
< tr >
< td > 路径解码 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "rootConfig.decodePath" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 是否对请求路径进行URL解码 , 比如把 < span class = "ui label tiny" > / W e b + A p p + B r o w s e r . h t m l < / s p a n > 解 码 成 < s p a n c l a s s = " u i l a b e l t i n y " > / W e b A p p B r o w s e r . h t m l < / s p a n > 再 查 找 文 件 。 < / p >
< / t d >
< / t r >
< tr >
< td > 是否终止请求 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "rootConfig.isBreak" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 在找不到要访问的文件的情况下是否终止请求并返回404 , 如果选择终止请求 , 则不再尝试反向代理等设置 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - w e b p - c o n f i g - b o x " , { p r o p s : [ " v - w e b p - c o n f i g " , " v - i s - l o c a t i o n " , " v - i s - g r o u p " , " v - r e q u i r e - c a c h e " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v W e b p C o n f i g ; r e t u r n n u l l = = ( e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 1 , q u a l i t y : 5 0 , m i n L e n g t h : { c o u n t : 0 , u n i t : " k b " } , m a x L e n g t h : { c o u n t : 0 , u n i t : " k b " } , m i m e T y p e s : [ " i m a g e / p n g " , " i m a g e / j p e g " , " i m a g e / b m p " , " i m a g e / x - i c o " , " i m a g e / g i f " ] , e x t e n s i o n s : [ " . p n g " , " . j p e g " , " . j p g " , " . b m p " , " . i c o " ] , c o n d s : n u l l } : e ) . m i m e T y p e s & & ( e . m i m e T y p e s = [ ] ) , n u l l = = e . e x t e n s i o n s & & ( e . e x t e n s i o n s = [ ] ) , { c o n f i g : e , m o r e O p t i o n s V i s i b l e : ! 1 , q u a l i t y : e . q u a l i t y } } , w a t c h : { q u a l i t y : f u n c t i o n ( e ) { l e t t = p a r s e I n t ( e ) ; i s N a N ( t ) ? t = 9 0 : t < 1 ? t = 1 : 1 0 0 < t & & ( t = 1 0 0 ) , t h i s . c o n f i g . q u a l i t y = t } } , m e t h o d s : { i s O n : f u n c t i o n ( ) { r e t u r n ( ! t h i s . v I s L o c a t i o n & & ! t h i s . v I s G r o u p | | t h i s . c o n f i g . i s P r i o r ) & & t h i s . c o n f i g . i s O n } , c h a n g e E x t e n s i o n s : f u n c t i o n ( i ) { i . f o r E a c h ( f u n c t i o n ( e , t ) { 0 < e . l e n g t h & & " . " ! = e [ 0 ] & & ( i [ t ] = " . " + e ) } ) , t h i s . c o n f i g . e x t e n s i o n s = i } , c h a n g e M i m e T y p e s : f u n c t i o n ( e ) { t h i s . c o n f i g . m i m e T y p e s = e } , c h a n g e A d v a n c e d V i s i b l e : f u n c t i o n ( ) { t h i s . m o r e O p t i o n s V i s i b l e = ! t h i s . m o r e O p t i o n s V i s i b l e } , c h a n g e C o n d s : f u n c t i o n ( e ) { t h i s . c o n f i g . c o n d s = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "webpJSON" : value = "JSON.stringify(config)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "config" v - if = "vIsLocation || vIsGroup" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!vIsLocation && !vIsGroup) || config.isPrior" >
< tr >
2022-04-04 19:46:12 +08:00
< td class = "title" > 启用 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" value = "1" v - model = "config.isOn" / >
< label > < / l a b e l >
< / d i v >
2022-04-04 19:46:12 +08:00
< p class = "comment" > 选中后表示开启自动WebP压缩 < span v - if = "vRequireCache" > ; 只有满足缓存条件的图片内容才会被转换 < / s p a n > 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "isOn()" >
< tr >
< td > 图片质量 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" v - model = "quality" style = "width: 5em" maxlength = "4" / >
< span class = "ui label" > % < / s p a n >
< / d i v >
< p class = "comment" > 取值在0到100之间 , 数值越大生成的图像越清晰 , 同时文件尺寸也会越大 。 < / p >
< / t d >
< / t r >
< tr >
< td > 支持的扩展名 < / t d >
< td >
< values - box : values = "config.extensions" @ change = "changeExtensions" placeholder = "比如 .html" > < / v a l u e s - b o x >
< p class = "comment" > 含有这些扩展名的URL将会被转成WebP , 不区分大小写 。 < / p >
< / t d >
< / t r >
< tr >
< td > 支持的MimeType < / t d >
< td >
< values - box : values = "config.mimeTypes" @ change = "changeMimeTypes" placeholder = "比如 text/*" > < / v a l u e s - b o x >
< p class = "comment" > 响应的Content - Type里包含这些MimeType的内容将会被转成WebP 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< more - options - tbody @ change = "changeAdvancedVisible" v - if = "isOn()" > < / m o r e - o p t i o n s - t b o d y >
< tbody v - show = "isOn() && moreOptionsVisible" >
< tr >
< td > 内容最小长度 < / t d >
< td >
< size - capacity - box : v - name = "'minLength'" : v - value = "config.minLength" : v - unit = "'kb'" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > 0 表示不限制 , 内容长度从文件尺寸或Content - Length中获取 。 < / p >
< / t d >
< / t r >
< tr >
< td > 内容最大长度 < / t d >
< td >
< size - capacity - box : v - name = "'maxLength'" : v - value = "config.maxLength" : v - unit = "'mb'" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > 0 表示不限制 , 内容长度从文件尺寸或Content - Length中获取 。 < / p >
< / t d >
< / t r >
< tr >
< td > 匹配条件 < / t d >
< td >
< http - request - conds - box : v - conds = "config.conds" @ change = "changeConds" > < / h t t p - r e q u e s t - c o n d s - b o x >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "ui margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " o r i g i n - s c h e d u l i n g - v i e w - b o x " , { p r o p s : [ " v - s c h e d u l i n g " , " v - p a r a m s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v S c h e d u l i n g ; r e t u r n { s c h e d u l i n g : e = n u l l = = e ? { } : e } } , m e t h o d s : { u p d a t e : f u n c t i o n ( ) { t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / r e v e r s e P r o x y / u p d a t e S c h e d u l i n g P o p u p ? " + t h i s . v P a r a m s , { h e i g h t : " 2 1 e m " , c a l l b a c k : f u n c t i o n ( ) { w i n d o w . l o c a t i o n . r e l o a d ( ) } } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div class = "margin" > < / d i v >
< table class = "ui table selectable definition" >
< tr >
< td class = "title" > 当前正在使用的算法 < / t d >
< td >
{ { scheduling . name } } & nbsp ; < a href = "" @ click . prevent = "update()" > < span > [ 修改 ] < / s p a n > < / a >
< p class = "comment" > { { scheduling . description } } < / p >
< / t d >
< / t r >
< / t a b l e >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - f i r e w a l l - b l o c k - o p t i o n s " , { p r o p s : [ " v - b l o c k - o p t i o n s " ] , d a t a : f u n c t i o n ( ) { r e t u r n { b l o c k O p t i o n s : t h i s . v B l o c k O p t i o n s , s t a t u s C o d e : t h i s . v B l o c k O p t i o n s . s t a t u s C o d e , t i m e o u t : t h i s . v B l o c k O p t i o n s . t i m e o u t , i s E d i t i n g : ! 1 } } , w a t c h : { s t a t u s C o d e : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) ; i s N a N ( e ) ? t h i s . b l o c k O p t i o n s . s t a t u s C o d e = 4 0 3 : t h i s . b l o c k O p t i o n s . s t a t u s C o d e = e } , t i m e o u t : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) ; i s N a N ( e ) ? t h i s . b l o c k O p t i o n s . t i m e o u t = 0 : t h i s . b l o c k O p t i o n s . t i m e o u t = e } } , m e t h o d s : { e d i t : f u n c t i o n ( ) { t h i s . i s E d i t i n g = ! t h i s . i s E d i t i n g } } , t e m p l a t e : ` < d i v >
2022-01-11 12:04:03 +08:00
< input type = "hidden" name = "blockOptionsJSON" : value = "JSON.stringify(blockOptions)" / >
< a href = "" @ click . prevent = "edit" > 状态码 : { { statusCode } } / 提示内容 : < span v - if = "blockOptions.body != null && blockOptions.body.length > 0" > [ { { blockOptions . body . length } } 字符 ] < / s p a n > < s p a n v - e l s e c l a s s = " d i s a b l e d " > [ 无 ] < / s p a n > / 超 时 时 间 : { { t i m e o u t } } 秒 < i c l a s s = " i c o n a n g l e " : c l a s s = " { u p : i s E d i t i n g , d o w n : ! i s E d i t i n g } " > < / i > < / a >
< table class = "ui table" v - show = "isEditing" >
2021-11-22 12:08:53 +08:00
< tr >
< td class = "title" > 状态码 < / t d >
< td >
< input type = "text" v - model = "statusCode" style = "width:4.5em" maxlength = "3" / >
< / t d >
< / t r >
< tr >
< td > 提示内容 < / t d >
< td >
< textarea rows = "3" v - model = "blockOptions.body" > < / t e x t a r e a >
< / t d >
< / t r >
< tr >
< td > 超时时间 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" v - model = "timeout" style = "width: 5em" maxlength = "6" / >
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
< p class = "comment" > 触发阻止动作时 , 封锁客户端IP的时间 。 < / p >
< / t d >
< / t r >
< / t a b l e >
< / d i v >
2022-04-08 21:24:54 +08:00
` }),Vue.component("http-firewall-rules-box",{props:["v-rules","v-type"],data:function(){let e=this.vRules;return{rules:e=null==e?[]:e}},methods:{addRule:function(){window.UPDATING_RULE=null;let t=this;teaweb.popup("/servers/components/waf/createRulePopup?type="+this.vType,{callback:function(e){t.rules.push(e.data.rule)}})},updateRule:function(t,e){window.UPDATING_RULE=e;let i=this;teaweb.popup("/servers/components/waf/createRulePopup?type="+this.vType,{callback:function(e){Vue.set(i.rules,t,e.data.rule)}})},removeRule:function(e){let t=this;teaweb.confirm("确定要删除此规则吗?",function(){t.rules. $ remove(e)})}},template: ` < div >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "rulesJSON" : value = "JSON.stringify(rules)" / >
< div v - if = "rules.length > 0" >
< div v - for = "(rule, index) in rules" class = "ui label small basic" style = "margin-bottom: 0.5em" >
{ { rule . name } } [ { { rule . param } } ]
<!-- cc2 -- >
< span v - if = "rule.param == '\${cc2}'" >
{ { rule . checkpointOptions . period } } 秒 / { { rule . checkpointOptions . threshold } } 请求
< / s p a n >
<!-- refererBlock -- >
< span v - if = "rule.param == '\${refererBlock}'" >
{ { rule . checkpointOptions . allowDomains } }
< / s p a n >
< span v - else >
< span v - if = "rule.paramFilters != null && rule.paramFilters.length > 0" v - for = "paramFilter in rule.paramFilters" > | { { paramFilter . code } } < / s p a n > < v a r > { { r u l e . o p e r a t o r } } < / v a r > { { r u l e . v a l u e } }
< / s p a n >
2022-01-11 12:04:03 +08:00
<!-- description -- >
< span v - if = "rule.description != null && rule.description.length > 0" class = "grey small" > ( { { rule . description } } ) < / s p a n >
2021-11-22 12:08:53 +08:00
< a href = "" title = "修改" @ click . prevent = "updateRule(index, rule)" > < i class = "icon pencil small" > < / i > < / a >
< a href = "" title = "删除" @ click . prevent = "removeRule(index)" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< button class = "ui button tiny" type = "button" @ click . prevent = "addRule()" > + < / b u t t o n >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - f a s t c g i - b o x " , { p r o p s : [ " v - f a s t c g i - r e f " , " v - f a s t c g i - c o n f i g s " , " v - i s - l o c a t i o n " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v F a s t c g i R e f , t = ( n u l l = = e & & ( e = { i s P r i o r : ! 1 , i s O n : ! 1 , f a s t c g i I d s : [ ] } ) , t h i s . v F a s t c g i C o n f i g s ) ; r e t u r n n u l l = = t ? t = [ ] : e . f a s t c g i I d s = t . m a p ( f u n c t i o n ( e ) { r e t u r n e . i d } ) , { f a s t c g i R e f : e , f a s t c g i C o n f i g s : t , a d v a n c e d V i s i b l e : ! 1 } } , m e t h o d s : { i s O n : f u n c t i o n ( ) { r e t u r n ( ! t h i s . v I s L o c a t i o n | | t h i s . f a s t c g i R e f . i s P r i o r ) & & t h i s . f a s t c g i R e f . i s O n } , c r e a t e F a s t c g i : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / f a s t c g i / c r e a t e P o p u p " , { h e i g h t : " 2 6 e m " , c a l l b a c k : f u n c t i o n ( e ) { t e a w e b . s u c c e s s ( " 添 加 成 功 " , f u n c t i o n ( ) { t . f a s t c g i C o n f i g s . p u s h ( e . d a t a . f a s t c g i ) , t . f a s t c g i R e f . f a s t c g i I d s . p u s h ( e . d a t a . f a s t c g i . i d ) } ) } } ) } , u p d a t e F a s t c g i : f u n c t i o n ( e , t ) { l e t i = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / s e r v e r / s e t t i n g s / f a s t c g i / u p d a t e P o p u p ? f a s t c g i I d = " + e , { c a l l b a c k : f u n c t i o n ( e ) { t e a w e b . s u c c e s s ( " 修 改 成 功 " , f u n c t i o n ( ) { V u e . s e t ( i . f a s t c g i C o n f i g s , t , e . d a t a . f a s t c g i ) } ) } } ) } , r e m o v e F a s t c g i : f u n c t i o n ( e ) { t h i s . f a s t c g i R e f . f a s t c g i I d s . $ r e m o v e ( e ) , t h i s . f a s t c g i C o n f i g s . $ r e m o v e ( e ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "fastcgiRefJSON" : value = "JSON.stringify(fastcgiRef)" / >
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "fastcgiRef" v - if = "vIsLocation" > < / p r i o r - c h e c k b o x >
< tbody v - show = "(!this.vIsLocation || this.fastcgiRef.isPrior)" >
< tr >
2022-06-05 17:12:54 +08:00
< td class = "title" > 启用配置 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "fastcgiRef.isOn" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< / t r >
< / t b o d y >
< tbody v - if = "isOn()" >
< tr >
< td > Fastcgi服务 < / t d >
< td >
< div v - show = "fastcgiConfigs.length > 0" style = "margin-bottom: 0.5em" >
< div class = "ui label basic small" : class = "{disabled: !fastcgi.isOn}" v - for = "(fastcgi, index) in fastcgiConfigs" >
{ { fastcgi . address } } & nbsp ; < a href = "" title = "修改" @ click . prevent = "updateFastcgi(fastcgi.id, index)" > < i class = "ui icon pencil small" > < / i > < / a > & n b s p ; < a h r e f = " " t i t l e = " 删 除 " @ c l i c k . p r e v e n t = " r e m o v e F a s t c g i ( i n d e x ) " > < i c l a s s = " u i i c o n r e m o v e " > < / i > < / a >
< / d i v >
< div class = "ui divided" > < / d i v >
< / d i v >
< button type = "button" class = "ui button tiny" @ click . prevent = "createFastcgi()" > + < / b u t t o n >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< /div>`}),Vue.component("http-methods-box",{props:["v-methods"],data:function(){let e=this.vMethods;return{methods:e=null==e?[]:e,isAdding:!1,addingMethod:""}},methods:{add:function(){this.isAdding=!0;let e=this;setTimeout(function(){e.$refs.addingMethod.focus()},100)},confirm:function(){let e=this;this.addingMethod=this.addingMethod.replace(/ \ s / g , "" ) . toUpperCase ( ) , 0 == this . addingMethod . length ? teaweb . warn ( "请输入要添加的请求方法" , function ( ) { e . $refs . addingMethod . focus ( ) } ) : this . methods . $contains ( this . addingMethod ) ? teaweb . warn ( "此请求方法已经存在,无需重复添加" , function ( ) { e . $refs . addingMethod . focus ( ) } ) : ( this . methods . push ( this . addingMethod ) , this . cancel ( ) ) } , remove : function ( e ) { this . methods . $remove ( e ) } , cancel : function ( ) { this . isAdding = ! 1 , this . addingMethod = "" } } , template : ` <div>
2021-12-15 09:56:18 +08:00
< input type = "hidden" name = "methodsJSON" : value = "JSON.stringify(methods)" / >
< div v - if = "methods.length > 0" >
< span class = "ui label small basic" v - for = "(method, index) in methods" >
{ { method } }
& nbsp ; < a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove small" > < / i > < / a >
< / s p a n >
< div class = "ui divider" > < / d i v >
< / d i v >
< div v - if = "isAdding" >
< div class = "ui fields" >
< div class = "ui field" >
< input type = "text" v - model = "addingMethod" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" ref = "addingMethod" placeholder = "如GET" size = "10" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirm" > 确定 < / b u t t o n >
& nbsp ; < a href = "" title = "取消" @ click . prevent = "cancel" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< p class = "comment" > 格式为大写 , 比如 < code - label > GET < / c o d e - l a b e l > 、 < c o d e - l a b e l > P O S T < / c o d e - l a b e l > 等 。 < / p >
< div class = "ui divider" > < / d i v >
< / d i v >
< div style = "margin-top: 0.5em" v - if = "!isAdding" >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< /div>`}),Vue.component("http-cond-url-extension",{props:["v-cond"],data:function(){let e={isRequest:!0,param:"${requestPathExtension}",operator:"in",value:"[]"},t=(null!=this.vCond&&this.vCond.param==e.param&&(e.value=this.vCond.value),[]);try{t=JSON.parse(e.value)}catch(e){}return{cond:e,extensions:t,isAdding:!1,addingExt:""}},watch:{extensions:function(){this.cond.value=JSON.stringify(this.extensions)}},methods:{addExt:function(){if(this.isAdding=!this.isAdding,this.isAdding){let e=this;setTimeout(function(){e.$refs.addingExt.focus()},100)}},cancelAdding:function(){this.isAdding=!1,this.addingExt=""},confirmAdding:function(){0!=this.addingExt.length&&("."!=this.addingExt[0]&&(this.addingExt="."+this.addingExt),this.addingExt=this.addingExt.replace(/ \ s + / g , " " ) . t o L o w e r C a s e ( ) , t h i s . e x t e n s i o n s . p u s h ( t h i s . a d d i n g E x t ) , t h i s . c a n c e l A d d i n g ( ) ) } , r e m o v e E x t : f u n c t i o n ( e ) { t h i s . e x t e n s i o n s . $ r e m o v e ( e ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< div v - if = "extensions.length > 0" >
< div class = "ui label small" v - for = "(ext, index) in extensions" > { { ext } } < a href = "" title = "删除" @ click . prevent = "removeExt(index)" > < i class = "icon remove" > < / i > < / a > < / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div class = "ui fields inline" v - if = "isAdding" >
< div class = "ui field" >
< input type = "text" size = "6" maxlength = "100" v - model = "addingExt" ref = "addingExt" placeholder = ".xxx" @ keyup . enter = "confirmAdding" @ keypress . enter . prevent = "1" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmAdding" > 确认 < / b u t t o n >
< a href = "" title = "取消" @ click . prevent = "cancelAdding" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< / d i v >
< div style = "margin-top: 1em" >
< button class = "ui button tiny" type = "button" @ click . prevent = "addExt()" > + 添加扩展名 < / b u t t o n >
< / d i v >
< p class = "comment" > 扩展名需要包含点 ( . ) 符号 , 例如 < span class = "ui label tiny" > . jpg < / s p a n > 、 < s p a n c l a s s = " u i l a b e l t i n y " > . p n g < / s p a n > 之 类 。 < / p >
2022-04-08 21:24:54 +08:00
< /div>`}),Vue.component("http-cond-url-not-extension",{props:["v-cond"],data:function(){let e={isRequest:!0,param:"${requestPathExtension}",operator:"not in",value:"[]"},t=(null!=this.vCond&&this.vCond.param==e.param&&(e.value=this.vCond.value),[]);try{t=JSON.parse(e.value)}catch(e){}return{cond:e,extensions:t,isAdding:!1,addingExt:""}},watch:{extensions:function(){this.cond.value=JSON.stringify(this.extensions)}},methods:{addExt:function(){if(this.isAdding=!this.isAdding,this.isAdding){let e=this;setTimeout(function(){e.$refs.addingExt.focus()},100)}},cancelAdding:function(){this.isAdding=!1,this.addingExt=""},confirmAdding:function(){0!=this.addingExt.length&&("."!=this.addingExt[0]&&(this.addingExt="."+this.addingExt),this.addingExt=this.addingExt.replace(/ \ s + / g , " " ) . t o L o w e r C a s e ( ) , t h i s . e x t e n s i o n s . p u s h ( t h i s . a d d i n g E x t ) , t h i s . c a n c e l A d d i n g ( ) ) } , r e m o v e E x t : f u n c t i o n ( e ) { t h i s . e x t e n s i o n s . $ r e m o v e ( e ) } } , t e m p l a t e : ` < d i v >
2021-12-12 17:14:46 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< div v - if = "extensions.length > 0" >
< div class = "ui label small" v - for = "(ext, index) in extensions" > { { ext } } < a href = "" title = "删除" @ click . prevent = "removeExt(index)" > < i class = "icon remove" > < / i > < / a > < / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div class = "ui fields inline" v - if = "isAdding" >
< div class = "ui field" >
< input type = "text" size = "6" maxlength = "100" v - model = "addingExt" ref = "addingExt" placeholder = ".xxx" @ keyup . enter = "confirmAdding" @ keypress . enter . prevent = "1" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmAdding" > 确认 < / b u t t o n >
< a href = "" title = "取消" @ click . prevent = "cancelAdding" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< / d i v >
< div style = "margin-top: 1em" >
< button class = "ui button tiny" type = "button" @ click . prevent = "addExt()" > + 添加扩展名 < / b u t t o n >
< / d i v >
< p class = "comment" > 扩展名需要包含点 ( . ) 符号 , 例如 < span class = "ui label tiny" > . jpg < / s p a n > 、 < s p a n c l a s s = " u i l a b e l t i n y " > . p n g < / s p a n > 之 类 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o n d - u r l - p r e f i x " , { p r o p s : [ " v - c o n d " ] , d a t a : f u n c t i o n ( ) { l e t e = { i s R e q u e s t : ! 0 , p a r a m : " $ { r e q u e s t P a t h } " , o p e r a t o r : " p r e f i x " , v a l u e : " " , i s C a s e I n s e n s i t i v e : ! 1 } ; r e t u r n n u l l ! = t h i s . v C o n d & & " s t r i n g " = = t y p e o f t h i s . v C o n d . v a l u e & & ( e . v a l u e = t h i s . v C o n d . v a l u e ) , { c o n d : e } } , m e t h o d s : { c h a n g e C a s e I n s e n s i t i v e : f u n c t i o n ( e ) { t h i s . c o n d . i s C a s e I n s e n s i t i v e = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< input type = "text" v - model = "cond.value" / >
< p class = "comment" > URL前缀 , 有此前缀的URL都将会被匹配 , 通常以 < code - label > / < / c o d e - l a b e l > 开 头 , 比 如 < c o d e - l a b e l > / s t a t i c < / c o d e - l a b e l > 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o n d - u r l - n o t - p r e f i x " , { p r o p s : [ " v - c o n d " ] , d a t a : f u n c t i o n ( ) { l e t e = { i s R e q u e s t : ! 0 , p a r a m : " $ { r e q u e s t P a t h } " , o p e r a t o r : " p r e f i x " , v a l u e : " " , i s R e v e r s e : ! 0 , i s C a s e I n s e n s i t i v e : ! 1 } ; r e t u r n n u l l ! = t h i s . v C o n d & & " s t r i n g " = = t y p e o f t h i s . v C o n d . v a l u e & & ( e . v a l u e = t h i s . v C o n d . v a l u e ) , { c o n d : e } } , m e t h o d s : { c h a n g e C a s e I n s e n s i t i v e : f u n c t i o n ( e ) { t h i s . c o n d . i s C a s e I n s e n s i t i v e = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< input type = "text" v - model = "cond.value" / >
< p class = "comment" > 要排除的URL前缀 , 有此前缀的URL都将会被匹配 , 通常以 < code - label > / < / c o d e - l a b e l > 开 头 , 比 如 < c o d e - l a b e l > / s t a t i c < / c o d e - l a b e l > 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o n d - u r l - e q " , { p r o p s : [ " v - c o n d " ] , d a t a : f u n c t i o n ( ) { l e t e = { i s R e q u e s t : ! 0 , p a r a m : " $ { r e q u e s t P a t h } " , o p e r a t o r : " e q " , v a l u e : " " , i s C a s e I n s e n s i t i v e : ! 1 } ; r e t u r n n u l l ! = t h i s . v C o n d & & " s t r i n g " = = t y p e o f t h i s . v C o n d . v a l u e & & ( e . v a l u e = t h i s . v C o n d . v a l u e ) , { c o n d : e } } , m e t h o d s : { c h a n g e C a s e I n s e n s i t i v e : f u n c t i o n ( e ) { t h i s . c o n d . i s C a s e I n s e n s i t i v e = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< input type = "text" v - model = "cond.value" / >
2022-06-12 20:36:05 +08:00
< p class = "comment" > 完整的URL路径 , 通常以 < code - label > / < / c o d e - l a b e l > 开 头 , 比 如 < c o d e - l a b e l > / s t a t i c / u i . j s < / c o d e - l a b e l > , 并 不 包 含 域 名 部 分 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o n d - u r l - n o t - e q " , { p r o p s : [ " v - c o n d " ] , d a t a : f u n c t i o n ( ) { l e t e = { i s R e q u e s t : ! 0 , p a r a m : " $ { r e q u e s t P a t h } " , o p e r a t o r : " e q " , v a l u e : " " , i s R e v e r s e : ! 0 , i s C a s e I n s e n s i t i v e : ! 1 } ; r e t u r n n u l l ! = t h i s . v C o n d & & " s t r i n g " = = t y p e o f t h i s . v C o n d . v a l u e & & ( e . v a l u e = t h i s . v C o n d . v a l u e ) , { c o n d : e } } , m e t h o d s : { c h a n g e C a s e I n s e n s i t i v e : f u n c t i o n ( e ) { t h i s . c o n d . i s C a s e I n s e n s i t i v e = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< input type = "text" v - model = "cond.value" / >
2022-06-12 20:36:05 +08:00
< p class = "comment" > 要排除的完整的URL路径 , 通常以 < code - label > / < / c o d e - l a b e l > 开 头 , 比 如 < c o d e - l a b e l > / s t a t i c / u i . j s < / c o d e - l a b e l > , 并 不 包 含 域 名 部 分 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o n d - u r l - r e g e x p " , { p r o p s : [ " v - c o n d " ] , d a t a : f u n c t i o n ( ) { l e t e = { i s R e q u e s t : ! 0 , p a r a m : " $ { r e q u e s t P a t h } " , o p e r a t o r : " r e g e x p " , v a l u e : " " , i s C a s e I n s e n s i t i v e : ! 1 } ; r e t u r n n u l l ! = t h i s . v C o n d & & " s t r i n g " = = t y p e o f t h i s . v C o n d . v a l u e & & ( e . v a l u e = t h i s . v C o n d . v a l u e ) , { c o n d : e } } , m e t h o d s : { c h a n g e C a s e I n s e n s i t i v e : f u n c t i o n ( e ) { t h i s . c o n d . i s C a s e I n s e n s i t i v e = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< input type = "text" v - model = "cond.value" / >
< p class = "comment" > 匹配URL的正则表达式 , 比如 < code - label > ^ /static/ ( . * ) . js$ < / c o d e - l a b e l > 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o n d - u r l - n o t - r e g e x p " , { p r o p s : [ " v - c o n d " ] , d a t a : f u n c t i o n ( ) { l e t e = { i s R e q u e s t : ! 0 , p a r a m : " $ { r e q u e s t P a t h } " , o p e r a t o r : " n o t r e g e x p " , v a l u e : " " , i s C a s e I n s e n s i t i v e : ! 1 } ; r e t u r n n u l l ! = t h i s . v C o n d & & " s t r i n g " = = t y p e o f t h i s . v C o n d . v a l u e & & ( e . v a l u e = t h i s . v C o n d . v a l u e ) , { c o n d : e } } , m e t h o d s : { c h a n g e C a s e I n s e n s i t i v e : f u n c t i o n ( e ) { t h i s . c o n d . i s C a s e I n s e n s i t i v e = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< input type = "text" v - model = "cond.value" / >
< p class = "comment" > < strong > 不要 < / s t r o n g > 匹 配 U R L 的 正 则 表 达 式 , 意 即 只 要 匹 配 成 功 则 排 除 此 条 件 , 比 如 < c o d e - l a b e l > ^ / s t a t i c / ( . * ) . j s $ < / c o d e - l a b e l > 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o n d - u s e r - a g e n t - r e g e x p " , { p r o p s : [ " v - c o n d " ] , d a t a : f u n c t i o n ( ) { l e t e = { i s R e q u e s t : ! 0 , p a r a m : " $ { u s e r A g e n t } " , o p e r a t o r : " r e g e x p " , v a l u e : " " , i s C a s e I n s e n s i t i v e : ! 1 } ; r e t u r n n u l l ! = t h i s . v C o n d & & " s t r i n g " = = t y p e o f t h i s . v C o n d . v a l u e & & ( e . v a l u e = t h i s . v C o n d . v a l u e ) , { c o n d : e } } , m e t h o d s : { c h a n g e C a s e I n s e n s i t i v e : f u n c t i o n ( e ) { t h i s . c o n d . i s C a s e I n s e n s i t i v e = e } } , t e m p l a t e : ` < d i v >
2021-12-12 17:14:46 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< input type = "text" v - model = "cond.value" / >
< p class = "comment" > 匹配User - Agent的正则表达式 , 比如 < code - label > Android | iPhone < / c o d e - l a b e l > 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o n d - u s e r - a g e n t - n o t - r e g e x p " , { p r o p s : [ " v - c o n d " ] , d a t a : f u n c t i o n ( ) { l e t e = { i s R e q u e s t : ! 0 , p a r a m : " $ { u s e r A g e n t } " , o p e r a t o r : " n o t r e g e x p " , v a l u e : " " , i s C a s e I n s e n s i t i v e : ! 1 } ; r e t u r n n u l l ! = t h i s . v C o n d & & " s t r i n g " = = t y p e o f t h i s . v C o n d . v a l u e & & ( e . v a l u e = t h i s . v C o n d . v a l u e ) , { c o n d : e } } , m e t h o d s : { c h a n g e C a s e I n s e n s i t i v e : f u n c t i o n ( e ) { t h i s . c o n d . i s C a s e I n s e n s i t i v e = e } } , t e m p l a t e : ` < d i v >
2021-12-12 17:14:46 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< input type = "text" v - model = "cond.value" / >
< p class = "comment" > 匹配User - Agent的正则表达式 , 比如 < code - label > Android | iPhone < / c o d e - l a b e l > , 如 果 匹 配 , 则 排 除 此 条 件 。 < / p >
2022-04-08 21:24:54 +08:00
< /div>`}),Vue.component("http-cond-mime-type",{props:["v-cond"],data:function(){let e={isRequest:!1,param:"${response.contentType}",operator:"mime type",value:"[]"};return null!=this.vCond&&this.vCond.param==e.param&&(e.value=this.vCond.value),{cond:e,mimeTypes:JSON.parse(e.value),isAdding:!1,addingMimeType:""}},watch:{mimeTypes:function(){this.cond.value=JSON.stringify(this.mimeTypes)}},methods:{addMimeType:function(){if(this.isAdding=!this.isAdding,this.isAdding){let e=this;setTimeout(function(){e.$refs.addingMimeType.focus()},100)}},cancelAdding:function(){this.isAdding=!1,this.addingMimeType=""},confirmAdding:function(){0!=this.addingMimeType.length&&(this.addingMimeType=this.addingMimeType.replace(/ \ s + / g , " " ) , t h i s . m i m e T y p e s . p u s h ( t h i s . a d d i n g M i m e T y p e ) , t h i s . c a n c e l A d d i n g ( ) ) } , r e m o v e M i m e T y p e : f u n c t i o n ( e ) { t h i s . m i m e T y p e s . $ r e m o v e ( e ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< div v - if = "mimeTypes.length > 0" >
< div class = "ui label small" v - for = "(mimeType, index) in mimeTypes" > { { mimeType } } < a href = "" title = "删除" @ click . prevent = "removeMimeType(index)" > < i class = "icon remove" > < / i > < / a > < / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div class = "ui fields inline" v - if = "isAdding" >
< div class = "ui field" >
< input type = "text" size = "16" maxlength = "100" v - model = "addingMimeType" ref = "addingMimeType" placeholder = "类似于image/png" @ keyup . enter = "confirmAdding" @ keypress . enter . prevent = "1" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmAdding" > 确认 < / b u t t o n >
< a href = "" title = "取消" @ click . prevent = "cancelAdding" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< / d i v >
< div style = "margin-top: 1em" >
< button class = "ui button tiny" type = "button" @ click . prevent = "addMimeType()" > + 添加MimeType < / b u t t o n >
< / d i v >
< p class = "comment" > 服务器返回的内容的MimeType , 比如 < span class = "ui label tiny" > text / html < /span>、<span class="ui label tiny">image/ * < / s p a n > 等 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " h t t p - c o n d - p a r a m s " , { p r o p s : [ " v - c o n d " ] , m o u n t e d : f u n c t i o n ( ) { l e t i = t h i s . v C o n d ; i f ( n u l l ! = i ) i f ( t h i s . o p e r a t o r = i . o p e r a t o r , [ " r e g e x p " , " n o t r e g e x p " , " e q " , " n o t " , " p r e f i x " , " s u f f i x " , " c o n t a i n s " , " n o t c o n t a i n s " , " e q i p " , " g t i p " , " g t e i p " , " l t i p " , " l t e i p " , " i p r a n g e " ] . $ c o n t a i n s ( i . o p e r a t o r ) ) t h i s . s t r i n g V a l u e = i . v a l u e ; e l s e i f ( [ " e q i n t " , " e q f l o a t " , " g t " , " g t e " , " l t " , " l t e " , " m o d 1 0 " , " i p m o d 1 0 " , " m o d 1 0 0 " , " i p m o d 1 0 0 " ] . $ c o n t a i n s ( i . o p e r a t o r ) ) t h i s . n u m b e r V a l u e = i . v a l u e ; e l s e { v a r e ; i f ( [ " m o d " , " i p m o d " ] . $ c o n t a i n s ( i . o p e r a t o r ) ) r e t u r n e = i . v a l u e . s p l i t ( " , " ) , t h i s . m o d D i v V a l u e = e [ 0 ] , v o i d ( 1 < e . l e n g t h & & ( t h i s . m o d R e m V a l u e = e [ 1 ] ) ) ; l e t t = t h i s ; i f ( [ " i n " , " n o t i n " , " f i l e e x t " , " m i m e t y p e " ] . $ c o n t a i n s ( i . o p e r a t o r ) ) t r y { l e t e = J S O N . p a r s e ( i . v a l u e ) ; n u l l ! = e & & e i n s t a n c e o f A r r a y & & e . f o r E a c h ( f u n c t i o n ( e ) { t . s t r i n g V a l u e s . p u s h ( e ) } ) } c a t c h ( e ) { } e l s e [ " v e r s i o n r a n g e " ] . $ c o n t a i n s ( i . o p e r a t o r ) & & ( e = i . v a l u e . s p l i t ( " , " ) , t h i s . v e r s i o n R a n g e M i n V a l u e = e [ 0 ] , 1 < e . l e n g t h & & ( t h i s . v e r s i o n R a n g e M a x V a l u e = e [ 1 ] ) ) } } , d a t a : f u n c t i o n ( ) { l e t e = { i s R e q u e s t : ! 0 , p a r a m : " " , o p e r a t o r : w i n d o w . R E Q U E S T _ C O N D _ O P E R A T O R S [ 0 ] . o p , v a l u e : " " , i s C a s e I n s e n s i t i v e : ! 1 } ; r e t u r n { c o n d : e = n u l l ! = t h i s . v C o n d ? t h i s . v C o n d : e , o p e r a t o r s : w i n d o w . R E Q U E S T _ C O N D _ O P E R A T O R S , o p e r a t o r : w i n d o w . R E Q U E S T _ C O N D _ O P E R A T O R S [ 0 ] . o p , o p e r a t o r D e s c r i p t i o n : w i n d o w . R E Q U E S T _ C O N D _ O P E R A T O R S [ 0 ] . d e s c r i p t i o n , v a r i a b l e s : w i n d o w . R E Q U E S T _ V A R I A B L E S , v a r i a b l e : " " , s t r i n g V a l u e : " " , n u m b e r V a l u e : " " , m o d D i v V a l u e : " " , m o d R e m V a l u e : " " , s t r i n g V a l u e s : [ ] , v e r s i o n R a n g e M i n V a l u e : " " , v e r s i o n R a n g e M a x V a l u e : " " } } , m e t h o d s : { c h a n g e V a r i a b l e : f u n c t i o n ( ) { l e t e = t h i s . c o n d . p a r a m ; n u l l = = e & & ( e = " " ) , t h i s . c o n d . p a r a m = e + t h i s . v a r i a b l e } , c h a n g e O p e r a t o r : f u n c t i o n ( ) { l e t t = t h i s , i = ( t h i s . o p e r a t o r s . f o r E a c h ( f u n c t i o n ( e ) { e . o p = = t . o p e r a t o r & & ( t . o p e r a t o r D e s c r i p t i o n = e . d e s c r i p t i o n ) } ) , t h i s . c o n d . o p e r a t o r = t h i s . o p e r a t o r , d o c u m e n t . g e t E l e m e n t B y I d ( " v a r i a b l e s - v a l u e - b o x " ) ) ; n u l l ! = i & & s e t T i m e o u t ( f u n c t i o n ( ) { l e t e = i . g e t E l e m e n t s B y T a g N a m e ( " I N P U T " ) ; 0 < e . l e n g t h & & e [ 0 ] . f o c u s ( ) } , 1 0 0 ) } , c h a n g e S t r i n g V a l u e s : f u n c t i o n ( e ) { t h i s . s t r i n g V a l u e s = e , t h i s . c o n d . v a l u e = J S O N . s t r i n g i f y ( e ) } } , w a t c h : { s t r i n g V a l u e : f u n c t i o n ( e ) { t h i s . c o n d . v a l u e = e } , n u m b e r V a l u e : f u n c t i o n ( e ) { t h i s . c o n d . v a l u e = e } , m o d D i v V a l u e : f u n c t i o n ( t ) { i f ( 0 ! = t . l e n g t h ) { l e t e = p a r s e I n t ( t ) ; i s N a N ( e ) & & ( e = 1 ) , t h i s . m o d D i v V a l u e = e , t h i s . c o n d . v a l u e = e + " , " + t h i s . m o d R e m V a l u e } } , m o d R e m V a l u e : f u n c t i o n ( t ) { i f ( 0 ! = t . l e n g t h ) { l e t e = p a r s e I n t ( t ) ; i s N a N ( e ) & & ( e = 0 ) , t h i s . m o d R e m V a l u e = e , t h i s . c o n d . v a l u e = t h i s . m o d D i v V a l u e + " , " + e } } , v e r s i o n R a n g e M i n V a l u e : f u n c t i o n ( e ) { t h i s . c o n d . v a l u e = t h i s . v e r s i o n R a n g e M i n V a l u e + " , " + t h i s . v e r s i o n R a n g e M a x V a l u e } , v e r s i o n R a n g e M a x V a l u e : f u n c t i o n ( e ) { t h i s . c o n d . v a l u e = t h i s . v e r s i o n R a n g e M i n V a l u e + " , " + t h i s . v e r s i o n R a n g e M a x V a l u e } } , t e m p l a t e : ` < t b o d y >
2021-11-22 12:08:53 +08:00
< tr >
< td > 参数值 < / t d >
< td >
< input type = "hidden" name = "condJSON" : value = "JSON.stringify(cond)" / >
< div >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" placeholder = "\${xxx}" v - model = "cond.param" / >
< / d i v >
< div class = "ui field" >
< select class = "ui dropdown" style = "width: 7em; color: grey" v - model = "variable" @ change = "changeVariable" >
< option value = "" > [ 常用参数 ] < / o p t i o n >
< option v - for = "v in variables" : value = "v.code" > { { v . code } } - { { v . name } } < / o p t i o n >
< / s e l e c t >
< / d i v >
< / d i v >
< / d i v >
< p class = "comment" > 其中可以使用变量 , 类似于 < code - label > \ $ { requestPath } < / c o d e - l a b e l > , 也 可 以 是 多 个 变 量 的 组 合 。 < / p >
< / t d >
< / t r >
< tr >
< td > 操作符 < / t d >
< td >
< div >
< select class = "ui dropdown auto-width" v - model = "operator" @ change = "changeOperator" >
< option v - for = "operator in operators" : value = "operator.op" > { { operator . name } } < / o p t i o n >
< / s e l e c t >
< p class = "comment" > { { operatorDescription } } < / p >
< / d i v >
< / t d >
< / t r >
< tr v - show = "!['file exist', 'file not exist'].$contains(cond.operator)" >
< td > 对比值 < / t d >
< td id = "variables-value-box" >
<!-- 正则表达式 -- >
< div v - if = "['regexp', 'not regexp'].$contains(cond.operator)" >
< input type = "text" v - model = "stringValue" / >
< p class = "comment" > 要匹配的正则表达式 , 比如 < code - label > ^ /static/ ( . + ) . js < / c o d e - l a b e l > 。 < / p >
< / d i v >
<!-- 数字相关 -- >
< div v - if = "['eq int', 'eq float', 'gt', 'gte', 'lt', 'lte'].$contains(cond.operator)" >
< input type = "text" maxlength = "11" size = "11" style = "width: 5em" v - model = "numberValue" / >
< p class = "comment" > 要对比的数字 。 < / p >
< / d i v >
<!-- 取模 -- >
< div v - if = "['mod 10'].$contains(cond.operator)" >
< input type = "text" maxlength = "11" size = "11" style = "width: 5em" v - model = "numberValue" / >
< p class = "comment" > 参数值除以10的余数 , 在0 - 9 之间 。 < / p >
< / d i v >
< div v - if = "['mod 100'].$contains(cond.operator)" >
< input type = "text" maxlength = "11" size = "11" style = "width: 5em" v - model = "numberValue" / >
< p class = "comment" > 参数值除以100的余数 , 在0 - 99 之间 。 < / p >
< / d i v >
< div v - if = "['mod', 'ip mod'].$contains(cond.operator)" >
< div class = "ui fields inline" >
< div class = "ui field" > 除 : < / d i v >
< div class = "ui field" >
< input type = "text" maxlength = "11" size = "11" style = "width: 5em" v - model = "modDivValue" placeholder = "除数" / >
< / d i v >
< div class = "ui field" > 余 : < / d i v >
< div class = "ui field" >
< input type = "text" maxlength = "11" size = "11" style = "width: 5em" v - model = "modRemValue" placeholder = "余数" / >
< / d i v >
< / d i v >
< / d i v >
<!-- 字符串相关 -- >
< div v - if = "['eq', 'not', 'prefix', 'suffix', 'contains', 'not contains'].$contains(cond.operator)" >
< input type = "text" v - model = "stringValue" / >
< p class = "comment" v - if = "cond.operator == 'eq'" > 和参数值一致的字符串 。 < / p >
< p class = "comment" v - if = "cond.operator == 'not'" > 和参数值不一致的字符串 。 < / p >
< p class = "comment" v - if = "cond.operator == 'prefix'" > 参数值的前缀 。 < / p >
< p class = "comment" v - if = "cond.operator == 'suffix'" > 参数值的后缀为此字符串 。 < / p >
< p class = "comment" v - if = "cond.operator == 'contains'" > 参数值包含此字符串 。 < / p >
< p class = "comment" v - if = "cond.operator == 'not contains'" > 参数值不包含此字符串 。 < / p >
< / d i v >
< div v - if = "['in', 'not in', 'file ext', 'mime type'].$contains(cond.operator)" >
< values - box @ change = "changeStringValues" : values = "stringValues" size = "15" > < / v a l u e s - b o x >
< p class = "comment" v - if = "cond.operator == 'in'" > 添加参数值列表 。 < / p >
< p class = "comment" v - if = "cond.operator == 'not in'" > 添加参数值列表 。 < / p >
< p class = "comment" v - if = "cond.operator == 'file ext'" > 添加扩展名列表 , 比如 < code - label > png < / c o d e - l a b e l > 、 < c o d e - l a b e l > h t m l < / c o d e - l a b e l > , 不 包 括 点 。 < / p >
< p class = "comment" v - if = "cond.operator == 'mime type'" > 添加MimeType列表 , 类似于 < code - label > text / html < /code-label>、<code-label>image/ * < / c o d e - l a b e l > 。 < / p >
< / d i v >
< div v - if = "['version range'].$contains(cond.operator)" >
< div class = "ui fields inline" >
< div class = "ui field" > < input type = "text" v - model = "versionRangeMinValue" maxlength = "200" placeholder = "最小版本" style = "width: 10em" / > < / d i v >
< div class = "ui field" > - < / d i v >
< div class = "ui field" > < input type = "text" v - model = "versionRangeMaxValue" maxlength = "200" placeholder = "最大版本" style = "width: 10em" / > < / d i v >
< / d i v >
< / d i v >
<!-- IP相关 -- >
< div v - if = "['eq ip', 'gt ip', 'gte ip', 'lt ip', 'lte ip', 'ip range'].$contains(cond.operator)" >
< input type = "text" style = "width: 10em" v - model = "stringValue" placeholder = "x.x.x.x" / >
< p class = "comment" > 要对比的IP 。 < / p >
< / d i v >
< div v - if = "['ip mod 10'].$contains(cond.operator)" >
< input type = "text" maxlength = "11" size = "11" style = "width: 5em" v - model = "numberValue" / >
< p class = "comment" > 参数中IP转换成整数后除以10的余数 , 在0 - 9 之间 。 < / p >
< / d i v >
< div v - if = "['ip mod 100'].$contains(cond.operator)" >
< input type = "text" maxlength = "11" size = "11" style = "width: 5em" v - model = "numberValue" / >
< p class = "comment" > 参数中IP转换成整数后除以100的余数 , 在0 - 99 之间 。 < / p >
< / d i v >
< / t d >
< / t r >
2021-12-12 17:14:46 +08:00
< tr v - if = "['regexp', 'not regexp', 'eq', 'not', 'prefix', 'suffix', 'contains', 'not contains', 'in', 'not in'].$contains(cond.operator)" >
< td > 不区分大小写 < / t d >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "cond.isCaseInsensitive" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 选中后表示对比时忽略参数值的大小写 。 < / p >
< / t d >
< / t r >
2022-04-08 21:24:54 +08:00
< /tbody>`}),Vue.component("http-status-box",{props:["v-status-list"],data:function(){let e=this.vStatusList;return{statusList:e=null==e?[]:e,isAdding:!1,addingStatus:""}},methods:{add:function(){this.isAdding=!0;let e=this;setTimeout(function(){e.$refs.addingStatus.focus()},100)},confirm:function(){let e=this;this.addingStatus=this.addingStatus.replace(/ \ s / g , "" ) . toUpperCase ( ) , 0 == this . addingStatus . length ? teaweb . warn ( "请输入要添加的状态码" , function ( ) { e . $refs . addingStatus . focus ( ) } ) : this . statusList . $contains ( this . addingStatus ) ? teaweb . warn ( "此状态码已经存在,无需重复添加" , function ( ) { e . $refs . addingStatus . focus ( ) } ) : this . addingStatus . match ( /^\d{3}$/ ) ? ( this . statusList . push ( parseInt ( this . addingStatus , 10 ) ) , this . cancel ( ) ) : teaweb . warn ( "请输入正确的状态码" , function ( ) { e . $refs . addingStatus . focus ( ) } ) } , remove : function ( e ) { this . statusList . $remove ( e ) } , cancel : function ( ) { this . isAdding = ! 1 , this . addingStatus = "" } } , template : ` <div>
2021-12-15 09:56:18 +08:00
< input type = "hidden" name = "statusListJSON" : value = "JSON.stringify(statusList)" / >
< div v - if = "statusList.length > 0" >
< span class = "ui label small basic" v - for = "(status, index) in statusList" >
{ { status } }
& nbsp ; < a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove small" > < / i > < / a >
< / s p a n >
< div class = "ui divider" > < / d i v >
< / d i v >
< div v - if = "isAdding" >
< div class = "ui fields" >
< div class = "ui field" >
< input type = "text" v - model = "addingStatus" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" ref = "addingStatus" placeholder = "如200" size = "3" maxlength = "3" style = "width: 5em" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirm" > 确定 < / b u t t o n >
& nbsp ; < a href = "" title = "取消" @ click . prevent = "cancel" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< p class = "comment" > 格式为三位数字 , 比如 < code - label > 200 < / c o d e - l a b e l > 、 < c o d e - l a b e l > 4 0 4 < / c o d e - l a b e l > 等 。 < / p >
< div class = "ui divider" > < / d i v >
< / d i v >
< div style = "margin-top: 0.5em" v - if = "!isAdding" >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " s e r v e r - g r o u p - s e l e c t o r " , { p r o p s : [ " v - g r o u p s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v G r o u p s ; r e t u r n { g r o u p s : e = n u l l = = e ? [ ] : e } } , m e t h o d s : { s e l e c t G r o u p : f u n c t i o n ( ) { l e t t = t h i s ; v a r e = t h i s . g r o u p s . m a p ( f u n c t i o n ( e ) { r e t u r n e . i d . t o S t r i n g ( ) } ) . j o i n ( " , " ) ; t e a w e b . p o p u p ( " / s e r v e r s / g r o u p s / s e l e c t P o p u p ? s e l e c t e d G r o u p I d s = " + e , { c a l l b a c k : f u n c t i o n ( e ) { t . g r o u p s . p u s h ( e . d a t a . g r o u p ) } } ) } , a d d G r o u p : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / g r o u p s / c r e a t e P o p u p " , { c a l l b a c k : f u n c t i o n ( e ) { t . g r o u p s . p u s h ( e . d a t a . g r o u p ) } } ) } , r e m o v e G r o u p : f u n c t i o n ( e ) { t h i s . g r o u p s . $ r e m o v e ( e ) } , g r o u p I d s : f u n c t i o n ( ) { r e t u r n t h i s . g r o u p s . m a p ( f u n c t i o n ( e ) { r e t u r n e . i d } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div v - if = "groups.length > 0" >
< div class = "ui label small basic" v - if = "groups.length > 0" v - for = "(group, index) in groups" >
< input type = "hidden" name = "groupIds" : value = "group.id" / >
{ { group . name } } & nbsp ; < a href = "" title = "删除" @ click . prevent = "removeGroup(index)" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div >
< a href = "" @ click . prevent = "selectGroup()" > [ 选择分组 ] < / a > & n b s p ; < a h r e f = " " @ c l i c k . p r e v e n t = " a d d G r o u p ( ) " > [ 添 加 分 组 ] < / a >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " s c r i p t - g r o u p - c o n f i g - b o x " , { p r o p s : [ " v - g r o u p " , " v - i s - l o c a t i o n " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v G r o u p , t = ( n u l l = = ( e = n u l l = = e ? { i s P r i o r : ! 1 , i s O n : ! 0 , s c r i p t s : [ ] } : e ) . s c r i p t s & & ( e . s c r i p t s = [ ] ) , n u l l ) ; r e t u r n 0 < e . s c r i p t s . l e n g t h & & ( t = e . s c r i p t s [ e . s c r i p t s . l e n g t h - 1 ] ) , { g r o u p : e , s c r i p t : t } } , m e t h o d s : { c h a n g e S c r i p t : f u n c t i o n ( e ) { t h i s . g r o u p . s c r i p t s = [ e ] , t h i s . c h a n g e ( ) } , c h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . g r o u p ) } } , t e m p l a t e : ` < d i v >
2022-03-26 22:10:34 +08:00
< table class = "ui table definition selectable" >
< prior - checkbox : v - config = "group" v - if = "vIsLocation" > < / p r i o r - c h e c k b o x >
< / t a b l e >
< div : style = "{opacity: (!vIsLocation || group.isPrior) ? 1 : 0.5}" >
< script - config - box : v - script - config = "script" comment = "在接收到客户端请求之后立即调用。预置req、resp变量。" @ change = "changeScript" : v - is - location = "vIsLocation" > < / s c r i p t - c o n f i g - b o x >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m e t r i c - p e r i o d - c o n f i g - b o x " , { p r o p s : [ " v - p e r i o d " , " v - p e r i o d - u n i t " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v P e r i o d , t = t h i s . v P e r i o d U n i t ; r e t u r n n u l l ! = e & & 0 ! = e . t o S t r i n g ( ) . l e n g t h | | ( e = 1 ) , n u l l ! = t & & 0 ! = t . l e n g t h | | ( t = " d a y " ) , { p e r i o d C o n f i g : { p e r i o d : e , u n i t : t } } } , w a t c h : { " p e r i o d C o n f i g . p e r i o d " : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) , ( i s N a N ( e ) | | e < = 0 ) & & ( e = 1 ) , t h i s . p e r i o d C o n f i g . p e r i o d = e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "periodJSON" : value = "JSON.stringify(periodConfig)" / >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" v - model = "periodConfig.period" maxlength = "4" size = "4" / >
< / d i v >
< div class = "ui field" >
< select class = "ui dropdown" v - model = "periodConfig.unit" >
< option value = "minute" > 分钟 < / o p t i o n >
< option value = "hour" > 小时 < / o p t i o n >
< option value = "day" > 天 < / o p t i o n >
< option value = "week" > 周 < / o p t i o n >
< option value = "month" > 月 < / o p t i o n >
< / s e l e c t >
< / d i v >
< / d i v >
< p class = "comment" > 在此周期内同一对象累积为同一数据 。 < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " t r a f f i c - l i m i t - c o n f i g - b o x " , { p r o p s : [ " v - t r a f f i c - l i m i t " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v T r a f f i c L i m i t ; r e t u r n n u l l = = ( e = n u l l = = e ? { i s O n : ! 1 , d a i l y S i z e : { c o u n t : - 1 , u n i t : " g b " } , m o n t h l y S i z e : { c o u n t : - 1 , u n i t : " g b " } , t o t a l S i z e : { c o u n t : - 1 , u n i t : " g b " } , n o t i c e P a g e B o d y : " " } : e ) . d a i l y S i z e & & ( e . d a i l y S i z e = { c o u n t : - 1 , u n i t : " g b " } ) , n u l l = = e . m o n t h l y S i z e & & ( e . m o n t h l y S i z e = { c o u n t : - 1 , u n i t : " g b " } ) , n u l l = = e . t o t a l S i z e & & ( e . t o t a l S i z e = { c o u n t : - 1 , u n i t : " g b " } ) , { c o n f i g : e } } , m e t h o d s : { s h o w B o d y T e m p l a t e : f u n c t i o n ( ) { t h i s . c o n f i g . n o t i c e P a g e B o d y = ` < ! D O C T Y P E h t m l >
2021-11-22 12:08:53 +08:00
< html >
< head >
< title > Traffic Limit Exceeded Warning < / t i t l e >
< body >
2021-12-05 20:59:07 +08:00
< h1 > Traffic Limit Exceeded Warning < / h 1 >
< p > The site traffic has exceeded the limit . Please contact with the site administrator . < / p >
< address > Request ID : \ $ { requestId } . < / a d d r e s s >
2021-11-22 12:08:53 +08:00
< / b o d y >
2022-04-08 21:24:54 +08:00
< / h t m l > ` } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "trafficLimitJSON" : value = "JSON.stringify(config)" / >
< table class = "ui table selectable definition" >
< tbody >
< tr >
< td class = "title" > 是否启用 < / t d >
< td >
< checkbox v - model = "config.isOn" > < / c h e c k b o x >
< p class = "comment" > 注意 : 由于流量统计是每5分钟统计一次 , 所以超出流量限制后 , 对用户的提醒也会有所延迟 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "config.isOn" >
< tr >
< td > 日流量限制 < / t d >
< td >
< size - capacity - box : v - value = "config.dailySize" > < / s i z e - c a p a c i t y - b o x >
< / t d >
< / t r >
< tr >
< td > 月流量限制 < / t d >
< td >
< size - capacity - box : v - value = "config.monthlySize" > < / s i z e - c a p a c i t y - b o x >
< / t d >
< / t r >
<!-- < tr >
< td > 总体限制 < / t d >
< td >
< size - capacity - box : v - value = "config.totalSize" > < / s i z e - c a p a c i t y - b o x >
< p class = "comment" > < / p >
< / t d >
< / t r > - - >
< tr >
< td > 网页提示内容 < / t d >
< td >
< textarea v - model = "config.noticePageBody" > < / t e x t a r e a >
2022-06-16 19:32:40 +08:00
< p class = "comment" > < a href = "" @ click . prevent = "showBodyTemplate" > [ 使用模板 ] < / a > 。 当 达 到 流 量 限 制 时 网 页 显 示 的 H T M L 内 容 , 不 填 写 则 显 示 默 认 的 提 示 内 容 , 适 用 于 网 站 类 服 务 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-05-21 20:00:39 +08:00
< /div>`}),Vue.component("http-firewall-captcha-options",{props:["v-captcha-options"],mounted:function(){this.updateSummary()},data:function(){let e=this.vCaptchaOptions;return(e=null==e?{countLetters:0,life:0,maxFails:0,failBlockTimeout:0,failBlockScopeAll:!1,uiIsOn:!1,uiTitle:"",uiPrompt:"",uiButtonTitle:"",uiShowRequestId:!0,uiCss:"",uiFooter:"",uiBody:"",cookieId:"",lang:""}:e).countLetters<=0&&(e.countLetters=6),{options:e,isEditing:!1,summary:""}},watch:{"options.countLetters":function(e){let t=parseInt(e,10);isNaN(t)||t<0?t=0:10<t&&(t=10),this.options.countLetters=t},"options.life":function(e){let t=parseInt(e,10);isNaN(t)&&(t=0),this.options.life=t,this.updateSummary()},"options.maxFails":function(e){let t=parseInt(e,10);isNaN(t)&&(t=0),this.options.maxFails=t,this.updateSummary()},"options.failBlockTimeout":function(e){let t=parseInt(e,10);isNaN(t)&&(t=0),this.options.failBlockTimeout=t,this.updateSummary()},"options.failBlockScopeAll":function(e){this.updateSummary()},"options.uiIsOn":function(e){this.updateSummary()}},methods:{edit:function(){this.isEditing=!this.isEditing},updateSummary:function(){let e=[];0<this.options.life&&e.push("有效时间"+this.options.life+"秒"),0<this.options.maxFails&&e.push("最多失败"+this.options.maxFails+"次"),0<this.options.failBlockTimeout&&e.push("失败拦截"+this.options.failBlockTimeout+"秒"),this.options.failBlockScopeAll&&e.push("全局封禁"),this.options.uiIsOn&&e.push("定制UI"),0==e.length?this.summary="默认配置":this.summary=e.join(" / " ) } , confirm : function ( ) { this . isEditing = ! 1 } } , template : ` <div>
2022-05-20 22:07:04 +08:00
< input type = "hidden" name = "captchaOptionsJSON" : value = "JSON.stringify(options)" / >
< a href = "" @ click . prevent = "edit" > { { summary } } < i class = "icon angle" : class = "{up: isEditing, down: !isEditing}" > < / i > < / a >
< div v - show = "isEditing" style = "margin-top: 0.5em" >
< table class = "ui table definition selectable" >
< tbody >
< tr >
< td class = "title" > 有效时间 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" style = "width: 5em" maxlength = "9" v - model = "options.life" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
< p class = "comment" > 验证通过后在这个时间内不再验证 , 默认600秒 。 < / p >
< / t d >
< / t r >
< tr >
< td > 最多失败次数 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" style = "width: 5em" maxlength = "9" v - model = "options.maxFails" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
< span class = "ui label" > 次 < / s p a n >
< / d i v >
2022-05-21 20:00:39 +08:00
< p class = "comment" > 允许用户失败尝试的最多次数 , 超过这个次数将被自动加入黑名单 。 如果为空或者为0 , 表示不限制 。 < / p >
2022-05-20 22:07:04 +08:00
< / t d >
< / t r >
< tr >
< td > 失败拦截时间 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" style = "width: 5em" maxlength = "9" v - model = "options.failBlockTimeout" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
2022-06-25 19:31:23 +08:00
< p class = "comment" > 在达到最多失败次数 ( 大于0 ) 时 , 自动拦截的时长 ; 如果为0表示不自动拦截 。 < / p >
2022-05-20 22:07:04 +08:00
< / t d >
< / t r >
< tr >
< td > 失败全局封禁 < / t d >
< td >
< checkbox v - model = "options.failBlockScopeAll" > < / c h e c k b o x >
< p class = "comment" > 是否在失败时全局封禁 , 默认为只封禁对单个网站服务的访问 。 < / p >
< / t d >
< / t r >
< tr >
< td > 验证码中数字个数 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "options.countLetters" >
< option v - for = "i in 10" : value = "i" > { { i } } < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< tr >
< td class = "color-border" > 定制UI < / t d >
< td > < checkbox v - model = "options.uiIsOn" > < / c h e c k b o x > < / t d >
< / t r >
< / t b o d y >
< tbody v - show = "options.uiIsOn" >
< tr >
< td class = "color-border" > 页面标题 < / t d >
< td >
< input type = "text" v - model = "options.uiTitle" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
< / t d >
< / t r >
< tr >
< td class = "color-border" > 按钮标题 < / t d >
< td >
< input type = "text" v - model = "options.uiButtonTitle" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
< p class = "comment" > 类似于 < code - label > 提交验证 < / c o d e - l a b e l > 。 < / p >
< / t d >
< / t r >
< tr >
< td class = "color-border" > 显示请求ID < / t d >
< td >
< checkbox v - model = "options.uiShowRequestId" > < / c h e c k b o x >
< p class = "comment" > 在界面上显示请求ID , 方便用户报告问题 。 < / p >
< / t d >
< / t r >
< tr >
< td class = "color-border" > CSS样式 < / t d >
< td >
< textarea spellcheck = "false" v - model = "options.uiCss" rows = "2" > < / t e x t a r e a >
< / t d >
< / t r >
< tr >
< td class = "color-border" > 页头提示 < / t d >
< td >
< textarea spellcheck = "false" v - model = "options.uiPrompt" rows = "2" > < / t e x t a r e a >
< p class = "comment" > 类似于 < code - label > 请输入上面的验证码 < / c o d e - l a b e l > , 支 持 H T M L 。 < / p >
< / t d >
< / t r >
< tr >
< td class = "color-border" > 页尾提示 < / t d >
< td >
< textarea spellcheck = "false" v - model = "options.uiFooter" rows = "2" > < / t e x t a r e a >
< p class = "comment" > 支持HTML 。 < / p >
< / t d >
< / t r >
< tr >
< td class = "color-border" > 页面模板 < / t d >
< td >
< textarea spellcheck = "false" rows = "2" v - model = "options.uiBody" > < / t e x t a r e a >
< p class = "comment" > < span v - if = "options.uiBody.length > 0 && options.uiBody.indexOf('\${body}') < 0 " class = "red" > 模板中必须包含 \ $ { body } 表示验证码表单 ! < / s p a n > 整 个 页 面 的 模 板 , 支 持 H T M L , 其 中 必 须 使 用 < c o d e - l a b e l > \ $ { b o d y } < / c o d e - l a b e l > 变 量 代 表 验 证 码 表 单 , 否 则 将 无 法 正 常 显 示 验 证 码 。 < / p >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
< / d i v >
< / d i v >
` }),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: ` < div >
2022-01-11 12:04:03 +08:00
< input type = "hidden" name = "synFloodJSON" : value = "JSON.stringify(config)" / >
< a href = "" @ click . prevent = "edit" >
< span v - if = "config.isOn" >
已启用 / < span > 空连接次数 : { { config . minAttempts } } 次 / 分钟 < /span> / 封禁时间 : { { config . timeoutSeconds } } 秒 < span v - if = "config.ignoreLocal" > / 忽 略 局 域 网 访 问 < / s p a n >
< / s p a n >
< span v - else > 未启用 < / s p a n >
< i class = "icon angle" : class = "{up: isEditing, down: !isEditing}" > < / i >
< / a >
< table class = "ui table selectable" v - show = "isEditing" >
< tr >
2022-06-05 17:12:54 +08:00
< td class = "title" > 启用 < / t d >
2022-01-11 12:04:03 +08:00
< td >
< checkbox v - model = "config.isOn" > < / c h e c k b o x >
< p class = "comment" > 启用后 , WAF将会尝试自动检测并阻止SYN Flood攻击 。 此功能需要节点已安装并启用Firewalld 。 < / p >
< / t d >
< / t r >
< tr >
< td > 空连接次数 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" v - model = "minAttempts" style = "width: 5em" maxlength = "4" / >
< span class = "ui label" > 次 / 分钟 < / s p a n >
< / d i v >
2022-01-13 10:03:54 +08:00
< p class = "comment" > 超过此数字的 "空连接" 将被视为SYN Flood攻击 , 为了防止误判 , 此数值默认不小于5 。 < / p >
2022-01-11 12:04:03 +08:00
< / t d >
< / t r >
< tr >
< td > 封禁时间 < / t d >
< td >
< div class = "ui input right labeled" >
2022-04-27 16:09:15 +08:00
< input type = "text" v - model = "timeoutSeconds" style = "width: 5em" maxlength = "8" / >
2022-01-11 12:04:03 +08:00
< span class = "ui label" > 秒 < / s p a n >
< / d i v >
< / t d >
< / t r >
< tr >
< td > 忽略局域网访问 < / t d >
< td >
< checkbox v - model = "config.ignoreLocal" > < / c h e c k b o x >
< / t d >
< / t r >
< / t a b l e >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " a d m i n - s e l e c t o r " , { p r o p s : [ " v - a d m i n - i d " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / a d m i n s / o p t i o n s " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . a d m i n s = e . d a t a . a d m i n s } ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v A d m i n I d ; r e t u r n { a d m i n s : [ ] , a d m i n I d : e = n u l l = = e ? 0 : e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< select class = "ui dropdown auto-width" name = "adminId" v - model = "adminId" >
< option value = "0" > [ 选择系统用户 ] < / o p t i o n >
< option v - for = "admin in admins" : value = "admin.id" > { { admin . name } } ( { { admin . username } } ) < / o p t i o n >
< / s e l e c t >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " i p - l i s t - b i n d - b o x " , { p r o p s : [ " v - h t t p - f i r e w a l l - p o l i c y - i d " , " v - t y p e " ] , m o u n t e d : f u n c t i o n ( ) { t h i s . r e f r e s h ( ) } , d a t a : f u n c t i o n ( ) { r e t u r n { p o l i c y I d : t h i s . v H t t p F i r e w a l l P o l i c y I d , t y p e : t h i s . v T y p e , l i s t s : [ ] } } , m e t h o d s : { b i n d : f u n c t i o n ( ) { l e t e = t h i s ; t e a w e b . p o p u p ( " / s e r v e r s / i p l i s t s / b i n d H T T P F i r e w a l l P o p u p ? h t t p F i r e w a l l P o l i c y I d = " + t h i s . p o l i c y I d + " & t y p e = " + t h i s . t y p e , { w i d t h : " 5 0 e m " , h e i g h t : " 3 4 e m " , c a l l b a c k : f u n c t i o n ( ) { } , o n C l o s e : f u n c t i o n ( ) { e . r e f r e s h ( ) } } ) } , r e m o v e : f u n c t i o n ( t , e ) { l e t i = t h i s ; t e a w e b . c o n f i r m ( " 确 定 要 删 除 这 个 绑 定 的 I P 名 单 吗 ? " , f u n c t i o n ( ) { T e a . a c t i o n ( " / s e r v e r s / i p l i s t s / u n b i n d H T T P F i r e w a l l " ) . p a r a m s ( { h t t p F i r e w a l l P o l i c y I d : i . p o l i c y I d , l i s t I d : e } ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { i . l i s t s . $ r e m o v e ( t ) } ) } ) } , r e f r e s h : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / s e r v e r s / i p l i s t s / h t t p F i r e w a l l " ) . p a r a m s ( { h t t p F i r e w a l l P o l i c y I d : t h i s . p o l i c y I d , t y p e : t h i s . v T y p e } ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . l i s t s = e . d a t a . l i s t s } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< a href = "" @ click . prevent = "bind()" style = "color: rgba(0,0,0,.6)" > 绑定 + < / a > & n b s p ; < s p a n v - i f = " l i s t s . l e n g t h > 0 " > < s p a n c l a s s = " d i s a b l e d s m a l l " > | & n b s p ; < / s p a n > 已 绑 定 : < / s p a n >
< div class = "ui label basic small" v - for = "(list, index) in lists" >
< a : href = "'/servers/iplists/list?listId=' + list.id" title = "点击查看详情" style = "opacity: 1" > { { list . name } } < / a >
< a href = "" title = "删除" @ click . prevent = "remove(index, list.id)" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " i p - l i s t - t a b l e " , { p r o p s : [ " v - i t e m s " , " v - k e y w o r d " , " v - s h o w - s e a r c h - b u t t o n " ] , d a t a : f u n c t i o n ( ) { r e t u r n { i t e m s : t h i s . v I t e m s , k e y w o r d : n u l l ! = t h i s . v K e y w o r d ? t h i s . v K e y w o r d : " " , s e l e c t e d A l l : ! 1 , h a s S e l e c t e d I t e m s : ! 1 } } , m e t h o d s : { u p d a t e I t e m : f u n c t i o n ( e ) { t h i s . $ e m i t ( " u p d a t e - i t e m " , e ) } , d e l e t e I t e m : f u n c t i o n ( e ) { t h i s . $ e m i t ( " d e l e t e - i t e m " , e ) } , v i e w L o g s : f u n c t i o n ( e ) { t e a w e b . p o p u p ( " / s e r v e r s / i p l i s t s / a c c e s s L o g s P o p u p ? i t e m I d = " + e , { w i d t h : " 5 0 e m " , h e i g h t : " 3 0 e m " } ) } , c h a n g e S e l e c t e d A l l : f u n c t i o n ( ) { l e t e = t h i s . $ r e f s . i t e m C h e c k B o x ; i f ( n u l l ! = e ) { l e t t = t h i s ; e . f o r E a c h ( f u n c t i o n ( e ) { e . c h e c k e d = t . s e l e c t e d A l l } ) , t h i s . h a s S e l e c t e d I t e m s = t h i s . s e l e c t e d A l l } } , c h a n g e S e l e c t e d : f u n c t i o n ( e ) { l e t t = t h i s , i = ( t . h a s S e l e c t e d I t e m s = ! 1 , t . $ r e f s . i t e m C h e c k B o x ) ; n u l l ! = i & & i . f o r E a c h ( f u n c t i o n ( e ) { e . c h e c k e d & & ( t . h a s S e l e c t e d I t e m s = ! 0 ) } ) } , d e l e t e A l l : f u n c t i o n ( ) { l e t e = t h i s . $ r e f s . i t e m C h e c k B o x ; i f ( n u l l ! = e ) { l e t t = [ ] ; e . f o r E a c h ( f u n c t i o n ( e ) { e . c h e c k e d & & t . p u s h ( e . v a l u e ) } ) , 0 ! = t . l e n g t h & & T e a . a c t i o n ( " / s e r v e r s / i p l i s t s / d e l e t e I t e m s " ) . p o s t ( ) . p a r a m s ( { i t e m I d s : t } ) . s u c c e s s ( f u n c t i o n ( ) { t e a w e b . s u c c e s s T o a s t ( " 批 量 删 除 成 功 " , 1 2 0 0 , t e a w e b . r e l o a d ) } ) } } , f o r m a t S e c o n d s : f u n c t i o n ( e ) { r e t u r n e < 6 0 ? e + " 秒 " : e < 3 6 0 0 ? M a t h . c e i l ( e / 6 0 ) + " 分 钟 " : e < 8 6 4 0 0 ? M a t h . c e i l ( e / 3 6 0 0 ) + " 小 时 " : M a t h . c e i l ( e / 8 6 4 0 0 ) + " 天 " } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div v - show = "hasSelectedItems" >
< a href = "" @ click . prevent = "deleteAll" > [ 批量删除 ] < / a >
< / d i v >
< table class = "ui table selectable celled" v - if = "items.length > 0" >
< thead >
< tr >
< th style = "width: 1em" >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "selectedAll" @ change = "changeSelectedAll" / >
< label > < / l a b e l >
< / d i v >
< / t h >
< th style = "width:18em" > IP < / t h >
2022-04-21 18:38:47 +08:00
< th style = "width: 6em" > 类型 < / t h >
< th style = "width: 6em" > 级别 < / t h >
< th style = "width: 12em" > 过期时间 < / t h >
2021-11-22 12:08:53 +08:00
< th > 备注 < / t h >
< th class = "three op" > 操作 < / t h >
< / t r >
< / t h e a d >
< tbody v - for = "item in items" >
< tr >
< td >
< div class = "ui checkbox" >
< input type = "checkbox" : value = "item.id" @ change = "changeSelected" ref = "itemCheckBox" / >
< label > < / l a b e l >
< / d i v >
< / t d >
< td >
2022-04-21 18:38:47 +08:00
< span v - if = "item.type != 'all'" : class = "{green: item.list != null && item.list.type == 'white'}" >
2022-01-09 20:13:18 +08:00
< keyword : v - word = "keyword" > { { item . ipFrom } } < / k e y w o r d > < s p a n > < s p a n c l a s s = " s m a l l r e d " v - i f = " i t e m . i s R e a d ! = n u l l & & ! i t e m . i s R e a d " > & n b s p ; N e w & n b s p ; < / s p a n > & n b s p ; < a : h r e f = " ' / s e r v e r s / i p l i s t s ? i p = ' + i t e m . i p F r o m " v - i f = " v S h o w S e a r c h B u t t o n " t i t l e = " 搜 索 此 I P " > < s p a n > < i c l a s s = " i c o n s e a r c h s m a l l " s t y l e = " c o l o r : # c c c " > < / i > < / s p a n > < / a > < / s p a n >
2021-11-22 12:08:53 +08:00
< span v - if = "item.ipTo.length > 0" > - < keyword : v - word = "keyword" > { { item . ipTo } } < / k e y w o r d > < / s p a n > < / s p a n >
< span v - else class = "disabled" > * < / s p a n >
2022-04-19 19:51:29 +08:00
< div v - if = "item.region != null && item.region.length > 0" >
< span class = "grey small" > { { item . region } } < / s p a n >
< span v - if = "item.isp != null && item.isp.length > 0 && item.isp != '内网IP'" class = "grey small" > < span class = "disabled" > | < / s p a n > { { i t e m . i s p } } < / s p a n >
< / d i v >
2021-11-22 12:08:53 +08:00
< div v - if = "item.createdTime != null" >
< span class = "small grey" > 添加于 { { item . createdTime } }
< span v - if = "item.list != null && item.list.id > 0" >
@
< a : href = "'/servers/iplists/list?listId=' + item.list.id" v - if = "item.policy.id == 0" > < span > [ < span v - if = "item.list.type == 'black'" > 黑 < / s p a n > < s p a n v - i f = " i t e m . l i s t . t y p e = = ' w h i t e ' " > 白 < / s p a n > 名 单 : { { i t e m . l i s t . n a m e } } ] < / s p a n > < / a >
< span v - else > [ < span v - if = "item.list.type == 'black'" > 黑 < / s p a n > < s p a n v - i f = " i t e m . l i s t . t y p e = = ' w h i t e ' " > 白 < / s p a n > 名 单 : { { i t e m . l i s t . n a m e } } < / s p a n >
< span v - if = "item.policy.id > 0" >
< span v - if = "item.policy.server != null" >
< a : href = "'/servers/server/settings/waf/ipadmin/allowList?serverId=' + item.policy.server.id + '&firewallPolicyId=' + item.policy.id" v - if = "item.list.type == 'white'" > [ 服务 : { { item . policy . server . name } } ] < / a >
< a : href = "'/servers/server/settings/waf/ipadmin/denyList?serverId=' + item.policy.server.id + '&firewallPolicyId=' + item.policy.id" v - if = "item.list.type == 'black'" > [ 服务 : { { item . policy . server . name } } ] < / a >
< / s p a n >
< span v - else >
< a : href = "'/servers/components/waf/ipadmin/lists?firewallPolicyId=' + item.policy.id + '&type=' + item.list.type" > [ 策略 : { { item . policy . name } } ] < / a >
< / s p a n >
< / s p a n >
< / s p a n >
< / s p a n >
< / d i v >
< / t d >
< td >
< span v - if = "item.type.length == 0" > IPv4 < / s p a n >
< span v - else - if = "item.type == 'ipv4'" > IPv4 < / s p a n >
< span v - else - if = "item.type == 'ipv6'" > IPv6 < / s p a n >
< span v - else - if = "item.type == 'all'" > < strong > 所有IP < / s t r o n g > < / s p a n >
< / t d >
< td >
< span v - if = "item.eventLevelName != null && item.eventLevelName.length > 0" > { { item . eventLevelName } } < / s p a n >
< span v - else class = "disabled" > - < / s p a n >
< / t d >
< td >
< div v - if = "item.expiredTime.length > 0" >
{ { item . expiredTime } }
< div v - if = "item.isExpired" style = "margin-top: 0.5em" >
< span class = "ui label tiny basic red" > 已过期 < / s p a n >
< / d i v >
2022-01-09 20:13:18 +08:00
< div v - if = "item.lifeSeconds != null && item.lifeSeconds > 0" >
< span class = "small grey" > { { formatSeconds ( item . lifeSeconds ) } } < / s p a n >
< / d i v >
2021-11-22 12:08:53 +08:00
< / d i v >
< span v - else class = "disabled" > 不过期 < / s p a n >
< / t d >
< td >
< span v - if = "item.reason.length > 0" > { { item . reason } } < / s p a n >
< span v - else class = "disabled" > - < / s p a n >
2022-01-14 10:46:02 +08:00
< div v - if = "item.sourceNode != null && item.sourceNode.id > 0" style = "margin-top: 0.4em" >
< a : href = "'/clusters/cluster/node?clusterId=' + item.sourceNode.clusterId + '&nodeId=' + item.sourceNode.id" > < span class = "small" > < i class = "icon cloud" > < / i > { { i t e m . s o u r c e N o d e . n a m e } } < / s p a n > < / a >
< / d i v >
2021-11-22 12:08:53 +08:00
< div style = "margin-top: 0.4em" v - if = "item.sourceServer != null && item.sourceServer.id > 0" >
< a : href = "'/servers/server?serverId=' + item.sourceServer.id" style = "border: 0" > < span class = "small " > < i class = "icon clone outline" > < / i > { { i t e m . s o u r c e S e r v e r . n a m e } } < / s p a n > < / a >
< / d i v >
< div v - if = "item.sourcePolicy != null && item.sourcePolicy.id > 0" style = "margin-top: 0.4em" >
2022-01-14 10:46:02 +08:00
< a : href = "'/servers/components/waf/group?firewallPolicyId=' + item.sourcePolicy.id + '&type=inbound&groupId=' + item.sourceGroup.id + '#set' + item.sourceSet.id" v - if = "item.sourcePolicy.serverId == 0" > < span class = "small " > < i class = "icon shield" > < / i > { { i t e m . s o u r c e P o l i c y . n a m e } } & r a q u o ; { { i t e m . s o u r c e G r o u p . n a m e } } & r a q u o ; { { i t e m . s o u r c e S e t . n a m e } } < / s p a n > < / a >
< a : href = "'/servers/server/settings/waf/group?serverId=' + item.sourcePolicy.serverId + '&firewallPolicyId=' + item.sourcePolicy.id + '&type=inbound&groupId=' + item.sourceGroup.id + '#set' + item.sourceSet.id" v - if = "item.sourcePolicy.serverId > 0" > < span class = "small " > < i class = "icon shield" > < / i > { { i t e m . s o u r c e P o l i c y . n a m e } } & r a q u o ; { { i t e m . s o u r c e G r o u p . n a m e } } & r a q u o ; { { i t e m . s o u r c e S e t . n a m e } } < / s p a n > < / a >
2022-01-11 12:04:03 +08:00
< / d i v >
2021-11-22 12:08:53 +08:00
< / t d >
< td >
< a href = "" @ click . prevent = "viewLogs(item.id)" > 日志 < / a > & n b s p ;
< a href = "" @ click . prevent = "updateItem(item.id)" > 修改 < / a > & n b s p ;
< a href = "" @ click . prevent = "deleteItem(item.id)" > 删除 < / a >
< / t d >
< / t r >
< / t b o d y >
< / t a b l e >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " i p - i t e m - t e x t " , { p r o p s : [ " v - i t e m " ] , t e m p l a t e : ` < s p a n >
2021-11-22 12:08:53 +08:00
< span v - if = "vItem.type == 'all'" > * < / s p a n >
< span v - if = "vItem.type == 'ipv4' || vItem.type.length == 0" >
{ { vItem . ipFrom } }
< span v - if = "vItem.ipTo.length > 0" > - { { vItem . ipTo } } < / s p a n >
< / s p a n >
< span v - if = "vItem.type == 'ipv6'" > { { vItem . ipFrom } } < / s p a n >
< span v - if = "vItem.eventLevelName != null && vItem.eventLevelName.length > 0" > & nbsp ; 级别 : { { vItem . eventLevelName } } < / s p a n >
2022-04-08 21:24:54 +08:00
< / s p a n > ` } ) , V u e . c o m p o n e n t ( " i p - b o x " , { p r o p s : [ " v - i p " ] , m e t h o d s : { p o p u p : f u n c t i o n ( ) { l e t e = t h i s . v I p ; v a r t ; n u l l ! = e & & 0 ! = e . l e n g t h | | ( t = t h i s . $ r e f s . c o n t a i n e r , n u l l = = ( e = t . i n n e r T e x t ) & & ( e = t . t e x t C o n t e n t ) ) , t e a w e b . p o p u p ( " / s e r v e r s / i p b o x ? i p = " + e , { w i d t h : " 5 0 e m " , h e i g h t : " 3 0 e m " } ) } } , t e m p l a t e : ' < s p a n @ c l i c k . p r e v e n t = " p o p u p ( ) " r e f = " c o n t a i n e r " > < s l o t > < / s l o t > < / s p a n > ' } ) , V u e . c o m p o n e n t ( " a p i - n o d e - s e l e c t o r " , { p r o p s : [ ] , d a t a : f u n c t i o n ( ) { r e t u r n { } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
暂未实现
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " a p i - n o d e - a d d r e s s e s - b o x " , { p r o p s : [ " v - a d d r s " , " v - n a m e " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v A d d r s ; r e t u r n { a d d r s : e = n u l l = = e ? [ ] : e } } , m e t h o d s : { a d d A d d r : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / a p i / n o d e / c r e a t e A d d r P o p u p " , { h e i g h t : " 1 6 e m " , c a l l b a c k : f u n c t i o n ( e ) { t . a d d r s . p u s h ( e . d a t a . a d d r ) } } ) } , u p d a t e A d d r : f u n c t i o n ( t , e ) { l e t i = t h i s ; w i n d o w . U P D A T I N G _ A D D R = e , t e a w e b . p o p u p ( " / a p i / n o d e / u p d a t e A d d r P o p u p ? a d d r e s s I d = " , { c a l l b a c k : f u n c t i o n ( e ) { V u e . s e t ( i . a d d r s , t , e . d a t a . a d d r ) } } ) } , r e m o v e A d d r : f u n c t i o n ( e ) { t h i s . a d d r s . $ r e m o v e ( e ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" : name = "vName" : value = "JSON.stringify(addrs)" / >
< div v - if = "addrs.length > 0" >
< div >
< div v - for = "(addr, index) in addrs" class = "ui label small" >
{ { addr . protocol } } : //{{addr.host.quoteIP()}}:{{addr.portRange}}</span>
< a href = "" title = "修改" @ click . prevent = "updateAddr(index, addr)" > < i class = "icon pencil small" > < / i > < / a >
< a href = "" title = "删除" @ click . prevent = "removeAddr(index)" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div >
< button class = "ui button small" type = "button" @ click . prevent = "addAddr()" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " p a g e - b o x " , { d a t a : f u n c t i o n ( ) { r e t u r n { p a g e : " " } } , c r e a t e d : f u n c t i o n ( ) { l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . p a g e = T e a . V u e . p a g e } ) } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div class = "page" v - html = "page" > < / d i v >
2022-07-27 20:20:04 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n e t w o r k - a d d r e s s e s - b o x " , { p r o p s : [ " v - s e r v e r - t y p e " , " v - a d d r e s s e s " , " v - p r o t o c o l " , " v - n a m e " , " v - f r o m " , " v - s u p p o r t - r a n g e " , " v - u r l " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v A d d r e s s e s , t = ( n u l l = = e & & ( e = [ ] ) , t h i s . v P r o t o c o l ) , i = ( n u l l = = t & & ( t = " " ) , t h i s . v N a m e ) , s = ( n u l l = = i & & ( i = " a d d r e s s e s " ) , t h i s . v F r o m ) ; r e t u r n n u l l = = s & & ( s = " " ) , { a d d r e s s e s : e , p r o t o c o l : t , n a m e : i , f r o m : s } } , w a t c h : { v S e r v e r T y p e : f u n c t i o n ( ) { t h i s . a d d r e s s e s = [ ] } , v A d d r e s s e s : f u n c t i o n ( ) { n u l l ! = t h i s . v A d d r e s s e s & & ( t h i s . a d d r e s s e s = t h i s . v A d d r e s s e s ) } } , m e t h o d s : { a d d A d d r : f u n c t i o n ( ) { l e t t = t h i s , e = ( w i n d o w . U P D A T I N G _ A D D R = n u l l , t h i s . v U r l ) ; n u l l = = e & & ( e = " / s e r v e r s / a d d P o r t P o p u p " ) , t e a w e b . p o p u p ( e + " ? s e r v e r T y p e = " + t h i s . v S e r v e r T y p e + " & p r o t o c o l = " + t h i s . p r o t o c o l + " & f r o m = " + t h i s . f r o m + " & s u p p o r t R a n g e = " + ( t h i s . s u p p o r t R a n g e ( ) ? 1 : 0 ) , { h e i g h t : " 1 8 e m " , c a l l b a c k : f u n c t i o n ( e ) { v a r i = e . d a t a . a d d r e s s ; n u l l ! = t . a d d r e s s e s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n i . h o s t = = t . h o s t & & i . p o r t R a n g e = = t . p o r t R a n g e & & i . p r o t o c o l = = t . p r o t o c o l } ) ? t e a w e b . w a r n ( " 要 添 加 的 网 络 地 址 已 经 存 在 " ) : ( t . a d d r e s s e s . p u s h ( i ) , [ " h t t p s " , " h t t p s 4 " , " h t t p s 6 " ] . $ c o n t a i n s ( i . p r o t o c o l ) ? t h i s . t l s P r o t o c o l N a m e = " H T T P S " : [ " t l s " , " t l s 4 " , " t l s 6 " ] . $ c o n t a i n s ( i . p r o t o c o l ) & & ( t h i s . t l s P r o t o c o l N a m e = " T L S " ) , t . $ e m i t ( " c h a n g e " , t . a d d r e s s e s ) ) } } ) } , r e m o v e A d d r : f u n c t i o n ( e ) { t h i s . a d d r e s s e s . $ r e m o v e ( e ) , t h i s . $ e m i t ( " c h a n g e " , t h i s . a d d r e s s e s ) } , u p d a t e A d d r : f u n c t i o n ( t , e ) { l e t i = t h i s , s = ( w i n d o w . U P D A T I N G _ A D D R = e , t h i s . v U r l ) ; n u l l = = s & & ( s = " / s e r v e r s / a d d P o r t P o p u p " ) , t e a w e b . p o p u p ( s + " ? s e r v e r T y p e = " + t h i s . v S e r v e r T y p e + " & p r o t o c o l = " + t h i s . p r o t o c o l + " & f r o m = " + t h i s . f r o m + " & s u p p o r t R a n g e = " + ( t h i s . s u p p o r t R a n g e ( ) ? 1 : 0 ) , { h e i g h t : " 1 8 e m " , c a l l b a c k : f u n c t i o n ( e ) { e = e . d a t a . a d d r e s s ; V u e . s e t ( i . a d d r e s s e s , t , e ) , [ " h t t p s " , " h t t p s 4 " , " h t t p s 6 " ] . $ c o n t a i n s ( e . p r o t o c o l ) ? t h i s . t l s P r o t o c o l N a m e = " H T T P S " : [ " t l s " , " t l s 4 " , " t l s 6 " ] . $ c o n t a i n s ( e . p r o t o c o l ) & & ( t h i s . t l s P r o t o c o l N a m e = " T L S " ) , i . $ e m i t ( " c h a n g e " , i . a d d r e s s e s ) } } ) , t h i s . $ e m i t ( " c h a n g e " , t h i s . a d d r e s s e s ) } , s u p p o r t R a n g e : f u n c t i o n ( ) { r e t u r n t h i s . v S u p p o r t R a n g e | | " t c p P r o x y " = = t h i s . v S e r v e r T y p e | | " u d p P r o x y " = = t h i s . v S e r v e r T y p e } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" : name = "name" : value = "JSON.stringify(addresses)" / >
< div v - if = "addresses.length > 0" >
< div class = "ui label small basic" v - for = "(addr, index) in addresses" >
{ { addr . protocol } } : //<span v-if="addr.host.length > 0">{{addr.host.quoteIP()}}</span><span v-if="addr.host.length == 0">*</span>:<span v-if="addr.portRange.indexOf('-')<0">{{addr.portRange}}</span><span v-else style="font-style: italic">{{addr.portRange}}</span>
< a href = "" @ click . prevent = "updateAddr(index, addr)" title = "修改" > < i class = "icon pencil small" > < / i > < / a >
< a href = "" @ click . prevent = "removeAddr(index)" title = "删除" > < i class = "icon remove" > < / i > < / a > < / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< a href = "" @ click . prevent = "addAddr()" > [ 添加端口绑定 ] < / a >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " s u b m i t - b t n " , { t e m p l a t e : ' < b u t t o n c l a s s = " u i b u t t o n p r i m a r y " t y p e = " s u b m i t " > < s l o t > 保 存 < / s l o t > < / b u t t o n > ' } ) , V u e . c o m p o n e n t ( " m o r e - i t e m s - a n g l e " , { p r o p s : [ " v - d a t a - u r l " , " v - u r l " ] , d a t a : f u n c t i o n ( ) { r e t u r n { v i s i b l e : ! 1 } } , m e t h o d s : { s h o w : f u n c t i o n ( ) { t h i s . v i s i b l e = ! t h i s . v i s i b l e , t h i s . v i s i b l e ? t h i s . s h o w B o x ( ) : t h i s . h i d e B o x ( ) } , s h o w B o x : f u n c t i o n ( ) { l e t a = t h i s ; t h i s . v i s i b l e = ! 0 , T e a . a c t i o n ( t h i s . v D a t a U r l ) . p a r a m s ( { u r l : t h i s . v U r l } ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { l e t t = e . d a t a . g r o u p s ; v a r e = a . $ e l . o f f s e t L e f t + 1 2 0 , i = a . $ e l . o f f s e t T o p + 7 0 ; f u n c t i o n s ( e ) { " I " = = e . t a r g e t . t a g N a m e | | a . i s I n B o x ( n , e . t a r g e t ) | | ( d o c u m e n t . r e m o v e E v e n t L i s t e n e r ( " c l i c k " , s ) , a . h i d e B o x ( ) ) } l e t n = d o c u m e n t . c r e a t e E l e m e n t ( " d i v " ) , o = ( n . s e t A t t r i b u t e ( " i d " , " m o r e - i t e m s - b o x " ) , n . s t y l e . c s s T e x t = " z - i n d e x : 1 0 0 ; p o s i t i o n : a b s o l u t e ; l e f t : " + e + " p x ; t o p : " + i + " p x ; m a x - h e i g h t : 3 0 e m ; o v e r f l o w : a u t o ; b o r d e r - b o t t o m : 1 p x s o l i d r g b a ( 3 4 , 3 6 , 3 8 , . 1 5 ) " , d o c u m e n t . b o d y . a p p e n d ( n ) , ' < u l c l a s s = " u i l a b e l e d m e n u v e r t i c a l b o r d e r l e s s " s t y l e = " p a d d i n g : 0 " > ' ) ; t . f o r E a c h ( f u n c t i o n ( e ) { o + = ' < d i v c l a s s = " i t e m h e a d e r " > ' + t e a w e b . e n c o d e H T M L ( e . n a m e ) + " < / d i v > " , e . i t e m s . f o r E a c h ( f u n c t i o n ( e ) { o + = ' < a h r e f = " ' + e . u r l + ' " c l a s s = " i t e m ' + ( e . i s A c t i v e ? " a c t i v e " : " " ) + ' " s t y l e = " f o n t - s i z e : 0 . 9 e m ; " > ' + t e a w e b . e n c o d e H T M L ( e . n a m e ) + ' < i c l a s s = " i c o n r i g h t a n g l e " > < / i > < / a > ' } ) } ) , o + = " < / u l > " , n . i n n e r H T M L = o ; d o c u m e n t . a d d E v e n t L i s t e n e r ( " c l i c k " , s ) } ) } , h i d e B o x : f u n c t i o n ( ) { l e t e = d o c u m e n t . g e t E l e m e n t B y I d ( " m o r e - i t e m s - b o x " ) ; n u l l ! = e & & e . p a r e n t N o d e . r e m o v e C h i l d ( e ) , t h i s . v i s i b l e = ! 1 } , i s I n B o x : f u n c t i o n ( e , t ) { f o r ( ; ; ) { i f ( n u l l = = t ) b r e a k ; i f ( t . p a r e n t N o d e = = e ) r e t u r n ! 0 ; t = t . p a r e n t N o d e } r e t u r n ! 1 } } , t e m p l a t e : ' < a h r e f = " " c l a s s = " i t e m " @ c l i c k . p r e v e n t = " s h o w " > < i c l a s s = " i c o n a n g l e " : c l a s s = " { d o w n : ! v i s i b l e , u p : v i s i b l e } " > < / i > < / a > ' } ) , V u e . c o m p o n e n t ( " m e n u - i t e m " , { p r o p s : [ " h r e f " , " a c t i v e " , " c o d e " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . a c t i v e ; v a r t ; v o i d 0 = = = e & & ( t = " " , n u l l ! = ( t = v o i d 0 ! = = w i n d o w . T E A . A C T I O N . d a t a . f i r s t M e n u I t e m ? w i n d o w . T E A . A C T I O N . d a t a . f i r s t M e n u I t e m : t ) & & 0 < t . l e n g t h & & n u l l ! = t h i s . c o d e & & 0 < t h i s . c o d e . l e n g t h & & ( e = 0 < t . i n d e x O f ( " , " ) ? t . s p l i t ( " , " ) . $ c o n t a i n s ( t h i s . c o d e ) : t = = t h i s . c o d e ) ) ; l e t i = n u l l = = t h i s . h r e f ? " " : t h i s . h r e f ; r e t u r n " s t r i n g " = = t y p e o f i & & 0 < i . l e n g t h & & i . s t a r t s W i t h ( " . " ) & & ( t = i . i n d e x O f ( " ? " ) , i = 0 < = t ? T e a . u r l ( i . s u b s t r i n g ( 0 , t ) ) + i . s u b s t r i n g ( t ) : T e a . u r l ( i ) ) , { v H r e f : i , v A c t i v e : e } } , m e t h o d s : { c l i c k : f u n c t i o n ( e ) { t h i s . $ e m i t ( " c l i c k " , e ) } } , t e m p l a t e : ' \ t \ t < a : h r e f = " v H r e f " c l a s s = " i t e m " : c l a s s = " { a c t i v e : v A c t i v e } " @ c l i c k = " c l i c k " > < s l o t > < / s l o t > < / a > \ t \ t ' } ) , V u e . c o m p o n e n t ( " l i n k - i c o n " , { p r o p s : [ " h r e f " , " t i t l e " , " t a r g e t " ] , d a t a : f u n c t i o n ( ) { r e t u r n { v T i t l e : n u l l = = t h i s . t i t l e ? " 打 开 链 接 " : t h i s . t i t l e } } , t e m p l a t e : ' < s p a n > < s l o t > < / s l o t > & n b s p ; < a : h r e f = " h r e f " : t i t l e = " v T i t l e " c l a s s = " l i n k g r e y " : t a r g e t = " t a r g e t " > < i c l a s s = " i c o n l i n k i f y s m a l l " > < / i > < / a > < / s p a n > ' } ) , V u e . c o m p o n e n t ( " l i n k - r e d " , { p r o p s : [ " h r e f " , " t i t l e " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . h r e f ; r e t u r n { v H r e f : e = n u l l = = e ? " " : e } } , m e t h o d s : { c l i c k P r e v e n t : f u n c t i o n ( ) { e m i t C l i c k ( t h i s , a r g u m e n t s ) } } , t e m p l a t e : ' < a : h r e f = " v H r e f " : t i t l e = " t i t l e " s t y l e = " b o r d e r - b o t t o m : 1 p x # d b 2 8 2 8 d a s h e d " @ c l i c k . p r e v e n t = " c l i c k P r e v e n t " > < s p a n c l a s s = " r e d " > < s l o t > < / s l o t > < / s p a n > < / a > ' } ) , V u e . c o m p o n e n t ( " l i n k - p o p u p " , { p r o p s : [ " t i t l e " ] , m e t h o d s : { c l i c k P r e v e n t : f u n c t i o n ( ) { e m i t C l i c k ( t h i s , a r g u m e n t s ) } } , t e m p l a t e : ' < a h r e f = " " : t i t l e = " t i t l e " @ c l i c k . p r e v e n t = " c l i c k P r e v e n t " > < s l o t > < / s l o t > < / a > ' } ) , V u e . c o m p o n e n t ( " p o p u p - i c o n " , { p r o p s : [ " t i t l e " , " h r e f " , " h e i g h t " ] , m e t h o d s : { c l i c k P r e v e n t : f u n c t i o n ( ) { n u l l ! = t h i s . h r e f & & 0 < t h i s . h r e f . l e n g t h & & t e a w e b . p o p u p ( t h i s . h r e f , { h e i g h t : t h i s . h e i g h t } ) } } , t e m p l a t e : ' < s p a n > < s l o t > < / s l o t > & n b s p ; < a h r e f = " " : t i t l e = " t i t l e " @ c l i c k . p r e v e n t = " c l i c k P r e v e n t " > < i c l a s s = " i c o n e x p a n d s m a l l " > < / i > < / a > < / s p a n > ' } ) , V u e . c o m p o n e n t ( " t i p - i c o n " , { p r o p s : [ " c o n t e n t " ] , m e t h o d s : { s h o w T i p : f u n c t i o n ( ) { t e a w e b . p o p u p T i p ( t h i s . c o n t e n t ) } } , t e m p l a t e : ' < a h r e f = " " t i t l e = " 查 看 帮 助 " @ c l i c k . p r e v e n t = " s h o w T i p " > < i c l a s s = " i c o n q u e s t i o n c i r c l e g r e y " > < / i > < / a > ' } ) , V u e . c o m p o n e n t ( " c o u n t r i e s - s e l e c t o r " , { p r o p s : [ " v - c o u n t r i e s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v C o u n t r i e s ; v a r t = ( e = n u l l = = e ? [ ] : e ) . $ m a p ( f u n c t i o n ( e , t ) { r e t u r n t . i d } ) ; r e t u r n { c o u n t r i e s : e , c o u n t r y I d s : t } } , m e t h o d s : { a d d : f u n c t i o n ( ) { l e t e = t h i s . c o u n t r y I d s . m a p ( f u n c t i o n ( e ) { r e t u r n e . t o S t r i n g ( ) } ) , t = t h i s ; t e a w e b . p o p u p ( " / u i / s e l e c t C o u n t r i e s P o p u p ? c o u n t r y I d s = " + e . j o i n ( " , " ) , { w i d t h : " 4 8 e m " , h e i g h t : " 2 3 e m " , c a l l b a c k : f u n c t i o n ( e ) { t . c o u n t r i e s = e . d a t a . c o u n
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "countryIdsJSON" : value = "JSON.stringify(countryIds)" / >
< div v - if = "countries.length > 0" style = "margin-bottom: 0.5em" >
< div v - for = "(country, index) in countries" class = "ui label tiny basic" > { { country . name } } < a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove" > < / i > < / a > < / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " r a q u o - i t e m " , { t e m p l a t e : ' < s p a n c l a s s = " i t e m d i s a b l e d " s t y l e = " p a d d i n g : 0 " > & r a q u o ; < / s p a n > ' } ) , V u e . c o m p o n e n t ( " m o r e - o p t i o n s - t b o d y " , { d a t a : f u n c t i o n ( ) { r e t u r n { i s V i s i b l e : ! 1 } } , m e t h o d s : { s h o w : f u n c t i o n ( ) { t h i s . i s V i s i b l e = ! t h i s . i s V i s i b l e , t h i s . $ e m i t ( " c h a n g e " , t h i s . i s V i s i b l e ) } } , t e m p l a t e : ` < t b o d y >
2021-11-22 12:08:53 +08:00
< tr >
< td colspan = "2" > < a href = "" @ click . prevent = "show()" > < span v - if = "!isVisible" > 更多选项 < / s p a n > < s p a n v - i f = " i s V i s i b l e " > 收 起 选 项 < / s p a n > < i c l a s s = " i c o n a n g l e " : c l a s s = " { d o w n : ! i s V i s i b l e , u p : i s V i s i b l e } " > < / i > < / a > < / t d >
< / t r >
2022-08-14 20:03:31 +08:00
< /tbody>`}),Vue.component("download-link",{props:["v-element","v-file","v-value"],created:function(){let e=this;setTimeout(function(){e.url=e.composeURL()},1e3)},data:function(){let e=this.vFile;return{file:e=null!=e&&0!=e.length?e:"unknown-file",url:this.composeURL()}},methods:{composeURL:function(){let e="";if(null!=this.vValue)e=this.vValue;else{var t=document.getElementById(this.vElement);if(null==t)return void teaweb.warn("找不到要下载的内容");null==(e=t.innerText)&&(e=t.textContent)}return Tea.url("/ui / download ",{file:this.file,text:e})}},template:'<a :href=" url " target=" _blank " style=" font - weight : normal "><slot></slot></a>'}),Vue.component(" values - box ",{props:[" values "," v - values "," size "," maxlength "," name "," placeholder "],data:function(){let e=this.values;return null==e&&(e=[]),{realValues:e=null!=this.vValues&&" object "==typeof this.vValues?this.vValues:e,isUpdating:!1,isAdding:!1,index:0,value:" ",isEditing:!1}},methods:{create:function(){this.isAdding=!0;var e=this;setTimeout(function(){e.$refs.value.focus()},200)},update:function(e){this.cancel(),this.isUpdating=!0,this.index=e,this.value=this.realValues[e];var t=this;setTimeout(function(){t.$refs.value.focus()},200)},confirm:function(){0!=this.value.length&&(this.isUpdating?Vue.set(this.realValues,this.index,this.value):this.realValues.push(this.value),this.cancel(),this.$emit(" change ",this.realValues))},remove:function(e){this.realValues.$remove(e),this.$emit(" change ",this.realValues)},cancel:function(){this.isUpdating=!1,this.isAdding=!1,this.value=" " } , updateAll : function ( e ) { this . realValues = e } , addValue : function ( e ) { this . realValues . push ( e ) } , startEditing : function ( ) { this . isEditing = ! this . isEditing } } , template : ` <div>
< div v - show = "!isEditing && realValues.length > 0" >
< div class = "ui label tiny basic" v - for = "(value, index) in realValues" style = "margin-top:0.4em;margin-bottom:0.4em" > { { value } } < / d i v >
2021-11-22 12:08:53 +08:00
< a href = "" @ click . prevent = "startEditing" style = "font-size: 0.8em; margin-left: 0.2em" > [ 修改 ] < / a >
< / d i v >
2022-08-14 20:03:31 +08:00
< div v - show = "isEditing || realValues.length == 0" >
< div style = "margin-bottom: 1em" v - if = "realValues.length > 0" >
< div class = "ui label tiny basic" v - for = "(value, index) in realValues" style = "margin-top:0.4em;margin-bottom:0.4em" > { { value } }
2021-11-22 12:08:53 +08:00
< input type = "hidden" : name = "name" : value = "value" / >
& nbsp ; < a href = "" @ click . prevent = "update(index)" title = "修改" > < i class = "icon pencil small" > < / i > < / a >
< a href = "" @ click . prevent = "remove(index)" title = "删除" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
<!-- 添加 | 修改 -- >
< div v - if = "isAdding || isUpdating" >
< div class = "ui fields inline" >
< div class = "ui field" >
< input type = "text" : size = "size" : maxlength = "maxlength" : placeholder = "placeholder" v - model = "value" ref = "value" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button small" type = "button" @ click . prevent = "confirm()" > 确定 < / b u t t o n >
< / d i v >
< div class = "ui field" >
< a href = "" @ click . prevent = "cancel()" title = "取消" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< / d i v >
< div v - if = "!isAdding && !isUpdating" >
< button class = "ui button tiny" type = "button" @ click . prevent = "create()" > + < / b u t t o n >
< / d i v >
< / d i v >
2022-07-17 21:19:45 +08:00
< /div>`}),Vue.component("datetime-input",{props:["v-name","v-timestamp"],mounted:function(){let t=this;teaweb.datepicker(this.$refs.dayInput,function(e){t.day=e,t.hour="23",t.minute="59",t.second="59",t.change()})},data:function(){let t=this.vTimestamp,i=(null!=t?(t=parseInt(t),isNaN(t)&&(t=0)):t=0,""),s="",n="",o="";if(0<t){let e=new Date;e.setTime(1e3*t);var a=e.getFullYear().toString(),l=this.leadingZero((e.getMonth()+1).toString(),2);i=a+"-"+l+"-"+this.leadingZero(e.getDate().toString(),2),s=this.leadingZero(e.getHours().toString(),2),n=this.leadingZero(e.getMinutes().toString(),2),o=this.leadingZero(e.getSeconds().toString(),2)}return{timestamp:t,day:i,hour:s,minute:n,second:o,hasDayError:!1,hasHourError:!1,hasMinuteError:!1,hasSecondError:!1}},methods:{change:function(){let e=new Date;var t,i;/ ^ \ d { 4 } - \ d { 1 , 2 } - \ d { 1 , 2 } $ / . test ( this . day ) ? ( i = this . day . split ( "-" ) , t = parseInt ( i [ 0 ] ) , e . setFullYear ( t ) , ( t = parseInt ( i [ 1 ] ) ) < 1 || 12 < t ? this . hasDayError = ! 0 : ( e . setMonth ( t - 1 ) , ( t = parseInt ( i [ 2 ] ) ) < 1 || 32 < t ? this . hasDayError = ! 0 : ( e . setDate ( t ) , this . hasDayError = ! 1 , /^\d+$/ . test ( this . hour ) ? ( i = parseInt ( this . hour ) , isNaN ( i ) || i < 0 || 24 <= i ? this . hasHourError = ! 0 : ( this . hasHourError = ! 1 , e . setHours ( i ) , /^\d+$/ . test ( this . minute ) ? ( t = parseInt ( this . minute ) , isNaN ( t ) || t < 0 || 60 <= t ? this . hasMinuteError = ! 0 : ( this . hasMinuteError = ! 1 , e . setMinutes ( t ) , /^\d+$/ . test ( this . second ) ? ( i = parseInt ( this . second ) , isNaN ( i ) || i < 0 || 60 <= i ? this . hasSecondError = ! 0 : ( this . hasSecondError = ! 1 , e . setSeconds ( i ) , this . timestamp = Math . floor ( e . getTime ( ) / 1e3 ) ) ) : this . hasSecondError = ! 0 ) ) : this . hasMinuteError = ! 0 ) ) : this . hasHourError = ! 0 ) ) ) : this . hasDayError = ! 0 } , leadingZero : function ( t , i ) { if ( i <= ( t = t . toString ( ) ) . length ) return t ; for ( let e = 0 ; e < i - t . length ; e ++ ) t = "0" + t ; return t } , resultTimestamp : function ( ) { return this . timestamp } , nextDays : function ( e ) { let t = new Date ; t . setTime ( t . getTime ( ) + 86400 * e * 1e3 ) , this . day = t . getFullYear ( ) + "-" + this . leadingZero ( t . getMonth ( ) + 1 , 2 ) + "-" + this . leadingZero ( t . getDate ( ) , 2 ) , this . hour = this . leadingZero ( t . getHours ( ) , 2 ) , this . minute = this . leadingZero ( t . getMinutes ( ) , 2 ) , this . second = this . leadingZero ( t . getSeconds ( ) , 2 ) , this . change ( ) } , nextHours : function ( e ) { let t = new Date ; t . setTime ( t . getTime ( ) + 3600 * e * 1e3 ) , this . day = t . getFullYear ( ) + "-" + this . leadingZero ( t . getMonth ( ) + 1 , 2 ) + "-" + this . leadingZero ( t . getDate ( ) , 2 ) , this . hour = this . leadingZero ( t . getHours ( ) , 2 ) , this . minute = this . leadingZero ( t . getMinutes ( ) , 2 ) , this . second = this . leadingZero ( t . getSeconds ( ) , 2 ) , this . change ( ) } } , template : ` <div>
2021-11-22 12:08:53 +08:00
< input type = "hidden" : name = "vName" : value = "timestamp" / >
< div class = "ui fields inline" style = "padding: 0; margin:0" >
< div class = "ui field" : class = "{error: hasDayError}" >
< input type = "text" v - model = "day" placeholder = "YYYY-MM-DD" style = "width:8.6em" maxlength = "10" @ input = "change" ref = "dayInput" / >
< / d i v >
< div class = "ui field" : class = "{error: hasHourError}" > < input type = "text" v - model = "hour" maxlength = "2" style = "width:4em" placeholder = "时" @ input = "change" / > < / d i v >
< div class = "ui field" > : < / d i v >
< div class = "ui field" : class = "{error: hasMinuteError}" > < input type = "text" v - model = "minute" maxlength = "2" style = "width:4em" placeholder = "分" @ input = "change" / > < / d i v >
< div class = "ui field" > : < / d i v >
< div class = "ui field" : class = "{error: hasSecondError}" > < input type = "text" v - model = "second" maxlength = "2" style = "width:4em" placeholder = "秒" @ input = "change" / > < / d i v >
< / d i v >
2022-07-17 21:19:45 +08:00
< p class = "comment" > 常用时间 : < a href = "" @ click . prevent = "nextHours(1)" > & nbsp ; 1 小时 & nbsp ; < / a > < s p a n c l a s s = " d i s a b l e d " > | < / s p a n > < a h r e f = " " @ c l i c k . p r e v e n t = " n e x t D a y s ( 1 ) " > & n b s p ; 1 天 & n b s p ; < / a > < s p a n c l a s s = " d i s a b l e d " > | < / s p a n > < a h r e f = " " @ c l i c k . p r e v e n t = " n e x t D a y s ( 3 ) " > & n b s p ; 3 天 & n b s p ; < / a > < s p a n c l a s s = " d i s a b l e d " > | < / s p a n > < a h r e f = " " @ c l i c k . p r e v e n t = " n e x t D a y s ( 7 ) " > & n b s p ; 1 周 & n b s p ; < / a > < s p a n c l a s s = " d i s a b l e d " > | < / s p a n > < a h r e f = " " @ c l i c k . p r e v e n t = " n e x t D a y s ( 3 0 ) " > & n b s p ; 3 0 天 & n b s p ; < / a > < / p >
2022-06-19 20:19:58 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " l a b e l - o n " , { p r o p s : [ " v - i s - o n " ] , t e m p l a t e : ' < d i v > < s p a n v - i f = " v I s O n " c l a s s = " u i l a b e l t i n y g r e e n b a s i c " > 已 启 用 < / s p a n > < s p a n v - i f = " ! v I s O n " c l a s s = " u i l a b e l t i n y r e d b a s i c " > 已 停 用 < / s p a n > < / d i v > ' } ) , V u e . c o m p o n e n t ( " c o d e - l a b e l " , { m e t h o d s : { c l i c k : f u n c t i o n ( e ) { t h i s . $ e m i t ( " c l i c k " , e ) } } , t e m p l a t e : ' < s p a n c l a s s = " u i l a b e l b a s i c t i n y " s t y l e = " p a d d i n g : 3 p x ; m a r g i n - l e f t : 2 p x ; m a r g i n - r i g h t : 2 p x " @ c l i c k . p r e v e n t = " c l i c k " > < s l o t > < / s l o t > < / s p a n > ' } ) , V u e . c o m p o n e n t ( " c o d e - l a b e l - p l a i n " , { t e m p l a t e : ' < s p a n c l a s s = " u i l a b e l b a s i c t i n y " s t y l e = " p a d d i n g : 3 p x ; m a r g i n - l e f t : 2 p x ; m a r g i n - r i g h t : 2 p x " > < s l o t > < / s l o t > < / s p a n > ' } ) , V u e . c o m p o n e n t ( " t i n y - l a b e l " , { t e m p l a t e : ' < s p a n c l a s s = " u i l a b e l t i n y " s t y l e = " m a r g i n - b o t t o m : 0 . 5 e m " > < s l o t > < / s l o t > < / s p a n > ' } ) , V u e . c o m p o n e n t ( " t i n y - b a s i c - l a b e l " , { t e m p l a t e : ' < s p a n c l a s s = " u i l a b e l t i n y b a s i c " s t y l e = " m a r g i n - b o t t o m : 0 . 5 e m " > < s l o t > < / s l o t > < / s p a n > ' } ) , V u e . c o m p o n e n t ( " m i c r o - b a s i c - l a b e l " , { t e m p l a t e : ' < s p a n c l a s s = " u i l a b e l t i n y b a s i c " s t y l e = " m a r g i n - b o t t o m : 0 . 5 e m ; f o n t - s i z e : 0 . 7 e m ; p a d d i n g : 4 p x " > < s l o t > < / s l o t > < / s p a n > ' } ) , V u e . c o m p o n e n t ( " g r e y - l a b e l " , { p r o p s : [ " c o l o r " ] , d a t a : f u n c t i o n ( ) { l e t e = " g r e y " ; r e t u r n { l a b e l C o l o r : e = n u l l ! = t h i s . c o l o r & & 0 < t h i s . c o l o r . l e n g t h ? " r e d " : e } } , t e m p l a t e : ' < s p a n c l a s s = " u i l a b e l b a s i c t i n y " : c l a s s = " l a b e l C o l o r " s t y l e = " m a r g i n - t o p : 0 . 4 e m ; f o n t - s i z e : 0 . 7 e m ; b o r d e r : 1 p x s o l i d # d d d ! i m p o r t a n t ; f o n t - w e i g h t : n o r m a l ; " > < s l o t > < / s l o t > < / s p a n > ' } ) , V u e . c o m p o n e n t ( " o p t i o n a l - l a b e l " , { t e m p l a t e : ' < e m > < s p a n c l a s s = " g r e y " > ( 可 选 ) < / s p a n > < / e m > ' } ) , V u e . c o m p o n e n t ( " p l u s - l a b e l " , { t e m p l a t e : ' < s p a n s t y l e = " c o l o r : # B 1 8 7 0 1 ; " > P l u s 专 属 功 能 。 < / s p a n > ' } ) , V u e . c o m p o n e n t ( " p r o - w a r n i n g - l a b e l " , { t e m p l a t e : ' < s p a n > < i c l a s s = " i c o n w a r n i n g c i r c l e y e l l o w " > < / i > 注 意 : 通 常 不 需 要 修 改 ; 如 要 修 改 , 请 在 专 家 指 导 下 进 行 。 < / s p a n > ' } ) , V u e . c o m p o n e n t ( " f i r s t - m e n u " , { p r o p s : [ ] , t e m p l a t e : ' \ t \ t < d i v c l a s s = " f i r s t - m e n u " > \ t \ t \ t < d i v c l a s s = " u i m e n u t e x t b l u e s m a l l " > \ t \ t \ t \ t < s l o t > < / s l o t > \ t \ t \ t < / d i v > \ t \ t \ t < d i v c l a s s = " u i d i v i d e r " > < / d i v > \ t \ t < / d i v > ' } ) , V u e . c o m p o n e n t ( " m o r e - o p t i o n s - i n d i c a t o r " , { d a t a : f u n c t i o n ( ) { r e t u r n { v i s i b l e : ! 1 } } , m e t h o d s : { c h a n g e V i s i b l e : f u n c t i o n ( ) { t h i s . v i s i b l e = ! t h i s . v i s i b l e , n u l l ! = T e a . V u e & & ( T e a . V u e . m o r e O p t i o n s V i s i b l e = t h i s . v i s i b l e ) , t h i s . $ e m i t ( " c h a n g e " , t h i s . v i s i b l e ) } } , t e m p l a t e : ' < a h r e f = " " s t y l e = " f o n t - w e i g h t : n o r m a l " @ c l i c k . p r e v e n t = " c h a n g e V i s i b l e ( ) " > < s l o t > < s p a n v - i f = " ! v i s i b l e " > 更 多 选 项 < / s p a n > < s p a n v - i f = " v i s i b l e " > 收 起 选 项 < / s p a n > < / s l o t > < i c l a s s = " i c o n a n g l e " : c l a s s = " { d o w n : ! v i s i b l e , u p : v i s i b l e } " > < / i > < / a > ' } ) , V u e . c o m p o n e n t ( " p a g e - s i z e - s e l e c t o r " , { d a t a : f u n c t i o n ( ) { l e t t = w i n d o w . l o c a t i o n . s e a r c h , i = 1 0 ; i f ( 0 < t . l e n g t h ) { l e t e = ( t = t . s u b s t r ( 1 ) ) . s p l i t ( " & " ) ; e . f o r E a c h ( f u n c t i o n ( t ) { t = t . s p l i t ( " = " ) ; i f ( 2 = = t . l e n g t h & & " p a g e S i z e " = = t [ 0 ] ) { l e t e = t [ 1 ] ; e . m a t c h ( / ^ \ d + $ / ) & & ( i = p a r s e I n t ( e , 1 0 ) , ( i s N a N ( i ) | | i < 1 ) & & ( i = 1 0 ) ) } } ) } r e t u r n { p a g e S i z e : i } } , w a t c h : { p a g e S i z e : f u n c t i o n ( ) { w i n d o w . C h a n g e P a g e S i z e ( t h i s . p a g e S i z e ) } } , t e m p l a t e : ` < s e l e c t c l a s s = " u i d r o p d o w n " s t y l e = " h e i g h t : 3 4 p x ; p a d d i n g - t o p : 0 ; p a d d i n g - b o t t o m : 0 ; m a r g i n - l e f t : 1 e m ; c o l o r : # 6 6 6 " v - m o d e l = " p a g e S i z e " >
2022-04-08 21:24:54 +08:00
< option value = "10" > [ 每页 ] < / o p t i o n > < o p t i o n v a l u e = " 1 0 " s e l e c t e d = " s e l e c t e d " > 1 0 条 < / o p t i o n > < o p t i o n v a l u e = " 2 0 " > 2 0 条 < / o p t i o n > < o p t i o n v a l u e = " 3 0 " > 3 0 条 < / o p t i o n > < o p t i o n v a l u e = " 4 0 " > 4 0 条 < / o p t i o n > < o p t i o n v a l u e = " 5 0 " > 5 0 条 < / o p t i o n > < o p t i o n v a l u e = " 6 0 " > 6 0 条 < / o p t i o n > < o p t i o n v a l u e = " 7 0 " > 7 0 条 < / o p t i o n > < o p t i o n v a l u e = " 8 0 " > 8 0 条 < / o p t i o n > < o p t i o n v a l u e = " 9 0 " > 9 0 条 < / o p t i o n > < o p t i o n v a l u e = " 1 0 0 " > 1 0 0 条 < / o p t i o n >
< / s e l e c t > ` } ) , V u e . c o m p o n e n t ( " s e c o n d - m e n u " , { t e m p l a t e : ' \ t \ t < d i v c l a s s = " s e c o n d - m e n u " > \ t \ t \ t < d i v c l a s s = " u i m e n u t e x t b l u e s m a l l " > \ t \ t \ t \ t < s l o t > < / s l o t > \ t \ t \ t < / d i v > \ t \ t \ t < d i v c l a s s = " u i d i v i d e r " > < / d i v > \ t \ t < / d i v > ' } ) , V u e . c o m p o n e n t ( " l o a d i n g - m e s s a g e " , { t e m p l a t e : ` < d i v c l a s s = " u i m e s s a g e l o a d i n g " >
2022-03-29 21:25:33 +08:00
< div class = "ui active inline loader small" > < / d i v > & n b s p ; < s l o t > < / s l o t >
2022-05-19 17:14:19 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " m o r e - o p t i o n s - a n g l e " , { d a t a : f u n c t i o n ( ) { r e t u r n { i s V i s i b l e : ! 1 } } , m e t h o d s : { s h o w : f u n c t i o n ( ) { t h i s . i s V i s i b l e = ! t h i s . i s V i s i b l e , t h i s . $ e m i t ( " c h a n g e " , t h i s . i s V i s i b l e ) } } , t e m p l a t e : ' < a h r e f = " " @ c l i c k . p r e v e n t = " s h o w ( ) " > < s p a n v - i f = " ! i s V i s i b l e " > 更 多 选 项 < / s p a n > < s p a n v - i f = " i s V i s i b l e " > 收 起 选 项 < / s p a n > < i c l a s s = " i c o n a n g l e " : c l a s s = " { d o w n : ! i s V i s i b l e , u p : i s V i s i b l e } " > < / i > < / a > ' } ) , V u e . c o m p o n e n t ( " i n n e r - m e n u - i t e m " , { p r o p s : [ " h r e f " , " a c t i v e " , " c o d e " ] , d a t a : f u n c t i o n ( ) { v a r e , t = t h i s . a c t i v e ; r e t u r n v o i d 0 = = = t & & ( e = " " , t = ( e = v o i d 0 ! = = w i n d o w . T E A . A C T I O N . d a t a . f i r s t M e n u I t e m ? w i n d o w . T E A . A C T I O N . d a t a . f i r s t M e n u I t e m : e ) = = t h i s . c o d e ) , { v H r e f : n u l l = = t h i s . h r e f ? " " : t h i s . h r e f , v A c t i v e : t } } , t e m p l a t e : ' \ t \ t < a : h r e f = " v H r e f " c l a s s = " i t e m r i g h t " s t y l e = " c o l o r : # 4 1 8 3 c 4 " : c l a s s = " { a c t i v e : v A c t i v e } " > [ < s l o t > < / s l o t > ] < / a > \ t \ t ' } ) , V u e . c o m p o n e n t ( " h e a l t h - c h e c k - c o n f i g - b o x " , { p r o p s : [ " v - h e a l t h - c h e c k - c o n f i g " ] , d a t a : f u n c t i o n ( ) { l e t t = t h i s . v H e a l t h C h e c k C o n f i g , i = " h t t p " , s = " " , n = " / " , o = " " ; i f ( n u l l = = t ) { t = { i s O n : ! 1 , u r l : " " , i n t e r v a l : { c o u n t : 6 0 , u n i t : " s e c o n d " } , s t a t u s C o d e s : [ 2 0 0 ] , t i m e o u t : { c o u n t : 1 0 , u n i t : " s e c o n d " } , c o u n t T r i e s : 3 , t r y D e l a y : { c o u n t : 1 0 0 , u n i t : " m s " } , a u t o D o w n : ! 0 , c o u n t U p : 1 , c o u n t D o w n : 3 , u s e r A g e n t : " " , o n l y B a s i c R e q u e s t : ! 0 , a c c e s s L o g I s O n : ! 0 } ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . c h a n g e U R L ( ) } , 5 0 0 ) } e l s e { t r y { l e t e = n e w U R L ( t . u r l ) ; i = e . p r o t o c o l . s u b s t r i n g ( 0 , e . p r o t o c o l . l e n g t h - 1 ) ; v a r a = ( o = " % 2 4 % 7 B h o s t % 7 D " = = ( o = e . h o s t ) ? " $ { h o s t } " : o ) . i n d e x O f ( " : " ) ; 0 < a & & ( o = o . s u b s t r i n g ( 0 , a ) ) , s = e . p o r t , n = e . p a t h n a m e , 0 < e . s e a r c h . l e n g t h & & ( n + = e . s e a r c h ) } c a t c h ( e ) { } n u l l = = t . s t a t u s C o d e s & & ( t . s t a t u s C o d e s = [ 2 0 0 ] ) , n u l l = = t . i n t e r v a l & & ( t . i n t e r v a l = { c o u n t : 6 0 , u n i t : " s e c o n d " } ) , n u l l = = t . t i m e o u t & & ( t . t i m e o u t = { c o u n t : 1 0 , u n i t : " s e c o n d " } ) , n u l l = = t . t r y D e l a y & & ( t . t r y D e l a y = { c o u n t : 1 0 0 , u n i t : " m s " } ) , ( n u l l = = t . c o u n t U p | | t . c o u n t U p < 1 ) & & ( t . c o u n t U p = 1 ) , ( n u l l = = t . c o u n t D o w n | | t . c o u n t D o w n < 1 ) & & ( t . c o u n t D o w n = 3 ) } r e t u r n { h e a l t h C h e c k : t , a d v a n c e d V i s i b l e : ! 1 , u r l P r o t o c o l : i , u r l H o s t : o , u r l P o r t : s , u r l R e q u e s t U R I : n , u r l I s E d i t i n g : 0 = = t . u r l . l e n g t h } } , w a t c h : { u r l R e q u e s t U R I : f u n c t i o n ( ) { 0 < t h i s . u r l R e q u e s t U R I . l e n g t h & & " / " ! = t h i s . u r l R e q u e s t U R I [ 0 ] & & ( t h i s . u r l R e q u e s t U R I = " / " + t h i s . u r l R e q u e s t U R I ) , t h i s . c h a n g e U R L ( ) } , u r l P o r t : f u n c t i o n ( e ) { l e t t = p a r s e I n t ( e ) ; i s N a N ( t ) ? t h i s . u r l P o r t = " " : t h i s . u r l P o r t = t . t o S t r i n g ( ) , t h i s . c h a n g e U R L ( ) } , u r l P r o t o c o l : f u n c t i o n ( ) { t h i s . c h a n g e U R L ( ) } , u r l H o s t : f u n c t i o n ( ) { t h i s . c h a n g e U R L ( ) } , " h e a l t h C h e c k . c o u n t T r i e s " : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) ; i s N a N ( e ) ? t h i s . h e a l t h C h e c k . c o u n t T r i e s = 0 : t h i s . h e a l t h C h e c k . c o u n t T r i e s = e } , " h e a l t h C h e c k . c o u n t U p " : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) ; i s N a N ( e ) ? t h i s . h e a l t h C h e c k . c o u n t U p = 0 : t h i s . h e a l t h C h e c k . c o u n t U p = e } , " h e a l t h C h e c k . c o u n t D o w n " : f u n c t i o n ( e ) { e = p a r s e I n t ( e ) ; i s N a N ( e ) ? t h i s . h e a l t h C h e c k . c o u n t D o w n = 0 : t h i s . h e a l t h C h e c k . c o u n t D o w n = e } } , m e t h o d s : { s h o w A d v a n c e d : f u n c t i o n ( ) { t h i s . a d v a n c e d V i s i b l e = ! t h i s . a d v a n c e d V i s i b l e } , c h a n g e U R L : f u n c t i o n ( ) { l e t e = t h i s . u r l H o s t ; 0 = = e . l e n g t h & & ( e = " $ { h o s t } " ) , t h i s . h e a l t h C h e c k . u r l = t h i s . u r l P r o t o c o l + " : / / " + e + ( 0 < t h i s . u r l P o r t . l e n g t h ? " : " + t h i s . u r l P o r t : " " ) + t h i s . u r l R e q u e s t U R I } , c h a n g e S t a t u s : f u n c t i o n ( e ) { t h i s . h e a l t h C h e c k . s t a t u s C o d e s = e . $ m a p ( f u n c t i o n ( e , t ) { t = p a r s e I n t ( t ) ; r e t u r n i s N a N ( t ) ? 0 : t } ) } , e d i t U R L : f u n c t i o n ( ) { t h i s . u r l I s E d i t i n g = ! t h i s . u r l I s E d i t i n g } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "healthCheckJSON" : value = "JSON.stringify(healthCheck)" / >
< table class = "ui table definition selectable" >
< tbody >
< tr >
2022-06-25 19:31:23 +08:00
< td class = "title" > 启用健康检查 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" value = "1" v - model = "healthCheck.isOn" / >
< label > < / l a b e l >
< / d i v >
2022-06-25 19:31:23 +08:00
< p class = "comment" > 通过访问节点上的网站URL来确定节点是否健康 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "healthCheck.isOn" >
< tr >
2022-05-19 17:14:19 +08:00
< td > 检测URL * < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div v - if = "healthCheck.url.length > 0" style = "margin-bottom: 1em" > < code - label > { { healthCheck . url } } < /code-label> <a href="" @click.prevent="editURL"><span class="small">修改 <i class="icon angle" :class="{down: !urlIsEditing, up: urlIsEditing}"></i > < / s p a n > < / a > < / d i v >
< div v - show = "urlIsEditing" >
< table class = "ui table" >
< tr >
< td class = "title" > 协议 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "urlProtocol" >
< option value = "http" > http : //</option>
< option value = "https" > https : //</option>
< / s e l e c t >
< / t d >
< / t r >
< tr >
< td > 域名 < / t d >
< td >
< input type = "text" v - model = "urlHost" / >
2022-06-25 19:31:23 +08:00
< p class = "comment" > 已经部署到当前集群的一个域名 ; 如果为空则使用节点IP作为域名 。 < span class = "red" v - if = "urlProtocol == 'https' && urlHost.length == 0" > 如果协议是https , 这里必须填写一个已经设置了SSL证书的域名 。 < / s p a n > < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
< td > 端口 < / t d >
< td >
< input type = "text" maxlength = "5" style = "width:5.4em" placeholder = "端口" v - model = "urlPort" / >
2022-05-19 17:14:19 +08:00
< p class = "comment" > 域名或者IP的端口 , 可选项 , 默认为80 / 443 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
< td > RequestURI < / t d >
2022-05-19 17:14:19 +08:00
< td > < input type = "text" v - model = "urlRequestURI" placeholder = "/" style = "width:20em" / >
< p class = "comment" > 请求的路径 , 可以带参数 , 可选项 。 < / p >
< / t d >
2021-11-22 12:08:53 +08:00
< / t r >
< / t a b l e >
< div class = "ui divider" > < / d i v >
2022-05-19 17:14:19 +08:00
< p class = "comment" v - if = "healthCheck.url.length > 0" > 拼接后的检测URL : < code - label > { { healthCheck . url } } < / c o d e - l a b e l > , 其 中 \ $ { h o s t } 指 的 是 域 名 。 < / p >
2021-11-22 12:08:53 +08:00
< / d i v >
< / t d >
< / t r >
< tr >
< td > 检测时间间隔 < / t d >
< td >
< time - duration - box : v - value = "healthCheck.interval" > < / t i m e - d u r a t i o n - b o x >
2022-05-19 17:14:19 +08:00
< p class = "comment" > 两次检查之间的间隔 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
2022-06-05 17:12:54 +08:00
< td > 自动下线 < / t d >
2021-11-22 12:08:53 +08:00
< td >
< div class = "ui checkbox" >
< input type = "checkbox" value = "1" v - model = "healthCheck.autoDown" / >
< label > < / l a b e l >
< / d i v >
< p class = "comment" > 选中后系统会根据健康检查的结果自动标记节点的上线 / 下线状态 , 并可能自动同步DNS设置 。 < / p >
< / t d >
< / t r >
< tr v - show = "healthCheck.autoDown" >
< td > 连续上线次数 < / t d >
< td >
< input type = "text" v - model = "healthCheck.countUp" style = "width:5em" maxlength = "6" / >
2022-05-19 17:14:19 +08:00
< p class = "comment" > 连续 { { healthCheck . countUp } } 次检查成功后自动恢复上线 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr v - show = "healthCheck.autoDown" >
< td > 连续下线次数 < / t d >
< td >
< input type = "text" v - model = "healthCheck.countDown" style = "width:5em" maxlength = "6" / >
2022-05-19 17:14:19 +08:00
< p class = "comment" > 连续 { { healthCheck . countDown } } 次检查失败后自动下线 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< / t b o d y >
< tbody v - show = "healthCheck.isOn" >
< tr >
< td colspan = "2" > < more - options - angle @ change = "showAdvanced" > < / m o r e - o p t i o n s - a n g l e > < / t d >
< / t r >
< / t b o d y >
< tbody v - show = "advancedVisible && healthCheck.isOn" >
< tr >
< td > 允许的状态码 < / t d >
< td >
< values - box : values = "healthCheck.statusCodes" maxlength = "3" @ change = "changeStatus" > < / v a l u e s - b o x >
2022-06-25 19:31:23 +08:00
< p class = "comment" > 允许检测URL返回的状态码列表 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
< td > 超时时间 < / t d >
< td >
< time - duration - box : v - value = "healthCheck.timeout" > < / t i m e - d u r a t i o n - b o x >
2022-06-25 19:31:23 +08:00
< p class = "comment" > 读取检测URL超时时间 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
< td > 连续尝试次数 < / t d >
< td >
< input type = "text" v - model = "healthCheck.countTries" style = "width: 5em" maxlength = "2" / >
2022-06-25 19:31:23 +08:00
< p class = "comment" > 如果读取检测URL失败后需要再次尝试的次数 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
< td > 每次尝试间隔 < / t d >
< td >
< time - duration - box : v - value = "healthCheck.tryDelay" > < / t i m e - d u r a t i o n - b o x >
2022-06-25 19:31:23 +08:00
< p class = "comment" > 如果读取检测URL失败后再次尝试时的间隔时间 。 < / p >
2021-11-22 12:08:53 +08:00
< / t d >
< / t r >
< tr >
< td > 终端信息 < em > ( User - Agent ) < / e m > < / t d >
< td >
< input type = "text" v - model = "healthCheck.userAgent" maxlength = "200" / >
< p class = "comment" > 发送到服务器的User - Agent值 , 不填写表示使用默认值 。 < / p >
< / t d >
< / t r >
< tr >
< td > 只基础请求 < / t d >
< td >
< checkbox v - model = "healthCheck.onlyBasicRequest" > < / c h e c k b o x >
< p class = "comment" > 只做基础的请求 , 不处理反向代理 ( 不检查源站 ) 、 WAF等 。 < / p >
< / t d >
< / t r >
2022-05-19 17:14:19 +08:00
< tr >
< td > 记录访问日志 < / t d >
< td >
< checkbox v - model = "healthCheck.accessLogIsOn" > < / c h e c k b o x >
2022-06-25 19:31:23 +08:00
< p class = "comment" > 记录健康检查的访问日志 。 < / p >
2022-05-19 17:14:19 +08:00
< / t d >
< / t r >
2021-11-22 12:08:53 +08:00
< / t b o d y >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< /div>`}),Vue.component("request-variables-describer",{data:function(){return{vars:[]}},methods:{update:function(e){this.vars=[];let i=this;e.replace(/ \ $ { . + ? } / g , function ( e ) { var t = i . findVar ( e ) ; if ( null == t ) return e ; i . vars . push ( t ) } ) } , findVar : function ( t ) { let i = null ; return window . REQUEST _VARIABLES . forEach ( function ( e ) { e . code == t && ( i = e ) } ) , i } } , template : ` <span>
2021-12-08 10:03:27 +08:00
< span v - for = "(v, index) in vars" > < code - label : title = "v.description" > { { v . code } } < / c o d e - l a b e l > - { { v . n a m e } } < s p a n v - i f = " i n d e x < v a r s . l e n g t h - 1 " > ; < / s p a n > < / s p a n >
2022-08-08 16:26:12 +08:00
< /span>`}),Vue.component("combo-box",{props:["name","title","placeholder","size","v-items","v-value","data-url","data-key","data-search","width"],mounted:function(){0<this.dataURL.length&&this.search("");var e=this.$refs.searchBox;null!=e&&(null!=(e=e.offsetWidth)&&0<e?this.$refs.menu.style.width=e+"px":0<this.styleWidth.length&&(this.$refs.menu.style.width=this.styleWidth))},data:function(){let e=this.vItems,i=(null!=e&&e instanceof Array||(e=[]),e=this.formatItems(e),null);if(null!=this.vValue){let t=this;e.forEach(function(e){e.value==t.vValue&&(i=e)})}let t=this.width,s=(null==t||0==t.length?t="11em":/ \ d + $ / . test ( t ) && ( t += "em" ) , "" ) ; return "string" == typeof this . dataUrl && 0 < this . dataUrl . length && ( s = this . dataUrl ) , { allItems : e , items : e . $copy ( ) , selectedItem : i , keyword : "" , visible : ! 1 , hideTimer : null , hoverIndex : 0 , styleWidth : t , isInitial : ! 0 , dataURL : s , urlRequestId : 0 } } , methods : { search : function ( e ) { var t = this . dataURL ; let i = this . dataKey , s = this , n = Math . random ( ) ; this . urlRequestId = n , Tea . action ( t ) . params ( { keyword : null == e ? "" : e } ) . post ( ) . success ( function ( t ) { if ( n == s . urlRequestId && null != t . data && "object" == typeof t . data [ i ] ) { let e = s . formatItems ( t . data [ i ] ) ; s . allItems = e , s . items = e . $copy ( ) , s . isInitial && ( s . isInitial = ! 1 , null != s . vValue && e . forEach ( function ( e ) { e . value == s . vValue && ( s . selectedItem = e ) } ) ) } } ) } , formatItems : function ( e ) { return e . forEach ( function ( e ) { null == e . value && ( e . value = e . id ) } ) , e } , reset : function ( ) { this . selectedItem = null , this . change ( ) , this . hoverIndex = 0 ; let e = this ; setTimeout ( function ( ) { e . $refs . searchBox && e . $refs . searchBox . focus ( ) } ) } , clear : function ( ) { this . selectedItem = null , this . change ( ) , this . hoverIndex = 0 } , changeKeyword : function ( ) { var e = 0 < this . dataURL . length && ( "on" == this . dataSearch || "true" == this . dataSearch ) ; this . hoverIndex = 0 ; let t = this . keyword ; 0 == t . length ? e ? this . search ( t ) : this . items = this . allItems . $copy ( ) : e ? this . search ( t ) : this . items = this . allItems . $copy ( ) . filter ( function ( e ) { return ! ! ( null != e . fullname && 0 < e . fullname . length && teaweb . match ( e . fullname , t ) ) || teaweb . match ( e . name , t ) } ) } , selectItem : function ( e ) { this . selectedItem = e , this . change ( ) , this . hoverIndex = 0 , this . keyword = "" , this . changeKeyword ( ) } , confirm : function ( ) { this . items . length > this . hoverIndex && this . selectItem ( this . items [ this . hoverIndex ] ) } , show : function ( ) { this . visible = ! 0 } , hide : function ( ) { let e = this ; this . hideTimer = setTimeout ( function ( ) { e . visible = ! 1 } , 500 ) } , downItem : function ( ) { this . hoverIndex ++ , this . hoverIndex > this . items . length - 1 && ( this . hoverIndex = 0 ) , this . focusItem ( ) } , upItem : function ( ) { this . hoverIndex -- , this . hoverIndex < 0 && ( this . hoverIndex = 0 ) , this . focusItem ( ) } , focusItem : function ( ) { if ( this . hoverIndex < this . items . length ) { this . $refs . itemRef [ this . hoverIndex ] . focus ( ) ; let e = this ; setTimeout ( function ( ) { e . $refs . searchBox . focus ( ) , null != e . hideTimer && ( clearTimeout ( e . hideTimer ) , e . hideTimer = null ) } ) } } , change : function ( ) { this . $emit ( "change" , this . selectedItem ) ; let e = this ; setTimeout ( function ( ) { null != e . $refs . selectedLabel && e . $refs . selectedLabel . focus ( ) } ) } , submitForm : function ( e ) { if ( "A" == e . target . tagName ) { let e = this . $refs . selectedLabel . parentNode ; for ( ; ; ) { if ( null == ( e = e . parentNode ) || "BODY" == e . tagName ) return ; if ( "FORM" == e . tagName ) { e . submit ( ) ; break } } } } , setDataURL : function ( e ) { this . dataURL = e } , reloadData : function ( ) { this . search ( "" ) } } , template : ` <div style="display: inline; z-index: 10; background: white" class="combo-box">
2022-01-11 12:04:03 +08:00
<!-- 搜索框 -- >
< div v - if = "selectedItem == null" >
2022-06-14 17:38:50 +08:00
< input type = "text" v - model = "keyword" : placeholder = "placeholder" : size = "size" : style = "{'width': styleWidth}" @ input = "changeKeyword" @ focus = "show" @ blur = "hide" @ keyup . enter = "confirm()" @ keypress . enter . prevent = "1" ref = "searchBox" @ keyup . down = "downItem" @ keyup . up = "upItem" / >
2022-01-11 12:04:03 +08:00
< / d i v >
<!-- 当前选中 -- >
< div v - if = "selectedItem != null" >
< input type = "hidden" : name = "name" : value = "selectedItem.value" / >
2022-06-29 17:00:05 +08:00
< a href = "" class = "ui label basic" style = "line-height: 1.4; font-weight: normal; font-size: 1em" ref = "selectedLabel" @ click . prevent = "submitForm" > < span > < span v - if = "title != null && title.length > 0" > { { title } } : < / s p a n > { { s e l e c t e d I t e m . n a m e } } < / s p a n >
2022-01-11 15:28:50 +08:00
< span title = "清除" @ click . prevent = "reset" > < i class = "icon remove small" > < / i > < / s p a n >
< / a >
2022-01-11 12:04:03 +08:00
< / d i v >
<!-- 菜单 -- >
2022-06-14 17:38:50 +08:00
< div v - show = "selectedItem == null && items.length > 0 && visible" >
< div class = "ui menu vertical small narrow-scrollbar" ref = "menu" >
< a href = "" v - for = "(item, index) in items" ref = "itemRef" class = "item" : class = "{active: index == hoverIndex, blue: index == hoverIndex}" @ click . prevent = "selectItem(item)" style = "line-height: 1.4" >
< span v - if = "item.fullname != null && item.fullname.length > 0" > { { item . fullname } } < / s p a n >
< span v - else > { { item . name } } < / s p a n >
< / a >
2022-01-11 12:04:03 +08:00
< / d i v >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " t i m e - d u r a t i o n - b o x " , { p r o p s : [ " v - n a m e " , " v - v a l u e " , " v - c o u n t " , " v - u n i t " ] , m o u n t e d : f u n c t i o n ( ) { t h i s . c h a n g e ( ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v V a l u e ; r e t u r n " n u m b e r " ! = t y p e o f ( e = n u l l = = e ? { c o u n t : t h i s . v C o u n t , u n i t : t h i s . v U n i t } : e ) . c o u n t & & ( e . c o u n t = - 1 ) , { d u r a t i o n : e , c o u n t S t r i n g : 0 < = e . c o u n t ? e . c o u n t . t o S t r i n g ( ) : " " } } , w a t c h : { c o u n t S t r i n g : f u n c t i o n ( e ) { v a r e = e . t r i m ( ) ; 0 = = e . l e n g t h ? t h i s . d u r a t i o n . c o u n t = - 1 : ( e = p a r s e I n t ( e ) , i s N a N ( e ) | | ( t h i s . d u r a t i o n . c o u n t = e ) , t h i s . c h a n g e ( ) ) } } , m e t h o d s : { c h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . d u r a t i o n ) } } , t e m p l a t e : ` < d i v c l a s s = " u i f i e l d s i n l i n e " s t y l e = " p a d d i n g - b o t t o m : 0 ; m a r g i n - b o t t o m : 0 " >
2021-11-22 12:08:53 +08:00
< input type = "hidden" : name = "vName" : value = "JSON.stringify(duration)" / >
< div class = "ui field" >
< input type = "text" v - model = "countString" maxlength = "11" size = "11" @ keypress . enter . prevent = "1" / >
< / d i v >
< div class = "ui field" >
< select class = "ui dropdown" v - model = "duration.unit" @ change = "change" >
< option value = "ms" > 毫秒 < / o p t i o n >
< option value = "second" > 秒 < / o p t i o n >
< option value = "minute" > 分钟 < / o p t i o n >
< option value = "hour" > 小时 < / o p t i o n >
< option value = "day" > 天 < / o p t i o n >
2021-12-08 19:13:54 +08:00
< option value = "week" > 周 < / o p t i o n >
2021-11-22 12:08:53 +08:00
< / s e l e c t >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o t - f o u n d - b o x " , { p r o p s : [ " m e s s a g e " ] , t e m p l a t e : ` < d i v s t y l e = " t e x t - a l i g n : c e n t e r ; m a r g i n - t o p : 5 e m ; " >
2021-11-22 12:08:53 +08:00
< div style = "font-size: 2em; margin-bottom: 1em" > < i class = "icon exclamation triangle large grey" > < / i > < / d i v >
< p class = "comment" > { { message } } < slot > < / s l o t > < / p >
2022-04-08 21:24:54 +08:00
< /div>`}),Vue.component("warning-message",{template:'<div class="ui icon message warning"><i class="icon warning circle"></i > < div class = "content" > < slot > < / s l o t > < / d i v > < / d i v > ' } ) ; l e t c h e c k b o x I d = 0 , r a d i o I d = ( V u e . c o m p o n e n t ( " c h e c k b o x " , { p r o p s : [ " n a m e " , " v a l u e " , " v - v a l u e " , " i d " , " c h e c k e d " ] , d a t a : f u n c t i o n ( ) { c h e c k b o x I d + + ; l e t e = t h i s . i d , t = ( n u l l = = e & & ( e = " c h e c k b o x " + c h e c k b o x I d ) , t h i s . v V a l u e ) , i = ( n u l l = = t & & ( t = " 1 " ) , t h i s . v a l u e ) ; r e t u r n n u l l = = i & & " c h e c k e d " = = t h i s . c h e c k e d & & ( i = t ) , { e l e m e n t I d : e , e l e m e n t V a l u e : t , n e w V a l u e : i } } , m e t h o d s : { c h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " i n p u t " , t h i s . n e w V a l u e ) } , c h e c k : f u n c t i o n ( ) { t h i s . n e w V a l u e = t h i s . e l e m e n t V a l u e } , u n c h e c k : f u n c t i o n ( ) { t h i s . n e w V a l u e = " " } , i s C h e c k e d : f u n c t i o n ( ) { r e t u r n t h i s . n e w V a l u e = = t h i s . e l e m e n t V a l u e } } , w a t c h : { v a l u e : f u n c t i o n ( e ) { " b o o l e a n " = = t y p e o f e & & ( t h i s . n e w V a l u e = e ) } } , t e m p l a t e : ` < d i v c l a s s = " u i c h e c k b o x " >
2021-11-22 12:08:53 +08:00
< input type = "checkbox" : name = "name" : value = "elementValue" : id = "elementId" @ change = "change" v - model = "newValue" / >
< label : for = "elementId" style = "font-size: 0.85em!important;" > < slot > < / s l o t > < / l a b e l >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n e t w o r k - a d d r e s s e s - v i e w " , { p r o p s : [ " v - a d d r e s s e s " ] , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div class = "ui label tiny basic" v - if = "vAddresses != null" v - for = "addr in vAddresses" >
{ { addr . protocol } } : //<span v-if="addr.host.length > 0">{{addr.host.quoteIP()}}</span><span v-else>*</span>:{{addr.portRange}}
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " s i z e - c a p a c i t y - v i e w " , { p r o p s : [ " v - d e f a u l t - t e x t " , " v - v a l u e " ] , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< span v - if = "vValue != null && vValue.count > 0" > { { vValue . count } } { { vValue . unit . toUpperCase ( ) } } < / s p a n >
< span v - else > { { vDefaultText } } < / s p a n >
2022-04-08 21:24:54 +08:00
< /div>`}),Vue.component("tip-message-box",{props:["code"],mounted:function(){let t=this;Tea.action("/ui / showTip ").params({code:this.code}).success(function(e){t.visible=e.data.visible}).post()},data:function(){return{visible:!1}},methods:{close:function(){this.visible=!1,Tea.action(" / ui / hideTip ").params({code:this.code}).post()}},template:`<div class=" ui icon message " v-if=" visible " >
2021-11-22 12:08:53 +08:00
< i class = "icon info circle" > < / i >
< i class = "close icon" title = "取消" @ click . prevent = "close" style = "margin-top: 1em" > < / i >
< div class = "content" >
< slot > < / s l o t >
< / d i v >
2022-05-19 17:14:19 +08:00
< /div>`}),Vue.component("digit-input",{props:["value","maxlength","size","min","max","required","placeholder"],mounted:function(){let e=this;setTimeout(function(){e.check()})},data:function(){let e=this.maxlength,t=(null==e&&(e=20),this.size);return null==t&&(t=6),{realValue:this.value,realMaxLength:e,realSize:t,isValid:!0}},watch:{realValue:function(e){this.notifyChange()}},methods:{notifyChange:function(){let e=parseInt(this.realValue.toString(),10);isNaN(e)&&(e=0),this.check(),this.$emit("input",e)},check:function(){var e;null!=this.realValue&&(e=this.realValue.toString(),/ ^ \ d + $ / . test ( e ) ? ( e = parseInt ( e , 10 ) , isNaN ( e ) ? this . isValid = ! 1 : this . required ? this . isValid = ( null == this . min || this . min <= e ) && ( null == this . max || this . max >= e ) : this . isValid = 0 == e || ( null == this . min || this . min <= e ) && ( null == this . max || this . max >= e ) ) : this . isValid = ! 1 ) } } , template : '<input type="text" v-model="realValue" :maxlength="realMaxLength" :size="realSize" :class="{error: !this.isValid}" :placeholder="placeholder"/>' } ) , Vue . component ( "keyword" , { props : [ "v-word" ] , data : function ( ) { let e = this . vWord ; e = null == e ? "" : ( e = ( e = ( e = ( e = ( e = ( e = ( e = ( e = ( e = e . replace ( /\)/g , "\\)" ) ) . replace ( /\(/g , "\\(" ) ) . replace ( /\+/g , "\\+" ) ) . replace ( /\^/g , "\\^" ) ) . replace ( /\$/g , "\\$" ) ) . replace ( /\?/ , "\\?" ) ) . replace ( /\*/ , "\\*" ) ) . replace ( /\[/ , "\\[" ) ) . replace ( /{/ , "\\{" ) ) . replace ( /\./ , "\\." ) ; let t = this . $slots . default [ 0 ] . text ; if ( 0 < e . length ) { let i = this , s = [ ] , n = 0 ; t = t . replaceAll ( new RegExp ( "(" + e + ")" , "ig" ) , function ( e ) { n ++ ; var e = '<span style="border: 1px #ccc dashed; color: #ef4d58">' + i . encodeHTML ( e ) + "</span>" , t = "$TMP__KEY__" + n . toString ( ) + "$" ; return s . push ( [ t , e ] ) , t } ) , t = this . encodeHTML ( t ) , s . forEach ( function ( e ) { t = t . replace ( e [ 0 ] , e [ 1 ] ) } ) } else t = this . encodeHTML ( t ) ; return { word : e , text : t } } , methods : { encodeHTML : function ( e ) { return e = ( e = ( e = ( e = e . replace ( /&/g , "&" ) ) . replace ( /</g , "<" ) ) . replace ( />/g , ">" ) ) . replace ( /"/g , """ ) } } , template : '<span><span style="display: none"><slot></slot></span><span v-html="text"></span></span>' } ) , Vue . component ( "node-log-row" , { props : [ "v-log" , "v-keyword" ] , data : function ( ) { return { log : this . vLog , keyword : this . vKeyword } } , template : ` <div>
2021-11-22 12:08:53 +08:00
< pre class = "log-box" style = "margin: 0; padding: 0" > < span : class = "{red:log.level == 'error', orange:log.level == 'warning', green: log.level == 'success'}" > < span v - if = "!log.isToday" > [ { { log . createdTime } } ] < / s p a n > < s t r o n g v - i f = " l o g . i s T o d a y " > [ { { l o g . c r e a t e d T i m e } } ] < / s t r o n g > < k e y w o r d : v - w o r d = " k e y w o r d " > [ { { l o g . t a g } } ] { { l o g . d e s c r i p t i o n } } < / k e y w o r d > < / s p a n > & n b s p ; < s p a n v - i f = " l o g . c o u n t > 1 " c l a s s = " u i l a b e l t i n y " : c l a s s = " { r e d : l o g . l e v e l = = ' e r r o r ' , o r a n g e : l o g . l e v e l = = ' w a r n i n g ' } " > 共 { { l o g . c o u n t } } 条 < / s p a n > < s p a n v - i f = " l o g . s e r v e r ! = n u l l & & l o g . s e r v e r . i d > 0 " > < a : h r e f = " ' / s e r v e r s / s e r v e r ? s e r v e r I d = ' + l o g . s e r v e r . i d " c l a s s = " u i l a b e l t i n y b a s i c " > { { l o g . s e r v e r . n a m e } } < / a > < / s p a n > < / p r e >
2022-04-08 21:24:54 +08:00
< /div>`}),Vue.component("provinces-selector",{props:["v-provinces"],data:function(){let e=this.vProvinces;var t=(e=null==e?[]:e).$map(function(e,t){return t.id});return{provinces:e,provinceIds:t}},methods:{add:function(){let e=this.provinceIds.map(function(e){return e.toString()}),t=this;teaweb.popup("/ui / selectProvincesPopup ? provinceIds = "+e.join(" , "),{width:" 48 em ",height:" 23 em " , callback : function ( e ) { t . provinces = e . data . provinces , t . change ( ) } } ) } , remove : function ( e ) { this . provinces . $remove ( e ) , this . change ( ) } , change : function ( ) { this . provinceIds = this . provinces . $map ( function ( e , t ) { return t . id } ) } } , template : ` <div>
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "provinceIdsJSON" : value = "JSON.stringify(provinceIds)" / >
< div v - if = "provinces.length > 0" style = "margin-bottom: 0.5em" >
< div v - for = "(province, index) in provinces" class = "ui label tiny basic" > { { province . name } } < a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon remove" > < / i > < / a > < / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " c s r f - t o k e n " , { c r e a t e d : f u n c t i o n ( ) { t h i s . r e f r e s h T o k e n ( ) } , m o u n t e d : f u n c t i o n ( ) { l e t e = t h i s ; t h i s . $ r e f s . t o k e n . f o r m . a d d E v e n t L i s t e n e r ( " s u b m i t " , f u n c t i o n ( ) { e . r e f r e s h T o k e n ( ) } ) , s e t I n t e r v a l ( f u n c t i o n ( ) { e . r e f r e s h T o k e n ( ) } , 6 e 5 ) } , d a t a : f u n c t i o n ( ) { r e t u r n { t o k e n : " " } } , m e t h o d s : { r e f r e s h T o k e n : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / c s r f / t o k e n " ) . g e t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . t o k e n = e . d a t a . t o k e n } ) } } , t e m p l a t e : ' < i n p u t t y p e = " h i d d e n " n a m e = " c s r f T o k e n " : v a l u e = " t o k e n " r e f = " t o k e n " / > ' } ) , V u e . c o m p o n e n t ( " l a b e l e d - i n p u t " , { p r o p s : [ " n a m e " , " s i z e " , " m a x l e n g t h " , " l a b e l " , " v a l u e " ] , t e m p l a t e : ' < d i v c l a s s = " u i i n p u t r i g h t l a b e l e d " > \ t < i n p u t t y p e = " t e x t " : n a m e = " n a m e " : s i z e = " s i z e " : m a x l e n g t h = " m a x l e n g t h " : v a l u e = " v a l u e " / > \ t < s p a n c l a s s = " u i l a b e l " > { { l a b e l } } < / s p a n > < / d i v > ' } ) , 0 ) , s o u r c e C o d e B o x I n d e x = ( V u e . c o m p o n e n t ( " r a d i o " , { p r o p s : [ " n a m e " , " v a l u e " , " v - v a l u e " , " i d " ] , d a t a : f u n c t i o n ( ) { r a d i o I d + + ; l e t e = t h i s . i d ; r e t u r n { e l e m e n t I d : e = n u l l = = e ? " r a d i o " + r a d i o I d : e } } , m e t h o d s : { c h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " i n p u t " , t h i s . v V a l u e ) } } , t e m p l a t e : ` < d i v c l a s s = " u i c h e c k b o x r a d i o " >
2021-11-22 12:08:53 +08:00
< input type = "radio" : name = "name" : value = "vValue" : id = "elementId" @ change = "change" : checked = "(vValue == value)" / >
< label : for = "elementId" > < slot > < / s l o t > < / l a b e l >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " c o p y - t o - c l i p b o a r d " , { p r o p s : [ " v - t a r g e t " ] , c r e a t e d : f u n c t i o n ( ) { i f ( " u n d e f i n e d " = = t y p e o f C l i p b o a r d J S ) { l e t e = d o c u m e n t . c r e a t e E l e m e n t ( " s c r i p t " ) ; e . s e t A t t r i b u t e ( " s r c " , " / j s / c l i p b o a r d . m i n . j s " ) , d o c u m e n t . h e a d . a p p e n d C h i l d ( e ) } } , m e t h o d s : { c o p y : f u n c t i o n ( ) { n e w C l i p b o a r d J S ( " [ d a t a - c l i p b o a r d - t a r g e t ] " ) , t e a w e b . s u c c e s s T o a s t ( " 已 复 制 到 剪 切 板 " ) } } , t e m p l a t e : ` < a h r e f = " " t i t l e = " 拷 贝 到 剪 切 板 " : d a t a - c l i p b o a r d - t a r g e t = " ' # ' + v T a r g e t " @ c l i c k . p r e v e n t = " c o p y " > < i c l a s s = " u i i c o n c o p y s m a l l " > < / i > < / e m > < / a > ` } ) , V u e . c o m p o n e n t ( " n o d e - r o l e - n a m e " , { p r o p s : [ " v - r o l e " ] , d a t a : f u n c t i o n ( ) { l e t e = " " ; s w i t c h ( t h i s . v R o l e ) { c a s e " n o d e " : e = " 边 缘 节 点 " ; b r e a k ; c a s e " m o n i t o r " : e = " 监 控 节 点 " ; b r e a k ; c a s e " a p i " : e = " A P I 节 点 " ; b r e a k ; c a s e " u s e r " : e = " 用 户 平 台 " ; b r e a k ; c a s e " a d m i n " : e = " 管 理 平 台 " ; b r e a k ; c a s e " d a t a b a s e " : e = " 数 据 库 节 点 " ; b r e a k ; c a s e " d n s " : e = " D N S 节 点 " ; b r e a k ; c a s e " r e p o r t " : e = " 区 域 监 控 终 端 " } r e t u r n { r o l e N a m e : e } } , t e m p l a t e : " < s p a n > { { r o l e N a m e } } < / s p a n > " } ) , 0 ) ; V u e . c o m p o n e n t ( " s o u r c e - c o d e - b o x " , { p r o p s : [ " n a m e " , " t y p e " , " i d " , " r e a d - o n l y " , " w i d t h " , " h e i g h t " , " f o c u s " ] , m o u n t e d : f u n c t i o n ( ) { l e t e = t h i s . r e a d O n l y ; " b o o l e a n " ! = t y p e o f e & & ( e = ! 0 ) ; v a r t = d o c u m e n t . g e t E l e m e n t B y I d ( " s o u r c e - c o d e - b o x - " + t h i s . i n d e x ) , i = d o c u m e n t . g e t E l e m e n t B y I d ( t h i s . v a l u e B o x I d ) ; l e t s = " " ; n u l l ! = i . t e x t C o n t e n t ? s = i . t e x t C o n t e n t : n u l l ! = i . i n n e r T e x t & & ( s = i . i n n e r T e x t ) , t h i s . c r e a t e E d i t o r ( t , s , e ) } , d a t a : f u n c t i o n ( ) { v a r e = s o u r c e C o d e B o x I n d e x + + ; l e t t = " s o u r c e - c o d e - b o x - v a l u e - " + s o u r c e C o d e B o x I n d e x ; r e t u r n { i n d e x : e , v a l u e B o x I d : t = n u l l ! = t h i s . i d ? t h i s . i d : t } } , m e t h o d s : { c r e a t e E d i t o r : f u n c t i o n ( e , t , i ) { l e t s = C o d e M i r r o r . f r o m T e x t A r e a ( e , { t h e m e : " i d e a " , l i n e N u m b e r s : ! 0 , v a l u e : " " , r e a d O n l y : i , s h o w C u r s o r W h e n S e l e c t i n g : ! 0 , h e i g h t : " a u t o " , v i e w p o r t M a r g i n : 1 / 0 , l i n e W r a p p i n g : ! 0 , h i g h l i g h t F o r m a t t i n g : ! 1 , i n d e n t U n i t : 4 , i n d e n t W i t h T a b s : ! 0 } ) , n = t h i s , o = ( s . o n ( " c h a n g e " , f u n c t i o n ( ) { n . c h a n g e ( s . g e t V a l u e ( ) ) } ) , s . s e t V a l u e ( t ) , t h i s . f o c u s & & s . f o c u s ( ) , t h i s . w i d t h ) , a = t h i s . h e i g h t ; n u l l ! = o & & n u l l ! = a ? ( o = p a r s e I n t ( o ) , a = p a r s e I n t ( a ) , i s N a N ( o ) | | i s N a N ( a ) | | ( o < = 0 & & ( o = e . p a r e n t N o d e . o f f s e t W i d t h ) , s . s e t S i z e ( o , a ) ) ) : n u l l ! = a & & ( a = p a r s e I n t ( a ) , i s N a N ( a ) | | s . s e t S i z e ( " 1 0 0 % " , a ) ) ; i = C o d e M i r r o r . f i n d M o d e B y M I M E ( t h i s . t y p e ) ; n u l l ! = i & & ( s . s e t O p t i o n ( " m o d e " , i . m o d e ) , C o d e M i r r o r . m o d e U R L = " / c o d e m i r r o r / m o d e / % N / % N . j s " , C o d e M i r r o r . a u t o L o a d M o d e ( s , i . m o d e ) ) } , c h a n g e : f u n c t i o n ( e ) { t h i s . $ e m i t ( " c h a n g e " , e ) } } , t e m p l a t e : ` < d i v c l a s s = " s o u r c e - c o d e - b o x " >
2021-11-22 12:08:53 +08:00
< div style = "display: none" : id = "valueBoxId" > < slot > < / s l o t > < / d i v >
< textarea : id = "'source-code-box-' + index" : name = "name" > < / t e x t a r e a >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " s i z e - c a p a c i t y - b o x " , { p r o p s : [ " v - n a m e " , " v - v a l u e " , " v - c o u n t " , " v - u n i t " , " s i z e " , " m a x l e n g t h " , " v - s u p p o r t e d - u n i t s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v V a l u e , t = ( " n u m b e r " ! = t y p e o f ( e = n u l l = = e ? { c o u n t : t h i s . v C o u n t , u n i t : t h i s . v U n i t } : e ) . c o u n t & & ( e . c o u n t = - 1 ) , t h i s . s i z e ) , i = ( n u l l = = t & & ( t = 6 ) , t h i s . m a x l e n g t h ) , s = ( n u l l = = i & & ( i = 1 0 ) , t h i s . v S u p p o r t e d U n i t s ) ; r e t u r n n u l l = = s & & ( s = [ ] ) , { c a p a c i t y : e , c o u n t S t r i n g : 0 < = e . c o u n t ? e . c o u n t . t o S t r i n g ( ) : " " , v S i z e : t , v M a x l e n g t h : i , s u p p o r t e d U n i t s : s } } , w a t c h : { c o u n t S t r i n g : f u n c t i o n ( e ) { e = e . t r i m ( ) ; i f ( 0 = = e . l e n g t h ) r e t u r n t h i s . c a p a c i t y . c o u n t = - 1 , v o i d t h i s . c h a n g e ( ) ; e = p a r s e I n t ( e ) ; i s N a N ( e ) | | ( t h i s . c a p a c i t y . c o u n t = e ) , t h i s . c h a n g e ( ) } } , m e t h o d s : { c h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . c a p a c i t y ) } } , t e m p l a t e : ` < d i v c l a s s = " u i f i e l d s i n l i n e " >
2021-11-22 12:08:53 +08:00
< input type = "hidden" : name = "vName" : value = "JSON.stringify(capacity)" / >
< div class = "ui field" >
< input type = "text" v - model = "countString" : maxlength = "vMaxlength" : size = "vSize" / >
< / d i v >
< div class = "ui field" >
< select class = "ui dropdown" v - model = "capacity.unit" @ change = "change" >
2021-12-12 11:46:09 +08:00
< option value = "byte" v - if = "supportedUnits.length == 0 || supportedUnits.$contains('byte')" > 字节 < / o p t i o n >
< option value = "kb" v - if = "supportedUnits.length == 0 || supportedUnits.$contains('kb')" > KB < / o p t i o n >
< option value = "mb" v - if = "supportedUnits.length == 0 || supportedUnits.$contains('mb')" > MB < / o p t i o n >
< option value = "gb" v - if = "supportedUnits.length == 0 || supportedUnits.$contains('gb')" > GB < / o p t i o n >
< option value = "tb" v - if = "supportedUnits.length == 0 || supportedUnits.$contains('tb')" > TB < / o p t i o n >
< option value = "pb" v - if = "supportedUnits.length == 0 || supportedUnits.$contains('pb')" > PB < / o p t i o n >
< option value = "eb" v - if = "supportedUnits.length == 0 || supportedUnits.$contains('eb')" > EB < / o p t i o n >
2021-11-22 12:08:53 +08:00
< / s e l e c t >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " i n n e r - m e n u " , { t e m p l a t e : `
2021-11-22 12:08:53 +08:00
< div class = "second-menu" style = "width:80%;position: absolute;top:-8px;right:1em" >
< div class = "ui menu text blue small" >
< slot > < / s l o t >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " d a t e p i c k e r " , { p r o p s : [ " v - n a m e " , " v - v a l u e " , " v - b o t t o m - l e f t " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . d a t e p i c k e r ( t h i s . $ r e f s . d a y I n p u t , f u n c t i o n ( e ) { t . d a y = e , t . c h a n g e ( ) } , ! ! t h i s . v B o t t o m L e f t ) } , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v N a m e , t = ( n u l l = = e & & ( e = " d a y " ) , t h i s . v V a l u e ) ; r e t u r n n u l l = = t & & ( t = " " ) , { n a m e : e , d a y : t } } , m e t h o d s : { c h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . d a y ) } } , t e m p l a t e : ` < d i v s t y l e = " d i s p l a y : i n l i n e - b l o c k " >
2021-11-22 12:08:53 +08:00
< input type = "text" : name = "name" v - model = "day" placeholder = "YYYY-MM-DD" style = "width:8.6em" maxlength = "10" @ input = "change" ref = "dayInput" autocomplete = "off" / >
2022-04-17 16:40:29 +08:00
< /div>`}),Vue.component("sort-arrow",{props:["name"],data:function(){let e=window.location.toString(),n="",o=[];if(null!=window.location.search&&0<window.location.search.length){let e=window.location.search.substring(1),t=e.split("&"),s=this;t.forEach(function(e){var t,i=e.indexOf("=");0<i?(t=e.substring(0,i),i=e.substring(i+1),t==s.name?n=i:"page"!=t&&"asc"!=i&&"desc"!=i&&o.push(e)):o.push(e)})}"asc"!=n&&"desc"==n?o.push(this.name+"=asc"):o.push(this.name+"=desc");var t=e.indexOf("?");return e=0<t?e.substring(0,t)+"?"+o.join("&"):e+"?"+o.join("&"),{order:n,url:e}},template:`<a :href="url" title="排序"> <i class="ui icon long arrow small" :class="{down: order == 'asc', up: order == 'desc', 'down grey': order == '' || order == null}"></i > < / a > ` } ) , V u e . c o m p o n e n t ( " u s e r - l i n k " , { p r o p s : [ " v - u s e r " , " v - k e y w o r d " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v U s e r ; r e t u r n { u s e r : e = n u l l = = e ? { i d : 0 , u s e r n a m e : " " , f u l l n a m e : " " } : e } } , t e m p l a t e : ` < d i v s t y l e = " d i s p l a y : i n l i n e - b l o c k " >
2021-11-22 12:08:53 +08:00
< span v - if = "user.id > 0" > < keyword : v - word = "vKeyword" > { { user . fullname } } < / k e y w o r d > < s p a n c l a s s = " s m a l l g r e y " > ( < k e y w o r d : v - w o r d = " v K e y w o r d " > { { u s e r . u s e r n a m e } } < / k e y w o r d > ) < / s p a n > < / s p a n >
< span v - else class = "disabled" > [ 已删除 ] < / s p a n >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " r e p o r t - n o d e - g r o u p s - s e l e c t o r " , { p r o p s : [ " v - g r o u p - i d s " ] , m o u n t e d : f u n c t i o n ( ) { l e t t = t h i s ; T e a . a c t i o n ( " / c l u s t e r s / m o n i t o r s / g r o u p s / o p t i o n s " ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . g r o u p s = e . d a t a . g r o u p s . m a p ( f u n c t i o n ( e ) { r e t u r n e . i s C h e c k e d = t . g r o u p I d s . $ c o n t a i n s ( e . i d ) , e } ) , t . i s L o a d e d = ! 0 } ) } , d a t a : f u n c t i o n ( ) { v a r e = t h i s . v G r o u p I d s ; r e t u r n { g r o u p s : [ ] , g r o u p I d s : e = n u l l = = e ? [ ] : e , i s L o a d e d : ! 1 , a l l G r o u p s : 0 = = e . l e n g t h } } , m e t h o d s : { c h e c k : f u n c t i o n ( e ) { e . i s C h e c k e d = ! e . i s C h e c k e d , t h i s . g r o u p I d s = [ ] ; l e t t = t h i s ; t h i s . g r o u p s . f o r E a c h ( f u n c t i o n ( e ) { e . i s C h e c k e d & & t . g r o u p I d s . p u s h ( e . i d ) } ) , t h i s . c h a n g e ( ) } , c h a n g e : f u n c t i o n ( ) { l e t t = t h i s , s = [ ] ; t h i s . g r o u p I d s . f o r E a c h ( f u n c t i o n ( i ) { v a r e = t . g r o u p s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . i d = = i } ) ; n u l l ! = e & & s . p u s h ( { i d : e . i d , n a m e : e . n a m e } ) } ) , t h i s . $ e m i t ( " c h a n g e " , s ) } } , w a t c h : { a l l G r o u p s : f u n c t i o n ( e ) { e & & ( t h i s . g r o u p I d s = [ ] , t h i s . g r o u p s . f o r E a c h ( f u n c t i o n ( e ) { e . i s C h e c k e d = ! 1 } ) ) , t h i s . c h a n g e ( ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "reportNodeGroupIdsJSON" : value = "JSON.stringify(groupIds)" / >
< span class = "disabled" v - if = "isLoaded && groups.length == 0" > 还没有分组 。 < / s p a n >
< div v - if = "groups.length > 0" >
< div >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "allGroups" id = "all-group" / >
< label for = "all-group" > 全部分组 < / l a b e l >
< / d i v >
< div class = "ui divider" v - if = "!allGroups" > < / d i v >
< / d i v >
< div v - show = "!allGroups" >
< div v - for = "group in groups" : key = "group.id" style = "float: left; width: 7.6em; margin-bottom: 0.5em" >
< div class = "ui checkbox" >
< input type = "checkbox" v - model = "group.isChecked" value = "1" : id = "'report-node-group-' + group.id" @ click . prevent = "check(group)" / >
< label : for = "'report-node-group-' + group.id" > { { group . name } } < / l a b e l >
< / d i v >
< / d i v >
< / d i v >
< / d i v >
2022-08-08 16:26:12 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " f i n a n c e - u s e r - s e l e c t o r " , { p r o p s : [ " v - u s e r - i d " ] , d a t a : f u n c t i o n ( ) { r e t u r n { } } , m e t h o d s : { c h a n g e : f u n c t i o n ( e ) { t h i s . $ e m i t ( " c h a n g e " , e ) } } , t e m p l a t e : ` < d i v >
< user - selector : v - user - id = "vUserId" data - url = "/finance/users/options" @ change = "change" > < / u s e r - s e l e c t o r >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - l o g i n - s u g g e s t - p o r t s " , { d a t a : f u n c t i o n ( ) { r e t u r n { p o r t s : [ ] , a v a i l a b l e P o r t s : [ ] , a u t o S e l e c t e d : ! 1 , i s L o a d i n g : ! 1 } } , m e t h o d s : { r e l o a d : f u n c t i o n ( e ) { l e t t = t h i s ; t h i s . a u t o S e l e c t e d = ! 1 , t h i s . i s L o a d i n g = ! 0 , T e a . a c t i o n ( " / c l u s t e r s / c l u s t e r / s u g g e s t L o g i n P o r t s " ) . p a r a m s ( { h o s t : e } ) . s u c c e s s ( f u n c t i o n ( e ) { n u l l ! = e . d a t a . a v a i l a b l e P o r t s & & ( t . a v a i l a b l e P o r t s = e . d a t a . a v a i l a b l e P o r t s , 0 < t . a v a i l a b l e P o r t s . l e n g t h & & ( t . a u t o S e l e c t P o r t ( t . a v a i l a b l e P o r t s [ 0 ] ) , t . a u t o S e l e c t e d = ! 0 ) ) , n u l l ! = e . d a t a . p o r t s & & ( t . p o r t s = e . d a t a . p o r t s , 0 < t . p o r t s . l e n g t h & & ! t . a u t o S e l e c t e d & & ( t . a u t o S e l e c t P o r t ( t . p o r t s [ 0 ] ) , t . a u t o S e l e c t e d = ! 0 ) ) } ) . d o n e ( f u n c t i o n ( ) { t . i s L o a d i n g = ! 1 } ) . p o s t ( ) } , s e l e c t P o r t : f u n c t i o n ( e ) { t h i s . $ e m i t ( " s e l e c t " , e ) } , a u t o S e l e c t P o r t : f u n c t i o n ( e ) { t h i s . $ e m i t ( " a u t o - s e l e c t " , e ) } } , t e m p l a t e : ` < s p a n >
2021-11-22 12:08:53 +08:00
< span v - if = "isLoading" > 正在检查端口 ... < / s p a n >
< span v - if = "availablePorts.length > 0" >
可能端口 : < a href = "" v - for = "port in availablePorts" @ click . prevent = "selectPort(port)" class = "ui label tiny basic blue" style = "border: 1px #2185d0 dashed; font-weight: normal" > { { port } } < / a >
& nbsp ; & nbsp ;
< / s p a n >
< span v - if = "ports.length > 0" >
常用端口 : < a href = "" v - for = "port in ports" @ click . prevent = "selectPort(port)" class = "ui label tiny basic blue" style = "border: 1px #2185d0 dashed; font-weight: normal" > { { port } } < / a >
< / s p a n >
< span v - if = "ports.length == 0" > 常用端口有22等 。 < / s p a n >
< span v - if = "ports.length > 0" class = "grey small" > ( 可以点击要使用的端口 ) < / s p a n >
2022-04-08 21:24:54 +08:00
< / s p a n > ` } ) , V u e . c o m p o n e n t ( " n o d e - g r o u p - s e l e c t o r " , { p r o p s : [ " v - c l u s t e r - i d " , " v - g r o u p " ] , d a t a : f u n c t i o n ( ) { r e t u r n { s e l e c t e d G r o u p : t h i s . v G r o u p } } , m e t h o d s : { s e l e c t G r o u p : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / c l u s t e r s / c l u s t e r / g r o u p s / s e l e c t P o p u p ? c l u s t e r I d = " + t h i s . v C l u s t e r I d , { c a l l b a c k : f u n c t i o n ( e ) { t . s e l e c t e d G r o u p = e . d a t a . g r o u p } } ) } , a d d G r o u p : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / c l u s t e r s / c l u s t e r / g r o u p s / c r e a t e P o p u p ? c l u s t e r I d = " + t h i s . v C l u s t e r I d , { c a l l b a c k : f u n c t i o n ( e ) { t . s e l e c t e d G r o u p = e . d a t a . g r o u p } } ) } , r e m o v e G r o u p : f u n c t i o n ( ) { t h i s . s e l e c t e d G r o u p = n u l l } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div class = "ui label small basic" v - if = "selectedGroup != null" >
< input type = "hidden" name = "groupId" : value = "selectedGroup.id" / >
{ { selectedGroup . name } } & nbsp ; < a href = "" title = "删除" @ click . prevent = "removeGroup()" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div v - if = "selectedGroup == null" >
< a href = "" @ click . prevent = "selectGroup()" > [ 选择分组 ] < / a > & n b s p ; < a h r e f = " " @ c l i c k . p r e v e n t = " a d d G r o u p ( ) " > [ 添 加 分 组 ] < / a >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - i p - a d d r e s s e s - b o x " , { p r o p s : [ " v - i p - a d d r e s s e s " , " r o l e " ] , d a t a : f u n c t i o n ( ) { r e t u r n { i p A d d r e s s e s : n u l l = = t h i s . v I p A d d r e s s e s ? [ ] : t h i s . v I p A d d r e s s e s , s u p p o r t T h r e s h o l d s : " n s " ! = t h i s . r o l e } } , m e t h o d s : { a d d I P A d d r e s s : f u n c t i o n ( ) { w i n d o w . U P D A T I N G _ N O D E _ I P _ A D D R E S S = n u l l ; l e t t = t h i s ; t e a w e b . p o p u p ( " / n o d e s / i p A d d r e s s e s / c r e a t e P o p u p ? s u p p o r t T h r e s h o l d s = " + ( t h i s . s u p p o r t T h r e s h o l d s ? 1 : 0 ) , { c a l l b a c k : f u n c t i o n ( e ) { t . i p A d d r e s s e s . p u s h ( e . d a t a . i p A d d r e s s ) } , h e i g h t : " 2 4 e m " , w i d t h : " 4 4 e m " } ) } , u p d a t e I P A d d r e s s : f u n c t i o n ( t , e ) { w i n d o w . U P D A T I N G _ N O D E _ I P _ A D D R E S S = e ; l e t i = t h i s ; t e a w e b . p o p u p ( " / n o d e s / i p A d d r e s s e s / u p d a t e P o p u p ? s u p p o r t T h r e s h o l d s = " + ( t h i s . s u p p o r t T h r e s h o l d s ? 1 : 0 ) , { c a l l b a c k : f u n c t i o n ( e ) { V u e . s e t ( i . i p A d d r e s s e s , t , e . d a t a . i p A d d r e s s ) } , h e i g h t : " 2 4 e m " , w i d t h : " 4 4 e m " } ) } , r e m o v e I P A d d r e s s : f u n c t i o n ( e ) { t h i s . i p A d d r e s s e s . $ r e m o v e ( e ) } , i s I P v 6 : f u n c t i o n ( e ) { r e t u r n - 1 < e . i n d e x O f ( " : " ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "ipAddressesJSON" : value = "JSON.stringify(ipAddresses)" / >
< div v - if = "ipAddresses.length > 0" >
< div >
< div v - for = "(address, index) in ipAddresses" class = "ui label tiny basic" >
< span v - if = "isIPv6(address.ip)" class = "grey" > [ IPv6 ] < / s p a n > { { a d d r e s s . i p } }
< span class = "small grey" v - if = "address.name.length > 0" > ( { { address . name } } < span v - if = "!address.canAccess" > , 不可访问 < / s p a n > ) < / s p a n >
< span class = "small grey" v - if = "address.name.length == 0 && !address.canAccess" > ( 不可访问 ) < / s p a n >
< span class = "small red" v - if = "!address.isOn" title = "未启用" > [ off ] < / s p a n >
< span class = "small red" v - if = "!address.isUp" title = "已下线" > [ down ] < / s p a n >
< span class = "small" v - if = "address.thresholds != null && address.thresholds.length > 0" > [ { { address . thresholds . length } } 个阈值 ] < / s p a n >
& nbsp ;
< a href = "" title = "修改" @ click . prevent = "updateIPAddress(index, address)" > < i class = "icon pencil small" > < / i > < / a >
< a href = "" title = "删除" @ click . prevent = "removeIPAddress(index)" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< / d i v >
< div class = "ui divider" > < / d i v >
< / d i v >
< div >
< button class = "ui button small" type = "button" @ click . prevent = "addIPAddress()" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - i p - a d d r e s s - t h r e s h o l d s - v i e w " , { p r o p s : [ " v - t h r e s h o l d s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v T h r e s h o l d s ; r e t u r n n u l l = = e ? e = [ ] : e . f o r E a c h ( f u n c t i o n ( e ) { n u l l = = e . i t e m s & & ( e . i t e m s = [ ] ) , n u l l = = e . a c t i o n s & & ( e . a c t i o n s = [ ] ) } ) , { t h r e s h o l d s : e , a l l I t e m s : w i n d o w . I P _ A D D R _ T H R E S H O L D _ I T E M S , a l l O p e r a t o r s : [ { n a m e : " 小 于 等 于 " , c o d e : " l t e " } , { n a m e : " 大 于 " , c o d e : " g t " } , { n a m e : " 不 等 于 " , c o d e : " n e q " } , { n a m e : " 小 于 " , c o d e : " l t " } , { n a m e : " 大 于 等 于 " , c o d e : " g t e " } ] , a l l A c t i o n s : w i n d o w . I P _ A D D R _ T H R E S H O L D _ A C T I O N S } } , m e t h o d s : { i t e m N a m e : f u n c t i o n ( t ) { l e t i = " " ; r e t u r n t h i s . a l l I t e m s . f o r E a c h ( f u n c t i o n ( e ) { e . c o d e = = t & & ( i = e . n a m e ) } ) , i } , i t e m U n i t N a m e : f u n c t i o n ( t ) { l e t i = " " ; r e t u r n t h i s . a l l I t e m s . f o r E a c h ( f u n c t i o n ( e ) { e . c o d e = = t & & ( i = e . u n i t ) } ) , i } , i t e m D u r a t i o n U n i t N a m e : f u n c t i o n ( e ) { s w i t c h ( e ) { c a s e " m i n u t e " : r e t u r n " 分 钟 " ; c a s e " s e c o n d " : r e t u r n " 秒 " ; c a s e " h o u r " : r e t u r n " 小 时 " ; c a s e " d a y " : r e t u r n " 天 " } r e t u r n e } , i t e m O p e r a t o r N a m e : f u n c t i o n ( t ) { l e t i = " " ; r e t u r n t h i s . a l l O p e r a t o r s . f o r E a c h ( f u n c t i o n ( e ) { e . c o d e = = t & & ( i = e . n a m e ) } ) , i } , a c t i o n N a m e : f u n c t i o n ( t ) { l e t i = " " ; r e t u r n t h i s . a l l A c t i o n s . f o r E a c h ( f u n c t i o n ( e ) { e . c o d e = = t & & ( i = e . n a m e ) } ) , i } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
<!-- 已有条件 -- >
< div v - if = "thresholds.length > 0" >
< div class = "ui label basic small" v - for = "(threshold, index) in thresholds" style = "margin-bottom: 0.8em" >
< span v - for = "(item, itemIndex) in threshold.items" >
< span >
< span v - if = "item.item != 'nodeHealthCheck'" >
[ { { item . duration } } { { itemDurationUnitName ( item . durationUnit ) } } ]
< / s p a n >
{ { itemName ( item . item ) } }
< span v - if = "item.item == 'nodeHealthCheck'" >
<!-- 健康检查 -- >
< span v - if = "item.value == 1" > 成功 < / s p a n >
< span v - if = "item.value == 0" > 失败 < / s p a n >
< / s p a n >
< span v - else >
<!-- 连通性 -- >
< span v - if = "item.item == 'connectivity' && item.options != null && item.options.groups != null && item.options.groups.length > 0" > [ < span v - for = "(group, groupIndex) in item.options.groups" > { { group . name } } < span v - if = "groupIndex != item.options.groups.length - 1" > & nbsp ; < / s p a n > < / s p a n > ] < / s p a n >
< span class = "grey" > [ { { itemOperatorName ( item . operator ) } } ] < / s p a n > { { i t e m . v a l u e } } { { i t e m U n i t N a m e ( i t e m . i t e m ) } } & n b s p ;
< / s p a n >
< / s p a n >
< span v - if = "itemIndex != threshold.items.length - 1" style = "font-style: italic" > AND & nbsp ; < / s p a n > < / s p a n >
- & gt ;
< span v - for = "(action, actionIndex) in threshold.actions" > { { actionName ( action . action ) } }
< span v - if = "action.action == 'switch'" > 到 { { action . options . ips . join ( ", " ) } } < / s p a n >
< span v - if = "action.action == 'webHook'" class = "small grey" > ( { { action . options . url } } ) < / s p a n >
& nbsp ;
< span v - if = "actionIndex != threshold.actions.length - 1" style = "font-style: italic" > AND & nbsp ; < / s p a n >
< / s p a n >
< / d i v >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - i p - a d d r e s s - t h r e s h o l d s - b o x " , { p r o p s : [ " v - t h r e s h o l d s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v T h r e s h o l d s ; r e t u r n n u l l = = e ? e = [ ] : e . f o r E a c h ( f u n c t i o n ( e ) { n u l l = = e . i t e m s & & ( e . i t e m s = [ ] ) , n u l l = = e . a c t i o n s & & ( e . a c t i o n s = [ ] ) } ) , { e d i t i n g I n d e x : - 1 , t h r e s h o l d s : e , a d d i n g T h r e s h o l d : { i t e m s : [ ] , a c t i o n s : [ ] } , i s A d d i n g : ! 1 , i s A d d i n g I t e m : ! 1 , i s A d d i n g A c t i o n : ! 1 , i t e m C o d e : " n o d e A v g R e q u e s t s " , i t e m R e p o r t G r o u p s : [ ] , i t e m O p e r a t o r : " l t e " , i t e m V a l u e : " " , i t e m D u r a t i o n : " 5 " , a l l I t e m s : w i n d o w . I P _ A D D R _ T H R E S H O L D _ I T E M S , a l l O p e r a t o r s : [ { n a m e : " 小 于 等 于 " , c o d e : " l t e " } , { n a m e : " 大 于 " , c o d e : " g t " } , { n a m e : " 不 等 于 " , c o d e : " n e q " } , { n a m e : " 小 于 " , c o d e : " l t " } , { n a m e : " 大 于 等 于 " , c o d e : " g t e " } ] , a l l A c t i o n s : w i n d o w . I P _ A D D R _ T H R E S H O L D _ A C T I O N S , a c t i o n C o d e : " u p " , a c t i o n B a c k u p I P s : " " , a c t i o n W e b H o o k U R L : " " } } , m e t h o d s : { a d d : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! t h i s . i s A d d i n g } , c a n c e l : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 , t h i s . e d i t i n g I n d e x = - 1 , t h i s . a d d i n g T h r e s h o l d = { i t e m s : [ ] , a c t i o n s : [ ] } } , c o n f i r m : f u n c t i o n ( ) { 0 = = t h i s . a d d i n g T h r e s h o l d . i t e m s . l e n g t h ? t e a w e b . w a r n ( " 需 要 至 少 添 加 一 个 阈 值 " ) : 0 = = t h i s . a d d i n g T h r e s h o l d . a c t i o n s . l e n g t h ? t e a w e b . w a r n ( " 需 要 至 少 添 加 一 个 动 作 " ) : ( 0 < = t h i s . e d i t i n g I n d e x ? ( t h i s . t h r e s h o l d s [ t h i s . e d i t i n g I n d e x ] . i t e m s = t h i s . a d d i n g T h r e s h o l d . i t e m s , t h i s . t h r e s h o l d s [ t h i s . e d i t i n g I n d e x ] . a c t i o n s = t h i s . a d d i n g T h r e s h o l d . a c t i o n s ) : t h i s . t h r e s h o l d s . p u s h ( { i t e m s : t h i s . a d d i n g T h r e s h o l d . i t e m s , a c t i o n s : t h i s . a d d i n g T h r e s h o l d . a c t i o n s } ) , t h i s . c a n c e l ( ) ) } , r e m o v e : f u n c t i o n ( e ) { t h i s . c a n c e l ( ) , t h i s . t h r e s h o l d s . $ r e m o v e ( e ) } , u p d a t e : f u n c t i o n ( e ) { t h i s . e d i t i n g I n d e x = e , t h i s . a d d i n g T h r e s h o l d = { i t e m s : t h i s . t h r e s h o l d s [ e ] . i t e m s . $ c o p y ( ) , a c t i o n s : t h i s . t h r e s h o l d s [ e ] . a c t i o n s . $ c o p y ( ) } , t h i s . i s A d d i n g = ! 0 } , a d d I t e m : f u n c t i o n ( ) { t h i s . i s A d d i n g I t e m = ! t h i s . i s A d d i n g I t e m ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . i t e m V a l u e . f o c u s ( ) } , 1 0 0 ) } , c a n c e l I t e m : f u n c t i o n ( ) { t h i s . i s A d d i n g I t e m = ! 1 , t h i s . i t e m C o d e = " n o d e A v g R e q u e s t s " , t h i s . i t m e O p e r a t o r = " l t e " , t h i s . i t e m V a l u e = " " , t h i s . i t e m D u r a t i o n = " 5 " , t h i s . i t e m R e p o r t G r o u p s = [ ] } , c o n f i r m I t e m : f u n c t i o n ( ) { i f ( [ " n o d e H e a l t h C h e c k " ] . $ c o n t a i n s ( t h i s . i t e m C o d e ) ) { i f ( 0 = = t h i s . i t e m V a l u e . t o S t r i n g ( ) . l e n g t h ) r e t u r n v o i d t e a w e b . w a r n ( " 请 选 择 检 查 结 果 " ) ; l e t e = p a r s e I n t ( t h i s . i t e m V a l u e ) ; r e t u r n i s N a N ( e ) | | e < 0 ? e = 0 : 1 < e & & ( e = 1 ) , t h i s . a d d i n g T h r e s h o l d . i t e m s . p u s h ( { i t e m : t h i s . i t e m C o d e , o p e r a t o r : t h i s . i t e m O p e r a t o r , v a l u e : e , d u r a t i o n : 0 , d u r a t i o n U n i t : " m i n u t e " , o p t i o n s : { } } ) , v o i d t h i s . c a n c e l I t e m ( ) } i f ( 0 = = t h i s . i t e m D u r a t i o n . l e n g t h ) { l e t e = t h i s ; v o i d t e a w e b . w a r n ( " 请 输 入 统 计 周 期 " , f u n c t i o n ( ) { e . $ r e f s . i t e m D u r a t i o n . f o c u s ( ) } ) } e l s e { v a r t = p a r s e I n t ( t h i s . i t e m D u r a t i o n ) ; i f ( i s N a N ( t ) | | t < = 0 ) t e a w e b . w a r n ( " 请 输 入 正 确 的 统 计 周 期 " , f u n c t i o n ( ) { t h a t . $ r e f s . i t e m D u r a t i o n . f o c u s ( ) } ) ; e l s e i f ( 0 = = t h i s . i t e m V a l u e . l e n g t h ) { l e t e = t h i s ; v o i d t e a w e b . w a r n ( " 请 输 入 对 比 值 " , f u n c t i o n ( ) { e . $ r e f s . i t e m V a l u e . f o c u s ( ) } ) } e l s e { v a r i = p a r s e F l o a t ( t h i s . i t e m V a l u e ) ; i f ( i s N a N ( i ) ) t e a w e b . w a r n ( " 请 输 入 正 确 的 对 比 值 " , f u n c t i o n ( ) { t h a t . $ r e f s . i t e m V a l u e . f o c u s ( ) } ) ; e l s e { l e t e = { } ; i f ( " c o n n e c t i v i t y " = = = t h i s . i t e m C o d e ) { i f ( 1 0 0 < i ) { l e t e = t h i s ; r e t u r n v o i d t e a w e b . w a r n ( " 连 通 性 对 比 值 不 能 超 过 1 0 0 " , f u n c t i o n ( ) { e . $ r e f s . i t e m V a l u e . f o c u s ( ) } ) } e . g r o u p s = t h i s . i t e m R e p o r t G r o u p s } t h i s . a d d i n g T h r e s h o l d . i t e m s . p u s h ( { i t e m : t h i s . i t e m C o d e , o p e r a t o r : t h i s . i t e m O p e r a t o r , v a l u e : i , d u r a t i o n : t , d u r a t i o n U n i t : " m i n u t e " , o p t i o n s : e } ) , t h i s . c a n c e l I t e m ( ) } } } } , r e m o v e I t e m : f u n c t i o n ( e ) { t h i s . c a n c e l I t e m ( ) , t h i s . a d d i n g T h r e s h o l d . i t e m s . $ r e m o v e ( e ) } , c h a n g e R e p o r t G r o u p s : f u n c t i o n ( e ) { t h i s . i t e m R e p o r t G r o u p s = e } , i t e m N a m e : f u n c t i o n ( t ) { l e t i = " " ; r e t u r n t h i s . a l l I t e m s . f o r E a c h ( f u n c t i o n ( e ) { e . c o d e = = t & & ( i = e . n a m e ) } ) , i } , i t e m U n i t N a m e : f u n c t i o n ( t ) { l e t i = " " ; r e t u r n t h i s . a l l I t e m s . f o r E a c h ( f u n c t i o n ( e ) { e . c o d e = = t & & ( i = e . u n i t ) } ) , i } , i t e m D u r a t i o n U n i t N a m e : f u n c t i o n ( e ) { s w i t c h ( e ) { c a s e " m i n u t e " : r e t u r n " 分 钟 " ; c a s e " s e c o n d " : r e t u r n " 秒 " ; c a s e " h o u r " : r e t u r n " 小 时 " ; c a s e " d a y " : r e t u r n " 天 " } r e t u r n e } , i t e m O p e r a t o r N a m e : f u n c t i o n ( t ) { l e t i = " " ; r e t u r n t h i s . a l l O p e r a t o r s . f o r E a c h ( f u n c t i o n ( e ) { e . c o d e = = t & & ( i = e . n a m e ) } ) , i } , a d d A c t i o n : f u n c t i o n ( ) { t h i s . i s A d d i n g A c t i o n = ! t h i s . i s A d d i n g A c t i o n } , c a n c e l A c t i o n : f u n c t i o n ( ) { t h i s . i s A d d i n g A c t i o n = ! 1 , t h i s . a c t i o n C o d e = " u p " , t h i s . a c t i o n B a c k u p I P s = " " , t h i s . a c t i o n W e b H o o k U R L = " " } , c o n f i r m A c t i o n : f u n c t i o n ( ) { t h i s . d o C o n f i r m A c t i o n ( ! 1 ) } , d o C o n f i r m A c t i o n : f u n c t i o n ( e , t ) { l e t i = ! 1 , s = t h i s ; i f ( t h i s . a d d i n g T h r e s h o l d . a c t i o n s . f o r E a c h ( f u n c t i o n ( e ) { e . a c t i o n = = s . a c t i o n C o d e & & ( i = ! 0 ) } ) , i ) t
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "thresholdsJSON" : value = "JSON.stringify(thresholds)" / >
<!-- 已有条件 -- >
< div v - if = "thresholds.length > 0" >
< div class = "ui label basic small" v - for = "(threshold, index) in thresholds" >
< span v - for = "(item, itemIndex) in threshold.items" >
< span v - if = "item.item != 'nodeHealthCheck'" >
[ { { item . duration } } { { itemDurationUnitName ( item . durationUnit ) } } ]
< / s p a n >
{ { itemName ( item . item ) } }
< span v - if = "item.item == 'nodeHealthCheck'" >
<!-- 健康检查 -- >
< span v - if = "item.value == 1" > 成功 < / s p a n >
< span v - if = "item.value == 0" > 失败 < / s p a n >
< / s p a n >
< span v - else >
<!-- 连通性 -- >
< span v - if = "item.item == 'connectivity' && item.options != null && item.options.groups != null && item.options.groups.length > 0" > [ < span v - for = "(group, groupIndex) in item.options.groups" > { { group . name } } < span v - if = "groupIndex != item.options.groups.length - 1" > & nbsp ; < / s p a n > < / s p a n > ] < / s p a n >
< span class = "grey" > [ { { itemOperatorName ( item . operator ) } } ] < / s p a n > & n b s p ; { { i t e m . v a l u e } } { { i t e m U n i t N a m e ( i t e m . i t e m ) } }
< / s p a n >
& nbsp ; < span v - if = "itemIndex != threshold.items.length - 1" style = "font-style: italic" > AND & nbsp ; < / s p a n >
< / s p a n >
- & gt ;
< span v - for = "(action, actionIndex) in threshold.actions" > { { actionName ( action . action ) } }
< span v - if = "action.action == 'switch'" > 到 { { action . options . ips . join ( ", " ) } } < / s p a n >
< span v - if = "action.action == 'webHook'" class = "small grey" > ( { { action . options . url } } ) < / s p a n >
& nbsp ; < span v - if = "actionIndex != threshold.actions.length - 1" style = "font-style: italic" > AND & nbsp ; < / s p a n > < / s p a n >
& nbsp ;
< a href = "" title = "修改" @ click . prevent = "update(index)" > < i class = "icon pencil small" > < / i > < / a >
< a href = "" title = "删除" @ click . prevent = "remove(index)" > < i class = "icon small remove" > < / i > < / a >
< / d i v >
< / d i v >
<!-- 新阈值 -- >
< div v - if = "isAdding" style = "margin-top: 0.5em" >
< table class = "ui table celled" >
< thead >
< tr >
< td style = "width: 50%; background: #f9fafb; border-bottom: 1px solid rgba(34,36,38,.1)" > 阈值 < / t d >
< th > 动作 < / t h >
< / t r >
< / t h e a d >
< tr >
< td style = "background: white" >
<!-- 已经添加的项目 -- >
< div >
< div v - for = "(item, index) in addingThreshold.items" class = "ui label basic small" style = "margin-bottom: 0.5em;" >
< span v - if = "item.item != 'nodeHealthCheck'" >
[ { { item . duration } } { { itemDurationUnitName ( item . durationUnit ) } } ]
< / s p a n >
{ { itemName ( item . item ) } }
< span v - if = "item.item == 'nodeHealthCheck'" >
<!-- 健康检查 -- >
< span v - if = "item.value == 1" > 成功 < / s p a n >
< span v - if = "item.value == 0" > 失败 < / s p a n >
< / s p a n >
< span v - else >
<!-- 连通性 -- >
< span v - if = "item.item == 'connectivity' && item.options != null && item.options.groups != null && item.options.groups.length > 0" > [ < span v - for = "(group, groupIndex) in item.options.groups" > { { group . name } } < span v - if = "groupIndex != item.options.groups.length - 1" > & nbsp ; < / s p a n > < / s p a n > ] < / s p a n >
< span class = "grey" > [ { { itemOperatorName ( item . operator ) } } ] < / s p a n > { { i t e m . v a l u e } } { { i t e m U n i t N a m e ( i t e m . i t e m ) } }
< / s p a n >
& nbsp ;
< a href = "" title = "删除" @ click . prevent = "removeItem(index)" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
<!-- 正在添加的项目 -- >
< div v - if = "isAddingItem" style = "margin-top: 0.8em" >
< table class = "ui table" >
< tr >
< td style = "width: 6em" > 统计项目 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "itemCode" >
< option v - for = "item in allItems" : value = "item.code" > { { item . name } } < / o p t i o n >
< / s e l e c t >
< p class = "comment" style = "font-weight: normal" v - for = "item in allItems" v - if = "item.code == itemCode" > { { item . description } } < / p >
< / t d >
< / t r >
< tr v - show = "itemCode != 'nodeHealthCheck'" >
< td > 统计周期 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" v - model = "itemDuration" style = "width: 4em" maxlength = "4" ref = "itemDuration" @ keyup . enter = "confirmItem()" @ keypress . enter . prevent = "1" / >
< span class = "ui label" > 分钟 < / s p a n >
< / d i v >
< / t d >
< / t r >
< tr v - show = "itemCode != 'nodeHealthCheck'" >
< td > 操作符 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "itemOperator" >
< option v - for = "operator in allOperators" : value = "operator.code" > { { operator . name } } < / o p t i o n >
< / s e l e c t >
< / t d >
< / t r >
< tr v - show = "itemCode != 'nodeHealthCheck'" >
< td > 对比值 < / t d >
< td >
< div class = "ui input right labeled" >
< input type = "text" maxlength = "20" style = "width: 5em" v - model = "itemValue" ref = "itemValue" @ keyup . enter = "confirmItem()" @ keypress . enter . prevent = "1" / >
< span class = "ui label" v - for = "item in allItems" v - if = "item.code == itemCode" > { { item . unit } } < / s p a n >
< / d i v >
< / t d >
< / t r >
< tr v - show = "itemCode == 'nodeHealthCheck'" >
< td > 检查结果 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "itemValue" >
< option value = "1" > 成功 < / o p t i o n >
< option value = "0" > 失败 < / o p t i o n >
< / s e l e c t >
< p class = "comment" style = "font-weight: normal" > 只有状态发生改变的时候才会触发 。 < / p >
< / t d >
< / t r >
<!-- 连通性 -- >
< tr v - if = "itemCode == 'connectivity'" >
< td > 终端分组 < / t d >
< td style = "font-weight: normal" >
< div style = "zoom: 0.8" > < report - node - groups - selector @ change = "changeReportGroups" > < / r e p o r t - n o d e - g r o u p s - s e l e c t o r > < / d i v >
< / t d >
< / t r >
< / t a b l e >
< div style = "margin-top: 0.8em" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmItem" > 确定 < / b u t t o n > & n b s p ;
< a href = "" title = "取消" @ click . prevent = "cancelItem" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< div style = "margin-top: 0.8em" v - if = "!isAddingItem" >
< button class = "ui button tiny" type = "button" @ click . prevent = "addItem" > + < / b u t t o n >
< / d i v >
< / t d >
< td style = "background: white" >
<!-- 已经添加的动作 -- >
< div >
< div v - for = "(action, index) in addingThreshold.actions" class = "ui label basic small" style = "margin-bottom: 0.5em" >
{ { actionName ( action . action ) } } & nbsp ;
< span v - if = "action.action == 'switch'" > 到 { { action . options . ips . join ( ", " ) } } < / s p a n >
< span v - if = "action.action == 'webHook'" class = "small grey" > ( { { action . options . url } } ) < / s p a n >
< a href = "" title = "删除" @ click . prevent = "removeAction(index)" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
<!-- 正在添加的动作 -- >
< div v - if = "isAddingAction" style = "margin-top: 0.8em" >
< table class = "ui table" >
< tr >
< td style = "width: 6em" > 动作类型 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "actionCode" >
< option v - for = "action in allActions" : value = "action.code" > { { action . name } } < / o p t i o n >
< / s e l e c t >
< p class = "comment" v - for = "action in allActions" v - if = "action.code == actionCode" > { { action . description } } < / p >
< / t d >
< / t r >
<!-- 切换 -- >
< tr v - if = "actionCode == 'switch'" >
< td > 备用IP * < / t d >
< td >
< textarea rows = "2" v - model = "actionBackupIPs" ref = "actionBackupIPs" > < / t e x t a r e a >
< p class = "comment" > 每行一个备用IP 。 < / p >
< / t d >
< / t r >
<!-- WebHook -- >
< tr v - if = "actionCode == 'webHook'" >
< td > URL * < / t d >
< td >
< input type = "text" maxlength = "1000" placeholder = "https://..." v - model = "actionWebHookURL" ref = "webHookURL" @ keyup . enter = "confirmAction()" @ keypress . enter . prevent = "1" / >
< p class = "comment" > 完整的URL , 比如 < code - label > https : //example.com/webhook/api</code-label>, 系统会在触发阈值的时候通过GET调用此URL。</p>
< / t d >
< / t r >
< / t a b l e >
< div style = "margin-top: 0.8em" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirmAction" > 确定 < / b u t t o n > & n b s p ;
< a href = "" title = "取消" @ click . prevent = "cancelAction" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< div style = "margin-top: 0.8em" v - if = "!isAddingAction" >
< button class = "ui button tiny" type = "button" @ click . prevent = "addAction" > + < / b u t t o n >
< / d i v >
< / t d >
< / t r >
< / t a b l e >
<!-- 添加阈值 -- >
< div >
< button class = "ui button tiny" : class = "{disabled: (isAddingItem || isAddingAction)}" type = "button" @ click . prevent = "confirm" > 确定 < / b u t t o n > & n b s p ;
< a href = "" title = "取消" @ click . prevent = "cancel" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< div v - if = "!isAdding" style = "margin-top: 0.5em" >
< button class = "ui button tiny" type = "button" @ click . prevent = "add" > + < / b u t t o n >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - r e g i o n - s e l e c t o r " , { p r o p s : [ " v - r e g i o n " ] , d a t a : f u n c t i o n ( ) { r e t u r n { s e l e c t e d R e g i o n : t h i s . v R e g i o n } } , m e t h o d s : { s e l e c t R e g i o n : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / c l u s t e r s / r e g i o n s / s e l e c t P o p u p ? c l u s t e r I d = " + t h i s . v C l u s t e r I d , { c a l l b a c k : f u n c t i o n ( e ) { t . s e l e c t e d R e g i o n = e . d a t a . r e g i o n } } ) } , a d d R e g i o n : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / c l u s t e r s / r e g i o n s / c r e a t e P o p u p ? c l u s t e r I d = " + t h i s . v C l u s t e r I d , { c a l l b a c k : f u n c t i o n ( e ) { t . s e l e c t e d R e g i o n = e . d a t a . r e g i o n } } ) } , r e m o v e R e g i o n : f u n c t i o n ( ) { t h i s . s e l e c t e d R e g i o n = n u l l } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< div class = "ui label small basic" v - if = "selectedRegion != null" >
< input type = "hidden" name = "regionId" : value = "selectedRegion.id" / >
{ { selectedRegion . name } } & nbsp ; < a href = "" title = "删除" @ click . prevent = "removeRegion()" > < i class = "icon remove" > < / i > < / a >
< / d i v >
< div v - if = "selectedRegion == null" >
< a href = "" @ click . prevent = "selectRegion()" > [ 选择区域 ] < / a > & n b s p ; < a h r e f = " " @ c l i c k . p r e v e n t = " a d d R e g i o n ( ) " > [ 添 加 区 域 ] < / a >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - c o m b o - b o x " , { p r o p s : [ " v - c l u s t e r - i d " , " v - n o d e - i d " ] , d a t a : f u n c t i o n ( ) { l e t t = t h i s ; r e t u r n T e a . a c t i o n ( " / c l u s t e r s / n o d e O p t i o n s " ) . p a r a m s ( { c l u s t e r I d : t h i s . v C l u s t e r I d } ) . p o s t ( ) . s u c c e s s ( f u n c t i o n ( e ) { t . n o d e s = e . d a t a . n o d e s } ) , { n o d e s : [ ] } } , t e m p l a t e : ` < d i v v - i f = " n o d e s . l e n g t h > 0 " >
2022-01-11 15:28:50 +08:00
< combo - box title = "节点" placeholder = "节点名称" : v - items = "nodes" name = "nodeId" : v - value = "vNodeId" > < / c o m b o - b o x >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " n o d e - l e v e l - s e l e c t o r " , { p r o p s : [ " v - n o d e - l e v e l " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v N o d e L e v e l ; r e t u r n { l e v e l s : [ { n a m e : " 边 缘 节 点 " , c o d e : 1 , d e s c r i p t i o n : " 普 通 的 边 缘 节 点 。 " } , { n a m e : " L 2 节 点 " , c o d e : 2 , d e s c r i p t i o n : " 特 殊 的 边 缘 节 点 , 同 时 负 责 同 组 上 一 级 节 点 的 回 源 。 " } ] , l e v e l C o d e : e = n u l l = = e | | e < 1 ? 1 : e } } , t e m p l a t e : ` < d i v >
2022-04-04 19:46:12 +08:00
< select class = "ui dropdown auto-width" name = "level" v - model = "levelCode" >
< option v - for = "level in levels" : value = "level.code" > { { level . name } } < / o p t i o n >
< / s e l e c t >
< p class = "comment" v - if = "typeof(levels[levelCode - 1]) != null" > < plus - label
> < / p l u s - l a b e l > { { l e v e l s [ l e v e l C o d e - 1 ] . d e s c r i p t i o n } } < / p >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " d n s - r o u t e - s e l e c t o r " , { p r o p s : [ " v - a l l - r o u t e s " , " v - r o u t e s " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v R o u t e s ; r e t u r n ( e = n u l l = = e ? [ ] : e ) . $ s o r t ( f u n c t i o n ( e , t ) { r e t u r n e . d o m a i n I d = = t . d o m a i n I d ? e . c o d e < t . c o d e : e . d o m a i n I d < t . d o m a i n I d ? 1 : - 1 } ) , { r o u t e s : e , r o u t e C o d e s : e . $ m a p ( f u n c t i o n ( e , t ) { r e t u r n t . c o d e + " @ " + t . d o m a i n I d } ) , i s A d d i n g : ! 1 , r o u t e C o d e : " " , k e y w o r d : " " , s e a r c h i n g R o u t e s : t h i s . v A l l R o u t e s . $ c o p y ( ) } } , m e t h o d s : { a d d : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 0 , t h i s . k e y w o r d = " " , t h i s . r o u t e C o d e = " " ; l e t e = t h i s ; s e t T i m e o u t ( f u n c t i o n ( ) { e . $ r e f s . k e y w o r d R e f . f o c u s ( ) } , 2 0 0 ) } , c a n c e l : f u n c t i o n ( ) { t h i s . i s A d d i n g = ! 1 } , c o n f i r m : f u n c t i o n ( ) { i f ( 0 ! = t h i s . r o u t e C o d e . l e n g t h ) i f ( t h i s . r o u t e C o d e s . $ c o n t a i n s ( t h i s . r o u t e C o d e ) ) t e a w e b . w a r n ( " 已 经 添 加 过 此 线 路 , 不 能 重 复 添 加 " ) ; e l s e { l e t i = t h i s ; v a r e = t h i s . v A l l R o u t e s . $ f i n d ( f u n c t i o n ( e , t ) { r e t u r n t . c o d e + " @ " + t . d o m a i n I d = = i . r o u t e C o d e } ) ; n u l l ! = e & & ( t h i s . r o u t e C o d e s . p u s h ( t h i s . r o u t e C o d e ) , t h i s . r o u t e s . p u s h ( e ) , t h i s . r o u t e s . $ s o r t ( f u n c t i o n ( e , t ) { r e t u r n e . d o m a i n I d = = t . d o m a i n I d ? e . c o d e < t . c o d e : e . d o m a i n I d < t . d o m a i n I d ? 1 : - 1 } ) , t h i s . r o u t e C o d e = " " , t h i s . i s A d d i n g = ! 1 ) } } , r e m o v e : f u n c t i o n ( i ) { t h i s . r o u t e C o d e s . $ r e m o v e V a l u e ( i . c o d e + " @ " + i . d o m a i n I d ) , t h i s . r o u t e s . $ r e m o v e I f ( f u n c t i o n ( e , t ) { r e t u r n t . c o d e + " @ " + t . d o m a i n I d = = i . c o d e + " @ " + i . d o m a i n I d } ) } } , w a t c h : { k e y w o r d : f u n c t i o n ( t ) { i f ( 0 = = t . l e n g t h ) r e t u r n t h i s . s e a r c h i n g R o u t e s = t h i s . v A l l R o u t e s . $ c o p y ( ) , v o i d ( t h i s . r o u t e C o d e = " " ) ; t h i s . s e a r c h i n g R o u t e s = t h i s . v A l l R o u t e s . f i l t e r ( f u n c t i o n ( e ) { r e t u r n t e a w e b . m a t c h ( e . n a m e , t ) | | t e a w e b . m a t c h ( e . d o m a i n N a m e , t ) } ) , 0 < t h i s . s e a r c h i n g R o u t e s . l e n g t h ? t h i s . r o u t e C o d e = t h i s . s e a r c h i n g R o u t e s [ 0 ] . c o d e + " @ " + t h i s . s e a r c h i n g R o u t e s [ 0 ] . d o m a i n I d : t h i s . r o u t e C o d e = " " } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "dnsRoutesJSON" : value = "JSON.stringify(routeCodes)" / >
< div v - if = "routes.length > 0" >
< tiny - basic - label v - for = "route in routes" : key = "route.code + '@' + route.domainId" >
{ { route . name } } < span class = "grey small" > ( { { route . domainName } } ) < /span><a href="" @click.prevent="remove(route)"><i class="icon remove"></i > < / a >
< / t i n y - b a s i c - l a b e l >
< div class = "ui divider" > < / d i v >
< / d i v >
< button type = "button" class = "ui button small" @ click . prevent = "add" v - if = "!isAdding" > + < / b u t t o n >
< div v - if = "isAdding" >
< div class = "ui fields inline" >
< div class = "ui field" >
< select class = "ui dropdown" style = "width: 18em" v - model = "routeCode" >
< option value = "" v - if = "keyword.length == 0" > [ 请选择 ] < / o p t i o n >
< option v - for = "route in searchingRoutes" : value = "route.code + '@' + route.domainId" > { { route . name } } ( { { route . domainName } } ) < / o p t i o n >
< / s e l e c t >
< / d i v >
< div class = "ui field" >
< input type = "text" placeholder = "搜索..." size = "10" v - model = "keyword" ref = "keywordRef" @ keyup . enter = "confirm" @ keypress . enter . prevent = "1" / >
< / d i v >
< div class = "ui field" >
< button class = "ui button tiny" type = "button" @ click . prevent = "confirm" > 确定 < / b u t t o n >
< / d i v >
< div class = "ui field" >
< a href = "" @ click . prevent = "cancel()" > < i class = "icon remove small" > < / i > < / a >
< / d i v >
< / d i v >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " d n s - d o m a i n - s e l e c t o r " , { p r o p s : [ " v - d o m a i n - i d " , " v - d o m a i n - n a m e " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v D o m a i n I d , t = ( n u l l = = e & & ( e = 0 ) , t h i s . v D o m a i n N a m e ) ; r e t u r n n u l l = = t & & ( t = " " ) , { d o m a i n I d : e , d o m a i n N a m e : t } } , m e t h o d s : { s e l e c t : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / d n s / d o m a i n s / s e l e c t P o p u p " , { c a l l b a c k : f u n c t i o n ( e ) { t . d o m a i n I d = e . d a t a . d o m a i n I d , t . d o m a i n N a m e = e . d a t a . d o m a i n N a m e , t . c h a n g e ( ) } } ) } , r e m o v e : f u n c t i o n ( ) { t h i s . d o m a i n I d = 0 , t h i s . d o m a i n N a m e = " " , t h i s . c h a n g e ( ) } , u p d a t e : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / d n s / d o m a i n s / s e l e c t P o p u p ? d o m a i n I d = " + t h i s . d o m a i n I d , { c a l l b a c k : f u n c t i o n ( e ) { t . d o m a i n I d = e . d a t a . d o m a i n I d , t . d o m a i n N a m e = e . d a t a . d o m a i n N a m e , t . c h a n g e ( ) } } ) } , c h a n g e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , { i d : t h i s . d o m a i n I d , n a m e : t h i s . d o m a i n N a m e } ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "dnsDomainId" : value = "domainId" / >
< div v - if = "domainName.length > 0" >
< span class = "ui label small basic" >
{ { domainName } }
< a href = "" @ click . prevent = "update" > < i class = "icon pencil small" > < / i > < / a >
< a href = "" @ click . prevent = "remove()" > < i class = "icon remove" > < / i > < / a >
< / s p a n >
< / d i v >
< div v - if = "domainName.length == 0" >
< a href = "" @ click . prevent = "select()" > [ 选择域名 ] < / a >
< / d i v >
2022-05-04 16:41:28 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " d n s - r e s o l v e r - c o n f i g - b o x " , { p r o p s : [ " v - d n s - r e s o l v e r - c o n f i g " ] , d a t a : f u n c t i o n ( ) { l e t e = t h i s . v D n s R e s o l v e r C o n f i g ; r e t u r n { c o n f i g : e = n u l l = = e ? { t y p e : " d e f a u l t " } : e , t y p e s : [ { n a m e : " 默 认 " , c o d e : " d e f a u l t " } , { n a m e : " C G O " , c o d e : " c g o " } , { n a m e : " G o 原 生 " , c o d e : " g o N a t i v e " } ] } } , t e m p l a t e : ` < d i v >
< input type = "hidden" name = "dnsResolverJSON" : value = "JSON.stringify(config)" / >
< table class = "ui table definition selectable" >
< tr >
< td class = "title" > 使用的DNS解析库 < / t d >
< td >
< select class = "ui dropdown auto-width" v - model = "config.type" >
< option v - for = "t in types" : value = "t.code" > { { t . name } } < / o p t i o n >
< / s e l e c t >
2022-05-19 17:14:19 +08:00
< p class = "comment" > 边缘节点使用的DNS解析库 。 修改此项配置后 , 需要重启节点进程才会生效 。 < pro - warning - label > < / p r o - w a r n i n g - l a b e l > < / p >
2022-05-04 16:41:28 +08:00
< / t d >
< / t r >
< / t a b l e >
< div class = "margin" > < / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , V u e . c o m p o n e n t ( " g r a n t - s e l e c t o r " , { p r o p s : [ " v - g r a n t " , " v - n o d e - c l u s t e r - i d " , " v - n s - c l u s t e r - i d " ] , d a t a : f u n c t i o n ( ) { r e t u r n { g r a n t I d : n u l l = = t h i s . v G r a n t ? 0 : t h i s . v G r a n t . i d , g r a n t : t h i s . v G r a n t , n o d e C l u s t e r I d : n u l l ! = t h i s . v N o d e C l u s t e r I d ? t h i s . v N o d e C l u s t e r I d : 0 , n s C l u s t e r I d : n u l l ! = t h i s . v N s C l u s t e r I d ? t h i s . v N s C l u s t e r I d : 0 } } , m e t h o d s : { s e l e c t : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / c l u s t e r s / g r a n t s / s e l e c t P o p u p ? n o d e C l u s t e r I d = " + t h i s . n o d e C l u s t e r I d + " & n s C l u s t e r I d = " + t h i s . n s C l u s t e r I d , { c a l l b a c k : e = > { t . g r a n t I d = e . d a t a . g r a n t . i d , 0 < t . g r a n t I d & & ( t . g r a n t = e . d a t a . g r a n t ) , t . n o t i f y U p d a t e ( ) } , h e i g h t : " 2 6 e m " } ) } , c r e a t e : f u n c t i o n ( ) { l e t t = t h i s ; t e a w e b . p o p u p ( " / c l u s t e r s / g r a n t s / c r e a t e P o p u p " , { h e i g h t : " 2 6 e m " , c a l l b a c k : e = > { t . g r a n t I d = e . d a t a . g r a n t . i d , 0 < t . g r a n t I d & & ( t . g r a n t = e . d a t a . g r a n t ) , t . n o t i f y U p d a t e ( ) } } ) } , u p d a t e : f u n c t i o n ( ) { i f ( n u l l = = t h i s . g r a n t ) w i n d o w . l o c a t i o n . r e l o a d ( ) ; e l s e { l e t t = t h i s ; t e a w e b . p o p u p ( " / c l u s t e r s / g r a n t s / u p d a t e P o p u p ? g r a n t I d = " + t h i s . g r a n t . i d , { h e i g h t : " 2 6 e m " , c a l l b a c k : e = > { t . g r a n t = e . d a t a . g r a n t , t . n o t i f y U p d a t e ( ) } } ) } } , r e m o v e : f u n c t i o n ( ) { t h i s . g r a n t = n u l l , t h i s . g r a n t I d = 0 , t h i s . n o t i f y U p d a t e ( ) } , n o t i f y U p d a t e : f u n c t i o n ( ) { t h i s . $ e m i t ( " c h a n g e " , t h i s . g r a n t ) } } , t e m p l a t e : ` < d i v >
2021-11-22 12:08:53 +08:00
< input type = "hidden" name = "grantId" : value = "grantId" / >
< div class = "ui label small basic" v - if = "grant != null" > { { grant . name } } < span class = "small grey" > ( { { grant . methodName } } ) < / s p a n > < s p a n c l a s s = " s m a l l g r e y " v - i f = " g r a n t . u s e r n a m e ! = n u l l & & g r a n t . u s e r n a m e . l e n g t h > 0 " > ( { { g r a n t . u s e r n a m e } } ) < / s p a n > < a h r e f = " " t i t l e = " 修 改 " @ c l i c k . p r e v e n t = " u p d a t e ( ) " > < i c l a s s = " i c o n p e n c i l s m a l l " > < / i > < / a > < a h r e f = " " t i t l e = " 删 除 " @ c l i c k . p r e v e n t = " r e m o v e ( ) " > < i c l a s s = " i c o n r e m o v e " > < / i > < / a > < / d i v >
< div v - if = "grant == null" >
< a href = "" @ click . prevent = "select()" > [ 选择已有认证 ] < / a > & n b s p ; & n b s p ; < a h r e f = " " @ c l i c k . p r e v e n t = " c r e a t e ( ) " > [ 添 加 新 认 证 ] < / a >
< / d i v >
2022-04-08 21:24:54 +08:00
< / d i v > ` } ) , w i n d o w . R E Q U E S T _ C O N D _ C O M P O N E N T S = [ { t y p e : " u r l - e x t e n s i o n " , n a m e : " U R L 扩 展 名 " , d e s c r i p t i o n : " 根 据 U R L 中 的 文 件 路 径 扩 展 名 进 行 过 滤 " , c o m p o n e n t : " h t t p - c o n d - u r l - e x t e n s i o n " , p a r a m s T i t l e : " 扩 展 名 列 表 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 1 } , { t y p e : " u r l - p r e f i x " , n a m e : " U R L 前 缀 " , d e s c r i p t i o n : " 根 据 U R L 中 的 文 件 路 径 前 缀 进 行 过 滤 " , c o m p o n e n t : " h t t p - c o n d - u r l - p r e f i x " , p a r a m s T i t l e : " U R L 前 缀 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 0 } , { t y p e : " u r l - e q " , n a m e : " U R L 精 准 匹 配 " , d e s c r i p t i o n : " 检 查 U R L 中 的 文 件 路 径 是 否 一 致 " , c o m p o n e n t : " h t t p - c o n d - u r l - e q " , p a r a m s T i t l e : " U R L 完 整 路 径 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 0 } , { t y p e : " u r l - r e g e x p " , n a m e : " U R L 正 则 匹 配 " , d e s c r i p t i o n : " 使 用 正 则 表 达 式 检 查 U R L 中 的 文 件 路 径 是 否 一 致 " , c o m p o n e n t : " h t t p - c o n d - u r l - r e g e x p " , p a r a m s T i t l e : " 正 则 表 达 式 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 0 } , { t y p e : " u s e r - a g e n t - r e g e x p " , n a m e : " U s e r - A g e n t 正 则 匹 配 " , d e s c r i p t i o n : " 使 用 正 则 表 达 式 检 查 U s e r - A g e n t 中 是 否 含 有 某 些 浏 览 器 和 系 统 标 识 " , c o m p o n e n t : " h t t p - c o n d - u s e r - a g e n t - r e g e x p " , p a r a m s T i t l e : " 正 则 表 达 式 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 0 } , { t y p e : " p a r a m s " , n a m e : " 参 数 匹 配 " , d e s c r i p t i o n : " 根 据 参 数 值 进 行 匹 配 " , c o m p o n e n t : " h t t p - c o n d - p a r a m s " , p a r a m s T i t l e : " 参 数 配 置 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 1 } , { t y p e : " u r l - n o t - e x t e n s i o n " , n a m e : " 排 除 : U R L 扩 展 名 " , d e s c r i p t i o n : " 根 据 U R L 中 的 文 件 路 径 扩 展 名 进 行 过 滤 " , c o m p o n e n t : " h t t p - c o n d - u r l - n o t - e x t e n s i o n " , p a r a m s T i t l e : " 扩 展 名 列 表 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 1 } , { t y p e : " u r l - n o t - p r e f i x " , n a m e : " 排 除 : U R L 前 缀 " , d e s c r i p t i o n : " 根 据 U R L 中 的 文 件 路 径 前 缀 进 行 过 滤 " , c o m p o n e n t : " h t t p - c o n d - u r l - n o t - p r e f i x " , p a r a m s T i t l e : " U R L 前 缀 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 0 } , { t y p e : " u r l - n o t - e q " , n a m e : " 排 除 : U R L 精 准 匹 配 " , d e s c r i p t i o n : " 检 查 U R L 中 的 文 件 路 径 是 否 一 致 " , c o m p o n e n t : " h t t p - c o n d - u r l - n o t - e q " , p a r a m s T i t l e : " U R L 完 整 路 径 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 0 } , { t y p e : " u r l - n o t - r e g e x p " , n a m e : " 排 除 : U R L 正 则 匹 配 " , d e s c r i p t i o n : " 使 用 正 则 表 达 式 检 查 U R L 中 的 文 件 路 径 是 否 一 致 , 如 果 一 致 , 则 不 匹 配 " , c o m p o n e n t : " h t t p - c o n d - u r l - n o t - r e g e x p " , p a r a m s T i t l e : " 正 则 表 达 式 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 0 } , { t y p e : " u s e r - a g e n t - n o t - r e g e x p " , n a m e : " 排 除 : U s e r - A g e n t 正 则 匹 配 " , d e s c r i p t i o n : " 使 用 正 则 表 达 式 检 查 U s e r - A g e n t 中 是 否 含 有 某 些 浏 览 器 和 系 统 标 识 , 如 果 含 有 , 则 不 匹 配 " , c o m p o n e n t : " h t t p - c o n d - u s e r - a g e n t - n o t - r e g e x p " , p a r a m s T i t l e : " 正 则 表 达 式 " , i s R e q u e s t : ! 0 , c a s e I n s e n s i t i v e : ! 0 } , { t y p e : " m i m e - t y p e " , n a m e : " 内 容 M i m e T y p e " , d e s c r i p t i o n : " 根 据 服 务 器 返 回 的 内 容 的 M i m e T y p e 进 行 过 滤 。 注 意 : 当 用 于 缓 存 条 件 时 , 此 条 件 需 要 结 合 别 的 请 求 条 件 使 用 。 " , c o m p o n e n t : " h t t p - c o n d - m i m e - t y p e " , p a r a m s T i t l e : " M i m e T y p e 列 表 " , i s R e q u e s t : ! 1 , c a s e I n s e n s i t i v e : ! 1 } ] , w i n d o w . R E Q U E S T _ C O N D _ O P E R A T O R S = [ { d e s c r i p t i o n : " 判 断 是 否 正 则 表 达 式 匹 配 " , n a m e : " 正 则 表 达 式 匹 配 " , o p : " r e g e x p " } , { d e s c r i p t i o n : " 判 断 是 否 正 则 表 达 式 不 匹 配 " , n a m e : " 正 则 表 达 式 不 匹 配 " , o p : " n o t r e g e x p " } , { d e s c r i p t i o n : " 使 用 字 符 串 对 比 参 数 值 是 否 相 等 于 某 个 值 " , n a m e : " 字 符 串 等 于 " , o p : " e q " } , { d e s c r i p t i o n : " 参 数 值 包 含 某 个 前 缀 " , n a m e : " 字 符 串 前 缀 " , o p : " p r e f i x " } , { d e s c r i p t i o n : " 参 数 值 包 含 某 个 后 缀 " , n a m e : " 字 符 串 后 缀 " , o p : " s u f f i x " } , { d e s c r i p t i o n : " 参 数 值 包 含 另 外 一 个 字 符 串 " , n a m e : " 字 符 串 包 含 " , o p : " c o n t a i n s " } , { d e s c r i p t i o n : " 参 数 值 不 包 含 另 外 一 个 字 符 串 " , n a m e : " 字 符 串 不 包 含 " , o p : " n o t c o n t a i n s " } , { d e s c r i p t i o n : " 使 用 字 符 串 对 比 参 数 值 是 否 不 相 等 于 某 个 值 " , n a m e : " 字 符 串 不 等 于 " , o p : " n o t " } , { d e s c r i p t i o n : " 判 断 参 数 值 在 某 个 列 表 中 " , n a m e : " 在 列 表 中 " , o p : " i n " } , { d e s c r i p t i o n : " 判 断 参 数 值 不 在 某 个 列 表 中 " , n a m e : " 不 在 列 表 中 " , o p : " n o t i n " } , { d e s c r i p t i o n : " 判 断 小 写 的 扩 展 名 ( 不 带 点 ) 在 某 个 列 表 中 " , n a m e : " 扩 展 名 " , o p : " f i l e e x t " } , { d e s c r i p t i o n : " 判 断 M i m e T y p e 在 某 个 列 表 中 , 支 持 类 似 于 i m a g e / * 的 语 法 " , n a m e : " M i m e T y p e " , o p : " m i m e t y p e " } , { d e s c r i p t i o n : " 判 断 版 本 号 在 某 个 范 围 内 , 格 式 为 v e r s i o n 1 , v e r s i o n 2 " , n a m e : " 版 本 号 范 围 " , o p : " v e r s i o n r a n g e " } , { d e s c r i p t i o n : " 将 参 数 转 换 为 整 数 数 字 后 进 行 对 比 " , n a m e : " 整 数 等 <EFBFBD> <EFBFBD>