Files
claude-relay-service/web/admin-spa/dist/assets/ApiStatsView-RCOUbT-9.js
2025-08-31 12:19:41 +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 k,c as V,aV as A,x as o,y as n,z as t,O as y,K as H,aq as Q,u as e,aa as G,f as X,P as d,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-CQGf_uoy.js";import{L as nt}from"./LogoTitle-C2KiKqgX.js";import{T as lt}from"./ThemeToggle-Dif4r9F3.js";import{b as dt}from"./vendor-BDiMbLwQ.js";import{_ as mt}from"./WindowCountdown-C5cSuhod.js";import ct from"./TutorialView-CvV5dWQ-.js";import"./element-plus-Bq6mBxnk.js";class xt{constructor(){this.baseURL=window.location.origin,this.isDev=!1}async request(l,a={}){try{this.isDev&&l.startsWith("/admin")&&(l="/webapi"+l);const m=await fetch(`${this.baseURL}${l}`,{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(l){return this.request("/apiStats/api/get-key-id",{method:"POST",body:JSON.stringify({apiKey:l})})}async getUserStats(l){return this.request("/apiStats/api/user-stats",{method:"POST",body:JSON.stringify({apiId:l})})}async getUserModelStats(l,a="daily"){return this.request("/apiStats/api/user-model-stats",{method:"POST",body:JSON.stringify({apiId:l,period:a})})}async getOemSettings(){try{return await this.request("/admin/oem-settings")}catch(l){return console.error("Failed to load OEM settings:",l),{success:!0,data:{siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}}}}const P=new xt,K=Y("apistats",()=>{const h=k(""),l=k(null),a=k(!1),m=k(!1),x=k(!0),c=k(""),s=k("daily"),i=k(null),p=k([]),v=k(null),w=k(null),u=k({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 s.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=[],l.value=null;try{const r=await P.getKeyId(h.value);if(r.success){l.value=r.data.id;const b=await P.getUserStats(l.value);if(b.success)i.value=b.data,await M(),c.value="",f();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=[],l.value=null}finally{a.value=!1}}async function M(){l.value&&(await Promise.all([I("daily"),I("monthly")]),await R(s.value))}async function I(r){try{const b=await P.getUserModelStats(l.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=_($.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(l.value){m.value=!0;try{const b=await P.getUserModelStats(l.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){s.value===r||m.value||(s.value=r,(r==="daily"&&!v.value||r==="monthly"&&!w.value)&&await I(r),await R(r))}async function O(){if(l.value){a.value=!0,c.value="",i.value=null,p.value=[];try{const r=await P.getUserStats(l.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 _(r){return typeof r!="number"||r===0?"$0.000000":r>=1?"$"+r.toFixed(2):r>=.01?"$"+r.toFixed(4):"$"+r.toFixed(6)}function f(){if(l.value){const r=new URL(window.location);r.searchParams.set("apiId",l.value),window.history.pushState({},"",r)}}function F(){i.value=null,p.value=[],v.value=null,w.value=null,c.value="",s.value="daily",l.value=null}function j(){h.value="",F()}return{apiKey:h,apiId:l,loading:a,modelStatsLoading:m,oemLoading:x,error:c,statsPeriod:s,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"],_t={key:0,class:"fas fa-spinner loading-spinner"},kt={key:1,class:"fas fa-search"},wt={__name:"ApiKeyInput",setup(h){const l=K(),{apiKey:a,loading:m}=A(l),{queryStats:x}=l;return(c,s)=>(n(),o("div",ut,[s[6]||(s[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"}),y(" 使用统计查询 ")]),t("p",{class:"text-base text-gray-600 dark:text-gray-300"},"查询您的 API Key 使用情况和统计数据")],-1)),t("div",gt,[t("div",ft,[t("div",yt,[s[3]||(s[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"}),y(" 输入您的 API Key ")],-1)),H(t("input",{"onUpdate:modelValue":s[0]||(s[0]=i=>X(a)?a.value=i:null),class:"wide-card-input w-full",disabled:e(m),placeholder:"请输入您的 API Key (cr_...)",type:"password",onKeyup:s[1]||(s[1]=G((...i)=>e(x)&&e(x)(...i),["enter"]))},null,40,pt),[[Q,e(a)]])]),t("div",bt,[s[4]||(s[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:e(m)||!e(a).trim(),onClick:s[2]||(s[2]=(...i)=>e(x)&&e(x)(...i))},[e(m)?(n(),o("i",_t)):(n(),o("i",kt)),y(" "+d(e(m)?"查询中...":"查询统计"),1)],8,vt)])]),s[5]||(s[5]=t("div",{class:"security-notice mt-4"},[t("i",{class:"fas fa-shield-alt mr-2"}),y(" 您的 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 l=K(),{statsData:a,statsPeriod:m,currentPeriodData:x}=A(l),c=u=>{if(!u)return"无";try{return dt(u).format("YYYY年MM月DD日 HH:mm")}catch{return"格式错误"}},s=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)=>(n(),o("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"}),y(" 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,d(e(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",e(a).isActive?"text-green-600":"text-red-600"])},[t("i",{class:C(["mr-1 text-xs md:text-sm",e(a).isActive?"fas fa-check-circle":"fas fa-times-circle"])},null,2),y(" "+d(e(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,d(w(e(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,d(c(e(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)),e(a).expiresAt?(n(),o("div",Mt,[i(e(a).expiresAt)?(n(),o("div",Rt,g[4]||(g[4]=[t("i",{class:"fas fa-exclamation-circle mr-1 text-xs md:text-sm"},null,-1),y(" 已过期 ",-1)]))):p(e(a).expiresAt)?(n(),o("div",jt,[g[5]||(g[5]=t("i",{class:"fas fa-clock mr-1 text-xs md:text-sm"},null,-1)),y(" "+d(s(e(a).expiresAt)),1)])):(n(),o("div",Ut,d(s(e(a).expiresAt)),1))])):(n(),o("div",Et,g[6]||(g[6]=[t("i",{class:"fas fa-infinity mr-1 text-xs md:text-sm"},null,-1),y(" 永不过期 ",-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"}),y(" 使用统计概览 ")],-1)),t("span",Ot,"("+d(e(m)==="daily"?"今日":"本月")+")",1)]),t("div",Vt,[t("div",Wt,[t("div",zt,d(v(e(x).requests)),1),t("div",Bt,d(e(m)==="daily"?"今日":"本月")+"请求数 ",1)]),t("div",Jt,[t("div",Yt,d(v(e(x).allTokens)),1),t("div",Ht,d(e(m)==="daily"?"今日":"本月")+"Token数 ",1)]),t("div",Qt,[t("div",Gt,d(e(x).formattedCost||"$0.000000"),1),t("div",Xt,d(e(m)==="daily"?"今日":"本月")+"费用 ",1)]),t("div",Zt,[t("div",te,d(v(e(x).inputTokens)),1),t("div",ee,d(e(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"},ne={class:"space-y-2 md:space-y-3"},le={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"},_e={__name:"TokenDistribution",setup(h){const l=K(),{statsPeriod:a,currentPeriodData:m}=A(l),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,s)=>(n(),o("div",re,[t("h3",ie,[s[0]||(s[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"}),y(" Token 使用分布 ")],-1)),t("span",oe,"("+d(e(a)==="daily"?"今日":"本月")+")",1)]),t("div",ne,[t("div",le,[s[1]||(s[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"}),y(" 输入 Token ")],-1)),t("span",de,d(x(e(m).inputTokens)),1)]),t("div",me,[s[2]||(s[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"}),y(" 输出 Token ")],-1)),t("span",ce,d(x(e(m).outputTokens)),1)]),t("div",xe,[s[3]||(s[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"}),y(" 缓存创建 Token ")],-1)),t("span",ue,d(x(e(m).cacheCreateTokens)),1)]),t("div",ge,[s[4]||(s[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"}),y(" 缓存读取 Token ")],-1)),t("span",fe,d(x(e(m).cacheReadTokens)),1)])]),t("div",ye,[t("div",pe,[t("span",be,d(e(a)==="daily"?"今日":"本月")+"总计",1),t("span",ve,d(x(e(m).allTokens)),1)])])]))}},ke=q(_e,[["__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:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Ae={key:0},qe={key:1},Ke={key:2},Me={class:"space-y-2 border-t border-gray-100 pt-2 dark:border-gray-700"},Re={class:"flex items-center justify-between"},je={class:"text-sm font-medium text-gray-900 md:text-base"},Ue={key:0},Ee={key:1,class:"flex items-center gap-1"},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={class:"flex items-center justify-between"},ze={class:"text-sm font-medium text-gray-900 md:text-base"},Be={key:0,class:"text-orange-600"},Je={key:1,class:"text-green-600"},Ye={key:0,class:"card mt-4 p-4 md:mt-6 md:p-6"},He={class:"grid grid-cols-1 gap-4 md:gap-6 lg:grid-cols-2"},Qe={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"},Ge={class:"space-y-1 md:space-y-2"},Xe={class:"break-all text-gray-800 dark:text-gray-200"},Ze={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"},ts={class:"space-y-1 md:space-y-2"},es={class:"break-all text-gray-800 dark:text-gray-200"},ss={__name:"LimitConfig",setup(h){const l=K(),{statsData:a}=A(l),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,s)=>(n(),o("div",null,[t("div",we,[s[12]||(s[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"}),y(" 限制配置 ")],-1)),t("div",he,[t("div",null,[t("div",$e,[s[1]||(s[1]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"每日费用限制",-1)),t("span",Se,[e(a).limits.dailyCostLimit>0?(n(),o("span",Te," $"+d(e(a).limits.currentDailyCost.toFixed(4))+" / $"+d(e(a).limits.dailyCostLimit.toFixed(2)),1)):(n(),o("span",Ce,[y(" $"+d(e(a).limits.currentDailyCost.toFixed(4))+" / ",1),s[0]||(s[0]=t("i",{class:"fas fa-infinity"},null,-1))]))])]),e(a).limits.dailyCostLimit>0?(n(),o("div",Le,[t("div",{class:C(["h-2 rounded-full transition-all duration-300",x()]),style:Z({width:m()+"%"})},null,6)])):(n(),o("div",Ie,s[2]||(s[2]=[t("div",{class:"h-2 rounded-full bg-green-500",style:{width:"0%"}},null,-1)])))]),e(a).limits.rateLimitWindow>0&&(e(a).limits.rateLimitRequests>0||e(a).limits.tokenLimit>0||e(a).limits.rateLimitCost>0)?(n(),o("div",De,[S(mt,{"cost-limit":e(a).limits.rateLimitCost,"current-cost":e(a).limits.currentWindowCost,"current-requests":e(a).limits.currentWindowRequests,"current-tokens":e(a).limits.currentWindowTokens,label:"时间窗口限制","rate-limit-window":e(a).limits.rateLimitWindow,"request-limit":e(a).limits.rateLimitRequests,"show-progress":!0,"show-tooltip":!0,"token-limit":e(a).limits.tokenLimit,"window-end-time":e(a).limits.windowEndTime,"window-remaining-seconds":e(a).limits.windowRemainingSeconds,"window-start-time":e(a).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",Pe,[s[3]||(s[3]=t("i",{class:"fas fa-info-circle mr-1"},null,-1)),e(a).limits.rateLimitCost>0?(n(),o("span",Ae,' 请求次数和费用限制为"或"的关系,任一达到限制即触发限流 ')):e(a).limits.tokenLimit>0?(n(),o("span",qe,' 请求次数和Token使用量为"或"的关系,任一达到限制即触发限流 ')):(n(),o("span",Ke," 仅限制请求次数 "))])])):L("",!0),t("div",Me,[t("div",Re,[s[5]||(s[5]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"并发限制",-1)),t("span",je,[e(a).limits.concurrencyLimit>0?(n(),o("span",Ue,d(e(a).limits.concurrencyLimit),1)):(n(),o("span",Ee,s[4]||(s[4]=[t("i",{class:"fas fa-infinity text-gray-400"},null,-1)])))])]),t("div",Fe,[s[8]||(s[8]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"模型限制",-1)),t("span",Ne,[e(a).restrictions.enableModelRestriction&&e(a).restrictions.restrictedModels.length>0?(n(),o("span",Oe,[s[6]||(s[6]=t("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),y(" 限制 "+d(e(a).restrictions.restrictedModels.length)+" 个模型 ",1)])):(n(),o("span",Ve,s[7]||(s[7]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),y(" 允许所有模型 ",-1)])))])]),t("div",We,[s[11]||(s[11]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"客户端限制",-1)),t("span",ze,[e(a).restrictions.enableClientRestriction&&e(a).restrictions.allowedClients.length>0?(n(),o("span",Be,[s[9]||(s[9]=t("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),y(" 限制 "+d(e(a).restrictions.allowedClients.length)+" 个客户端 ",1)])):(n(),o("span",Je,s[10]||(s[10]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),y(" 允许所有客户端 ",-1)])))])])])])]),e(a).restrictions.enableModelRestriction&&e(a).restrictions.restrictedModels.length>0||e(a).restrictions.enableClientRestriction&&e(a).restrictions.allowedClients.length>0?(n(),o("div",Ye,[s[19]||(s[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"}),y(" 详细限制信息 ")],-1)),t("div",He,[e(a).restrictions.enableModelRestriction&&e(a).restrictions.restrictedModels.length>0?(n(),o("div",Qe,[s[14]||(s[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"}),y(" 受限模型列表 ")],-1)),t("div",Ge,[(n(!0),o(W,null,z(e(a).restrictions.restrictedModels,i=>(n(),o("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"},[s[13]||(s[13]=t("i",{class:"fas fa-ban mr-1 text-xs text-red-500 md:mr-2"},null,-1)),t("span",Xe,d(i),1)]))),128))]),s[15]||(s[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"}),y(" 此 API Key 不能访问以上列出的模型 ")],-1))])):L("",!0),e(a).restrictions.enableClientRestriction&&e(a).restrictions.allowedClients.length>0?(n(),o("div",Ze,[s[17]||(s[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"}),y(" 允许的客户端 ")],-1)),t("div",ts,[(n(!0),o(W,null,z(e(a).restrictions.allowedClients,i=>(n(),o("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"},[s[16]||(s[16]=t("i",{class:"fas fa-check mr-1 text-xs text-green-500 md:mr-2"},null,-1)),t("span",es,d(i),1)]))),128))]),s[18]||(s[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"}),y(" 此 API Key 只能被以上列出的客户端使用 ")],-1))])):L("",!0)])])):L("",!0)]))}},as=q(ss,[["__scopeId","data-v-184f8e9d"]]),rs={class:"card p-4 md:p-6"},is={class:"mb-4 md:mb-6"},os={class:"flex flex-col text-lg font-bold text-gray-900 dark:text-gray-100 sm:flex-row sm:items-center md:text-xl"},ns={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},ls={key:0,class:"py-6 text-center md:py-8"},ds={key:1,class:"space-y-3 md:space-y-4"},ms={class:"mb-2 flex items-start justify-between md:mb-3"},cs={class:"min-w-0 flex-1"},xs={class:"break-all text-base font-bold text-gray-900 dark:text-gray-100 md:text-lg"},us={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},gs={class:"ml-3 flex-shrink-0 text-right"},fs={class:"text-base font-bold text-green-600 md:text-lg"},ys={class:"grid grid-cols-2 gap-2 text-xs md:grid-cols-4 md:gap-3 md:text-sm"},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"},_s={class:"font-medium text-gray-900 dark:text-gray-100"},ks={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},ws={class:"font-medium text-gray-900 dark:text-gray-100"},hs={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},$s={class:"font-medium text-gray-900 dark:text-gray-100"},Ss={key:2,class:"py-6 text-center text-gray-500 dark:text-gray-400 md:py-8"},Ts={class:"text-sm md:text-base"},Cs={__name:"ModelUsageStats",setup(h){const l=K(),{statsPeriod:a,modelStats:m,modelStatsLoading:x}=A(l),c=s=>(typeof s!="number"&&(s=parseInt(s)||0),s===0?"0":s>=1e6?(s/1e6).toFixed(1)+"M":s>=1e3?(s/1e3).toFixed(1)+"K":s.toLocaleString());return(s,i)=>(n(),o("div",rs,[t("div",is,[t("h3",os,[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"}),y(" 模型使用统计 ")],-1)),t("span",ns,"("+d(e(a)==="daily"?"今日":"本月")+")",1)])]),e(x)?(n(),o("div",ls,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)]))):e(m).length>0?(n(),o("div",ds,[(n(!0),o(W,null,z(e(m),(p,v)=>{var w;return n(),o("div",{key:v,class:"model-usage-item"},[t("div",ms,[t("div",cs,[t("h4",xs,d(p.model),1),t("p",us,d(p.requests)+" 次请求 ",1)]),t("div",gs,[t("div",fs,d(((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",ys,[t("div",ps,[i[3]||(i[3]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输入 Token",-1)),t("div",bs,d(c(p.inputTokens)),1)]),t("div",vs,[i[4]||(i[4]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输出 Token",-1)),t("div",_s,d(c(p.outputTokens)),1)]),t("div",ks,[i[5]||(i[5]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存创建",-1)),t("div",ws,d(c(p.cacheCreateTokens)),1)]),t("div",hs,[i[6]||(i[6]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存读取",-1)),t("div",$s,d(c(p.cacheReadTokens)),1)])])])}),128))])):(n(),o("div",Ss,[i[7]||(i[7]=t("i",{class:"fas fa-chart-pie mb-3 text-2xl md:text-3xl"},null,-1)),t("p",Ts," 暂无"+d(e(a)==="daily"?"今日":"本月")+"模型使用数据 ",1)]))]))}},Ls=q(Cs,[["__scopeId","data-v-b3b8dc5f"]]),Is={class:"glass-strong mb-6 rounded-3xl p-4 shadow-xl md:mb-8 md:p-6"},Ds={class:"flex flex-col items-center justify-between gap-4 md:flex-row"},Ps={class:"flex items-center gap-2 md:gap-4"},As={class:"flex items-center"},qs={class:"mb-6 md:mb-8"},Ks={class:"flex justify-center"},Ms={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"},Rs={key:0,class:"tab-content"},js={key:0,class:"mb-6 md:mb-8"},Us={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"},Es={key:1,class:"fade-in"},Fs={class:"glass-strong rounded-3xl p-4 shadow-xl md:p-6"},Ns={class:"mb-4 border-b border-gray-200 pb-4 dark:border-gray-700 md:mb-6 md:pb-6"},Os={class:"flex flex-col items-start justify-between gap-3 md:flex-row md:items-center md:gap-4"},Vs={class:"flex w-full gap-2 md:w-auto"},Ws=["disabled"],zs=["disabled"],Bs={class:"mb-6 grid grid-cols-1 gap-4 md:mb-8 md:gap-6 lg:grid-cols-2"},Js={key:1,class:"tab-content"},Ys={class:"glass-strong rounded-3xl shadow-xl"},Hs={__name:"ApiStatsView",setup(h){const l=et(),a=K(),m=ot(),x=k("stats"),c=V(()=>m.isDarkMode),{apiKey:s,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=_=>{(_.ctrlKey||_.metaKey)&&_.key==="Enter"&&(!p.value&&s.value.trim()&&M(),_.preventDefault()),_.key==="Escape"&&O()};return tt(()=>{console.log("API Stats Page loaded"),m.initTheme(),N();const _=l.query.apiId,f=l.query.apiKey;_&&_.match(/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i)?(i.value=_,R()):f&&f.length>10&&(s.value=f),document.addEventListener("keydown",E)}),st(()=>{document.removeEventListener("keydown",E)}),at(s,_=>{_||a.clearData()}),(_,f)=>{const F=it("router-link");return n(),o("div",{class:C(["min-h-screen p-4 md:p-6",c.value?"gradient-bg-dark":"gradient-bg"])},[t("div",Is,[t("div",Ds,[S(nt,{loading:e(w),"logo-src":e(T).siteIconData||e(T).siteIcon,subtitle:x.value==="stats"?"API Key 使用统计":"使用教程",title:e(T).siteName},null,8,["loading","logo-src","subtitle","title"]),t("div",Ps,[t("div",As,[S(lt,{mode:"dropdown"})]),f[5]||(f[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(()=>f[4]||(f[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",qs,[t("div",Ks,[t("div",Ms,[t("button",{class:C(["tab-pill-button",x.value==="stats"?"active":""]),onClick:f[0]||(f[0]=j=>x.value="stats")},f[6]||(f[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:f[1]||(f[1]=j=>x.value="tutorial")},f[7]||(f[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"?(n(),o("div",Rs,[S(ht),e(u)?(n(),o("div",js,[t("div",Us,[f[8]||(f[8]=t("i",{class:"fas fa-exclamation-triangle mr-2"},null,-1)),y(" "+d(e(u)),1)])])):L("",!0),e(U)?(n(),o("div",Es,[t("div",Fs,[t("div",Ns,[t("div",Os,[f[11]||(f[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",Vs,[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:e(g)==="daily"}]]),disabled:e(p)||e(v),onClick:f[2]||(f[2]=j=>e(I)("daily"))},f[9]||(f[9]=[t("i",{class:"fas fa-calendar-day text-xs md:text-sm"},null,-1),y(" 今日 ",-1)]),10,Ws),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:e(g)==="monthly"}]]),disabled:e(p)||e(v),onClick:f[3]||(f[3]=j=>e(I)("monthly"))},f[10]||(f[10]=[t("i",{class:"fas fa-calendar-alt text-xs md:text-sm"},null,-1),y(" 本月 ",-1)]),10,zs)])])]),S(ae),t("div",Bs,[S(ke),S(as)]),S(Ls)])])):L("",!0)])):L("",!0),x.value==="tutorial"?(n(),o("div",Js,[t("div",Ys,[S(ct)])])):L("",!0)],2)}}},ra=q(Hs,[["__scopeId","data-v-fa71f87c"]]);export{ra as default};