From 6db3caaecbc9298d171abb7197a5a4a5be9ef96b Mon Sep 17 00:00:00 2001 From: luorijun Date: Fri, 17 Apr 2026 16:27:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9B=E8=BE=B9?= =?UTF-8?q?=E7=95=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yaml | 9 +++++++++ web/handlers/admin.go | 8 ++------ web/handlers/channel.go | 2 +- web/services/channel.go | 24 +++++++++++++----------- web/services/channel_baiyin.go | 17 ++++++----------- web/services/resource.go | 4 +++- 6 files changed, 34 insertions(+), 30 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index e2032a6..e86ba95 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -31,6 +31,15 @@ services: ports: - "5433:5432" + asynqmon: + image: hibiken/asynqmon:latest + environment: + - REDIS_ADDR=redis:6379 + ports: + - "9800:8080" + depends_on: + - redis + volumes: postgres_data: redis_data: diff --git a/web/handlers/admin.go b/web/handlers/admin.go index a1e1753..9fa0879 100644 --- a/web/handlers/admin.go +++ b/web/handlers/admin.go @@ -15,12 +15,12 @@ func PageAdminByAdmin(c *fiber.Ctx) error { return err } - var req PageAdminsReq + var req core.PageReq if err := g.Validator.ParseBody(c, &req); err != nil { return err } - list, total, err := s.Admin.Page(req.PageReq) + list, total, err := s.Admin.Page(req) if err != nil { return err } @@ -33,10 +33,6 @@ func PageAdminByAdmin(c *fiber.Ctx) error { }) } -type PageAdminsReq struct { - core.PageReq -} - func AllAdminByAdmin(c *fiber.Ctx) error { _, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRead) if err != nil { diff --git a/web/handlers/channel.go b/web/handlers/channel.go index f8d7d56..174b60c 100644 --- a/web/handlers/channel.go +++ b/web/handlers/channel.go @@ -201,7 +201,7 @@ func CreateChannel(c *fiber.Ctx) error { req.AuthType == s.ChannelAuthTypeIp, req.AuthType == s.ChannelAuthTypePass, req.Count, - s.EdgeFilter{ + &s.EdgeFilter{ Isp: isp, Prov: req.Prov, City: req.City, diff --git a/web/services/channel.go b/web/services/channel.go index a6a3148..987e168 100644 --- a/web/services/channel.go +++ b/web/services/channel.go @@ -24,7 +24,7 @@ var Channel = &channelServer{ } type ChannelServiceProvider interface { - CreateChannels(source netip.Addr, resourceId int32, authWhitelist bool, authPassword bool, count int, edgeFilter ...EdgeFilter) ([]*m.Channel, error) + CreateChannels(source netip.Addr, resourceId int32, authWhitelist bool, authPassword bool, count int, edgeFilter *EdgeFilter) ([]*m.Channel, error) RemoveChannels(batch string) error } @@ -32,8 +32,8 @@ type channelServer struct { provider ChannelServiceProvider } -func (s *channelServer) CreateChannels(source netip.Addr, resourceId int32, authWhitelist bool, authPassword bool, count int, edgeFilter ...EdgeFilter) ([]*m.Channel, error) { - return s.provider.CreateChannels(source, resourceId, authWhitelist, authPassword, count, edgeFilter...) +func (s *channelServer) CreateChannels(source netip.Addr, resourceId int32, authWhitelist bool, authPassword bool, count int, edgeFilter *EdgeFilter) ([]*m.Channel, error) { + return s.provider.CreateChannels(source, resourceId, authWhitelist, authPassword, count, edgeFilter) } func (s *channelServer) RemoveChannels(batch string) error { @@ -232,7 +232,7 @@ func regChans(proxy int32, chans []netip.AddrPort) error { // 缩容通道 func remChans(proxy int32) error { key := freeChansKey + ":" + strconv.Itoa(int(proxy)) - err := g.Redis.SRem(context.Background(), key).Err() + err := g.Redis.Del(context.Background(), key).Err() if err != nil { return fmt.Errorf("缩容通道失败: %w", err) } @@ -268,11 +268,12 @@ func lockChans(proxy int32, batch string, count int) ([]netip.AddrPort, error) { } var RedisScriptLockChans = redis.NewScript(` -local free_key = KEYS[1] +local free_key = KEYS[1] local batch_key = KEYS[2] local count = tonumber(ARGV[1]) -if redis.call("SCARD", free_key) < count then +local free_count = redis.call("SCARD", free_key) +if count <= 0 or free_count < count then return nil end @@ -301,16 +302,17 @@ func freeChans(proxy int32, batch string) error { } var RedisScriptFreeChans = redis.NewScript(` -local free_key = KEYS[1] +local free_key = KEYS[1] local batch_key = KEYS[2] local chans = redis.call("LRANGE", batch_key, 0, -1) -redis.call("DEL", batch_key) - -if redis.call("EXISTS", free_key) == 1 then - redis.call("SADD", free_key, unpack(chans)) +if #chans == 0 then + return 1 end +redis.call("SADD", free_key, unpack(chans)) +redis.call("DEL", batch_key) + return 1 `) diff --git a/web/services/channel_baiyin.go b/web/services/channel_baiyin.go index f21a280..047a67b 100644 --- a/web/services/channel_baiyin.go +++ b/web/services/channel_baiyin.go @@ -23,10 +23,9 @@ import ( type channelBaiyinProvider struct{} -func (s *channelBaiyinProvider) CreateChannels(source netip.Addr, resourceId int32, authWhitelist bool, authPassword bool, count int, edgeFilter ...EdgeFilter) ([]*m.Channel, error) { - var filter *EdgeFilter = nil - if len(edgeFilter) > 0 { - filter = &edgeFilter[0] +func (s *channelBaiyinProvider) CreateChannels(source netip.Addr, resourceId int32, authWhitelist bool, authPassword bool, count int, filter *EdgeFilter) ([]*m.Channel, error) { + if filter == nil { + return nil, core.NewBizErr("缺少节点过滤条件") } now := time.Now() @@ -86,7 +85,7 @@ func (s *channelBaiyinProvider) CreateChannels(source netip.Addr, resourceId int return nil, core.NewBizErr("获取可用节点失败", err) } if edgesResp.Total != count && len(edgesResp.Edges) != count { - return nil, core.NewBizErr("地区可用节点数量不足 [%s, %s] [%s]") + return nil, core.NewBizErr("地区可用节点数量不足") } edges := edgesResp.Edges @@ -98,10 +97,6 @@ func (s *channelBaiyinProvider) CreateChannels(source netip.Addr, resourceId int ch := chans[i] edge := edges[i] - if err != nil { - return nil, core.NewBizErr("解析通道地址失败", err) - } - // 通道数据 channels[i] = &m.Channel{ UserID: user.ID, @@ -301,7 +296,7 @@ func (s *channelBaiyinProvider) RemoveChannels(batch string) error { }) // 清空通道配置 - secret := strings.Split(*proxy.Secret, ":") + secret := strings.Split(u.Z(proxy.Secret), ":") gateway := g.NewGateway(proxy.IP.String(), secret[0], secret[1]) err := gateway.GatewayPortConfigs(configs) if err != nil { @@ -321,6 +316,6 @@ func (s *channelBaiyinProvider) RemoveChannels(batch string) error { return err } - slog.Debug("清除代理端口配置", "time", time.Since(start).String()) + slog.Debug("清除代理端口配置", "duration", time.Since(start).String()) return nil } diff --git a/web/services/resource.go b/web/services/resource.go index 6c0e1b8..2106676 100644 --- a/web/services/resource.go +++ b/web/services/resource.go @@ -2,6 +2,7 @@ package services import ( "fmt" + "log/slog" "platform/pkg/u" "platform/web/core" m "platform/web/models" @@ -151,7 +152,8 @@ func (s *resourceService) CalcPrice(skuCode string, count int32, user *m.User, c Where(q.ProductSku.Code.Eq(skuCode), q.ProductSku.Status.Eq(int32(m.SkuStatusEnabled))). Take() if err != nil { - return nil, nil, nil, decimal.Zero, decimal.Zero, decimal.Zero, core.NewServErr(fmt.Sprintf("产品不可用 %s", skuCode), err) + slog.Debug("查询产品失败", "skuCode", skuCode) + return nil, nil, nil, decimal.Zero, decimal.Zero, decimal.Zero, core.NewBizErr(fmt.Sprintf("产品不可用", skuCode), err) } // 原价