diff --git a/internal/web/actions/default/db/cleanPopup.go b/internal/web/actions/default/db/clean.go similarity index 73% rename from internal/web/actions/default/db/cleanPopup.go rename to internal/web/actions/default/db/clean.go index d6e477a9..adb33e2e 100644 --- a/internal/web/actions/default/db/cleanPopup.go +++ b/internal/web/actions/default/db/clean.go @@ -3,28 +3,35 @@ package db import ( "github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/db/dbnodeutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/maps" ) -type CleanPopupAction struct { +type CleanAction struct { actionutils.ParentAction } -func (this *CleanPopupAction) Init() { - this.Nav("", "", "") +func (this *CleanAction) Init() { + this.Nav("", "", "clean") } -func (this *CleanPopupAction) RunGet(params struct { +func (this *CleanAction) RunGet(params struct { NodeId int64 }) { + _, err := dbnodeutils.InitNode(this.Parent(), params.NodeId) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["nodeId"] = params.NodeId this.Show() } -func (this *CleanPopupAction) RunPost(params struct { +func (this *CleanAction) RunPost(params struct { NodeId int64 Must *actions.Must @@ -33,8 +40,7 @@ func (this *CleanPopupAction) RunPost(params struct { DbNodeId: params.NodeId, }) if err != nil { - this.ErrorPage(err) - return + this.Fail("查询数据时出错了:" + err.Error()) } tableMaps := []maps.Map{} diff --git a/internal/web/actions/default/db/dbnodeutils/utils.go b/internal/web/actions/default/db/dbnodeutils/utils.go new file mode 100644 index 00000000..eda3a5bc --- /dev/null +++ b/internal/web/actions/default/db/dbnodeutils/utils.go @@ -0,0 +1,34 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package dbnodeutils + +import ( + "errors" + "github.com/TeaOSLab/EdgeAdmin/internal/rpc" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" + "github.com/iwind/TeaGo/types" +) + +// InitNode 初始化指标信息 +func InitNode(parent *actionutils.ParentAction, nodeId int64) (*pb.DBNode, error) { + client, err := rpc.SharedRPC() + if err != nil { + return nil, err + } + + resp, err := client.DBNodeRPC().FindEnabledDBNode(parent.AdminContext(), &pb.FindEnabledDBNodeRequest{DbNodeId: nodeId}) + if err != nil { + return nil, err + } + var node = resp.DbNode + if node == nil { + return nil, errors.New("not found db node with id '" + types.String(nodeId) + "'") + } + parent.Data["node"] = maps.Map{ + "id": node.Id, + "name": node.Name, + } + return node, nil +} diff --git a/internal/web/actions/default/db/index.go b/internal/web/actions/default/db/index.go index 48a1d686..3e0d97ac 100644 --- a/internal/web/actions/default/db/index.go +++ b/internal/web/actions/default/db/index.go @@ -42,9 +42,10 @@ func (this *IndexAction) RunGet(params struct{}) { "port": node.Port, "database": node.Database, "status": maps.Map{ - "isOk": node.Status.IsOk, - "error": node.Status.Error, - "size": numberutils.FormatBytes(node.Status.Size), + "isOk": node.Status.IsOk, + "error": node.Status.Error, + "size": numberutils.FormatBytes(node.Status.Size), + "version": node.Status.Version, }, }) } diff --git a/internal/web/actions/default/db/init.go b/internal/web/actions/default/db/init.go index 6c111335..8a23c995 100644 --- a/internal/web/actions/default/db/init.go +++ b/internal/web/actions/default/db/init.go @@ -16,12 +16,14 @@ func init() { Prefix("/db"). Get("", new(IndexAction)). GetPost("/createPopup", new(CreatePopupAction)). - GetPost("/updatePopup", new(UpdatePopupAction)). + GetPost("/update", new(UpdateAction)). Post("/delete", new(DeleteAction)). - GetPost("/cleanPopup", new(CleanPopupAction)). + GetPost("/clean", new(CleanAction)). Post("/deleteTable", new(DeleteTableAction)). Post("/truncateTable", new(TruncateTableAction)). - + Get("/node", new(NodeAction)). + Get("/logs", new(LogsAction)). + Post("/status", new(StatusAction)). EndAll() }) } diff --git a/internal/web/actions/default/db/logs.go b/internal/web/actions/default/db/logs.go new file mode 100644 index 00000000..8d19c808 --- /dev/null +++ b/internal/web/actions/default/db/logs.go @@ -0,0 +1,82 @@ +package db + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/db/dbnodeutils" + "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/maps" + timeutil "github.com/iwind/TeaGo/utils/time" +) + +type LogsAction struct { + actionutils.ParentAction +} + +func (this *LogsAction) Init() { + this.Nav("", "", "log") +} + +func (this *LogsAction) RunGet(params struct { + NodeId int64 + + DayFrom string + DayTo string + Keyword string + Level string +}) { + _, err := dbnodeutils.InitNode(this.Parent(), params.NodeId) + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["nodeId"] = params.NodeId + this.Data["dayFrom"] = params.DayFrom + this.Data["dayTo"] = params.DayTo + this.Data["keyword"] = params.Keyword + this.Data["level"] = params.Level + + countResp, err := this.RPC().NodeLogRPC().CountNodeLogs(this.AdminContext(), &pb.CountNodeLogsRequest{ + Role: nodeconfigs.NodeRoleDatabase, + NodeId: params.NodeId, + DayFrom: params.DayFrom, + DayTo: params.DayTo, + Keyword: params.Keyword, + Level: params.Level, + }) + if err != nil { + this.ErrorPage(err) + return + } + count := countResp.Count + page := this.NewPage(count, 20) + + logsResp, err := this.RPC().NodeLogRPC().ListNodeLogs(this.AdminContext(), &pb.ListNodeLogsRequest{ + NodeId: params.NodeId, + Role: nodeconfigs.NodeRoleDatabase, + DayFrom: params.DayFrom, + DayTo: params.DayTo, + Keyword: params.Keyword, + Level: params.Level, + + Offset: page.Offset, + Size: page.Size, + }) + + logs := []maps.Map{} + for _, log := range logsResp.NodeLogs { + logs = append(logs, maps.Map{ + "tag": log.Tag, + "description": log.Description, + "createdTime": timeutil.FormatTime("Y-m-d H:i:s", log.CreatedAt), + "level": log.Level, + "isToday": timeutil.FormatTime("Y-m-d", log.CreatedAt) == timeutil.Format("Y-m-d"), + }) + } + this.Data["logs"] = logs + + this.Data["page"] = page.AsHTML() + + this.Show() +} diff --git a/internal/web/actions/default/db/node.go b/internal/web/actions/default/db/node.go new file mode 100644 index 00000000..4717e5aa --- /dev/null +++ b/internal/web/actions/default/db/node.go @@ -0,0 +1,41 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package db + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/db/dbnodeutils" + "github.com/iwind/TeaGo/maps" +) + +type NodeAction struct { + actionutils.ParentAction +} + +func (this *NodeAction) Init() { + this.Nav("", "", "node") +} + +func (this *NodeAction) RunGet(params struct { + NodeId int64 +}) { + node, err := dbnodeutils.InitNode(this.Parent(), params.NodeId) + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["node"] = maps.Map{ + "id": node.Id, + "isOn": node.IsOn, + "name": node.Name, + "database": node.Database, + "host": node.Host, + "port": node.Port, + "username": node.Username, + "password": node.Password, + "description": node.Description, + } + + this.Show() +} diff --git a/internal/web/actions/default/db/status.go b/internal/web/actions/default/db/status.go new file mode 100644 index 00000000..321d56f4 --- /dev/null +++ b/internal/web/actions/default/db/status.go @@ -0,0 +1,38 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package db + +import ( + "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/maps" +) + +type StatusAction struct { + actionutils.ParentAction +} + +func (this *StatusAction) RunPost(params struct { + NodeId int64 +}) { + statusResp, err := this.RPC().DBNodeRPC().CheckDBNodeStatus(this.AdminContext(), &pb.CheckDBNodeStatusRequest{DbNodeId: params.NodeId}) + if err != nil { + this.ErrorPage(err) + return + } + + var status = statusResp.DbNodeStatus + if status != nil { + this.Data["status"] = maps.Map{ + "isOk": status.IsOk, + "error": status.Error, + "size": numberutils.FormatBytes(status.Size), + "version": status.Version, + } + } else { + this.Data["status"] = nil + } + + this.Success() +} diff --git a/internal/web/actions/default/db/updatePopup.go b/internal/web/actions/default/db/update.go similarity index 91% rename from internal/web/actions/default/db/updatePopup.go rename to internal/web/actions/default/db/update.go index 91451f35..aabcfd7f 100644 --- a/internal/web/actions/default/db/updatePopup.go +++ b/internal/web/actions/default/db/update.go @@ -8,15 +8,15 @@ import ( "github.com/iwind/TeaGo/maps" ) -type UpdatePopupAction struct { +type UpdateAction struct { actionutils.ParentAction } -func (this *UpdatePopupAction) Init() { - this.Nav("", "", "") +func (this *UpdateAction) Init() { + this.Nav("", "", "update") } -func (this *UpdatePopupAction) RunGet(params struct { +func (this *UpdateAction) RunGet(params struct { NodeId int64 }) { nodeResp, err := this.RPC().DBNodeRPC().FindEnabledDBNode(this.AdminContext(), &pb.FindEnabledDBNodeRequest{DbNodeId: params.NodeId}) @@ -46,7 +46,7 @@ func (this *UpdatePopupAction) RunGet(params struct { this.Show() } -func (this *UpdatePopupAction) RunPost(params struct { +func (this *UpdateAction) RunPost(params struct { NodeId int64 Name string diff --git a/web/views/@default/db/@menu.html b/web/views/@default/db/@menu.html new file mode 100644 index 00000000..131a0f85 --- /dev/null +++ b/web/views/@default/db/@menu.html @@ -0,0 +1,8 @@ + + 所有节点 + | + "{{node.name}}"详情 + 清理 + 运行日志 + 修改 + \ No newline at end of file diff --git a/web/views/@default/db/cleanPopup.html b/web/views/@default/db/clean.html similarity index 96% rename from web/views/@default/db/cleanPopup.html rename to web/views/@default/db/clean.html index cc1f9bd3..e9d30ee8 100644 --- a/web/views/@default/db/cleanPopup.html +++ b/web/views/@default/db/clean.html @@ -1,4 +1,5 @@ -{$layout "layout_popup"} +{$layout} +{$template "menu"}
正在加载中...
diff --git a/web/views/@default/db/cleanPopup.js b/web/views/@default/db/clean.js similarity index 100% rename from web/views/@default/db/cleanPopup.js rename to web/views/@default/db/clean.js diff --git a/web/views/@default/db/index.html b/web/views/@default/db/index.html index b45a9996..fc442c0a 100644 --- a/web/views/@default/db/index.html +++ b/web/views/@default/db/index.html @@ -12,15 +12,20 @@ 节点名称 连接地址 数据库名 + 数据库版本 用量 状态 - 操作 + 操作 - {{node.name}} + {{node.name}} {{node.host}}:{{node.port}} {{node.database}} + + v{{node.status.version}} + - + {{node.status.size}} - @@ -35,8 +40,7 @@ - 清理清理   - 修改   + 详情 删除 diff --git a/web/views/@default/db/index.js b/web/views/@default/db/index.js index f44cc552..39f94599 100644 --- a/web/views/@default/db/index.js +++ b/web/views/@default/db/index.js @@ -11,18 +11,6 @@ Tea.context(function () { }) } - // 修改节点 - this.updateNode = function (nodeId) { - teaweb.popup("/db/updatePopup?nodeId=" + nodeId, { - height: "30em", - callback: function () { - teaweb.success("保存成功", function () { - window.location.reload() - }) - } - }) - } - // 删除节点 this.deleteNode = function (nodeId) { let that = this @@ -34,15 +22,7 @@ Tea.context(function () { .refresh() }) } - - // 清理节点 - this.cleanNode = function (nodeId) { - teaweb.popup("/db/cleanPopup?nodeId=" + nodeId, { - width: "44em", - height: "26em" - }) - } - + // 显示错误信息 this.showError = function (err) { teaweb.popupTip("错误信息:" + err + "") diff --git a/web/views/@default/db/logs.css b/web/views/@default/db/logs.css new file mode 100644 index 00000000..dafa1562 --- /dev/null +++ b/web/views/@default/db/logs.css @@ -0,0 +1,5 @@ +pre.log-box { + margin: 0; + padding: 0; +} +/*# sourceMappingURL=logs.css.map */ \ No newline at end of file diff --git a/web/views/@default/db/logs.css.map b/web/views/@default/db/logs.css.map new file mode 100644 index 00000000..6ae867b7 --- /dev/null +++ b/web/views/@default/db/logs.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["logs.less"],"names":[],"mappings":"AAAA,GAAG;EACF,SAAA;EACA,UAAA","file":"logs.css"} \ No newline at end of file diff --git a/web/views/@default/db/logs.html b/web/views/@default/db/logs.html new file mode 100644 index 00000000..29c048f0 --- /dev/null +++ b/web/views/@default/db/logs.html @@ -0,0 +1,51 @@ +{$layout} +{$template "menu"} +{$template "/datepicker"} + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ +

暂时还没有日志。

+ + + + + + + + + + +
+ +
+ +
\ No newline at end of file diff --git a/web/views/@default/db/logs.js b/web/views/@default/db/logs.js new file mode 100644 index 00000000..29a90420 --- /dev/null +++ b/web/views/@default/db/logs.js @@ -0,0 +1,6 @@ +Tea.context(function () { + this.$delay(function () { + teaweb.datepicker("day-from-picker") + teaweb.datepicker("day-to-picker") + }) +}) \ No newline at end of file diff --git a/web/views/@default/db/logs.less b/web/views/@default/db/logs.less new file mode 100644 index 00000000..9accd63d --- /dev/null +++ b/web/views/@default/db/logs.less @@ -0,0 +1,4 @@ +pre.log-box { + margin: 0; + padding: 0; +} \ No newline at end of file diff --git a/web/views/@default/db/node.html b/web/views/@default/db/node.html new file mode 100644 index 00000000..8a8ae5c1 --- /dev/null +++ b/web/views/@default/db/node.html @@ -0,0 +1,68 @@ +{$layout} +{$template "menu"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
节点名称 + {{node.name}} +
状态 + + +
+
+

+ 版本: v{{status.version}} / + 用量:{{status.size}} + - +

+
+
+ 连接错误:{{status.error}} +
+
+
主机地址(Host) + {{node.host}} +
数据库端口(Port) + {{node.port}} +
数据库名称(Database) + {{node.database}} +
用户名(Username) + {{node.username}} +
密码(Password) + {{node.password}} + - +
详细描述 + {{node.description}} + - +
\ No newline at end of file diff --git a/web/views/@default/db/node.js b/web/views/@default/db/node.js new file mode 100644 index 00000000..49efaf18 --- /dev/null +++ b/web/views/@default/db/node.js @@ -0,0 +1,16 @@ +Tea.context(function () { + this.$delay(function () { + this.loadStatus(this.node.id) + }) + + this.status = null + this.loadStatus = function (nodeId) { + this.$post(".status") + .params({ + nodeId: nodeId + }) + .success(function (resp) { + this.status = resp.data.status + }) + } +}) \ No newline at end of file diff --git a/web/views/@default/db/updatePopup.html b/web/views/@default/db/update.html similarity index 97% rename from web/views/@default/db/updatePopup.html rename to web/views/@default/db/update.html index 92261569..a06dc550 100644 --- a/web/views/@default/db/updatePopup.html +++ b/web/views/@default/db/update.html @@ -1,6 +1,5 @@ -{$layout "layout_popup"} - -

修改节点

+{$layout} +{$template "menu"}
diff --git a/web/views/@default/db/update.js b/web/views/@default/db/update.js new file mode 100644 index 00000000..22dd82ec --- /dev/null +++ b/web/views/@default/db/update.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifySuccess("保存成功", "/db/node?nodeId=" + this.node.id) +}) \ No newline at end of file