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.
111 lines
3.1 KiB
111 lines
3.1 KiB
import 'package:get/get.dart'; |
|
import 'package:dio/dio.dart'; |
|
import 'package:get_storage/get_storage.dart'; |
|
|
|
// 导入数据提供者和数据模型 |
|
import 'package:problem_check_system/data/providers/auth_provider.dart'; |
|
import 'package:problem_check_system/data/models/login_model.dart'; |
|
import 'package:problem_check_system/app/routes/app_routes.dart'; |
|
|
|
class AuthController extends GetxController { |
|
final AuthProvider _authProvider; |
|
AuthController({required AuthProvider authProvider}) |
|
: _authProvider = authProvider; |
|
|
|
final username = ''.obs; |
|
final password = ''.obs; |
|
final isLoading = false.obs; |
|
final rememberPassword = false.obs; |
|
|
|
final _box = GetStorage(); |
|
static const _usernameKey = 'username'; |
|
static const _passwordKey = 'password'; |
|
|
|
@override |
|
void onInit() { |
|
super.onInit(); |
|
_loadSavedCredentials(); |
|
} |
|
|
|
void _loadSavedCredentials() { |
|
final savedUsername = _box.read(_usernameKey); |
|
final savedPassword = _box.read(_passwordKey); |
|
|
|
if (savedUsername != null && savedPassword != null) { |
|
username.value = savedUsername; |
|
password.value = savedPassword; |
|
rememberPassword.value = true; |
|
} |
|
} |
|
|
|
String getToken() { |
|
return ''; |
|
} |
|
|
|
void updateUsername(String value) { |
|
username.value = value; |
|
} |
|
|
|
void updatePassword(String value) { |
|
password.value = value; |
|
} |
|
|
|
Future<void> login() async { |
|
if (username.value.isEmpty || password.value.isEmpty) { |
|
Get.snackbar('输入错误', '用户名和密码不能为空'); |
|
return; |
|
} |
|
|
|
isLoading.value = true; |
|
|
|
try { |
|
final loginData = LoginModel( |
|
username: username.value, |
|
password: password.value, |
|
); |
|
|
|
final response = await _authProvider.signIn(loginData); |
|
|
|
if (response.statusCode == 200 && response.data['token'] != null) { |
|
final token = response.data['token']; |
|
final refreshToken = response.data['refreshToken']; |
|
|
|
_box.write('token', token); |
|
_box.write('refreshToken', refreshToken); |
|
|
|
if (rememberPassword.value) { |
|
_box.write(_usernameKey, username.value); |
|
_box.write(_passwordKey, password.value); |
|
} else { |
|
_box.remove(_usernameKey); |
|
_box.remove(_passwordKey); |
|
} |
|
|
|
Get.offAllNamed(AppRoutes.home); |
|
} else { |
|
Get.snackbar('登录失败', '服务器返回了异常数据'); |
|
} |
|
} on DioException catch (e) { |
|
if (e.response?.data != null && e.response?.data['detail'] != null) { |
|
final serverMessage = e.response!.data['detail']; |
|
Get.snackbar('登录失败', serverMessage); |
|
} else { |
|
Get.snackbar('网络错误', '登录失败,请检查您的网络连接'); |
|
} |
|
} catch (e) { |
|
Get.snackbar('错误', '发生未知错误: ${e.toString()}'); |
|
} finally { |
|
isLoading.value = false; |
|
} |
|
} |
|
|
|
Future<void> logout() async { |
|
_box.remove('token'); |
|
_box.remove('refreshToken'); |
|
if (rememberPassword.value == false) { |
|
_box.remove(_usernameKey); |
|
_box.remove(_passwordKey); |
|
} |
|
Get.offAllNamed(AppRoutes.login); |
|
} |
|
}
|
|
|