news 2026/9/7 14:56:09

cc-switch 供应商列表管理实战:拖拽排序、复制与删除的完整操作与源码解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cc-switch 供应商列表管理实战:拖拽排序、复制与删除的完整操作与源码解析

cc-switch 供应商列表管理实战:拖拽排序、复制与删除的完整操作与源码解析

【免费下载链接】cc-switchA cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io项目地址: https://gitcode.com/GitHub_Trending/cc/cc-switch

本篇围绕 cc-switch 用户手册中的「排序与复制」章节展开,讲解如何在供应商列表中通过拖拽调整显示顺序、基于现有供应商快速创建配置副本,以及安全删除供应商。读完本文,你不仅能掌握这三项操作的具体步骤,还能从源码层面理解排序权重sortIndex的落库机制、复制时配置深克隆与唯一标识生成策略,以及删除按钮在不同应用(Claude、Codex、OpenCode、Hermes 等)下的启用条件。

拖拽排序

操作步骤

cc-switch 支持通过拖拽调整供应商的显示顺序:

  1. 将鼠标移到供应商卡片左侧的拖拽手柄
  2. 按住鼠标左键
  3. 上下拖动到目标位置
  4. 松开鼠标完成排序

排序用途

  • 常用优先:将常用的供应商放在列表顶部,减少切换时的查找成本
  • 故障转移顺序:排序会影响故障转移(Failover)队列的默认顺序。当 Proxy 路由开启自动故障转移时,队列顺序直接继承自供应商列表的排序

源码层面的排序实现

排序功能的实现集中在 useDragSort.ts,它基于@dnd-kit/core完成拖拽交互:

  • 触发阈值PointerSensor配置了activationConstraint: { distance: 8 },即指针移动超过 8 像素才激活拖拽,避免普通点击误触发拖拽逻辑(见 useDragSort.ts)
  • 键盘可访问:同时注册了KeyboardSensor并配合sortableKeyboardCoordinates,键盘用户也可以完成排序
  • 排序权重的三级回退sortedProviders的排序规则依次为sortIndex(用户拖拽后持久化的位置)、createdAt(创建时间)、名称(按当前界面语言做localeCompare排序,支持 zh-CN、zh-TW、en-US 三种 locale),见 useDragSort.ts

拖拽结束后的落库流程在handleDragEnd中完成:

  1. arrayMove计算新的完整顺序;
  2. 为列表中所有供应商生成{ id, sortIndex }更新项,批量调用providersApi.updateSortOrder(updates, appId)持久化;
  3. 失效["providers", appId]查询缓存刷新界面;
  4. 若当前是路由类应用(isProxyAppId(appId)为真),额外失效failoverQueue查询——源码注释明确写道 “Routing apps derive failover order from sort_index”,这正是「排序影响故障转移队列」结论的代码依据;
  5. 调用providersApi.updateTrayMenu()同步系统托盘菜单(该步骤失败只记录日志、不影响排序本身)。

整个流程见 useDragSort.ts。

复制供应商

适用场景

快速创建供应商的副本,适用于:

  • 基于现有配置创建变体
  • 备份当前配置
  • 创建测试用配置

自 v3.15.0 起,统一供应商(Universal Provider)列表也提供复制按钮,可以直接从现有统一供应商创建副本后再调整同步应用和模型。

操作步骤

  1. 鼠标悬停在供应商卡片上,显示操作按钮(复制按钮为卡片右侧的 Copy 图标,见上文截图红框标注处)
  2. 点击「复制」按钮
  3. 自动创建副本,名称添加copy后缀
  4. 编辑副本修改配置

复制内容的具体行为

文档给出「复制会创建完整副本」的结论,源码 App.tsx 中的handleDuplicateProvider给出了精确的字段清单:

内容是否复制源码细节
名称✅ 复制(追加copy后缀)新名称为`${provider.name} copy`
配置✅ 完整复制settingsConfig通过deepClone深克隆,副本与原配置互不影响
备注 / 元数据✅ 复制meta同样deepClone
网站链接✅ 复制websiteUrl原样复制
图标✅ 复制iconiconColor均复制
排序位置✅ 插入到原供应商下方新副本sortIndex = 原 sortIndex + 1,同时把原位置上所有后续供应商的sortIndex整体 +1,再调用updateSortOrder批量落库;若这一步失败,复制流程会中止,不会出现顺序错乱

源码补充:不同应用下的额外约束

在 OpenCode、OpenClaw、Hermes、Pi 这类“累加模式”(additive)应用中,供应商除了本地记录外还可能存在于应用自身的 live 配置中。复制逻辑会先读取 live 配置里已存在的供应商标识,再通过generateUniqueProviderCopyKey生成唯一键:基础键为${原id}-copy,若冲突则依次尝试-copy-2-copy-3……(见 App.tsx)。同时副本会被标记addToLive = false,即只创建本地供应商记录,不会自动写入应用的 live 配置,需要你确认后再决定是否为副本启用/加入配置——这避免了复制操作意外改变应用当前指向的服务商。

对于统一供应商,复制逻辑在 UniversalProviderPanel.tsx 的handleDuplicate中:对原供应商做整体deepClone,分配新的crypto.randomUUID()作为 id,名称追加copy后缀,随后依次执行upsert(保存副本)和sync(同步副本到其关联的应用),成功后提示「统一供应商已复制并同步」。这也对应文档中「v3.15.0 起可直接复制统一供应商后再调整同步应用和模型」的说法。

复制按钮的界面渲染位于 ProviderActions.tsx,其title文案来自 i18n 键provider.duplicate(中文为「复制」)。

复制后编辑

复制完成后,通常需要修改:

  1. 名称:改为有意义的名称(默认原名 copy仅适合临时区分)
  2. API Key:如果副本对应不同的账号
  3. 端点:如果副本指向不同的服务

删除供应商

操作步骤

  1. 鼠标悬停在供应商卡片上,显示操作按钮
  2. 点击「删除」按钮(卡片最右侧的垃圾桶图标)
  3. 确认删除

删除确认

删除前会弹出确认对话框,显示:

  • 供应商名称(确认文案由 i18n 键confirm.deleteProviderMessage生成,会代入confirmAction.provider.name
  • 删除后无法恢复的提示

确认消息的构造见 App.tsx 的confirmActionMessage

删除限制

文档给出的两条限制与源码中的启用逻辑一致,ProviderActions.tsx 的canDelete决定了删除按钮何时可点击:

  • 当前启用的供应商:在 Claude 等单选类应用中,正在使用的供应商删除按钮会被禁用(!isCurrent条件);文档建议先切换到其他供应商再删除
  • 统一供应商:删除统一供应商后,其关联的应用配置也会被删除
  • 从源码结构看,还有两类额外约束:Hermes v12+ 管理的只读供应商(isReadOnly)不显示删除能力,需在其 Web UI 中操作;OpenCode / OpenClaw / Hermes 等累加模式应用删除始终可用(其语义是“从配置中移除该供应商”而非删除本地记录)

删除的兜底机制

删除本身通过 useProviderActions.ts 中的deleteProvider(底层为useDeleteProviderMutation)执行。对于复制出的副本,建议遵循“先复制验证、再删原件”的顺序:先复制一份用于备份,确认副本可用后再删除原件,即使误删也有本地配置可恢复。

小结

cc-switch 的供应商列表管理围绕一个核心字段sortIndex展开:拖拽排序通过@dnd-kit收集新顺序后批量持久化,并联动故障转移队列与托盘菜单;复制操作深克隆配置、在原位置下方插入副本、在累加应用中生成唯一键且默认不写入 live 配置;删除操作受当前启用状态与应用类型的双重约束并配有确认对话框。三项操作对应的关键实现可分别在 useDragSort.ts、App.tsx 与 ProviderActions.tsx 中查证。

【免费下载链接】cc-switchA cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io项目地址: https://gitcode.com/GitHub_Trending/cc/cc-switch

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 14:56:00

工具评估清单:验证处理能力的十个硬指标

工具评估清单:验证处理能力的十个硬指标 一份给采购党准备的犀利清单: 「被工具坑过三次之后,我学乖了:看演示没用,听销售吹没用,我只问十个具体问题。比如『验证处理的感知延迟是多少』『失败之后的降级逻…

作者头像 李华
网站建设 2026/9/7 14:55:39

从本地到上线:Python项目Docker化部署实战指南

带了几年项目,我越来越觉得“本地能跑”和“能上线”完全是两码事。Python 写业务逻辑确实快,但一旦要部署给别人用、放到服务器上长期跑,各种环境问题就会接踵而至:Python 版本对不上、系统少了个底层库、依赖装到一半报错、换台…

作者头像 李华
网站建设 2026/9/7 14:51:47

软考中级系统集成项目管理工程师300集精讲:零基础备考全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 14:50:13

免费开源公文排版工具:批量处理与AI内容自动重排

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 14:50:06

屏幕点不亮别急着送修:先查信号链路与硬件接触这两处

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 14:49:11

Webpack核心机制与构建优化:从依赖分析到性能调优

在社区答疑和面试辅导里被问得最多的前端工具,Webpack绝对排前三。不是因为它有多难,而是因为它太底层了——几乎所有现代前端项目都跑在它上面,但大多数人只在报错的时候才想起它。这篇算是我这几年在项目里反复折腾Webpack的一个汇总&#…

作者头像 李华