From 168cec6d578cfee6c25759511af7a0feb7d8e539 Mon Sep 17 00:00:00 2001 From: zetaloop Date: Sun, 5 Apr 2026 17:30:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20admin=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E5=9C=A8=E6=95=B0=E6=8D=AE=E5=BA=93=E6=9C=AA=E5=B0=B1=E7=BB=AA?= =?UTF-8?q?=E6=97=B6=E9=9D=99=E9=BB=98=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit initAdmin 改为后台 goroutine 并重试最多 30 秒,避免 users-rpc 启动时 PostgreSQL 尚未接受连接导致管理员账户创建失败。 --- app/users/rpc/admin_init.go | 78 ++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 32 deletions(-) diff --git a/app/users/rpc/admin_init.go b/app/users/rpc/admin_init.go index 38b4190..fb40bf4 100644 --- a/app/users/rpc/admin_init.go +++ b/app/users/rpc/admin_init.go @@ -4,6 +4,7 @@ import ( "context" "os" "strings" + "time" "juwan-backend/app/snowflake/rpc/snowflake" "juwan-backend/app/users/rpc/internal/models/users" @@ -21,40 +22,53 @@ func initAdmin(svcCtx *svc.ServiceContext) { return } - ctx := context.Background() - exists, _ := svcCtx.UsersModelRW.Users.Query().Where(users.UsernameEQ(username)).Exist(ctx) - if exists { - return - } + go func() { + ctx := context.Background() + for i := range 30 { + exists, err := svcCtx.UsersModelRW.Users.Query().Where(users.UsernameEQ(username)).Exist(ctx) + if err != nil { + if i < 29 { + time.Sleep(time.Second) + continue + } + logx.Errorf("check admin user: %v", err) + return + } + if exists { + return + } + break + } - hashedPassword, err := pwdUtils.HashPassword(password) - if err != nil { - logx.Errorf("hash admin password: %v", err) - return - } + hashedPassword, err := pwdUtils.HashPassword(password) + if err != nil { + logx.Errorf("hash admin password: %v", err) + return + } - resp, err := svcCtx.Snowflake.NextId(ctx, &snowflake.NextIdReq{}) - if err != nil { - logx.Errorf("generate admin user ID: %v", err) - return - } + resp, err := svcCtx.Snowflake.NextId(ctx, &snowflake.NextIdReq{}) + if err != nil { + logx.Errorf("generate admin user ID: %v", err) + return + } - _, err = svcCtx.UsersModelRW.Users.Create(). - SetID(resp.Id). - SetUsername(username). - SetPasswordHash(hashedPassword). - SetEmail(email). - SetPhone(""). - SetBio(""). - SetAvatar(""). - SetCurrentRole("consumer"). - SetNickname(username). - SetIsAdmin(true). - Save(ctx) - if err != nil { - logx.Errorf("create admin user: %v", err) - return - } + _, err = svcCtx.UsersModelRW.Users.Create(). + SetID(resp.Id). + SetUsername(username). + SetPasswordHash(hashedPassword). + SetEmail(email). + SetPhone(""). + SetBio(""). + SetAvatar(""). + SetCurrentRole("consumer"). + SetNickname(username). + SetIsAdmin(true). + Save(ctx) + if err != nil { + logx.Errorf("create admin user: %v", err) + return + } - logx.Infof("initialized admin user: %s", username) + logx.Infof("initialized admin user: %s", username) + }() }