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.
 
 
 
 
 
 

90 lines
2.7 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 rememberMe = false.obs;
LoginController({required AuthRepository authRepository})
: _authRepository = authRepository;
@override
void onInit() {
super.onInit();
_loadRememberedMe();
}
void _loadRememberedMe() {
rememberMe.value = _authRepository.getRememberMe();
if (rememberMe.value) {
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.addRememberMe(rememberMe.value);
if (rememberMe.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('登录失败', '无网络连接,且无法验证本地凭证');
}
}
}