修复一些边界问题

This commit is contained in:
2026-04-17 16:27:29 +08:00
parent fd475d3e63
commit 6db3caaecb
6 changed files with 34 additions and 30 deletions

View File

@@ -31,6 +31,15 @@ services:
ports: ports:
- "5433:5432" - "5433:5432"
asynqmon:
image: hibiken/asynqmon:latest
environment:
- REDIS_ADDR=redis:6379
ports:
- "9800:8080"
depends_on:
- redis
volumes: volumes:
postgres_data: postgres_data:
redis_data: redis_data:

View File

@@ -15,12 +15,12 @@ func PageAdminByAdmin(c *fiber.Ctx) error {
return err return err
} }
var req PageAdminsReq var req core.PageReq
if err := g.Validator.ParseBody(c, &req); err != nil { if err := g.Validator.ParseBody(c, &req); err != nil {
return err return err
} }
list, total, err := s.Admin.Page(req.PageReq) list, total, err := s.Admin.Page(req)
if err != nil { if err != nil {
return err return err
} }
@@ -33,10 +33,6 @@ func PageAdminByAdmin(c *fiber.Ctx) error {
}) })
} }
type PageAdminsReq struct {
core.PageReq
}
func AllAdminByAdmin(c *fiber.Ctx) error { func AllAdminByAdmin(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRead) _, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeAdminRead)
if err != nil { if err != nil {

View File

@@ -201,7 +201,7 @@ func CreateChannel(c *fiber.Ctx) error {
req.AuthType == s.ChannelAuthTypeIp, req.AuthType == s.ChannelAuthTypeIp,
req.AuthType == s.ChannelAuthTypePass, req.AuthType == s.ChannelAuthTypePass,
req.Count, req.Count,
s.EdgeFilter{ &s.EdgeFilter{
Isp: isp, Isp: isp,
Prov: req.Prov, Prov: req.Prov,
City: req.City, City: req.City,

View File

@@ -24,7 +24,7 @@ var Channel = &channelServer{
} }
type ChannelServiceProvider interface { 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 RemoveChannels(batch string) error
} }
@@ -32,8 +32,8 @@ type channelServer struct {
provider ChannelServiceProvider provider ChannelServiceProvider
} }
func (s *channelServer) CreateChannels(source netip.Addr, resourceId int32, authWhitelist bool, authPassword bool, count int, edgeFilter ...EdgeFilter) ([]*m.Channel, error) { 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...) return s.provider.CreateChannels(source, resourceId, authWhitelist, authPassword, count, edgeFilter)
} }
func (s *channelServer) RemoveChannels(batch string) error { func (s *channelServer) RemoveChannels(batch string) error {
@@ -232,7 +232,7 @@ func regChans(proxy int32, chans []netip.AddrPort) error {
// 缩容通道 // 缩容通道
func remChans(proxy int32) error { func remChans(proxy int32) error {
key := freeChansKey + ":" + strconv.Itoa(int(proxy)) 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 { if err != nil {
return fmt.Errorf("缩容通道失败: %w", err) return fmt.Errorf("缩容通道失败: %w", err)
} }
@@ -268,11 +268,12 @@ func lockChans(proxy int32, batch string, count int) ([]netip.AddrPort, error) {
} }
var RedisScriptLockChans = redis.NewScript(` var RedisScriptLockChans = redis.NewScript(`
local free_key = KEYS[1] local free_key = KEYS[1]
local batch_key = KEYS[2] local batch_key = KEYS[2]
local count = tonumber(ARGV[1]) 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 return nil
end end
@@ -301,16 +302,17 @@ func freeChans(proxy int32, batch string) error {
} }
var RedisScriptFreeChans = redis.NewScript(` var RedisScriptFreeChans = redis.NewScript(`
local free_key = KEYS[1] local free_key = KEYS[1]
local batch_key = KEYS[2] local batch_key = KEYS[2]
local chans = redis.call("LRANGE", batch_key, 0, -1) local chans = redis.call("LRANGE", batch_key, 0, -1)
redis.call("DEL", batch_key) if #chans == 0 then
return 1
if redis.call("EXISTS", free_key) == 1 then
redis.call("SADD", free_key, unpack(chans))
end end
redis.call("SADD", free_key, unpack(chans))
redis.call("DEL", batch_key)
return 1 return 1
`) `)

View File

@@ -23,10 +23,9 @@ import (
type channelBaiyinProvider struct{} type channelBaiyinProvider struct{}
func (s *channelBaiyinProvider) CreateChannels(source netip.Addr, resourceId int32, authWhitelist bool, authPassword bool, count int, edgeFilter ...EdgeFilter) ([]*m.Channel, error) { func (s *channelBaiyinProvider) CreateChannels(source netip.Addr, resourceId int32, authWhitelist bool, authPassword bool, count int, filter *EdgeFilter) ([]*m.Channel, error) {
var filter *EdgeFilter = nil if filter == nil {
if len(edgeFilter) > 0 { return nil, core.NewBizErr("缺少节点过滤条件")
filter = &edgeFilter[0]
} }
now := time.Now() now := time.Now()
@@ -86,7 +85,7 @@ func (s *channelBaiyinProvider) CreateChannels(source netip.Addr, resourceId int
return nil, core.NewBizErr("获取可用节点失败", err) return nil, core.NewBizErr("获取可用节点失败", err)
} }
if edgesResp.Total != count && len(edgesResp.Edges) != count { if edgesResp.Total != count && len(edgesResp.Edges) != count {
return nil, core.NewBizErr("地区可用节点数量不足 [%s, %s] [%s]") return nil, core.NewBizErr("地区可用节点数量不足")
} }
edges := edgesResp.Edges edges := edgesResp.Edges
@@ -98,10 +97,6 @@ func (s *channelBaiyinProvider) CreateChannels(source netip.Addr, resourceId int
ch := chans[i] ch := chans[i]
edge := edges[i] edge := edges[i]
if err != nil {
return nil, core.NewBizErr("解析通道地址失败", err)
}
// 通道数据 // 通道数据
channels[i] = &m.Channel{ channels[i] = &m.Channel{
UserID: user.ID, 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]) gateway := g.NewGateway(proxy.IP.String(), secret[0], secret[1])
err := gateway.GatewayPortConfigs(configs) err := gateway.GatewayPortConfigs(configs)
if err != nil { if err != nil {
@@ -321,6 +316,6 @@ func (s *channelBaiyinProvider) RemoveChannels(batch string) error {
return err return err
} }
slog.Debug("清除代理端口配置", "time", time.Since(start).String()) slog.Debug("清除代理端口配置", "duration", time.Since(start).String())
return nil return nil
} }

View File

@@ -2,6 +2,7 @@ package services
import ( import (
"fmt" "fmt"
"log/slog"
"platform/pkg/u" "platform/pkg/u"
"platform/web/core" "platform/web/core"
m "platform/web/models" 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))). Where(q.ProductSku.Code.Eq(skuCode), q.ProductSku.Status.Eq(int32(m.SkuStatusEnabled))).
Take() Take()
if err != nil { 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)
} }
// 原价 // 原价