Files
SellyCloudSDK_demo/Example/SellyCloudSDK/Controllers/AVLoginViewController.m
2026-03-26 12:05:37 +08:00

296 lines
12 KiB
Objective-C

//
// AVLoginViewController.m
// AVDemo
//
#import "AVLoginViewController.h"
#import "AVUserManager.h"
#import <Masonry/Masonry.h>
@interface AVLoginViewController () <UITextFieldDelegate>
@property (nonatomic, strong) UIImageView *logoImageView;
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UIView *usernameContainer;
@property (nonatomic, strong) UITextField *usernameTextField;
@property (nonatomic, strong) UIView *passwordContainer;
@property (nonatomic, strong) UITextField *passwordTextField;
@property (nonatomic, strong) UIButton *passwordToggleButton;
@property (nonatomic, strong) UIButton *loginButton;
@end
@implementation AVLoginViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor systemBackgroundColor];
[self setupUI];
[self loadSavedUsername];
// 添加点击手势,点击空白处收起键盘
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tapGesture];
}
- (void)setupUI {
// Logo 图标
self.logoImageView = [[UIImageView alloc] initWithImage:[UIImage systemImageNamed:@"play.rectangle.on.rectangle.fill"]];
self.logoImageView.tintColor = [UIColor systemBlueColor];
self.logoImageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:self.logoImageView];
[self.logoImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.view);
make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop).offset(80);
make.width.height.equalTo(@100);
}];
// 标题
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.text = @"欢迎使用";
self.titleLabel.font = [UIFont systemFontOfSize:28 weight:UIFontWeightBold];
self.titleLabel.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:self.titleLabel];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.view);
make.top.equalTo(self.logoImageView.mas_bottom).offset(24);
}];
// 用户名输入框容器
self.usernameContainer = [[UIView alloc] init];
self.usernameContainer.backgroundColor = [UIColor secondarySystemBackgroundColor];
self.usernameContainer.layer.cornerRadius = 12;
[self.view addSubview:self.usernameContainer];
[self.usernameContainer mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.view);
make.top.equalTo(self.titleLabel.mas_bottom).offset(60);
make.left.equalTo(self.view).offset(32);
make.right.equalTo(self.view).offset(-32);
make.height.equalTo(@50);
}];
// 用户名图标
UIImageView *usernameIcon = [[UIImageView alloc] initWithImage:[UIImage systemImageNamed:@"person.fill"]];
usernameIcon.tintColor = [UIColor systemGrayColor];
usernameIcon.contentMode = UIViewContentModeScaleAspectFit;
[self.usernameContainer addSubview:usernameIcon];
[usernameIcon mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.usernameContainer).offset(16);
make.centerY.equalTo(self.usernameContainer);
make.width.height.equalTo(@20);
}];
// 用户名输入框
self.usernameTextField = [[UITextField alloc] init];
self.usernameTextField.placeholder = @"请输入用户名";
self.usernameTextField.font = [UIFont systemFontOfSize:16];
self.usernameTextField.returnKeyType = UIReturnKeyNext;
self.usernameTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
self.usernameTextField.autocorrectionType = UITextAutocorrectionTypeNo;
self.usernameTextField.delegate = self;
[self.usernameContainer addSubview:self.usernameTextField];
[self.usernameTextField mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(usernameIcon.mas_right).offset(12);
make.right.equalTo(self.usernameContainer).offset(-16);
make.centerY.equalTo(self.usernameContainer);
}];
// 密码输入框容器
self.passwordContainer = [[UIView alloc] init];
self.passwordContainer.backgroundColor = [UIColor secondarySystemBackgroundColor];
self.passwordContainer.layer.cornerRadius = 12;
[self.view addSubview:self.passwordContainer];
[self.passwordContainer mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.view);
make.top.equalTo(self.usernameContainer.mas_bottom).offset(16);
make.left.equalTo(self.view).offset(32);
make.right.equalTo(self.view).offset(-32);
make.height.equalTo(@50);
}];
// 密码图标
UIImageView *passwordIcon = [[UIImageView alloc] initWithImage:[UIImage systemImageNamed:@"lock.fill"]];
passwordIcon.tintColor = [UIColor systemGrayColor];
passwordIcon.contentMode = UIViewContentModeScaleAspectFit;
[self.passwordContainer addSubview:passwordIcon];
[passwordIcon mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.passwordContainer).offset(16);
make.centerY.equalTo(self.passwordContainer);
make.width.height.equalTo(@20);
}];
// 密码输入框
self.passwordTextField = [[UITextField alloc] init];
self.passwordTextField.placeholder = @"请输入密码";
self.passwordTextField.font = [UIFont systemFontOfSize:16];
self.passwordTextField.secureTextEntry = YES;
self.passwordTextField.returnKeyType = UIReturnKeyDone;
self.passwordTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
self.passwordTextField.autocorrectionType = UITextAutocorrectionTypeNo;
self.passwordTextField.delegate = self;
[self.passwordContainer addSubview:self.passwordTextField];
// 密码显示/隐藏切换按钮
self.passwordToggleButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.passwordToggleButton setImage:[UIImage systemImageNamed:@"eye.slash.fill"] forState:UIControlStateNormal];
[self.passwordToggleButton setImage:[UIImage systemImageNamed:@"eye.fill"] forState:UIControlStateSelected];
self.passwordToggleButton.tintColor = [UIColor systemGrayColor];
[self.passwordToggleButton addTarget:self action:@selector(togglePasswordVisibility) forControlEvents:UIControlEventTouchUpInside];
[self.passwordContainer addSubview:self.passwordToggleButton];
[self.passwordToggleButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.passwordContainer).offset(-16);
make.centerY.equalTo(self.passwordContainer);
make.width.height.equalTo(@24);
}];
[self.passwordTextField mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(passwordIcon.mas_right).offset(12);
make.right.equalTo(self.passwordToggleButton.mas_left).offset(-12);
make.centerY.equalTo(self.passwordContainer);
}];
// 登录按钮
self.loginButton = [UIButton buttonWithType:UIButtonTypeSystem];
[self.loginButton setTitle:@"登录" forState:UIControlStateNormal];
self.loginButton.titleLabel.font = [UIFont systemFontOfSize:18 weight:UIFontWeightSemibold];
self.loginButton.backgroundColor = [UIColor systemBlueColor];
[self.loginButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
self.loginButton.layer.cornerRadius = 12;
[self.loginButton addTarget:self action:@selector(loginButtonTapped) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.loginButton];
[self.loginButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.view);
make.top.equalTo(self.passwordContainer.mas_bottom).offset(32);
make.left.equalTo(self.view).offset(32);
make.right.equalTo(self.view).offset(-32);
make.height.equalTo(@50);
}];
}
- (void)loadSavedUsername {
// 从 AVUserManager 获取上次登录的用户名
NSString *savedUsername = [AVUserManager sharedManager].currentUsername;
if (savedUsername.length > 0) {
self.usernameTextField.text = savedUsername;
NSLog(@"✅ 自动填充用户名: %@", savedUsername);
// 如果有保存的用户名,自动聚焦到密码输入框
[self.passwordTextField becomeFirstResponder];
} else {
// 如果没有保存的用户名,聚焦到用户名输入框
[self.usernameTextField becomeFirstResponder];
}
}
#pragma mark - Actions
- (void)loginButtonTapped {
[self dismissKeyboard];
NSString *username = self.usernameTextField.text;
NSString *password = self.passwordTextField.text;
// 验证输入
if (username.length == 0) {
[self showAlertWithMessage:@"请输入用户名"];
return;
}
if (password.length == 0) {
[self showAlertWithMessage:@"请输入密码"];
return;
}
// 禁用登录按钮,防止重复提交
self.loginButton.enabled = NO;
[self.loginButton setTitle:@"登录中..." forState:UIControlStateNormal];
self.loginButton.alpha = 0.6;
// 执行登录(异步)
__weak typeof(self) weakSelf = self;
[[AVUserManager sharedManager] loginWithUsername:username password:password completion:^(BOOL success, NSString * _Nullable errorMessage) {
__strong typeof(weakSelf) strongSelf = weakSelf;
if (!strongSelf) return;
// 恢复登录按钮状态
strongSelf.loginButton.enabled = YES;
[strongSelf.loginButton setTitle:@"登录" forState:UIControlStateNormal];
strongSelf.loginButton.alpha = 1.0;
if (success) {
// 登录成功,通知代理
NSLog(@"✅ 登录验证成功");
if ([strongSelf.delegate respondsToSelector:@selector(loginViewControllerDidLogin:)]) {
[strongSelf.delegate loginViewControllerDidLogin:strongSelf];
}
} else {
// 登录失败,显示错误信息
NSLog(@"❌ 登录验证失败: %@", errorMessage);
[strongSelf showAlertWithMessage:errorMessage ?: @"登录失败,请重试"];
}
}];
}
- (void)dismissKeyboard {
[self.view endEditing:YES];
}
- (void)togglePasswordVisibility {
// 切换密码的可见性
self.passwordTextField.secureTextEntry = !self.passwordTextField.secureTextEntry;
// 切换按钮状态
self.passwordToggleButton.selected = !self.passwordToggleButton.selected;
// 保持光标位置(修复切换时光标跳到开头的问题)
NSString *currentText = self.passwordTextField.text;
self.passwordTextField.text = @"";
self.passwordTextField.text = currentText;
}
- (void)showAlertWithMessage:(NSString *)message {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示"
message:message
preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
}
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if (textField == self.usernameTextField) {
// 用户名输入框按回车,跳到密码输入框
[self.passwordTextField becomeFirstResponder];
} else if (textField == self.passwordTextField) {
// 密码输入框按回车,执行登录
[self loginButtonTapped];
}
return YES;
}
#pragma mark - Orientation Support
- (BOOL)shouldAutorotate {
return YES;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationPortrait;
}
@end