mirror of
https://github.com/TeaOSLab/EdgeAdmin.git
synced 2025-11-11 18:30: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