diff --git a/internal/const/const.go b/internal/const/const.go index 23aef8b9..186a82dd 100644 --- a/internal/const/const.go +++ b/internal/const/const.go @@ -1,7 +1,7 @@ package teaconst const ( - Version = "0.0.5" + Version = "0.0.6" ProductName = "Edge Admin" ProcessName = "edge-admin" diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index cc48b201..5482c58f 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -71,6 +71,10 @@ func (this *RPCClient) NodeGroupRPC() pb.NodeGroupServiceClient { return pb.NewNodeGroupServiceClient(this.pickConn()) } +func (this *RPCClient) NodeRegionRPC() pb.NodeRegionServiceClient { + return pb.NewNodeRegionServiceClient(this.pickConn()) +} + func (this *RPCClient) NodeIPAddressRPC() pb.NodeIPAddressServiceClient { return pb.NewNodeIPAddressServiceClient(this.pickConn()) } diff --git a/internal/web/actions/default/clusters/cluster/groups/delete.go b/internal/web/actions/default/clusters/cluster/groups/delete.go index 6c923816..9c24106f 100644 --- a/internal/web/actions/default/clusters/cluster/groups/delete.go +++ b/internal/web/actions/default/clusters/cluster/groups/delete.go @@ -14,7 +14,7 @@ func (this *DeleteAction) RunPost(params struct { GroupId int64 }) { // 检查是否正在使用 - countResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithGroupId(this.AdminContext(), &pb.CountAllEnabledNodesWithGroupIdRequest{GroupId: params.GroupId}) + countResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithNodeGroupId(this.AdminContext(), &pb.CountAllEnabledNodesWithNodeGroupIdRequest{NodeGroupId: params.GroupId}) if err != nil { this.ErrorPage(err) return diff --git a/internal/web/actions/default/clusters/cluster/groups/index.go b/internal/web/actions/default/clusters/cluster/groups/index.go index 2e54ce78..f452aeb0 100644 --- a/internal/web/actions/default/clusters/cluster/groups/index.go +++ b/internal/web/actions/default/clusters/cluster/groups/index.go @@ -28,7 +28,7 @@ func (this *IndexAction) RunGet(params struct { groupMaps := []maps.Map{} for _, group := range groupsResp.Groups { - countResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithGroupId(this.AdminContext(), &pb.CountAllEnabledNodesWithGroupIdRequest{GroupId: group.Id}) + countResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithNodeGroupId(this.AdminContext(), &pb.CountAllEnabledNodesWithNodeGroupIdRequest{NodeGroupId: group.Id}) if err != nil { this.ErrorPage(err) return diff --git a/internal/web/actions/default/clusters/cluster/index.go b/internal/web/actions/default/clusters/cluster/index.go index f1bccd6a..2d4d8cee 100644 --- a/internal/web/actions/default/clusters/cluster/index.go +++ b/internal/web/actions/default/clusters/cluster/index.go @@ -146,7 +146,7 @@ func (this *IndexAction) RunGet(params struct { return } for _, group := range groupsResp.Groups { - countResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithGroupId(this.AdminContext(), &pb.CountAllEnabledNodesWithGroupIdRequest{GroupId: group.Id}) + countResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithNodeGroupId(this.AdminContext(), &pb.CountAllEnabledNodesWithNodeGroupIdRequest{NodeGroupId: group.Id}) if err != nil { this.ErrorPage(err) return diff --git a/internal/web/actions/default/clusters/regions/createPopup.go b/internal/web/actions/default/clusters/regions/createPopup.go new file mode 100644 index 00000000..17402900 --- /dev/null +++ b/internal/web/actions/default/clusters/regions/createPopup.go @@ -0,0 +1,41 @@ +package regions + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" +) + +type CreatePopupAction struct { + actionutils.ParentAction +} + +func (this *CreatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreatePopupAction) RunGet(params struct{}) { + this.Show() +} + +func (this *CreatePopupAction) RunPost(params struct { + Name string + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + params.Must. + Field("name", params.Name). + Require("请输入区域名称") + + createResp, err := this.RPC().NodeRegionRPC().CreateNodeRegion(this.AdminContext(), &pb.CreateNodeRegionRequest{Name: params.Name}) + if err != nil { + this.ErrorPage(err) + return + } + + // 日志 + defer this.CreateLogInfo("创建节点区域 %d", createResp.NodeRegionId) + + this.Success() +} diff --git a/internal/web/actions/default/clusters/regions/delete.go b/internal/web/actions/default/clusters/regions/delete.go new file mode 100644 index 00000000..ef81ef93 --- /dev/null +++ b/internal/web/actions/default/clusters/regions/delete.go @@ -0,0 +1,35 @@ +package regions + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type DeleteAction struct { + actionutils.ParentAction +} + +func (this *DeleteAction) RunPost(params struct { + RegionId int64 +}) { + defer this.CreateLogInfo("删除节点区域 %d", params.RegionId) + + // 检查有无在使用 + countResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithNodeRegionId(this.AdminContext(), &pb.CountAllEnabledNodesWithNodeRegionIdRequest{NodeRegionId: params.RegionId}) + if err != nil { + this.ErrorPage(err) + return + } + if countResp.Count > 0 { + this.Fail("此区域正在使用,不能删除") + } + + // 执行删除 + _, err = this.RPC().NodeRegionRPC().DeleteNodeRegion(this.AdminContext(), &pb.DeleteNodeRegionRequest{NodeRegionId: params.RegionId}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/clusters/regions/index.go b/internal/web/actions/default/clusters/regions/index.go new file mode 100644 index 00000000..764d1fca --- /dev/null +++ b/internal/web/actions/default/clusters/regions/index.go @@ -0,0 +1,41 @@ +package regions + +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("", "", "") +} + +func (this *IndexAction) RunGet(params struct{}) { + regionsResp, err := this.RPC().NodeRegionRPC().FindAllEnabledNodeRegions(this.AdminContext(), &pb.FindAllEnabledNodeRegionsRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + regionMaps := []maps.Map{} + for _, region := range regionsResp.NodeRegions { + countNodesResp, err := this.RPC().NodeRPC().CountAllEnabledNodesWithNodeRegionId(this.AdminContext(), &pb.CountAllEnabledNodesWithNodeRegionIdRequest{NodeRegionId: region.Id}) + if err != nil { + this.ErrorPage(err) + return + } + + regionMaps = append(regionMaps, maps.Map{ + "id": region.Id, + "isOn": region.IsOn, + "name": region.Name, + "countNodes": countNodesResp.Count, + }) + } + this.Data["regions"] = regionMaps + + this.Show() +} diff --git a/internal/web/actions/default/clusters/regions/init.go b/internal/web/actions/default/clusters/regions/init.go new file mode 100644 index 00000000..c0d9ae19 --- /dev/null +++ b/internal/web/actions/default/clusters/regions/init.go @@ -0,0 +1,23 @@ +package regions + +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.AdminModuleCodeNode)). + Data("teaMenu", "clusters"). + Data("teaSubMenu", "region"). + Prefix("/clusters/regions"). + Get("", new(IndexAction)). + GetPost("/createPopup", new(CreatePopupAction)). + GetPost("/updatePopup", new(UpdatePopupAction)). + Post("/delete", new(DeleteAction)). + Post("/sort", new(SortAction)). + EndAll() + }) +} diff --git a/internal/web/actions/default/clusters/regions/sort.go b/internal/web/actions/default/clusters/regions/sort.go new file mode 100644 index 00000000..97eb4425 --- /dev/null +++ b/internal/web/actions/default/clusters/regions/sort.go @@ -0,0 +1,24 @@ +package regions + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type SortAction struct { + actionutils.ParentAction +} + +func (this *SortAction) RunPost(params struct { + RegionIds []int64 +}) { + defer this.CreateLogInfo("修改节点区域排序") + + _, err := this.RPC().NodeRegionRPC().UpdateNodeRegionOrders(this.AdminContext(), &pb.UpdateNodeRegionOrdersRequest{NodeRegionIds: params.RegionIds}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/clusters/regions/updatePopup.go b/internal/web/actions/default/clusters/regions/updatePopup.go new file mode 100644 index 00000000..92dc1ec2 --- /dev/null +++ b/internal/web/actions/default/clusters/regions/updatePopup.go @@ -0,0 +1,67 @@ +package regions + +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 UpdatePopupAction struct { + actionutils.ParentAction +} + +func (this *UpdatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *UpdatePopupAction) RunGet(params struct { + RegionId int64 +}) { + regionResp, err := this.RPC().NodeRegionRPC().FindEnabledNodeRegion(this.AdminContext(), &pb.FindEnabledNodeRegionRequest{NodeRegionId: params.RegionId}) + if err != nil { + this.ErrorPage(err) + return + } + region := regionResp.NodeRegion + if region == nil { + this.NotFound("nodeRegion", params.RegionId) + return + } + + this.Data["region"] = maps.Map{ + "id": region.Id, + "isOn": region.IsOn, + "name": region.Name, + } + + this.Show() +} + +func (this *UpdatePopupAction) RunPost(params struct { + RegionId int64 + + Name string + IsOn bool + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + defer this.CreateLogInfo("修改节点区域 %d", params.RegionId) + + params.Must. + Field("name", params.Name). + Require("请输入区域名称") + + _, err := this.RPC().NodeRegionRPC().UpdateNodeRegion(this.AdminContext(), &pb.UpdateNodeRegionRequest{ + NodeRegionId: params.RegionId, + Name: params.Name, + IsOn: params.IsOn, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/helpers/user_must_auth.go b/internal/web/helpers/user_must_auth.go index 238da123..143d8b88 100644 --- a/internal/web/helpers/user_must_auth.go +++ b/internal/web/helpers/user_must_auth.go @@ -172,6 +172,11 @@ func (this *userMustAuth) modules(adminId int64) []maps.Map { "url": "/clusters/grants", "code": "grant", }, + { + "name": "区域设置", + "url": "/clusters/regions", + "code": "region", + }, }, }, { diff --git a/internal/web/import.go b/internal/web/import.go index 0dce5748..8be05c47 100644 --- a/internal/web/import.go +++ b/internal/web/import.go @@ -10,6 +10,7 @@ import ( _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/cluster/settings" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/grants" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters/regions" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/csrf" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dashboard" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/db" diff --git a/web/views/@default/clusters/regions/createPopup.html b/web/views/@default/clusters/regions/createPopup.html new file mode 100644 index 00000000..c482f704 --- /dev/null +++ b/web/views/@default/clusters/regions/createPopup.html @@ -0,0 +1,15 @@ +{$layout "layout_popup"} + +

创建区域

+
+ + + + + + +
区域名称 * + +
+ +
\ No newline at end of file diff --git a/web/views/@default/clusters/regions/index.html b/web/views/@default/clusters/regions/index.html new file mode 100644 index 00000000..3cb7efb9 --- /dev/null +++ b/web/views/@default/clusters/regions/index.html @@ -0,0 +1,35 @@ +{$layout} + + + 创建 + | + + + +

暂时还没有区域。

+ + + + + + + + + + + + + + + + + + + + +
区域名称节点数区域状态操作
{{region.name}}{{region.countNodes}} + + + 修改   删除 +
+

可以拖动左侧的排序。

\ No newline at end of file diff --git a/web/views/@default/clusters/regions/index.js b/web/views/@default/clusters/regions/index.js new file mode 100644 index 00000000..725cb18e --- /dev/null +++ b/web/views/@default/clusters/regions/index.js @@ -0,0 +1,45 @@ +Tea.context(function () { + this.$delay(function () { + let that = this + sortTable(function (ids) { + that.$post(".sort") + .params({ + regionIds: ids + }) + .success(function () { + teaweb.successToast("排序保存成功") + }) + }) + }) + + this.createRegion = function () { + teaweb.popup(Tea.url(".createPopup"), { + callback: function () { + teaweb.success("保存成功", function () { + teaweb.reload() + }) + } + }) + } + + this.updateRegion = function (regionId) { + teaweb.popup(Tea.url(".updatePopup?regionId=" + regionId), { + callback: function () { + teaweb.success("保存成功", function () { + teaweb.reload() + }) + } + }) + } + + this.deleteRegion = function (regionId) { + let that = this + teaweb.confirm("确定要删除这个区域吗?", function () { + that.$post(".delete") + .params({ + regionId: regionId + }) + .refresh() + }) + } +}) \ No newline at end of file diff --git a/web/views/@default/clusters/regions/updatePopup.html b/web/views/@default/clusters/regions/updatePopup.html new file mode 100644 index 00000000..8830e424 --- /dev/null +++ b/web/views/@default/clusters/regions/updatePopup.html @@ -0,0 +1,27 @@ +{$layout "layout_popup"} + +

修改区域

+
+ + + + + + + + + + + + + + + + +
区域名称 * + +
是否启用 + +
+ +
\ No newline at end of file