智慧水务管理系统 - 精河县供水工程综合管理平台

token_service.dart 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import 'package:shared_preferences/shared_preferences.dart';
  2. import '../../../core/constants/app_constants.dart';
  3. /// Token 管理服务
  4. /// 负责 Token 的存储、读取、刷新和清除
  5. class TokenService {
  6. static TokenService? _instance;
  7. SharedPreferences? _prefs;
  8. TokenService();
  9. factory TokenService.getInstance() {
  10. _instance ??= TokenService();
  11. return _instance!;
  12. }
  13. Future<SharedPreferences> get _preferences async {
  14. _prefs ??= await SharedPreferences.getInstance();
  15. return _prefs!;
  16. }
  17. /// 获取 Access Token
  18. Future<String?> getToken() async {
  19. final prefs = await _preferences;
  20. return prefs.getString(AppConstants.tokenKey);
  21. }
  22. /// 获取 Refresh Token
  23. Future<String?> getRefreshToken() async {
  24. final prefs = await _preferences;
  25. return prefs.getString(AppConstants.refreshTokenKey);
  26. }
  27. /// 保存 Token
  28. Future<void> saveTokens({
  29. required String token,
  30. String? refreshToken,
  31. int? expiresIn,
  32. }) async {
  33. final prefs = await _preferences;
  34. await prefs.setString(AppConstants.tokenKey, token);
  35. if (refreshToken != null) {
  36. await prefs.setString(AppConstants.refreshTokenKey, refreshToken);
  37. }
  38. if (expiresIn != null) {
  39. final expiry = DateTime.now().millisecondsSinceEpoch + expiresIn * 1000;
  40. await prefs.setInt(AppConstants.tokenExpiryKey, expiry);
  41. }
  42. }
  43. /// 刷新 Token
  44. Future<bool> refreshToken() async {
  45. // TODO: 实现实际的 Token 刷新逻辑
  46. // 使用 refreshToken 调用后端接口获取新的 accessToken
  47. final refreshTok = await getRefreshToken();
  48. if (refreshTok == null) return false;
  49. try {
  50. // 模拟刷新
  51. // final response = await DioClient().post('/auth/refresh', data: {'refresh_token': refreshTok});
  52. // await saveTokens(token: response.data['data']['token'], refreshToken: response.data['data']['refresh_token']);
  53. return true;
  54. } catch (e) {
  55. return false;
  56. }
  57. }
  58. /// 检查 Token 是否过期
  59. Future<bool> isTokenExpired() async {
  60. final prefs = await _preferences;
  61. final expiry = prefs.getInt(AppConstants.tokenExpiryKey);
  62. if (expiry == null) return true;
  63. return DateTime.now().millisecondsSinceEpoch > expiry;
  64. }
  65. /// 清除所有 Token
  66. Future<void> clearTokens() async {
  67. final prefs = await _preferences;
  68. await prefs.remove(AppConstants.tokenKey);
  69. await prefs.remove(AppConstants.refreshTokenKey);
  70. await prefs.remove(AppConstants.tokenExpiryKey);
  71. }
  72. /// 是否已登录
  73. Future<bool> isLoggedIn() async {
  74. final token = await getToken();
  75. if (token == null) return false;
  76. return !(await isTokenExpired());
  77. }
  78. }