147 lines
4.1 KiB
Dart
147 lines
4.1 KiB
Dart
import 'package:dio/dio.dart';
|
||
|
||
import '../models/media_asset.dart';
|
||
import 'api_client.dart';
|
||
|
||
/// 媒体资源管理服务:媒体资产与排行榜。
|
||
///
|
||
/// 对接真实「爱视后台」:
|
||
/// - 媒体资产:/api/sys/mediaAsset/*
|
||
/// - 媒体排行榜:/api/sys/mediaAssetRank/*
|
||
class MediaService {
|
||
MediaService({Dio? dio}) : _dio = dio ?? ApiClient.instance.dio;
|
||
|
||
final Dio _dio;
|
||
|
||
// ================ 媒体资产管理 ================
|
||
|
||
/// 获取媒体资产列表(分页)。
|
||
///
|
||
/// GET /sys/mediaAsset/list?page=&limit=
|
||
Future<List<MediaAsset>> getMediaAssetList({
|
||
int page = 1,
|
||
int limit = 20,
|
||
}) async {
|
||
final response = await _dio.get<dynamic>(
|
||
'/sys/mediaAsset/list',
|
||
queryParameters: {'page': page, 'limit': limit},
|
||
);
|
||
final list = _extractList(response.data);
|
||
return list
|
||
.whereType<Map<String, dynamic>>()
|
||
.map(MediaAsset.fromJson)
|
||
.toList();
|
||
}
|
||
|
||
/// 获取媒体资产详情。
|
||
///
|
||
/// GET /sys/mediaAsset/info/{id}
|
||
Future<MediaAsset> getMediaAssetInfo(String id) async {
|
||
final response = await _dio.get<dynamic>('/sys/mediaAsset/info/$id');
|
||
final data = response.data;
|
||
if (data is! Map<String, dynamic>) {
|
||
throw ApiException(500, '媒体资产信息加载失败:$id');
|
||
}
|
||
return MediaAsset.fromJson(data);
|
||
}
|
||
|
||
/// 新增或修改媒体资产。
|
||
///
|
||
/// POST /sys/mediaAsset/save,body 为媒体数据。
|
||
Future<void> saveMediaAsset(Map<String, dynamic> data) async {
|
||
await _dio.post<dynamic>('/sys/mediaAsset/save', data: data);
|
||
}
|
||
|
||
/// 批量删除媒体资产。
|
||
///
|
||
/// POST /sys/mediaAsset/delete,body 为 `{ids: [...]}`。
|
||
Future<void> deleteMediaAsset(List<int> ids) async {
|
||
await _dio.post<dynamic>(
|
||
'/sys/mediaAsset/delete',
|
||
data: {'ids': ids},
|
||
);
|
||
}
|
||
|
||
// ================ 媒体排行榜 ================
|
||
|
||
/// 获取媒体排行榜 Top 10。
|
||
///
|
||
/// GET /sys/mediaAssetRank/top10
|
||
Future<List<MediaRankItem>> getMediaAssetRankTop10() async {
|
||
final response = await _dio.get<dynamic>('/sys/mediaAssetRank/top10');
|
||
final list = _extractList(response.data);
|
||
return list
|
||
.whereType<Map<String, dynamic>>()
|
||
.map(MediaRankItem.fromJson)
|
||
.toList();
|
||
}
|
||
|
||
/// 设置排行榜(批量设置,覆盖原有列表)。
|
||
///
|
||
/// POST /sys/mediaAssetRank/set,body 为 `{codeList: [...]}`。
|
||
Future<void> setMediaAssetRank(List<String> codeList) async {
|
||
await _dio.post<dynamic>(
|
||
'/sys/mediaAssetRank/set',
|
||
data: {'codeList': codeList},
|
||
);
|
||
}
|
||
|
||
/// 从排行榜移除指定媒体。
|
||
///
|
||
/// POST /sys/mediaAssetRank/remove,body 为 `{code: ...}`。
|
||
Future<void> removeMediaAssetRank(String code) async {
|
||
await _dio.post<dynamic>(
|
||
'/sys/mediaAssetRank/remove',
|
||
data: {'code': code},
|
||
);
|
||
}
|
||
|
||
/// 将指定媒体上移一位。
|
||
///
|
||
/// POST /sys/mediaAssetRank/moveUp,body 为 `{code: ...}`。
|
||
Future<void> moveUpMediaAssetRank(String code) async {
|
||
await _dio.post<dynamic>(
|
||
'/sys/mediaAssetRank/moveUp',
|
||
data: {'code': code},
|
||
);
|
||
}
|
||
|
||
/// 将指定媒体下移一位。
|
||
///
|
||
/// POST /sys/mediaAssetRank/moveDown,body 为 `{code: ...}`。
|
||
Future<void> moveDownMediaAssetRank(String code) async {
|
||
await _dio.post<dynamic>(
|
||
'/sys/mediaAssetRank/moveDown',
|
||
data: {'code': code},
|
||
);
|
||
}
|
||
|
||
/// 清空排行榜。
|
||
///
|
||
/// POST /sys/mediaAssetRank/clear
|
||
Future<void> clearMediaAssetRank() async {
|
||
await _dio.post<dynamic>('/sys/mediaAssetRank/clear');
|
||
}
|
||
|
||
// ================ 工具方法 ================
|
||
|
||
/// 兼容列表响应的三种形态:
|
||
/// `{list: [...], totalCount}` / `{page: {list, totalCount}}` / 直接数组。
|
||
static List<dynamic> _extractList(dynamic data) {
|
||
if (data is List) {
|
||
return data;
|
||
}
|
||
if (data is Map<String, dynamic>) {
|
||
final list = data['list'];
|
||
if (list is List) {
|
||
return list;
|
||
}
|
||
final page = data['page'];
|
||
if (page is Map<String, dynamic> && page['list'] is List) {
|
||
return page['list'] as List;
|
||
}
|
||
}
|
||
return const <dynamic>[];
|
||
}
|
||
}
|