initial commit

This commit is contained in:
Caleb
2026-03-01 15:59:27 +08:00
commit a9e97d56cb
1426 changed files with 172367 additions and 0 deletions

View File

@@ -0,0 +1,295 @@
//
// 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