feat(app): album banner picker in edit form — show current banner, pick & upload on save

- api_client:uploadAlbumAssetFromFile 泛化(cover 为薄壳)+ fetchAlbumAssetUrl
  (GET /albums/{id}/assets → 指定 kind 全局行 URL)
- 编辑页 Details:封面下方新增「宣传图」3:1 选择器——编辑模式异步加载现有
  banner 预览(失败静默);保存成功后上传(同封面:失败不阻塞表单结果)
- 未保存变更判断纳入 banner;l10n zh/en
- 测试适配:编辑用例 pumpForm 后清空 banner 现状预检请求(397/397 全绿)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-23 11:07:54 +08:00
parent 3d45350711
commit c2143e1f94
10 changed files with 288 additions and 39 deletions
+5 -1
View File
@@ -417,5 +417,9 @@
"deleteAlbum": "Delete album",
"deleteAlbumConfirmTitle": "Delete this album?",
"deleteAlbumConfirmBody": "The album becomes invisible immediately and cannot be restored. Data is retained; recovery requires operations.",
"albumDeleted": "Album deleted"
"albumDeleted": "Album deleted",
"bannerPicker": "Banner",
"bannerPickerHint": "Tap to pick a banner image (shown atop the viewer page)",
"bannerSelected": "Banner selected — will upload on save",
"bannerUploadFailed": "Banner upload failed"
}
@@ -1957,6 +1957,30 @@ abstract class AppLocalizations {
/// In zh, this message translates to:
/// **'相册已删除'**
String get albumDeleted;
/// No description provided for @bannerPicker.
///
/// In zh, this message translates to:
/// **'宣传图'**
String get bannerPicker;
/// No description provided for @bannerPickerHint.
///
/// In zh, this message translates to:
/// **'点击选择宣传图(展示在观众页顶部)'**
String get bannerPickerHint;
/// No description provided for @bannerSelected.
///
/// In zh, this message translates to:
/// **'已选择宣传图——保存时上传'**
String get bannerSelected;
/// No description provided for @bannerUploadFailed.
///
/// In zh, this message translates to:
/// **'宣传图上传失败'**
String get bannerUploadFailed;
}
class _AppLocalizationsDelegate
@@ -1000,4 +1000,17 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get albumDeleted => 'Album deleted';
@override
String get bannerPicker => 'Banner';
@override
String get bannerPickerHint =>
'Tap to pick a banner image (shown atop the viewer page)';
@override
String get bannerSelected => 'Banner selected — will upload on save';
@override
String get bannerUploadFailed => 'Banner upload failed';
}
@@ -968,4 +968,16 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get albumDeleted => '相册已删除';
@override
String get bannerPicker => '宣传图';
@override
String get bannerPickerHint => '点击选择宣传图(展示在观众页顶部)';
@override
String get bannerSelected => '已选择宣传图——保存时上传';
@override
String get bannerUploadFailed => '宣传图上传失败';
}
+5 -1
View File
@@ -417,5 +417,9 @@
"deleteAlbum": "删除相册",
"deleteAlbumConfirmTitle": "删除这个相册?",
"deleteAlbumConfirmBody": "删除后立即不可见且不可恢复。数据保留,恢复需运维处理。",
"albumDeleted": "相册已删除"
"albumDeleted": "相册已删除",
"bannerPicker": "宣传图",
"bannerPickerHint": "点击选择宣传图(展示在观众页顶部)",
"bannerSelected": "已选择宣传图——保存时上传",
"bannerUploadFailed": "宣传图上传失败"
}