first commit

This commit is contained in:
2026-09-21 17:37:53 +08:00
commit 67d4dd5b7c
141 changed files with 8558 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../core/storage/local_storage.dart';
import '../models/auth_response.dart';
import '../utils/jwt_util.dart';
class AuthState {
final String? token;
final UserInfo? user;
const AuthState({this.token, this.user});
bool get isLoggedIn => token != null && token!.isNotEmpty;
const AuthState.initial() : this._();
const AuthState._({this.token, this.user});
}
class AuthNotifier extends Notifier<AuthState> {
@override
AuthState build() => const AuthState.initial();
/// App 启动时从本地存储恢复登录态。
/// 若 token 已在本地可判定过期,直接清理,避免带着废 token 进入主界面。
Future<void> load() async {
final token = LocalStorage.instance.getToken();
if (token == null || token.isEmpty) return;
if (isJwtExpired(token)) {
await LocalStorage.instance.clearAuth();
return;
}
final userInfo = LocalStorage.instance.getUserInfo();
state = AuthState(token: token, user: userInfo == null ? null : UserInfo.fromJson(userInfo));
}
/// 登录/注册成功后调用:持久化并更新状态
Future<void> loginSuccess(AuthResponse response) async {
final user = UserInfo(
username: response.username ?? '',
nickname: response.nickname ?? response.username ?? '',
);
await LocalStorage.instance.setAuth(token: response.token, userInfo: user.toJson());
state = AuthState(token: response.token, user: user);
}
Future<void> logout() async {
await LocalStorage.instance.clearAuth();
state = const AuthState.initial();
}
}
final authProvider = NotifierProvider<AuthNotifier, AuthState>(AuthNotifier.new);