From 87eecdb8cb1cd839743a5cd307d83014d7f6ece7 Mon Sep 17 00:00:00 2001 From: luorijun Date: Tue, 1 Apr 2025 11:26:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=B5=84=E6=BA=90=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E9=80=BB=E8=BE=91=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=92=8CRedis=E8=BF=9E=E6=8E=A5=E7=9A=84?= =?UTF-8?q?=E9=80=80=E5=87=BA=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 +++++++-------------------- cmd/main/main.go | 10 ++++++++++ pkg/orm/orm.go | 11 +++++++++++ pkg/rds/rds.go | 7 +++++++ web/handlers/login.go | 46 +++++++++++++++++++++---------------------- web/handlers/temp.go | 10 ++++++---- web/web.go | 11 ++++++++++- 7 files changed, 74 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 5a97007..980a385 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ - [ ] 实名认证 - [ ] 充值余额 - [ ] 选择套餐 -- [ ] 提取 IP +- [X] 提取 IP + - [ ] 长效提取 - [ ] 连接 中间件: @@ -19,18 +20,17 @@ - [ ] Limiter - [ ] Compress -channel 数据存入顺序,数据库 > 缓存 > 外部接口 +channel 优化: + - 重新梳理逻辑流程,简化循环 + - 端口分配时加锁 + - 数据存入顺序,数据库 > 缓存 > 外部接口 remote 令牌问题 用对称加密处理密钥 -现在的节点分配逻辑是,每个 user_host:node_port 组算一个分配数,考虑是否改成每个用户算一个分配数 - 考虑将鉴权逻辑放到 handler 里,统一动静态鉴权以及解耦服务层 -有些地方在用手动事务,有时间改成自动事务 - 重新手动实现 model 层 环境变量配置默认会话配置 @@ -41,16 +41,8 @@ oauth token 验证授权范围 账单数据表结构修改 -captcha 自定义生成流程,弃用 store - 短信发送日志 -captcha_id 关联用户本机信息,实现验证码设备绑定(或者其他方式) - -退出时主动断开数据库缓存等连接 - -固有字段统一放在最开始 - ## 环境变量 在 init/env 中有定义和默认值 @@ -70,11 +62,4 @@ captcha_id 关联用户本机信息,实现验证码设备绑定(或者其他 服务器ip 110.40.82.248 api账密:api:123456 -## 业务逻辑 - -### 动态 ip 淘汰策略 - -1. 用户请求节点 -2. 查询对应条件下的节点池 -3. 选择对应数量的节点,发起连接 -4. +## 业务逻辑 \ No newline at end of file diff --git a/cmd/main/main.go b/cmd/main/main.go index bdd84bb..14b6d64 100644 --- a/cmd/main/main.go +++ b/cmd/main/main.go @@ -65,4 +65,14 @@ func main() { slog.Error("Server error", slog.Any("err", err)) } } + + // 关闭资源 + err = orm.Exit() + if err != nil { + slog.Error("Failed to close database connection", slog.Any("err", err)) + } + err = rds.Exit() + if err != nil { + slog.Error("Failed to close redis connection", slog.Any("err", err)) + } } diff --git a/pkg/orm/orm.go b/pkg/orm/orm.go index 04dbc91..16ef29f 100644 --- a/pkg/orm/orm.go +++ b/pkg/orm/orm.go @@ -47,6 +47,17 @@ func Init() { DB = db } +func Exit() error { + if DB != nil { + conn, err := DB.DB() + if err != nil { + return err + } + return conn.Close() + } + return nil +} + type WithAlias interface { Alias() string } diff --git a/pkg/rds/rds.go b/pkg/rds/rds.go index b3eb3f1..49b1fc1 100644 --- a/pkg/rds/rds.go +++ b/pkg/rds/rds.go @@ -16,3 +16,10 @@ func Init() { Password: env.RedisPass, }) } + +func Exit() error { + if Client != nil { + return Client.Close() + } + return nil +} diff --git a/web/handlers/login.go b/web/handlers/login.go index 80e6e31..d142df5 100644 --- a/web/handlers/login.go +++ b/web/handlers/login.go @@ -52,33 +52,33 @@ func loginByPhone(c *fiber.Ctx, req *LoginReq) error { } // 查找用户 todo 获取权限信息 - var tx = q.Q.Begin() - var user *models.User - user, err = tx.User. - Where(tx.User.Phone.Eq(req.Username)). - Take() - if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { - return err - } - - // 如果用户不存在,初始化用户 todo 保存默认权限信息 - if user == nil { - user = &models.User{ - Phone: req.Username, - Name: req.Username, + err = q.Q.Transaction(func(tx *q.Query) error { + user, err = tx.User. + Where(tx.User.Phone.Eq(req.Username)). + Take() + if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { + return err } - } - // 更新用户的登录时间 - user.LastLogin = time.Now() - user.LastLoginHost = c.IP() - user.LastLoginAgent = c.Get("User-Agent") - if err := tx.User.Omit(q.User.AdminID).Save(user); err != nil { - return err - } + // 如果用户不存在,初始化用户 todo 保存默认权限信息 + if user == nil { + user = &models.User{ + Phone: req.Username, + Name: req.Username, + } + } - err = tx.Commit() + // 更新用户的登录时间 + user.LastLogin = time.Now() + user.LastLoginHost = c.IP() + user.LastLoginAgent = c.Get("User-Agent") + if err := tx.User.Omit(q.User.AdminID).Save(user); err != nil { + return err + } + + return nil + }) if err != nil { return err } diff --git a/web/handlers/temp.go b/web/handlers/temp.go index 07ca541..aeb907a 100644 --- a/web/handlers/temp.go +++ b/web/handlers/temp.go @@ -1,20 +1,22 @@ package handlers import ( - "platform/pkg/rds" + q "platform/web/queries" + "time" "github.com/gofiber/fiber/v2" ) func Temp(c *fiber.Ctx) error { - id := c.Query("id") - result, err := rds.Client.Get(c.Context(), "channel:"+id).Result() + channels, err := q.Channel.Debug().Where( + q.Channel.Expiration.Lt(time.Now().Add(3 * time.Minute)), + ).Find() if err != nil { return err } return c.JSON(fiber.Map{ - "result": result, + "result": channels, }) } diff --git a/web/web.go b/web/web.go index a4c31e2..bfda805 100644 --- a/web/web.go +++ b/web/web.go @@ -10,6 +10,8 @@ import ( "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/logger" "github.com/gofiber/fiber/v2/middleware/requestid" + "github.com/google/uuid" + "github.com/jxskiss/base62" ) import _ "net/http/pprof" @@ -36,6 +38,7 @@ func New(config *Config) (*Server, error) { func (s *Server) Run() error { + // config s.fiber = fiber.New(fiber.Config{ ErrorHandler: ErrorHandler, }) @@ -43,7 +46,12 @@ func (s *Server) Run() error { s.fiber.Use(logger.New(logger.Config{ DisableColors: false, })) - s.fiber.Use(requestid.New()) + s.fiber.Use(requestid.New(requestid.Config{ + Generator: func() string { + binary, _ := uuid.New().MarshalBinary() + return base62.EncodeToString(binary) + }, + })) ApplyRouters(s.fiber) @@ -56,6 +64,7 @@ func (s *Server) Run() error { } }() + // listen port := env.AppPort slog.Info("Server started on :" + port) err := s.fiber.Listen(":" + port)