From 7c684ca0ad78eef019deb75ca54f44c3acf62eaa Mon Sep 17 00:00:00 2001 From: luorijun Date: Fri, 9 May 2025 11:10:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A5=97=E9=A4=90=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E4=BA=8B=E5=8A=A1=E5=9B=9E=E6=BB=9A=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=E4=BF=AE=E5=A4=8D=20http=20dump=20?= =?UTF-8?q?=E6=9C=AA=E6=A0=B9=E6=8D=AE=E7=8E=AF=E5=A2=83=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E9=97=AE=E9=A2=98=EF=BC=9B=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E9=80=9A=E9=81=93=E5=88=86=E9=85=8D=E6=97=B6=E8=AE=A1=E6=97=B6?= =?UTF-8?q?=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- pkg/orm/orm.go | 1 + web/error.go | 24 +++++++++++++++------- web/globals/baiyin.go | 10 +++++---- web/services/channel.go | 44 +++++++++------------------------------- web/services/resource.go | 6 +++--- web/web.go | 7 ++++--- 7 files changed, 42 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 1d1e433..a82f71c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ ## todo -- channel 接口 - - 待验证 - 长效业务接入 - 微信支付 - 页面 账户总览 @@ -10,6 +8,7 @@ - 代理数据表的 secret 字段 aes 加密存储 - globals 合并到 services 或者反之 +- 自定义的服务错误没有必要,可以统一在 handler 层使用包装的 fiber.Error ### 下阶段 diff --git a/pkg/orm/orm.go b/pkg/orm/orm.go index 305c8cb..c8086af 100644 --- a/pkg/orm/orm.go +++ b/pkg/orm/orm.go @@ -23,6 +23,7 @@ func Init() { env.DbHost, env.DbUserName, env.DbPassword, env.DbName, env.DbPort, ) db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ + TranslateError: true, NamingStrategy: schema.NamingStrategy{ SingularTable: true, }, diff --git a/web/error.go b/web/error.go index dd15a50..71861a0 100644 --- a/web/error.go +++ b/web/error.go @@ -2,6 +2,7 @@ package web import ( "errors" + "gorm.io/gorm" "log/slog" "platform/web/core" "reflect" @@ -11,20 +12,29 @@ import ( func ErrorHandler(c *fiber.Ctx, err error) error { - var code int - var message string + var code = fiber.StatusInternalServerError + var message = "服务器异常" var fiberErr *fiber.Error var serviceErr *core.ServiceErr - if errors.As(err, &fiberErr) { + + switch { + + // fiber 错误 + case errors.As(err, &fiberErr): code = fiberErr.Code message = fiberErr.Message - } else if errors.As(err, &serviceErr) { + + // 服务错误 + case errors.As(err, &serviceErr): code = serviceErr.Code() message = serviceErr.Error() - } else { - code = fiber.StatusInternalServerError - message = "服务器异常" + + // gorm 错误,忽略 + case errors.Is(err, gorm.ErrForeignKeyViolated): + + // 所有未手动声明的错误类型 + default: slog.Debug("未处理的异常", slog.String("type", reflect.TypeOf(err).Name()), slog.String("error", err.Error())) } diff --git a/web/globals/baiyin.go b/web/globals/baiyin.go index 11cb4a0..c1790a4 100644 --- a/web/globals/baiyin.go +++ b/web/globals/baiyin.go @@ -319,11 +319,13 @@ func (c *cloud) token(refresh bool) (string, error) { _ = Body.Close() }(resp.Body) - dump, err := httputil.DumpResponse(resp, true) - if err != nil { - return "", err + if env.DebugHttpDump { + dump, err := httputil.DumpResponse(resp, true) + if err != nil { + return "", err + } + fmt.Println(string(dump)) } - fmt.Println(string(dump)) if resp.StatusCode != http.StatusOK { return "", errors.New("failed to get token") diff --git a/web/services/channel.go b/web/services/channel.go index 72d1ced..d9b24a1 100644 --- a/web/services/channel.go +++ b/web/services/channel.go @@ -239,19 +239,19 @@ func (s *channelService) CreateChannel( err = q.Q.Transaction(func(q *q.Query) (err error) { // 查找套餐 - resource, err := findResource(q, rid, resourceId, authCtx, count) + resource, err := findResource(q, resourceId, authCtx, count) if err != nil { return err } // 查找网关 - proxies, err := findProxies(q, rid) + proxies, err := findProxies(q) if err != nil { return err } // 查找已使用的节点 - channels, err := findChannels(q, rid, proxies) + channels, err := findChannels(q, proxies) if err != nil { return err } @@ -259,7 +259,7 @@ func (s *channelService) CreateChannel( // 查找白名单 var whitelist *[]string if authType == ChannelAuthTypeIp { - whitelist, err = findWhitelist(q, rid, authCtx.Payload.Id) + whitelist, err = findWhitelist(q, authCtx.Payload.Id) if err != nil { return err } @@ -299,10 +299,7 @@ func (s *channelService) CreateChannel( return newChannels, nil } -func findResource(q *q.Query, rid string, resourceId int32, authCtx *auth.Context, count int) (*ResourceInfo, error) { - var step = time.Now() - - // 查找套餐 +func findResource(q *q.Query, resourceId int32, authCtx *auth.Context, count int) (*ResourceInfo, error) { var resource = new(ResourceInfo) data := q.Resource.As("data") pss := q.ResourcePss.As("pss") @@ -348,13 +345,10 @@ func findResource(q *q.Query, rid string, resourceId int32, authCtx *auth.Contex } } - slog.Debug("查找套餐", "rid", rid, "step", time.Since(step)) return resource, nil } -func findProxies(q *q.Query, rid string) (proxies []*m.Proxy, err error) { - var step = time.Now() - +func findProxies(q *q.Query) (proxies []*m.Proxy, err error) { proxies, err = q.Proxy. Where(q.Proxy.Type.Eq(1)). Find() @@ -362,18 +356,15 @@ func findProxies(q *q.Query, rid string) (proxies []*m.Proxy, err error) { return nil, err } - slog.Debug("查找网关", "rid", rid, "step", time.Since(step)) return proxies, nil } -func findChannels(q *q.Query, rid string, proxies []*m.Proxy) (channels []*m.Channel, err error) { - var step = time.Now() - +func findChannels(q *q.Query, proxies []*m.Proxy) (channels []*m.Channel, err error) { var proxyIds = make([]int32, len(proxies)) for i, proxy := range proxies { proxyIds[i] = proxy.ID } - channels, err = q.Channel.Debug(). + channels, err = q.Channel. Select( q.Channel.ProxyID, q.Channel.ProxyPort). @@ -388,14 +379,10 @@ func findChannels(q *q.Query, rid string, proxies []*m.Proxy) (channels []*m.Cha return nil, err } - slog.Debug("查找已使用节点", "rid", rid, "step", time.Since(step)) return channels, nil } -func findWhitelist(q *q.Query, rid string, userId int32) (*[]string, error) { - var step = time.Now() - - // 按需查找用户白名单 +func findWhitelist(q *q.Query, userId int32) (*[]string, error) { var whitelist []string err := q.Whitelist. Where(q.Whitelist.UserID.Eq(userId)). @@ -408,7 +395,6 @@ func findWhitelist(q *q.Query, rid string, userId int32) (*[]string, error) { return nil, ChannelServiceErr("用户没有白名单") } - slog.Debug("查找用户白名单", "rid", rid, "step", time.Since(step)) return &whitelist, nil } @@ -590,13 +576,11 @@ func calcChannels( } } - slog.Debug("申请节点", "rid", step, "total", time.Since(step)) + slog.Debug("申请节点", "total", time.Since(step)) return newChannels, nil } func updateResource(rid string, resource *ResourceInfo, count int, now time.Time) (err error) { - var step = time.Now() - toUpdate := m.ResourcePss{ Used: resource.Used + int32(count), DailyLast: core.LocalDateTime(now), @@ -619,14 +603,10 @@ func updateResource(rid string, resource *ResourceInfo, count int, now time.Time return err } - slog.Debug("更新套餐使用记录", "rid", rid, "step", time.Since(step)) return nil } func saveChannels(channels []*m.Channel) (err error) { - // 保存到数据库 - var step = time.Now() - err = q.Channel. Omit( q.Channel.NodeID, @@ -638,19 +618,15 @@ func saveChannels(channels []*m.Channel) (err error) { return err } - slog.Debug("保存到数据库", "step", time.Since(step)) return nil } func cacheChannels(ctx context.Context, rid string, channels []*m.Channel) (err error) { - var step = time.Now() - err = cache(ctx, channels) if err != nil { return err } - slog.Debug("缓存通道数据", "rid", rid, "step", time.Since(step)) return nil } diff --git a/web/services/resource.go b/web/services/resource.go index 0fc95c5..2d32f0d 100644 --- a/web/services/resource.go +++ b/web/services/resource.go @@ -79,7 +79,7 @@ func (s *resourceService) CompleteResource(ctx context.Context, tradeNo string, err = q.Q.Transaction(func(q *q.Query) error { // 保存套餐 - resource, err := createResource(&cache.CreateResourceData, cache.Uid) + resource, err := createResource(q, &cache.CreateResourceData, cache.Uid) if err != nil { return err } @@ -139,7 +139,7 @@ func (s *resourceService) CreateResource(data *CreateResourceData, uid int32) er } // 保存套餐 - resource, err := createResource(data, uid) + resource, err := createResource(q, data, uid) if err != nil { return err } @@ -236,7 +236,7 @@ type CreateResourceCache struct { BillId int32 `json:"bill_id"` } -func createResource(data *CreateResourceData, uid int32) (*m.Resource, error) { +func createResource(q *q.Query, data *CreateResourceData, uid int32) (*m.Resource, error) { // 创建套餐 resource := m.Resource{ diff --git a/web/web.go b/web/web.go index 7daabd7..e44ab6d 100644 --- a/web/web.go +++ b/web/web.go @@ -110,9 +110,10 @@ func useRequestId() fiber.Handler { func useLogger() fiber.Handler { return logger.New(logger.Config{ - Format: "🚀 ${time} | ${locals:authtype} ${locals:authid} | ${method} ${path} | ${status} | ${latency} | ${error}\n", - TimeFormat: "2006-01-02 15:04:05", - TimeZone: "Asia/Shanghai", + DisableColors: true, + Format: "🚀 ${time} | ${locals:authtype} ${locals:authid} | ${method} ${path} | ${status} | ${latency} | ${error}\n", + TimeFormat: "2006-01-02 15:04:05", + TimeZone: "Asia/Shanghai", Done: func(c *fiber.Ctx, logBytes []byte) { var logStr = strings.TrimPrefix(string(logBytes), "🚀") var logVars = strings.Split(logStr, "|")