|
|
|
import 'package:dio/dio.dart';
|
|
|
|
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 {
|
|
|
|
// 调用你的 post 方法
|
|
|
|
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);
|
|
|
|
// 登录成功,处理响应
|
|
|
|
debugPrint('登录成功: $loginResponse');
|
|
|
|
} on DioException catch (e) {
|
|
|
|
// 捕获由拦截器处理后抛出的 DioException
|
|
|
|
// 拦截器已经显示了 Snackbar,这里你可以做其他业务处理,例如清空表单等。
|
|
|
|
debugPrint('登录失败,由DioException捕获: ${e.message}');
|
|
|
|
} catch (e) {
|
|
|
|
// 捕获其他非 DioException 异常
|
|
|
|
debugPrint('发生未知错误: $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('登录失败', '无网络连接,且无法验证本地凭证');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|