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