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.

112 lines
3.1 KiB

2 weeks ago
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);
}
}