# 计划:Tab 设置——统一管理所有会话 tab(内置 + 策略分组,显示/隐藏 + 拖动排序)(阶段航点) > 编号:PLAN-010 | 粒度:阶段航点(大粒度) | 创建:2026-09-02 | 状态:**执行中** > 派生自终极目标:目标-002(分仓管理工具)、目标-003(按策略监控市场) > 依据需求:**R-011(已定稿,2026-09-02,Q1-Q5 确认)** —— 符合入范围门槛 > 设计约束:产品约束-009、UI约束-003、技术约束-014(R-011 新增沉淀)、技术约束-004/005/006(沿用) ## 目标 将设置页「通用设置」升级为 **「Tab 设置」**,成为所有会话 tab(系统内置 + 策略分组)**唯一的顺序与显隐入口**:两类 tab 混排一张表,每行 = 拖动手柄 + 名称 + 显示/隐藏开关;**任何 tab 均不支持重命名与删除**;拖动落点立即持久化。 ## 范围 **做**: 1. **数据模型统一**(src/settings.js):settings.tabs 从布尔对象 → 有序数组 [{id, kind: builtin|strategy, refKey|refId, name, visible, order}];strategies 收窄为 {id, name};读取时旧格式静默归一化(旧 tabs 布尔对象 → 三个内置条目保留原显隐;旧策略按 order 接续追加,旧隐藏策略迁移后 visible=true);新增整表更新(顺序 + 显隐);DEFAULT_TABS 升级为默认数组; 2. **API 层**(src/api/strategies.js):tabs/update 语义改为整表更新(顺序 + 显隐);strategies/add 联动追加 tab 条目(末尾);strategies/remove 联动删除对应 tab 条目;废弃 strategies/move;strategies/update 仅剩重命名; 3. **客户端注册**(src/client/index.js):合并 registerGeneralTabs + registerStrategyTabs 为统一注册(读 tabs 数组按 order 排序、过滤 visible;builtin 走内置 render、strategy 走 StrategyTab),移除硬编码 order 间隔(10/11/12 与 13+); 4. **设置页 UI**(src/client/views/SettingsSection.jsx): - 「Tab 设置」子 tab 取代「通用设置」:混排表格,内置行「内置」徽标、策略行「策略」徽标;每行 = 拖动手柄 + 名称 + 显隐开关;无任何重命名/删除按钮; - 拖动:原生 HTML5 Drag & Drop,落点重排 → 立即调 tabs/update 持久化 → 提示「刷新页面后生效」; - 「策略分组」子 tab 瘦身:只留 新增/重命名/删除,移除排序箭头与显隐开关,加提示「顺序与显示请在「Tab 设置」中调整」。 **不做**: - 策略的命名/删除入口迁移(仍在「策略分组」子 tab); - 内置 tab 的重命名/删除(禁); - tab 注册热更新(沿用「刷新页面后生效」机制,无事件机制); - 其他设置子 tab(QMT 连接配置)改动(仅 UI约束-002 文案「通用设置」→「Tab 设置」对齐)。 ## 程序结构 ``` src/ ├── settings.js # 改:tabs 有序数组 + 归一化迁移 + 整表更新;strategies 收窄 ├── api/strategies.js # 改:tabs/update 整表;add/remove 联动 tabs;废弃 move src/client/ ├── index.js # 改:统一注册(读 tabs 数组) └── views/SettingsSection.jsx # 改:「Tab 设置」子 tab + 拖动排序 + 策略分组瘦身 ``` ## 实现步骤 1. **文档骨架**:PLAN-010 + 迭代 09 文档(本步); 2. **settings.js**:tabs 有序数组 schema + DEFAULT_TABS + 归一化(getTabs 旧格式转新)+ updateTabs 整表 + strategies 收窄(去 visible/order 读写); 3. **api/strategies.js**:tabs/update 整表语义;strategies/add 追加 tab;strategies/remove 联动删 tab;废弃 move(API 表 + handler); 4. **client/index.js**:统一注册函数(读 tabs 数组),移除硬编码 order; 5. **SettingsSection.jsx**:「Tab 设置」子 tab(混排表格 + 徽标 + 显隐开关 + 拖动排序 + 立即持久化);策略分组子 tab 瘦身; 6. **构建测试**:pnpm run build + typecheck + 独立数据目录回归(技术约束-011,注意只读端点可直连、写操作走临时目录); 7. **验收 + 复盘**。 ## 验收要点 - 「通用设置」子 tab 更名为「Tab 设置」,表格混排内置 + 策略全部 tab; - 内置行带「内置」徽标、策略行带「策略」徽标; - 每行可拖动排序,落点立即持久化(刷新页面后生效); - 每行有显示/隐藏开关,切换立即持久化; - 任何行均无重命名/删除按钮; - 策略分组子 tab 只留 新增/重命名/删除,无排序箭头/显隐开关,有指引提示; - 新增策略出现在 Tab 设置列表末尾;删除策略后对应 tab 条目消失; - 老配置(布尔对象 tabs + 策略 order/visible)读取时自动归一化,无报错、无数据丢失; - 会话 tab 栏按新顺序与显隐注册(内置与策略可交错); - 现有功能不回归(全部持仓/交易记录/策略持仓/QMT 切换)。