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>[];
|
|||
|
|
}
|
|||
|
|
}
|