ignoreContextCanceledHint:'When enabled, client disconnect (context canceled) errors will not be written to the error log.',
ignoreNoAvailableAccounts:'Ignore no available accounts errors',
ignoreNoAvailableAccountsHint:'When enabled, "No available accounts" errors will not be written to the error log (not recommended; usually a config issue).',
autoRefresh:'Auto Refresh',
enableAutoRefresh:'Enable auto refresh',
enableAutoRefreshHint:'Automatically refresh dashboard data at a fixed interval.',
refreshInterval:'Refresh Interval',
refreshInterval15s:'15 seconds',
refreshInterval30s:'30 seconds',
refreshInterval60s:'60 seconds',
autoRefreshCountdown:'Auto refresh: {seconds}s',
validation:{
title:'Please fix the following issues',
retentionDaysRange:'Retention days must be between 1-365 days'
retentionDaysRange:'Retention days must be between 1-365 days',
slaMinPercentRange:'SLA minimum percentage must be between 0 and 100',
ttftP99MaxRange:'TTFT P99 maximum must be a number ≥ 0',
requestErrorRateMaxRange:'Request error rate maximum must be between 0 and 100',
upstreamErrorRateMaxRange:'Upstream error rate maximum must be between 0 and 100'
}
},
concurrency:{
...
...
@@ -2394,7 +2573,7 @@ export default {
tooltips:{
totalRequests:'Total number of requests (including both successful and failed requests) in the selected time window.',
throughputTrend:'Requests/QPS + Tokens/TPS in the selected window.',
latencyHistogram:'Latency distribution (duration_ms) for successful requests.',
latencyHistogram:'Request duration distribution (ms) for successful requests.',
errorTrend:'Error counts over time (SLA scope excludes business limits; upstream excludes 429/529).',
errorDistribution:'Error distribution by status code.',
consthandleBulkDelete=async()=>{if(!confirm(t('common.confirm')))return;try{awaitPromise.all(selIds.value.map(id=>adminAPI.accounts.delete(id)));selIds.value=[];reload()}catch(error){console.error('Failed to bulk delete accounts:',error)}}
onMounted(async()=>{load();try{const[p,g]=awaitPromise.all([adminAPI.proxies.getAll(),adminAPI.groups.getAll()]);proxies.value=p;groups.value=g}catch(error){console.error('Failed to load proxies/groups:',error)}})
// 滚动时关闭菜单
consthandleScroll=()=>{
menu.show=false
}
onMounted(async()=>{load();try{const[p,g]=awaitPromise.all([adminAPI.proxies.getAll(),adminAPI.groups.getAll()]);proxies.value=p;groups.value=g}catch(error){console.error('Failed to load proxies/groups:',error)};window.addEventListener('scroll',handleScroll,true)})