mirror of
https://github.com/snailyp/gemini-balance.git
synced 2026-09-07 00:36:36 +08:00
feat: 实现API密钥的单独和批量删除功能
本次更新引入了删除API密钥的功能,包括前端界面和后端逻辑。
主要变更:
- **API路由 (`app/router/config_routes.py`):**
- 添加了新的API端点 `/keys/{key_to_delete}` 用于删除单个密钥。
- 添加了新的API端点 `/keys/delete-selected` 用于批量删除选定的密钥。
- 增加了对请求体 `DeleteKeysRequest` 的Pydantic模型定义。
- 在删除操作前进行身份验证。
- **配置服务 (`app/service/config/config_service.py`):**
- 实现了 `delete_key` 方法来处理单个密钥的删除逻辑。
- 实现了 `delete_selected_keys` 方法来处理批量密钥的删除逻辑。
- 确保在删除操作后更新配置。
- **密钥管理器 (`app/service/key/key_manager.py`):**
- 更新了 `remove_key` 方法,以确保从活动密钥列表中正确移除密钥。
- 改进了 `reset_instance` 方法,在重置时保留下一个密钥提示(`_preserved_next_key_in_cycle`),以防止在配置重载后立即丢失轮换状态。
- **前端JavaScript (`app/static/js/keys_status.js`):**
- 添加了 `showSingleKeyDeleteConfirmModal` 函数,用于显示单个密钥删除的确认模态框。
- 添加了 `executeSingleKeyDelete` 函数,用于执行单个密钥的删除请求。
- 添加了 `showDeleteConfirmationModal` 函数,用于显示批量删除密钥的确认模态框。
- 添加了 `executeDeleteSelectedKeys` 函数,用于执行批量删除密钥的请求。
- 更新了UI交互,包括按钮状态(加载中、禁用)和结果通知。
- **HTML模板 (`app/templates/keys_status.html`):**
- 为有效密钥和无效密钥列表中的每个密钥添加了“删除”按钮。
- 为有效密钥和无效密钥列表添加了“批量删除”按钮。
- 添加了用于单个密钥删除和批量删除的确认模态框HTML结构。
- 调整了现有模态框的样式,以提高视觉一致性。
这些更改增强了密钥管理功能,允许用户更灵活地管理其API密钥。
This commit is contained in:
@@ -125,6 +125,78 @@ class ConfigService:
|
||||
|
||||
return await ConfigService.get_config()
|
||||
|
||||
@staticmethod
|
||||
async def delete_key(key_to_delete: str) -> Dict[str, Any]:
|
||||
"""删除单个API密钥"""
|
||||
# 确保 settings.API_KEYS 是一个列表
|
||||
if not isinstance(settings.API_KEYS, list):
|
||||
settings.API_KEYS = []
|
||||
|
||||
original_keys_count = len(settings.API_KEYS)
|
||||
# 创建一个不包含待删除密钥的新列表
|
||||
updated_api_keys = [k for k in settings.API_KEYS if k != key_to_delete]
|
||||
|
||||
if len(updated_api_keys) < original_keys_count:
|
||||
# 密钥已找到并从列表中移除
|
||||
settings.API_KEYS = updated_api_keys # 首先更新内存中的 settings
|
||||
# 使用 update_config 持久化更改,它同时处理数据库和 KeyManager
|
||||
await ConfigService.update_config({"API_KEYS": settings.API_KEYS})
|
||||
logger.info(f"密钥 '{key_to_delete}' 已成功删除。")
|
||||
return {"success": True, "message": f"密钥 '{key_to_delete}' 已成功删除。"}
|
||||
else:
|
||||
# 未找到密钥
|
||||
logger.warning(f"尝试删除密钥 '{key_to_delete}',但未找到该密钥。")
|
||||
return {"success": False, "message": f"未找到密钥 '{key_to_delete}'。"}
|
||||
|
||||
@staticmethod
|
||||
async def delete_selected_keys(keys_to_delete: List[str]) -> Dict[str, Any]:
|
||||
"""批量删除选定的API密钥"""
|
||||
if not isinstance(settings.API_KEYS, list):
|
||||
settings.API_KEYS = []
|
||||
|
||||
deleted_count = 0
|
||||
not_found_keys: List[str] = []
|
||||
|
||||
current_api_keys = list(settings.API_KEYS) # 创建副本以进行修改
|
||||
keys_actually_removed: List[str] = []
|
||||
|
||||
for key_to_del in keys_to_delete:
|
||||
if key_to_del in current_api_keys:
|
||||
current_api_keys.remove(key_to_del)
|
||||
keys_actually_removed.append(key_to_del)
|
||||
deleted_count += 1
|
||||
else:
|
||||
not_found_keys.append(key_to_del)
|
||||
|
||||
if deleted_count > 0:
|
||||
settings.API_KEYS = current_api_keys # 更新内存中的 settings
|
||||
await ConfigService.update_config({"API_KEYS": settings.API_KEYS})
|
||||
logger.info(
|
||||
f"成功删除 {deleted_count} 个密钥。密钥: {keys_actually_removed}"
|
||||
)
|
||||
message = f"成功删除 {deleted_count} 个密钥。"
|
||||
if not_found_keys:
|
||||
message += f" {len(not_found_keys)} 个密钥未找到: {not_found_keys}。"
|
||||
return {
|
||||
"success": True,
|
||||
"message": message,
|
||||
"deleted_count": deleted_count,
|
||||
"not_found_keys": not_found_keys,
|
||||
}
|
||||
else:
|
||||
message = "没有密钥被删除。"
|
||||
if not_found_keys: # 如果提供了密钥但都未找到
|
||||
message = f"所有 {len(not_found_keys)} 个指定的密钥均未找到: {not_found_keys}。"
|
||||
elif not keys_to_delete: # 如果 keys_to_delete 列表为空
|
||||
message = "未指定要删除的密钥。"
|
||||
logger.warning(message)
|
||||
return {
|
||||
"success": False,
|
||||
"message": message,
|
||||
"deleted_count": 0,
|
||||
"not_found_keys": not_found_keys,
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
async def reset_config() -> Dict[str, Any]:
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user