From 6129a1632fcea90567438c95c9a1a8e11a1a8c3b Mon Sep 17 00:00:00 2001
From: XHYourName <365858597@qq.com>
Date: Fri, 31 Jul 2026 16:48:28 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Eai=E4=BF=AE=E5=9B=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../travel-album-ai/01-photo-preview-flow.svg | 47 +
.../travel-album-ai/02-multi-select-flow.svg | 44 +
.../02-upload-transfer-mode-flow.svg | 31 +
.../travel-album-ai/03-ai-edit-sheet-flow.svg | 56 +
.../03-wired-transfer-preview-flow.svg | 31 +
.../travel-album-ai/04-ai-task-state-flow.svg | 49 +
.../05-cover-template-flow.svg | 52 +
.../06-thumbnail-state-flow.svg | 51 +
docs/相册管理与AI修图功能说明.md | 261 ++++
.../TravelAlbumPreviewIcons/Contents.json | 6 +
.../Contents.json | 21 +
.../travel_album_preview_ai_edit.svg | 3 +
.../Contents.json | 21 +
.../travel_album_preview_delete.svg | 3 +
.../Contents.json | 21 +
.../travel_album_preview_refresh.svg | 3 +
.../TravelAlbumPurchasedDemo/Contents.json | 6 +
.../Contents.json | 21 +
.../purchased_alpine_lake.png | Bin 0 -> 993262 bytes
.../Contents.json | 21 +
.../purchased_forest_waterfall.png | Bin 0 -> 1256682 bytes
.../Contents.json | 21 +
.../purchased_grassland_path.png | Bin 0 -> 1110367 bytes
.../Contents.json | 21 +
.../purchased_lakeside_flowers.png | Bin 0 -> 1187111 bytes
.../Models/TravelAlbumModels.swift | 14 +
.../TravelAlbumPhotoPreviewModels.swift | 316 ++++
.../Models/TravelAlbumOTGTransferModels.swift | 28 +
.../TravelAlbumAIEditResultStore.swift | 308 ++++
.../TravelAlbumDetailViewModel.swift | 57 +-
.../WiredCameraTransferViewModel.swift | 7 +-
.../Live/LiveAlbumViewControllers.swift | 0
.../Live/LiveDetailViewController.swift | 0
.../Live/LiveManageViewController.swift | 0
.../Live/LiveUIComponents.swift | 0
.../TravelAlbumDetailViewController.swift | 367 ++++-
...ravelAlbumPhotoPreviewViewController.swift | 1351 +++++++++++++++++
...AlbumTransferModeSheetViewController.swift | 171 +++
.../WiredCameraTransferViewController.swift | 19 +-
.../WiredTransferSettingChipButton.swift | 10 +-
.../TravelAlbumViewModelTests.swift | 303 +++-
.../WiredTransferSettingChipButtonTests.swift | 9 +
42 files changed, 3696 insertions(+), 54 deletions(-)
create mode 100644 docs/assets/travel-album-ai/01-photo-preview-flow.svg
create mode 100644 docs/assets/travel-album-ai/02-multi-select-flow.svg
create mode 100644 docs/assets/travel-album-ai/02-upload-transfer-mode-flow.svg
create mode 100644 docs/assets/travel-album-ai/03-ai-edit-sheet-flow.svg
create mode 100644 docs/assets/travel-album-ai/03-wired-transfer-preview-flow.svg
create mode 100644 docs/assets/travel-album-ai/04-ai-task-state-flow.svg
create mode 100644 docs/assets/travel-album-ai/05-cover-template-flow.svg
create mode 100644 docs/assets/travel-album-ai/06-thumbnail-state-flow.svg
create mode 100644 docs/相册管理与AI修图功能说明.md
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/Contents.json
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_ai_edit.imageset/Contents.json
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_ai_edit.imageset/travel_album_preview_ai_edit.svg
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_delete.imageset/Contents.json
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_delete.imageset/travel_album_preview_delete.svg
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_refresh.imageset/Contents.json
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_refresh.imageset/travel_album_preview_refresh.svg
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/Contents.json
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_alpine_lake.imageset/Contents.json
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_alpine_lake.imageset/purchased_alpine_lake.png
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_forest_waterfall.imageset/Contents.json
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_forest_waterfall.imageset/purchased_forest_waterfall.png
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_grassland_path.imageset/Contents.json
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_grassland_path.imageset/purchased_grassland_path.png
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_lakeside_flowers.imageset/Contents.json
create mode 100644 suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_lakeside_flowers.imageset/purchased_lakeside_flowers.png
create mode 100644 suixinkan/Features/TravelAlbum/Models/TravelAlbumPhotoPreviewModels.swift
create mode 100644 suixinkan/Features/TravelAlbum/Services/TravelAlbumAIEditResultStore.swift
rename suixinkan/UI/{ => CloudDrive}/Live/LiveAlbumViewControllers.swift (100%)
rename suixinkan/UI/{ => CloudDrive}/Live/LiveDetailViewController.swift (100%)
rename suixinkan/UI/{ => CloudDrive}/Live/LiveManageViewController.swift (100%)
rename suixinkan/UI/{ => CloudDrive}/Live/LiveUIComponents.swift (100%)
create mode 100644 suixinkan/UI/TravelAlbum/TravelAlbumPhotoPreviewViewController.swift
create mode 100644 suixinkan/UI/TravelAlbum/TravelAlbumTransferModeSheetViewController.swift
diff --git a/docs/assets/travel-album-ai/01-photo-preview-flow.svg b/docs/assets/travel-album-ai/01-photo-preview-flow.svg
new file mode 100644
index 0000000..c35e548
--- /dev/null
+++ b/docs/assets/travel-album-ai/01-photo-preview-flow.svg
@@ -0,0 +1,47 @@
+
diff --git a/docs/assets/travel-album-ai/02-multi-select-flow.svg b/docs/assets/travel-album-ai/02-multi-select-flow.svg
new file mode 100644
index 0000000..05f233b
--- /dev/null
+++ b/docs/assets/travel-album-ai/02-multi-select-flow.svg
@@ -0,0 +1,44 @@
+
diff --git a/docs/assets/travel-album-ai/02-upload-transfer-mode-flow.svg b/docs/assets/travel-album-ai/02-upload-transfer-mode-flow.svg
new file mode 100644
index 0000000..1fe1ff1
--- /dev/null
+++ b/docs/assets/travel-album-ai/02-upload-transfer-mode-flow.svg
@@ -0,0 +1,31 @@
+
diff --git a/docs/assets/travel-album-ai/03-ai-edit-sheet-flow.svg b/docs/assets/travel-album-ai/03-ai-edit-sheet-flow.svg
new file mode 100644
index 0000000..17850b7
--- /dev/null
+++ b/docs/assets/travel-album-ai/03-ai-edit-sheet-flow.svg
@@ -0,0 +1,56 @@
+
diff --git a/docs/assets/travel-album-ai/03-wired-transfer-preview-flow.svg b/docs/assets/travel-album-ai/03-wired-transfer-preview-flow.svg
new file mode 100644
index 0000000..2141443
--- /dev/null
+++ b/docs/assets/travel-album-ai/03-wired-transfer-preview-flow.svg
@@ -0,0 +1,31 @@
+
diff --git a/docs/assets/travel-album-ai/04-ai-task-state-flow.svg b/docs/assets/travel-album-ai/04-ai-task-state-flow.svg
new file mode 100644
index 0000000..98a0d3a
--- /dev/null
+++ b/docs/assets/travel-album-ai/04-ai-task-state-flow.svg
@@ -0,0 +1,49 @@
+
diff --git a/docs/assets/travel-album-ai/05-cover-template-flow.svg b/docs/assets/travel-album-ai/05-cover-template-flow.svg
new file mode 100644
index 0000000..65d7fec
--- /dev/null
+++ b/docs/assets/travel-album-ai/05-cover-template-flow.svg
@@ -0,0 +1,52 @@
+
diff --git a/docs/assets/travel-album-ai/06-thumbnail-state-flow.svg b/docs/assets/travel-album-ai/06-thumbnail-state-flow.svg
new file mode 100644
index 0000000..338370c
--- /dev/null
+++ b/docs/assets/travel-album-ai/06-thumbnail-state-flow.svg
@@ -0,0 +1,51 @@
+
diff --git a/docs/相册管理与AI修图功能说明.md b/docs/相册管理与AI修图功能说明.md
new file mode 100644
index 0000000..cd53e20
--- /dev/null
+++ b/docs/相册管理与AI修图功能说明.md
@@ -0,0 +1,261 @@
+# 相册管理与 AI 修图功能说明
+
+> 文档日期:2026-07-29
+> 适用范围:新增相册 → 相册任务 → 相册管理 → 照片上传与传输 → 照片预览与 AI 修图
+> 数据说明:相册和照片列表、有线相机连接及照片传输继续使用项目已有真实数据能力;传输模式选择保存在本地。原图精修结果、氛围感结果、封面模板、剩余 9 张额度及状态角标目前为本地可演示数据,尚未接入服务端持久化,App 进程重启后会清空。
+
+## 1. 照片预览、左右滑动与底部操作
+
+### 功能说明
+
+用户在“相册管理”照片网格中点击任意缩略图,进入单张照片预览页。页面只保留一个返回按钮,导航区域展示当前照片文件名和文件大小;照片区域支持左右滑动查看同一相册内的上一张或下一张照片。
+
+预览页统一使用黑色沉浸式自定义头部,不再混用系统导航栏:左侧为圆形返回按钮,中间展示文件名和文件大小,右侧展示“当前张数/总张数”。切换照片时三处信息同步更新。照片预览与原图精修、氛围感、封面模板预览都直接使用同一个全屏模态容器,不进入项目导航栈,因此不会叠加系统白色导航栏或出现两个返回按钮;关闭后回到进入前的相册管理页或修图弹窗。
+
+底部固定展示以下三个操作,不展示打印按钮:
+
+| 操作 | 点击结果 | 操作期间或异常处理 |
+| --- | --- | --- |
+| AI修图 | 打开当前照片的 AI 修图弹窗 | 当前照片处于“修图中”时按钮置灰,避免重复提交 |
+| 删除 | 二次确认后删除当前照片 | 删除成功后自动定位到相邻照片;删除最后一张后返回相册管理 |
+| 刷新 | 重新加载当前照片及最新修图结果 | 刷新失败时不清空当前已显示内容,可再次点击 |
+
+左右滑动时同步刷新文件名、文件大小、原图/修图后状态和底部按钮状态。第一张继续向右滑、最后一张继续向左滑时保持当前照片,不循环跳转。
+
+页面底部图标使用项目内 `TravelAlbumPreviewIcons` SVG 资源,确保 AI 修图、删除、刷新三个入口视觉一致。
+
+### 状态流转图
+
+
+
+### 本功能验收
+
+- [ ] 从任意缩略图进入时只显示一个返回入口。
+- [ ] 文件名和文件大小与当前照片一致。
+- [ ] 导航头部保持黑色沉浸样式,右侧张数随照片切换同步变化。
+- [ ] 左右滑动后照片和文件信息同步变化。
+- [ ] 首尾照片不会越界或循环。
+- [ ] 底部仅显示 AI修图、删除、刷新,不显示打印。
+- [ ] 删除当前照片后能正确定位或退出预览。
+
+## 2. 上传照片与传输模式选择
+
+### 功能说明
+
+相册管理处于普通状态时,用户点击底部“上传照片”,先从底部弹出“选择传输模式”,展示“边拍边传”和“拍后传输”两个选项。点击任一选项后弹窗关闭,并进入当前相册的有线传输页面;点击“取消”或向下关闭弹窗时停留在相册管理,不改变现有照片和选择状态。
+
+| 传输模式 | 弹窗说明 | 下一页初始状态 | 后续行为 |
+| --- | --- | --- | --- |
+| 边拍边传 | 相机拍摄后,照片自动传输并上传到当前相册 | 传输模式显示“边拍边传” | 新传入 App 的照片自动上传 |
+| 拍后传输 | 拍摄完成后,再选择相机照片批量传输 | 传输模式显示“拍后传输” | 新照片先保留,用户后续选择并上传 |
+
+本次弹窗选择优先于本机上一次保存的传输模式,并同步成为新的最近使用模式,确保下一页展示和实际传输行为一致。相册 ID、相册名称、联系电话及照片数据继续沿用相册管理页面的真实数据,不创建新的相册或假照片。
+
+进入有线传输页面后,非批量选择状态下点击任意照片缩略图,预览页会使用当前 Tab 筛选后的照片顺序,并从被点击照片开始展示。用户可左右滑动查看上一张或下一张,顶部页码随照片同步变化;没有可用预览地址的照片不进入预览序列,也不占用页码。第一张继续向右滑、最后一张继续向左滑时均停留在边界,不循环跳转。处于批量上传选择状态时,点击照片仍执行选择或取消选择,不打开预览。
+
+### 状态流转图
+
+
+
+
+
+### 本功能验收
+
+- [ ] 点击“上传照片”后先显示底部传输模式弹窗,不直接进入下一页。
+- [ ] 弹窗同时显示“边拍边传”和“拍后传输”及对应说明。
+- [ ] 选择“边拍边传”后,下一页模式显示为“边拍边传”。
+- [ ] 选择“拍后传输”后,下一页模式显示为“拍后传输”。
+- [ ] 本次选择不会被上一次保存的模式覆盖。
+- [ ] 取消或关闭弹窗后仍停留在相册管理。
+- [ ] 非批量选择状态点击缩略图后,从被点击照片进入全屏预览。
+- [ ] 预览可左右滑动查看当前 Tab 中的上一张和下一张,页码同步变化且首尾不循环。
+- [ ] 批量选择状态点击照片只改变选择状态,不打开预览。
+
+## 3. 相册管理多选与底部操作栏切换
+
+### 功能说明
+
+相册管理页普通状态下,底部显示“上传照片”。用户点击右上角选择按钮后进入多选状态,每张缩略图右上角显示选择圆圈,底部“上传照片”隐藏,替换为“AI修图”和“删除”。
+
+| 多选状态 | 页面表现 | 可用操作 | 下一状态 |
+| --- | --- | --- | --- |
+| 未进入多选 | 不显示选择圆圈,底部显示上传照片 | 点击照片进入预览;点击右上角选择 | 进入多选 |
+| 已进入但未选照片 | 显示未选圆圈,AI修图和删除置灰 | 选择照片;再次点击右上角选择退出 | 已选择或退出 |
+| 已选择照片 | 选中照片显示勾选,AI修图和删除可用 | 发起批量修图或批量删除 | 弹窗、处理中或删除结果 |
+| 选中项含修图中的照片 | 保留当前选择,AI修图置灰 | 等待任务完成;删除仍按现有删除规则处理 | 任务结束后恢复 |
+| 退出多选 | 清空本次选择,恢复上传照片 | 上传或进入照片预览 | 普通状态 |
+
+批量删除必须二次确认;用户取消时不删除任何照片并保留当前选择。批量 AI 修图复用与单张预览相同的预设、任务状态和结果覆盖逻辑。
+
+### 状态流转图
+
+
+
+### 本功能验收
+
+- [ ] 进入多选后上传按钮消失,AI修图和删除出现。
+- [ ] 未选择照片时两个批量按钮不可点击。
+- [ ] 选择至少一张后两个批量按钮恢复可用。
+- [ ] 包含修图中照片时不能再次发起 AI 修图。
+- [ ] 退出多选后选择状态清空并恢复上传按钮。
+
+## 4. AI 修图弹窗、原图精修、氛围感与按张收费模式
+
+### 功能说明
+
+用户从单张预览或相册多选操作栏点击“AI修图”后,以同一个底部弹窗展示 AI 修图配置。标题与弹窗顶部保留足够间距,标题下方展示“已选择 N 张照片”。弹窗内容可纵向滚动,取消和确定按钮固定在底部,照片较多并出现封面模块时也不会遮挡选择项。
+
+“原图精修”是基础修图模块,使用横向滚动单选列表,每个预设同时展示名称和对应效果图:
+
+| 预设 | 当前效果用途 |
+| --- | --- |
+| 还原为原图 | 清除该照片已有修图结果和封面类型 |
+| 写真-简约肖像 | 低饱和、提亮的人像效果 |
+| 写真-清冷古风 | 清冷复古效果 |
+| 旅拍-锦绣 | 提升饱和度和对比度 |
+| 旅拍-远山 | 低饱和、柔和远景效果 |
+| 旅拍-薄雾 | 提亮并降低对比度 |
+| 油画-夏日 | 偏暖夏日效果 |
+| 油画-浓郁 | 高饱和、高对比效果 |
+
+原图精修默认选中“还原为原图”,用户点击其他预设后仅保留一个选中项。没有可用原图时,效果图位置显示稳定占位图,不影响弹窗选择。每张样式效果图右下角都有“预览”按钮,点击后全屏查看当前照片应用该样式的效果,不改变当前选中项。
+
+“氛围感修图”位于原图精修下方,并明确标记为“选填”。该模块与原图精修保持一致,使用横向滚动效果图单选,当前本地演示包含日落暖阳、复古胶片、清透蓝调、森系薄雾、浓郁故事五种样式。默认不选中;点击一种样式后仅保留该项,再次点击当前样式即可取消。每个样式同样提供“预览”按钮。选中后不是把氛围效果叠加并合并到精修图中,而是为每张照片额外生成一张可独立查看的“氛围感”结果。
+
+原图精修、氛围感、封面模板和“查看高清图”统一进入同一个沉浸式大图预览页。大图页不再套用系统导航栏,只显示一个返回按钮、当前样式名称和“双指缩放查看细节”提示;关闭后回到原弹窗或照片页,并保留关闭前的选择状态。
+
+弹窗内的 Tips 会随当前组合实时变化:
+
+| 当前选择 | 确认后的结果 |
+| --- | --- |
+| 仅原图精修 | 每张照片生成 1 个“精修后”结果 |
+| 原图精修 + 氛围感修图 | 每张照片生成“精修后 + 氛围感”2 个独立结果 |
+| 有封面、未选氛围感 | 每张照片生成精修结果,第一张选中照片额外生成封面 |
+| 有封面、已选氛围感 | 每张照片生成精修和氛围感 2 个结果,第一张选中照片再额外生成封面 |
+
+“修图模式”区域只读展示“AI精修 · 按张收费”和“剩余 9 张”,不再显示勾选圆圈,也不能点击选择。当前剩余数量为本地演示数据,不会真实扣减额度;未来接入服务端时由接口返回剩余额度,并以任务创建成功或服务端明确返回的扣减结果为准。
+
+点击“确定”提交当前原图精修、氛围感和封面组合并关闭弹窗;点击“取消”或关闭弹窗时不创建任务、不改变旧修图结果,也不改变额度。
+
+### 状态流转图
+
+
+
+### 本功能验收
+
+- [ ] 标题与弹窗顶部间距自然,不贴近顶部。
+- [ ] 已选照片数量准确。
+- [ ] 原图精修预设同时展示文字和效果图,并可横向滚动、保持单选。
+- [ ] 原图精修、氛围感和封面模板效果图均可通过小按钮全屏预览,预览不改变选择。
+- [ ] 所有大图预览使用同一黑色头部、单一返回入口,并支持双指缩放。
+- [ ] 氛围感修图横向展示多个效果图,默认不选中、保持单选,可再次点击当前样式取消。
+- [ ] 同时选择原图精修和氛围感时,每张照片生成两个独立结果。
+- [ ] Tips 能根据氛围感和封面选择动态说明实际输出结果。
+- [ ] 修图模式只展示按张收费与剩余张数,不提供选择操作。
+- [ ] 取消弹窗不会创建任务或覆盖旧结果。
+
+## 5. AI 修图任务状态、失败重试与结果覆盖
+
+### 功能说明
+
+用户确认修图后,所选照片立即进入“修图中”。任务未结束前,相关 AI 修图入口置灰;即使用户离开照片预览页,本地演示任务仍会继续完成,并通过共享结果状态刷新相册缩略图。
+
+| 任务状态 | 进入条件 | 页面表现 | 可用操作 | 后续状态 |
+| --- | --- | --- | --- | --- |
+| 可发起 | 未修图、已有成功结果或上次任务已结束 | AI修图按钮可用 | 选择预设并确认 | 修图中 |
+| 修图中 | 已提交预设,等待结果 | 按钮置灰;缩略图显示“修图中” | 查看其他照片、离开页面 | 成功或失败 |
+| 成功 | 获取原图并完成本地效果处理 | 分别保存精修、氛围感和封面结果;默认展示“精修后”;按钮恢复 | 在已有结果间切换、再次修图、还原原图 | 新任务或已上传 |
+| 失败 | 原图无法获取或处理失败 | 缩略图显示“修图失败”;按钮恢复 | 再次修图 | 修图中 |
+
+成功后,照片预览页至少出现“原图 / 精修后”切换;本次选择了氛围感时增加“氛围感”,存在封面结果时增加“封面”。各结果互相独立,不把两个效果合成同一张图;有修图结果时还可以点击“查看高清图”。再次修图时,旧结果在新任务处理期间继续保留,新任务成功后整组替换为本次最新组合:本次未选择氛围感时会清除旧氛围感结果;新任务失败时保留旧成功图片,但状态优先显示“修图失败”,提醒用户本次任务未成功。
+
+选择“还原为原图”会同时清除修图结果、失败状态和封面类型,缩略图恢复为“已上传”。删除照片时同步清理该照片的本地修图记录,避免已删除照片的结果残留。
+
+### 状态流转图
+
+
+
+### 本功能验收
+
+- [ ] 修图中不能重复点击 AI修图。
+- [ ] 离开预览页后任务仍能结束并刷新缩略图。
+- [ ] 成功后可切换查看原图、精修后以及本次实际生成的氛围感或封面。
+- [ ] 同选原图精修和氛围感时两个结果均可独立查看。
+- [ ] 再次修图成功后以本次结果组合覆盖旧结果。
+- [ ] 失败后按钮恢复并允许重试。
+- [ ] 还原原图后所有本地修图类型和结果被清除。
+
+## 6. 选中 4 张及以上时的封面模板选择
+
+### 功能说明
+
+从相册管理多选照片并点击“AI修图”时,系统根据选中照片数量决定是否展示“封面风格模板”:
+
+| 选中数量 | 弹窗表现 |
+| --- | --- |
+| 1~3 张 | 展示“原图精修 + 氛围感修图(选填)”两个模块,不展示封面模板 |
+| ≥ 4 张 | 展示“原图精修 + 氛围感修图(选填)+ 封面模板”三个模块,并提高弹窗高度 |
+
+封面模板为横向滚动单选,默认选中“旅行纪念册”。每个模板效果图右下角提供“预览”按钮,点击后全屏查看完整排版,不改变当前模板选择。当前提供:
+
+- 旅行纪念册
+- 简约留白
+- 景区故事
+- 电影胶片
+
+每个模板展示名称和以第一张选中照片生成的排版效果图。用户确认后,所有选中照片先生成原图精修结果;选择了氛围感时,所有照片再各自生成一个氛围感结果;第一张选中照片另外生成独立封面并作为封面承载图。封面不会替代精修或氛围感结果,用户进入预览后可分别切换查看。
+
+当前所有封面模板 `quotaCost = 0`,弹窗显示“赠送 · 不占精修张数”,不会减少剩余修图额度。后续收费时保留同一选择流程,由服务端为模板返回大于 0 的 `quotaCost`,客户端在确认前显示实际消耗,并以服务端成功结果为准扣减;收费能力目前尚未实现。
+
+再次对不少于 4 张照片选择新封面模板并修图时,新封面效果覆盖旧封面效果。封面承载图处理失败时不标记为封面成功,缩略图显示“修图失败”并允许重试。选择“还原为原图”时清除封面效果和封面类型。
+
+### 状态流转图
+
+
+
+### 本功能验收
+
+- [ ] 选中 3 张时不显示封面模板。
+- [ ] 选中 4 张或更多时显示封面模板。
+- [ ] 有封面模块时,弹窗同时完整显示原图精修、氛围感和封面三个风格模块。
+- [ ] 封面模板可横向滚动且始终单选。
+- [ ] 每个封面模板均可独立预览,关闭预览后保留原选择。
+- [ ] 默认选中旅行纪念册。
+- [ ] 当前显示赠送并且不消耗精修额度。
+- [ ] 成功后第一张选中照片成为封面承载图。
+- [ ] 再次生成封面时以新结果覆盖旧结果。
+
+## 7. 相册缩略图结果类型与显示优先级
+
+### 功能说明
+
+相册管理缩略图左上角复用同一状态位,根据照片当前结果显示不同类型,让用户无需进入预览即可区分未修、处理中、已修、封面和失败照片。
+
+| 缩略图状态 | 角标文案与颜色 | 缩略图内容 | 进入条件 | 可用操作 |
+| --- | --- | --- | --- | --- |
+| 普通原图 | 绿色“已上传” | 服务端原图或缩略图 | 没有本地修图结果 | 预览、选择、AI修图、删除 |
+| 处理中 | 蓝色“修图中” | 有旧成功结果时继续显示旧结果,否则显示原图 | AI 任务未结束 | 预览、删除;不能再次修图 |
+| 普通修图结果 | 紫色“AI已修” | 最新精修图片 | 原图精修成功,可同时存在氛围感结果 | 预览原图/精修后/氛围感、再次修图、还原 |
+| 封面结果 | 橙色“AI封面” | 所选封面模板排版图 | 封面承载图生成成功 | 预览、再次修图、重新生成封面、还原 |
+| 修图失败 | 红色“修图失败” | 有旧成功结果时保留旧图,否则显示原图 | 最近一次任务失败 | 再次修图、删除 |
+
+状态显示优先级为:
+
+`修图中 > 修图失败 > AI封面 > AI已修 > 已上传`
+
+该优先级保证处理中或失败状态不会被历史成功结果遮盖。普通修图成功后显示“AI已修”;封面模板成功后,第一张选中照片显示封面排版图和“AI封面”,其他照片继续显示“AI已修”。再次修图成功后缩略图切换为最新结果;还原原图后回到“已上传”;删除照片后对应本地状态一起删除。
+
+当前状态和结果由内存数据源在相册管理与照片预览之间共享,尚不支持 App 重启后的恢复。服务端接入时至少需要返回素材 ID、任务状态、结果类型、结果图地址、原图精修预设 ID、是否生成氛围感、封面模板 ID、失败原因和额度消耗,客户端才能恢复完全一致的缩略图状态。
+
+### 状态流转图
+
+
+
+### 本功能验收
+
+- [ ] 未修图照片显示“已上传”。
+- [ ] 修图中照片显示“修图中”且不能重复提交。
+- [ ] 普通成功结果显示“AI已修”和最新效果图。
+- [ ] 封面成功结果显示“AI封面”和封面排版图。
+- [ ] 最近一次任务失败时优先显示“修图失败”。
+- [ ] 还原、覆盖和删除后缩略图状态同步更新。
diff --git a/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/Contents.json b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_ai_edit.imageset/Contents.json b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_ai_edit.imageset/Contents.json
new file mode 100644
index 0000000..fd1c244
--- /dev/null
+++ b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_ai_edit.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "travel_album_preview_ai_edit.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_ai_edit.imageset/travel_album_preview_ai_edit.svg b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_ai_edit.imageset/travel_album_preview_ai_edit.svg
new file mode 100644
index 0000000..fa7a7ae
--- /dev/null
+++ b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_ai_edit.imageset/travel_album_preview_ai_edit.svg
@@ -0,0 +1,3 @@
+
diff --git a/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_delete.imageset/Contents.json b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_delete.imageset/Contents.json
new file mode 100644
index 0000000..520954d
--- /dev/null
+++ b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_delete.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "travel_album_preview_delete.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_delete.imageset/travel_album_preview_delete.svg b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_delete.imageset/travel_album_preview_delete.svg
new file mode 100644
index 0000000..7332ee7
--- /dev/null
+++ b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_delete.imageset/travel_album_preview_delete.svg
@@ -0,0 +1,3 @@
+
diff --git a/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_refresh.imageset/Contents.json b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_refresh.imageset/Contents.json
new file mode 100644
index 0000000..8f4e7f1
--- /dev/null
+++ b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_refresh.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "travel_album_preview_refresh.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_refresh.imageset/travel_album_preview_refresh.svg b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_refresh.imageset/travel_album_preview_refresh.svg
new file mode 100644
index 0000000..f828547
--- /dev/null
+++ b/suixinkan/Assets.xcassets/TravelAlbumPreviewIcons/travel_album_preview_refresh.imageset/travel_album_preview_refresh.svg
@@ -0,0 +1,3 @@
+
diff --git a/suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/Contents.json b/suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_alpine_lake.imageset/Contents.json b/suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_alpine_lake.imageset/Contents.json
new file mode 100644
index 0000000..f68c0e9
--- /dev/null
+++ b/suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_alpine_lake.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "purchased_alpine_lake.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_alpine_lake.imageset/purchased_alpine_lake.png b/suixinkan/Assets.xcassets/TravelAlbumPurchasedDemo/purchased_alpine_lake.imageset/purchased_alpine_lake.png
new file mode 100644
index 0000000000000000000000000000000000000000..739f5d4f7416fef551faba340c11f3ff9b14ac8c
GIT binary patch
literal 993262
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