From f1e47291cd4b509d02e42f21df723a77d5824d34 Mon Sep 17 00:00:00 2001 From: shaw Date: Sat, 27 Dec 2025 14:57:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=97=B6=E5=88=86=E7=BB=84=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E9=A1=BA=E5=BA=8F=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=8D=E4=B8=80=E8=87=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原逻辑先执行 Update 再验证 GroupIDs,如果验证失败会导致账号已更新但返回错误。 现改为先验证分组是否存在,再执行 Update 和 BindGroups。 --- backend/internal/service/account_service.go | 15 +++++++++------ backend/internal/service/admin_service.go | 11 ++++++++++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/backend/internal/service/account_service.go b/backend/internal/service/account_service.go index a5b9cd7f..7d2d3b70 100644 --- a/backend/internal/service/account_service.go +++ b/backend/internal/service/account_service.go @@ -208,20 +208,23 @@ func (s *AccountService) Update(ctx context.Context, id int64, req UpdateAccount account.Status = *req.Status } - if err := s.accountRepo.Update(ctx, account); err != nil { - return nil, fmt.Errorf("update account: %w", err) - } - - // 更新分组绑定 + // 先验证分组是否存在(在任何写操作之前) if req.GroupIDs != nil { - // 验证分组是否存在 for _, groupID := range *req.GroupIDs { _, err := s.groupRepo.GetByID(ctx, groupID) if err != nil { return nil, fmt.Errorf("get group: %w", err) } } + } + // 执行更新 + if err := s.accountRepo.Update(ctx, account); err != nil { + return nil, fmt.Errorf("update account: %w", err) + } + + // 绑定分组 + if req.GroupIDs != nil { if err := s.accountRepo.BindGroups(ctx, account.ID, *req.GroupIDs); err != nil { return nil, fmt.Errorf("bind groups: %w", err) } diff --git a/backend/internal/service/admin_service.go b/backend/internal/service/admin_service.go index f1eb0fc6..db207ce5 100644 --- a/backend/internal/service/admin_service.go +++ b/backend/internal/service/admin_service.go @@ -652,11 +652,20 @@ func (s *adminServiceImpl) UpdateAccount(ctx context.Context, id int64, input *U account.Status = input.Status } + // 先验证分组是否存在(在任何写操作之前) + if input.GroupIDs != nil { + for _, groupID := range *input.GroupIDs { + if _, err := s.groupRepo.GetByID(ctx, groupID); err != nil { + return nil, fmt.Errorf("get group: %w", err) + } + } + } + if err := s.accountRepo.Update(ctx, account); err != nil { return nil, err } - // 更新分组绑定 + // 绑定分组 if input.GroupIDs != nil { if err := s.accountRepo.BindGroups(ctx, account.ID, *input.GroupIDs); err != nil { return nil, err