diff --git a/src/routes/admin.js b/src/routes/admin.js index e6a960b7..7700193b 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -534,8 +534,7 @@ router.post('/api-keys', authenticateAdmin, async (req, res) => { weeklyOpusCostLimit, tags, activationDays, // 新增:激活后有效天数 - expirationMode, // 新增:过期模式 - icon // 新增:图标(base64编码) + expirationMode // 新增:过期模式 } = req.body // 输入验证 @@ -989,8 +988,7 @@ router.put('/api-keys/:keyId', authenticateAdmin, async (req, res) => { dailyCostLimit, weeklyOpusCostLimit, tags, - ownerId, // 新增:所有者ID字段 - icon // 新增:图标(base64编码) + ownerId // 新增:所有者ID字段 } = req.body // 只允许更新指定字段 @@ -1164,19 +1162,6 @@ router.put('/api-keys/:keyId', authenticateAdmin, async (req, res) => { updates.tags = tags } - // 处理图标 - if (icon !== undefined) { - // icon 可以是空字符串(清除图标)或 base64 编码的字符串 - if (icon !== '' && typeof icon !== 'string') { - return res.status(400).json({ error: 'Icon must be a string' }) - } - // 简单验证 base64 格式(如果不为空) - if (icon && !icon.startsWith('data:image/')) { - return res.status(400).json({ error: 'Icon must be a valid base64 image' }) - } - updates.icon = icon - } - // 处理活跃/禁用状态状态, 放在过期处理后,以确保后续增加禁用key功能 if (isActive !== undefined) { if (typeof isActive !== 'boolean') { diff --git a/src/services/apiKeyService.js b/src/services/apiKeyService.js index 4291d51d..637b06ec 100644 --- a/src/services/apiKeyService.js +++ b/src/services/apiKeyService.js @@ -412,8 +412,7 @@ class ApiKeyService { 'tags', 'userId', // 新增:用户ID(所有者变更) 'userUsername', // 新增:用户名(所有者变更) - 'createdBy', // 新增:创建者(所有者变更) - 'icon' // 新增:图标(base64编码) + 'createdBy' // 新增:创建者(所有者变更) ] const updatedData = { ...keyData } diff --git a/web/admin-spa/src/components/apikeys/CreateApiKeyModal.vue b/web/admin-spa/src/components/apikeys/CreateApiKeyModal.vue index 340ac507..4e78520f 100644 --- a/web/admin-spa/src/components/apikeys/CreateApiKeyModal.vue +++ b/web/admin-spa/src/components/apikeys/CreateApiKeyModal.vue @@ -110,9 +110,7 @@ class="mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-2 sm:text-sm" >名称 * -
- - +
{ // 单个创建 const data = { ...baseData, - name: form.name, - icon: form.icon || '' + name: form.name } const result = await apiClient.post('/admin/api-keys', data) @@ -1223,8 +1218,7 @@ const createApiKey = async () => { ...baseData, createType: 'batch', baseName: form.name, - count: form.batchCount, - icon: form.icon || '' + count: form.batchCount } const result = await apiClient.post('/admin/api-keys/batch', data) diff --git a/web/admin-spa/src/components/apikeys/EditApiKeyModal.vue b/web/admin-spa/src/components/apikeys/EditApiKeyModal.vue index 1bada0a5..fda19ade 100644 --- a/web/admin-spa/src/components/apikeys/EditApiKeyModal.vue +++ b/web/admin-spa/src/components/apikeys/EditApiKeyModal.vue @@ -32,9 +32,7 @@ class="mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-3 sm:text-sm" >名称 -
- - +
{ // 表单数据 const form = reactive({ name: '', - icon: '', tokenLimit: '', // 保留用于检测历史数据 rateLimitWindow: '', rateLimitRequests: '', @@ -809,7 +805,6 @@ const updateApiKey = async () => { // 准备提交的数据 const data = { name: form.name, // 添加名称字段 - icon: form.icon || '', // 添加图标字段 tokenLimit: 0, // 清除历史token限制 rateLimitWindow: form.rateLimitWindow !== '' && form.rateLimitWindow !== null @@ -1042,7 +1037,6 @@ onMounted(async () => { } form.name = props.apiKey.name - form.icon = props.apiKey.icon || '' // 处理速率限制迁移:如果有tokenLimit且没有rateLimitCost,提示用户 form.tokenLimit = props.apiKey.tokenLimit || '' diff --git a/web/admin-spa/src/components/common/IconPicker.vue b/web/admin-spa/src/components/common/IconPicker.vue deleted file mode 100644 index d3628591..00000000 --- a/web/admin-spa/src/components/common/IconPicker.vue +++ /dev/null @@ -1,1036 +0,0 @@ - - - - - diff --git a/web/admin-spa/src/views/ApiKeysView.vue b/web/admin-spa/src/views/ApiKeysView.vue index 25e30f3b..b3845b7f 100644 --- a/web/admin-spa/src/views/ApiKeysView.vue +++ b/web/admin-spa/src/views/ApiKeysView.vue @@ -1046,12 +1046,6 @@ :value="key.id" @change="updateSelectAllState" /> - -

{{ key.name }} @@ -1758,7 +1752,6 @@ import { apiClient } from '@/config/api' import { useClientsStore } from '@/stores/clients' import { useAuthStore } from '@/stores/auth' import * as XLSX from 'xlsx-js-style' -import IconPicker from '@/components/common/IconPicker.vue' import CreateApiKeyModal from '@/components/apikeys/CreateApiKeyModal.vue' import EditApiKeyModal from '@/components/apikeys/EditApiKeyModal.vue' import RenewApiKeyModal from '@/components/apikeys/RenewApiKeyModal.vue' @@ -2977,28 +2970,6 @@ const toggleApiKeyStatus = async (key) => { } // 更新API Key图标 -const updateApiKeyIcon = async (keyId, icon) => { - try { - const data = await apiClient.put(`/admin/api-keys/${keyId}`, { - icon: icon - }) - - if (data.success) { - // 更新本地数据 - const localKey = apiKeys.value.find((k) => k.id === keyId) - if (localKey) { - localKey.icon = icon - } - showToast('图标已更新', 'success') - } else { - showToast(data.message || '更新图标失败', 'error') - } - } catch (error) { - console.error('更新图标失败:', error) - showToast('更新图标失败,请重试', 'error') - } -} - // 删除API Key const deleteApiKey = async (keyId) => { let confirmed = false