fix: 修复删除模型/交易所时界面卡死问题并增强依赖检查 (#578)

* fix: 修复删除模型/交易所时界面卡死问题并增强依赖检查

## 问题描述
1. 删除唯一的AI模型或交易所配置时,界面会卡死数秒
2. 删除后配置仍然显示在列表中
3. 可以删除被交易员使用的配置,导致数据不一致

## 修复内容

### 后端性能优化 (manager/trader_manager.go)
- 将循环内的重复数据库查询移到循环外
- 减少N次重复查询(GetAIModels + GetExchanges)为1次查询
- 大幅减少锁持有时间,从数秒降至毫秒级

### 前端显示修复 (web/src/components/AITradersPage.tsx)
- 过滤显示列表,只显示真正配置过的模型/交易所(有apiKey的)
- 删除后重新从后端获取最新数据,确保界面同步

### 前端依赖检查 (web/src/components/AITradersPage.tsx)
- 新增完整的依赖检查,包括停止状态的交易员
- 删除前检查是否有交易员使用该配置
- 显示使用该配置的交易员名称列表
- 阻止删除被使用的配置,保证数据一致性

### 多语言支持 (web/src/i18n/translations.ts)
- 添加依赖检查相关的中英文提示文本
- cannotDeleteModelInUse / cannotDeleteExchangeInUse
- tradersUsing / pleaseDeleteTradersFirst

## 测试建议
1. 创建交易员后尝试删除其使用的模型/交易所,应显示警告并阻止删除
2. 删除未使用的模型/交易所,应立即从列表消失且界面不卡死
3. 刷新页面后,已删除的配置不应再出现

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: tinkle-community <tinklefund@gmail.com>

* refactor: 重构删除配置函数减少重复代码

## 重构内容
- 创建通用的 handleDeleteConfig 函数
- 使用配置对象模式处理模型和交易所的删除逻辑
- 消除 handleDeleteModelConfig 和 handleDeleteExchangeConfig 之间的重复代码

## 重构效果
- 减少代码行数约 40%
- 提高代码可维护性和可读性
- 便于未来添加新的配置类型

## 功能保持不变
- 依赖检查逻辑完全相同
- 删除流程完全相同
- 用户体验完全相同

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: tinkle-community <tinklefund@gmail.com>

---------

Co-authored-by: tinkle-community <tinklefund@gmail.com>
This commit is contained in:
Diego
2025-11-06 10:32:30 +08:00
committed by GitHub
parent a2eb03ede9
commit 2f75b4b98d
3 changed files with 172 additions and 70 deletions

View File

@@ -265,6 +265,11 @@ export const translations = {
addAIModel: 'Add AI Model',
confirmDeleteModel:
'Are you sure you want to delete this AI model configuration?',
cannotDeleteModelInUse:
'Cannot delete this AI model because it is being used by traders',
tradersUsing: 'Traders using this configuration',
pleaseDeleteTradersFirst:
'Please delete or reconfigure these traders first',
selectModel: 'Select AI Model',
pleaseSelectModel: 'Please select a model',
customBaseURL: 'Base URL (Optional)',
@@ -281,6 +286,8 @@ export const translations = {
addExchange: 'Add Exchange',
confirmDeleteExchange:
'Are you sure you want to delete this exchange configuration?',
cannotDeleteExchangeInUse:
'Cannot delete this exchange because it is being used by traders',
pleaseSelectExchange: 'Please select an exchange',
exchangeConfigWarning1:
'• API keys will be encrypted, recommend using read-only or futures trading permissions',
@@ -929,6 +936,9 @@ export const translations = {
editAIModel: '编辑AI模型',
addAIModel: '添加AI模型',
confirmDeleteModel: '确定要删除此AI模型配置吗',
cannotDeleteModelInUse: '无法删除此AI模型因为有交易员正在使用',
tradersUsing: '正在使用此配置的交易员',
pleaseDeleteTradersFirst: '请先删除或重新配置这些交易员',
selectModel: '选择AI模型',
pleaseSelectModel: '请选择模型',
customBaseURL: 'Base URL (可选)',
@@ -941,6 +951,7 @@ export const translations = {
editExchange: '编辑交易所',
addExchange: '添加交易所',
confirmDeleteExchange: '确定要删除此交易所配置吗?',
cannotDeleteExchangeInUse: '无法删除此交易所,因为有交易员正在使用',
pleaseSelectExchange: '请选择交易所',
exchangeConfigWarning1: '• API密钥将被加密存储建议使用只读或期货交易权限',
exchangeConfigWarning2: '• 不要授予提现权限,确保资金安全',