Files
claude-relay-service/web/admin-spa/dist/assets/ApiStatsView-G_xX3WMi.js
2026-01-22 07:19:11 +00:00

7 lines
61 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{aP as pt,r as M,c as j,aX as et,x as n,y as l,z as t,O as b,L as K,P as r,u as e,C as P,K as ut,aq as ct,aa as mt,f as gt,Y as vt,Q as Z,ac as tt,B as lt,R as X,o as ft,V as yt,I as ot,a5 as bt,q as kt,aW as ht,J as xt,av as _t}from"./vue-vendor-R8HMg95E.js";import{_ as st,A as wt,a as $t}from"./index-B3t2NHq9.js";import{L as St}from"./LogoTitle-CNwD90nW.js";import{T as Ct}from"./ThemeToggle-DRoGUDeP.js";import{b as Tt}from"./vendor-Dr8jvgFu.js";import{_ as Kt}from"./WindowCountdown-DF7xS2EZ.js";import At from"./TutorialView-DeQdS06L.js";import"./element-plus-BUfCkBQO.js";class Lt{constructor(){this.baseURL=window.location.origin,this.isDev=!1}async request(v,s={}){try{this.isDev&&v.startsWith("/admin")&&(v="/webapi"+v);const p=await fetch(`${this.baseURL}${v}`,{headers:{"Content-Type":"application/json",...s.headers},...s}),d=await p.json();if(!p.ok)throw new Error(d.message||`请求失败: ${p.status}`);return d}catch(p){throw console.error("API Stats request error:",p),p}}async getKeyId(v){return this.request("/apiStats/api/get-key-id",{method:"POST",body:JSON.stringify({apiKey:v})})}async getUserStats(v){return this.request("/apiStats/api/user-stats",{method:"POST",body:JSON.stringify({apiId:v})})}async getUserModelStats(v,s="daily"){return this.request("/apiStats/api/user-model-stats",{method:"POST",body:JSON.stringify({apiId:v,period:s})})}async getOemSettings(){try{return await this.request("/admin/oem-settings")}catch(v){return console.error("Failed to load OEM settings:",v),{success:!0,data:{siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}}}async getBatchStats(v){return this.request("/apiStats/api/batch-stats",{method:"POST",body:JSON.stringify({apiIds:v})})}async getBatchModelStats(v,s="daily"){return this.request("/apiStats/api/batch-model-stats",{method:"POST",body:JSON.stringify({apiIds:v,period:s})})}}const Q=new Lt,at=pt("apistats",()=>{const N=M(""),v=M(null),s=M(!1),p=M(!1),d=M(!0),x=M(""),m=M("daily"),y=M(null),_=M([]),A=M(null),f=M(null),T=M({siteName:"",siteIcon:"",siteIconData:""}),O=M(!1),w=M([]),h=M([]),u=M(null),i=M([]),I=M([]),E=j(()=>{const c={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};return O.value&&u.value?m.value==="daily"?u.value.dailyUsage||c:u.value.monthlyUsage||c:m.value==="daily"?A.value||c:f.value||c}),H=j(()=>{if(!y.value||!E.value)return{tokenUsage:0,costUsage:0,requestUsage:0};const c=E.value,k=y.value.limits;return{tokenUsage:k.tokenLimit>0?Math.min(c.allTokens/k.tokenLimit*100,100):0,costUsage:k.dailyCostLimit>0?Math.min(c.cost/k.dailyCostLimit*100,100):0,requestUsage:k.rateLimitRequests>0?Math.min(c.requests/k.rateLimitRequests*100,100):0}});async function V(){if(O.value)return Y();const c=N.value.trim();if(!c){x.value="请输入 API Key";return}if(c.length<10||c.length>512){x.value="API Key 格式无效:长度应在 10-512 个字符之间";return}s.value=!0,x.value="",y.value=null,_.value=[],v.value=null;try{const k=await Q.getKeyId(c);if(k.success){v.value=k.data.id;const L=await Q.getUserStats(v.value);if(L.success)y.value=L.data,await W(),x.value="",z();else throw new Error(L.message||"查询失败")}else throw new Error(k.message||"获取 API Key ID 失败")}catch(k){console.error("Query stats error:",k),x.value=k.message||"查询统计数据失败,请检查您的 API Key 是否正确",y.value=null,_.value=[],v.value=null}finally{s.value=!1}}async function W(){v.value&&(await Promise.all([B("daily"),B("monthly")]),await D(m.value))}async function B(c){try{const k=await Q.getUserModelStats(v.value,c);if(k.success){const L=k.data||[],F={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};L.forEach(q=>{var J;F.requests+=q.requests||0,F.inputTokens+=q.inputTokens||0,F.outputTokens+=q.outputTokens||0,F.cacheCreateTokens+=q.cacheCreateTokens||0,F.cacheReadTokens+=q.cacheReadTokens||0,F.allTokens+=q.allTokens||0,F.cost+=((J=q.costs)==null?void 0:J.total)||0}),F.formattedCost=G(F.cost),c==="daily"?A.value=F:f.value=F}else console.warn(`Failed to load ${c} stats:`,k.message)}catch(k){console.error(`Load ${c} stats error:`,k)}}async function D(c="daily"){if(v.value){p.value=!0;try{const k=await Q.getUserModelStats(v.value,c);if(k.success)_.value=k.data||[];else throw new Error(k.message||"加载模型统计失败")}catch(k){console.error("Load model stats error:",k),_.value=[]}finally{p.value=!1}}}async function $(c){if(!(m.value===c||p.value)){if(m.value=c,O.value&&h.value.length>0){await rt(c);return}(c==="daily"&&!A.value||c==="monthly"&&!f.value)&&await B(c),await D(c)}}async function U(){var c,k;if(v.value){s.value=!0,x.value="",y.value=null,_.value=[];try{const L=await Q.getUserStats(v.value);if(L.success)y.value=L.data,console.log("API Stats - Full response:",L.data),console.log("API Stats - limits data:",L.data.limits),console.log("API Stats - weeklyOpusCostLimit:",(c=L.data.limits)==null?void 0:c.weeklyOpusCostLimit),console.log("API Stats - weeklyOpusCost:",(k=L.data.limits)==null?void 0:k.weeklyOpusCost),await W(),x.value="";else throw new Error(L.message||"查询失败")}catch(L){console.error("Load stats with apiId error:",L),x.value=L.message||"查询统计数据失败",y.value=null,_.value=[]}finally{s.value=!1}}}async function S(){d.value=!0;try{const c=await Q.getOemSettings();c&&c.success&&c.data&&(T.value={...T.value,...c.data})}catch(c){console.error("Error loading OEM settings:",c),T.value={siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}finally{d.value=!1}}function G(c){return typeof c!="number"||c===0?"$0.000000":c>=1?"$"+c.toFixed(2):c>=.01?"$"+c.toFixed(4):"$"+c.toFixed(6)}function z(){if(v.value){const c=new URL(window.location);c.searchParams.set("apiId",v.value),window.history.pushState({},"",c)}}async function Y(){const c=o();if(c.length===0){x.value="请输入至少一个有效的 API Key";return}s.value=!0,x.value="",u.value=null,i.value=[],I.value=[],_.value=[],w.value=c,h.value=[];try{const k=await Promise.allSettled(c.map(J=>Q.getKeyId(J))),L=[],F=[];if(k.forEach((J,it)=>{J.status==="fulfilled"&&J.value.success?(L.push(J.value.data.id),F.push(c[it])):I.value.push(c[it])}),L.length===0)throw new Error("所有 API Key 都无效");h.value=L,w.value=F;const q=await Q.getBatchStats(L);if(q.success)u.value=q.data.aggregated,i.value=q.data.individual,y.value=q.data.aggregated,A.value=q.data.aggregated.dailyUsage||null,f.value=q.data.aggregated.monthlyUsage||null,await rt(m.value),a();else throw new Error(q.message||"批量查询失败")}catch(k){console.error("Batch query error:",k),x.value=k.message||"批量查询统计数据失败",u.value=null,i.value=[]}finally{s.value=!1}}async function rt(c="daily"){if(h.value.length!==0){p.value=!0;try{const k=await Q.getBatchModelStats(h.value,c);if(k.success)_.value=k.data||[];else throw new Error(k.message||"加载批量模型统计失败")}catch(k){console.error("Load batch model stats error:",k),_.value=[]}finally{p.value=!1}}}function o(){if(!N.value)return[];const c=N.value.split(/[,\n]+/).map(L=>L.trim()).filter(L=>L.length>=10&&L.length<=512);return[...new Set(c)].slice(0,30)}function a(){if(h.value.length>0){const c=new URL(window.location);c.searchParams.set("apiIds",h.value.join(",")),c.searchParams.set("batch","true"),window.history.pushState({},"",c)}}function g(){N.value=""}function C(){y.value=null,_.value=[],A.value=null,f.value=null,x.value="",m.value="daily",v.value=null,w.value=[],h.value=[],u.value=null,i.value=[],I.value=[]}function R(){N.value="",O.value=!1,C()}return{apiKey:N,apiId:v,loading:s,modelStatsLoading:p,oemLoading:d,error:x,statsPeriod:m,statsData:y,modelStats:_,dailyStats:A,monthlyStats:f,oemSettings:T,multiKeyMode:O,apiKeys:w,apiIds:h,aggregatedStats:u,individualStats:i,invalidKeys:I,currentPeriodData:E,usagePercentages:H,queryStats:V,queryBatchStats:Y,loadAllPeriodStats:W,loadPeriodStats:B,loadModelStats:D,loadBatchModelStats:rt,switchPeriod:$,loadStatsWithApiId:U,loadOemSettings:S,clearData:C,clearInput:g,reset:R}}),Pt={class:"api-input-wide-card mb-8 rounded-3xl p-6 shadow-xl"},It={class:"mx-auto max-w-4xl"},Mt={class:"control-bar mb-4 flex flex-wrap items-center justify-between gap-3"},Dt={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},qt={class:"button-group flex items-center gap-2"},jt={class:"mode-switch-group flex items-center rounded-lg bg-gray-100 p-1 dark:bg-gray-800"},Ut={key:0,class:"ml-1 rounded-full bg-white/20 px-1.5 py-0.5 text-xs font-semibold"},Rt={class:"api-input-grid grid grid-cols-1 gap-4 lg:grid-cols-4"},Nt={class:"lg:col-span-3"},Ot=["disabled"],Et={key:1,class:"relative"},Ft=["disabled"],Wt={class:"lg:col-span-1"},Bt=["disabled"],Vt={key:0,class:"fas fa-spinner loading-spinner"},zt={key:1,class:"fas fa-search"},Jt={class:"security-notice mt-4"},Yt={key:0,class:"mt-2 rounded-lg bg-blue-50 p-3 text-sm text-blue-700 dark:bg-blue-900/20 dark:text-blue-400"},Ht={__name:"ApiKeyInput",setup(N){const v=at(),{apiKey:s,loading:p,multiKeyMode:d}=et(v),{queryStats:x,clearInput:m}=v,y=j(()=>{if(!d.value||!s.value)return[];const A=s.value.split(/[,\n]+/).map(T=>T.trim()).filter(T=>T.length>0);return[...new Set(A)].slice(0,30)}),_=j(()=>d.value?y.value.length>0:s.value&&s.value.trim().length>0);return(A,f)=>(l(),n("div",Pt,[f[15]||(f[15]=t("div",{class:"wide-card-title mb-6"},[t("h2",{class:"mb-2 text-2xl font-bold text-gray-900 dark:text-gray-200"},[t("i",{class:"fas fa-chart-line mr-3"}),b(" 使用统计查询 ")]),t("p",{class:"text-base text-gray-600 dark:text-gray-400"},"查询您的 API Key 使用情况和统计数据")],-1)),t("div",It,[t("div",Mt,[t("label",Dt,[f[8]||(f[8]=t("i",{class:"fas fa-key mr-2"},null,-1)),b(" "+r(e(d)?"输入您的 API Keys每行一个或用逗号分隔":"输入您的 API Key"),1)]),t("div",qt,[t("div",jt,[t("button",{class:P(["mode-switch-btn",{active:!e(d)}]),title:"单一模式",onClick:f[0]||(f[0]=T=>d.value=!1)},f[9]||(f[9]=[t("i",{class:"fas fa-key"},null,-1),t("span",{class:"ml-2 hidden sm:inline"},"单一",-1)]),2),t("button",{class:P(["mode-switch-btn",{active:e(d)}]),title:"聚合模式",onClick:f[1]||(f[1]=T=>d.value=!0)},[f[10]||(f[10]=t("i",{class:"fas fa-layer-group"},null,-1)),f[11]||(f[11]=t("span",{class:"ml-2 hidden sm:inline"},"聚合",-1)),e(d)&&y.value.length>0?(l(),n("span",Ut,r(y.value.length),1)):K("",!0)],2)])])]),t("div",Rt,[t("div",Nt,[e(d)?(l(),n("div",Et,[ut(t("textarea",{"onUpdate:modelValue":f[4]||(f[4]=T=>gt(s)?s.value=T:null),class:"wide-card-input w-full resize-y",disabled:e(p),placeholder:`请输入您的 API Keys支持以下格式
cr_xxx
cr_yyy
cr_xxx, cr_yyy`,rows:"4",onKeyup:f[5]||(f[5]=mt(vt((...T)=>e(x)&&e(x)(...T),["ctrl"]),["enter"]))},null,40,Ft),[[ct,e(s)]]),e(s)&&!e(p)?(l(),n("button",{key:0,class:"absolute right-2 top-2 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300",title:"清空输入",onClick:f[6]||(f[6]=(...T)=>e(m)&&e(m)(...T))},f[12]||(f[12]=[t("i",{class:"fas fa-times-circle"},null,-1)]))):K("",!0)])):ut((l(),n("input",{key:0,"onUpdate:modelValue":f[2]||(f[2]=T=>gt(s)?s.value=T:null),class:"wide-card-input w-full",disabled:e(p),placeholder:"请输入您的 API Key (cr_...)",type:"password",onKeyup:f[3]||(f[3]=mt((...T)=>e(x)&&e(x)(...T),["enter"]))},null,40,Ot)),[[ct,e(s)]])]),t("div",Wt,[t("button",{class:"btn btn-primary btn-query flex h-full w-full items-center justify-center gap-2",disabled:e(p)||!_.value,onClick:f[7]||(f[7]=(...T)=>e(x)&&e(x)(...T))},[e(p)?(l(),n("i",Vt)):(l(),n("i",zt)),b(" "+r(e(p)?"查询中...":"查询统计"),1)],8,Bt)])]),t("div",Jt,[f[13]||(f[13]=t("i",{class:"fas fa-shield-alt mr-2"},null,-1)),b(" "+r(e(d)?"您的 API Keys 仅用于查询统计数据,不会被存储。聚合模式下部分个体化信息将不显示。":"您的 API Key 仅用于查询自己的统计数据,不会被存储或用于其他用途"),1)]),e(d)?(l(),n("div",Yt,f[14]||(f[14]=[t("i",{class:"fas fa-lightbulb mr-2"},null,-1),t("span",null,"提示:最多支持同时查询 30 个 API Keys。使用 Ctrl+Enter 快速查询。",-1)]))):K("",!0)])]))}},Gt=st(Ht,[["__scopeId","data-v-11e74200"]]),Qt={class:"space-y-6 md:space-y-8"},Xt={class:"grid grid-cols-1 items-stretch gap-4 md:gap-6 xl:grid-cols-[minmax(0,1.5fr)_minmax(0,1fr)]"},Zt={class:"card-section"},te={class:"section-header"},ee={class:"header-title"},se={key:0,class:"info-grid"},ae={class:"info-item"},re={class:"info-value"},le={class:"info-item"},ie={class:"info-value text-green-600 dark:text-emerald-400"},oe={key:0,class:"info-item"},ne={class:"info-value text-red-500 dark:text-red-400"},de={class:"info-item"},ue={class:"info-value"},ce={class:"info-item"},me={class:"info-value"},ge={class:"info-item"},xe={class:"info-value text-indigo-600 dark:text-indigo-300"},fe={key:1,class:"info-item xl:col-span-2"},ye={class:"space-y-2"},pe={class:"truncate"},ve={class:"font-semibold"},be={key:1,class:"info-grid"},ke={class:"info-item"},he={class:"info-value break-all"},_e={class:"info-item"},we={class:"info-item"},$e={class:"info-value"},Se={class:"info-item"},Ce={class:"info-value break-all"},Te={class:"info-item xl:col-span-2"},Ke={class:"info-value"},Ae={class:"ml-2 text-xs text-gray-500 dark:text-gray-400"},Le={key:0,class:"text-red-500 dark:text-red-400"},Pe={key:1,class:"text-orange-500 dark:text-orange-400"},Ie={key:2},Me={key:2,class:"text-gray-400 dark:text-gray-500"},De={class:"card-section"},qe={class:"section-header"},je={class:"header-tag"},Ue={class:"metric-grid"},Re={class:"metric-card"},Ne={class:"metric-value text-green-600 dark:text-emerald-300"},Oe={class:"metric-label"},Ee={class:"metric-card"},Fe={class:"metric-value text-blue-600 dark:text-sky-300"},We={class:"metric-label"},Be={class:"metric-card"},Ve={class:"metric-value text-purple-600 dark:text-violet-300"},ze={class:"metric-label"},Je={class:"metric-card"},Ye={class:"metric-value text-amber-500 dark:text-amber-300"},He={class:"metric-label"},Ge={key:0,class:"card-section"},Qe={class:"flex items-center justify-between gap-3"},Xe={class:"flex items-center gap-3"},Ze={class:"account-name"},ts={class:"account-sub"},es={key:0,class:"mt-3 space-y-2"},ss={class:"progress-row"},as={class:"progress-track"},rs={class:"progress-value"},ls={class:"flex flex-wrap items-center gap-2 text-xs text-gray-600 dark:text-gray-300"},is={key:0,class:"font-medium text-indigo-600 dark:text-indigo-400"},os={key:1,class:"mt-3"},ns={key:0,class:"space-y-2"},ds={class:"quota-header"},us={class:"quota-percent"},cs={class:"progress-track"},ms={class:"quota-foot"},gs={key:1,class:"rounded-xl bg-slate-100 px-3 py-2 text-xs text-slate-500 dark:bg-slate-800 dark:text-slate-300"},xs={__name:"StatsOverview",setup(N){const v=at(),{statsData:s,statsPeriod:p,currentPeriodData:d,multiKeyMode:x,aggregatedStats:m,individualStats:y,invalidKeys:_}=et(v),A=j(()=>!y.value||y.value.length===0?[]:[...y.value].sort((o,a)=>{var g,C;return(((g=a.usage)==null?void 0:g.allTokens)||0)-(((C=o.usage)==null?void 0:C.allTokens)||0)}).slice(0,3)),f=o=>{var g;return!m.value||!m.value.usage.allTokens?0:((((g=o.usage)==null?void 0:g.allTokens)||0)/m.value.usage.allTokens*100).toFixed(1)},T=o=>{if(!o)return"无";try{return Tt(o).format("YYYY年MM月DD日 HH:mm")}catch{return"格式错误"}},O=o=>o?new Date(o).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",w=o=>o?new Date(o)<new Date:!1,h=o=>{if(!o)return!1;const C=(new Date(o)-new Date)/(1e3*60*60*24);return C>0&&C<=7},u=o=>(typeof o!="number"&&(o=parseInt(o)||0),o===0?"0":o>=1e6?(o/1e6).toFixed(1)+"M":o>=1e3?(o/1e3).toFixed(1)+"K":o.toLocaleString()),i=o=>({claude:"Claude",gemini:"Gemini",all:"全部模型"})[o]||o||"未知",I=j(()=>{var g,C;const o=(C=(g=s.value)==null?void 0:g.accounts)==null?void 0:C.details;if(!o)return[];const a=[];return o.claude&&o.claude.accountType==="dedicated"&&a.push({key:"claude",...o.claude}),o.openai&&o.openai.accountType==="dedicated"&&a.push({key:"openai",...o.openai}),a}),E=j(()=>{const o=I.value.length;return o<=1?"md:grid-cols-1 lg:grid-cols-1":o===2?"md:grid-cols-2":"md:grid-cols-2 xl:grid-cols-3"}),H=o=>o?o.platform==="openai"?"OpenAI 专属账号":"Claude 专属账号":"专属账号",V=o=>{if(!o||o<=0)return"";const a=Math.floor(o),g=Math.floor(a/1440),C=Math.floor(a%1440/60),R=a%60;return g>0?C>0?`${g}${C}小时`:`${g}`:C>0?R>0?`${C}小时${R}分钟`:`${C}小时`:`${R}分钟`},W=o=>{if(!o)return{text:"状态未知",class:"text-gray-400"};if(o.isRateLimited){const a=V(o.minutesRemaining);return{text:`限流中${a?` · 剩余约 ${a}`:""}`,class:"text-red-500 dark:text-red-400"}}return{text:"未限流",class:"text-green-600 dark:text-emerald-400"}},B=(o,a)=>{if(!o||!a)return"暂无时间窗口信息";const g=new Date(o),C=new Date(a),R=c=>`${`${c.getHours()}`.padStart(2,"0")}:${`${c.getMinutes()}`.padStart(2,"0")}`;return`${R(g)} - ${R(C)}`},D=o=>{if(!o||o<=0)return"";const a=Math.floor(o/60),g=o%60;return a>0?`${a}小时${g}分钟`:`${g}分钟`},$=(o,a)=>{var C;if(!o)return"bg-gradient-to-r from-blue-500 to-indigo-500";if((C=a==null?void 0:a.rateLimitStatus)!=null&&C.isRateLimited)return"bg-gradient-to-r from-red-500 to-red-600";const g=String(o).toLowerCase();return g==="rejected"?"bg-gradient-to-r from-red-500 to-red-600":g==="allowed_warning"?"bg-gradient-to-r from-yellow-500 to-orange-500":"bg-gradient-to-r from-blue-500 to-indigo-500"},U=o=>{if(!o)return null;const a=typeof o.usedPercent=="number"&&!Number.isNaN(o.usedPercent)?o.usedPercent:null,g=typeof o.resetAfterSeconds=="number"&&!Number.isNaN(o.resetAfterSeconds)?o.resetAfterSeconds:null,C=typeof o.remainingSeconds=="number"?o.remainingSeconds:null,R=o.resetAt?Date.parse(o.resetAt):null;return g!==null&&(C!==null&&C<=0||R!==null&&!Number.isNaN(R)&&Date.now()>=R)?0:a===null?null:Math.max(0,Math.min(100,a))},S=o=>{const a=U(o);return a===null?"bg-gradient-to-r from-gray-300 to-gray-400":a>=90?"bg-gradient-to-r from-red-500 to-red-600":a>=75?"bg-gradient-to-r from-yellow-500 to-orange-500":"bg-gradient-to-r from-emerald-500 to-teal-500"},G=o=>{const a=U(o);return a===null?"0%":`${a}%`},z=o=>{const a=U(o);return a===null?"--":`${a.toFixed(1)}%`},Y=o=>{if(!o)return"--";let a=o.remainingSeconds;if(a==null&&(a=o.resetAfterSeconds),a==null||Number.isNaN(Number(a)))return"--";a=Math.max(0,Math.floor(Number(a)));const g=Math.floor(a/86400),C=Math.floor(a%86400/3600),R=Math.floor(a%3600/60),c=a%60;return g>0?C>0?`${g}${C}小时`:`${g}`:C>0?R>0?`${C}小时${R}分钟`:`${C}小时`:R>0?`${R}分钟`:`${c}`},rt=o=>o==="secondary"?"周限":"5h";return(o,a)=>(l(),n("div",Qt,[t("div",Xt,[t("div",Zt,[t("header",te,[t("i",{class:P(["header-icon",e(x)?"fas fa-layer-group text-purple-500":"fas fa-info-circle text-blue-500"])},null,2),t("h3",ee,r(e(x)?"批量查询概要":"API Key 信息"),1)]),e(x)&&e(m)?(l(),n("div",se,[t("div",ae,[a[0]||(a[0]=t("p",{class:"info-label"},"查询 Keys 数",-1)),t("p",re,r(e(m).totalKeys)+" 个",1)]),t("div",le,[a[2]||(a[2]=t("p",{class:"info-label"},"有效 Keys 数",-1)),t("p",ie,[a[1]||(a[1]=t("i",{class:"fas fa-check-circle mr-1"},null,-1)),b(r(e(m).activeKeys)+" 个 ",1)])]),e(_).length>0?(l(),n("div",oe,[a[4]||(a[4]=t("p",{class:"info-label"},"无效 Keys 数",-1)),t("p",ne,[a[3]||(a[3]=t("i",{class:"fas fa-times-circle mr-1"},null,-1)),b(r(e(_).length)+" 个 ",1)])])):K("",!0),t("div",de,[a[5]||(a[5]=t("p",{class:"info-label"},"总请求数",-1)),t("p",ue,r(u(e(m).usage.requests)),1)]),t("div",ce,[a[6]||(a[6]=t("p",{class:"info-label"},"总 Token 数",-1)),t("p",me,r(u(e(m).usage.allTokens)),1)]),t("div",ge,[a[7]||(a[7]=t("p",{class:"info-label"},"总费用",-1)),t("p",xe,r(e(m).usage.formattedCost),1)]),e(y).length>1?(l(),n("div",fe,[a[8]||(a[8]=t("p",{class:"info-label"},"Top 3 贡献占比",-1)),t("div",ye,[(l(!0),n(Z,null,tt(A.value,g=>(l(),n("div",{key:g.apiId,class:"contributor-item"},[t("span",pe,r(g.name),1),t("span",ve,r(f(g))+"%",1)]))),128))])])):K("",!0)])):(l(),n("div",be,[t("div",ke,[a[9]||(a[9]=t("p",{class:"info-label"},"名称",-1)),t("p",he,r(e(s).name),1)]),t("div",_e,[a[10]||(a[10]=t("p",{class:"info-label"},"状态",-1)),t("p",{class:P(["info-value font-semibold",e(s).isActive?"text-green-600 dark:text-emerald-400":"text-red-500 dark:text-red-400"])},[t("i",{class:P(["mr-1",e(s).isActive?"fas fa-check-circle":"fas fa-times-circle"])},null,2),b(" "+r(e(s).isActive?"活跃":"已停用"),1)],2)]),t("div",we,[a[11]||(a[11]=t("p",{class:"info-label"},"权限",-1)),t("p",$e,r(i(e(s).permissions)),1)]),t("div",Se,[a[12]||(a[12]=t("p",{class:"info-label"},"创建时间",-1)),t("p",Ce,r(T(e(s).createdAt)),1)]),t("div",Te,[a[17]||(a[17]=t("p",{class:"info-label"},"过期时间",-1)),t("div",Ke,[e(s).expirationMode==="activation"&&!e(s).isActivated?(l(),n(Z,{key:0},[a[13]||(a[13]=t("span",{class:"text-amber-600 dark:text-amber-400"},[t("i",{class:"fas fa-pause-circle mr-1"}),b("未激活 ")],-1)),t("span",Ae," 首次使用后 "+r(e(s).activationDays||(e(s).activationUnit==="hours"?24:30))+" "+r(e(s).activationUnit==="hours"?"小时":"天")+"过期 ",1)],64)):e(s).expiresAt?(l(),n(Z,{key:1},[w(e(s).expiresAt)?(l(),n("span",Le,a[14]||(a[14]=[t("i",{class:"fas fa-exclamation-circle mr-1"},null,-1),b("已过期 ",-1)]))):h(e(s).expiresAt)?(l(),n("span",Pe,[a[15]||(a[15]=t("i",{class:"fas fa-clock mr-1"},null,-1)),b(r(O(e(s).expiresAt)),1)])):(l(),n("span",Ie,r(O(e(s).expiresAt)),1))],64)):(l(),n("span",Me,a[16]||(a[16]=[t("i",{class:"fas fa-infinity mr-1"},null,-1),b("永不过期 ",-1)])))])])]))]),t("div",De,[t("header",qe,[a[18]||(a[18]=t("i",{class:"header-icon fas fa-chart-bar text-green-500"},null,-1)),a[19]||(a[19]=t("h3",{class:"header-title"},"使用统计概览",-1)),t("span",je,r(e(p)==="daily"?"今日":"本月"),1)]),t("div",Ue,[t("div",Re,[t("p",Ne,r(u(e(d).requests)),1),t("p",Oe,r(e(p)==="daily"?"今日":"本月")+"请求数",1)]),t("div",Ee,[t("p",Fe,r(u(e(d).allTokens)),1),t("p",We,r(e(p)==="daily"?"今日":"本月")+"Token 数",1)]),t("div",Be,[t("p",Ve,r(e(d).formattedCost||"$0.000000"),1),t("p",ze,r(e(p)==="daily"?"今日":"本月")+"费用",1)]),t("div",Je,[t("p",Ye,r(u(e(d).inputTokens)),1),t("p",He,r(e(p)==="daily"?"今日":"本月")+"输入 Token",1)])])])]),!e(x)&&I.value.length>0?(l(),n("div",Ge,[a[21]||(a[21]=t("header",{class:"section-header"},[t("i",{class:"header-icon fas fa-plug text-indigo-500"}),t("h3",{class:"header-title"},"专属账号运行状态"),t("span",{class:"header-tag"},"实时更新")],-1)),t("div",{class:P(["grid grid-cols-1 gap-4",E.value])},[(l(!0),n(Z,null,tt(I.value,g=>{var C,R,c,k,L,F;return l(),n("div",{key:g.id||g.key,class:"account-card"},[t("div",Qe,[t("div",Xe,[t("span",{class:P(["account-icon",g.platform==="claude"?"icon-claude":"icon-openai"])},[t("i",{class:P(g.platform==="claude"?"fas fa-meteor":"fas fa-robot")},null,2)],2),t("div",null,[t("p",Ze,r(H(g)),1),t("p",ts,r(g.platform==="claude"?"会话窗口":"额度窗口"),1)])]),W(g.rateLimitStatus)?(l(),n("div",{key:0,class:P(["rate-badge",W(g.rateLimitStatus).class])},[a[20]||(a[20]=t("i",{class:"fas fa-tachometer-alt mr-1"},null,-1)),b(" "+r(W(g.rateLimitStatus).text),1)],2)):K("",!0)]),g.platform==="claude"?(l(),n("div",es,[t("div",ss,[t("div",as,[t("div",{class:P(["progress-bar",$((C=g.sessionWindow)==null?void 0:C.sessionWindowStatus,g)]),style:lt({width:`${Math.min(100,Math.max(0,((R=g.sessionWindow)==null?void 0:R.progress)||0))}%`})},null,6)]),t("span",rs,r(Math.min(100,Math.max(0,Math.round(((c=g.sessionWindow)==null?void 0:c.progress)||0))))+"% ",1)]),t("div",ls,[t("span",null,r(B((k=g.sessionWindow)==null?void 0:k.windowStart,(L=g.sessionWindow)==null?void 0:L.windowEnd)),1),((F=g.sessionWindow)==null?void 0:F.remainingTime)>0?(l(),n("span",is," 剩余 "+r(D(g.sessionWindow.remainingTime)),1)):K("",!0)])])):g.platform==="openai"?(l(),n("div",os,[g.codexUsage?(l(),n("div",ns,[(l(),n(Z,null,tt(["primary","secondary"],q=>{var J,it,nt,dt;return t("div",{key:`${g.key}-${q}`,class:"quota-row"},[t("div",ds,[t("span",{class:P(["quota-tag",q==="primary"?"tag-indigo":"tag-blue"])},r(rt(q)),3),t("span",us,r(z((J=g.codexUsage)==null?void 0:J[q])),1)]),t("div",cs,[t("div",{class:P(["progress-bar",S((it=g.codexUsage)==null?void 0:it[q])]),style:lt({width:G((nt=g.codexUsage)==null?void 0:nt[q])})},null,6)]),t("div",ms," 重置剩余 "+r(Y((dt=g.codexUsage)==null?void 0:dt[q])),1)])}),64))])):(l(),n("p",gs," 暂无额度使用数据 "))])):K("",!0)])}),128))],2)])):K("",!0)]))}},fs=st(xs,[["__scopeId","data-v-b72df2cd"]]),ys={class:"card p-4 md:p-6"},ps={class:"mb-3 flex flex-col text-lg font-bold text-gray-900 dark:text-gray-100 sm:flex-row sm:items-center md:mb-4 md:text-xl"},vs={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},bs={class:"space-y-2 md:space-y-3"},ks={class:"flex items-center justify-between"},hs={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},_s={class:"flex items-center justify-between"},ws={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},$s={class:"flex items-center justify-between"},Ss={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},Cs={class:"flex items-center justify-between"},Ts={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},Ks={class:"mt-3 border-t border-gray-200 pt-3 dark:border-gray-700 md:mt-4 md:pt-4"},As={class:"flex items-center justify-between font-bold text-gray-900 dark:text-gray-100"},Ls={class:"text-sm md:text-base"},Ps={class:"text-lg md:text-xl"},Is={__name:"TokenDistribution",setup(N){const v=at(),{statsPeriod:s,currentPeriodData:p}=et(v),d=x=>(typeof x!="number"&&(x=parseInt(x)||0),x===0?"0":x>=1e6?(x/1e6).toFixed(1)+"M":x>=1e3?(x/1e3).toFixed(1)+"K":x.toLocaleString());return(x,m)=>(l(),n("div",ys,[t("h3",ps,[m[0]||(m[0]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-coins mr-2 text-sm text-yellow-500 md:mr-3 md:text-base"}),b(" Token 使用分布 ")],-1)),t("span",vs,"("+r(e(s)==="daily"?"今日":"本月")+")",1)]),t("div",bs,[t("div",ks,[m[1]||(m[1]=t("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[t("i",{class:"fas fa-arrow-right mr-1 text-xs text-green-500 md:mr-2 md:text-sm"}),b(" 输入 Token ")],-1)),t("span",hs,r(d(e(p).inputTokens)),1)]),t("div",_s,[m[2]||(m[2]=t("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[t("i",{class:"fas fa-arrow-left mr-1 text-xs text-blue-500 md:mr-2 md:text-sm"}),b(" 输出 Token ")],-1)),t("span",ws,r(d(e(p).outputTokens)),1)]),t("div",$s,[m[3]||(m[3]=t("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[t("i",{class:"fas fa-save mr-1 text-xs text-purple-500 md:mr-2 md:text-sm"}),b(" 缓存创建 Token ")],-1)),t("span",Ss,r(d(e(p).cacheCreateTokens)),1)]),t("div",Cs,[m[4]||(m[4]=t("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[t("i",{class:"fas fa-download mr-1 text-xs text-orange-500 md:mr-2 md:text-sm"}),b(" 缓存读取 Token ")],-1)),t("span",Ts,r(d(e(p).cacheReadTokens)),1)])]),t("div",Ks,[t("div",As,[t("span",Ls,r(e(s)==="daily"?"今日":"本月")+"总计",1),t("span",Ps,r(d(e(p).allTokens)),1)])])]))}},Ms=st(Is,[["__scopeId","data-v-d9e5c1dd"]]),Ds={class:"flex h-full flex-col gap-4 md:gap-6"},qs={class:"card flex h-full flex-col p-4 md:p-6"},js={class:"mb-3 flex items-center text-lg font-bold text-gray-900 dark:text-gray-100 md:mb-4 md:text-xl"},Us={key:0,class:"space-y-4"},Rs={class:"rounded-lg bg-gradient-to-r from-blue-50 to-indigo-50 p-4 dark:from-blue-900/20 dark:to-indigo-900/20"},Ns={class:"mb-3 flex items-center justify-between"},Os={class:"rounded-full bg-blue-100 px-2 py-1 text-xs font-semibold text-blue-700 dark:bg-blue-800 dark:text-blue-200"},Es={class:"grid grid-cols-2 gap-3"},Fs={class:"text-center"},Ws={class:"text-lg font-bold text-gray-900 dark:text-gray-100"},Bs={class:"text-center"},Vs={class:"text-lg font-bold text-green-600"},zs={class:"rounded-lg bg-gradient-to-r from-purple-50 to-pink-50 p-4 dark:from-purple-900/20 dark:to-pink-900/20"},Js={class:"space-y-2"},Ys={class:"flex items-center justify-between"},Hs={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},Gs={class:"flex items-center justify-between"},Qs={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},Xs={class:"flex items-center justify-between"},Zs={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},ta={key:0,class:"rounded-lg bg-red-50 p-3 text-sm dark:bg-red-900/20"},ea={class:"text-red-700 dark:text-red-300"},sa={key:1,class:"space-y-4 md:space-y-5"},aa={class:"mb-2 flex items-center justify-between"},ra={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},la={key:0},ia={key:1,class:"flex items-center gap-1"},oa={key:0,class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},na={key:1,class:"h-2 w-full rounded-full bg-gray-200"},da={class:"mb-2 flex items-center justify-between"},ua={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},ca={key:0},ma={key:1,class:"flex items-center gap-1"},ga={key:0,class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},xa={key:1,class:"h-2 w-full rounded-full bg-gray-200"},fa={key:0},ya={class:"mb-2 flex items-center justify-between"},pa={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},va={class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},ba={key:1},ka={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},ha={key:0},_a={key:1},wa={key:2},$a={class:"space-y-4 border-t border-gray-100 pt-3 dark:border-gray-700"},Sa={class:"flex items-center justify-between"},Ca={class:"text-sm font-medium text-gray-900 md:text-base"},Ta={key:0},Ka={key:1,class:"flex items-center gap-1"},Aa={class:"flex items-center justify-between"},La={class:"text-sm font-medium text-gray-900 md:text-base"},Pa={key:0,class:"text-orange-600"},Ia={key:1,class:"text-green-600"},Ma={class:"space-y-2"},Da={class:"flex items-center justify-between"},qa={class:"text-sm font-medium text-gray-900 md:text-base"},ja={key:0,class:"text-orange-600"},Ua={key:1,class:"text-green-600"},Ra={key:0,class:"flex flex-wrap gap-2 rounded-lg bg-blue-50 p-2 dark:bg-blue-900/20 md:p-3"},Na={key:0,class:"card !overflow-visible p-4 md:p-6"},Oa={class:"rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20 md:p-4"},Ea={class:"max-h-64 space-y-1 overflow-y-auto pr-1 md:max-h-80 md:space-y-2"},Fa={class:"break-all text-gray-800 dark:text-gray-200"},Wa={__name:"LimitConfig",setup(N){const v=at(),{statsData:s,multiKeyMode:p,aggregatedStats:d,invalidKeys:x}=et(v),m=j(()=>{var i;const u=(i=s.value)==null?void 0:i.restrictions;return u?u.enableModelRestriction===!0&&Array.isArray(u.restrictedModels)&&u.restrictedModels.length>0:!1}),y=j(()=>{var i;const u=(i=s.value)==null?void 0:i.restrictions;return u?u.enableClientRestriction===!0&&Array.isArray(u.allowedClients)&&u.allowedClients.length>0:!1}),_=()=>{if(!s.value.limits.dailyCostLimit||s.value.limits.dailyCostLimit===0)return 0;const u=s.value.limits.currentDailyCost/s.value.limits.dailyCostLimit*100;return Math.min(u,100)},A=()=>{const u=_();return u>=100?"bg-red-500":u>=80?"bg-yellow-500":"bg-green-500"},f=()=>{if(!s.value.limits.totalCostLimit||s.value.limits.totalCostLimit===0)return 0;const u=s.value.limits.currentTotalCost/s.value.limits.totalCostLimit*100;return Math.min(u,100)},T=()=>{const u=f();return u>=100?"bg-red-500":u>=80?"bg-yellow-500":"bg-blue-500"},O=()=>{if(!s.value.limits.weeklyOpusCostLimit||s.value.limits.weeklyOpusCostLimit===0)return 0;const u=s.value.limits.weeklyOpusCost/s.value.limits.weeklyOpusCostLimit*100;return Math.min(u,100)},w=()=>{const u=O();return u>=100?"bg-red-500":u>=80?"bg-yellow-500":"bg-indigo-500"},h=u=>(typeof u!="number"&&(u=parseInt(u)||0),u===0?"0":u>=1e6?(u/1e6).toFixed(1)+"M":u>=1e3?(u/1e3).toFixed(1)+"K":u.toLocaleString());return(u,i)=>(l(),n("div",Ds,[t("div",qs,[t("h3",js,[i[0]||(i[0]=t("i",{class:"fas fa-shield-alt mr-2 text-sm text-red-500 md:mr-3 md:text-base"},null,-1)),b(" "+r(e(p)?"限制配置(聚合查询模式)":"限制配置"),1)]),e(p)&&e(d)?(l(),n("div",Us,[t("div",Rs,[t("div",Ns,[i[1]||(i[1]=t("span",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-layer-group mr-2 text-blue-500"}),b(" API Keys 概况 ")],-1)),t("span",Os,r(e(d).activeKeys)+"/"+r(e(d).totalKeys),1)]),t("div",Es,[t("div",Fs,[t("div",Ws,r(e(d).totalKeys),1),i[2]||(i[2]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400"},"总计 Keys",-1))]),t("div",Bs,[t("div",Vs,r(e(d).activeKeys),1),i[3]||(i[3]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400"},"激活 Keys",-1))])])]),t("div",zs,[i[7]||(i[7]=t("div",{class:"mb-3 flex items-center"},[t("i",{class:"fas fa-chart-pie mr-2 text-purple-500"}),t("span",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},"聚合统计摘要")],-1)),t("div",Js,[t("div",Ys,[i[4]||(i[4]=t("span",{class:"text-xs text-gray-600 dark:text-gray-400"},[t("i",{class:"fas fa-database mr-1 text-gray-400"}),b(" 总请求数 ")],-1)),t("span",Hs,r(h(e(d).usage.requests)),1)]),t("div",Gs,[i[5]||(i[5]=t("span",{class:"text-xs text-gray-600 dark:text-gray-400"},[t("i",{class:"fas fa-coins mr-1 text-yellow-500"}),b(" 总 Tokens ")],-1)),t("span",Qs,r(h(e(d).usage.allTokens)),1)]),t("div",Xs,[i[6]||(i[6]=t("span",{class:"text-xs text-gray-600 dark:text-gray-400"},[t("i",{class:"fas fa-dollar-sign mr-1 text-green-500"}),b(" 总费用 ")],-1)),t("span",Zs,r(e(d).usage.formattedCost),1)])])]),e(x)&&e(x).length>0?(l(),n("div",ta,[i[8]||(i[8]=t("i",{class:"fas fa-exclamation-triangle mr-2 text-red-600 dark:text-red-400"},null,-1)),t("span",ea,r(e(x).length)+" 个无效的 API Key ",1)])):K("",!0),i[9]||(i[9]=t("div",{class:"rounded-lg bg-gray-50 p-3 text-xs text-gray-600 dark:bg-gray-800 dark:text-gray-400"},[t("i",{class:"fas fa-info-circle mr-1"}),b(" 每个 API Key 有独立的限制设置,聚合模式下不显示单个限制配置 ")],-1))])):K("",!0),e(p)?K("",!0):(l(),n("div",sa,[t("div",null,[t("div",aa,[i[11]||(i[11]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"每日费用限制",-1)),t("span",ra,[e(s).limits.dailyCostLimit>0?(l(),n("span",la," $"+r(e(s).limits.currentDailyCost.toFixed(4))+" / $"+r(e(s).limits.dailyCostLimit.toFixed(2)),1)):(l(),n("span",ia,[b(" $"+r(e(s).limits.currentDailyCost.toFixed(4))+" / ",1),i[10]||(i[10]=t("i",{class:"fas fa-infinity"},null,-1))]))])]),e(s).limits.dailyCostLimit>0?(l(),n("div",oa,[t("div",{class:P(["h-2 rounded-full transition-all duration-300",A()]),style:lt({width:_()+"%"})},null,6)])):(l(),n("div",na,i[12]||(i[12]=[t("div",{class:"h-2 rounded-full bg-green-500",style:{width:"0%"}},null,-1)])))]),t("div",null,[t("div",da,[i[14]||(i[14]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"总费用限制",-1)),t("span",ua,[e(s).limits.totalCostLimit>0?(l(),n("span",ca," $"+r(e(s).limits.currentTotalCost.toFixed(4))+" / $"+r(e(s).limits.totalCostLimit.toFixed(2)),1)):(l(),n("span",ma,[b(" $"+r(e(s).limits.currentTotalCost.toFixed(4))+" / ",1),i[13]||(i[13]=t("i",{class:"fas fa-infinity"},null,-1))]))])]),e(s).limits.totalCostLimit>0?(l(),n("div",ga,[t("div",{class:P(["h-2 rounded-full transition-all duration-300",T()]),style:lt({width:f()+"%"})},null,6)])):(l(),n("div",xa,i[15]||(i[15]=[t("div",{class:"h-2 rounded-full bg-blue-500",style:{width:"0%"}},null,-1)])))]),e(s).limits.weeklyOpusCostLimit>0?(l(),n("div",fa,[t("div",ya,[i[16]||(i[16]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"Claude 模型周费用限制",-1)),t("span",pa," $"+r(e(s).limits.weeklyOpusCost.toFixed(4))+" / $"+r(e(s).limits.weeklyOpusCostLimit.toFixed(2)),1)]),t("div",va,[t("div",{class:P(["h-2 rounded-full transition-all duration-300",w()]),style:lt({width:O()+"%"})},null,6)])])):K("",!0),e(s).limits.rateLimitWindow>0&&(e(s).limits.rateLimitRequests>0||e(s).limits.tokenLimit>0||e(s).limits.rateLimitCost>0)?(l(),n("div",ba,[X(Kt,{"cost-limit":e(s).limits.rateLimitCost,"current-cost":e(s).limits.currentWindowCost,"current-requests":e(s).limits.currentWindowRequests,"current-tokens":e(s).limits.currentWindowTokens,label:"时间窗口限制","rate-limit-window":e(s).limits.rateLimitWindow,"request-limit":e(s).limits.rateLimitRequests,"show-progress":!0,"show-tooltip":!0,"token-limit":e(s).limits.tokenLimit,"window-end-time":e(s).limits.windowEndTime,"window-remaining-seconds":e(s).limits.windowRemainingSeconds,"window-start-time":e(s).limits.windowStartTime},null,8,["cost-limit","current-cost","current-requests","current-tokens","rate-limit-window","request-limit","token-limit","window-end-time","window-remaining-seconds","window-start-time"]),t("div",ka,[i[17]||(i[17]=t("i",{class:"fas fa-info-circle mr-1"},null,-1)),e(s).limits.rateLimitCost>0?(l(),n("span",ha,' 请求次数和费用限制为"或"的关系,任一达到限制即触发限流 ')):e(s).limits.tokenLimit>0?(l(),n("span",_a,' 请求次数和Token使用量为"或"的关系,任一达到限制即触发限流 ')):(l(),n("span",wa," 仅限制请求次数 "))])])):K("",!0),t("div",$a,[t("div",Sa,[i[19]||(i[19]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"并发限制",-1)),t("span",Ca,[e(s).limits.concurrencyLimit>0?(l(),n("span",Ta,r(e(s).limits.concurrencyLimit),1)):(l(),n("span",Ka,i[18]||(i[18]=[t("i",{class:"fas fa-infinity text-gray-400"},null,-1)])))])]),t("div",Aa,[i[22]||(i[22]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"模型限制",-1)),t("span",La,[m.value?(l(),n("span",Pa,[i[20]||(i[20]=t("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),b(" 限制 "+r(e(s).restrictions.restrictedModels.length)+" 个模型 ",1)])):(l(),n("span",Ia,i[21]||(i[21]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),b(" 允许所有模型 ",-1)])))])]),t("div",Ma,[t("div",Da,[i[25]||(i[25]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"客户端限制",-1)),t("span",qa,[y.value?(l(),n("span",ja,[i[23]||(i[23]=t("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),b(" 限 "+r(e(s).restrictions.allowedClients.length)+" 种客户端使用 ",1)])):(l(),n("span",Ua,i[24]||(i[24]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),b(" 允许所有客户端 ",-1)])))])]),y.value?(l(),n("div",Ra,[(l(!0),n(Z,null,tt(e(s).restrictions.allowedClients,I=>(l(),n("span",{key:I,class:"flex items-center gap-1 rounded-full bg-white px-2 py-1 text-xs text-blue-700 shadow-sm dark:bg-slate-900 dark:text-blue-300 md:text-sm"},[i[26]||(i[26]=t("i",{class:"fas fa-id-badge"},null,-1)),b(" "+r(I),1)]))),128))])):K("",!0)])])]))]),m.value?(l(),n("div",Na,[i[30]||(i[30]=t("h3",{class:"mb-3 flex items-center text-lg font-bold text-gray-900 dark:text-gray-100 md:mb-4 md:text-xl"},[t("i",{class:"fas fa-list-alt mr-2 text-sm text-amber-500 md:mr-3 md:text-base"}),b(" 详细限制信息 ")],-1)),t("div",Oa,[i[28]||(i[28]=t("h4",{class:"mb-2 flex items-center text-sm font-bold text-amber-800 dark:text-amber-300 md:mb-3 md:text-base"},[t("i",{class:"fas fa-robot mr-1 text-xs md:mr-2 md:text-sm"}),b(" 受限模型列表 ")],-1)),t("div",Ea,[(l(!0),n(Z,null,tt(e(s).restrictions.restrictedModels,I=>(l(),n("div",{key:I,class:"rounded border border-amber-200 bg-white px-2 py-1 text-xs dark:border-amber-700 dark:bg-gray-800 md:px-3 md:py-2 md:text-sm"},[i[27]||(i[27]=t("i",{class:"fas fa-ban mr-1 text-xs text-red-500 md:mr-2"},null,-1)),t("span",Fa,r(I),1)]))),128))]),i[29]||(i[29]=t("p",{class:"mt-2 text-xs text-amber-700 dark:text-amber-400 md:mt-3"},[t("i",{class:"fas fa-info-circle mr-1"}),b(" 此 API Key 不能访问以上列出的模型 ")],-1))])])):K("",!0)]))}},Ba=st(Wa,[["__scopeId","data-v-21526aa3"]]),Va={class:"card h-full p-4 md:p-6"},za={class:"mb-3 flex flex-col text-lg font-bold text-gray-900 dark:text-gray-100 sm:flex-row sm:items-center md:mb-4 md:text-xl"},Ja={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},Ya={key:0,class:"space-y-2 md:space-y-3"},Ha={class:"mb-1 flex items-center justify-between text-sm"},Ga={class:"truncate font-medium text-gray-700 dark:text-gray-300"},Qa={class:"text-xs text-gray-600 dark:text-gray-400"},Xa={class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Za={class:"mt-1 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},tr={key:0,class:"border-t border-gray-200 pt-2 dark:border-gray-700"},er={class:"flex items-center justify-between text-sm text-gray-600 dark:text-gray-400"},sr={key:1,class:"flex h-32 items-center justify-center text-sm text-gray-500 dark:text-gray-400"},ar={key:2,class:"flex h-32 items-center justify-center text-sm text-gray-500 dark:text-gray-400"},rr={__name:"AggregatedStatsCard",setup(N){const v=at(),{aggregatedStats:s,individualStats:p,statsPeriod:d,multiKeyMode:x}=et(v),m=w=>w?d.value==="daily"?w.dailyUsage||w.usage:w.monthlyUsage||w.usage:null,y=j(()=>!p.value||p.value.length===0?[]:[...p.value].sort((w,h)=>{const u=m(w),i=m(h);return((i==null?void 0:i.cost)||0)-((u==null?void 0:u.cost)||0)}).slice(0,5)),_=j(()=>p.value?Math.max(0,p.value.length-5):0),A=j(()=>{var i,I;if(!p.value||!s.value)return 0;const w=y.value.reduce((E,H)=>{const V=m(H);return E+((V==null?void 0:V.cost)||0)},0),h=d.value==="daily"?((i=s.value.dailyUsage)==null?void 0:i.cost)||0:((I=s.value.monthlyUsage)==null?void 0:I.cost)||0;if(h===0)return 0;const u=h-w;return Math.max(0,Math.round(u/h*100))}),f=w=>{var I,E;if(!s.value)return 0;const h=d.value==="daily"?((I=s.value.dailyUsage)==null?void 0:I.cost)||0:((E=s.value.monthlyUsage)==null?void 0:E.cost)||0;if(h===0)return 0;const u=m(w),i=((u==null?void 0:u.cost)||0)/h*100;return Math.round(i)},T=w=>["bg-blue-500","bg-green-500","bg-purple-500","bg-yellow-500","bg-pink-500"][w]||"bg-gray-400",O=w=>(typeof w!="number"&&(w=parseInt(w)||0),w===0?"0":w>=1e6?(w/1e6).toFixed(1)+"M":w>=1e3?(w/1e3).toFixed(1)+"K":w.toLocaleString());return(w,h)=>(l(),n("div",Va,[t("h3",za,[h[0]||(h[0]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-chart-pie mr-2 text-sm text-orange-500 md:mr-3 md:text-base"}),b(" 使用占比 ")],-1)),t("span",Ja,"("+r(e(d)==="daily"?"今日":"本月")+")",1)]),e(s)&&e(p).length>0?(l(),n("div",Ya,[(l(!0),n(Z,null,tt(y.value,(u,i)=>{var I,E;return l(),n("div",{key:u.apiId,class:"relative"},[t("div",Ha,[t("span",Ga,r(u.name||`Key ${i+1}`),1),t("span",Qa,r(f(u))+"% ",1)]),t("div",Xa,[t("div",{class:P(["h-2 rounded-full transition-all duration-300",T(i)]),style:lt({width:f(u)+"%"})},null,6)]),t("div",Za,[t("span",null,r(O(((I=m(u))==null?void 0:I.requests)||0))+"次",1),t("span",null,r(((E=m(u))==null?void 0:E.formattedCost)||"$0.00"),1)])])}),128)),_.value>0?(l(),n("div",tr,[t("div",er,[t("span",null,"其他 "+r(_.value)+" 个Keys",1),t("span",null,r(A.value)+"%",1)])])):K("",!0)])):e(x)?(l(),n("div",ar,h[2]||(h[2]=[t("i",{class:"fas fa-chart-pie mr-2"},null,-1),b(" 暂无数据 ",-1)]))):(l(),n("div",sr,h[1]||(h[1]=[t("div",{class:"text-center"},[t("i",{class:"fas fa-chart-pie mb-2 text-2xl"}),t("p",null,"使用占比仅在多Key查询时显示")],-1)])))]))}},lr=st(rr,[["__scopeId","data-v-39572a8e"]]),ir={class:"card p-4 md:p-6"},or={class:"mb-4 md:mb-6"},nr={class:"flex flex-col text-lg font-bold text-gray-900 dark:text-gray-100 sm:flex-row sm:items-center md:text-xl"},dr={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},ur={key:0,class:"py-6 text-center md:py-8"},cr={key:1,class:"space-y-3 md:space-y-4"},mr={class:"mb-2 flex items-start justify-between md:mb-3"},gr={class:"min-w-0 flex-1"},xr={class:"break-all text-base font-bold text-gray-900 dark:text-gray-100 md:text-lg"},fr={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},yr={class:"ml-3 flex-shrink-0 text-right"},pr={class:"text-base font-bold text-green-600 md:text-lg"},vr={class:"grid grid-cols-2 gap-2 text-xs md:grid-cols-4 md:gap-3 md:text-sm"},br={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},kr={class:"font-medium text-gray-900 dark:text-gray-100"},hr={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},_r={class:"font-medium text-gray-900 dark:text-gray-100"},wr={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},$r={class:"font-medium text-gray-900 dark:text-gray-100"},Sr={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},Cr={class:"font-medium text-gray-900 dark:text-gray-100"},Tr={key:2,class:"py-6 text-center text-gray-500 dark:text-gray-400 md:py-8"},Kr={class:"text-sm md:text-base"},Ar={__name:"ModelUsageStats",setup(N){const v=at(),{statsPeriod:s,modelStats:p,modelStatsLoading:d}=et(v),x=m=>(typeof m!="number"&&(m=parseInt(m)||0),m===0?"0":m>=1e6?(m/1e6).toFixed(1)+"M":m>=1e3?(m/1e3).toFixed(1)+"K":m.toLocaleString());return(m,y)=>(l(),n("div",ir,[t("div",or,[t("h3",nr,[y[0]||(y[0]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-robot mr-2 text-sm text-indigo-500 md:mr-3 md:text-base"}),b(" 模型使用统计 ")],-1)),t("span",dr,"("+r(e(s)==="daily"?"今日":"本月")+")",1)])]),e(d)?(l(),n("div",ur,y[1]||(y[1]=[t("i",{class:"fas fa-spinner loading-spinner mb-2 text-xl text-gray-600 dark:text-gray-400 md:text-2xl"},null,-1),t("p",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"加载模型统计数据中...",-1)]))):e(p).length>0?(l(),n("div",cr,[(l(!0),n(Z,null,tt(e(p),(_,A)=>{var f;return l(),n("div",{key:A,class:"model-usage-item"},[t("div",mr,[t("div",gr,[t("h4",xr,r(_.model),1),t("p",fr,r(_.requests)+" 次请求 ",1)]),t("div",yr,[t("div",pr,r(((f=_.formatted)==null?void 0:f.total)||"$0.000000"),1),y[2]||(y[2]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},"总费用",-1))])]),t("div",vr,[t("div",br,[y[3]||(y[3]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输入 Token",-1)),t("div",kr,r(x(_.inputTokens)),1)]),t("div",hr,[y[4]||(y[4]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输出 Token",-1)),t("div",_r,r(x(_.outputTokens)),1)]),t("div",wr,[y[5]||(y[5]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存创建",-1)),t("div",$r,r(x(_.cacheCreateTokens)),1)]),t("div",Sr,[y[6]||(y[6]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存读取",-1)),t("div",Cr,r(x(_.cacheReadTokens)),1)])])])}),128))])):(l(),n("div",Tr,[y[7]||(y[7]=t("i",{class:"fas fa-chart-pie mb-3 text-2xl md:text-3xl"},null,-1)),t("p",Kr," 暂无"+r(e(s)==="daily"?"今日":"本月")+"模型使用数据 ",1)]))]))}},Lr=st(Ar,[["__scopeId","data-v-b3b8dc5f"]]),Pr={key:0,class:"fixed inset-0 z-[1050] flex items-center justify-center bg-gray-900/40 backdrop-blur-sm"},Ir={class:"relative z-10 mx-3 flex w-full max-w-lg flex-col overflow-hidden rounded-2xl border border-gray-200/70 bg-white/95 shadow-2xl ring-1 ring-black/5 transition-all dark:border-gray-700/60 dark:bg-gray-900/95 dark:ring-white/10 sm:mx-4"},Mr={class:"flex items-center justify-between border-b border-gray-100 bg-white/80 px-5 py-4 backdrop-blur dark:border-gray-800 dark:bg-gray-900/80"},Dr={class:"flex items-center gap-3"},qr={class:"text-xs text-gray-500 dark:text-gray-400"},jr=["disabled"],Ur={class:"max-h-[70vh] overflow-y-auto px-5 py-4"},Rr={class:"mb-4"},Nr={class:"relative"},Or=["value"],Er={class:"mb-4 space-y-2"},Fr={class:"flex items-center justify-between text-sm"},Wr={class:"font-medium text-gray-700 dark:text-gray-300"},Br={class:"flex items-center gap-3"},Vr={class:"text-xs text-gray-500 dark:text-gray-400"},zr={key:0,class:"mb-4 overflow-hidden rounded-xl border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"},Jr={class:"flex items-center justify-between border-b border-gray-200 bg-gray-100 px-3 py-2 dark:border-gray-700 dark:bg-gray-800"},Yr={key:0,class:"text-xs text-gray-500 dark:text-gray-500"},Hr={class:"max-h-40 overflow-y-auto p-3"},Gr={key:0,class:"whitespace-pre-wrap text-sm text-gray-700 dark:text-gray-300"},Qr={key:0,class:"inline-block h-4 w-1 animate-pulse bg-blue-500"},Xr={key:1,class:"flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400"},Zr={key:2,class:"text-sm text-red-600 dark:text-red-400"},tl={key:1,class:"mb-4 flex items-center justify-center gap-2 text-xs text-gray-500 dark:text-gray-400"},el={class:"flex items-center justify-end gap-3 border-t border-gray-100 bg-gray-50/80 px-5 py-3 dark:border-gray-800 dark:bg-gray-900/50"},sl=["disabled"],al=["disabled"],rl={__name:"ApiKeyTestModal",props:{show:{type:Boolean,default:!1},apiKeyValue:{type:String,default:""},apiKeyName:{type:String,default:""}},emits:["close"],setup(N,{emit:v}){const s=N,p=v,d=M("idle"),x=M(""),m=M(""),y=M(0),_=M(null),A=M(null),f=M("claude-sonnet-4-5-20250929"),T=j(()=>s.apiKeyName||"当前 API Key"),O=j(()=>{const D=s.apiKeyValue;return D?D.length<=10?"****":D.substring(0,6)+"****"+D.substring(D.length-4):""}),w=j(()=>{switch(d.value){case"idle":return"准备就绪";case"testing":return"正在测试...";case"success":return"测试成功";case"error":return"测试失败";default:return"未知状态"}}),h=j(()=>{switch(d.value){case"idle":return"点击下方按钮开始测试 API Key 连通性";case"testing":return"正在通过 /api 端点发送测试请求";case"success":return"API Key 可以正常访问服务";case"error":return m.value||"无法通过 API Key 访问服务";default:return""}}),u=j(()=>{switch(d.value){case"idle":return"border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50";case"testing":return"border-blue-200 bg-blue-50 dark:border-blue-500/30 dark:bg-blue-900/20";case"success":return"border-green-200 bg-green-50 dark:border-green-500/30 dark:bg-green-900/20";case"error":return"border-red-200 bg-red-50 dark:border-red-500/30 dark:bg-red-900/20";default:return"border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"}}),i=j(()=>{switch(d.value){case"idle":return"bg-gray-200 dark:bg-gray-700";case"testing":return"bg-blue-100 dark:bg-blue-500/30";case"success":return"bg-green-100 dark:bg-green-500/30";case"error":return"bg-red-100 dark:bg-red-500/30";default:return"bg-gray-200 dark:bg-gray-700"}}),I=j(()=>{switch(d.value){case"idle":return"fa-hourglass-start";case"testing":return"fa-spinner fa-spin";case"success":return"fa-check-circle";case"error":return"fa-exclamation-circle";default:return"fa-question-circle"}}),E=j(()=>{switch(d.value){case"idle":return"text-gray-500 dark:text-gray-400";case"testing":return"text-blue-500 dark:text-blue-400";case"success":return"text-green-500 dark:text-green-400";case"error":return"text-red-500 dark:text-red-400";default:return"text-gray-500 dark:text-gray-400"}}),H=j(()=>{switch(d.value){case"idle":return"text-gray-700 dark:text-gray-300";case"testing":return"text-blue-700 dark:text-blue-300";case"success":return"text-green-700 dark:text-green-300";case"error":return"text-red-700 dark:text-red-300";default:return"text-gray-700 dark:text-gray-300"}});async function V(){if(!s.apiKeyValue)return;d.value="testing",x.value="",m.value="",y.value=0,_.value=Date.now(),A.value&&A.value.abort(),A.value=new AbortController;const D=`${wt}/apiStats/api-key/test`;try{const $=await fetch(D,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:s.apiKeyValue,model:f.value}),signal:A.value.signal});if(!$.ok){const z=await $.json().catch(()=>({}));throw new Error(z.message||z.error||`HTTP ${$.status}`)}const U=$.body.getReader(),S=new TextDecoder;let G=!1;for(;!G;){const{done:z,value:Y}=await U.read();if(z){G=!0;continue}const o=S.decode(Y).split(`
`);for(const a of o)if(a.startsWith("data: "))try{const g=JSON.parse(a.substring(6));W(g)}catch{}}}catch($){if($.name==="AbortError")return;d.value="error",m.value=$.message||"连接失败",y.value=Date.now()-_.value}}function W(D){switch(D.type){case"test_start":break;case"content":x.value+=D.text;break;case"message_stop":break;case"test_complete":y.value=Date.now()-_.value,D.success?d.value="success":(d.value="error",m.value=D.error||"测试失败");break;case"error":d.value="error",m.value=D.error||"未知错误",y.value=Date.now()-_.value;break}}function B(){d.value!=="testing"&&(A.value&&(A.value.abort(),A.value=null),d.value="idle",x.value="",m.value="",y.value=0,p("close"))}return ft(()=>s.show,D=>{D&&(d.value="idle",x.value="",m.value="",y.value=0)}),yt(()=>{A.value&&A.value.abort()}),(D,$)=>(l(),ot(bt,{to:"body"},[N.show?(l(),n("div",Pr,[t("div",{class:"absolute inset-0",onClick:B}),t("div",Ir,[t("div",Mr,[t("div",Dr,[t("div",{class:P(["flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-xl text-white shadow-lg",d.value==="success"?"bg-gradient-to-br from-green-500 to-emerald-500":d.value==="error"?"bg-gradient-to-br from-red-500 to-pink-500":"bg-gradient-to-br from-blue-500 to-indigo-500"])},[t("i",{class:P(["fas",d.value==="idle"?"fa-vial":d.value==="testing"?"fa-spinner fa-spin":d.value==="success"?"fa-check":"fa-times"])},null,2)],2),t("div",null,[$[0]||($[0]=t("h3",{class:"text-lg font-semibold text-gray-900 dark:text-gray-100"}," API Key 端点测试 ",-1)),t("p",qr,r(T.value),1)])]),t("button",{class:"flex h-9 w-9 items-center justify-center rounded-full bg-gray-100 text-gray-500 transition hover:bg-gray-200 hover:text-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200",disabled:d.value==="testing",onClick:B},$[1]||($[1]=[t("i",{class:"fas fa-times text-sm"},null,-1)]),8,jr)]),t("div",Ur,[t("div",Rr,[$[3]||($[3]=t("label",{class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"}," API Key ",-1)),t("div",Nr,[t("input",{class:"w-full rounded-lg border border-gray-200 bg-gray-50 px-3 py-2 pr-10 text-sm text-gray-700 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",readonly:"",type:"text",value:O.value},null,8,Or),$[2]||($[2]=t("div",{class:"absolute right-2 top-1/2 -translate-y-1/2 text-gray-400"},[t("i",{class:"fas fa-lock text-xs"})],-1))]),$[4]||($[4]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 测试将使用此 API Key 调用当前服务的 /api 端点 ",-1))]),t("div",Er,[$[6]||($[6]=t("div",{class:"flex items-center justify-between text-sm"},[t("span",{class:"text-gray-500 dark:text-gray-400"},"测试端点"),t("span",{class:"inline-flex items-center gap-1.5 rounded-full bg-blue-100 px-2.5 py-0.5 text-xs font-medium text-blue-700 dark:bg-blue-500/20 dark:text-blue-300"},[t("i",{class:"fas fa-link"}),b(" /api/v1/messages ")])],-1)),t("div",Fr,[$[5]||($[5]=t("span",{class:"text-gray-500 dark:text-gray-400"},"测试模型",-1)),t("span",Wr,r(f.value),1)]),$[7]||($[7]=t("div",{class:"flex items-center justify-between text-sm"},[t("span",{class:"text-gray-500 dark:text-gray-400"},"模拟客户端"),t("span",{class:"font-medium text-gray-700 dark:text-gray-300"},"Claude Code")],-1))]),t("div",{class:P(["mb-4 rounded-xl border p-4 transition-all duration-300",u.value])},[t("div",Br,[t("div",{class:P(["flex h-8 w-8 items-center justify-center rounded-lg",i.value])},[t("i",{class:P(["fas text-sm",I.value,E.value])},null,2)],2),t("div",null,[t("p",{class:P(["font-medium",H.value])},r(w.value),3),t("p",Vr,r(h.value),1)])])],2),d.value!=="idle"?(l(),n("div",zr,[t("div",Jr,[$[8]||($[8]=t("span",{class:"text-xs font-medium text-gray-600 dark:text-gray-400"},"AI 响应",-1)),x.value?(l(),n("span",Yr,r(x.value.length)+" 字符 ",1)):K("",!0)]),t("div",Hr,[x.value?(l(),n("p",Gr,[b(r(x.value)+" ",1),d.value==="testing"?(l(),n("span",Qr)):K("",!0)])):d.value==="testing"?(l(),n("p",Xr,$[9]||($[9]=[t("i",{class:"fas fa-circle-notch fa-spin"},null,-1),b(" 等待响应中... ",-1)]))):d.value==="error"&&m.value?(l(),n("p",Zr,r(m.value),1)):K("",!0)])])):K("",!0),y.value>0?(l(),n("div",tl,[$[10]||($[10]=t("i",{class:"fas fa-clock"},null,-1)),t("span",null,"耗时 "+r((y.value/1e3).toFixed(2))+" 秒",1)])):K("",!0)]),t("div",el,[t("button",{class:"rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition hover:bg-gray-50 hover:shadow dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700",disabled:d.value==="testing",onClick:B}," 关闭 ",8,sl),t("button",{class:P(["flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium shadow-sm transition",d.value==="testing"||!N.apiKeyValue?"cursor-not-allowed bg-gray-200 text-gray-400 dark:bg-gray-700 dark:text-gray-500":"bg-gradient-to-r from-blue-500 to-indigo-500 text-white hover:from-blue-600 hover:to-indigo-600 hover:shadow-md"]),disabled:d.value==="testing"||!N.apiKeyValue,onClick:V},[t("i",{class:P(["fas",d.value==="testing"?"fa-spinner fa-spin":"fa-play"])},null,2),b(" "+r(d.value==="testing"?"测试中...":d.value==="idle"?"开始测试":"重新测试"),1)],10,al)])])])):K("",!0)]))}},ll={class:"glass-strong mb-6 rounded-3xl p-4 shadow-xl md:mb-8 md:p-6"},il={class:"flex flex-col items-center justify-between gap-4 md:flex-row"},ol={class:"flex items-center gap-2 md:gap-4"},nl={class:"flex items-center"},dl={key:0,class:"h-8 w-px bg-gradient-to-b from-transparent via-gray-300 to-transparent opacity-50 dark:via-gray-600"},ul={class:"mb-6 md:mb-8"},cl={class:"flex justify-center"},ml={class:"inline-flex w-full max-w-md rounded-full border border-white/20 bg-white/10 p-1 shadow-lg backdrop-blur-xl md:w-auto"},gl={key:0,class:"tab-content"},xl={key:0,class:"mb-6 md:mb-8"},fl={class:"rounded-xl border border-red-500/30 bg-red-500/20 p-3 text-sm text-red-800 backdrop-blur-sm dark:border-red-500/20 dark:bg-red-500/10 dark:text-red-200 md:p-4 md:text-base"},yl={key:1,class:"fade-in"},pl={class:"glass-strong rounded-3xl p-4 shadow-xl md:p-6"},vl={class:"mb-4 border-b border-gray-200 pb-4 dark:border-gray-700 md:mb-6 md:pb-6"},bl={class:"flex flex-col items-start justify-between gap-3 md:flex-row md:items-center md:gap-4"},kl={class:"flex w-full items-center gap-2 md:w-auto"},hl=["disabled"],_l=["disabled"],wl=["disabled"],$l={class:"mb-6 mt-6 grid grid-cols-1 gap-4 md:mb-8 md:mt-8 md:gap-6 xl:grid-cols-2 xl:items-stretch"},Sl={key:1,class:"tab-content"},Cl={class:"glass-strong rounded-3xl shadow-xl"},Tl={__name:"ApiStatsView",setup(N){const v=ht(),s=at(),p=$t(),d=M("stats"),x=j(()=>p.isDarkMode),{apiKey:m,apiId:y,loading:_,modelStatsLoading:A,oemLoading:f,error:T,statsPeriod:O,statsData:w,oemSettings:h,multiKeyMode:u}=et(s),{queryStats:i,switchPeriod:I,loadStatsWithApiId:E,loadOemSettings:H,reset:V}=s,W=M(!1),B=()=>{W.value=!0},D=()=>{W.value=!1},$=U=>{(U.ctrlKey||U.metaKey)&&U.key==="Enter"&&(!_.value&&m.value.trim()&&i(),U.preventDefault()),U.key==="Escape"&&V()};return kt(()=>{p.initTheme(),H();const U=v.query.apiId,S=v.query.apiKey;U&&U.match(/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i)?(y.value=U,E()):S&&S.length>10&&(m.value=S),document.addEventListener("keydown",$)}),yt(()=>{document.removeEventListener("keydown",$)}),ft(m,U=>{U||s.clearData()}),(U,S)=>{var z;const G=_t("router-link");return l(),n("div",{class:P(["min-h-screen p-4 md:p-6",x.value?"gradient-bg-dark":"gradient-bg"])},[t("div",ll,[t("div",il,[X(St,{loading:e(f),"logo-src":e(h).siteIconData||e(h).siteIcon,subtitle:d.value==="stats"?"API Key 使用统计":"使用教程",title:e(h).siteName},null,8,["loading","logo-src","subtitle","title"]),t("div",ol,[t("div",nl,[X(Ct,{mode:"dropdown"})]),e(h).ldapEnabled||e(h).showAdminButton!==!1?(l(),n("div",dl)):K("",!0),e(h).ldapEnabled?(l(),ot(G,{key:1,class:"user-login-button flex items-center gap-2 rounded-2xl px-4 py-2 text-white transition-all duration-300 md:px-5 md:py-2.5",to:"/user-login"},{default:xt(()=>S[4]||(S[4]=[t("i",{class:"fas fa-user text-sm md:text-base"},null,-1),t("span",{class:"text-xs font-semibold tracking-wide md:text-sm"},"用户登录",-1)])),_:1,__:[4]})):K("",!0),e(h).showAdminButton!==!1?(l(),ot(G,{key:2,class:"admin-button-refined flex items-center gap-2 rounded-2xl px-4 py-2 transition-all duration-300 md:px-5 md:py-2.5",to:"/dashboard"},{default:xt(()=>S[5]||(S[5]=[t("i",{class:"fas fa-shield-alt text-sm md:text-base"},null,-1),t("span",{class:"text-xs font-semibold tracking-wide md:text-sm"},"管理后台",-1)])),_:1,__:[5]})):K("",!0)])])]),t("div",ul,[t("div",cl,[t("div",ml,[t("button",{class:P(["tab-pill-button",d.value==="stats"?"active":""]),onClick:S[0]||(S[0]=Y=>d.value="stats")},S[6]||(S[6]=[t("i",{class:"fas fa-chart-line mr-1 md:mr-2"},null,-1),t("span",{class:"text-sm md:text-base"},"统计查询",-1)]),2),t("button",{class:P(["tab-pill-button",d.value==="tutorial"?"active":""]),onClick:S[1]||(S[1]=Y=>d.value="tutorial")},S[7]||(S[7]=[t("i",{class:"fas fa-graduation-cap mr-1 md:mr-2"},null,-1),t("span",{class:"text-sm md:text-base"},"使用教程",-1)]),2)])])]),d.value==="stats"?(l(),n("div",gl,[X(Gt),e(T)?(l(),n("div",xl,[t("div",fl,[S[8]||(S[8]=t("i",{class:"fas fa-exclamation-triangle mr-2"},null,-1)),b(" "+r(e(T)),1)])])):K("",!0),e(w)?(l(),n("div",yl,[t("div",pl,[t("div",vl,[t("div",bl,[S[12]||(S[12]=t("div",{class:"flex items-center gap-2 md:gap-3"},[t("i",{class:"fas fa-clock text-base text-blue-500 md:text-lg"}),t("span",{class:"text-base font-medium text-gray-700 dark:text-gray-200 md:text-lg"},"统计时间范围")],-1)),t("div",kl,[t("button",{class:P(["flex flex-1 items-center justify-center gap-1 px-4 py-2 text-xs font-medium md:flex-none md:gap-2 md:px-6 md:text-sm",["period-btn",{active:e(O)==="daily"}]]),disabled:e(_)||e(A),onClick:S[2]||(S[2]=Y=>e(I)("daily"))},S[9]||(S[9]=[t("i",{class:"fas fa-calendar-day text-xs md:text-sm"},null,-1),b(" 今日 ",-1)]),10,hl),t("button",{class:P(["flex flex-1 items-center justify-center gap-1 px-4 py-2 text-xs font-medium md:flex-none md:gap-2 md:px-6 md:text-sm",["period-btn",{active:e(O)==="monthly"}]]),disabled:e(_)||e(A),onClick:S[3]||(S[3]=Y=>e(I)("monthly"))},S[10]||(S[10]=[t("i",{class:"fas fa-calendar-alt text-xs md:text-sm"},null,-1),b(" 本月 ",-1)]),10,_l),e(u)?K("",!0):(l(),n("button",{key:0,class:"test-btn flex items-center justify-center gap-1 px-4 py-2 text-xs font-medium md:gap-2 md:px-6 md:text-sm",disabled:e(_),onClick:B},S[11]||(S[11]=[t("i",{class:"fas fa-vial text-xs md:text-sm"},null,-1),b(" 测试 ",-1)]),8,wl))])])]),X(fs),t("div",$l,[X(Ms,{class:"h-full"}),e(u)?(l(),ot(lr,{key:0,class:"h-full"})):(l(),ot(Ba,{key:1,class:"h-full"}))]),X(Lr)])])):K("",!0)])):K("",!0),d.value==="tutorial"?(l(),n("div",Sl,[t("div",Cl,[X(At)])])):K("",!0),X(rl,{"api-key-name":((z=e(w))==null?void 0:z.name)||"","api-key-value":e(m),show:W.value,onClose:D},null,8,["api-key-name","api-key-value","show"])],2)}}},jl=st(Tl,[["__scopeId","data-v-c1f23841"]]);export{jl as default};