init
This commit is contained in:
289
client/lib/shared/providers/auth_provider.dart
Normal file
289
client/lib/shared/providers/auth_provider.dart
Normal file
@@ -0,0 +1,289 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import '../models/user_model.dart';
|
||||
import '../models/api_response.dart';
|
||||
import '../services/auth_service.dart';
|
||||
import '../../core/storage/storage_service.dart';
|
||||
import '../../core/constants/app_constants.dart';
|
||||
|
||||
/// 认证状态
|
||||
enum AuthState {
|
||||
initial,
|
||||
loading,
|
||||
authenticated,
|
||||
unauthenticated,
|
||||
error,
|
||||
}
|
||||
|
||||
/// 认证Provider
|
||||
class AuthProvider extends ChangeNotifier {
|
||||
final AuthService _authService = AuthService();
|
||||
|
||||
AuthState _state = AuthState.initial;
|
||||
UserModel? _user;
|
||||
String? _errorMessage;
|
||||
bool _isLoading = false;
|
||||
|
||||
// Getters
|
||||
AuthState get state => _state;
|
||||
UserModel? get user => _user;
|
||||
String? get errorMessage => _errorMessage;
|
||||
bool get isLoading => _isLoading;
|
||||
bool get isAuthenticated => _state == AuthState.authenticated && _user != null;
|
||||
|
||||
/// 初始化认证状态
|
||||
Future<void> initialize() async {
|
||||
_setLoading(true);
|
||||
|
||||
try {
|
||||
if (_authService.isLoggedIn()) {
|
||||
final cachedUser = _authService.getCachedUser();
|
||||
if (cachedUser != null) {
|
||||
_user = cachedUser;
|
||||
_setState(AuthState.authenticated);
|
||||
|
||||
// 尝试刷新用户信息
|
||||
await _refreshUserInfo();
|
||||
} else {
|
||||
_setState(AuthState.unauthenticated);
|
||||
}
|
||||
} else {
|
||||
_setState(AuthState.unauthenticated);
|
||||
}
|
||||
} catch (e) {
|
||||
_setError('初始化失败: $e');
|
||||
} finally {
|
||||
_setLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// 用户注册
|
||||
Future<bool> register({
|
||||
required String username,
|
||||
required String email,
|
||||
required String password,
|
||||
required String nickname,
|
||||
String? phone,
|
||||
}) async {
|
||||
_setLoading(true);
|
||||
_clearError();
|
||||
|
||||
try {
|
||||
final response = await _authService.register(
|
||||
username: username,
|
||||
email: email,
|
||||
password: password,
|
||||
nickname: nickname,
|
||||
phone: phone,
|
||||
);
|
||||
|
||||
if (response.success && response.data != null && response.data!.user != null) {
|
||||
_user = UserModel.fromJson(response.data!.user!);
|
||||
_setState(AuthState.authenticated);
|
||||
return true;
|
||||
} else {
|
||||
_setError(response.message);
|
||||
return false;
|
||||
}
|
||||
} catch (e) {
|
||||
_setError('注册失败: $e');
|
||||
return false;
|
||||
} finally {
|
||||
_setLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// 用户登录
|
||||
Future<bool> login({
|
||||
required String account, // 用户名或邮箱
|
||||
required String password,
|
||||
bool rememberMe = false,
|
||||
}) async {
|
||||
_setLoading(true);
|
||||
_clearError();
|
||||
|
||||
try {
|
||||
final response = await _authService.login(
|
||||
account: account,
|
||||
password: password,
|
||||
rememberMe: rememberMe,
|
||||
);
|
||||
|
||||
if (response.success && response.data != null && response.data!.user != null) {
|
||||
_user = UserModel.fromJson(response.data!.user!);
|
||||
_setState(AuthState.authenticated);
|
||||
return true;
|
||||
} else {
|
||||
_setError(response.message);
|
||||
return false;
|
||||
}
|
||||
} catch (e) {
|
||||
_setError('登录失败: $e');
|
||||
return false;
|
||||
} finally {
|
||||
_setLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// 用户登出
|
||||
Future<void> logout() async {
|
||||
_setLoading(true);
|
||||
|
||||
try {
|
||||
await _authService.logout();
|
||||
} catch (e) {
|
||||
// 即使登出请求失败,也要清除本地状态
|
||||
debugPrint('Logout error: $e');
|
||||
} finally {
|
||||
_user = null;
|
||||
_setState(AuthState.unauthenticated);
|
||||
_setLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// 刷新用户信息
|
||||
Future<void> _refreshUserInfo() async {
|
||||
try {
|
||||
final response = await _authService.getCurrentUser();
|
||||
if (response.success && response.data != null) {
|
||||
_user = response.data;
|
||||
notifyListeners();
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('Refresh user info error: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 更新用户信息
|
||||
Future<bool> updateProfile({
|
||||
String? nickname,
|
||||
String? avatar,
|
||||
String? phone,
|
||||
DateTime? birthday,
|
||||
String? gender,
|
||||
String? bio,
|
||||
String? learningLevel,
|
||||
String? targetLanguage,
|
||||
String? nativeLanguage,
|
||||
int? dailyGoal,
|
||||
}) async {
|
||||
_setLoading(true);
|
||||
_clearError();
|
||||
|
||||
try {
|
||||
final response = await _authService.updateProfile(
|
||||
nickname: nickname,
|
||||
avatar: avatar,
|
||||
phone: phone,
|
||||
birthday: birthday,
|
||||
gender: gender,
|
||||
bio: bio,
|
||||
learningLevel: learningLevel,
|
||||
targetLanguage: targetLanguage,
|
||||
nativeLanguage: nativeLanguage,
|
||||
dailyGoal: dailyGoal,
|
||||
);
|
||||
|
||||
if (response.success && response.data != null) {
|
||||
_user = response.data;
|
||||
notifyListeners();
|
||||
return true;
|
||||
} else {
|
||||
_setError(response.message);
|
||||
return false;
|
||||
}
|
||||
} catch (e) {
|
||||
_setError('更新个人信息失败: $e');
|
||||
return false;
|
||||
} finally {
|
||||
_setLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// 修改密码
|
||||
Future<bool> changePassword({
|
||||
required String currentPassword,
|
||||
required String newPassword,
|
||||
required String confirmPassword,
|
||||
}) async {
|
||||
_setLoading(true);
|
||||
_clearError();
|
||||
|
||||
try {
|
||||
final response = await _authService.changePassword(
|
||||
currentPassword: currentPassword,
|
||||
newPassword: newPassword,
|
||||
confirmPassword: confirmPassword,
|
||||
);
|
||||
|
||||
if (response.success) {
|
||||
return true;
|
||||
} else {
|
||||
_setError(response.message);
|
||||
return false;
|
||||
}
|
||||
} catch (e) {
|
||||
_setError('修改密码失败: $e');
|
||||
return false;
|
||||
} finally {
|
||||
_setLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// 刷新Token
|
||||
Future<bool> refreshToken() async {
|
||||
try {
|
||||
final response = await _authService.refreshToken();
|
||||
|
||||
if (response.success && response.data != null && response.data!.user != null) {
|
||||
_user = UserModel.fromJson(response.data!.user!);
|
||||
if (_state != AuthState.authenticated) {
|
||||
_setState(AuthState.authenticated);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
// Token刷新失败,需要重新登录
|
||||
_user = null;
|
||||
_setState(AuthState.unauthenticated);
|
||||
return false;
|
||||
}
|
||||
} catch (e) {
|
||||
_user = null;
|
||||
_setState(AuthState.unauthenticated);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// 设置加载状态
|
||||
void _setLoading(bool loading) {
|
||||
_isLoading = loading;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 设置状态
|
||||
void _setState(AuthState state) {
|
||||
_state = state;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 设置错误信息
|
||||
void _setError(String message) {
|
||||
_errorMessage = message;
|
||||
_setState(AuthState.error);
|
||||
}
|
||||
|
||||
/// 清除错误信息
|
||||
void _clearError() {
|
||||
_errorMessage = null;
|
||||
if (_state == AuthState.error) {
|
||||
_setState(_user != null ? AuthState.authenticated : AuthState.unauthenticated);
|
||||
}
|
||||
}
|
||||
|
||||
/// 清除所有状态
|
||||
void clear() {
|
||||
_user = null;
|
||||
_errorMessage = null;
|
||||
_isLoading = false;
|
||||
_setState(AuthState.initial);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user