Files
flutterApp/lib/features/v2/home/data/datasources/site_datasource_impl.dart
2026-08-07 08:49:29 +08:00

83 lines
2.8 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:dio/dio.dart';
import 'package:get_it/get_it.dart';
import 'package:maibu_satabot_v2/core/app/app_user_cubit.dart';
import 'package:maibu_satabot_v2/core/consts/http_api_consts.dart';
import 'package:maibu_satabot_v2/core/storage/user_storage.dart';
import 'package:maibu_satabot_v2/features/auth/presentation/bloc/auth_cubit.dart';
import 'package:maibu_satabot_v2/features/v2/home/data/datasources/site_datasource.dart';
import 'package:maibu_satabot_v2/features/v2/home/domain/entities/site_entity.dart';
class SiteDataSourceImpl implements SiteDataSource {
final Dio dio;
final UserStorage _userStorage;
final AppUserCubit _appUserCubit;
SiteDataSourceImpl(this.dio, this._userStorage, this._appUserCubit);
@override
Future<List<SiteEntity>> getSiteList(String userId) async {
print('🔍 [SiteDataSource] 开始获取 Token...');
print(
'🔍 [SiteDataSource] AppUserCubit 当前用户: ${_appUserCubit.state.user?.username}',
);
var token = _appUserCubit.state.user?.token;
print(
'🔍 [SiteDataSource] 从 AppUserCubit 获取的 Token: ${token != null ? "${token.substring(0, 20)}..." : "null"}',
);
if (token == null) {
print('⚠️ [SiteDataSource] AppUserCubit 没有 Token,尝试从本地存储获取...');
final user = await _userStorage.getUser();
token = user?.token;
print(
'🔍 [SiteDataSource] 从本地存储获取的 Token: ${token != null ? "${token.substring(0, 20)}..." : "null"}',
);
}
print(
'🔑 [SiteDataSource] 获取到的 Token: ${token != null ? "${token.substring(0, 20)}..." : "null"}',
);
final queryParams = <String, dynamic>{'userId': userId};
final response = await dio.get(
HttpApiConsts.getSiteList,
queryParameters: queryParams,
options: Options(
headers: {'Authorization': token != null ? 'Bearer $token' : ''},
),
);
if (response.statusCode != 200) {
throw Exception('网络请求失败: ${response.statusCode}');
}
final responseData = response.data;
if (responseData['code'] == 401 || responseData['code'] == 403) {
print(
'🚨 [SiteDataSource] 收到认证错误码 ${responseData['code']},触发 Token 过期处理',
);
try {
GetIt.I<AuthCubit>().tokenExpired();
} catch (e) {}
throw Exception('登录已过期,请重新登录');
}
if (responseData['code'] != 200) {
throw Exception(responseData['msg'] ?? '业务异常');
}
final List<dynamic> rows = responseData['data'] ?? [];
print('📤 [SiteDataSource] 接口返回原始数据:');
for (var i = 0; i < rows.length && i < 3; i++) {
print(' 场站$i: ${rows[i]}');
}
return rows.map((item) => SiteEntity.fromJson(item)).toList();
}
}