修复一些边界问题
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
`)
|
`)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 原价
|
// 原价
|
||||||
|
|||||||
Reference in New Issue
Block a user