// // AVUserManager.m // AVDemo // #import "AVUserManager.h" #import "AVApiService.h" static NSString * const kUserLoggedInKey = @"AVUserLoggedIn"; static NSString * const kUserUsernameKey = @"AVUserUsername"; @implementation AVUserManager + (instancetype)sharedManager { static AVUserManager *instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; } - (instancetype)init { self = [super init]; if (self) { _isLoggedIn = [[NSUserDefaults standardUserDefaults] boolForKey:kUserLoggedInKey]; _currentUsername = [[NSUserDefaults standardUserDefaults] stringForKey:kUserUsernameKey]; } return self; } - (void)loginWithUsername:(NSString *)username password:(NSString *)password completion:(void (^)(BOOL success, NSString * _Nullable errorMessage))completion { if (username.length == 0) { if (completion) completion(NO, @"用户名不能为空"); return; } if (password.length == 0) { if (completion) completion(NO, @"密码不能为空"); return; } [[AVApiService shared] loginWithUsername:username password:password success:^(id responseObject) { [self saveLoginStateWithUsername:username]; if (completion) completion(YES, nil); } failure:^(NSError *error, NSString *serverMessage) { NSString *msg = serverMessage ?: [NSString stringWithFormat:@"网络请求失败: %@", error.localizedDescription]; if (completion) completion(NO, msg); }]; } - (void)saveLoginStateWithUsername:(NSString *)username { _isLoggedIn = YES; _currentUsername = username; // 持久化保存 [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kUserLoggedInKey]; [[NSUserDefaults standardUserDefaults] setObject:username forKey:kUserUsernameKey]; [[NSUserDefaults standardUserDefaults] synchronize]; } - (void)logout { _isLoggedIn = NO; // 清除持久化数据 [[NSUserDefaults standardUserDefaults] setBool:NO forKey:kUserLoggedInKey]; [[NSUserDefaults standardUserDefaults] synchronize]; NSLog(@"✅ 用户已登出"); } @end