You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.8 KiB
91 lines
2.8 KiB
import 'package:flutter/material.dart'; |
|
import 'package:get/get.dart'; |
|
import 'package:problem_check_system/data/models/auth_model.dart'; |
|
import 'package:problem_check_system/app/routes/app_routes.dart'; |
|
import 'package:problem_check_system/data/repositories/auth_repository.dart'; |
|
|
|
class LoginController extends GetxController { |
|
final AuthRepository _authRepository; |
|
final TextEditingController usernameController = TextEditingController(); |
|
final TextEditingController passwordController = TextEditingController(); |
|
|
|
final isLoading = false.obs; |
|
final rememberPassword = false.obs; |
|
|
|
LoginController({required AuthRepository authRepository}) |
|
: _authRepository = authRepository; |
|
|
|
@override |
|
void onInit() { |
|
super.onInit(); |
|
_loadRememberedUser(); |
|
} |
|
|
|
void _loadRememberedUser() { |
|
final remember = _authRepository.getRememberPassword(); |
|
rememberPassword.value = remember; |
|
if (remember) { |
|
final loginData = _authRepository.getLoginKey(); |
|
usernameController.text = loginData.username; |
|
passwordController.text = loginData.password; |
|
} |
|
} |
|
|
|
/// Check if the user is already logged in by delegating to the repository. |
|
bool isLoggedIn() { |
|
return _authRepository.isLoggedIn(); |
|
} |
|
|
|
/// 登录逻辑 |
|
Future<void> login() async { |
|
final username = usernameController.text.trim(); |
|
final password = passwordController.text.trim(); |
|
|
|
if (username.isEmpty || password.isEmpty) { |
|
Get.snackbar('输入错误', '用户名和密码不能为空'); |
|
return; |
|
} |
|
|
|
isLoading.value = true; |
|
final loginData = LoginRequest(username: username, password: password); |
|
|
|
if (_authRepository.isOnline) { |
|
await _onlineLogin(loginData); |
|
} else { |
|
_offlineLogin(loginData); |
|
} |
|
isLoading.value = false; |
|
} |
|
|
|
/// 在线登录 |
|
Future<void> _onlineLogin(LoginRequest loginRequest) async { |
|
try { |
|
var loginResponse = await _authRepository.login(loginRequest); |
|
// 登录成功后 |
|
_authRepository.saveToken(loginResponse.token); |
|
_authRepository.saveRefreshToken(loginResponse.refreshToken); |
|
_authRepository.addRememberPassword(rememberPassword.value); |
|
|
|
if (rememberPassword.value) { |
|
_authRepository.addLoginKey(loginRequest); |
|
} else { |
|
_authRepository.removeLoginKey(); |
|
} |
|
Get.offAllNamed(AppRoutes.home); |
|
} catch (e) { |
|
throw Exception(e); |
|
} |
|
} |
|
|
|
void _offlineLogin(LoginRequest loginRequest) { |
|
final loginData = _authRepository.getLoginKey(); |
|
|
|
if (loginData.username == loginRequest.username && |
|
loginData.password == loginRequest.password) { |
|
Get.offAllNamed(AppRoutes.home); |
|
Get.snackbar('离线登录成功', '您已离线登录到系统'); |
|
} else { |
|
Get.snackbar('登录失败', '无网络连接,且无法验证本地凭证'); |
|
} |
|
} |
|
}
|
|
|