mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 13:10:26 +08:00 
			
		
		
		
	商业版支持L2节点
This commit is contained in:
		@@ -33,7 +33,7 @@ func (this *DetailAction) RunGet(params struct {
 | 
				
			|||||||
		this.ErrorPage(err)
 | 
							this.ErrorPage(err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	node := nodeResp.Node
 | 
						var node = nodeResp.Node
 | 
				
			||||||
	if node == nil {
 | 
						if node == nil {
 | 
				
			||||||
		this.WriteString("找不到要操作的节点")
 | 
							this.WriteString("找不到要操作的节点")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -197,7 +197,7 @@ func (this *DetailAction) RunGet(params struct {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 运行状态
 | 
						// 运行状态
 | 
				
			||||||
	status := &nodeconfigs.NodeStatus{}
 | 
						var status = &nodeconfigs.NodeStatus{}
 | 
				
			||||||
	if len(node.StatusJSON) > 0 {
 | 
						if len(node.StatusJSON) > 0 {
 | 
				
			||||||
		err = json.Unmarshal(node.StatusJSON, &status)
 | 
							err = json.Unmarshal(node.StatusJSON, &status)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -285,6 +285,8 @@ func (this *DetailAction) RunGet(params struct {
 | 
				
			|||||||
		"isOn":              node.IsOn,
 | 
							"isOn":              node.IsOn,
 | 
				
			||||||
		"records":           recordMaps,
 | 
							"records":           recordMaps,
 | 
				
			||||||
		"routes":            routeMaps,
 | 
							"routes":            routeMaps,
 | 
				
			||||||
 | 
							"level":             node.Level,
 | 
				
			||||||
 | 
							"levelInfo":         nodeconfigs.FindNodeLevel(int(node.Level)),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		"status": maps.Map{
 | 
							"status": maps.Map{
 | 
				
			||||||
			"isActive":             status.IsActive,
 | 
								"isActive":             status.IsActive,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,6 +38,7 @@ func InitNodeInfo(parentAction *actionutils.ParentAction, nodeId int64) (*pb.Nod
 | 
				
			|||||||
		"isOn":  node.IsOn,
 | 
							"isOn":  node.IsOn,
 | 
				
			||||||
		"isUp":  node.IsUp,
 | 
							"isUp":  node.IsUp,
 | 
				
			||||||
		"group": groupMap,
 | 
							"group": groupMap,
 | 
				
			||||||
 | 
							"level": node.Level,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var clusterId int64 = 0
 | 
						var clusterId int64 = 0
 | 
				
			||||||
	if node.NodeCluster != nil {
 | 
						if node.NodeCluster != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,7 +37,7 @@ func (this *UpdateAction) RunGet(params struct {
 | 
				
			|||||||
		this.ErrorPage(err)
 | 
							this.ErrorPage(err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	node := nodeResp.Node
 | 
						var node = nodeResp.Node
 | 
				
			||||||
	if node == nil {
 | 
						if node == nil {
 | 
				
			||||||
		this.WriteString("找不到要操作的节点")
 | 
							this.WriteString("找不到要操作的节点")
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -97,7 +97,7 @@ func (this *UpdateAction) RunGet(params struct {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var m = maps.Map{
 | 
						var nodeMap = maps.Map{
 | 
				
			||||||
		"id":          node.Id,
 | 
							"id":          node.Id,
 | 
				
			||||||
		"name":        node.Name,
 | 
							"name":        node.Name,
 | 
				
			||||||
		"ipAddresses": ipAddressMaps,
 | 
							"ipAddresses": ipAddressMaps,
 | 
				
			||||||
@@ -105,15 +105,16 @@ func (this *UpdateAction) RunGet(params struct {
 | 
				
			|||||||
		"isOn":        node.IsOn,
 | 
							"isOn":        node.IsOn,
 | 
				
			||||||
		"group":       groupMap,
 | 
							"group":       groupMap,
 | 
				
			||||||
		"region":      regionMap,
 | 
							"region":      regionMap,
 | 
				
			||||||
 | 
							"level":       node.Level,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if node.NodeCluster != nil {
 | 
						if node.NodeCluster != nil {
 | 
				
			||||||
		m["primaryCluster"] = maps.Map{
 | 
							nodeMap["primaryCluster"] = maps.Map{
 | 
				
			||||||
			"id":   node.NodeCluster.Id,
 | 
								"id":   node.NodeCluster.Id,
 | 
				
			||||||
			"name": node.NodeCluster.Name,
 | 
								"name": node.NodeCluster.Name,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		m["primaryCluster"] = nil
 | 
							nodeMap["primaryCluster"] = nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(node.SecondaryNodeClusters) > 0 {
 | 
						if len(node.SecondaryNodeClusters) > 0 {
 | 
				
			||||||
@@ -124,12 +125,12 @@ func (this *UpdateAction) RunGet(params struct {
 | 
				
			|||||||
				"name": cluster.Name,
 | 
									"name": cluster.Name,
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		m["secondaryClusters"] = secondaryClusterMaps
 | 
							nodeMap["secondaryClusters"] = secondaryClusterMaps
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		m["secondaryClusters"] = []interface{}{}
 | 
							nodeMap["secondaryClusters"] = []interface{}{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	this.Data["node"] = m
 | 
						this.Data["node"] = nodeMap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	this.Show()
 | 
						this.Show()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -144,11 +145,12 @@ func (this *UpdateAction) RunPost(params struct {
 | 
				
			|||||||
	PrimaryClusterId    int64
 | 
						PrimaryClusterId    int64
 | 
				
			||||||
	SecondaryClusterIds []byte
 | 
						SecondaryClusterIds []byte
 | 
				
			||||||
	IsOn                bool
 | 
						IsOn                bool
 | 
				
			||||||
 | 
						Level               int32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Must *actions.Must
 | 
						Must *actions.Must
 | 
				
			||||||
}) {
 | 
					}) {
 | 
				
			||||||
	// 创建日志
 | 
						// 创建日志
 | 
				
			||||||
	defer this.CreateLog(oplogs.LevelInfo, "修改节点 %d", params.NodeId)
 | 
						defer this.CreateLog(oplogs.LevelInfo, "修改节点 %d 基本信息", params.NodeId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if params.NodeId <= 0 {
 | 
						if params.NodeId <= 0 {
 | 
				
			||||||
		this.Fail("要操作的节点不存在")
 | 
							this.Fail("要操作的节点不存在")
 | 
				
			||||||
@@ -194,6 +196,7 @@ func (this *UpdateAction) RunPost(params struct {
 | 
				
			|||||||
		NodeClusterId:           params.PrimaryClusterId,
 | 
							NodeClusterId:           params.PrimaryClusterId,
 | 
				
			||||||
		SecondaryNodeClusterIds: secondaryClusterIds,
 | 
							SecondaryNodeClusterIds: secondaryClusterIds,
 | 
				
			||||||
		IsOn:                    params.IsOn,
 | 
							IsOn:                    params.IsOn,
 | 
				
			||||||
 | 
							Level:                   params.Level,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		this.ErrorPage(err)
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@ package cluster
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
@@ -29,6 +30,7 @@ func (this *NodesAction) RunGet(params struct {
 | 
				
			|||||||
	InstalledState int
 | 
						InstalledState int
 | 
				
			||||||
	ActiveState    int
 | 
						ActiveState    int
 | 
				
			||||||
	Keyword        string
 | 
						Keyword        string
 | 
				
			||||||
 | 
						Level          int32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CpuOrder        string
 | 
						CpuOrder        string
 | 
				
			||||||
	MemoryOrder     string
 | 
						MemoryOrder     string
 | 
				
			||||||
@@ -40,6 +42,7 @@ func (this *NodesAction) RunGet(params struct {
 | 
				
			|||||||
	this.Data["installState"] = params.InstalledState
 | 
						this.Data["installState"] = params.InstalledState
 | 
				
			||||||
	this.Data["activeState"] = params.ActiveState
 | 
						this.Data["activeState"] = params.ActiveState
 | 
				
			||||||
	this.Data["keyword"] = params.Keyword
 | 
						this.Data["keyword"] = params.Keyword
 | 
				
			||||||
 | 
						this.Data["level"] = params.Level
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 集群是否已经设置了线路
 | 
						// 集群是否已经设置了线路
 | 
				
			||||||
	clusterDNSResp, err := this.RPC().NodeClusterRPC().FindEnabledNodeClusterDNS(this.AdminContext(), &pb.FindEnabledNodeClusterDNSRequest{NodeClusterId: params.ClusterId})
 | 
						clusterDNSResp, err := this.RPC().NodeClusterRPC().FindEnabledNodeClusterDNS(this.AdminContext(), &pb.FindEnabledNodeClusterDNSRequest{NodeClusterId: params.ClusterId})
 | 
				
			||||||
@@ -63,6 +66,7 @@ func (this *NodesAction) RunGet(params struct {
 | 
				
			|||||||
		NodeClusterId: params.ClusterId,
 | 
							NodeClusterId: params.ClusterId,
 | 
				
			||||||
		NodeGroupId:   params.GroupId,
 | 
							NodeGroupId:   params.GroupId,
 | 
				
			||||||
		NodeRegionId:  params.RegionId,
 | 
							NodeRegionId:  params.RegionId,
 | 
				
			||||||
 | 
							Level:         params.Level,
 | 
				
			||||||
		InstallState:  types.Int32(params.InstalledState),
 | 
							InstallState:  types.Int32(params.InstalledState),
 | 
				
			||||||
		ActiveState:   types.Int32(params.ActiveState),
 | 
							ActiveState:   types.Int32(params.ActiveState),
 | 
				
			||||||
		Keyword:       params.Keyword,
 | 
							Keyword:       params.Keyword,
 | 
				
			||||||
@@ -81,6 +85,7 @@ func (this *NodesAction) RunGet(params struct {
 | 
				
			|||||||
		NodeClusterId: params.ClusterId,
 | 
							NodeClusterId: params.ClusterId,
 | 
				
			||||||
		NodeGroupId:   params.GroupId,
 | 
							NodeGroupId:   params.GroupId,
 | 
				
			||||||
		NodeRegionId:  params.RegionId,
 | 
							NodeRegionId:  params.RegionId,
 | 
				
			||||||
 | 
							Level:         params.Level,
 | 
				
			||||||
		InstallState:  types.Int32(params.InstalledState),
 | 
							InstallState:  types.Int32(params.InstalledState),
 | 
				
			||||||
		ActiveState:   types.Int32(params.ActiveState),
 | 
							ActiveState:   types.Int32(params.ActiveState),
 | 
				
			||||||
		Keyword:       params.Keyword,
 | 
							Keyword:       params.Keyword,
 | 
				
			||||||
@@ -210,6 +215,7 @@ func (this *NodesAction) RunGet(params struct {
 | 
				
			|||||||
			"group":             groupMap,
 | 
								"group":             groupMap,
 | 
				
			||||||
			"region":            regionMap,
 | 
								"region":            regionMap,
 | 
				
			||||||
			"dnsRouteNames":     dnsRouteNames,
 | 
								"dnsRouteNames":     dnsRouteNames,
 | 
				
			||||||
 | 
								"level":             node.Level,
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	this.Data["nodes"] = nodeMaps
 | 
						this.Data["nodes"] = nodeMaps
 | 
				
			||||||
@@ -257,6 +263,12 @@ func (this *NodesAction) RunGet(params struct {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	this.Data["regions"] = regionMaps
 | 
						this.Data["regions"] = regionMaps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 级别
 | 
				
			||||||
 | 
						this.Data["levels"] = []maps.Map{}
 | 
				
			||||||
 | 
						if teaconst.IsPlus {
 | 
				
			||||||
 | 
							this.Data["levels"] = nodeconfigs.FindAllNodeLevels()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 记录最近访问
 | 
						// 记录最近访问
 | 
				
			||||||
	_, err = this.RPC().LatestItemRPC().IncreaseLatestItem(this.AdminContext(), &pb.IncreaseLatestItemRequest{
 | 
						_, err = this.RPC().LatestItemRPC().IncreaseLatestItem(this.AdminContext(), &pb.IncreaseLatestItemRequest{
 | 
				
			||||||
		ItemType: "cluster",
 | 
							ItemType: "cluster",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								web/public/js/components/node/node-level-selector.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								web/public/js/components/node/node-level-selector.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					// 节点级别选择器
 | 
				
			||||||
 | 
					Vue.component("node-level-selector", {
 | 
				
			||||||
 | 
						props: ["v-node-level"],
 | 
				
			||||||
 | 
						data: function () {
 | 
				
			||||||
 | 
							let levelCode = this.vNodeLevel
 | 
				
			||||||
 | 
							if (levelCode == null || levelCode < 1) {
 | 
				
			||||||
 | 
								levelCode = 1
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								levels: [
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										name: "边缘节点",
 | 
				
			||||||
 | 
										code: 1,
 | 
				
			||||||
 | 
										description: "普通的边缘节点。"
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										name: "L2节点",
 | 
				
			||||||
 | 
										code: 2,
 | 
				
			||||||
 | 
										description: "特殊的边缘节点,同时负责同组上一级节点的回源。"
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								levelCode: levelCode
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						template: `<div>
 | 
				
			||||||
 | 
						<select class="ui dropdown auto-width" name="level" v-model="levelCode">
 | 
				
			||||||
 | 
						<option v-for="level in levels" :value="level.code">{{level.name}}</option>
 | 
				
			||||||
 | 
					</select>
 | 
				
			||||||
 | 
					<p class="comment" v-if="typeof(levels[levelCode - 1]) != null">{{levels[levelCode - 1].description}}</p>
 | 
				
			||||||
 | 
					</div>`
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
@@ -14,18 +14,18 @@
 | 
				
			|||||||
					<p class="comment">每行一个节点IP。</p>
 | 
										<p class="comment">每行一个节点IP。</p>
 | 
				
			||||||
				</td>
 | 
									</td>
 | 
				
			||||||
			</tr>
 | 
								</tr>
 | 
				
			||||||
            <tr>
 | 
					 | 
				
			||||||
                <td>所属区域</td>
 | 
					 | 
				
			||||||
                <td>
 | 
					 | 
				
			||||||
                    <node-region-selector></node-region-selector>
 | 
					 | 
				
			||||||
                    <p class="comment">设置区域后才能根据区域进行流量统计和计费。</p>
 | 
					 | 
				
			||||||
                </td>
 | 
					 | 
				
			||||||
            </tr>
 | 
					 | 
				
			||||||
			<tr>
 | 
								<tr>
 | 
				
			||||||
				<td>所属分组</td>
 | 
									<td>所属分组</td>
 | 
				
			||||||
				<td>
 | 
									<td>
 | 
				
			||||||
					<node-group-selector :v-cluster-id="clusterId"></node-group-selector>
 | 
										<node-group-selector :v-cluster-id="clusterId"></node-group-selector>
 | 
				
			||||||
                    <p class="comment">仅用来筛选服务。</p>
 | 
					                    <p class="comment">用来筛选节点<span v-if="teaIsPlus">,同时可以在分组中设置二级缓存节点</span>。</p>
 | 
				
			||||||
 | 
									</td>
 | 
				
			||||||
 | 
								</tr>
 | 
				
			||||||
 | 
					            <tr>
 | 
				
			||||||
 | 
					                <td>所属区域</td>
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                    <node-region-selector></node-region-selector>
 | 
				
			||||||
 | 
					                    <p class="comment">设置区域后可以根据区域进行流量统计和计费。</p>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
            </tr>
 | 
					            </tr>
 | 
				
			||||||
		</table>
 | 
							</table>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,18 +41,18 @@
 | 
				
			|||||||
					<p class="comment">当前节点对应的DNS线路,可用线路是根据集群设置的域名获取的,注意DNS服务商可能对这些线路有其他限制。</p>
 | 
										<p class="comment">当前节点对应的DNS线路,可用线路是根据集群设置的域名获取的,注意DNS服务商可能对这些线路有其他限制。</p>
 | 
				
			||||||
				</td>
 | 
									</td>
 | 
				
			||||||
			</tr>
 | 
								</tr>
 | 
				
			||||||
            <tr>
 | 
					 | 
				
			||||||
                <td>所属区域</td>
 | 
					 | 
				
			||||||
                <td>
 | 
					 | 
				
			||||||
                    <node-region-selector></node-region-selector>
 | 
					 | 
				
			||||||
                    <p class="comment">设置区域后才能根据区域进行流量统计和计费。</p>
 | 
					 | 
				
			||||||
                </td>
 | 
					 | 
				
			||||||
            </tr>
 | 
					 | 
				
			||||||
			<tr>
 | 
								<tr>
 | 
				
			||||||
				<td>所属分组</td>
 | 
									<td>所属分组</td>
 | 
				
			||||||
				<td>
 | 
									<td>
 | 
				
			||||||
					<node-group-selector :v-cluster-id="clusterId"></node-group-selector>
 | 
										<node-group-selector :v-cluster-id="clusterId"></node-group-selector>
 | 
				
			||||||
                    <p class="comment">仅用来筛选服务。</p>
 | 
					                    <p class="comment">用来筛选节点<span v-if="teaIsPlus">,同时可以在分组中设置二级缓存节点</span>。</p>
 | 
				
			||||||
 | 
									</td>
 | 
				
			||||||
 | 
								</tr>
 | 
				
			||||||
 | 
					            <tr>
 | 
				
			||||||
 | 
					                <td>所属区域</td>
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                    <node-region-selector></node-region-selector>
 | 
				
			||||||
 | 
					                    <p class="comment">设置区域后可以根据区域进行流量统计和计费。</p>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
            </tr>
 | 
					            </tr>
 | 
				
			||||||
			<tr>
 | 
								<tr>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +1,17 @@
 | 
				
			|||||||
<second-menu>
 | 
					<second-menu>
 | 
				
			||||||
    <a :href="'/clusters/cluster/nodes?clusterId=' + clusterId" class="item">{{currentClusterName}}</a>
 | 
					    <a :href="'/clusters/cluster/nodes?clusterId=' + clusterId" class="item">{{currentClusterName}}</a>
 | 
				
			||||||
    <raquo-item></raquo-item>
 | 
					    <raquo-item></raquo-item>
 | 
				
			||||||
    <a :href="'/clusters/cluster/nodes?clusterId=' + clusterId + '&groupId=' + node.group.id" v-if="node.group != null" class="item" style="padding-left: 0">{{node.group.name}}</a>
 | 
					    <a :href="'/clusters/cluster/nodes?clusterId=' + clusterId + '&groupId=' + node.group.id" v-if="node.group != null" class="item">{{node.group.name}}</a>
 | 
				
			||||||
    <raquo-item v-if="node.group != null"></raquo-item>
 | 
					    <raquo-item v-if="node.group != null"></raquo-item>
 | 
				
			||||||
    <menu-item :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">{{node.name}}</menu-item>
 | 
					    <menu-item :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">
 | 
				
			||||||
 | 
					        {{node.name}}
 | 
				
			||||||
 | 
					        <sup v-if="node.level > 1">  <span class="blue">L{{node.level}}</span></sup>
 | 
				
			||||||
 | 
					    </menu-item>
 | 
				
			||||||
    <raquo-item></raquo-item>
 | 
					    <raquo-item></raquo-item>
 | 
				
			||||||
	<menu-item :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id" code="node" v-if="!teaIsPlus">节点详情</menu-item>
 | 
						<menu-item :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id" code="node" v-if="!teaIsPlus">节点详情</menu-item>
 | 
				
			||||||
    <menu-item :href="'/clusters/cluster/node/boards?clusterId=' + clusterId + '&nodeId=' + node.id" code="board" v-if="teaIsPlus">节点看板</menu-item>
 | 
					    <menu-item :href="'/clusters/cluster/node/boards?clusterId=' + clusterId + '&nodeId=' + node.id" code="board" v-if="teaIsPlus">节点看板</menu-item>
 | 
				
			||||||
    <menu-item :href="'/clusters/cluster/node/detail?clusterId=' + clusterId + '&nodeId=' + node.id" code="node" v-if="teaIsPlus">节点详情</menu-item>
 | 
					    <menu-item :href="'/clusters/cluster/node/detail?clusterId=' + clusterId + '&nodeId=' + node.id" code="node" v-if="teaIsPlus">节点详情</menu-item>
 | 
				
			||||||
    <menu-item :href="'/clusters/cluster/node/logs?clusterId=' + clusterId + '&nodeId=' + node.id" code="log">运行日志</menu-item>
 | 
					    <menu-item :href="'/clusters/cluster/node/logs?clusterId=' + clusterId + '&nodeId=' + node.id" code="log">运行日志</menu-item>
 | 
				
			||||||
    <menu-item :href="'/clusters/cluster/node/install?clusterId=' + clusterId + '&nodeId=' + node.id" code="install">安装节点</menu-item>
 | 
					    <menu-item :href="'/clusters/cluster/node/install?clusterId=' + clusterId + '&nodeId=' + node.id" code="install">安装节点</menu-item>
 | 
				
			||||||
	<menu-item :href="'/clusters/cluster/node/update?clusterId=' + clusterId + '&nodeId=' + node.id" code="update">修改设置</menu-item>
 | 
						<menu-item :href="'/clusters/cluster/node/update?clusterId=' + clusterId + '&nodeId=' + node.id" code="update">节点设置</menu-item>
 | 
				
			||||||
</second-menu>
 | 
					</second-menu>
 | 
				
			||||||
@@ -84,6 +84,12 @@
 | 
				
			|||||||
				<span v-else class="disabled">没有设置分组。</span>
 | 
									<span v-else class="disabled">没有设置分组。</span>
 | 
				
			||||||
			</td>
 | 
								</td>
 | 
				
			||||||
		</tr>
 | 
							</tr>
 | 
				
			||||||
 | 
					        <tr v-if="teaIsPlus">
 | 
				
			||||||
 | 
					            <td>级别</td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <span :class="{blue: node.levelInfo.code > 1}">{{node.levelInfo.name}}</span>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
		<tr>
 | 
							<tr>
 | 
				
			||||||
			<td colspan="2"><more-options-indicator>更多选项</more-options-indicator></td>
 | 
								<td colspan="2"><more-options-indicator>更多选项</more-options-indicator></td>
 | 
				
			||||||
		</tr>
 | 
							</tr>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,24 +30,30 @@
 | 
				
			|||||||
                    <p class="comment">用于访问节点和域名解析等。</p>
 | 
					                    <p class="comment">用于访问节点和域名解析等。</p>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
            </tr>
 | 
					            </tr>
 | 
				
			||||||
            <tr>
 | 
					 | 
				
			||||||
                <td>所属区域</td>
 | 
					 | 
				
			||||||
                <td>
 | 
					 | 
				
			||||||
                    <node-region-selector :v-region="node.region"></node-region-selector>
 | 
					 | 
				
			||||||
                    <p class="comment">设置区域后才能根据区域进行流量统计和计费。</p>
 | 
					 | 
				
			||||||
                </td>
 | 
					 | 
				
			||||||
            </tr>
 | 
					 | 
				
			||||||
            <tr>
 | 
					            <tr>
 | 
				
			||||||
                <td>所属分组</td>
 | 
					                <td>所属分组</td>
 | 
				
			||||||
                <td>
 | 
					                <td>
 | 
				
			||||||
                    <node-group-selector :v-cluster-id="clusterId" :v-group="node.group"></node-group-selector>
 | 
					                    <node-group-selector :v-cluster-id="clusterId" :v-group="node.group"></node-group-selector>
 | 
				
			||||||
                    <p class="comment">仅用来筛选服务。</p>
 | 
					                    <p class="comment">用来筛选节点<span v-if="teaIsPlus">,同时可以在分组中设置二级缓存节点</span>。</p>
 | 
				
			||||||
 | 
					                </td>
 | 
				
			||||||
 | 
					            </tr>
 | 
				
			||||||
 | 
					            <tr>
 | 
				
			||||||
 | 
					                <td>所属区域</td>
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                    <node-region-selector :v-region="node.region"></node-region-selector>
 | 
				
			||||||
 | 
					                    <p class="comment">设置区域后可以根据区域进行流量统计和计费。</p>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
            </tr>
 | 
					            </tr>
 | 
				
			||||||
            <tr>
 | 
					            <tr>
 | 
				
			||||||
                <td colspan="2"><more-options-indicator></more-options-indicator></td>
 | 
					                <td colspan="2"><more-options-indicator></more-options-indicator></td>
 | 
				
			||||||
            </tr>
 | 
					            </tr>
 | 
				
			||||||
            <tbody v-show="moreOptionsVisible">
 | 
					            <tbody v-show="moreOptionsVisible">
 | 
				
			||||||
 | 
					                <tr v-if="teaIsPlus">
 | 
				
			||||||
 | 
					                    <td>级别</td>
 | 
				
			||||||
 | 
					                    <td>
 | 
				
			||||||
 | 
					                        <node-level-selector :v-node-level="node.level"></node-level-selector>
 | 
				
			||||||
 | 
					                    </td>
 | 
				
			||||||
 | 
					                </tr>
 | 
				
			||||||
                <tr>
 | 
					                <tr>
 | 
				
			||||||
                    <td>是否启用</td>
 | 
					                    <td>是否启用</td>
 | 
				
			||||||
                    <td>
 | 
					                    <td>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,12 +31,18 @@
 | 
				
			|||||||
				<option value="2">未安装</option>
 | 
									<option value="2">未安装</option>
 | 
				
			||||||
			</select>
 | 
								</select>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
 | 
					        <div class="ui field" v-if="teaIsPlus && levels.length > 0">
 | 
				
			||||||
 | 
					            <select class="ui dropdown" name="level" v-model="level">
 | 
				
			||||||
 | 
					                <option value="0">[级别]</option>
 | 
				
			||||||
 | 
					                <option v-for="levelInfo in levels" :value="levelInfo.code">{{levelInfo.name}}</option>
 | 
				
			||||||
 | 
					            </select>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
		<div class="ui field">
 | 
							<div class="ui field">
 | 
				
			||||||
			<input type="text" name="keyword" placeholder="关键词" v-model="keyword" style="width:10em"/>
 | 
								<input type="text" name="keyword" placeholder="关键词" v-model="keyword" style="width:10em"/>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
		<div class="ui field">
 | 
							<div class="ui field">
 | 
				
			||||||
			<button class="ui button" type="submit">搜索</button>  
 | 
								<button class="ui button" type="submit">搜索</button>  
 | 
				
			||||||
            <a :href="'/clusters/cluster/nodes?clusterId=' + clusterId" v-if="regionId >0 || groupId > 0 || installState > 0 || activeState > 0 || keyword.length > 0">[清除条件]</a>
 | 
					            <a :href="'/clusters/cluster/nodes?clusterId=' + clusterId" v-if="regionId > 0 || groupId > 0 || installState > 0 || activeState > 0 || keyword.length > 0 || level > 0">[清除条件]</a>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
</form>
 | 
					</form>
 | 
				
			||||||
@@ -66,7 +72,7 @@
 | 
				
			|||||||
	</tr>
 | 
						</tr>
 | 
				
			||||||
	</thead>
 | 
						</thead>
 | 
				
			||||||
	<tr v-for="node in nodes">
 | 
						<tr v-for="node in nodes">
 | 
				
			||||||
        <td><a :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">{{node.name}}</a>
 | 
					        <td><a :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">{{node.name}}<sup v-if="node.level > 1"><span class="blue">  L{{node.level}}</span></sup></a>
 | 
				
			||||||
            <div v-if="node.region != null">
 | 
					            <div v-if="node.region != null">
 | 
				
			||||||
                <grey-label>区域:{{node.region.name}}</grey-label>
 | 
					                <grey-label>区域:{{node.region.name}}</grey-label>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
<second-menu>
 | 
					<second-menu>
 | 
				
			||||||
    <menu-item :href="'/clusters/cluster?clusterId=' + clusterId">{{currentClusterName}}</menu-item>
 | 
					    <menu-item :href="'/clusters/cluster?clusterId=' + clusterId">{{currentClusterName}}</menu-item>
 | 
				
			||||||
    <span class="disabled item" style="padding: 0">»</span>
 | 
					    <raquo-item></raquo-item>
 | 
				
			||||||
    <menu-item :href="'/clusters/cluster/settings?clusterId=' + clusterId">设置</menu-item>
 | 
					    <menu-item :href="'/clusters/cluster/settings?clusterId=' + clusterId">集群设置</menu-item>
 | 
				
			||||||
    <span class="disabled item" style="padding: 0" v-if="leftMenuActiveItem != null">»</span>
 | 
					    <raquo-item></raquo-item>
 | 
				
			||||||
    <a class="item active" v-if="leftMenuActiveItem != null" :href="leftMenuActiveItem.url">"{{leftMenuActiveItem.name}}"设置</a>
 | 
					    <a class="item active" v-if="leftMenuActiveItem != null" :href="leftMenuActiveItem.url">"{{leftMenuActiveItem.name}}"设置</a>
 | 
				
			||||||
</second-menu>
 | 
					</second-menu>
 | 
				
			||||||
@@ -30,6 +30,7 @@
 | 
				
			|||||||
                    <span v-if="task.type == 'configChanged'">同步配置</span>
 | 
					                    <span v-if="task.type == 'configChanged'">同步配置</span>
 | 
				
			||||||
                    <span v-if="task.type == 'ipItemChanged'">同步IP名单</span>
 | 
					                    <span v-if="task.type == 'ipItemChanged'">同步IP名单</span>
 | 
				
			||||||
                    <span v-if="task.type == 'scriptsChanged'">同步脚本</span>
 | 
					                    <span v-if="task.type == 'scriptsChanged'">同步脚本</span>
 | 
				
			||||||
 | 
					                    <span v-if="task.type == 'nodeLevelChanged'">同步L2节点</span>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
                <td>
 | 
					                <td>
 | 
				
			||||||
                    <span v-if="task.isDone" class="red">{{task.error}}</span>
 | 
					                    <span v-if="task.isDone" class="red">{{task.error}}</span>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user