mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	实现域名服务器集群管理
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
				
			|||||||
package configloaders
 | 
					package configloaders
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/systemconfigs"
 | 
				
			||||||
@@ -14,6 +15,7 @@ const (
 | 
				
			|||||||
	AdminModuleCodeServer    AdminModuleCode = "server"    // 网站
 | 
						AdminModuleCodeServer    AdminModuleCode = "server"    // 网站
 | 
				
			||||||
	AdminModuleCodeNode      AdminModuleCode = "node"      // 节点
 | 
						AdminModuleCodeNode      AdminModuleCode = "node"      // 节点
 | 
				
			||||||
	AdminModuleCodeDNS       AdminModuleCode = "dns"       // DNS
 | 
						AdminModuleCodeDNS       AdminModuleCode = "dns"       // DNS
 | 
				
			||||||
 | 
						AdminModuleCodeNS        AdminModuleCode = "ns"        // 域名服务
 | 
				
			||||||
	AdminModuleCodeAdmin     AdminModuleCode = "admin"     // 系统用户
 | 
						AdminModuleCodeAdmin     AdminModuleCode = "admin"     // 系统用户
 | 
				
			||||||
	AdminModuleCodeUser      AdminModuleCode = "user"      // 平台用户
 | 
						AdminModuleCodeUser      AdminModuleCode = "user"      // 平台用户
 | 
				
			||||||
	AdminModuleCodeFinance   AdminModuleCode = "finance"   // 财务
 | 
						AdminModuleCodeFinance   AdminModuleCode = "finance"   // 财务
 | 
				
			||||||
@@ -68,7 +70,7 @@ func NotifyAdminModuleMappingChange() error {
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 检查用户是否存在
 | 
					// CheckAdmin 检查用户是否存在
 | 
				
			||||||
func CheckAdmin(adminId int64) bool {
 | 
					func CheckAdmin(adminId int64) bool {
 | 
				
			||||||
	locker.Lock()
 | 
						locker.Lock()
 | 
				
			||||||
	defer locker.Unlock()
 | 
						defer locker.Unlock()
 | 
				
			||||||
@@ -82,7 +84,7 @@ func CheckAdmin(adminId int64) bool {
 | 
				
			|||||||
	return ok
 | 
						return ok
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 检查模块是否允许访问
 | 
					// AllowModule 检查模块是否允许访问
 | 
				
			||||||
func AllowModule(adminId int64, module string) bool {
 | 
					func AllowModule(adminId int64, module string) bool {
 | 
				
			||||||
	locker.Lock()
 | 
						locker.Lock()
 | 
				
			||||||
	defer locker.Unlock()
 | 
						defer locker.Unlock()
 | 
				
			||||||
@@ -103,7 +105,7 @@ func AllowModule(adminId int64, module string) bool {
 | 
				
			|||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 获取管理员第一个可访问模块
 | 
					// FindFirstAdminModule 获取管理员第一个可访问模块
 | 
				
			||||||
func FindFirstAdminModule(adminId int64) (module AdminModuleCode, ok bool) {
 | 
					func FindFirstAdminModule(adminId int64) (module AdminModuleCode, ok bool) {
 | 
				
			||||||
	locker.Lock()
 | 
						locker.Lock()
 | 
				
			||||||
	defer locker.Unlock()
 | 
						defer locker.Unlock()
 | 
				
			||||||
@@ -118,7 +120,7 @@ func FindFirstAdminModule(adminId int64) (module AdminModuleCode, ok bool) {
 | 
				
			|||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 查找某个管理员名称
 | 
					// FindAdminFullname 查找某个管理员名称
 | 
				
			||||||
func FindAdminFullname(adminId int64) string {
 | 
					func FindAdminFullname(adminId int64) string {
 | 
				
			||||||
	locker.Lock()
 | 
						locker.Lock()
 | 
				
			||||||
	defer locker.Unlock()
 | 
						defer locker.Unlock()
 | 
				
			||||||
@@ -130,9 +132,9 @@ func FindAdminFullname(adminId int64) string {
 | 
				
			|||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 所有权限列表
 | 
					// AllModuleMaps 所有权限列表
 | 
				
			||||||
func AllModuleMaps() []maps.Map {
 | 
					func AllModuleMaps() []maps.Map {
 | 
				
			||||||
	return []maps.Map{
 | 
						m := []maps.Map{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"name": "看板",
 | 
								"name": "看板",
 | 
				
			||||||
			"code": AdminModuleCodeDashboard,
 | 
								"code": AdminModuleCodeDashboard,
 | 
				
			||||||
@@ -153,6 +155,15 @@ func AllModuleMaps() []maps.Map {
 | 
				
			|||||||
			"code": AdminModuleCodeDNS,
 | 
								"code": AdminModuleCodeDNS,
 | 
				
			||||||
			"url":  "/dns",
 | 
								"url":  "/dns",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if teaconst.IsPlus {
 | 
				
			||||||
 | 
							m = append(m, maps.Map{
 | 
				
			||||||
 | 
								"name": "域名服务器",
 | 
				
			||||||
 | 
								"code": AdminModuleCodeNS,
 | 
				
			||||||
 | 
								"url":  "/ns",
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						m = append(m, []maps.Map{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"name": "平台用户",
 | 
								"name": "平台用户",
 | 
				
			||||||
			"code": AdminModuleCodeUser,
 | 
								"code": AdminModuleCodeUser,
 | 
				
			||||||
@@ -178,5 +189,6 @@ func AllModuleMaps() []maps.Map {
 | 
				
			|||||||
			"code": AdminModuleCodeSetting,
 | 
								"code": AdminModuleCodeSetting,
 | 
				
			||||||
			"url":  "/settings",
 | 
								"url":  "/settings",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}...)
 | 
				
			||||||
 | 
						return m
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -352,6 +352,10 @@ func (this *RPCClient) LatestItemRPC() pb.LatestItemServiceClient {
 | 
				
			|||||||
	return pb.NewLatestItemServiceClient(this.pickConn())
 | 
						return pb.NewLatestItemServiceClient(this.pickConn())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *RPCClient) NSClusterRPC() pb.NSClusterServiceClient {
 | 
				
			||||||
 | 
						return pb.NewNSClusterServiceClient(this.pickConn())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Context 构造Admin上下文
 | 
					// Context 构造Admin上下文
 | 
				
			||||||
func (this *RPCClient) Context(adminId int64) context.Context {
 | 
					func (this *RPCClient) Context(adminId int64) context.Context {
 | 
				
			||||||
	ctx := context.Background()
 | 
						ctx := context.Background()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										38
									
								
								internal/web/actions/default/ns/clusters/cluster/delete.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								internal/web/actions/default/ns/clusters/cluster/delete.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					package cluster
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/oplogs"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type DeleteAction struct {
 | 
				
			||||||
 | 
						actionutils.ParentAction
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *DeleteAction) Init() {
 | 
				
			||||||
 | 
						this.Nav("", "delete", "index")
 | 
				
			||||||
 | 
						this.SecondMenu("nodes")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *DeleteAction) RunGet(params struct{}) {
 | 
				
			||||||
 | 
						this.Show()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *DeleteAction) RunPost(params struct {
 | 
				
			||||||
 | 
						ClusterId int64
 | 
				
			||||||
 | 
					}) {
 | 
				
			||||||
 | 
						// 创建日志
 | 
				
			||||||
 | 
						defer this.CreateLog(oplogs.LevelInfo, "删除域名服务集群 %d", params.ClusterId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO 如果有用户在使用此集群,就不能删除
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 删除
 | 
				
			||||||
 | 
						_, err := this.RPC().NSClusterRPC().DeleteNSCluster(this.AdminContext(), &pb.DeleteNSCluster{NsClusterId: params.ClusterId})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Success()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										17
									
								
								internal/web/actions/default/ns/clusters/cluster/index.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								internal/web/actions/default/ns/clusters/cluster/index.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package cluster
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IndexAction struct {
 | 
				
			||||||
 | 
						actionutils.ParentAction
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *IndexAction) Init() {
 | 
				
			||||||
 | 
						this.Nav("", "node", "")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *IndexAction) RunGet(params struct{}) {
 | 
				
			||||||
 | 
						this.Show()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										22
									
								
								internal/web/actions/default/ns/clusters/cluster/init.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								internal/web/actions/default/ns/clusters/cluster/init.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					package cluster
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ns/clusters/clusterutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
				
			||||||
 | 
							server.
 | 
				
			||||||
 | 
								Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeNS)).
 | 
				
			||||||
 | 
								Helper(new(clusterutils.ClusterHelper)).
 | 
				
			||||||
 | 
								Data("teaMenu", "ns").
 | 
				
			||||||
 | 
								Data("teaSubMenu", "cluster").
 | 
				
			||||||
 | 
								Prefix("/ns/clusters/cluster").
 | 
				
			||||||
 | 
								Get("", new(IndexAction)).
 | 
				
			||||||
 | 
								GetPost("/delete", new(DeleteAction)).
 | 
				
			||||||
 | 
								EndAll()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package cluster
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/actions"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IndexAction struct {
 | 
				
			||||||
 | 
						actionutils.ParentAction
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *IndexAction) Init() {
 | 
				
			||||||
 | 
						this.Nav("", "setting", "")
 | 
				
			||||||
 | 
						this.SecondMenu("basic")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *IndexAction) RunGet(params struct {
 | 
				
			||||||
 | 
						ClusterId int64
 | 
				
			||||||
 | 
					}) {
 | 
				
			||||||
 | 
						clusterResp, err := this.RPC().NSClusterRPC().FindEnabledNSCluster(this.AdminContext(), &pb.FindEnabledNSClusterRequest{NsClusterId: params.ClusterId})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						cluster := clusterResp.NsCluster
 | 
				
			||||||
 | 
						if cluster == nil {
 | 
				
			||||||
 | 
							this.NotFound("nsCluster", params.ClusterId)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Data["cluster"] = maps.Map{
 | 
				
			||||||
 | 
							"id":   cluster.Id,
 | 
				
			||||||
 | 
							"name": cluster.Name,
 | 
				
			||||||
 | 
							"isOn": cluster.IsOn,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Show()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *IndexAction) RunPost(params struct {
 | 
				
			||||||
 | 
						ClusterId int64
 | 
				
			||||||
 | 
						Name      string
 | 
				
			||||||
 | 
						IsOn      bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Must *actions.Must
 | 
				
			||||||
 | 
						CSRF *actionutils.CSRF
 | 
				
			||||||
 | 
					}) {
 | 
				
			||||||
 | 
						defer this.CreateLogInfo("修改域名服务集群基本信息 %d", params.ClusterId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params.Must.
 | 
				
			||||||
 | 
							Field("name", params.Name).
 | 
				
			||||||
 | 
							Require("请输入集群名称")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err := this.RPC().NSClusterRPC().UpdateNSCluster(this.AdminContext(), &pb.UpdateNSClusterRequest{
 | 
				
			||||||
 | 
							NsClusterId: params.ClusterId,
 | 
				
			||||||
 | 
							Name:        params.Name,
 | 
				
			||||||
 | 
							IsOn:        params.IsOn,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Success()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					package cluster
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ns/clusters/clusterutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
				
			||||||
 | 
							server.
 | 
				
			||||||
 | 
								Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeNS)).
 | 
				
			||||||
 | 
								Helper(new(clusterutils.ClusterHelper)).
 | 
				
			||||||
 | 
								Data("teaMenu", "ns").
 | 
				
			||||||
 | 
								Data("teaSubMenu", "cluster").
 | 
				
			||||||
 | 
								Prefix("/ns/clusters/cluster/settings").
 | 
				
			||||||
 | 
								GetPost("", new(IndexAction)).
 | 
				
			||||||
 | 
								EndAll()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,87 @@
 | 
				
			|||||||
 | 
					package clusterutils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/actions"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/logs"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ClusterHelper 单个集群的帮助
 | 
				
			||||||
 | 
					type ClusterHelper struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewClusterHelper() *ClusterHelper {
 | 
				
			||||||
 | 
						return &ClusterHelper{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *ClusterHelper) BeforeAction(actionPtr actions.ActionWrapper) (goNext bool) {
 | 
				
			||||||
 | 
						action := actionPtr.Object()
 | 
				
			||||||
 | 
						if action.Request.Method != http.MethodGet {
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						action.Data["teaMenu"] = "ns"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						selectedTabbar := action.Data.GetString("mainTab")
 | 
				
			||||||
 | 
						clusterId := action.ParamInt64("clusterId")
 | 
				
			||||||
 | 
						clusterIdString := strconv.FormatInt(clusterId, 10)
 | 
				
			||||||
 | 
						action.Data["clusterId"] = clusterId
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if clusterId > 0 {
 | 
				
			||||||
 | 
							rpcClient, err := rpc.SharedRPC()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								logs.Error(err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							clusterResp, err := rpcClient.NSClusterRPC().FindEnabledNSCluster(actionPtr.(rpc.ContextInterface).AdminContext(), &pb.FindEnabledNSClusterRequest{
 | 
				
			||||||
 | 
								NsClusterId: clusterId,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								logs.Error(err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							cluster := clusterResp.NsCluster
 | 
				
			||||||
 | 
							if cluster == nil {
 | 
				
			||||||
 | 
								action.WriteString("can not find ns cluster")
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							tabbar := actionutils.NewTabbar()
 | 
				
			||||||
 | 
							tabbar.Add("集群列表", "", "/ns/clusters", "", false)
 | 
				
			||||||
 | 
							tabbar.Add("集群节点", "", "/ns/clusters/cluster?clusterId="+clusterIdString, "server", selectedTabbar == "node")
 | 
				
			||||||
 | 
							tabbar.Add("集群设置", "", "/ns/clusters/cluster/settings?clusterId="+clusterIdString, "setting", selectedTabbar == "setting")
 | 
				
			||||||
 | 
							tabbar.Add("删除集群", "", "/ns/clusters/cluster/delete?clusterId="+clusterIdString, "trash", selectedTabbar == "delete")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								m := tabbar.Add("当前集群:"+cluster.Name, "", "/ns/clusters/cluster?clusterId="+clusterIdString, "", false)
 | 
				
			||||||
 | 
								m["right"] = true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							actionutils.SetTabbar(action, tabbar)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 左侧菜单
 | 
				
			||||||
 | 
							secondMenuItem := action.Data.GetString("secondMenuItem")
 | 
				
			||||||
 | 
							switch selectedTabbar {
 | 
				
			||||||
 | 
							case "setting":
 | 
				
			||||||
 | 
								action.Data["leftMenuItems"] = this.createSettingMenu(cluster, secondMenuItem)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 设置菜单
 | 
				
			||||||
 | 
					func (this *ClusterHelper) createSettingMenu(cluster *pb.NSCluster, selectedItem string) (items []maps.Map) {
 | 
				
			||||||
 | 
						clusterId := numberutils.FormatInt64(cluster.Id)
 | 
				
			||||||
 | 
						items = append(items, maps.Map{
 | 
				
			||||||
 | 
							"name":     "基础设置",
 | 
				
			||||||
 | 
							"url":      "/ns/clusters/cluster/settings?clusterId=" + clusterId,
 | 
				
			||||||
 | 
							"isActive": selectedItem == "basic",
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										46
									
								
								internal/web/actions/default/ns/clusters/create.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								internal/web/actions/default/ns/clusters/create.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package clusters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/actions"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type CreateAction struct {
 | 
				
			||||||
 | 
						actionutils.ParentAction
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *CreateAction) Init() {
 | 
				
			||||||
 | 
						this.Nav("", "", "create")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *CreateAction) RunGet(params struct{}) {
 | 
				
			||||||
 | 
						this.Show()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *CreateAction) RunPost(params struct {
 | 
				
			||||||
 | 
						Name string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Must *actions.Must
 | 
				
			||||||
 | 
						CSRF *actionutils.CSRF
 | 
				
			||||||
 | 
					}) {
 | 
				
			||||||
 | 
						var clusterId int64
 | 
				
			||||||
 | 
						defer this.CreateLogInfo("创建域名服务集群 %d", clusterId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						params.Must.
 | 
				
			||||||
 | 
							Field("name", params.Name).
 | 
				
			||||||
 | 
							Require("请输入集群名称")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						resp, err := this.RPC().NSClusterRPC().CreateNSCluster(this.AdminContext(), &pb.CreateNSClusterRequest{
 | 
				
			||||||
 | 
							Name: params.Name,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						clusterId = resp.NsClusterId
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Success()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										48
									
								
								internal/web/actions/default/ns/clusters/index.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								internal/web/actions/default/ns/clusters/index.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
				
			|||||||
 | 
					// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package clusters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo/maps"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IndexAction struct {
 | 
				
			||||||
 | 
						actionutils.ParentAction
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *IndexAction) Init() {
 | 
				
			||||||
 | 
						this.Nav("", "", "index")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *IndexAction) RunGet(params struct{}) {
 | 
				
			||||||
 | 
						countResp, err := this.RPC().NSClusterRPC().CountAllEnabledNSClusters(this.AdminContext(), &pb.CountAllEnabledNSClustersRequest{})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						count := countResp.Count
 | 
				
			||||||
 | 
						page := this.NewPage(count)
 | 
				
			||||||
 | 
						this.Data["page"] = page.AsHTML()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clustersResp, err := this.RPC().NSClusterRPC().ListEnabledNSClusters(this.AdminContext(), &pb.ListEnabledNSClustersRequest{
 | 
				
			||||||
 | 
							Offset: page.Offset,
 | 
				
			||||||
 | 
							Size:   page.Size,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							this.ErrorPage(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						clusterMaps := []maps.Map{}
 | 
				
			||||||
 | 
						for _, cluster := range clustersResp.NsClusters {
 | 
				
			||||||
 | 
							clusterMaps = append(clusterMaps, maps.Map{
 | 
				
			||||||
 | 
								"id":   cluster.Id,
 | 
				
			||||||
 | 
								"name": cluster.Name,
 | 
				
			||||||
 | 
								"isOn": cluster.IsOn,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						this.Data["clusters"] = clusterMaps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Show()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										20
									
								
								internal/web/actions/default/ns/clusters/init.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								internal/web/actions/default/ns/clusters/init.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					package clusters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
				
			||||||
 | 
							server.
 | 
				
			||||||
 | 
								Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeNS)).
 | 
				
			||||||
 | 
								Data("teaMenu", "ns").
 | 
				
			||||||
 | 
								Data("teaSubMenu", "cluster").
 | 
				
			||||||
 | 
								Prefix("/ns/clusters").
 | 
				
			||||||
 | 
								Get("", new(IndexAction)).
 | 
				
			||||||
 | 
								GetPost("/create", new(CreateAction)).
 | 
				
			||||||
 | 
								EndAll()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										17
									
								
								internal/web/actions/default/ns/index.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								internal/web/actions/default/ns/index.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					package ns
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IndexAction struct {
 | 
				
			||||||
 | 
						actionutils.ParentAction
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *IndexAction) Init() {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (this *IndexAction) RunGet(params struct{}) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						this.Show()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										19
									
								
								internal/web/actions/default/ns/init.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								internal/web/actions/default/ns/init.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					package ns
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
 | 
				
			||||||
 | 
						"github.com/iwind/TeaGo"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						TeaGo.BeforeStart(func(server *TeaGo.Server) {
 | 
				
			||||||
 | 
							server.
 | 
				
			||||||
 | 
								Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeNS)).
 | 
				
			||||||
 | 
								Data("teaMenu", "ns").
 | 
				
			||||||
 | 
								Prefix("/ns").
 | 
				
			||||||
 | 
								Get("", new(IndexAction)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								EndAll()
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -217,6 +217,26 @@ func (this *userMustAuth) modules(adminId int64) []maps.Map {
 | 
				
			|||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"code":     "ns",
 | 
				
			||||||
 | 
								"module":   configloaders.AdminModuleCodeNS,
 | 
				
			||||||
 | 
								"name":     "域名服务器",
 | 
				
			||||||
 | 
								"subtitle": "域名列表",
 | 
				
			||||||
 | 
								"icon":     "cubes",
 | 
				
			||||||
 | 
								"isOn":     teaconst.IsPlus,
 | 
				
			||||||
 | 
								"subItems": []maps.Map{
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										"name": "集群管理",
 | 
				
			||||||
 | 
										"url":  "/ns/clusters",
 | 
				
			||||||
 | 
										"code": "cluster",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										"name": "节点日志",
 | 
				
			||||||
 | 
										"url":  "/ns/logs",
 | 
				
			||||||
 | 
										"code": "log",
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"code":   "users",
 | 
								"code":   "users",
 | 
				
			||||||
			"module": configloaders.AdminModuleCodeUser,
 | 
								"module": configloaders.AdminModuleCodeUser,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,6 +31,13 @@ import (
 | 
				
			|||||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/logout"
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/logout"
 | 
				
			||||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/messages"
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/messages"
 | 
				
			||||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/nodes"
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/nodes"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 域名服务
 | 
				
			||||||
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ns"
 | 
				
			||||||
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ns/clusters"
 | 
				
			||||||
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ns/clusters/cluster"
 | 
				
			||||||
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ns/clusters/cluster/settings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers"
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers"
 | 
				
			||||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/certs"
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/certs"
 | 
				
			||||||
	_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components"
 | 
						_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,4 +2,7 @@
 | 
				
			|||||||
  text-align: center;
 | 
					  text-align: center;
 | 
				
			||||||
  margin-top: 2em;
 | 
					  margin-top: 2em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					.buttons-box button {
 | 
				
			||||||
 | 
					  width: 20em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/*# sourceMappingURL=delete.css.map */
 | 
					/*# sourceMappingURL=delete.css.map */
 | 
				
			||||||
@@ -1 +1 @@
 | 
				
			|||||||
{"version":3,"sources":["delete.less"],"names":[],"mappings":"AAAA;EACC,kBAAA;EACA,eAAA","file":"delete.css"}
 | 
					{"version":3,"sources":["delete.less"],"names":[],"mappings":"AAAA;EACC,kBAAA;EACA,eAAA;;AAFD,YAIC;EACC,WAAA","file":"delete.css"}
 | 
				
			||||||
@@ -1,4 +1,8 @@
 | 
				
			|||||||
.buttons-box {
 | 
					.buttons-box {
 | 
				
			||||||
	text-align: center;
 | 
						text-align: center;
 | 
				
			||||||
	margin-top: 2em;
 | 
						margin-top: 2em;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						button {
 | 
				
			||||||
 | 
							width: 20em;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										4
									
								
								web/views/@default/ns/clusters/@menu.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								web/views/@default/ns/clusters/@menu.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					<first-menu>
 | 
				
			||||||
 | 
					    <menu-item href="/ns/clusters" code="index">集群列表</menu-item>
 | 
				
			||||||
 | 
					    <menu-item href="/ns/clusters/create" code="create">创建集群</menu-item>
 | 
				
			||||||
 | 
					</first-menu>
 | 
				
			||||||
							
								
								
									
										8
									
								
								web/views/@default/ns/clusters/cluster/delete.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								web/views/@default/ns/clusters/cluster/delete.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					.buttons-box {
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					  margin-top: 2em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.buttons-box button {
 | 
				
			||||||
 | 
					  width: 20em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*# sourceMappingURL=delete.css.map */
 | 
				
			||||||
							
								
								
									
										1
									
								
								web/views/@default/ns/clusters/cluster/delete.css.map
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								web/views/@default/ns/clusters/cluster/delete.css.map
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{"version":3,"sources":["delete.less"],"names":[],"mappings":"AAAA;EACC,kBAAA;EACA,eAAA;;AAFD,YAIC;EACC,WAAA","file":"delete.css"}
 | 
				
			||||||
							
								
								
									
										5
									
								
								web/views/@default/ns/clusters/cluster/delete.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								web/views/@default/ns/clusters/cluster/delete.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					{$layout}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="buttons-box">
 | 
				
			||||||
 | 
						<button class="ui button red" type="button" @click.prevent="deleteCluster(clusterId)">删除当前集群</button>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
							
								
								
									
										16
									
								
								web/views/@default/ns/clusters/cluster/delete.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								web/views/@default/ns/clusters/cluster/delete.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					Tea.context(function () {
 | 
				
			||||||
 | 
					    this.deleteCluster = function (clusterId) {
 | 
				
			||||||
 | 
					        let that = this
 | 
				
			||||||
 | 
					        teaweb.confirm("确定要删除此集群吗?", function () {
 | 
				
			||||||
 | 
					            that.$post("/ns/clusters/cluster/delete")
 | 
				
			||||||
 | 
					                .params({
 | 
				
			||||||
 | 
					                    clusterId: clusterId
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					                .success(function () {
 | 
				
			||||||
 | 
					                    teaweb.success("删除成功", function () {
 | 
				
			||||||
 | 
					                        window.location = "/ns/clusters"
 | 
				
			||||||
 | 
					                    })
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
							
								
								
									
										8
									
								
								web/views/@default/ns/clusters/cluster/delete.less
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								web/views/@default/ns/clusters/cluster/delete.less
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					.buttons-box {
 | 
				
			||||||
 | 
						text-align: center;
 | 
				
			||||||
 | 
						margin-top: 2em;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						button {
 | 
				
			||||||
 | 
							width: 20em;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										1
									
								
								web/views/@default/ns/clusters/cluster/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								web/views/@default/ns/clusters/cluster/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{$layout}
 | 
				
			||||||
							
								
								
									
										28
									
								
								web/views/@default/ns/clusters/cluster/settings/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								web/views/@default/ns/clusters/cluster/settings/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					{$layout}
 | 
				
			||||||
 | 
					{$template "/left_menu"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="right-box">
 | 
				
			||||||
 | 
						<h3>基础设置</h3>
 | 
				
			||||||
 | 
						<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
 | 
				
			||||||
 | 
					        <csrf-token></csrf-token>
 | 
				
			||||||
 | 
							<input type="hidden" name="clusterId" :value="cluster.id"/>
 | 
				
			||||||
 | 
							<table class="ui table selectable definition">
 | 
				
			||||||
 | 
								<tr>
 | 
				
			||||||
 | 
									<td class="title">集群名称 *</td>
 | 
				
			||||||
 | 
									<td><input type="text" name="name" maxlength="50" ref="focus" v-model="cluster.name"/></td>
 | 
				
			||||||
 | 
								</tr>
 | 
				
			||||||
 | 
					            <tr>
 | 
				
			||||||
 | 
					                <td colspan="2"><more-options-indicator></more-options-indicator></td>
 | 
				
			||||||
 | 
					            </tr>
 | 
				
			||||||
 | 
					            <tbody v-show="moreOptionsVisible">
 | 
				
			||||||
 | 
					                <tr>
 | 
				
			||||||
 | 
					                    <td>是否启用</td>
 | 
				
			||||||
 | 
					                    <td>
 | 
				
			||||||
 | 
					                        <checkbox name="isOn" value="1" v-model="cluster.isOn"></checkbox>
 | 
				
			||||||
 | 
					                    </td>
 | 
				
			||||||
 | 
					                </tr>
 | 
				
			||||||
 | 
					            </tbody>
 | 
				
			||||||
 | 
							</table>
 | 
				
			||||||
 | 
							<submit-btn></submit-btn>
 | 
				
			||||||
 | 
						</form>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
							
								
								
									
										3
									
								
								web/views/@default/ns/clusters/cluster/settings/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								web/views/@default/ns/clusters/cluster/settings/index.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					Tea.context(function () {
 | 
				
			||||||
 | 
						this.success = NotifyReloadSuccess("保存成功")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
							
								
								
									
										16
									
								
								web/views/@default/ns/clusters/create.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								web/views/@default/ns/clusters/create.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					{$layout}
 | 
				
			||||||
 | 
					{$template "menu"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="ui margin"></div>
 | 
				
			||||||
 | 
					<form class="ui form" data-tea-action="$" data-tea-success="success">
 | 
				
			||||||
 | 
					    <csrf-token></csrf-token>
 | 
				
			||||||
 | 
					    <table class="ui table definition selectable">
 | 
				
			||||||
 | 
					        <tr>
 | 
				
			||||||
 | 
					            <td class="title">集群名称 *</td>
 | 
				
			||||||
 | 
					            <td>
 | 
				
			||||||
 | 
					                <input type="text" name="name" maxlength="50" ref="focus"/>
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					    </table>
 | 
				
			||||||
 | 
					    <submit-btn></submit-btn>
 | 
				
			||||||
 | 
					</form>
 | 
				
			||||||
							
								
								
									
										3
									
								
								web/views/@default/ns/clusters/create.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								web/views/@default/ns/clusters/create.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					Tea.context(function () {
 | 
				
			||||||
 | 
						this.success = NotifySuccess("保存成功", "/ns/clusters")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
							
								
								
									
										25
									
								
								web/views/@default/ns/clusters/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								web/views/@default/ns/clusters/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					{$layout}
 | 
				
			||||||
 | 
					{$template "menu"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<p class="comment" v-if="clusters.length == 0">暂时还没有集群。</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<table class="ui table selectable celled" v-if="clusters.length > 0">
 | 
				
			||||||
 | 
					    <thead>
 | 
				
			||||||
 | 
					        <tr>
 | 
				
			||||||
 | 
					            <th>集群名称</th>
 | 
				
			||||||
 | 
					            <th class="two wide">集群状态</th>
 | 
				
			||||||
 | 
					            <th class="two op">操作</th>
 | 
				
			||||||
 | 
					        </tr>
 | 
				
			||||||
 | 
					    </thead>
 | 
				
			||||||
 | 
					    <tr v-for="cluster in clusters">
 | 
				
			||||||
 | 
					        <td>{{cluster.name}}</td>
 | 
				
			||||||
 | 
					        <td>
 | 
				
			||||||
 | 
					            <label-on :v-is-on="cluster.isOn"></label-on>
 | 
				
			||||||
 | 
					        </td>
 | 
				
			||||||
 | 
					        <td>
 | 
				
			||||||
 | 
					            <a :href="'/ns/clusters/cluster?clusterId=' + cluster.id">详情</a>
 | 
				
			||||||
 | 
					        </td>
 | 
				
			||||||
 | 
					    </tr>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="page" v-html="page"></div>
 | 
				
			||||||
							
								
								
									
										1
									
								
								web/views/@default/ns/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								web/views/@default/ns/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{$layout}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user