From 8d8db37d9dd745e9693a4870f003c3096bcca5b1 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Wed, 30 Dec 2020 22:00:21 +0800 Subject: [PATCH] =?UTF-8?q?[API=E8=8A=82=E7=82=B9]=E6=98=BE=E7=A4=BAAPI?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E8=BF=90=E8=A1=8C=E6=97=A5=E5=BF=97=20=20[?= =?UTF-8?q?=E7=94=A8=E6=88=B7]=E5=A2=9E=E5=8A=A0=E5=8F=AF=E7=94=A8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/web/actions/default/api/node/init.go | 1 + internal/web/actions/default/api/node/logs.go | 71 +++++++++++++++++ .../web/actions/default/users/features.go | 78 +++++++++++++++++++ internal/web/actions/default/users/init.go | 1 + web/views/@default/api/node/@menu.html | 1 + web/views/@default/api/node/logs.css | 5 ++ web/views/@default/api/node/logs.css.map | 1 + web/views/@default/api/node/logs.html | 20 +++++ web/views/@default/api/node/logs.less | 4 + web/views/@default/users/@user_menu.html | 1 + web/views/@default/users/features.css | 4 + web/views/@default/users/features.css.map | 1 + web/views/@default/users/features.html | 24 ++++++ web/views/@default/users/features.js | 3 + web/views/@default/users/features.less | 5 ++ 15 files changed, 220 insertions(+) create mode 100644 internal/web/actions/default/api/node/logs.go create mode 100644 internal/web/actions/default/users/features.go create mode 100644 web/views/@default/api/node/logs.css create mode 100644 web/views/@default/api/node/logs.css.map create mode 100644 web/views/@default/api/node/logs.html create mode 100644 web/views/@default/api/node/logs.less create mode 100644 web/views/@default/users/features.css create mode 100644 web/views/@default/users/features.css.map create mode 100644 web/views/@default/users/features.html create mode 100644 web/views/@default/users/features.js create mode 100644 web/views/@default/users/features.less diff --git a/internal/web/actions/default/api/node/init.go b/internal/web/actions/default/api/node/init.go index f485d5d4..a0b585d8 100644 --- a/internal/web/actions/default/api/node/init.go +++ b/internal/web/actions/default/api/node/init.go @@ -23,6 +23,7 @@ func init() { Get("", new(IndexAction)). GetPost("/update", new(UpdateAction)). Get("/install", new(InstallAction)). + Get("/logs", new(LogsAction)). EndAll() }) diff --git a/internal/web/actions/default/api/node/logs.go b/internal/web/actions/default/api/node/logs.go new file mode 100644 index 00000000..d10126be --- /dev/null +++ b/internal/web/actions/default/api/node/logs.go @@ -0,0 +1,71 @@ +package node + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "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("", "node", "log") + this.SecondMenu("nodes") +} + +func (this *LogsAction) RunGet(params struct { + NodeId int64 +}) { + apiNodeResp, err := this.RPC().APINodeRPC().FindEnabledAPINode(this.AdminContext(), &pb.FindEnabledAPINodeRequest{NodeId: params.NodeId}) + if err != nil { + this.ErrorPage(err) + return + } + apiNode := apiNodeResp.Node + if apiNode == nil { + this.NotFound("apiNode", params.NodeId) + return + } + + this.Data["node"] = maps.Map{ + "id": apiNode.Id, + "name": apiNode.Name, + } + + countResp, err := this.RPC().NodeLogRPC().CountNodeLogs(this.AdminContext(), &pb.CountNodeLogsRequest{ + Role: "api", + NodeId: params.NodeId, + }) + 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: "api", + 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/users/features.go b/internal/web/actions/default/users/features.go new file mode 100644 index 00000000..f35a99ce --- /dev/null +++ b/internal/web/actions/default/users/features.go @@ -0,0 +1,78 @@ +package users + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/users/userutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/lists" + "github.com/iwind/TeaGo/maps" +) + +type FeaturesAction struct { + actionutils.ParentAction +} + +func (this *FeaturesAction) Init() { + this.Nav("", "", "feature") +} + +func (this *FeaturesAction) RunGet(params struct { + UserId int64 +}) { + err := userutils.InitUser(this.Parent(), params.UserId) + if err != nil { + this.ErrorPage(err) + return + } + + featuresResp, err := this.RPC().UserRPC().FindAllUserFeatureDefinitions(this.AdminContext(), &pb.FindAllUserFeatureDefinitionsRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + allFeatures := featuresResp.Features + + userFeaturesResp, err := this.RPC().UserRPC().FindUserFeatures(this.AdminContext(), &pb.FindUserFeaturesRequest{UserId: params.UserId}) + if err != nil { + this.ErrorPage(err) + return + } + userFeatureCodes := []string{} + for _, userFeature := range userFeaturesResp.Features { + userFeatureCodes = append(userFeatureCodes, userFeature.Code) + } + + featureMaps := []maps.Map{} + for _, feature := range allFeatures { + featureMaps = append(featureMaps, maps.Map{ + "name": feature.Name, + "code": feature.Code, + "description": feature.Description, + "isChecked": lists.ContainsString(userFeatureCodes, feature.Code), + }) + } + this.Data["features"] = featureMaps + + this.Show() +} + +func (this *FeaturesAction) RunPost(params struct { + UserId int64 + Codes []string + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + defer this.CreateLogInfo("设置用户 %d 的功能列表", params.UserId) + + _, err := this.RPC().UserRPC().UpdateUserFeatures(this.AdminContext(), &pb.UpdateUserFeaturesRequest{ + UserId: params.UserId, + FeatureCodes: params.Codes, + }) + if err != nil { + this.ErrorPage(err) + return + } + this.Success() +} diff --git a/internal/web/actions/default/users/init.go b/internal/web/actions/default/users/init.go index 53a4a83e..3776f131 100644 --- a/internal/web/actions/default/users/init.go +++ b/internal/web/actions/default/users/init.go @@ -17,6 +17,7 @@ func init() { Get("/user", new(UserAction)). GetPost("/update", new(UpdateAction)). Post("/delete", new(DeleteAction)). + GetPost("/features", new(FeaturesAction)). EndAll() }) } diff --git a/web/views/@default/api/node/@menu.html b/web/views/@default/api/node/@menu.html index 297c8d5e..20f96759 100644 --- a/web/views/@default/api/node/@menu.html +++ b/web/views/@default/api/node/@menu.html @@ -2,6 +2,7 @@ 节点列表 | "{{node.name}}"详情 + 运行日志 安装节点 修改节点 diff --git a/web/views/@default/api/node/logs.css b/web/views/@default/api/node/logs.css new file mode 100644 index 00000000..dafa1562 --- /dev/null +++ b/web/views/@default/api/node/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/api/node/logs.css.map b/web/views/@default/api/node/logs.css.map new file mode 100644 index 00000000..6ae867b7 --- /dev/null +++ b/web/views/@default/api/node/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/api/node/logs.html b/web/views/@default/api/node/logs.html new file mode 100644 index 00000000..e42bc529 --- /dev/null +++ b/web/views/@default/api/node/logs.html @@ -0,0 +1,20 @@ +{$layout} + + {$template "menu"} + +

暂时还没有日志。

+ + + + + + + + + + +
+
[{{log.createdTime}}][{{log.createdTime}}][{{log.tag}}]{{log.description}}
+
+ +
\ No newline at end of file diff --git a/web/views/@default/api/node/logs.less b/web/views/@default/api/node/logs.less new file mode 100644 index 00000000..9accd63d --- /dev/null +++ b/web/views/@default/api/node/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/users/@user_menu.html b/web/views/@default/users/@user_menu.html index f43bfbf9..fe9b5c47 100644 --- a/web/views/@default/users/@user_menu.html +++ b/web/views/@default/users/@user_menu.html @@ -3,4 +3,5 @@ | {{user.fullname}}  ({{user.username}}) 修改 + 功能 \ No newline at end of file diff --git a/web/views/@default/users/features.css b/web/views/@default/users/features.css new file mode 100644 index 00000000..0992bd26 --- /dev/null +++ b/web/views/@default/users/features.css @@ -0,0 +1,4 @@ +.feature-boxes .feature-box { + margin-bottom: 0.7em; +} +/*# sourceMappingURL=features.css.map */ \ No newline at end of file diff --git a/web/views/@default/users/features.css.map b/web/views/@default/users/features.css.map new file mode 100644 index 00000000..ff19d0e1 --- /dev/null +++ b/web/views/@default/users/features.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["features.less"],"names":[],"mappings":"AAAA,cACC;EACC,oBAAA","file":"features.css"} \ No newline at end of file diff --git a/web/views/@default/users/features.html b/web/views/@default/users/features.html new file mode 100644 index 00000000..c48d721f --- /dev/null +++ b/web/views/@default/users/features.html @@ -0,0 +1,24 @@ +{$layout} +{$template "user_menu"} + +
+ +
+ + + + + + + + +
功能列表 +
+
+ {{feature.name}} +

{{feature.description}}

+
+
+
+ +
\ No newline at end of file diff --git a/web/views/@default/users/features.js b/web/views/@default/users/features.js new file mode 100644 index 00000000..295a9aaf --- /dev/null +++ b/web/views/@default/users/features.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyReloadSuccess("保存成功") +}) \ No newline at end of file diff --git a/web/views/@default/users/features.less b/web/views/@default/users/features.less new file mode 100644 index 00000000..b6c049c9 --- /dev/null +++ b/web/views/@default/users/features.less @@ -0,0 +1,5 @@ +.feature-boxes { + .feature-box { + margin-bottom: 0.7em; + } +}