diff --git a/internal/web/actions/default/servers/ipbox/addIP.go b/internal/web/actions/default/servers/ipbox/addIP.go index 3db3089c..8d0064f6 100644 --- a/internal/web/actions/default/servers/ipbox/addIP.go +++ b/internal/web/actions/default/servers/ipbox/addIP.go @@ -14,19 +14,30 @@ type AddIPAction struct { } func (this *AddIPAction) RunPost(params struct { - ListId int64 - Ip string + ListId int64 + Ip string + ExpiredAt int64 }) { + var itemId int64 = 0 + + defer func() { + this.CreateLogInfo("在名单 %d 中创建IP %d", params.ListId, itemId) + }() + var ipType = "ipv4" if strings.Contains(params.Ip, ":") { ipType = "ipv6" } - _, err := this.RPC().IPItemRPC().CreateIPItem(this.AdminContext(), &pb.CreateIPItemRequest{ + if params.ExpiredAt <= 0 { + params.ExpiredAt = time.Now().Unix() + 86400 + } + + createResp, err := this.RPC().IPItemRPC().CreateIPItem(this.AdminContext(), &pb.CreateIPItemRequest{ IpListId: params.ListId, IpFrom: params.Ip, IpTo: "", - ExpiredAt: time.Now().Unix() + 86400, // TODO 可以自定义时间 + ExpiredAt: params.ExpiredAt, Reason: "从IPBox中加入名单", Type: ipType, EventLevel: "critical", @@ -36,5 +47,7 @@ func (this *AddIPAction) RunPost(params struct { return } + itemId = createResp.IpItemId + this.Success() } diff --git a/internal/web/actions/default/servers/ipbox/deleteFromList.go b/internal/web/actions/default/servers/ipbox/deleteFromList.go new file mode 100644 index 00000000..80a6fd5e --- /dev/null +++ b/internal/web/actions/default/servers/ipbox/deleteFromList.go @@ -0,0 +1,27 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package ipbox + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type DeleteFromListAction struct { + actionutils.ParentAction +} + +func (this *DeleteFromListAction) RunPost(params struct { + ListId int64 + ItemId int64 +}) { + defer this.CreateLogInfo("从IP名单 %d 中删除IP %d", params.ListId, params.ItemId) + + _, err := this.RPC().IPItemRPC().DeleteIPItem(this.AdminContext(), &pb.DeleteIPItemRequest{IpItemId: params.ItemId}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/ipbox/index.go b/internal/web/actions/default/servers/ipbox/index.go index eeb02523..d8c42872 100644 --- a/internal/web/actions/default/servers/ipbox/index.go +++ b/internal/web/actions/default/servers/ipbox/index.go @@ -37,17 +37,44 @@ func (this *IndexAction) RunGet(params struct { this.Data["isp"] = regionResp.IpRegion.Isp // IP列表 - ipListResp, err := this.RPC().IPListRPC().FindEnabledIPListContainsIP(this.AdminContext(), &pb.FindEnabledIPListContainsIPRequest{Ip: params.Ip}) + ipListResp, err := this.RPC().IPListRPC().FindEnabledIPListContainsIP(this.AdminContext(), &pb.FindEnabledIPListContainsIPRequest{ + Ip: params.Ip, + }) if err != nil { this.ErrorPage(err) return } var ipListMaps = []maps.Map{} for _, ipList := range ipListResp.IpLists { + itemsResp, err := this.RPC().IPItemRPC().ListIPItemsWithListId(this.AdminContext(), &pb.ListIPItemsWithListIdRequest{ + IpListId: ipList.Id, + Keyword: "", + IpFrom: params.Ip, + IpTo: "", + Offset: 0, + Size: 1, + }) + if err != nil { + this.ErrorPage(err) + return + } + var items = itemsResp.IpItems + if len(items) == 0 { + continue + } + var item = items[0] + + var expiredTime = "" + if item.ExpiredAt > 0 { + expiredTime = timeutil.FormatTime("Y-m-d H:i:s", item.ExpiredAt) + } + ipListMaps = append(ipListMaps, maps.Map{ - "id": ipList.Id, - "name": ipList.Name, - "type": ipList.Type, + "id": ipList.Id, + "name": ipList.Name, + "type": ipList.Type, + "itemExpiredTime": expiredTime, + "itemId": item.Id, }) } this.Data["ipLists"] = ipListMaps @@ -58,7 +85,7 @@ func (this *IndexAction) RunGet(params struct { IsPublic: true, Keyword: "", Offset: 0, - Size: 10, // TODO 将来考虑到支持更多的黑名单 + Size: 20, // TODO 将来考虑到支持更多的黑名单 }) if err != nil { this.ErrorPage(err) diff --git a/internal/web/actions/default/servers/ipbox/init.go b/internal/web/actions/default/servers/ipbox/init.go index 7c88a2b3..6ed35dc4 100644 --- a/internal/web/actions/default/servers/ipbox/init.go +++ b/internal/web/actions/default/servers/ipbox/init.go @@ -15,6 +15,7 @@ func init() { Prefix("/servers/ipbox"). Get("", new(IndexAction)). Post("/addIP", new(AddIPAction)). + Post("/deleteFromList", new(DeleteFromListAction)). EndAll() }) } diff --git a/web/public/js/components/common/datetime-input.js b/web/public/js/components/common/datetime-input.js index c0dc7ac5..c412b117 100644 --- a/web/public/js/components/common/datetime-input.js +++ b/web/public/js/components/common/datetime-input.js @@ -135,6 +135,7 @@ Vue.component("datetime-input", { this.timestamp = Math.floor(date.getTime() / 1000) }, leadingZero: function (s, l) { + s = s.toString() if (l <= s.length) { return s } @@ -142,6 +143,18 @@ Vue.component("datetime-input", { s = "0" + s } return s + }, + resultTimestamp: function () { + return this.timestamp + }, + nextDays: function (days) { + let date = new Date() + date.setTime(date.getTime() + days * 86400 * 1000) + this.day = date.getFullYear() + "-" + this.leadingZero(date.getMonth() + 1, 2) + "-" + this.leadingZero(date.getDate(), 2) + this.hour = this.leadingZero(date.getHours(), 2) + this.minute = this.leadingZero(date.getMinutes(), 2) + this.second = this.leadingZero(date.getSeconds(), 2) + this.change() } }, template: `
@@ -156,5 +169,6 @@ Vue.component("datetime-input", {
:
+

常用时间:  1天  |  3天  |  一周  |  30天 

` }) \ No newline at end of file diff --git a/web/views/@default/servers/ipbox/index.html b/web/views/@default/servers/ipbox/index.html index c7358fa3..83fd0efd 100644 --- a/web/views/@default/servers/ipbox/index.html +++ b/web/views/@default/servers/ipbox/index.html @@ -23,19 +23,44 @@ 所在IP名单 -
+
{{ipList.name}} + + + (不过期) + (有效至:{{ipList.itemExpiredTime}}) + + +
+ 暂时未在任何名单。     - 加入到黑名单 +
+ 加入到其他黑名单 +
加入黑名单 - - {{ipList.name}} - +
+ + + + + + + + + +
过期时间 + +
选择名单 * + + {{ipList.name}} + +
+
diff --git a/web/views/@default/servers/ipbox/index.js b/web/views/@default/servers/ipbox/index.js index df1603b4..c3050d25 100644 --- a/web/views/@default/servers/ipbox/index.js +++ b/web/views/@default/servers/ipbox/index.js @@ -2,7 +2,11 @@ Tea.context(function () { this.blackListsVisible = false this.allPublicBlackIPLists = this.publicBlackIPLists.$copy() + + this.defaultItemExpiredAt = Math.floor(new Date().getTime() / 1000) + 86400 this.showBlackLists = function () { + this.defaultItemExpiredAt = Math.floor(new Date().getTime() / 1000) + 86400 + let that = this this.publicBlackIPLists = this.allPublicBlackIPLists.filter(function (allList) { let found = true @@ -16,17 +20,33 @@ Tea.context(function () { this.blackListsVisible = !this.blackListsVisible } + this.selectedListId = 0 this.addBlackIP = function (list) { + this.selectedListId = list.id + let expiredAt = this.$refs.itemExpiredTimestamp.resultTimestamp() let that = this - teaweb.confirm("确定要将此IP添加到此黑名单吗?", function () { + teaweb.confirm("确定要将此IP添加到黑名单'" + list.name + "'吗?", function () { that.$post(".addIP") .params({ listId: list.id, - ip: that.ip + ip: that.ip, + expiredAt: expiredAt }) .success(function () { - that.ipLists.push(list) - that.blackListsVisible = false + teaweb.reload() + }) + }) + } + + this.deleteFromList = function (listId, itemId) { + teaweb.confirm("确定要从此名单中删除此IP吗?", function () { + this.$post(".deleteFromList") + .params({ + listId: listId, + itemId: itemId + }) + .success(function () { + teaweb.reload() }) }) }