水印优化+ORC优化

This commit is contained in:
2026-09-28 11:39:19 +08:00
parent c5b3d81d07
commit 6176c49964
19 changed files with 1701 additions and 171 deletions
+48
View File
@@ -1,8 +1,11 @@
import 'package:dio/dio.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:path_provider/path_provider.dart';
import '../core/network/api_env.dart';
import '../core/network/api_exception.dart';
import '../core/network/dio_client.dart';
import '../models/photo.dart';
final photoApiProvider = Provider<PhotoApi>((ref) => PhotoApi(ref.watch(dioProvider)));
@@ -59,6 +62,51 @@ class PhotoApi {
}
}
/// 分页列表,最新的在前
Future<PhotoPage> list({int page = 1, int size = 30}) async {
try {
final res = await _dio.get<dynamic>(
'/photos',
queryParameters: {'page': page, 'size': size},
);
final data = res.data;
if (data is Map<String, dynamic>) return PhotoPage.fromJson(data);
if (data is Map) return PhotoPage.fromJson(Map<String, dynamic>.from(data));
return PhotoPage.empty;
} on DioException catch (e) {
final err = e.error;
throw err is ApiException ? err : ApiException(-1, '照片列表加载失败');
}
}
/// 把原图下载到临时文件,返回本地路径。
///
/// 「重新打水印」必须先有本地文件:编辑页要读它拿尺寸、显示预览、合成成品。
/// 原图可能好几 MB,所以留了进度回调让界面能显示进度。
///
/// [url] 是后端给的相对地址(`/uploads/...`),这里用 [resolveAssetUrl]
/// 补成绝对地址 —— `/uploads` 不在 `/api` 前缀下,不能直接丢给 dio。
Future<String> downloadOriginal(
String url, {
void Function(int received, int total)? onProgress,
}) async {
try {
final dir = await getTemporaryDirectory();
final path = '${dir.path}/photo_${DateTime.now().millisecondsSinceEpoch}.jpg';
await _dio.download(
resolveAssetUrl(url),
path,
onReceiveProgress: onProgress,
// 原图几 MB,移动网络下给宽一点
options: Options(receiveTimeout: const Duration(seconds: 120)),
);
return path;
} on DioException catch (e) {
final err = e.error;
throw err is ApiException ? err : ApiException(-1, '原图下载失败');
}
}
/// 从路径里取个带扩展名的文件名,后端靠它判断文件类型
static String _fileName(String path) {
final normalized = path.replaceAll('\\', '/');