From fcdd6ac170d6ca117b65b1cc1fda3dc5faa9b93b Mon Sep 17 00:00:00 2001 From: shanshanzhong Date: Tue, 2 Dec 2025 01:45:12 -0800 Subject: [PATCH] =?UTF-8?q?fix(admin/user):=20=E4=BF=AE=E5=A4=8D=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E7=94=A8=E6=88=B7=E8=AE=BE=E5=A4=87=E6=97=B6=E6=9C=AA?= =?UTF-8?q?=E6=B8=85=E7=90=86=E7=BC=93=E5=AD=98=E5=92=8C=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加设备删除前的检查逻辑,确保设备存在后再执行删除操作 在删除设备前先踢下线在线设备并清理相关缓存会话 最后删除数据库中的设备记录,确保数据一致性 --- .../logic/admin/user/deleteUserDeviceLogic.go | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/internal/logic/admin/user/deleteUserDeviceLogic.go b/internal/logic/admin/user/deleteUserDeviceLogic.go index c92f79e..264ecc0 100644 --- a/internal/logic/admin/user/deleteUserDeviceLogic.go +++ b/internal/logic/admin/user/deleteUserDeviceLogic.go @@ -1,14 +1,18 @@ package user import ( - "context" + "context" + "fmt" + "time" - "github.com/perfect-panel/server/pkg/xerr" - "github.com/pkg/errors" + "github.com/perfect-panel/server/pkg/xerr" + "github.com/pkg/errors" - "github.com/perfect-panel/server/internal/svc" - "github.com/perfect-panel/server/internal/types" - "github.com/perfect-panel/server/pkg/logger" + "github.com/perfect-panel/server/internal/svc" + "github.com/perfect-panel/server/internal/types" + "github.com/perfect-panel/server/internal/config" + "github.com/perfect-panel/server/pkg/logger" + "gorm.io/gorm" ) type DeleteUserDeviceLogic struct { @@ -27,9 +31,32 @@ func NewDeleteUserDeviceLogic(ctx context.Context, svcCtx *svc.ServiceContext) * } func (l *DeleteUserDeviceLogic) DeleteUserDevice(req *types.DeleteUserDeivceRequest) error { - err := l.svcCtx.UserModel.DeleteDevice(l.ctx, req.Id) - if err != nil { - return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseDeletedError), "delete user error: %v", err.Error()) - } - return nil + device, findErr := l.svcCtx.UserModel.FindOneDevice(l.ctx, req.Id) + if findErr != nil { + if errors.Is(findErr, gorm.ErrRecordNotFound) { + return nil + } + return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "get Device error: %v", findErr.Error()) + } + + // 尝试踢下线在线设备 + l.svcCtx.DeviceManager.KickDevice(device.UserId, device.Identifier) + + // 清理与设备相关的缓存会话 + ctx, cancel := context.WithTimeout(l.ctx, 2*time.Second) + defer cancel() + deviceCacheKey := fmt.Sprintf("%v:%v", config.DeviceCacheKeyKey, device.Identifier) + if sessionId, rerr := l.svcCtx.Redis.Get(ctx, deviceCacheKey).Result(); rerr == nil && sessionId != "" { + _ = l.svcCtx.Redis.Del(ctx, deviceCacheKey).Err() + sessionIdCacheKey := fmt.Sprintf("%v:%v", config.SessionIdKey, sessionId) + _ = l.svcCtx.Redis.Del(ctx, sessionIdCacheKey).Err() + sessionsKey := fmt.Sprintf("%s%v", config.UserSessionsKeyPrefix, device.UserId) + _ = l.svcCtx.Redis.ZRem(ctx, sessionsKey, sessionId).Err() + } + + // 最后删除数据库记录 + if err := l.svcCtx.UserModel.DeleteDevice(l.ctx, req.Id); err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseDeletedError), "delete user error: %v", err.Error()) + } + return nil }