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