ops-console v1.0.2 (versionCode 8) 源码入库
This commit is contained in:
146
lib/services/media_service.dart
Normal file
146
lib/services/media_service.dart
Normal file
@@ -0,0 +1,146 @@
|
||||
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>[];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user