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