Files
claude-relay-service/assets/ApiStatsView-Dc3CG1DW.js
2025-08-24 08:51:25 +00:00

2 lines
30 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{aR as Y,r as _,c as V,aV as A,x as n,y as d,z as t,O as f,K as H,aq as Q,u as s,aa as G,f as X,P as l,C,L,B as Z,R as S,Q as W,ac as z,q as tt,aU as et,V as st,o as at,J as rt,av as it}from"./vue-vendor-Ig-GgGwA.js";import{_ as q,a as ot}from"./index-C2TiZpy7.js";import{L as lt}from"./LogoTitle-C7EUMnLj.js";import{T as nt}from"./ThemeToggle-Dqc-zR3c.js";import{b as dt}from"./vendor-BDiMbLwQ.js";import{_ as mt}from"./WindowCountdown-DSqUCtdk.js";import ct from"./TutorialView-BSzHwpnm.js";import"./element-plus-Bq6mBxnk.js";class xt{constructor(){this.baseURL=window.location.origin,this.isDev=!1}async request(o,a={}){try{this.isDev&&o.startsWith("/admin")&&(o="/webapi"+o);const m=await fetch(`${this.baseURL}${o}`,{headers:{"Content-Type":"application/json",...a.headers},...a}),x=await m.json();if(!m.ok)throw new Error(x.message||`请求失败: ${m.status}`);return x}catch(m){throw console.error("API Stats request error:",m),m}}async getKeyId(o){return this.request("/apiStats/api/get-key-id",{method:"POST",body:JSON.stringify({apiKey:o})})}async getUserStats(o){return this.request("/apiStats/api/user-stats",{method:"POST",body:JSON.stringify({apiId:o})})}async getUserModelStats(o,a="daily"){return this.request("/apiStats/api/user-model-stats",{method:"POST",body:JSON.stringify({apiId:o,period:a})})}async getOemSettings(){try{return await this.request("/admin/oem-settings")}catch(o){return console.error("Failed to load OEM settings:",o),{success:!0,data:{siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}}}}const P=new xt,K=Y("apistats",()=>{const h=_(""),o=_(null),a=_(!1),m=_(!1),x=_(!0),c=_(""),e=_("daily"),i=_(null),p=_([]),v=_(null),w=_(null),u=_({siteName:"",siteIcon:"",siteIconData:""}),g=V(()=>{const r={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};return e.value==="daily"?v.value||r:w.value||r}),U=V(()=>{if(!i.value||!g.value)return{tokenUsage:0,costUsage:0,requestUsage:0};const r=g.value,b=i.value.limits;return{tokenUsage:b.tokenLimit>0?Math.min(r.allTokens/b.tokenLimit*100,100):0,costUsage:b.dailyCostLimit>0?Math.min(r.cost/b.dailyCostLimit*100,100):0,requestUsage:b.rateLimitRequests>0?Math.min(r.requests/b.rateLimitRequests*100,100):0}});async function T(){if(!h.value.trim()){c.value="请输入 API Key";return}a.value=!0,c.value="",i.value=null,p.value=[],o.value=null;try{const r=await P.getKeyId(h.value);if(r.success){o.value=r.data.id;const b=await P.getUserStats(o.value);if(b.success)i.value=b.data,await M(),c.value="",y();else throw new Error(b.message||"查询失败")}else throw new Error(r.message||"获取 API Key ID 失败")}catch(r){console.error("Query stats error:",r),c.value=r.message||"查询统计数据失败,请检查您的 API Key 是否正确",i.value=null,p.value=[],o.value=null}finally{a.value=!1}}async function M(){o.value&&(await Promise.all([I("daily"),I("monthly")]),await R(e.value))}async function I(r){try{const b=await P.getUserModelStats(o.value,r);if(b.success){const J=b.data||[],$={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};J.forEach(D=>{var B;$.requests+=D.requests||0,$.inputTokens+=D.inputTokens||0,$.outputTokens+=D.outputTokens||0,$.cacheCreateTokens+=D.cacheCreateTokens||0,$.cacheReadTokens+=D.cacheReadTokens||0,$.allTokens+=D.allTokens||0,$.cost+=((B=D.costs)==null?void 0:B.total)||0}),$.formattedCost=k($.cost),r==="daily"?v.value=$:w.value=$}else console.warn(`Failed to load ${r} stats:`,b.message)}catch(b){console.error(`Load ${r} stats error:`,b)}}async function R(r="daily"){if(o.value){m.value=!0;try{const b=await P.getUserModelStats(o.value,r);if(b.success)p.value=b.data||[];else throw new Error(b.message||"加载模型统计失败")}catch(b){console.error("Load model stats error:",b),p.value=[]}finally{m.value=!1}}}async function N(r){e.value===r||m.value||(e.value=r,(r==="daily"&&!v.value||r==="monthly"&&!w.value)&&await I(r),await R(r))}async function O(){if(o.value){a.value=!0,c.value="",i.value=null,p.value=[];try{const r=await P.getUserStats(o.value);if(r.success)i.value=r.data,await M(),c.value="";else throw new Error(r.message||"查询失败")}catch(r){console.error("Load stats with apiId error:",r),c.value=r.message||"查询统计数据失败",i.value=null,p.value=[]}finally{a.value=!1}}}async function E(){x.value=!0;try{const r=await P.getOemSettings();r&&r.success&&r.data&&(u.value={...u.value,...r.data})}catch(r){console.error("Error loading OEM settings:",r),u.value={siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}finally{x.value=!1}}function k(r){return typeof r!="number"||r===0?"$0.000000":r>=1?"$"+r.toFixed(2):r>=.01?"$"+r.toFixed(4):"$"+r.toFixed(6)}function y(){if(o.value){const r=new URL(window.location);r.searchParams.set("apiId",o.value),window.history.pushState({},"",r)}}function F(){i.value=null,p.value=[],v.value=null,w.value=null,c.value="",e.value="daily",o.value=null}function j(){h.value="",F()}return{apiKey:h,apiId:o,loading:a,modelStatsLoading:m,oemLoading:x,error:c,statsPeriod:e,statsData:i,modelStats:p,dailyStats:v,monthlyStats:w,oemSettings:u,currentPeriodData:g,usagePercentages:U,queryStats:T,loadAllPeriodStats:M,loadPeriodStats:I,loadModelStats:R,switchPeriod:N,loadStatsWithApiId:O,loadOemSettings:E,clearData:F,reset:j}}),ut={class:"api-input-wide-card mb-8 rounded-3xl p-6 shadow-xl"},gt={class:"mx-auto max-w-4xl"},ft={class:"api-input-grid grid grid-cols-1 lg:grid-cols-4"},yt={class:"lg:col-span-3"},pt=["disabled"],bt={class:"lg:col-span-1"},vt=["disabled"],kt={key:0,class:"fas fa-spinner loading-spinner"},_t={key:1,class:"fas fa-search"},wt={__name:"ApiKeyInput",setup(h){const o=K(),{apiKey:a,loading:m}=A(o),{queryStats:x}=o;return(c,e)=>(d(),n("div",ut,[e[6]||(e[6]=t("div",{class:"wide-card-title mb-6 text-center"},[t("h2",{class:"mb-2 text-2xl font-bold text-gray-900 dark:text-white"},[t("i",{class:"fas fa-chart-line mr-3"}),f(" 使用统计查询 ")]),t("p",{class:"text-base text-gray-600 dark:text-gray-300"},"查询您的 API Key 使用情况和统计数据")],-1)),t("div",gt,[t("div",ft,[t("div",yt,[e[3]||(e[3]=t("label",{class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-200"},[t("i",{class:"fas fa-key mr-2"}),f(" 输入您的 API Key ")],-1)),H(t("input",{"onUpdate:modelValue":e[0]||(e[0]=i=>X(a)?a.value=i:null),class:"wide-card-input w-full",disabled:s(m),placeholder:"请输入您的 API Key (cr_...)",type:"password",onKeyup:e[1]||(e[1]=G((...i)=>s(x)&&s(x)(...i),["enter"]))},null,40,pt),[[Q,s(a)]])]),t("div",bt,[e[4]||(e[4]=t("label",{class:"mb-2 hidden text-sm font-medium text-gray-700 dark:text-gray-200 lg:block"},"   ",-1)),t("button",{class:"btn btn-primary btn-query flex h-full w-full items-center justify-center gap-2",disabled:s(m)||!s(a).trim(),onClick:e[2]||(e[2]=(...i)=>s(x)&&s(x)(...i))},[s(m)?(d(),n("i",kt)):(d(),n("i",_t)),f(" "+l(s(m)?"查询中...":"查询统计"),1)],8,vt)])]),e[5]||(e[5]=t("div",{class:"security-notice mt-4"},[t("i",{class:"fas fa-shield-alt mr-2"}),f(" 您的 API Key 仅用于查询自己的统计数据,不会被存储或用于其他用途 ")],-1))])]))}},ht=q(wt,[["__scopeId","data-v-0b1313e4"]]),$t={class:"mb-6 grid grid-cols-1 gap-4 md:mb-8 md:gap-6 lg:grid-cols-2"},St={class:"card p-4 md:p-6"},Tt={class:"space-y-2 md:space-y-3"},Ct={class:"flex items-center justify-between"},Lt={class:"break-all text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},It={class:"flex items-center justify-between"},Dt={class:"flex items-center justify-between"},Pt={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},At={class:"flex items-center justify-between"},qt={class:"break-all text-xs font-medium text-gray-900 dark:text-gray-100 md:text-base"},Kt={class:"flex items-start justify-between"},Mt={key:0,class:"text-right"},Rt={key:0,class:"text-sm font-medium text-red-600 md:text-base"},jt={key:1,class:"break-all text-xs font-medium text-orange-600 md:text-base"},Ut={key:2,class:"break-all text-xs font-medium text-gray-900 dark:text-gray-100 md:text-base"},Et={key:1,class:"text-sm font-medium text-gray-400 dark:text-gray-500 md:text-base"},Ft={class:"card p-4 md:p-6"},Nt={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"},Ot={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},Vt={class:"grid grid-cols-2 gap-3 md:gap-4"},Wt={class:"stat-card text-center"},zt={class:"text-lg font-bold text-green-600 md:text-3xl"},Bt={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},Jt={class:"stat-card text-center"},Yt={class:"text-lg font-bold text-blue-600 md:text-3xl"},Ht={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},Qt={class:"stat-card text-center"},Gt={class:"text-lg font-bold text-purple-600 md:text-3xl"},Xt={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},Zt={class:"stat-card text-center"},te={class:"text-lg font-bold text-yellow-600 md:text-3xl"},ee={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},se={__name:"StatsOverview",setup(h){const o=K(),{statsData:a,statsPeriod:m,currentPeriodData:x}=A(o),c=u=>{if(!u)return"无";try{return dt(u).format("YYYY年MM月DD日 HH:mm")}catch{return"格式错误"}},e=u=>u?new Date(u).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",i=u=>u?new Date(u)<new Date:!1,p=u=>{if(!u)return!1;const T=(new Date(u)-new Date)/(1e3*60*60*24);return T>0&&T<=7},v=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()),w=u=>({claude:"Claude",gemini:"Gemini",all:"全部模型"})[u]||u||"未知";return(u,g)=>(d(),n("div",$t,[t("div",St,[g[8]||(g[8]=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-info-circle mr-2 text-sm text-blue-500 md:mr-3 md:text-base"}),f(" API Key 信息 ")],-1)),t("div",Tt,[t("div",Ct,[g[0]||(g[0]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"名称",-1)),t("span",Lt,l(s(a).name),1)]),t("div",It,[g[1]||(g[1]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"状态",-1)),t("span",{class:C(["text-sm font-medium md:text-base",s(a).isActive?"text-green-600":"text-red-600"])},[t("i",{class:C(["mr-1 text-xs md:text-sm",s(a).isActive?"fas fa-check-circle":"fas fa-times-circle"])},null,2),f(" "+l(s(a).isActive?"活跃":"已停用"),1)],2)]),t("div",Dt,[g[2]||(g[2]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"权限",-1)),t("span",Pt,l(w(s(a).permissions)),1)]),t("div",At,[g[3]||(g[3]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"创建时间",-1)),t("span",qt,l(c(s(a).createdAt)),1)]),t("div",Kt,[g[7]||(g[7]=t("span",{class:"mt-1 flex-shrink-0 text-sm text-gray-600 dark:text-gray-400 md:text-base"},"过期时间",-1)),s(a).expiresAt?(d(),n("div",Mt,[i(s(a).expiresAt)?(d(),n("div",Rt,g[4]||(g[4]=[t("i",{class:"fas fa-exclamation-circle mr-1 text-xs md:text-sm"},null,-1),f(" 已过期 ",-1)]))):p(s(a).expiresAt)?(d(),n("div",jt,[g[5]||(g[5]=t("i",{class:"fas fa-clock mr-1 text-xs md:text-sm"},null,-1)),f(" "+l(e(s(a).expiresAt)),1)])):(d(),n("div",Ut,l(e(s(a).expiresAt)),1))])):(d(),n("div",Et,g[6]||(g[6]=[t("i",{class:"fas fa-infinity mr-1 text-xs md:text-sm"},null,-1),f(" 永不过期 ",-1)])))])])]),t("div",Ft,[t("h3",Nt,[g[9]||(g[9]=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"}),f(" 使用统计概览 ")],-1)),t("span",Ot,"("+l(s(m)==="daily"?"今日":"本月")+")",1)]),t("div",Vt,[t("div",Wt,[t("div",zt,l(v(s(x).requests)),1),t("div",Bt,l(s(m)==="daily"?"今日":"本月")+"请求数 ",1)]),t("div",Jt,[t("div",Yt,l(v(s(x).allTokens)),1),t("div",Ht,l(s(m)==="daily"?"今日":"本月")+"Token数 ",1)]),t("div",Qt,[t("div",Gt,l(s(x).formattedCost||"$0.000000"),1),t("div",Xt,l(s(m)==="daily"?"今日":"本月")+"费用 ",1)]),t("div",Zt,[t("div",te,l(v(s(x).inputTokens)),1),t("div",ee,l(s(m)==="daily"?"今日":"本月")+"输入Token ",1)])])])]))}},ae=q(se,[["__scopeId","data-v-f536da49"]]),re={class:"card p-4 md:p-6"},ie={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"},oe={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},le={class:"space-y-2 md:space-y-3"},ne={class:"flex items-center justify-between"},de={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},me={class:"flex items-center justify-between"},ce={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},xe={class:"flex items-center justify-between"},ue={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},ge={class:"flex items-center justify-between"},fe={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},ye={class:"mt-3 border-t border-gray-200 pt-3 dark:border-gray-700 md:mt-4 md:pt-4"},pe={class:"flex items-center justify-between font-bold text-gray-900 dark:text-gray-100"},be={class:"text-sm md:text-base"},ve={class:"text-lg md:text-xl"},ke={__name:"TokenDistribution",setup(h){const o=K(),{statsPeriod:a,currentPeriodData:m}=A(o),x=c=>(typeof c!="number"&&(c=parseInt(c)||0),c===0?"0":c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(1)+"K":c.toLocaleString());return(c,e)=>(d(),n("div",re,[t("h3",ie,[e[0]||(e[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"}),f(" Token 使用分布 ")],-1)),t("span",oe,"("+l(s(a)==="daily"?"今日":"本月")+")",1)]),t("div",le,[t("div",ne,[e[1]||(e[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"}),f(" 输入 Token ")],-1)),t("span",de,l(x(s(m).inputTokens)),1)]),t("div",me,[e[2]||(e[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"}),f(" 输出 Token ")],-1)),t("span",ce,l(x(s(m).outputTokens)),1)]),t("div",xe,[e[3]||(e[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"}),f(" 缓存创建 Token ")],-1)),t("span",ue,l(x(s(m).cacheCreateTokens)),1)]),t("div",ge,[e[4]||(e[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"}),f(" 缓存读取 Token ")],-1)),t("span",fe,l(x(s(m).cacheReadTokens)),1)])]),t("div",ye,[t("div",pe,[t("span",be,l(s(a)==="daily"?"今日":"本月")+"总计",1),t("span",ve,l(x(s(m).allTokens)),1)])])]))}},_e=q(ke,[["__scopeId","data-v-ecee0a94"]]),we={class:"card p-4 md:p-6"},he={class:"space-y-4 md:space-y-5"},$e={class:"mb-2 flex items-center justify-between"},Se={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},Te={key:0},Ce={key:1,class:"flex items-center gap-1"},Le={key:0,class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Ie={key:1,class:"h-2 w-full rounded-full bg-gray-200"},De={key:0},Pe={class:"space-y-2 border-t border-gray-100 pt-2 dark:border-gray-700"},Ae={class:"flex items-center justify-between"},qe={class:"text-sm font-medium text-gray-900 md:text-base"},Ke={key:0},Me={key:1,class:"flex items-center gap-1"},Re={class:"flex items-center justify-between"},je={class:"text-sm font-medium text-gray-900 md:text-base"},Ue={key:0,class:"text-orange-600"},Ee={key:1,class:"text-green-600"},Fe={class:"flex items-center justify-between"},Ne={class:"text-sm font-medium text-gray-900 md:text-base"},Oe={key:0,class:"text-orange-600"},Ve={key:1,class:"text-green-600"},We={key:0,class:"card mt-4 p-4 md:mt-6 md:p-6"},ze={class:"grid grid-cols-1 gap-4 md:gap-6 lg:grid-cols-2"},Be={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"},Je={class:"space-y-1 md:space-y-2"},Ye={class:"break-all text-gray-800 dark:text-gray-200"},He={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"},Qe={class:"space-y-1 md:space-y-2"},Ge={class:"break-all text-gray-800 dark:text-gray-200"},Xe={__name:"LimitConfig",setup(h){const o=K(),{statsData:a}=A(o),m=()=>{if(!a.value.limits.dailyCostLimit||a.value.limits.dailyCostLimit===0)return 0;const c=a.value.limits.currentDailyCost/a.value.limits.dailyCostLimit*100;return Math.min(c,100)},x=()=>{const c=m();return c>=100?"bg-red-500":c>=80?"bg-yellow-500":"bg-green-500"};return(c,e)=>(d(),n("div",null,[t("div",we,[e[12]||(e[12]=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-shield-alt mr-2 text-sm text-red-500 md:mr-3 md:text-base"}),f(" 限制配置 ")],-1)),t("div",he,[t("div",null,[t("div",$e,[e[1]||(e[1]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"每日费用限制",-1)),t("span",Se,[s(a).limits.dailyCostLimit>0?(d(),n("span",Te," $"+l(s(a).limits.currentDailyCost.toFixed(4))+" / $"+l(s(a).limits.dailyCostLimit.toFixed(2)),1)):(d(),n("span",Ce,[f(" $"+l(s(a).limits.currentDailyCost.toFixed(4))+" / ",1),e[0]||(e[0]=t("i",{class:"fas fa-infinity"},null,-1))]))])]),s(a).limits.dailyCostLimit>0?(d(),n("div",Le,[t("div",{class:C(["h-2 rounded-full transition-all duration-300",x()]),style:Z({width:m()+"%"})},null,6)])):(d(),n("div",Ie,e[2]||(e[2]=[t("div",{class:"h-2 rounded-full bg-green-500",style:{width:"0%"}},null,-1)])))]),s(a).limits.rateLimitWindow>0&&(s(a).limits.rateLimitRequests>0||s(a).limits.tokenLimit>0)?(d(),n("div",De,[S(mt,{"current-requests":s(a).limits.currentWindowRequests,"current-tokens":s(a).limits.currentWindowTokens,label:"时间窗口限制","rate-limit-window":s(a).limits.rateLimitWindow,"request-limit":s(a).limits.rateLimitRequests,"show-progress":!0,"show-tooltip":!0,"token-limit":s(a).limits.tokenLimit,"window-end-time":s(a).limits.windowEndTime,"window-remaining-seconds":s(a).limits.windowRemainingSeconds,"window-start-time":s(a).limits.windowStartTime},null,8,["current-requests","current-tokens","rate-limit-window","request-limit","token-limit","window-end-time","window-remaining-seconds","window-start-time"]),e[3]||(e[3]=t("div",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},[t("i",{class:"fas fa-info-circle mr-1"}),f(' 请求次数和Token使用量为"或"的关系,任一达到限制即触发限流 ')],-1))])):L("",!0),t("div",Pe,[t("div",Ae,[e[5]||(e[5]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"并发限制",-1)),t("span",qe,[s(a).limits.concurrencyLimit>0?(d(),n("span",Ke,l(s(a).limits.concurrencyLimit),1)):(d(),n("span",Me,e[4]||(e[4]=[t("i",{class:"fas fa-infinity text-gray-400"},null,-1)])))])]),t("div",Re,[e[8]||(e[8]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"模型限制",-1)),t("span",je,[s(a).restrictions.enableModelRestriction&&s(a).restrictions.restrictedModels.length>0?(d(),n("span",Ue,[e[6]||(e[6]=t("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),f(" 限制 "+l(s(a).restrictions.restrictedModels.length)+" 个模型 ",1)])):(d(),n("span",Ee,e[7]||(e[7]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),f(" 允许所有模型 ",-1)])))])]),t("div",Fe,[e[11]||(e[11]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"客户端限制",-1)),t("span",Ne,[s(a).restrictions.enableClientRestriction&&s(a).restrictions.allowedClients.length>0?(d(),n("span",Oe,[e[9]||(e[9]=t("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),f(" 限制 "+l(s(a).restrictions.allowedClients.length)+" 个客户端 ",1)])):(d(),n("span",Ve,e[10]||(e[10]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),f(" 允许所有客户端 ",-1)])))])])])])]),s(a).restrictions.enableModelRestriction&&s(a).restrictions.restrictedModels.length>0||s(a).restrictions.enableClientRestriction&&s(a).restrictions.allowedClients.length>0?(d(),n("div",We,[e[19]||(e[19]=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"}),f(" 详细限制信息 ")],-1)),t("div",ze,[s(a).restrictions.enableModelRestriction&&s(a).restrictions.restrictedModels.length>0?(d(),n("div",Be,[e[14]||(e[14]=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"}),f(" 受限模型列表 ")],-1)),t("div",Je,[(d(!0),n(W,null,z(s(a).restrictions.restrictedModels,i=>(d(),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"},[e[13]||(e[13]=t("i",{class:"fas fa-ban mr-1 text-xs text-red-500 md:mr-2"},null,-1)),t("span",Ye,l(i),1)]))),128))]),e[15]||(e[15]=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"}),f(" 此 API Key 不能访问以上列出的模型 ")],-1))])):L("",!0),s(a).restrictions.enableClientRestriction&&s(a).restrictions.allowedClients.length>0?(d(),n("div",He,[e[17]||(e[17]=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"}),f(" 允许的客户端 ")],-1)),t("div",Qe,[(d(!0),n(W,null,z(s(a).restrictions.allowedClients,i=>(d(),n("div",{key:i,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"},[e[16]||(e[16]=t("i",{class:"fas fa-check mr-1 text-xs text-green-500 md:mr-2"},null,-1)),t("span",Ge,l(i),1)]))),128))]),e[18]||(e[18]=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"}),f(" 此 API Key 只能被以上列出的客户端使用 ")],-1))])):L("",!0)])])):L("",!0)]))}},Ze=q(Xe,[["__scopeId","data-v-2b2bf3be"]]),ts={class:"card p-4 md:p-6"},es={class:"mb-4 md:mb-6"},ss={class:"flex flex-col text-lg font-bold text-gray-900 dark:text-gray-100 sm:flex-row sm:items-center md:text-xl"},as={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},rs={key:0,class:"py-6 text-center md:py-8"},is={key:1,class:"space-y-3 md:space-y-4"},os={class:"mb-2 flex items-start justify-between md:mb-3"},ls={class:"min-w-0 flex-1"},ns={class:"break-all text-base font-bold text-gray-900 dark:text-gray-100 md:text-lg"},ds={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},ms={class:"ml-3 flex-shrink-0 text-right"},cs={class:"text-base font-bold text-green-600 md:text-lg"},xs={class:"grid grid-cols-2 gap-2 text-xs md:grid-cols-4 md:gap-3 md:text-sm"},us={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},gs={class:"font-medium text-gray-900 dark:text-gray-100"},fs={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},ys={class:"font-medium text-gray-900 dark:text-gray-100"},ps={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},bs={class:"font-medium text-gray-900 dark:text-gray-100"},vs={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},ks={class:"font-medium text-gray-900 dark:text-gray-100"},_s={key:2,class:"py-6 text-center text-gray-500 dark:text-gray-400 md:py-8"},ws={class:"text-sm md:text-base"},hs={__name:"ModelUsageStats",setup(h){const o=K(),{statsPeriod:a,modelStats:m,modelStatsLoading:x}=A(o),c=e=>(typeof e!="number"&&(e=parseInt(e)||0),e===0?"0":e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(1)+"K":e.toLocaleString());return(e,i)=>(d(),n("div",ts,[t("div",es,[t("h3",ss,[i[0]||(i[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"}),f(" 模型使用统计 ")],-1)),t("span",as,"("+l(s(a)==="daily"?"今日":"本月")+")",1)])]),s(x)?(d(),n("div",rs,i[1]||(i[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)]))):s(m).length>0?(d(),n("div",is,[(d(!0),n(W,null,z(s(m),(p,v)=>{var w;return d(),n("div",{key:v,class:"model-usage-item"},[t("div",os,[t("div",ls,[t("h4",ns,l(p.model),1),t("p",ds,l(p.requests)+" 次请求 ",1)]),t("div",ms,[t("div",cs,l(((w=p.formatted)==null?void 0:w.total)||"$0.000000"),1),i[2]||(i[2]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},"总费用",-1))])]),t("div",xs,[t("div",us,[i[3]||(i[3]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输入 Token",-1)),t("div",gs,l(c(p.inputTokens)),1)]),t("div",fs,[i[4]||(i[4]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输出 Token",-1)),t("div",ys,l(c(p.outputTokens)),1)]),t("div",ps,[i[5]||(i[5]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存创建",-1)),t("div",bs,l(c(p.cacheCreateTokens)),1)]),t("div",vs,[i[6]||(i[6]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存读取",-1)),t("div",ks,l(c(p.cacheReadTokens)),1)])])])}),128))])):(d(),n("div",_s,[i[7]||(i[7]=t("i",{class:"fas fa-chart-pie mb-3 text-2xl md:text-3xl"},null,-1)),t("p",ws," 暂无"+l(s(a)==="daily"?"今日":"本月")+"模型使用数据 ",1)]))]))}},$s=q(hs,[["__scopeId","data-v-b3b8dc5f"]]),Ss={class:"glass-strong mb-6 rounded-3xl p-4 shadow-xl md:mb-8 md:p-6"},Ts={class:"flex flex-col items-center justify-between gap-4 md:flex-row"},Cs={class:"flex items-center gap-2 md:gap-4"},Ls={class:"flex items-center"},Is={class:"mb-6 md:mb-8"},Ds={class:"flex justify-center"},Ps={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"},As={key:0,class:"tab-content"},qs={key:0,class:"mb-6 md:mb-8"},Ks={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"},Ms={key:1,class:"fade-in"},Rs={class:"glass-strong rounded-3xl p-4 shadow-xl md:p-6"},js={class:"mb-4 border-b border-gray-200 pb-4 dark:border-gray-700 md:mb-6 md:pb-6"},Us={class:"flex flex-col items-start justify-between gap-3 md:flex-row md:items-center md:gap-4"},Es={class:"flex w-full gap-2 md:w-auto"},Fs=["disabled"],Ns=["disabled"],Os={class:"mb-6 grid grid-cols-1 gap-4 md:mb-8 md:gap-6 lg:grid-cols-2"},Vs={key:1,class:"tab-content"},Ws={class:"glass-strong rounded-3xl shadow-xl"},zs={__name:"ApiStatsView",setup(h){const o=et(),a=K(),m=ot(),x=_("stats"),c=V(()=>m.isDarkMode),{apiKey:e,apiId:i,loading:p,modelStatsLoading:v,oemLoading:w,error:u,statsPeriod:g,statsData:U,oemSettings:T}=A(a),{queryStats:M,switchPeriod:I,loadStatsWithApiId:R,loadOemSettings:N,reset:O}=a,E=k=>{(k.ctrlKey||k.metaKey)&&k.key==="Enter"&&(!p.value&&e.value.trim()&&M(),k.preventDefault()),k.key==="Escape"&&O()};return tt(()=>{console.log("API Stats Page loaded"),m.initTheme(),N();const k=o.query.apiId,y=o.query.apiKey;k&&k.match(/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i)?(i.value=k,R()):y&&y.length>10&&(e.value=y),document.addEventListener("keydown",E)}),st(()=>{document.removeEventListener("keydown",E)}),at(e,k=>{k||a.clearData()}),(k,y)=>{const F=it("router-link");return d(),n("div",{class:C(["min-h-screen p-4 md:p-6",c.value?"gradient-bg-dark":"gradient-bg"])},[t("div",Ss,[t("div",Ts,[S(lt,{loading:s(w),"logo-src":s(T).siteIconData||s(T).siteIcon,subtitle:x.value==="stats"?"API Key 使用统计":"使用教程",title:s(T).siteName},null,8,["loading","logo-src","subtitle","title"]),t("div",Cs,[t("div",Ls,[S(nt,{mode:"dropdown"})]),y[5]||(y[5]=t("div",{class:"h-8 w-px bg-gradient-to-b from-transparent via-gray-300 to-transparent opacity-50 dark:via-gray-600"},null,-1)),S(F,{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:rt(()=>y[4]||(y[4]=[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,__:[4]})])])]),t("div",Is,[t("div",Ds,[t("div",Ps,[t("button",{class:C(["tab-pill-button",x.value==="stats"?"active":""]),onClick:y[0]||(y[0]=j=>x.value="stats")},y[6]||(y[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:C(["tab-pill-button",x.value==="tutorial"?"active":""]),onClick:y[1]||(y[1]=j=>x.value="tutorial")},y[7]||(y[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)])])]),x.value==="stats"?(d(),n("div",As,[S(ht),s(u)?(d(),n("div",qs,[t("div",Ks,[y[8]||(y[8]=t("i",{class:"fas fa-exclamation-triangle mr-2"},null,-1)),f(" "+l(s(u)),1)])])):L("",!0),s(U)?(d(),n("div",Ms,[t("div",Rs,[t("div",js,[t("div",Us,[y[11]||(y[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",Es,[t("button",{class:C(["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:s(g)==="daily"}]]),disabled:s(p)||s(v),onClick:y[2]||(y[2]=j=>s(I)("daily"))},y[9]||(y[9]=[t("i",{class:"fas fa-calendar-day text-xs md:text-sm"},null,-1),f(" 今日 ",-1)]),10,Fs),t("button",{class:C(["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:s(g)==="monthly"}]]),disabled:s(p)||s(v),onClick:y[3]||(y[3]=j=>s(I)("monthly"))},y[10]||(y[10]=[t("i",{class:"fas fa-calendar-alt text-xs md:text-sm"},null,-1),f(" 本月 ",-1)]),10,Ns)])])]),S(ae),t("div",Os,[S(_e),S(Ze)]),S($s)])])):L("",!0)])):L("",!0),x.value==="tutorial"?(d(),n("div",Vs,[t("div",Ws,[S(ct)])])):L("",!0)],2)}}},ta=q(zs,[["__scopeId","data-v-fa71f87c"]]);export{ta as default};