Add TravelAlbum, ProfileSpace, and wired camera transfer modules.

Introduce travel album entry with Sony PTP tethering pipeline, profile space settings page, home routing updates, Launch Screen storyboard, and related tests/docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-30 09:41:05 +08:00
parent 5692134efc
commit d2fe5d71e4
48 changed files with 6477 additions and 11 deletions

View File

@ -0,0 +1,58 @@
# ProfileSpace 模块业务逻辑
## 模块职责
ProfileSpace 模块负责首页“空间设置”入口,对齐 Android `space_settings -> ProfileInfoRoute` 的个人空间配置能力。
该模块聚焦摄影师在当前景区下的公开展示和接单配置:
- 拉取个人空间资料。
- 修改头像、昵称和简介。
- 管理个人标签、拍摄说明标签和相机设备。
- 配置工作日与法定节假日营业时间。
- 配置接单状态。
- 展示未来 7 天日程,并支持添加、删除和拨打客户电话。
相册管理不属于本模块,仍由 Assets/相册模块承接。
## 核心对象
- `ProfileSpaceView`:空间配置页 UI负责资料展示、表单输入、日程展示和保存入口。
- `ProfileSpaceViewModel`:维护编辑草稿、原始快照、脏状态、校验和提交逻辑。
- `ProfileSpaceInfoResponse`:空间配置详情响应。
- `UpdateProfileSpaceRequest`:空间配置更新请求。
- `ProfileAPI`:封装空间配置读取和更新接口,同时复用用户昵称、头像更新接口。
- `ScheduleAPI`:复用已有排班新增和删除接口。
- `OSSUploadService`:复用头像上传能力。
## 加载流程
1. 首页点击 `space_settings` 后进入 `ProfileSpaceView`
2. 页面从 `AccountContext.currentScenic` 读取当前景区 ID。
3. `ProfileSpaceViewModel.load` 调用 `ProfileAPI.profileSpaceInfo`
4. 接口成功后回填头像、姓名、昵称、简介、标签、设备、营业时间、接单状态和日程 map。
5. ViewModel 保存一份 `ProfileSpaceEditableSnapshot`,用于判断保存按钮是否可用。
缺少当前景区时,页面展示缺少景区空态,不发起空间配置接口。
## 保存流程
1. 用户修改表单后ViewModel 根据当前草稿和原始快照判断 `hasChanges`
2. 点击保存时先校验:
- 昵称不能为空。
- 标签和拍摄说明均最多 8 个,单个最多 20 字,禁止空值和重复。
- 四个营业时间必须填写。
- 工作日、节假日开始时间必须早于结束时间。
3. 如头像有变化,先调用 `OSSUploadService.uploadUserAvatar` 上传,再调用 `ProfileAPI.updateUserAvatarURL` 回写头像。
4. 如昵称有变化,调用 `ProfileAPI.updateUserInfo(nickname:)`
5. 调用 `ProfileAPI.updateProfileSpaceInfo` 保存空间配置。
6. 保存成功后刷新原始快照,清除头像暂存,并同步 `AccountContext` 和账号快照中的昵称/头像展示信息。
保存失败时保留当前草稿和未保存状态,页面展示错误信息。
## 日程流程
空间配置页展示从空间详情接口返回的 `schedule` map并在页面内显示从今天起连续 7 天的日程。
添加日程复用现有 `ScheduleAddView`,提交逻辑仍由 Schedule 模块负责。页面返回后会重新加载空间配置。
删除日程调用 `ScheduleAPI.deleteSchedule`,成功后重新加载空间配置,保持日程来源一致。