mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	节点增加DNS解析库类型设置
This commit is contained in:
		@@ -4,7 +4,6 @@ package nodeutils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
@@ -72,15 +71,7 @@ func InitNodeInfo(parentAction *actionutils.ParentAction, nodeId int64) (*pb.Nod
 | 
			
		||||
				(node.MaxCacheMemoryCapacity != nil && node.MaxCacheMemoryCapacity.Count > 0),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	if teaconst.IsPlus {
 | 
			
		||||
		menuItems = append(menuItems, []maps.Map{
 | 
			
		||||
			{
 | 
			
		||||
				"name":     "阈值设置",
 | 
			
		||||
				"url":      prefix + "/settings/thresholds?" + query,
 | 
			
		||||
				"isActive": menuItem == "threshold",
 | 
			
		||||
			},
 | 
			
		||||
		}...)
 | 
			
		||||
	}
 | 
			
		||||
	menuItems = filterMenuItems(menuItems, menuItem, prefix, query)
 | 
			
		||||
	menuItems = append(menuItems, []maps.Map{
 | 
			
		||||
		{
 | 
			
		||||
			"name":     "SSH设置",
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,13 @@
 | 
			
		||||
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
			
		||||
//go:build !plus
 | 
			
		||||
// +build !plus
 | 
			
		||||
 | 
			
		||||
package nodeutils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func filterMenuItems(menuItems []maps.Map, menuItem string, prefix string, query string) []maps.Map {
 | 
			
		||||
	return menuItems
 | 
			
		||||
}
 | 
			
		||||
@@ -3,8 +3,10 @@
 | 
			
		||||
package system
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/node/nodeutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/actions"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
@@ -32,6 +34,22 @@ func (this *IndexAction) RunGet(params struct {
 | 
			
		||||
	var nodeMap = this.Data["node"].(maps.Map)
 | 
			
		||||
	nodeMap["maxCPU"] = node.MaxCPU
 | 
			
		||||
 | 
			
		||||
	// DNS
 | 
			
		||||
	dnsResolverResp, err := this.RPC().NodeRPC().FindNodeDNSResolver(this.AdminContext(), &pb.FindNodeDNSResolverRequest{NodeId: params.NodeId})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	var dnsResolverConfig = nodeconfigs.DefaultDNSResolverConfig()
 | 
			
		||||
	if len(dnsResolverResp.DnsResolverJSON) > 0 {
 | 
			
		||||
		err = json.Unmarshal(dnsResolverResp.DnsResolverJSON, dnsResolverConfig)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			this.ErrorPage(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	this.Data["dnsResolverConfig"] = dnsResolverConfig
 | 
			
		||||
 | 
			
		||||
	this.Show()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -39,6 +57,8 @@ func (this *IndexAction) RunPost(params struct {
 | 
			
		||||
	NodeId int64
 | 
			
		||||
	MaxCPU int32
 | 
			
		||||
 | 
			
		||||
	DnsResolverJSON []byte
 | 
			
		||||
 | 
			
		||||
	Must *actions.Must
 | 
			
		||||
	CSRF *actionutils.CSRF
 | 
			
		||||
}) {
 | 
			
		||||
@@ -57,5 +77,26 @@ func (this *IndexAction) RunPost(params struct {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var dnsResolverConfig = nodeconfigs.DefaultDNSResolverConfig()
 | 
			
		||||
	err = json.Unmarshal(params.DnsResolverJSON, dnsResolverConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = dnsResolverConfig.Init()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.Fail("校验DNS解析配置失败:" + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = this.RPC().NodeRPC().UpdateNodeDNSResolver(this.AdminContext(), &pb.UpdateNodeDNSResolverRequest{
 | 
			
		||||
		NodeId:          params.NodeId,
 | 
			
		||||
		DnsResolverJSON: params.DnsResolverJSON,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		this.ErrorPage(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	this.Success()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3866,7 +3866,7 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio
 | 
			
		||||
		<div class="ui field" :class="{error: hasSecondError}"><input type="text" v-model="second" maxlength="2" style="width:4em" placeholder="秒" @input="change"/></div>
 | 
			
		||||
	</div>
 | 
			
		||||
	<p class="comment">常用时间:<a href="" @click.prevent="nextDays(1)">  1天  </a> <span class="disabled">|</span> <a href="" @click.prevent="nextDays(3)">  3天  </a> <span class="disabled">|</span> <a href="" @click.prevent="nextDays(7)">  一周  </a> <span class="disabled">|</span> <a href="" @click.prevent="nextDays(30)">  30天  </a> </p>
 | 
			
		||||
</div>`}),Vue.component("label-on",{props:["v-is-on"],template:'<div><span v-if="vIsOn" class="ui label tiny green basic">已启用</span><span v-if="!vIsOn" class="ui label tiny red basic">已停用</span></div>'}),Vue.component("code-label",{methods:{click:function(e){this.$emit("click",e)}},template:'<span class="ui label basic tiny" style="padding: 3px;margin-left:2px;margin-right:2px" @click.prevent="click"><slot></slot></span>'}),Vue.component("code-label-plain",{template:'<span class="ui label basic tiny" style="padding: 3px;margin-left:2px;margin-right:2px"><slot></slot></span>'}),Vue.component("tiny-label",{template:'<span class="ui label tiny" style="margin-bottom: 0.5em"><slot></slot></span>'}),Vue.component("tiny-basic-label",{template:'<span class="ui label tiny basic" style="margin-bottom: 0.5em"><slot></slot></span>'}),Vue.component("micro-basic-label",{template:'<span class="ui label tiny basic" style="margin-bottom: 0.5em; font-size: 0.7em; padding: 4px"><slot></slot></span>'}),Vue.component("grey-label",{props:["color"],data:function(){let e="grey";return{labelColor:e=null!=this.color&&0<this.color.length?"red":e}},template:'<span class="ui label basic tiny" :class="labelColor" style="margin-top: 0.4em; font-size: 0.7em; border: 1px solid #ddd!important; font-weight: normal;"><slot></slot></span>'}),Vue.component("optional-label",{template:'<em><span class="grey">(可选)</span></em>'}),Vue.component("plus-label",{template:'<span style="color: #B18701;">Plus专属功能。</span>'}),Vue.component("first-menu",{props:[],template:' \t\t<div class="first-menu"> \t\t\t<div class="ui menu text blue small">\t\t\t\t<slot></slot>\t\t\t</div> \t\t\t<div class="ui divider"></div> \t\t</div>'}),Vue.component("more-options-indicator",{data:function(){return{visible:!1}},methods:{changeVisible:function(){this.visible=!this.visible,null!=Tea.Vue&&(Tea.Vue.moreOptionsVisible=this.visible),this.$emit("change",this.visible)}},template:'<a href="" style="font-weight: normal" @click.prevent="changeVisible()"><slot><span v-if="!visible">更多选项</span><span v-if="visible">收起选项</span></slot> <i class="icon angle" :class="{down:!visible, up:visible}"></i> </a>'}),Vue.component("page-size-selector",{data:function(){let t=window.location.search,i=10;if(0<t.length){let e=(t=t.substr(1)).split("&");e.forEach(function(t){t=t.split("=");if(2==t.length&&"pageSize"==t[0]){let e=t[1];e.match(/^\d+$/)&&(i=parseInt(e,10),(isNaN(i)||i<1)&&(i=10))}})}return{pageSize:i}},watch:{pageSize:function(){window.ChangePageSize(this.pageSize)}},template:`<select class="ui dropdown" style="height:34px;padding-top:0;padding-bottom:0;margin-left:1em;color:#666" v-model="pageSize">
 | 
			
		||||
</div>`}),Vue.component("label-on",{props:["v-is-on"],template:'<div><span v-if="vIsOn" class="ui label tiny green basic">已启用</span><span v-if="!vIsOn" class="ui label tiny red basic">已停用</span></div>'}),Vue.component("code-label",{methods:{click:function(e){this.$emit("click",e)}},template:'<span class="ui label basic tiny" style="padding: 3px;margin-left:2px;margin-right:2px" @click.prevent="click"><slot></slot></span>'}),Vue.component("code-label-plain",{template:'<span class="ui label basic tiny" style="padding: 3px;margin-left:2px;margin-right:2px"><slot></slot></span>'}),Vue.component("tiny-label",{template:'<span class="ui label tiny" style="margin-bottom: 0.5em"><slot></slot></span>'}),Vue.component("tiny-basic-label",{template:'<span class="ui label tiny basic" style="margin-bottom: 0.5em"><slot></slot></span>'}),Vue.component("micro-basic-label",{template:'<span class="ui label tiny basic" style="margin-bottom: 0.5em; font-size: 0.7em; padding: 4px"><slot></slot></span>'}),Vue.component("grey-label",{props:["color"],data:function(){let e="grey";return{labelColor:e=null!=this.color&&0<this.color.length?"red":e}},template:'<span class="ui label basic tiny" :class="labelColor" style="margin-top: 0.4em; font-size: 0.7em; border: 1px solid #ddd!important; font-weight: normal;"><slot></slot></span>'}),Vue.component("optional-label",{template:'<em><span class="grey">(可选)</span></em>'}),Vue.component("plus-label",{template:'<span style="color: #B18701;">Plus专属功能。</span>'}),Vue.component("pro-warning-label",{template:'<span><i class="icon warning circle"></i>注意:通常不需要修改;如要修改,请在专家指导下进行。</span>'}),Vue.component("first-menu",{props:[],template:' \t\t<div class="first-menu"> \t\t\t<div class="ui menu text blue small">\t\t\t\t<slot></slot>\t\t\t</div> \t\t\t<div class="ui divider"></div> \t\t</div>'}),Vue.component("more-options-indicator",{data:function(){return{visible:!1}},methods:{changeVisible:function(){this.visible=!this.visible,null!=Tea.Vue&&(Tea.Vue.moreOptionsVisible=this.visible),this.$emit("change",this.visible)}},template:'<a href="" style="font-weight: normal" @click.prevent="changeVisible()"><slot><span v-if="!visible">更多选项</span><span v-if="visible">收起选项</span></slot> <i class="icon angle" :class="{down:!visible, up:visible}"></i> </a>'}),Vue.component("page-size-selector",{data:function(){let t=window.location.search,i=10;if(0<t.length){let e=(t=t.substr(1)).split("&");e.forEach(function(t){t=t.split("=");if(2==t.length&&"pageSize"==t[0]){let e=t[1];e.match(/^\d+$/)&&(i=parseInt(e,10),(isNaN(i)||i<1)&&(i=10))}})}return{pageSize:i}},watch:{pageSize:function(){window.ChangePageSize(this.pageSize)}},template:`<select class="ui dropdown" style="height:34px;padding-top:0;padding-bottom:0;margin-left:1em;color:#666" v-model="pageSize">
 | 
			
		||||
	<option value="10">[每页]</option><option value="10" selected="selected">10条</option><option value="20">20条</option><option value="30">30条</option><option value="40">40条</option><option value="50">50条</option><option value="60">60条</option><option value="70">70条</option><option value="80">80条</option><option value="90">90条</option><option value="100">100条</option>
 | 
			
		||||
</select>`}),Vue.component("second-menu",{template:' \t\t<div class="second-menu"> \t\t\t<div class="ui menu text blue small">\t\t\t\t<slot></slot>\t\t\t</div> \t\t\t<div class="ui divider"></div> \t\t</div>'}),Vue.component("loading-message",{template:`<div class="ui message loading">
 | 
			
		||||
        <div class="ui active inline loader small"></div>    <slot></slot>
 | 
			
		||||
@@ -4456,6 +4456,20 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio
 | 
			
		||||
	<div v-if="domainName.length == 0">
 | 
			
		||||
		<a href="" @click.prevent="select()">[选择域名]</a>
 | 
			
		||||
	</div>
 | 
			
		||||
</div>`}),Vue.component("dns-resolver-config-box",{props:["v-dns-resolver-config"],data:function(){let e=this.vDnsResolverConfig;return{config:e=null==e?{type:"default"}:e,types:[{name:"默认",code:"default"},{name:"CGO",code:"cgo"},{name:"Go原生",code:"goNative"}]}},template:`<div>
 | 
			
		||||
	<input type="hidden" name="dnsResolverJSON" :value="JSON.stringify(config)"/>
 | 
			
		||||
	<table class="ui table definition selectable">
 | 
			
		||||
		<tr>
 | 
			
		||||
			<td class="title">使用的DNS解析库</td>
 | 
			
		||||
			<td>
 | 
			
		||||
				<select class="ui dropdown auto-width" v-model="config.type">
 | 
			
		||||
					<option v-for="t in types" :value="t.code">{{t.name}}</option>
 | 
			
		||||
				</select>
 | 
			
		||||
				<p class="comment">修改此项配置后,需要重启节点进程才会生效。<pro-warning-label></pro-warning-label></p>
 | 
			
		||||
			</td>
 | 
			
		||||
		</tr>
 | 
			
		||||
	</table>
 | 
			
		||||
	<div class="margin"></div>
 | 
			
		||||
</div>`}),Vue.component("grant-selector",{props:["v-grant","v-node-cluster-id","v-ns-cluster-id"],data:function(){return{grantId:null==this.vGrant?0:this.vGrant.id,grant:this.vGrant,nodeClusterId:null!=this.vNodeClusterId?this.vNodeClusterId:0,nsClusterId:null!=this.vNsClusterId?this.vNsClusterId:0}},methods:{select:function(){let t=this;teaweb.popup("/clusters/grants/selectPopup?nodeClusterId="+this.nodeClusterId+"&nsClusterId="+this.nsClusterId,{callback:e=>{t.grantId=e.data.grant.id,0<t.grantId&&(t.grant=e.data.grant),t.notifyUpdate()},height:"26em"})},create:function(){let t=this;teaweb.popup("/clusters/grants/createPopup",{height:"26em",callback:e=>{t.grantId=e.data.grant.id,0<t.grantId&&(t.grant=e.data.grant),t.notifyUpdate()}})},update:function(){if(null==this.grant)window.location.reload();else{let t=this;teaweb.popup("/clusters/grants/updatePopup?grantId="+this.grant.id,{height:"26em",callback:e=>{t.grant=e.data.grant,t.notifyUpdate()}})}},remove:function(){this.grant=null,this.grantId=0,this.notifyUpdate()},notifyUpdate:function(){this.$emit("change",this.grant)}},template:`<div>
 | 
			
		||||
	<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}})</span><span class="small grey" v-if="grant.username != null && grant.username.length > 0">({{grant.username}})</span> <a href="" title="修改" @click.prevent="update()"><i class="icon pencil small"></i></a> <a href="" title="删除" @click.prevent="remove()"><i class="icon remove"></i></a> </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -11650,6 +11650,12 @@ Vue.component("plus-label", {
 | 
			
		||||
	template: `<span style="color: #B18701;">Plus专属功能。</span>`
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
// 提醒设置项为专业设置
 | 
			
		||||
Vue.component("pro-warning-label", {
 | 
			
		||||
	template: `<span><i class="icon warning circle"></i>注意:通常不需要修改;如要修改,请在专家指导下进行。</span>`
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 一级菜单
 | 
			
		||||
 */
 | 
			
		||||
@@ -14242,6 +14248,50 @@ Vue.component("dns-domain-selector", {
 | 
			
		||||
</div>`
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
Vue.component("dns-resolver-config-box", {
 | 
			
		||||
	props:["v-dns-resolver-config"],
 | 
			
		||||
	data: function () {
 | 
			
		||||
		let config = this.vDnsResolverConfig
 | 
			
		||||
		if (config == null) {
 | 
			
		||||
			config = {
 | 
			
		||||
				type: "default"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return {
 | 
			
		||||
			config: config,
 | 
			
		||||
			types: [
 | 
			
		||||
				{
 | 
			
		||||
					name: "默认",
 | 
			
		||||
					code: "default"
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					name: "CGO",
 | 
			
		||||
					code: "cgo"
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					name: "Go原生",
 | 
			
		||||
					code: "goNative"
 | 
			
		||||
				},
 | 
			
		||||
			]
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	template: `<div>
 | 
			
		||||
	<input type="hidden" name="dnsResolverJSON" :value="JSON.stringify(config)"/>
 | 
			
		||||
	<table class="ui table definition selectable">
 | 
			
		||||
		<tr>
 | 
			
		||||
			<td class="title">使用的DNS解析库</td>
 | 
			
		||||
			<td>
 | 
			
		||||
				<select class="ui dropdown auto-width" v-model="config.type">
 | 
			
		||||
					<option v-for="t in types" :value="t.code">{{t.name}}</option>
 | 
			
		||||
				</select>
 | 
			
		||||
				<p class="comment">修改此项配置后,需要重启节点进程才会生效。<pro-warning-label></pro-warning-label></p>
 | 
			
		||||
			</td>
 | 
			
		||||
		</tr>
 | 
			
		||||
	</table>
 | 
			
		||||
	<div class="margin"></div>
 | 
			
		||||
</div>`
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
Vue.component("grant-selector", {
 | 
			
		||||
	props: ["v-grant", "v-node-cluster-id", "v-ns-cluster-id"],
 | 
			
		||||
	data: function () {
 | 
			
		||||
 
 | 
			
		||||
@@ -57,4 +57,9 @@ Vue.component("optional-label", {
 | 
			
		||||
// Plus专属
 | 
			
		||||
Vue.component("plus-label", {
 | 
			
		||||
	template: `<span style="color: #B18701;">Plus专属功能。</span>`
 | 
			
		||||
})
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
// 提醒设置项为专业设置
 | 
			
		||||
Vue.component("pro-warning-label", {
 | 
			
		||||
	template: `<span><i class="icon warning circle"></i>注意:通常不需要修改;如要修改,请在专家指导下进行。</span>`
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								web/public/js/components/dns/dns-resolver-config-box.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								web/public/js/components/dns/dns-resolver-config-box.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
Vue.component("dns-resolver-config-box", {
 | 
			
		||||
	props:["v-dns-resolver-config"],
 | 
			
		||||
	data: function () {
 | 
			
		||||
		let config = this.vDnsResolverConfig
 | 
			
		||||
		if (config == null) {
 | 
			
		||||
			config = {
 | 
			
		||||
				type: "default"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return {
 | 
			
		||||
			config: config,
 | 
			
		||||
			types: [
 | 
			
		||||
				{
 | 
			
		||||
					name: "默认",
 | 
			
		||||
					code: "default"
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					name: "CGO",
 | 
			
		||||
					code: "cgo"
 | 
			
		||||
				},
 | 
			
		||||
				{
 | 
			
		||||
					name: "Go原生",
 | 
			
		||||
					code: "goNative"
 | 
			
		||||
				},
 | 
			
		||||
			]
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	template: `<div>
 | 
			
		||||
	<input type="hidden" name="dnsResolverJSON" :value="JSON.stringify(config)"/>
 | 
			
		||||
	<table class="ui table definition selectable">
 | 
			
		||||
		<tr>
 | 
			
		||||
			<td class="title">使用的DNS解析库</td>
 | 
			
		||||
			<td>
 | 
			
		||||
				<select class="ui dropdown auto-width" v-model="config.type">
 | 
			
		||||
					<option v-for="t in types" :value="t.code">{{t.name}}</option>
 | 
			
		||||
				</select>
 | 
			
		||||
				<p class="comment">修改此项配置后,需要重启节点进程才会生效。<pro-warning-label></pro-warning-label></p>
 | 
			
		||||
			</td>
 | 
			
		||||
		</tr>
 | 
			
		||||
	</table>
 | 
			
		||||
	<div class="margin"></div>
 | 
			
		||||
</div>`
 | 
			
		||||
})
 | 
			
		||||
@@ -11,10 +11,14 @@
 | 
			
		||||
                <td class="title">CPU线程数</td>
 | 
			
		||||
                <td>
 | 
			
		||||
                    <input type="text" name="maxCPU" v-model="node.maxCPU" style="width:5em" maxlength="4"/>
 | 
			
		||||
                    <p class="comment">当前节点可以使用的最多的CPU线程数,如果为0则默认为4倍的CPU线程数。</p>
 | 
			
		||||
                    <p class="comment">当前节点可以使用的最多的CPU线程数,如果为0则默认为4倍的CPU线程数。<pro-warning-label></pro-warning-label></p>
 | 
			
		||||
                </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
        </table>
 | 
			
		||||
 | 
			
		||||
        <h4>DNS解析</h4>
 | 
			
		||||
        <dns-resolver-config-box :v-dns-resolver-config="dnsResolverConfig"></dns-resolver-config-box>
 | 
			
		||||
 | 
			
		||||
        <submit-btn></submit-btn>
 | 
			
		||||
    </form>
 | 
			
		||||
</div>
 | 
			
		||||
		Reference in New Issue
	
	Block a user