|
| 1 | +# keytone-album-editor Specification |
| 2 | + |
| 3 | +## Purpose |
| 4 | +TBD - created by archiving change refactor-keytone-album-component. Update Purpose after archive. |
| 5 | +## Requirements |
| 6 | +### Requirement: 键音专辑编辑器行为保持不变 |
| 7 | + |
| 8 | +Normative: 在进行组件拆分重构后,键音专辑编辑器(KeyTone Album Editor)在用户侧的视觉、交互与配置读写行为 SHALL 与重构前保持一致。 |
| 9 | + |
| 10 | +#### Scenario: Stepper 折叠/展开行为不变 |
| 11 | + |
| 12 | +- **GIVEN** 编辑器使用 `q-stepper` 组织多个步骤 |
| 13 | +- **WHEN** 用户点击某个 step 的 header |
| 14 | +- **THEN** step SHALL 在“展开该 step”与“折叠为 step=99”之间切换 |
| 15 | + |
| 16 | +#### Scenario: Continue/Back 导航行为不变 |
| 17 | + |
| 18 | +- **GIVEN** 用户位于任意步骤 |
| 19 | +- **WHEN** 用户点击 Continue / Back |
| 20 | +- **THEN** step 值切换与原实现一致,且不会引入额外的导航路径 |
| 21 | + |
| 22 | +#### Scenario: SSE → UI 状态映射不变 |
| 23 | + |
| 24 | +- **GIVEN** 前端通过 `messageAudioPackage` 事件接收来自后端的键音包配置数据 |
| 25 | +- **WHEN** 配置数据发生变化 |
| 26 | +- **THEN** UI 中与以下领域相关的数据映射与排序 SHALL 与重构前一致: |
| 27 | + - audio_files → soundFileList |
| 28 | + - sounds → soundList |
| 29 | + - key_sounds → keySoundList |
| 30 | + - key_tone(global/single/is_enable_embedded_test_sound)相关字段 |
| 31 | + |
| 32 | +#### Scenario: UI → Config 写回闭环不变 |
| 33 | + |
| 34 | +- **GIVEN** 用户在 UI 中修改名称/声音/键音/联动设置等配置 |
| 35 | +- **WHEN** watch/按钮触发写回 |
| 36 | +- **THEN** `ConfigSet`/`ConfigDelete` 的 key 路径、触发时机、以及通知提示 SHALL 与重构前一致 |
| 37 | + |
| 38 | +--- |
| 39 | + |
| 40 | +### Requirement: 对话框可复用且可被跨步骤直接拉起 |
| 41 | + |
| 42 | +Normative: 拆分后的对话框组件 SHALL 支持被任意步骤直接拉起使用(例如在某一步中打开另一领域的配置对话框),并保持与原行为一致。 |
| 43 | + |
| 44 | +#### Scenario: 在 Step4 拉起全局设置对话框 |
| 45 | + |
| 46 | +- **GIVEN** 用户处于联动声效步骤 |
| 47 | +- **WHEN** 用户点击“全局设置”按钮 |
| 48 | +- **THEN** 全局设置对话框打开,且其字段绑定/保存行为与重构前一致 |
| 49 | + |
| 50 | +#### Scenario: 在 Step4 拉起单键设置对话框 |
| 51 | + |
| 52 | +- **GIVEN** 用户处于联动声效步骤 |
| 53 | +- **WHEN** 用户点击“单键设置”按钮 |
| 54 | +- **THEN** 单键设置对话框打开,且以下行为 SHALL 与重构前一致: |
| 55 | + - 添加单键声效:按键多选/搜索/录制、声效选择、保存后的提示与状态重置 |
| 56 | + - 编辑单键声效:切换不同按键时的初始化逻辑、保存/删除提示、无改动提示 |
| 57 | + |
| 58 | +> 实现说明:父组件中原先用于对照回滚的 `v-if="false"` 旧单键对话框模板已移除;当前以 `SingleKeyEffectDialog` 作为唯一实现入口。 |
| 59 | +
|
| 60 | +--- |
| 61 | + |
| 62 | +### Requirement: 组件边界与目录结构清晰 |
| 63 | + |
| 64 | +Normative: 为降低单文件复杂度,键音专辑编辑器前端实现 SHALL 采用清晰的目录结构将步骤、对话框与逻辑域拆分管理,并保持对外入口兼容。 |
| 65 | + |
| 66 | +#### Scenario: 保持外部引用入口兼容 |
| 67 | + |
| 68 | +- **GIVEN** 其他页面/组件可能引用 `frontend/src/components/Keytone_album.vue` |
| 69 | +- **WHEN** 本次重构落地 |
| 70 | +- **THEN** 外部引用 SHALL 继续可用(通过薄壳组件或兼容导出),无需调用方修改行为 |
| 71 | + |
| 72 | +### Requirement: 新增拆分文件具备可读性说明 |
| 73 | + |
| 74 | +Normative: 本次重构新增的 step/dialog/composable/mapper 文件 SHALL 在文件头部包含说明注释,用于降低 review 与排错成本。 |
| 75 | + |
| 76 | +#### Scenario: 排查行为回归时的定位成本可控 |
| 77 | + |
| 78 | +- **GIVEN** 用户在重构后遇到行为回归或数据不同步 |
| 79 | +- **WHEN** 开发者打开新增的拆分文件 |
| 80 | +- **THEN** 文件头部注释 SHOULD 明确:文件职责边界、关联的调用方文件、关键行为不变约束、以及首选的 Debug 切入点 |
| 81 | + |
| 82 | +### Requirement: 映射逻辑统一复用纯函数 |
| 83 | + |
| 84 | +Normative: `initData()`、`watch(audioFiles)` 与 SSE 更新 三条路径 SHALL 复用 `keytoneAlbumMappers` 中的纯函数,以确保映射行为一致、避免重复代码与行为漂移。 |
| 85 | + |
| 86 | +#### Scenario: 初始化与 SSE 更新的列表排序行为一致 |
| 87 | + |
| 88 | +- **GIVEN** 用户加载键音包配置(初始化)或接收 SSE 更新 |
| 89 | +- **WHEN** 配置数据被映射为 `soundFileList` / `soundList` / `keysWithSoundEffect` |
| 90 | +- **THEN** 三条路径的映射结果 SHALL 一致(通过调用同一纯函数实现) |
| 91 | + |
| 92 | +### Requirement: Step4(联动声效)以子组件承载 UI |
| 93 | + |
| 94 | +Normative: 联动声效步骤(Step4)的 UI 模板 SHALL 从父组件中拆出到 `steps/StepLinkageEffects.vue`,并通过 inject 使用父组件 provide 的 Context,以降低父组件模板复杂度且保持行为不变。 |
| 95 | + |
| 96 | +#### Scenario: Step4 的 done/disable 与对话框打开行为保持一致 |
| 97 | + |
| 98 | +- **GIVEN** 用户处于 Step4(联动声效) |
| 99 | +- **WHEN** 用户切换内嵌测试音开关,或点击“全局设置/单键设置”打开对应对话框 |
| 100 | +- **THEN** Step4 的 done/disable 逻辑、以及对话框打开/关闭状态字段 SHALL 与重构前一致 |
| 101 | + |
0 commit comments