mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 00:53:33 +00:00
6 lines
48 KiB
JavaScript
6 lines
48 KiB
JavaScript
import{aP as xt,r as T,c as O,aX as F,x as l,y as r,z as t,O as b,L as $,P as i,u as e,C as q,K as et,aq as st,aa as at,f as rt,Y as gt,Q as J,ac as z,B as Q,R as E,q as yt,aW as ft,V as pt,o as bt,I as H,J as it,av as vt}from"./vue-vendor-Bsazo-x0.js";import{_ as N,a as kt}from"./index-C8PxKE-x.js";import{L as _t}from"./LogoTitle-c3Vjhi5m.js";import{T as ht}from"./ThemeToggle-DBjrUahs.js";import{b as wt}from"./vendor-Dr8jvgFu.js";import{_ as $t}from"./WindowCountdown-BTXjZ8Dc.js";import St from"./TutorialView-DuOoowXJ.js";import"./element-plus-CqiD73Lu.js";class Ct{constructor(){this.baseURL=window.location.origin,this.isDev=!1}async request(g,s={}){try{this.isDev&&g.startsWith("/admin")&&(g="/webapi"+g);const x=await fetch(`${this.baseURL}${g}`,{headers:{"Content-Type":"application/json",...s.headers},...s}),u=await x.json();if(!x.ok)throw new Error(u.message||`请求失败: ${x.status}`);return u}catch(x){throw console.error("API Stats request error:",x),x}}async getKeyId(g){return this.request("/apiStats/api/get-key-id",{method:"POST",body:JSON.stringify({apiKey:g})})}async getUserStats(g){return this.request("/apiStats/api/user-stats",{method:"POST",body:JSON.stringify({apiId:g})})}async getUserModelStats(g,s="daily"){return this.request("/apiStats/api/user-model-stats",{method:"POST",body:JSON.stringify({apiId:g,period:s})})}async getOemSettings(){try{return await this.request("/admin/oem-settings")}catch(g){return console.error("Failed to load OEM settings:",g),{success:!0,data:{siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}}}async getBatchStats(g){return this.request("/apiStats/api/batch-stats",{method:"POST",body:JSON.stringify({apiIds:g})})}async getBatchModelStats(g,s="daily"){return this.request("/apiStats/api/batch-model-stats",{method:"POST",body:JSON.stringify({apiIds:g,period:s})})}}const R=new Ct,B=xt("apistats",()=>{const A=T(""),g=T(null),s=T(!1),x=T(!1),u=T(!0),y=T(""),m=T("daily"),p=T(null),_=T([]),K=T(null),c=T(null),w=T({siteName:"",siteIcon:"",siteIconData:""}),L=T(!1),d=T([]),a=T([]),v=T(null),S=T([]),f=T([]),n=O(()=>{const o={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};return L.value&&v.value?m.value==="daily"?v.value.dailyUsage||o:v.value.monthlyUsage||o:m.value==="daily"?K.value||o:c.value||o}),P=O(()=>{if(!p.value||!n.value)return{tokenUsage:0,costUsage:0,requestUsage:0};const o=n.value,k=p.value.limits;return{tokenUsage:k.tokenLimit>0?Math.min(o.allTokens/k.tokenLimit*100,100):0,costUsage:k.dailyCostLimit>0?Math.min(o.cost/k.dailyCostLimit*100,100):0,requestUsage:k.rateLimitRequests>0?Math.min(o.requests/k.rateLimitRequests*100,100):0}});async function D(){if(L.value)return X();if(!A.value.trim()){y.value="请输入 API Key";return}s.value=!0,y.value="",p.value=null,_.value=[],g.value=null;try{const o=await R.getKeyId(A.value);if(o.success){g.value=o.data.id;const k=await R.getUserStats(g.value);if(k.success)p.value=k.data,await V(),y.value="",nt();else throw new Error(k.message||"查询失败")}else throw new Error(o.message||"获取 API Key ID 失败")}catch(o){console.error("Query stats error:",o),y.value=o.message||"查询统计数据失败,请检查您的 API Key 是否正确",p.value=null,_.value=[],g.value=null}finally{s.value=!1}}async function V(){g.value&&(await Promise.all([I("daily"),I("monthly")]),await h(m.value))}async function I(o){try{const k=await R.getUserModelStats(g.value,o);if(k.success){const C=k.data||[],j={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};C.forEach(M=>{var U;j.requests+=M.requests||0,j.inputTokens+=M.inputTokens||0,j.outputTokens+=M.outputTokens||0,j.cacheCreateTokens+=M.cacheCreateTokens||0,j.cacheReadTokens+=M.cacheReadTokens||0,j.allTokens+=M.allTokens||0,j.cost+=((U=M.costs)==null?void 0:U.total)||0}),j.formattedCost=ot(j.cost),o==="daily"?K.value=j:c.value=j}else console.warn(`Failed to load ${o} stats:`,k.message)}catch(k){console.error(`Load ${o} stats error:`,k)}}async function h(o="daily"){if(g.value){x.value=!0;try{const k=await R.getUserModelStats(g.value,o);if(k.success)_.value=k.data||[];else throw new Error(k.message||"加载模型统计失败")}catch(k){console.error("Load model stats error:",k),_.value=[]}finally{x.value=!1}}}async function Y(o){if(!(m.value===o||x.value)){if(m.value=o,L.value&&a.value.length>0){await G(o);return}(o==="daily"&&!K.value||o==="monthly"&&!c.value)&&await I(o),await h(o)}}async function W(){var o,k;if(g.value){s.value=!0,y.value="",p.value=null,_.value=[];try{const C=await R.getUserStats(g.value);if(C.success)p.value=C.data,console.log("API Stats - Full response:",C.data),console.log("API Stats - limits data:",C.data.limits),console.log("API Stats - weeklyOpusCostLimit:",(o=C.data.limits)==null?void 0:o.weeklyOpusCostLimit),console.log("API Stats - weeklyOpusCost:",(k=C.data.limits)==null?void 0:k.weeklyOpusCost),await V(),y.value="";else throw new Error(C.message||"查询失败")}catch(C){console.error("Load stats with apiId error:",C),y.value=C.message||"查询统计数据失败",p.value=null,_.value=[]}finally{s.value=!1}}}async function lt(){u.value=!0;try{const o=await R.getOemSettings();o&&o.success&&o.data&&(w.value={...w.value,...o.data})}catch(o){console.error("Error loading OEM settings:",o),w.value={siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}finally{u.value=!1}}function ot(o){return typeof o!="number"||o===0?"$0.000000":o>=1?"$"+o.toFixed(2):o>=.01?"$"+o.toFixed(4):"$"+o.toFixed(6)}function nt(){if(g.value){const o=new URL(window.location);o.searchParams.set("apiId",g.value),window.history.pushState({},"",o)}}async function X(){const o=dt();if(o.length===0){y.value="请输入至少一个有效的 API Key";return}s.value=!0,y.value="",v.value=null,S.value=[],f.value=[],_.value=[],d.value=o,a.value=[];try{const k=await Promise.allSettled(o.map(U=>R.getKeyId(U))),C=[],j=[];if(k.forEach((U,tt)=>{U.status==="fulfilled"&&U.value.success?(C.push(U.value.data.id),j.push(o[tt])):f.value.push(o[tt])}),C.length===0)throw new Error("所有 API Key 都无效");a.value=C,d.value=j;const M=await R.getBatchStats(C);if(M.success)v.value=M.data.aggregated,S.value=M.data.individual,p.value=M.data.aggregated,K.value=M.data.aggregated.dailyUsage||null,c.value=M.data.aggregated.monthlyUsage||null,await G(m.value),mt();else throw new Error(M.message||"批量查询失败")}catch(k){console.error("Batch query error:",k),y.value=k.message||"批量查询统计数据失败",v.value=null,S.value=[]}finally{s.value=!1}}async function G(o="daily"){if(a.value.length!==0){x.value=!0;try{const k=await R.getBatchModelStats(a.value,o);if(k.success)_.value=k.data||[];else throw new Error(k.message||"加载批量模型统计失败")}catch(k){console.error("Load batch model stats error:",k),_.value=[]}finally{x.value=!1}}}function dt(){if(!A.value)return[];const o=A.value.split(/[,\n]+/).map(C=>C.trim()).filter(C=>C.length>0);return[...new Set(o)].slice(0,30)}function mt(){if(a.value.length>0){const o=new URL(window.location);o.searchParams.set("apiIds",a.value.join(",")),o.searchParams.set("batch","true"),window.history.pushState({},"",o)}}function ut(){A.value=""}function Z(){p.value=null,_.value=[],K.value=null,c.value=null,y.value="",m.value="daily",g.value=null,d.value=[],a.value=[],v.value=null,S.value=[],f.value=[]}function ct(){A.value="",L.value=!1,Z()}return{apiKey:A,apiId:g,loading:s,modelStatsLoading:x,oemLoading:u,error:y,statsPeriod:m,statsData:p,modelStats:_,dailyStats:K,monthlyStats:c,oemSettings:w,multiKeyMode:L,apiKeys:d,apiIds:a,aggregatedStats:v,individualStats:S,invalidKeys:f,currentPeriodData:n,usagePercentages:P,queryStats:D,queryBatchStats:X,loadAllPeriodStats:V,loadPeriodStats:I,loadModelStats:h,loadBatchModelStats:G,switchPeriod:Y,loadStatsWithApiId:W,loadOemSettings:lt,clearData:Z,clearInput:ut,reset:ct}}),Kt={class:"api-input-wide-card mb-8 rounded-3xl p-6 shadow-xl"},Tt={class:"mx-auto max-w-4xl"},It={class:"control-bar mb-4 flex flex-wrap items-center justify-between gap-3"},Lt={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},Pt={class:"button-group flex items-center gap-2"},At={class:"mode-switch-group flex items-center rounded-lg bg-gray-100 p-1 dark:bg-gray-800"},Mt={key:0,class:"ml-1 rounded-full bg-white/20 px-1.5 py-0.5 text-xs font-semibold"},jt={class:"api-input-grid grid grid-cols-1 gap-4 lg:grid-cols-4"},qt={class:"lg:col-span-3"},Dt=["disabled"],Rt={key:1,class:"relative"},Ot=["disabled"],Ut={class:"lg:col-span-1"},Et=["disabled"],Ft={key:0,class:"fas fa-spinner loading-spinner"},Nt={key:1,class:"fas fa-search"},Bt={class:"security-notice mt-4"},Vt={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"},Wt={__name:"ApiKeyInput",setup(A){const g=B(),{apiKey:s,loading:x,multiKeyMode:u}=F(g),{queryStats:y,clearInput:m}=g,p=O(()=>{if(!u.value||!s.value)return[];const K=s.value.split(/[,\n]+/).map(w=>w.trim()).filter(w=>w.length>0);return[...new Set(K)].slice(0,30)}),_=O(()=>u.value?p.value.length>0:s.value&&s.value.trim().length>0);return(K,c)=>(r(),l("div",Kt,[c[15]||(c[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",Tt,[t("div",It,[t("label",Lt,[c[8]||(c[8]=t("i",{class:"fas fa-key mr-2"},null,-1)),b(" "+i(e(u)?"输入您的 API Keys(每行一个或用逗号分隔)":"输入您的 API Key"),1)]),t("div",Pt,[t("div",At,[t("button",{class:q(["mode-switch-btn",{active:!e(u)}]),title:"单一模式",onClick:c[0]||(c[0]=w=>u.value=!1)},c[9]||(c[9]=[t("i",{class:"fas fa-key"},null,-1),t("span",{class:"ml-2 hidden sm:inline"},"单一",-1)]),2),t("button",{class:q(["mode-switch-btn",{active:e(u)}]),title:"聚合模式",onClick:c[1]||(c[1]=w=>u.value=!0)},[c[10]||(c[10]=t("i",{class:"fas fa-layer-group"},null,-1)),c[11]||(c[11]=t("span",{class:"ml-2 hidden sm:inline"},"聚合",-1)),e(u)&&p.value.length>0?(r(),l("span",Mt,i(p.value.length),1)):$("",!0)],2)])])]),t("div",jt,[t("div",qt,[e(u)?(r(),l("div",Rt,[et(t("textarea",{"onUpdate:modelValue":c[4]||(c[4]=w=>rt(s)?s.value=w:null),class:"wide-card-input w-full resize-y",disabled:e(x),placeholder:`请输入您的 API Keys,支持以下格式:
|
||
cr_xxx
|
||
cr_yyy
|
||
或
|
||
cr_xxx, cr_yyy`,rows:"4",onKeyup:c[5]||(c[5]=at(gt((...w)=>e(y)&&e(y)(...w),["ctrl"]),["enter"]))},null,40,Ot),[[st,e(s)]]),e(s)&&!e(x)?(r(),l("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:c[6]||(c[6]=(...w)=>e(m)&&e(m)(...w))},c[12]||(c[12]=[t("i",{class:"fas fa-times-circle"},null,-1)]))):$("",!0)])):et((r(),l("input",{key:0,"onUpdate:modelValue":c[2]||(c[2]=w=>rt(s)?s.value=w:null),class:"wide-card-input w-full",disabled:e(x),placeholder:"请输入您的 API Key (cr_...)",type:"password",onKeyup:c[3]||(c[3]=at((...w)=>e(y)&&e(y)(...w),["enter"]))},null,40,Dt)),[[st,e(s)]])]),t("div",Ut,[t("button",{class:"btn btn-primary btn-query flex h-full w-full items-center justify-center gap-2",disabled:e(x)||!_.value,onClick:c[7]||(c[7]=(...w)=>e(y)&&e(y)(...w))},[e(x)?(r(),l("i",Ft)):(r(),l("i",Nt)),b(" "+i(e(x)?"查询中...":"查询统计"),1)],8,Et)])]),t("div",Bt,[c[13]||(c[13]=t("i",{class:"fas fa-shield-alt mr-2"},null,-1)),b(" "+i(e(u)?"您的 API Keys 仅用于查询统计数据,不会被存储。聚合模式下部分个体化信息将不显示。":"您的 API Key 仅用于查询自己的统计数据,不会被存储或用于其他用途"),1)]),e(u)?(r(),l("div",Vt,c[14]||(c[14]=[t("i",{class:"fas fa-lightbulb mr-2"},null,-1),t("span",null,"提示:最多支持同时查询 30 个 API Keys。使用 Ctrl+Enter 快速查询。",-1)]))):$("",!0)])]))}},Jt=N(Wt,[["__scopeId","data-v-11e74200"]]),zt={class:"mb-6 grid grid-cols-1 gap-4 md:mb-8 md:gap-6 lg:grid-cols-2"},Yt={class:"card p-4 md:p-6"},Ht={class:"mb-3 flex items-center text-lg font-bold text-gray-900 dark:text-gray-100 md:mb-4 md:text-xl"},Qt={key:0,class:"space-y-2 md:space-y-3"},Gt={class:"flex items-center justify-between"},Xt={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},Zt={class:"flex items-center justify-between"},te={class:"text-sm font-medium text-green-600 md:text-base"},ee={key:0,class:"flex items-center justify-between"},se={class:"text-sm font-medium text-red-600 md:text-base"},ae={class:"flex items-center justify-between"},re={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},ie={class:"flex items-center justify-between"},le={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},oe={class:"flex items-center justify-between"},ne={class:"text-sm font-medium text-indigo-600 md:text-base"},de={key:1,class:"border-t border-gray-200 pt-2 dark:border-gray-700"},me={class:"space-y-1"},ue={class:"truncate text-gray-600 dark:text-gray-400"},ce={class:"text-gray-900 dark:text-gray-100"},xe={key:1,class:"space-y-2 md:space-y-3"},ge={class:"flex items-center justify-between"},ye={class:"break-all text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},fe={class:"flex items-center justify-between"},pe={class:"flex items-center justify-between"},be={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},ve={class:"flex items-center justify-between"},ke={class:"break-all text-xs font-medium text-gray-900 dark:text-gray-100 md:text-base"},_e={class:"flex items-start justify-between"},he={key:0,class:"text-sm font-medium text-amber-600 dark:text-amber-500 md:text-base"},we={class:"ml-1 text-xs text-gray-500 dark:text-gray-400"},$e={key:1,class:"text-right"},Se={key:0,class:"text-sm font-medium text-red-600 md:text-base"},Ce={key:1,class:"break-all text-xs font-medium text-orange-600 md:text-base"},Ke={key:2,class:"break-all text-xs font-medium text-gray-900 dark:text-gray-100 md:text-base"},Te={key:2,class:"text-sm font-medium text-gray-400 dark:text-gray-500 md:text-base"},Ie={class:"card p-4 md:p-6"},Le={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"},Pe={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},Ae={class:"grid grid-cols-2 gap-3 md:gap-4"},Me={class:"stat-card text-center"},je={class:"text-lg font-bold text-green-600 md:text-3xl"},qe={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},De={class:"stat-card text-center"},Re={class:"text-lg font-bold text-blue-600 md:text-3xl"},Oe={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},Ue={class:"stat-card text-center"},Ee={class:"text-lg font-bold text-purple-600 md:text-3xl"},Fe={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},Ne={class:"stat-card text-center"},Be={class:"text-lg font-bold text-yellow-600 md:text-3xl"},Ve={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},We={__name:"StatsOverview",setup(A){const g=B(),{statsData:s,statsPeriod:x,currentPeriodData:u,multiKeyMode:y,aggregatedStats:m,individualStats:p,invalidKeys:_}=F(g),K=O(()=>!p.value||p.value.length===0?[]:[...p.value].sort((f,n)=>{var P,D;return(((P=n.usage)==null?void 0:P.allTokens)||0)-(((D=f.usage)==null?void 0:D.allTokens)||0)}).slice(0,3)),c=f=>{var P;return!m.value||!m.value.usage.allTokens?0:((((P=f.usage)==null?void 0:P.allTokens)||0)/m.value.usage.allTokens*100).toFixed(1)},w=f=>{if(!f)return"无";try{return wt(f).format("YYYY年MM月DD日 HH:mm")}catch{return"格式错误"}},L=f=>f?new Date(f).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",d=f=>f?new Date(f)<new Date:!1,a=f=>{if(!f)return!1;const D=(new Date(f)-new Date)/(1e3*60*60*24);return D>0&&D<=7},v=f=>(typeof f!="number"&&(f=parseInt(f)||0),f===0?"0":f>=1e6?(f/1e6).toFixed(1)+"M":f>=1e3?(f/1e3).toFixed(1)+"K":f.toLocaleString()),S=f=>({claude:"Claude",gemini:"Gemini",all:"全部模型"})[f]||f||"未知";return(f,n)=>(r(),l("div",zt,[t("div",Yt,[t("h3",Ht,[t("i",{class:q(["mr-2 text-sm md:mr-3 md:text-base",e(y)?"fas fa-layer-group text-purple-500":"fas fa-info-circle text-blue-500"])},null,2),b(" "+i(e(y)?"批量查询概要":"API Key 信息"),1)]),e(y)&&e(m)?(r(),l("div",Qt,[t("div",Gt,[n[0]||(n[0]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"查询 Keys 数",-1)),t("span",Xt,i(e(m).totalKeys)+" 个 ",1)]),t("div",Zt,[n[2]||(n[2]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"有效 Keys 数",-1)),t("span",te,[n[1]||(n[1]=t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1)),b(" "+i(e(m).activeKeys)+" 个 ",1)])]),e(_).length>0?(r(),l("div",ee,[n[4]||(n[4]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"无效 Keys 数",-1)),t("span",se,[n[3]||(n[3]=t("i",{class:"fas fa-times-circle mr-1 text-xs md:text-sm"},null,-1)),b(" "+i(e(_).length)+" 个 ",1)])])):$("",!0),t("div",ae,[n[5]||(n[5]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"总请求数",-1)),t("span",re,i(v(e(m).usage.requests)),1)]),t("div",ie,[n[6]||(n[6]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"总 Token 数",-1)),t("span",le,i(v(e(m).usage.allTokens)),1)]),t("div",oe,[n[7]||(n[7]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"总费用",-1)),t("span",ne,i(e(m).usage.formattedCost),1)]),e(p).length>1?(r(),l("div",de,[n[8]||(n[8]=t("div",{class:"mb-2 text-xs text-gray-500 dark:text-gray-400"},"各 Key 贡献占比",-1)),t("div",me,[(r(!0),l(J,null,z(K.value,P=>(r(),l("div",{key:P.apiId,class:"flex items-center justify-between text-xs"},[t("span",ue,i(P.name),1),t("span",ce,i(c(P))+"%",1)]))),128))])])):$("",!0)])):(r(),l("div",xe,[t("div",ge,[n[9]||(n[9]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"名称",-1)),t("span",ye,i(e(s).name),1)]),t("div",fe,[n[10]||(n[10]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"状态",-1)),t("span",{class:q(["text-sm font-medium md:text-base",e(s).isActive?"text-green-600":"text-red-600"])},[t("i",{class:q(["mr-1 text-xs md:text-sm",e(s).isActive?"fas fa-check-circle":"fas fa-times-circle"])},null,2),b(" "+i(e(s).isActive?"活跃":"已停用"),1)],2)]),t("div",pe,[n[11]||(n[11]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"权限",-1)),t("span",be,i(S(e(s).permissions)),1)]),t("div",ve,[n[12]||(n[12]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"创建时间",-1)),t("span",ke,i(w(e(s).createdAt)),1)]),t("div",_e,[n[18]||(n[18]=t("span",{class:"mt-1 flex-shrink-0 text-sm text-gray-600 dark:text-gray-400 md:text-base"},"过期时间",-1)),e(s).expirationMode==="activation"&&!e(s).isActivated?(r(),l("div",he,[n[13]||(n[13]=t("i",{class:"fas fa-pause-circle mr-1 text-xs md:text-sm"},null,-1)),n[14]||(n[14]=b(" 未激活 ",-1)),t("span",we,"(首次使用后"+i(e(s).activationDays||30)+"天过期)",1)])):e(s).expiresAt?(r(),l("div",$e,[d(e(s).expiresAt)?(r(),l("div",Se,n[15]||(n[15]=[t("i",{class:"fas fa-exclamation-circle mr-1 text-xs md:text-sm"},null,-1),b(" 已过期 ",-1)]))):a(e(s).expiresAt)?(r(),l("div",Ce,[n[16]||(n[16]=t("i",{class:"fas fa-clock mr-1 text-xs md:text-sm"},null,-1)),b(" "+i(L(e(s).expiresAt)),1)])):(r(),l("div",Ke,i(L(e(s).expiresAt)),1))])):(r(),l("div",Te,n[17]||(n[17]=[t("i",{class:"fas fa-infinity mr-1 text-xs md:text-sm"},null,-1),b(" 永不过期 ",-1)])))])]))]),t("div",Ie,[t("h3",Le,[n[19]||(n[19]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-chart-bar mr-2 text-sm text-green-500 md:mr-3 md:text-base"}),b(" 使用统计概览 ")],-1)),t("span",Pe,"("+i(e(x)==="daily"?"今日":"本月")+")",1)]),t("div",Ae,[t("div",Me,[t("div",je,i(v(e(u).requests)),1),t("div",qe,i(e(x)==="daily"?"今日":"本月")+"请求数 ",1)]),t("div",De,[t("div",Re,i(v(e(u).allTokens)),1),t("div",Oe,i(e(x)==="daily"?"今日":"本月")+"Token数 ",1)]),t("div",Ue,[t("div",Ee,i(e(u).formattedCost||"$0.000000"),1),t("div",Fe,i(e(x)==="daily"?"今日":"本月")+"费用 ",1)]),t("div",Ne,[t("div",Be,i(v(e(u).inputTokens)),1),t("div",Ve,i(e(x)==="daily"?"今日":"本月")+"输入Token ",1)])])])]))}},Je=N(We,[["__scopeId","data-v-9fc7e5f7"]]),ze={class:"card p-4 md:p-6"},Ye={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"},He={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},Qe={class:"space-y-2 md:space-y-3"},Ge={class:"flex items-center justify-between"},Xe={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},Ze={class:"flex items-center justify-between"},ts={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},es={class:"flex items-center justify-between"},ss={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},as={class:"flex items-center justify-between"},rs={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},is={class:"mt-3 border-t border-gray-200 pt-3 dark:border-gray-700 md:mt-4 md:pt-4"},ls={class:"flex items-center justify-between font-bold text-gray-900 dark:text-gray-100"},os={class:"text-sm md:text-base"},ns={class:"text-lg md:text-xl"},ds={__name:"TokenDistribution",setup(A){const g=B(),{statsPeriod:s,currentPeriodData:x}=F(g),u=y=>(typeof y!="number"&&(y=parseInt(y)||0),y===0?"0":y>=1e6?(y/1e6).toFixed(1)+"M":y>=1e3?(y/1e3).toFixed(1)+"K":y.toLocaleString());return(y,m)=>(r(),l("div",ze,[t("h3",Ye,[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",He,"("+i(e(s)==="daily"?"今日":"本月")+")",1)]),t("div",Qe,[t("div",Ge,[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",Xe,i(u(e(x).inputTokens)),1)]),t("div",Ze,[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",ts,i(u(e(x).outputTokens)),1)]),t("div",es,[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,i(u(e(x).cacheCreateTokens)),1)]),t("div",as,[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",rs,i(u(e(x).cacheReadTokens)),1)])]),t("div",is,[t("div",ls,[t("span",os,i(e(s)==="daily"?"今日":"本月")+"总计",1),t("span",ns,i(u(e(x).allTokens)),1)])])]))}},ms=N(ds,[["__scopeId","data-v-ecee0a94"]]),us={class:"card p-4 md:p-6"},cs={class:"mb-3 flex items-center text-lg font-bold text-gray-900 dark:text-gray-100 md:mb-4 md:text-xl"},xs={key:0,class:"space-y-4"},gs={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"},ys={class:"mb-3 flex items-center justify-between"},fs={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"},ps={class:"grid grid-cols-2 gap-3"},bs={class:"text-center"},vs={class:"text-lg font-bold text-gray-900 dark:text-gray-100"},ks={class:"text-center"},_s={class:"text-lg font-bold text-green-600"},hs={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"},ws={class:"space-y-2"},$s={class:"flex items-center justify-between"},Ss={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},Cs={class:"flex items-center justify-between"},Ks={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},Ts={class:"flex items-center justify-between"},Is={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},Ls={key:0,class:"rounded-lg bg-red-50 p-3 text-sm dark:bg-red-900/20"},Ps={class:"text-red-700 dark:text-red-300"},As={key:1,class:"space-y-4 md:space-y-5"},Ms={class:"mb-2 flex items-center justify-between"},js={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},qs={key:0},Ds={key:1,class:"flex items-center gap-1"},Rs={key:0,class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Os={key:1,class:"h-2 w-full rounded-full bg-gray-200"},Us={class:"mb-2 flex items-center justify-between"},Es={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},Fs={key:0},Ns={key:1,class:"flex items-center gap-1"},Bs={key:0,class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Vs={key:1,class:"h-2 w-full rounded-full bg-gray-200"},Ws={key:0},Js={class:"mb-2 flex items-center justify-between"},zs={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},Ys={class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Hs={key:1},Qs={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Gs={key:0},Xs={key:1},Zs={key:2},ta={class:"space-y-2 border-t border-gray-100 pt-2 dark:border-gray-700"},ea={class:"flex items-center justify-between"},sa={class:"text-sm font-medium text-gray-900 md:text-base"},aa={key:0},ra={key:1,class:"flex items-center gap-1"},ia={class:"flex items-center justify-between"},la={class:"text-sm font-medium text-gray-900 md:text-base"},oa={key:0,class:"text-orange-600"},na={key:1,class:"text-green-600"},da={class:"flex items-center justify-between"},ma={class:"text-sm font-medium text-gray-900 md:text-base"},ua={key:0,class:"text-orange-600"},ca={key:1,class:"text-green-600"},xa={key:0,class:"card mt-4 p-4 md:mt-6 md:p-6"},ga={class:"grid grid-cols-1 gap-4 md:gap-6 lg:grid-cols-2"},ya={key:0,class:"rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20 md:p-4"},fa={class:"space-y-1 md:space-y-2"},pa={class:"break-all text-gray-800 dark:text-gray-200"},ba={key:1,class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-800 dark:bg-blue-900/20 md:p-4"},va={class:"space-y-1 md:space-y-2"},ka={class:"break-all text-gray-800 dark:text-gray-200"},_a={__name:"LimitConfig",setup(A){const g=B(),{statsData:s,multiKeyMode:x,aggregatedStats:u,invalidKeys:y}=F(g),m=()=>{if(!s.value.limits.dailyCostLimit||s.value.limits.dailyCostLimit===0)return 0;const d=s.value.limits.currentDailyCost/s.value.limits.dailyCostLimit*100;return Math.min(d,100)},p=()=>{const d=m();return d>=100?"bg-red-500":d>=80?"bg-yellow-500":"bg-green-500"},_=()=>{if(!s.value.limits.totalCostLimit||s.value.limits.totalCostLimit===0)return 0;const d=s.value.limits.currentTotalCost/s.value.limits.totalCostLimit*100;return Math.min(d,100)},K=()=>{const d=_();return d>=100?"bg-red-500":d>=80?"bg-yellow-500":"bg-blue-500"},c=()=>{if(!s.value.limits.weeklyOpusCostLimit||s.value.limits.weeklyOpusCostLimit===0)return 0;const d=s.value.limits.weeklyOpusCost/s.value.limits.weeklyOpusCostLimit*100;return Math.min(d,100)},w=()=>{const d=c();return d>=100?"bg-red-500":d>=80?"bg-yellow-500":"bg-indigo-500"},L=d=>(typeof d!="number"&&(d=parseInt(d)||0),d===0?"0":d>=1e6?(d/1e6).toFixed(1)+"M":d>=1e3?(d/1e3).toFixed(1)+"K":d.toLocaleString());return(d,a)=>(r(),l("div",null,[t("div",us,[t("h3",cs,[a[0]||(a[0]=t("i",{class:"fas fa-shield-alt mr-2 text-sm text-red-500 md:mr-3 md:text-base"},null,-1)),b(" "+i(e(x)?"限制配置(聚合查询模式)":"限制配置"),1)]),e(x)&&e(u)?(r(),l("div",xs,[t("div",gs,[t("div",ys,[a[1]||(a[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",fs,i(e(u).activeKeys)+"/"+i(e(u).totalKeys),1)]),t("div",ps,[t("div",bs,[t("div",vs,i(e(u).totalKeys),1),a[2]||(a[2]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400"},"总计 Keys",-1))]),t("div",ks,[t("div",_s,i(e(u).activeKeys),1),a[3]||(a[3]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400"},"激活 Keys",-1))])])]),t("div",hs,[a[7]||(a[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",ws,[t("div",$s,[a[4]||(a[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",Ss,i(L(e(u).usage.requests)),1)]),t("div",Cs,[a[5]||(a[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",Ks,i(L(e(u).usage.allTokens)),1)]),t("div",Ts,[a[6]||(a[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",Is,i(e(u).usage.formattedCost),1)])])]),e(y)&&e(y).length>0?(r(),l("div",Ls,[a[8]||(a[8]=t("i",{class:"fas fa-exclamation-triangle mr-2 text-red-600 dark:text-red-400"},null,-1)),t("span",Ps,i(e(y).length)+" 个无效的 API Key ",1)])):$("",!0),a[9]||(a[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))])):$("",!0),e(x)?$("",!0):(r(),l("div",As,[t("div",null,[t("div",Ms,[a[11]||(a[11]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"每日费用限制",-1)),t("span",js,[e(s).limits.dailyCostLimit>0?(r(),l("span",qs," $"+i(e(s).limits.currentDailyCost.toFixed(4))+" / $"+i(e(s).limits.dailyCostLimit.toFixed(2)),1)):(r(),l("span",Ds,[b(" $"+i(e(s).limits.currentDailyCost.toFixed(4))+" / ",1),a[10]||(a[10]=t("i",{class:"fas fa-infinity"},null,-1))]))])]),e(s).limits.dailyCostLimit>0?(r(),l("div",Rs,[t("div",{class:q(["h-2 rounded-full transition-all duration-300",p()]),style:Q({width:m()+"%"})},null,6)])):(r(),l("div",Os,a[12]||(a[12]=[t("div",{class:"h-2 rounded-full bg-green-500",style:{width:"0%"}},null,-1)])))]),t("div",null,[t("div",Us,[a[14]||(a[14]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"总费用限制",-1)),t("span",Es,[e(s).limits.totalCostLimit>0?(r(),l("span",Fs," $"+i(e(s).limits.currentTotalCost.toFixed(4))+" / $"+i(e(s).limits.totalCostLimit.toFixed(2)),1)):(r(),l("span",Ns,[b(" $"+i(e(s).limits.currentTotalCost.toFixed(4))+" / ",1),a[13]||(a[13]=t("i",{class:"fas fa-infinity"},null,-1))]))])]),e(s).limits.totalCostLimit>0?(r(),l("div",Bs,[t("div",{class:q(["h-2 rounded-full transition-all duration-300",K()]),style:Q({width:_()+"%"})},null,6)])):(r(),l("div",Vs,a[15]||(a[15]=[t("div",{class:"h-2 rounded-full bg-blue-500",style:{width:"0%"}},null,-1)])))]),e(s).limits.weeklyOpusCostLimit>0?(r(),l("div",Ws,[t("div",Js,[a[16]||(a[16]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"Opus 模型周费用限制",-1)),t("span",zs," $"+i(e(s).limits.weeklyOpusCost.toFixed(4))+" / $"+i(e(s).limits.weeklyOpusCostLimit.toFixed(2)),1)]),t("div",Ys,[t("div",{class:q(["h-2 rounded-full transition-all duration-300",w()]),style:Q({width:c()+"%"})},null,6)])])):$("",!0),e(s).limits.rateLimitWindow>0&&(e(s).limits.rateLimitRequests>0||e(s).limits.tokenLimit>0||e(s).limits.rateLimitCost>0)?(r(),l("div",Hs,[E($t,{"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",Qs,[a[17]||(a[17]=t("i",{class:"fas fa-info-circle mr-1"},null,-1)),e(s).limits.rateLimitCost>0?(r(),l("span",Gs,' 请求次数和费用限制为"或"的关系,任一达到限制即触发限流 ')):e(s).limits.tokenLimit>0?(r(),l("span",Xs,' 请求次数和Token使用量为"或"的关系,任一达到限制即触发限流 ')):(r(),l("span",Zs," 仅限制请求次数 "))])])):$("",!0),t("div",ta,[t("div",ea,[a[19]||(a[19]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"并发限制",-1)),t("span",sa,[e(s).limits.concurrencyLimit>0?(r(),l("span",aa,i(e(s).limits.concurrencyLimit),1)):(r(),l("span",ra,a[18]||(a[18]=[t("i",{class:"fas fa-infinity text-gray-400"},null,-1)])))])]),t("div",ia,[a[22]||(a[22]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"模型限制",-1)),t("span",la,[e(s).restrictions.enableModelRestriction&&e(s).restrictions.restrictedModels.length>0?(r(),l("span",oa,[a[20]||(a[20]=t("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),b(" 限制 "+i(e(s).restrictions.restrictedModels.length)+" 个模型 ",1)])):(r(),l("span",na,a[21]||(a[21]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),b(" 允许所有模型 ",-1)])))])]),t("div",da,[a[25]||(a[25]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"客户端限制",-1)),t("span",ma,[e(s).restrictions.enableClientRestriction&&e(s).restrictions.allowedClients.length>0?(r(),l("span",ua,[a[23]||(a[23]=t("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),b(" 限 "+i(e(s).restrictions.allowedClients.length)+" 种客户端使用 ",1)])):(r(),l("span",ca,a[24]||(a[24]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),b(" 允许所有客户端 ",-1)])))])])])]))]),e(s).restrictions.enableModelRestriction&&e(s).restrictions.restrictedModels.length>0||e(s).restrictions.enableClientRestriction&&e(s).restrictions.allowedClients.length>0?(r(),l("div",xa,[a[32]||(a[32]=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",ga,[e(s).restrictions.enableModelRestriction&&e(s).restrictions.restrictedModels.length>0?(r(),l("div",ya,[a[27]||(a[27]=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",fa,[(r(!0),l(J,null,z(e(s).restrictions.restrictedModels,v=>(r(),l("div",{key:v,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"},[a[26]||(a[26]=t("i",{class:"fas fa-ban mr-1 text-xs text-red-500 md:mr-2"},null,-1)),t("span",pa,i(v),1)]))),128))]),a[28]||(a[28]=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))])):$("",!0),e(s).restrictions.enableClientRestriction&&e(s).restrictions.allowedClients.length>0?(r(),l("div",ba,[a[30]||(a[30]=t("h4",{class:"mb-2 flex items-center text-sm font-bold text-blue-800 dark:text-blue-300 md:mb-3 md:text-base"},[t("i",{class:"fas fa-desktop mr-1 text-xs md:mr-2 md:text-sm"}),b(" 允许的客户端 ")],-1)),t("div",va,[(r(!0),l(J,null,z(e(s).restrictions.allowedClients,v=>(r(),l("div",{key:v,class:"rounded border border-blue-200 bg-white px-2 py-1 text-xs dark:border-blue-700 dark:bg-gray-800 md:px-3 md:py-2 md:text-sm"},[a[29]||(a[29]=t("i",{class:"fas fa-check mr-1 text-xs text-green-500 md:mr-2"},null,-1)),t("span",ka,i(v),1)]))),128))]),a[31]||(a[31]=t("p",{class:"mt-2 text-xs text-blue-700 dark:text-blue-400 md:mt-3"},[t("i",{class:"fas fa-info-circle mr-1"}),b(" 此 API Key 只能被以上列出的客户端使用 ")],-1))])):$("",!0)])])):$("",!0)]))}},ha=N(_a,[["__scopeId","data-v-cc0dd7b5"]]),wa={class:"card h-full p-4 md:p-6"},$a={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"},Sa={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},Ca={key:0,class:"space-y-2 md:space-y-3"},Ka={class:"mb-1 flex items-center justify-between text-sm"},Ta={class:"truncate font-medium text-gray-700 dark:text-gray-300"},Ia={class:"text-xs text-gray-600 dark:text-gray-400"},La={class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Pa={class:"mt-1 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},Aa={key:0,class:"border-t border-gray-200 pt-2 dark:border-gray-700"},Ma={class:"flex items-center justify-between text-sm text-gray-600 dark:text-gray-400"},ja={key:1,class:"flex h-32 items-center justify-center text-sm text-gray-500 dark:text-gray-400"},qa={key:2,class:"flex h-32 items-center justify-center text-sm text-gray-500 dark:text-gray-400"},Da={__name:"AggregatedStatsCard",setup(A){const g=B(),{aggregatedStats:s,individualStats:x,statsPeriod:u,multiKeyMode:y}=F(g),m=d=>d?u.value==="daily"?d.dailyUsage||d.usage:d.monthlyUsage||d.usage:null,p=O(()=>!x.value||x.value.length===0?[]:[...x.value].sort((d,a)=>{const v=m(d),S=m(a);return((S==null?void 0:S.cost)||0)-((v==null?void 0:v.cost)||0)}).slice(0,5)),_=O(()=>x.value?Math.max(0,x.value.length-5):0),K=O(()=>{var S,f;if(!x.value||!s.value)return 0;const d=p.value.reduce((n,P)=>{const D=m(P);return n+((D==null?void 0:D.cost)||0)},0),a=u.value==="daily"?((S=s.value.dailyUsage)==null?void 0:S.cost)||0:((f=s.value.monthlyUsage)==null?void 0:f.cost)||0;if(a===0)return 0;const v=a-d;return Math.max(0,Math.round(v/a*100))}),c=d=>{var f,n;if(!s.value)return 0;const a=u.value==="daily"?((f=s.value.dailyUsage)==null?void 0:f.cost)||0:((n=s.value.monthlyUsage)==null?void 0:n.cost)||0;if(a===0)return 0;const v=m(d),S=((v==null?void 0:v.cost)||0)/a*100;return Math.round(S)},w=d=>["bg-blue-500","bg-green-500","bg-purple-500","bg-yellow-500","bg-pink-500"][d]||"bg-gray-400",L=d=>(typeof d!="number"&&(d=parseInt(d)||0),d===0?"0":d>=1e6?(d/1e6).toFixed(1)+"M":d>=1e3?(d/1e3).toFixed(1)+"K":d.toLocaleString());return(d,a)=>(r(),l("div",wa,[t("h3",$a,[a[0]||(a[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",Sa,"("+i(e(u)==="daily"?"今日":"本月")+")",1)]),e(s)&&e(x).length>0?(r(),l("div",Ca,[(r(!0),l(J,null,z(p.value,(v,S)=>{var f,n;return r(),l("div",{key:v.apiId,class:"relative"},[t("div",Ka,[t("span",Ta,i(v.name||`Key ${S+1}`),1),t("span",Ia,i(c(v))+"% ",1)]),t("div",La,[t("div",{class:q(["h-2 rounded-full transition-all duration-300",w(S)]),style:Q({width:c(v)+"%"})},null,6)]),t("div",Pa,[t("span",null,i(L(((f=m(v))==null?void 0:f.requests)||0))+"次",1),t("span",null,i(((n=m(v))==null?void 0:n.formattedCost)||"$0.00"),1)])])}),128)),_.value>0?(r(),l("div",Aa,[t("div",Ma,[t("span",null,"其他 "+i(_.value)+" 个Keys",1),t("span",null,i(K.value)+"%",1)])])):$("",!0)])):e(y)?(r(),l("div",qa,a[2]||(a[2]=[t("i",{class:"fas fa-chart-pie mr-2"},null,-1),b(" 暂无数据 ",-1)]))):(r(),l("div",ja,a[1]||(a[1]=[t("div",{class:"text-center"},[t("i",{class:"fas fa-chart-pie mb-2 text-2xl"}),t("p",null,"使用占比仅在多Key查询时显示")],-1)])))]))}},Ra=N(Da,[["__scopeId","data-v-39572a8e"]]),Oa={class:"card p-4 md:p-6"},Ua={class:"mb-4 md:mb-6"},Ea={class:"flex flex-col text-lg font-bold text-gray-900 dark:text-gray-100 sm:flex-row sm:items-center md:text-xl"},Fa={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},Na={key:0,class:"py-6 text-center md:py-8"},Ba={key:1,class:"space-y-3 md:space-y-4"},Va={class:"mb-2 flex items-start justify-between md:mb-3"},Wa={class:"min-w-0 flex-1"},Ja={class:"break-all text-base font-bold text-gray-900 dark:text-gray-100 md:text-lg"},za={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},Ya={class:"ml-3 flex-shrink-0 text-right"},Ha={class:"text-base font-bold text-green-600 md:text-lg"},Qa={class:"grid grid-cols-2 gap-2 text-xs md:grid-cols-4 md:gap-3 md:text-sm"},Ga={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},Xa={class:"font-medium text-gray-900 dark:text-gray-100"},Za={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},tr={class:"font-medium text-gray-900 dark:text-gray-100"},er={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},sr={class:"font-medium text-gray-900 dark:text-gray-100"},ar={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},rr={class:"font-medium text-gray-900 dark:text-gray-100"},ir={key:2,class:"py-6 text-center text-gray-500 dark:text-gray-400 md:py-8"},lr={class:"text-sm md:text-base"},or={__name:"ModelUsageStats",setup(A){const g=B(),{statsPeriod:s,modelStats:x,modelStatsLoading:u}=F(g),y=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,p)=>(r(),l("div",Oa,[t("div",Ua,[t("h3",Ea,[p[0]||(p[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",Fa,"("+i(e(s)==="daily"?"今日":"本月")+")",1)])]),e(u)?(r(),l("div",Na,p[1]||(p[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(x).length>0?(r(),l("div",Ba,[(r(!0),l(J,null,z(e(x),(_,K)=>{var c;return r(),l("div",{key:K,class:"model-usage-item"},[t("div",Va,[t("div",Wa,[t("h4",Ja,i(_.model),1),t("p",za,i(_.requests)+" 次请求 ",1)]),t("div",Ya,[t("div",Ha,i(((c=_.formatted)==null?void 0:c.total)||"$0.000000"),1),p[2]||(p[2]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},"总费用",-1))])]),t("div",Qa,[t("div",Ga,[p[3]||(p[3]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输入 Token",-1)),t("div",Xa,i(y(_.inputTokens)),1)]),t("div",Za,[p[4]||(p[4]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输出 Token",-1)),t("div",tr,i(y(_.outputTokens)),1)]),t("div",er,[p[5]||(p[5]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存创建",-1)),t("div",sr,i(y(_.cacheCreateTokens)),1)]),t("div",ar,[p[6]||(p[6]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存读取",-1)),t("div",rr,i(y(_.cacheReadTokens)),1)])])])}),128))])):(r(),l("div",ir,[p[7]||(p[7]=t("i",{class:"fas fa-chart-pie mb-3 text-2xl md:text-3xl"},null,-1)),t("p",lr," 暂无"+i(e(s)==="daily"?"今日":"本月")+"模型使用数据 ",1)]))]))}},nr=N(or,[["__scopeId","data-v-b3b8dc5f"]]),dr={class:"glass-strong mb-6 rounded-3xl p-4 shadow-xl md:mb-8 md:p-6"},mr={class:"flex flex-col items-center justify-between gap-4 md:flex-row"},ur={class:"flex items-center gap-2 md:gap-4"},cr={class:"flex items-center"},xr={key:0,class:"h-8 w-px bg-gradient-to-b from-transparent via-gray-300 to-transparent opacity-50 dark:via-gray-600"},gr={class:"mb-6 md:mb-8"},yr={class:"flex justify-center"},fr={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"},pr={key:0,class:"tab-content"},br={key:0,class:"mb-6 md:mb-8"},vr={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"},kr={key:1,class:"fade-in"},_r={class:"glass-strong rounded-3xl p-4 shadow-xl md:p-6"},hr={class:"mb-4 border-b border-gray-200 pb-4 dark:border-gray-700 md:mb-6 md:pb-6"},wr={class:"flex flex-col items-start justify-between gap-3 md:flex-row md:items-center md:gap-4"},$r={class:"flex w-full gap-2 md:w-auto"},Sr=["disabled"],Cr=["disabled"],Kr={class:"mb-6 grid grid-cols-1 gap-4 md:mb-8 md:gap-6 lg:grid-cols-2"},Tr={key:1,class:"tab-content"},Ir={class:"glass-strong rounded-3xl shadow-xl"},Lr={__name:"ApiStatsView",setup(A){const g=ft(),s=B(),x=kt(),u=T("stats"),y=O(()=>x.isDarkMode),{apiKey:m,apiId:p,loading:_,modelStatsLoading:K,oemLoading:c,error:w,statsPeriod:L,statsData:d,oemSettings:a,multiKeyMode:v}=F(s),{queryStats:S,switchPeriod:f,loadStatsWithApiId:n,loadOemSettings:P,reset:D}=s,V=I=>{(I.ctrlKey||I.metaKey)&&I.key==="Enter"&&(!_.value&&m.value.trim()&&S(),I.preventDefault()),I.key==="Escape"&&D()};return yt(()=>{x.initTheme(),P();const I=g.query.apiId,h=g.query.apiKey;I&&I.match(/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i)?(p.value=I,n()):h&&h.length>10&&(m.value=h),document.addEventListener("keydown",V)}),pt(()=>{document.removeEventListener("keydown",V)}),bt(m,I=>{I||s.clearData()}),(I,h)=>{const Y=vt("router-link");return r(),l("div",{class:q(["min-h-screen p-4 md:p-6",y.value?"gradient-bg-dark":"gradient-bg"])},[t("div",dr,[t("div",mr,[E(_t,{loading:e(c),"logo-src":e(a).siteIconData||e(a).siteIcon,subtitle:u.value==="stats"?"API Key 使用统计":"使用教程",title:e(a).siteName},null,8,["loading","logo-src","subtitle","title"]),t("div",ur,[t("div",cr,[E(ht,{mode:"dropdown"})]),e(a).ldapEnabled||e(a).showAdminButton!==!1?(r(),l("div",xr)):$("",!0),e(a).ldapEnabled?(r(),H(Y,{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:it(()=>h[4]||(h[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]})):$("",!0),e(a).showAdminButton!==!1?(r(),H(Y,{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:it(()=>h[5]||(h[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]})):$("",!0)])])]),t("div",gr,[t("div",yr,[t("div",fr,[t("button",{class:q(["tab-pill-button",u.value==="stats"?"active":""]),onClick:h[0]||(h[0]=W=>u.value="stats")},h[6]||(h[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:q(["tab-pill-button",u.value==="tutorial"?"active":""]),onClick:h[1]||(h[1]=W=>u.value="tutorial")},h[7]||(h[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)])])]),u.value==="stats"?(r(),l("div",pr,[E(Jt),e(w)?(r(),l("div",br,[t("div",vr,[h[8]||(h[8]=t("i",{class:"fas fa-exclamation-triangle mr-2"},null,-1)),b(" "+i(e(w)),1)])])):$("",!0),e(d)?(r(),l("div",kr,[t("div",_r,[t("div",hr,[t("div",wr,[h[11]||(h[11]=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",$r,[t("button",{class:q(["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(L)==="daily"}]]),disabled:e(_)||e(K),onClick:h[2]||(h[2]=W=>e(f)("daily"))},h[9]||(h[9]=[t("i",{class:"fas fa-calendar-day text-xs md:text-sm"},null,-1),b(" 今日 ",-1)]),10,Sr),t("button",{class:q(["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(L)==="monthly"}]]),disabled:e(_)||e(K),onClick:h[3]||(h[3]=W=>e(f)("monthly"))},h[10]||(h[10]=[t("i",{class:"fas fa-calendar-alt text-xs md:text-sm"},null,-1),b(" 本月 ",-1)]),10,Cr)])])]),E(Je),t("div",Kr,[E(ms),e(v)?$("",!0):(r(),H(ha,{key:0})),e(v)?(r(),H(Ra,{key:1})):$("",!0)]),E(nr)])])):$("",!0)])):$("",!0),u.value==="tutorial"?(r(),l("div",Tr,[t("div",Ir,[E(St)])])):$("",!0)],2)}}},Ur=N(Lr,[["__scopeId","data-v-5e1d559d"]]);export{Ur as default};
|