mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 19:57:20 +00:00
Revert "Merge pull request #424 from Wangnov/feat/i18n"
This reverts commit1d915d8327, reversing changes made to009f7c84f6.
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref } from 'vue'
|
||||
import { apiClient } from '@/config/api'
|
||||
import i18n from '@/i18n'
|
||||
|
||||
export const useAccountsStore = defineStore('accounts', () => {
|
||||
// 状态
|
||||
@@ -28,7 +27,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
claudeAccounts.value = response.data || []
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.loadAccountsFailed'))
|
||||
throw new Error(response.message || '获取Claude账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -47,7 +46,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
claudeConsoleAccounts.value = response.data || []
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.loadAccountsFailed'))
|
||||
throw new Error(response.message || '获取Claude Console账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -66,7 +65,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
bedrockAccounts.value = response.data || []
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.loadAccountsFailed'))
|
||||
throw new Error(response.message || '获取Bedrock账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -85,7 +84,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
geminiAccounts.value = response.data || []
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.loadAccountsFailed'))
|
||||
throw new Error(response.message || '获取Gemini账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -104,7 +103,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
openaiAccounts.value = response.data || []
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.loadAccountsFailed'))
|
||||
throw new Error(response.message || '获取OpenAI账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -123,7 +122,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
azureOpenaiAccounts.value = response.data || []
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.loadAccountsFailed'))
|
||||
throw new Error(response.message || '获取Azure OpenAI账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -184,7 +183,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchClaudeAccounts()
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '创建Claude账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -204,9 +203,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchClaudeConsoleAccounts()
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(
|
||||
response.message || i18n.global.t('common.errors.createClaudeConsoleAccountFailed')
|
||||
)
|
||||
throw new Error(response.message || '创建Claude Console账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -226,7 +223,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchBedrockAccounts()
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '创建Bedrock账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -246,7 +243,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchGeminiAccounts()
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '创建Gemini账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -266,7 +263,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchOpenAIAccounts()
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '创建OpenAI账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -286,9 +283,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchAzureOpenAIAccounts()
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(
|
||||
response.message || i18n.global.t('common.errors.createAzureOpenAIAccountFailed')
|
||||
)
|
||||
throw new Error(response.message || '创建Azure OpenAI账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -328,7 +323,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchClaudeAccounts()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '更新Claude账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -348,9 +343,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchClaudeConsoleAccounts()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(
|
||||
response.message || i18n.global.t('common.errors.updateClaudeConsoleAccountFailed')
|
||||
)
|
||||
throw new Error(response.message || '更新Claude Console账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -370,7 +363,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchBedrockAccounts()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '更新Bedrock账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -390,7 +383,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchGeminiAccounts()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '更新Gemini账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -410,7 +403,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchOpenAIAccounts()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '更新OpenAI账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -430,9 +423,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchAzureOpenAIAccounts()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(
|
||||
response.message || i18n.global.t('common.errors.updateAzureOpenAIAccountFailed')
|
||||
)
|
||||
throw new Error(response.message || '更新Azure OpenAI账户失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -507,7 +498,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
}
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.schedulingToggleFailed'))
|
||||
throw new Error(response.message || '切换状态失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -562,7 +553,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
}
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.deleteFailed'))
|
||||
throw new Error(response.message || '删除失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -582,7 +573,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
await fetchClaudeAccounts()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || 'Token刷新失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -599,7 +590,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
return response.data // 返回整个对象,包含authUrl和sessionId
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '生成授权URL失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -614,7 +605,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '交换授权码失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -632,9 +623,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
return response.data // 返回整个对象,包含authUrl和sessionId
|
||||
} else {
|
||||
throw new Error(
|
||||
response.message || i18n.global.t('common.errors.generateSetupTokenUrlFailed')
|
||||
)
|
||||
throw new Error(response.message || '生成Setup Token URL失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -652,7 +641,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('common.errors.exchangeSetupTokenFailed'))
|
||||
throw new Error(response.message || '交换Setup Token授权码失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -667,7 +656,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
return response.data // 返回整个对象,包含authUrl和sessionId
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '生成授权URL失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -682,7 +671,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '交换授权码失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -697,7 +686,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
return response.data // 返回整个对象,包含authUrl和sessionId
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '生成授权URL失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -712,7 +701,7 @@ export const useAccountsStore = defineStore('accounts', () => {
|
||||
if (response.success) {
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('accounts.operationFailed'))
|
||||
throw new Error(response.message || '交换授权码失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { apiClient } from '@/config/api'
|
||||
import i18n from '@/i18n'
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref } from 'vue'
|
||||
|
||||
@@ -23,7 +22,7 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
|
||||
if (response.success) {
|
||||
apiKeys.value = response.data || []
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('apiKeys.loadFailed'))
|
||||
throw new Error(response.message || '获取API Keys失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -43,7 +42,7 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
|
||||
await fetchApiKeys()
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('apiKeys.operationFailed'))
|
||||
throw new Error(response.message || '创建API Key失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -63,7 +62,7 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
|
||||
await fetchApiKeys()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('apiKeys.updateFailed'))
|
||||
throw new Error(response.message || '更新API Key失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -83,7 +82,7 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
|
||||
await fetchApiKeys()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('apiKeys.operationFailed'))
|
||||
throw new Error(response.message || '切换状态失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -103,7 +102,7 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
|
||||
await fetchApiKeys()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('apiKeys.operationFailed'))
|
||||
throw new Error(response.message || '续期失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -123,7 +122,7 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
|
||||
await fetchApiKeys()
|
||||
return response
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('apiKeys.deleteFailed'))
|
||||
throw new Error(response.message || '删除失败')
|
||||
}
|
||||
} catch (err) {
|
||||
error.value = err.message
|
||||
@@ -142,10 +141,10 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
|
||||
if (response.success) {
|
||||
return response.stats
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('apiKeys.operationFailed'))
|
||||
throw new Error(response.message || '获取统计失败')
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(i18n.global.t('common.errors.getApiKeyStatsFailed'), err)
|
||||
console.error('获取API Key统计失败:', err)
|
||||
return null
|
||||
}
|
||||
}
|
||||
@@ -167,10 +166,10 @@ export const useApiKeysStore = defineStore('apiKeys', () => {
|
||||
if (response.success) {
|
||||
return response.data || []
|
||||
} else {
|
||||
throw new Error(response.message || i18n.global.t('apiKeys.operationFailed'))
|
||||
throw new Error(response.message || '获取标签失败')
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(i18n.global.t('common.errors.getTagsFailed'), err)
|
||||
console.error('获取标签失败:', err)
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, computed } from 'vue'
|
||||
import { apiStatsClient } from '@/config/apiStats'
|
||||
import i18n from '@/i18n'
|
||||
|
||||
export const useApiStatsStore = defineStore('apistats', () => {
|
||||
// 状态
|
||||
@@ -94,7 +93,7 @@ export const useApiStatsStore = defineStore('apistats', () => {
|
||||
}
|
||||
|
||||
if (!apiKey.value.trim()) {
|
||||
error.value = i18n.global.t('apiStats.enterApiKey')
|
||||
error.value = '请输入 API Key'
|
||||
return
|
||||
}
|
||||
|
||||
@@ -126,18 +125,14 @@ export const useApiStatsStore = defineStore('apistats', () => {
|
||||
// 更新 URL
|
||||
updateURL()
|
||||
} else {
|
||||
throw new Error(
|
||||
statsResult.message || i18n.global.t('common.errors.requestFailed', { status: 500 })
|
||||
)
|
||||
throw new Error(statsResult.message || '查询失败')
|
||||
}
|
||||
} else {
|
||||
throw new Error(
|
||||
idResult.message || i18n.global.t('common.errors.requestFailed', { status: 500 })
|
||||
)
|
||||
throw new Error(idResult.message || '获取 API Key ID 失败')
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Query stats error:', err)
|
||||
error.value = err.message || i18n.global.t('apiStats.errors.queryStatsFailed')
|
||||
error.value = err.message || '查询统计数据失败,请检查您的 API Key 是否正确'
|
||||
statsData.value = null
|
||||
modelStats.value = []
|
||||
apiId.value = null
|
||||
@@ -214,7 +209,7 @@ export const useApiStatsStore = defineStore('apistats', () => {
|
||||
if (result.success) {
|
||||
modelStats.value = result.data || []
|
||||
} else {
|
||||
throw new Error(result.message || i18n.global.t('apiStats.errors.loadModelStatsFailed'))
|
||||
throw new Error(result.message || '加载模型统计失败')
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Load model stats error:', err)
|
||||
@@ -271,13 +266,11 @@ export const useApiStatsStore = defineStore('apistats', () => {
|
||||
// 清除错误信息
|
||||
error.value = ''
|
||||
} else {
|
||||
throw new Error(
|
||||
result.message || i18n.global.t('common.errors.requestFailed', { status: 500 })
|
||||
)
|
||||
throw new Error(result.message || '查询失败')
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Load stats with apiId error:', err)
|
||||
error.value = err.message || i18n.global.t('apiStats.errors.queryStatsFailed')
|
||||
error.value = err.message || '查询统计数据失败'
|
||||
statsData.value = null
|
||||
modelStats.value = []
|
||||
} finally {
|
||||
@@ -337,7 +330,7 @@ export const useApiStatsStore = defineStore('apistats', () => {
|
||||
async function queryBatchStats() {
|
||||
const keys = parseApiKeys()
|
||||
if (keys.length === 0) {
|
||||
error.value = i18n.global.t('apiStats.errors.enterAtLeastOneKey')
|
||||
error.value = '请输入至少一个有效的 API Key'
|
||||
return
|
||||
}
|
||||
|
||||
@@ -367,7 +360,7 @@ export const useApiStatsStore = defineStore('apistats', () => {
|
||||
})
|
||||
|
||||
if (validIds.length === 0) {
|
||||
throw new Error(i18n.global.t('common.errors.allApiKeysInvalid'))
|
||||
throw new Error('所有 API Key 都无效')
|
||||
}
|
||||
|
||||
apiIds.value = validIds
|
||||
@@ -391,11 +384,11 @@ export const useApiStatsStore = defineStore('apistats', () => {
|
||||
// 更新 URL
|
||||
updateBatchURL()
|
||||
} else {
|
||||
throw new Error(batchResult.message || i18n.global.t('apiStats.errors.batchQueryFailed'))
|
||||
throw new Error(batchResult.message || '批量查询失败')
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Batch query error:', err)
|
||||
error.value = err.message || i18n.global.t('apiStats.errors.batchQueryFailed')
|
||||
error.value = err.message || '批量查询统计数据失败'
|
||||
aggregatedStats.value = null
|
||||
individualStats.value = []
|
||||
} finally {
|
||||
@@ -415,7 +408,7 @@ export const useApiStatsStore = defineStore('apistats', () => {
|
||||
if (result.success) {
|
||||
modelStats.value = result.data || []
|
||||
} else {
|
||||
throw new Error(result.message || i18n.global.t('apiStats.errors.batchModelStatsFailed'))
|
||||
throw new Error(result.message || '加载批量模型统计失败')
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Load batch model stats error:', err)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, computed } from 'vue'
|
||||
import router from '@/router'
|
||||
import i18n from '@/i18n'
|
||||
import { apiClient } from '@/config/api'
|
||||
|
||||
export const useAuthStore = defineStore('auth', () => {
|
||||
@@ -40,10 +39,10 @@ export const useAuthStore = defineStore('auth', () => {
|
||||
|
||||
await router.push('/dashboard')
|
||||
} else {
|
||||
loginError.value = result.message || i18n.global.t('login.loginFailed')
|
||||
loginError.value = result.message || '登录失败'
|
||||
}
|
||||
} catch (error) {
|
||||
loginError.value = error.message || i18n.global.t('login.loginFailedCheck')
|
||||
loginError.value = error.message || '登录失败,请检查用户名和密码'
|
||||
} finally {
|
||||
loginLoading.value = false
|
||||
}
|
||||
@@ -103,11 +102,11 @@ export const useAuthStore = defineStore('auth', () => {
|
||||
|
||||
// 设置页面标题
|
||||
if (result.data.siteName) {
|
||||
document.title = `${result.data.siteName} - ${i18n.global.t('header.adminPanel')}`
|
||||
document.title = `${result.data.siteName} - 管理后台`
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(i18n.global.t('common.errors.loadOemSettingsFailed'), error)
|
||||
console.error('加载OEM设置失败:', error)
|
||||
} finally {
|
||||
oemLoading.value = false
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { apiClient } from '@/config/api'
|
||||
import i18n from '@/i18n'
|
||||
|
||||
export const useClientsStore = defineStore('clients', {
|
||||
state: () => ({
|
||||
@@ -25,13 +24,13 @@ export const useClientsStore = defineStore('clients', {
|
||||
if (response.success) {
|
||||
this.supportedClients = response.data || []
|
||||
} else {
|
||||
this.error = response.message || i18n.global.t('common.errors.loadSupportedClientsFailed')
|
||||
this.error = response.message || '加载支持的客户端失败'
|
||||
console.error('Failed to load supported clients:', this.error)
|
||||
}
|
||||
|
||||
return this.supportedClients
|
||||
} catch (error) {
|
||||
this.error = error.message || i18n.global.t('common.errors.loadSupportedClientsFailed')
|
||||
this.error = error.message || '加载支持的客户端失败'
|
||||
console.error('Error loading supported clients:', error)
|
||||
return []
|
||||
} finally {
|
||||
|
||||
@@ -2,7 +2,6 @@ import { defineStore } from 'pinia'
|
||||
import { ref, computed } from 'vue'
|
||||
import { apiClient } from '@/config/api'
|
||||
import { showToast } from '@/utils/toast'
|
||||
import i18n from '@/i18n'
|
||||
|
||||
export const useDashboardStore = defineStore('dashboard', () => {
|
||||
// 状态
|
||||
@@ -42,7 +41,7 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
realtimeTPM: 0,
|
||||
metricsWindow: 5,
|
||||
isHistoricalMetrics: false,
|
||||
systemStatus: i18n.global.t('system.status.normal'),
|
||||
systemStatus: '正常',
|
||||
uptime: 0,
|
||||
systemTimezone: 8 // 默认 UTC+8
|
||||
})
|
||||
@@ -69,9 +68,9 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
customEnd: '',
|
||||
customRange: null,
|
||||
presetOptions: [
|
||||
{ value: 'today', label: i18n.global.t('dashboard.today'), days: 1 },
|
||||
{ value: '7days', label: i18n.global.t('dashboard.last7Days'), days: 7 },
|
||||
{ value: '30days', label: i18n.global.t('dashboard.last30Days'), days: 30 }
|
||||
{ value: 'today', label: '今日', days: 1 },
|
||||
{ value: '7days', label: '7天', days: 7 },
|
||||
{ value: '30days', label: '30天', days: 30 }
|
||||
]
|
||||
})
|
||||
|
||||
@@ -90,11 +89,11 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
const minutes = Math.floor((seconds % 3600) / 60)
|
||||
|
||||
if (days > 0) {
|
||||
return i18n.global.t('dashboard.uptimeFormat.daysHours', { days, hours })
|
||||
return `${days}天 ${hours}小时`
|
||||
} else if (hours > 0) {
|
||||
return i18n.global.t('dashboard.uptimeFormat.hoursMinutes', { hours, minutes })
|
||||
return `${hours}小时 ${minutes}分钟`
|
||||
} else {
|
||||
return i18n.global.t('dashboard.uptimeFormat.minutes', { minutes })
|
||||
return `${minutes}分钟`
|
||||
}
|
||||
})
|
||||
|
||||
@@ -199,9 +198,7 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
realtimeTPM: realtimeMetrics.tpm || 0,
|
||||
metricsWindow: realtimeMetrics.windowMinutes || 5,
|
||||
isHistoricalMetrics: realtimeMetrics.isHistorical || false,
|
||||
systemStatus: systemHealth.redisConnected
|
||||
? i18n.global.t('system.status.normal')
|
||||
: i18n.global.t('system.status.abnormal'),
|
||||
systemStatus: systemHealth.redisConnected ? '正常' : '异常',
|
||||
uptime: systemHealth.uptime || 0,
|
||||
systemTimezone: dashboardResponse.data.systemTimezone || 8
|
||||
}
|
||||
@@ -221,7 +218,7 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(i18n.global.t('common.errors.loadDashboardFailed'), error)
|
||||
console.error('加载仪表板数据失败:', error)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
@@ -309,7 +306,7 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
trendData.value = response.data
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(i18n.global.t('common.errors.loadUsageTrendFailed'), error)
|
||||
console.error('加载使用趋势失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -400,7 +397,7 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
dashboardModelStats.value = response.data
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(i18n.global.t('common.errors.loadModelStatsFailed'), error)
|
||||
console.error('加载模型统计失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -502,7 +499,7 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(i18n.global.t('common.errors.loadApiKeysTrendFailed'), error)
|
||||
console.error('加载API Keys趋势失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -639,14 +636,14 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
// 小时粒度:限制 24 小时
|
||||
const hoursDiff = (end - start) / (1000 * 60 * 60)
|
||||
if (hoursDiff > 24) {
|
||||
showToast(i18n.global.t('dashboard.errors.rangeTooLongHour'), 'warning')
|
||||
showToast('小时粒度下日期范围不能超过24小时', 'warning')
|
||||
return
|
||||
}
|
||||
} else {
|
||||
// 天粒度:限制 31 天
|
||||
const daysDiff = Math.ceil((end - start) / (1000 * 60 * 60 * 24)) + 1
|
||||
if (daysDiff > 31) {
|
||||
showToast(i18n.global.t('dashboard.errors.rangeTooLongDay'), 'warning')
|
||||
showToast('日期范围不能超过 31 天', 'warning')
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -665,13 +662,9 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
// 根据粒度更新预设选项
|
||||
if (granularity === 'hour') {
|
||||
dateFilter.value.presetOptions = [
|
||||
{
|
||||
value: 'last24h',
|
||||
label: i18n.global.t('dashboard.usageTrend.periodOptions.last24Hours'),
|
||||
hours: 24
|
||||
},
|
||||
{ value: 'yesterday', label: i18n.global.t('dashboard.yesterday'), hours: 24 },
|
||||
{ value: 'dayBefore', label: i18n.global.t('dashboard.dayBefore'), hours: 24 }
|
||||
{ value: 'last24h', label: '近24小时', hours: 24 },
|
||||
{ value: 'yesterday', label: '昨天', hours: 24 },
|
||||
{ value: 'dayBefore', label: '前天', hours: 24 }
|
||||
]
|
||||
|
||||
// 检查当前自定义日期范围是否超过24小时
|
||||
@@ -684,7 +677,7 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
const end = new Date(dateFilter.value.customRange[1])
|
||||
const hoursDiff = (end - start) / (1000 * 60 * 60)
|
||||
if (hoursDiff > 24) {
|
||||
showToast(i18n.global.t('dashboard.errors.rangeTooLongHourSwitched'), 'warning')
|
||||
showToast('小时粒度下日期范围不能超过24小时,已切换到近24小时', 'warning')
|
||||
setDateFilterPreset('last24h')
|
||||
return
|
||||
}
|
||||
@@ -698,9 +691,9 @@ export const useDashboardStore = defineStore('dashboard', () => {
|
||||
} else {
|
||||
// 天粒度
|
||||
dateFilter.value.presetOptions = [
|
||||
{ value: 'today', label: i18n.global.t('dashboard.today'), days: 1 },
|
||||
{ value: '7days', label: i18n.global.t('dashboard.last7Days'), days: 7 },
|
||||
{ value: '30days', label: i18n.global.t('dashboard.last30Days'), days: 30 }
|
||||
{ value: 'today', label: '今日', days: 1 },
|
||||
{ value: '7days', label: '7天', days: 7 },
|
||||
{ value: '30days', label: '30天', days: 30 }
|
||||
]
|
||||
|
||||
// 如果当前是小时粒度的预设,切换到天粒度的默认预设
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref } from 'vue'
|
||||
import { i18n, SUPPORTED_LOCALES, getSupportedLocalesWithI18n } from '@/i18n'
|
||||
|
||||
export const useLocaleStore = defineStore('locale', () => {
|
||||
const currentLocale = ref(i18n.global.locale.value)
|
||||
|
||||
// 切换语言
|
||||
const setLocale = (locale) => {
|
||||
if (!SUPPORTED_LOCALES[locale]) {
|
||||
console.warn(`Unsupported locale: ${locale}`)
|
||||
return
|
||||
}
|
||||
|
||||
currentLocale.value = locale
|
||||
i18n.global.locale.value = locale
|
||||
localStorage.setItem('app-locale', locale)
|
||||
|
||||
// 更新HTML lang属性
|
||||
document.documentElement.setAttribute('lang', locale)
|
||||
}
|
||||
|
||||
// 获取当前语言信息(兼容i18n)
|
||||
const getCurrentLocaleInfo = (t = null) => {
|
||||
if (t) {
|
||||
const supportedLocales = getSupportedLocalesWithI18n(t)
|
||||
return supportedLocales[currentLocale.value] || supportedLocales['zh-cn']
|
||||
}
|
||||
return SUPPORTED_LOCALES[currentLocale.value] || SUPPORTED_LOCALES['zh-cn']
|
||||
}
|
||||
|
||||
// 获取所有支持的语言(兼容i18n)
|
||||
const getSupportedLocales = (t = null) => {
|
||||
const supportedLocales = t ? getSupportedLocalesWithI18n(t) : SUPPORTED_LOCALES
|
||||
return Object.entries(supportedLocales).map(([key, value]) => ({
|
||||
code: key,
|
||||
...value
|
||||
}))
|
||||
}
|
||||
|
||||
return {
|
||||
currentLocale,
|
||||
setLocale,
|
||||
getCurrentLocaleInfo,
|
||||
getSupportedLocales
|
||||
}
|
||||
})
|
||||
@@ -1,7 +1,6 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref } from 'vue'
|
||||
import { apiClient } from '@/config/api'
|
||||
import i18n from '@/i18n'
|
||||
|
||||
export const useSettingsStore = defineStore('settings', () => {
|
||||
// 状态
|
||||
@@ -78,7 +77,7 @@ export const useSettingsStore = defineStore('settings', () => {
|
||||
const applyOemSettings = () => {
|
||||
// 更新页面标题
|
||||
if (oemSettings.value.siteName) {
|
||||
document.title = `${oemSettings.value.siteName} - ${i18n.global.t('header.adminPanel')}`
|
||||
document.title = `${oemSettings.value.siteName} - 管理后台`
|
||||
}
|
||||
|
||||
// 更新favicon
|
||||
@@ -95,9 +94,7 @@ export const useSettingsStore = defineStore('settings', () => {
|
||||
// 格式化日期时间
|
||||
const formatDateTime = (dateString) => {
|
||||
if (!dateString) return ''
|
||||
const localeMap = { 'zh-cn': 'zh-CN', 'zh-tw': 'zh-TW', en: 'en-US' }
|
||||
const currentLocale = localeMap[i18n.global.locale.value] || 'en-US'
|
||||
return new Date(dateString).toLocaleString(currentLocale, {
|
||||
return new Date(dateString).toLocaleString('zh-CN', {
|
||||
year: 'numeric',
|
||||
month: '2-digit',
|
||||
day: '2-digit',
|
||||
@@ -113,13 +110,13 @@ export const useSettingsStore = defineStore('settings', () => {
|
||||
|
||||
// 检查文件大小 (350KB)
|
||||
if (file.size > 350 * 1024) {
|
||||
errors.push(i18n.global.t('settings.validation.iconTooLarge'))
|
||||
errors.push('图标文件大小不能超过 350KB')
|
||||
}
|
||||
|
||||
// 检查文件类型
|
||||
const allowedTypes = ['image/x-icon', 'image/png', 'image/jpeg', 'image/jpg', 'image/svg+xml']
|
||||
if (!allowedTypes.includes(file.type)) {
|
||||
errors.push(i18n.global.t('settings.validation.iconTypeNotSupported'))
|
||||
errors.push('不支持的文件类型,请选择 .ico, .png, .jpg 或 .svg 文件')
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import axios from 'axios'
|
||||
import i18n from '@/i18n'
|
||||
import { showToast } from '@/utils/toast'
|
||||
|
||||
const API_BASE = '/users'
|
||||
@@ -41,7 +40,7 @@ export const useUserStore = defineStore('user', {
|
||||
|
||||
return response.data
|
||||
} else {
|
||||
throw new Error(response.data.message || i18n.global.t('user.login.loginFailed'))
|
||||
throw new Error(response.data.message || 'Login failed')
|
||||
}
|
||||
} catch (error) {
|
||||
this.clearAuth()
|
||||
@@ -116,9 +115,7 @@ export const useUserStore = defineStore('user', {
|
||||
this.clearAuth()
|
||||
// If it's a disabled account error, throw a specific error
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error(
|
||||
error.response.data?.message || i18n.global.t('user.login.accountDisabled')
|
||||
)
|
||||
throw new Error(error.response.data?.message || 'Your account has been disabled')
|
||||
}
|
||||
}
|
||||
throw error
|
||||
|
||||
Reference in New Issue
Block a user