diff --git a/internal/web/actions/default/servers/components/waf/ipadmin/lists.go b/internal/web/actions/default/servers/components/waf/ipadmin/lists.go index 1a03b754..bb38fe19 100644 --- a/internal/web/actions/default/servers/components/waf/ipadmin/lists.go +++ b/internal/web/actions/default/servers/components/waf/ipadmin/lists.go @@ -7,6 +7,7 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/iwind/TeaGo/maps" timeutil "github.com/iwind/TeaGo/utils/time" + "time" ) type ListsAction struct { @@ -109,6 +110,7 @@ func (this *ListsAction) RunGet(params struct { "sourceGroup": sourceGroupMap, "sourceSet": sourceSetMap, "sourceServer": sourceServerMap, + "lifeSeconds": item.ExpiredAt - time.Now().Unix(), }) } this.Data["items"] = itemMaps diff --git a/internal/web/actions/default/servers/groups/group/settings/waf/ipadmin/allowList.go b/internal/web/actions/default/servers/groups/group/settings/waf/ipadmin/allowList.go index 3db9f4e2..54831900 100644 --- a/internal/web/actions/default/servers/groups/group/settings/waf/ipadmin/allowList.go +++ b/internal/web/actions/default/servers/groups/group/settings/waf/ipadmin/allowList.go @@ -113,6 +113,7 @@ func (this *AllowListAction) RunGet(params struct { "ipTo": item.IpTo, "createdTime": timeutil.FormatTime("Y-m-d", item.CreatedAt), "expiredTime": expiredTime, + "lifeSeconds": item.ExpiredAt - time.Now().Unix(), "reason": item.Reason, "type": item.Type, "isExpired": item.ExpiredAt > 0 && item.ExpiredAt < time.Now().Unix(), diff --git a/internal/web/actions/default/servers/groups/group/settings/waf/ipadmin/denyList.go b/internal/web/actions/default/servers/groups/group/settings/waf/ipadmin/denyList.go index e41e6ca0..1304d22b 100644 --- a/internal/web/actions/default/servers/groups/group/settings/waf/ipadmin/denyList.go +++ b/internal/web/actions/default/servers/groups/group/settings/waf/ipadmin/denyList.go @@ -113,6 +113,7 @@ func (this *DenyListAction) RunGet(params struct { "ipTo": item.IpTo, "createdTime": timeutil.FormatTime("Y-m-d", item.CreatedAt), "expiredTime": expiredTime, + "lifeSeconds": item.ExpiredAt - time.Now().Unix(), "reason": item.Reason, "type": item.Type, "isExpired": item.ExpiredAt > 0 && item.ExpiredAt < time.Now().Unix(), diff --git a/internal/web/actions/default/servers/iplists/index.go b/internal/web/actions/default/servers/iplists/index.go index 0f6e7143..feb30386 100644 --- a/internal/web/actions/default/servers/iplists/index.go +++ b/internal/web/actions/default/servers/iplists/index.go @@ -22,14 +22,28 @@ func (this *IndexAction) Init() { func (this *IndexAction) RunGet(params struct { Ip string GlobalOnly bool + Unread bool }) { this.Data["type"] = "" this.Data["ip"] = params.Ip this.Data["globalOnly"] = params.GlobalOnly + this.Data["unread"] = params.Unread + + countUnreadResp, err := this.RPC().IPItemRPC().CountAllEnabledIPItems(this.AdminContext(), &pb.CountAllEnabledIPItemsRequest{ + Ip: params.Ip, + GlobalOnly: params.GlobalOnly, + Unread: true, + }) + if err != nil { + this.ErrorPage(err) + return + } + this.Data["countUnread"] = countUnreadResp.Count countResp, err := this.RPC().IPItemRPC().CountAllEnabledIPItems(this.AdminContext(), &pb.CountAllEnabledIPItemsRequest{ Ip: params.Ip, GlobalOnly: params.GlobalOnly, + Unread: params.Unread, }) if err != nil { this.ErrorPage(err) @@ -42,6 +56,7 @@ func (this *IndexAction) RunGet(params struct { itemsResp, err := this.RPC().IPItemRPC().ListAllEnabledIPItems(this.AdminContext(), &pb.ListAllEnabledIPItemsRequest{ Ip: params.Ip, GlobalOnly: params.GlobalOnly, + Unread: params.Unread, Offset: page.Offset, Size: page.Size, }) @@ -127,6 +142,8 @@ func (this *IndexAction) RunGet(params struct { "expiredTime": expiredTime, "reason": item.Reason, "type": item.Type, + "isRead": item.IsRead, + "lifeSeconds": item.ExpiredAt - time.Now().Unix(), "eventLevelName": firewallconfigs.FindFirewallEventLevelName(item.EventLevel), "sourcePolicy": sourcePolicyMap, "sourceGroup": sourceGroupMap, diff --git a/internal/web/actions/default/servers/iplists/init.go b/internal/web/actions/default/servers/iplists/init.go index bac82765..4d22db93 100644 --- a/internal/web/actions/default/servers/iplists/init.go +++ b/internal/web/actions/default/servers/iplists/init.go @@ -32,6 +32,7 @@ func init() { GetPost("/updateIPPopup", new(UpdateIPPopupAction)). Post("/deleteIP", new(DeleteIPAction)). Get("/accessLogsPopup", new(AccessLogsPopupAction)). + Post("/readAll", new(ReadAllAction)). // 防火墙 GetPost("/bindHTTPFirewallPopup", new(BindHTTPFirewallPopupAction)). diff --git a/internal/web/actions/default/servers/iplists/items.go b/internal/web/actions/default/servers/iplists/items.go index bfb208c0..86e70e25 100644 --- a/internal/web/actions/default/servers/iplists/items.go +++ b/internal/web/actions/default/servers/iplists/items.go @@ -8,6 +8,7 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/iwind/TeaGo/maps" timeutil "github.com/iwind/TeaGo/utils/time" + "time" ) type ItemsAction struct { @@ -112,6 +113,7 @@ func (this *ItemsAction) RunGet(params struct { "sourceGroup": sourceGroupMap, "sourceSet": sourceSetMap, "sourceServer": sourceServerMap, + "lifeSeconds": item.ExpiredAt - time.Now().Unix(), }) } this.Data["items"] = itemMaps diff --git a/internal/web/actions/default/servers/iplists/readAll.go b/internal/web/actions/default/servers/iplists/readAll.go new file mode 100644 index 00000000..2d448e00 --- /dev/null +++ b/internal/web/actions/default/servers/iplists/readAll.go @@ -0,0 +1,24 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package iplists + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type ReadAllAction struct { + actionutils.ParentAction +} + +func (this *ReadAllAction) RunPost(params struct{}) { + defer this.CreateLogInfo("将IP名单置为已读") + + _, err := this.RPC().IPItemRPC().UpdateIPItemsRead(this.AdminContext(), &pb.UpdateIPItemsReadRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/server/settings/waf/ipadmin/allowList.go b/internal/web/actions/default/servers/server/settings/waf/ipadmin/allowList.go index 3db9f4e2..54831900 100644 --- a/internal/web/actions/default/servers/server/settings/waf/ipadmin/allowList.go +++ b/internal/web/actions/default/servers/server/settings/waf/ipadmin/allowList.go @@ -113,6 +113,7 @@ func (this *AllowListAction) RunGet(params struct { "ipTo": item.IpTo, "createdTime": timeutil.FormatTime("Y-m-d", item.CreatedAt), "expiredTime": expiredTime, + "lifeSeconds": item.ExpiredAt - time.Now().Unix(), "reason": item.Reason, "type": item.Type, "isExpired": item.ExpiredAt > 0 && item.ExpiredAt < time.Now().Unix(), diff --git a/internal/web/actions/default/servers/server/settings/waf/ipadmin/denyList.go b/internal/web/actions/default/servers/server/settings/waf/ipadmin/denyList.go index e41e6ca0..1304d22b 100644 --- a/internal/web/actions/default/servers/server/settings/waf/ipadmin/denyList.go +++ b/internal/web/actions/default/servers/server/settings/waf/ipadmin/denyList.go @@ -113,6 +113,7 @@ func (this *DenyListAction) RunGet(params struct { "ipTo": item.IpTo, "createdTime": timeutil.FormatTime("Y-m-d", item.CreatedAt), "expiredTime": expiredTime, + "lifeSeconds": item.ExpiredAt - time.Now().Unix(), "reason": item.Reason, "type": item.Type, "isExpired": item.ExpiredAt > 0 && item.ExpiredAt < time.Now().Unix(), diff --git a/internal/web/helpers/menu.go b/internal/web/helpers/menu.go index 7acfa141..dc2974db 100644 --- a/internal/web/helpers/menu.go +++ b/internal/web/helpers/menu.go @@ -9,7 +9,7 @@ import ( "github.com/iwind/TeaGo/maps" ) -func FindAllMenuMaps(nodeLogsType string, countUnreadNodeLogs int64) []maps.Map { +func FindAllMenuMaps(nodeLogsType string, countUnreadNodeLogs int64, countUnreadIPItems int64) []maps.Map { return []maps.Map{ { "code": "dashboard", @@ -50,9 +50,10 @@ func FindAllMenuMaps(nodeLogsType string, countUnreadNodeLogs int64) []maps.Map "code": "waf", }, { - "name": "IP名单", - "url": "/servers/iplists", - "code": "iplist", + "name": "IP名单", + "url": "/servers/iplists", + "code": "iplist", + "badge": countUnreadIPItems, }, { "name": "统计指标", diff --git a/internal/web/helpers/user_must_auth.go b/internal/web/helpers/user_must_auth.go index 0824ff9e..8e43f5b1 100644 --- a/internal/web/helpers/user_must_auth.go +++ b/internal/web/helpers/user_must_auth.go @@ -171,16 +171,21 @@ func (this *userMustAuth) BeforeAction(actionPtr actions.ActionWrapper, paramNam // 菜单配置 func (this *userMustAuth) modules(actionPtr actions.ActionWrapper, adminId int64) []maps.Map { + // 运行日志 var countUnreadNodeLogs int64 = 0 var nodeLogsType = "" + // IP名单 + var countUnreadIPItems int64 = 0 + // 父级动作 parentAction, ok := actionPtr.(actionutils.ActionInterface) if ok { var action = actionPtr.Object() // 未读日志数 - if action.Data.GetString("teaMenu") == "clusters" { + var mainMenu = action.Data.GetString("teaMenu") + if mainMenu == "clusters" { countNodeLogsResp, err := parentAction.RPC().NodeLogRPC().CountNodeLogs(parentAction.AdminContext(), &pb.CountNodeLogsRequest{ Role: nodeconfigs.NodeRoleNode, IsUnread: true, @@ -197,11 +202,18 @@ func (this *userMustAuth) modules(actionPtr actions.ActionWrapper, adminId int64 nodeLogsType = "unread" } } + } else if mainMenu == "servers" { + countUnreadIPItemsResp, err := parentAction.RPC().IPItemRPC().CountAllEnabledIPItems(parentAction.AdminContext(), &pb.CountAllEnabledIPItemsRequest{Unread: true}) + if err != nil { + logs.Error(err) + } else { + countUnreadIPItems = countUnreadIPItemsResp.Count + } } } result := []maps.Map{} - for _, m := range FindAllMenuMaps(nodeLogsType, countUnreadNodeLogs) { + for _, m := range FindAllMenuMaps(nodeLogsType, countUnreadNodeLogs, countUnreadIPItems) { if m.GetString("code") == "finance" && !configloaders.ShowFinance() { continue } diff --git a/web/public/js/components/iplist/ip-list-table.js b/web/public/js/components/iplist/ip-list-table.js index 8f34dd45..5cf284ff 100644 --- a/web/public/js/components/iplist/ip-list-table.js +++ b/web/public/js/components/iplist/ip-list-table.js @@ -70,6 +70,18 @@ Vue.component("ip-list-table", { .success(function () { teaweb.successToast("批量删除成功", 1200, teaweb.reload) }) + }, + formatSeconds: function (seconds) { + if (seconds < 60) { + return seconds + "秒" + } + if (seconds < 3600) { + return Math.ceil(seconds / 60) + "分钟" + } + if (seconds < 86400) { + return Math.ceil(seconds / 3600) + "小时" + } + return Math.ceil(seconds / 86400) + "天" } }, template: `