mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
2 lines
31 KiB
JavaScript
2 lines
31 KiB
JavaScript
import{aP as H,r as k,c as V,aX as A,x as l,y as i,z as t,O as y,K as Q,aq as G,u as e,aa as X,f as Z,P as d,C as L,L as C,B as tt,R as S,Q as W,ac as B,q as et,aW as st,V as at,o as rt,I as it,J,av as ot}from"./vue-vendor-Bsazo-x0.js";import{_ as q,a as lt}from"./index-B2CfBDav.js";import{L as nt}from"./LogoTitle-CcmnZyby.js";import{T as dt}from"./ThemeToggle-Ov1cO6jp.js";import{b as mt}from"./vendor-C8JtMHuO.js";import{_ as ct}from"./WindowCountdown-BTXjZ8Dc.js";import xt from"./TutorialView-CrgbxRRM.js";import"./element-plus-C5sO7D8l.js";class ut{constructor(){this.baseURL=window.location.origin,this.isDev=!1}async request(n,a={}){try{this.isDev&&n.startsWith("/admin")&&(n="/webapi"+n);const m=await fetch(`${this.baseURL}${n}`,{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(n){return this.request("/apiStats/api/get-key-id",{method:"POST",body:JSON.stringify({apiKey:n})})}async getUserStats(n){return this.request("/apiStats/api/user-stats",{method:"POST",body:JSON.stringify({apiId:n})})}async getUserModelStats(n,a="daily"){return this.request("/apiStats/api/user-model-stats",{method:"POST",body:JSON.stringify({apiId:n,period:a})})}async getOemSettings(){try{return await this.request("/admin/oem-settings")}catch(n){return console.error("Failed to load OEM settings:",n),{success:!0,data:{siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}}}}const P=new ut,K=H("apistats",()=>{const h=k(""),n=k(null),a=k(!1),m=k(!1),x=k(!0),c=k(""),s=k("daily"),o=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}),E=V(()=>{if(!o.value||!g.value)return{tokenUsage:0,costUsage:0,requestUsage:0};const r=g.value,b=o.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="",o.value=null,p.value=[],n.value=null;try{const r=await P.getKeyId(h.value);if(r.success){n.value=r.data.id;const b=await P.getUserStats(n.value);if(b.success)o.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 是否正确",o.value=null,p.value=[],n.value=null}finally{a.value=!1}}async function M(){n.value&&(await Promise.all([I("daily"),I("monthly")]),await R(s.value))}async function I(r){try{const b=await P.getUserModelStats(n.value,r);if(b.success){const Y=b.data||[],$={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};Y.forEach(D=>{var z;$.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+=((z=D.costs)==null?void 0:z.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(n.value){m.value=!0;try{const b=await P.getUserModelStats(n.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(n.value){a.value=!0,c.value="",o.value=null,p.value=[];try{const r=await P.getUserStats(n.value);if(r.success)o.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||"查询统计数据失败",o.value=null,p.value=[]}finally{a.value=!1}}}async function F(){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(n.value){const r=new URL(window.location);r.searchParams.set("apiId",n.value),window.history.pushState({},"",r)}}function j(){o.value=null,p.value=[],v.value=null,w.value=null,c.value="",s.value="daily",n.value=null}function U(){h.value="",j()}return{apiKey:h,apiId:n,loading:a,modelStatsLoading:m,oemLoading:x,error:c,statsPeriod:s,statsData:o,modelStats:p,dailyStats:v,monthlyStats:w,oemSettings:u,currentPeriodData:g,usagePercentages:E,queryStats:T,loadAllPeriodStats:M,loadPeriodStats:I,loadModelStats:R,switchPeriod:N,loadStatsWithApiId:O,loadOemSettings:F,clearData:j,reset:U}}),gt={class:"api-input-wide-card mb-8 rounded-3xl p-6 shadow-xl"},ft={class:"mx-auto max-w-4xl"},yt={class:"api-input-grid grid grid-cols-1 lg:grid-cols-4"},pt={class:"lg:col-span-3"},bt=["disabled"],vt={class:"lg:col-span-1"},_t=["disabled"],kt={key:0,class:"fas fa-spinner loading-spinner"},wt={key:1,class:"fas fa-search"},ht={__name:"ApiKeyInput",setup(h){const n=K(),{apiKey:a,loading:m}=A(n),{queryStats:x}=n;return(c,s)=>(i(),l("div",gt,[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",ft,[t("div",yt,[t("div",pt,[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)),Q(t("input",{"onUpdate:modelValue":s[0]||(s[0]=o=>Z(a)?a.value=o:null),class:"wide-card-input w-full",disabled:e(m),placeholder:"请输入您的 API Key (cr_...)",type:"password",onKeyup:s[1]||(s[1]=X((...o)=>e(x)&&e(x)(...o),["enter"]))},null,40,bt),[[G,e(a)]])]),t("div",vt,[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]=(...o)=>e(x)&&e(x)(...o))},[e(m)?(i(),l("i",kt)):(i(),l("i",wt)),y(" "+d(e(m)?"查询中...":"查询统计"),1)],8,_t)])]),s[5]||(s[5]=t("div",{class:"security-notice mt-4"},[t("i",{class:"fas fa-shield-alt mr-2"}),y(" 您的 API Key 仅用于查询自己的统计数据,不会被存储或用于其他用途 ")],-1))])]))}},$t=q(ht,[["__scopeId","data-v-0b1313e4"]]),St={class:"mb-6 grid grid-cols-1 gap-4 md:mb-8 md:gap-6 lg:grid-cols-2"},Tt={class:"card p-4 md:p-6"},Ct={class:"space-y-2 md:space-y-3"},Lt={class:"flex items-center justify-between"},It={class:"break-all text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},Dt={class:"flex items-center justify-between"},Pt={class:"flex items-center justify-between"},At={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},qt={class:"flex items-center justify-between"},Kt={class:"break-all text-xs font-medium text-gray-900 dark:text-gray-100 md:text-base"},Mt={class:"flex items-start justify-between"},Rt={key:0,class:"text-right"},jt={key:0,class:"text-sm font-medium text-red-600 md:text-base"},Ut={key:1,class:"break-all text-xs font-medium text-orange-600 md:text-base"},Et={key:2,class:"break-all text-xs font-medium text-gray-900 dark:text-gray-100 md:text-base"},Ft={key:1,class:"text-sm font-medium text-gray-400 dark:text-gray-500 md:text-base"},Nt={class:"card p-4 md:p-6"},Ot={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"},Vt={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},Wt={class:"grid grid-cols-2 gap-3 md:gap-4"},Bt={class:"stat-card text-center"},zt={class:"text-lg font-bold text-green-600 md:text-3xl"},Jt={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},Yt={class:"stat-card text-center"},Ht={class:"text-lg font-bold text-blue-600 md:text-3xl"},Qt={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},Gt={class:"stat-card text-center"},Xt={class:"text-lg font-bold text-purple-600 md:text-3xl"},Zt={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},te={class:"stat-card text-center"},ee={class:"text-lg font-bold text-yellow-600 md:text-3xl"},se={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},ae={__name:"StatsOverview",setup(h){const n=K(),{statsData:a,statsPeriod:m,currentPeriodData:x}=A(n),c=u=>{if(!u)return"无";try{return mt(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"}):"",o=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)=>(i(),l("div",St,[t("div",Tt,[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",Ct,[t("div",Lt,[g[0]||(g[0]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"名称",-1)),t("span",It,d(e(a).name),1)]),t("div",Dt,[g[1]||(g[1]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"状态",-1)),t("span",{class:L(["text-sm font-medium md:text-base",e(a).isActive?"text-green-600":"text-red-600"])},[t("i",{class:L(["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",Pt,[g[2]||(g[2]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"权限",-1)),t("span",At,d(w(e(a).permissions)),1)]),t("div",qt,[g[3]||(g[3]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"创建时间",-1)),t("span",Kt,d(c(e(a).createdAt)),1)]),t("div",Mt,[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?(i(),l("div",Rt,[o(e(a).expiresAt)?(i(),l("div",jt,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)?(i(),l("div",Ut,[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)])):(i(),l("div",Et,d(s(e(a).expiresAt)),1))])):(i(),l("div",Ft,g[6]||(g[6]=[t("i",{class:"fas fa-infinity mr-1 text-xs md:text-sm"},null,-1),y(" 永不过期 ",-1)])))])])]),t("div",Nt,[t("h3",Ot,[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",Vt,"("+d(e(m)==="daily"?"今日":"本月")+")",1)]),t("div",Wt,[t("div",Bt,[t("div",zt,d(v(e(x).requests)),1),t("div",Jt,d(e(m)==="daily"?"今日":"本月")+"请求数 ",1)]),t("div",Yt,[t("div",Ht,d(v(e(x).allTokens)),1),t("div",Qt,d(e(m)==="daily"?"今日":"本月")+"Token数 ",1)]),t("div",Gt,[t("div",Xt,d(e(x).formattedCost||"$0.000000"),1),t("div",Zt,d(e(m)==="daily"?"今日":"本月")+"费用 ",1)]),t("div",te,[t("div",ee,d(v(e(x).inputTokens)),1),t("div",se,d(e(m)==="daily"?"今日":"本月")+"输入Token ",1)])])])]))}},re=q(ae,[["__scopeId","data-v-f536da49"]]),ie={class:"card p-4 md:p-6"},oe={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"},le={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"},de={class:"flex items-center justify-between"},me={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},ce={class:"flex items-center justify-between"},xe={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},ue={class:"flex items-center justify-between"},ge={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},fe={class:"flex items-center justify-between"},ye={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},pe={class:"mt-3 border-t border-gray-200 pt-3 dark:border-gray-700 md:mt-4 md:pt-4"},be={class:"flex items-center justify-between font-bold text-gray-900 dark:text-gray-100"},ve={class:"text-sm md:text-base"},_e={class:"text-lg md:text-xl"},ke={__name:"TokenDistribution",setup(h){const n=K(),{statsPeriod:a,currentPeriodData:m}=A(n),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)=>(i(),l("div",ie,[t("h3",oe,[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",le,"("+d(e(a)==="daily"?"今日":"本月")+")",1)]),t("div",ne,[t("div",de,[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",me,d(x(e(m).inputTokens)),1)]),t("div",ce,[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",xe,d(x(e(m).outputTokens)),1)]),t("div",ue,[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",ge,d(x(e(m).cacheCreateTokens)),1)]),t("div",fe,[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",ye,d(x(e(m).cacheReadTokens)),1)])]),t("div",pe,[t("div",be,[t("span",ve,d(e(a)==="daily"?"今日":"本月")+"总计",1),t("span",_e,d(x(e(m).allTokens)),1)])])]))}},we=q(ke,[["__scopeId","data-v-ecee0a94"]]),he={class:"card p-4 md:p-6"},$e={class:"space-y-4 md:space-y-5"},Se={class:"mb-2 flex items-center justify-between"},Te={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},Ce={key:0},Le={key:1,class:"flex items-center gap-1"},Ie={key:0,class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},De={key:1,class:"h-2 w-full rounded-full bg-gray-200"},Pe={key:0},Ae={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},qe={key:0},Ke={key:1},Me={key:2},Re={class:"space-y-2 border-t border-gray-100 pt-2 dark:border-gray-700"},je={class:"flex items-center justify-between"},Ue={class:"text-sm font-medium text-gray-900 md:text-base"},Ee={key:0},Fe={key:1,class:"flex items-center gap-1"},Ne={class:"flex items-center justify-between"},Oe={class:"text-sm font-medium text-gray-900 md:text-base"},Ve={key:0,class:"text-orange-600"},We={key:1,class:"text-green-600"},Be={class:"flex items-center justify-between"},ze={class:"text-sm font-medium text-gray-900 md:text-base"},Je={key:0,class:"text-orange-600"},Ye={key:1,class:"text-green-600"},He={key:0,class:"card mt-4 p-4 md:mt-6 md:p-6"},Qe={class:"grid grid-cols-1 gap-4 md:gap-6 lg:grid-cols-2"},Ge={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"},Xe={class:"space-y-1 md:space-y-2"},Ze={class:"break-all text-gray-800 dark:text-gray-200"},ts={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"},es={class:"space-y-1 md:space-y-2"},ss={class:"break-all text-gray-800 dark:text-gray-200"},as={__name:"LimitConfig",setup(h){const n=K(),{statsData:a}=A(n),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)=>(i(),l("div",null,[t("div",he,[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",$e,[t("div",null,[t("div",Se,[s[1]||(s[1]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"每日费用限制",-1)),t("span",Te,[e(a).limits.dailyCostLimit>0?(i(),l("span",Ce," $"+d(e(a).limits.currentDailyCost.toFixed(4))+" / $"+d(e(a).limits.dailyCostLimit.toFixed(2)),1)):(i(),l("span",Le,[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?(i(),l("div",Ie,[t("div",{class:L(["h-2 rounded-full transition-all duration-300",x()]),style:tt({width:m()+"%"})},null,6)])):(i(),l("div",De,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)?(i(),l("div",Pe,[S(ct,{"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",Ae,[s[3]||(s[3]=t("i",{class:"fas fa-info-circle mr-1"},null,-1)),e(a).limits.rateLimitCost>0?(i(),l("span",qe,' 请求次数和费用限制为"或"的关系,任一达到限制即触发限流 ')):e(a).limits.tokenLimit>0?(i(),l("span",Ke,' 请求次数和Token使用量为"或"的关系,任一达到限制即触发限流 ')):(i(),l("span",Me," 仅限制请求次数 "))])])):C("",!0),t("div",Re,[t("div",je,[s[5]||(s[5]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"并发限制",-1)),t("span",Ue,[e(a).limits.concurrencyLimit>0?(i(),l("span",Ee,d(e(a).limits.concurrencyLimit),1)):(i(),l("span",Fe,s[4]||(s[4]=[t("i",{class:"fas fa-infinity text-gray-400"},null,-1)])))])]),t("div",Ne,[s[8]||(s[8]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"模型限制",-1)),t("span",Oe,[e(a).restrictions.enableModelRestriction&&e(a).restrictions.restrictedModels.length>0?(i(),l("span",Ve,[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)])):(i(),l("span",We,s[7]||(s[7]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),y(" 允许所有模型 ",-1)])))])]),t("div",Be,[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?(i(),l("span",Je,[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)])):(i(),l("span",Ye,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?(i(),l("div",He,[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",Qe,[e(a).restrictions.enableModelRestriction&&e(a).restrictions.restrictedModels.length>0?(i(),l("div",Ge,[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",Xe,[(i(!0),l(W,null,B(e(a).restrictions.restrictedModels,o=>(i(),l("div",{key:o,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",Ze,d(o),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))])):C("",!0),e(a).restrictions.enableClientRestriction&&e(a).restrictions.allowedClients.length>0?(i(),l("div",ts,[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",es,[(i(!0),l(W,null,B(e(a).restrictions.allowedClients,o=>(i(),l("div",{key:o,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",ss,d(o),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))])):C("",!0)])])):C("",!0)]))}},rs=q(as,[["__scopeId","data-v-184f8e9d"]]),is={class:"card p-4 md:p-6"},os={class:"mb-4 md:mb-6"},ls={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"},ds={key:0,class:"py-6 text-center md:py-8"},ms={key:1,class:"space-y-3 md:space-y-4"},cs={class:"mb-2 flex items-start justify-between md:mb-3"},xs={class:"min-w-0 flex-1"},us={class:"break-all text-base font-bold text-gray-900 dark:text-gray-100 md:text-lg"},gs={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},fs={class:"ml-3 flex-shrink-0 text-right"},ys={class:"text-base font-bold text-green-600 md:text-lg"},ps={class:"grid grid-cols-2 gap-2 text-xs md:grid-cols-4 md:gap-3 md:text-sm"},bs={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},vs={class:"font-medium text-gray-900 dark:text-gray-100"},_s={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},ks={class:"font-medium text-gray-900 dark:text-gray-100"},ws={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},hs={class:"font-medium text-gray-900 dark:text-gray-100"},$s={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},Ss={class:"font-medium text-gray-900 dark:text-gray-100"},Ts={key:2,class:"py-6 text-center text-gray-500 dark:text-gray-400 md:py-8"},Cs={class:"text-sm md:text-base"},Ls={__name:"ModelUsageStats",setup(h){const n=K(),{statsPeriod:a,modelStats:m,modelStatsLoading:x}=A(n),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,o)=>(i(),l("div",is,[t("div",os,[t("h3",ls,[o[0]||(o[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)?(i(),l("div",ds,o[1]||(o[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?(i(),l("div",ms,[(i(!0),l(W,null,B(e(m),(p,v)=>{var w;return i(),l("div",{key:v,class:"model-usage-item"},[t("div",cs,[t("div",xs,[t("h4",us,d(p.model),1),t("p",gs,d(p.requests)+" 次请求 ",1)]),t("div",fs,[t("div",ys,d(((w=p.formatted)==null?void 0:w.total)||"$0.000000"),1),o[2]||(o[2]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},"总费用",-1))])]),t("div",ps,[t("div",bs,[o[3]||(o[3]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输入 Token",-1)),t("div",vs,d(c(p.inputTokens)),1)]),t("div",_s,[o[4]||(o[4]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输出 Token",-1)),t("div",ks,d(c(p.outputTokens)),1)]),t("div",ws,[o[5]||(o[5]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存创建",-1)),t("div",hs,d(c(p.cacheCreateTokens)),1)]),t("div",$s,[o[6]||(o[6]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存读取",-1)),t("div",Ss,d(c(p.cacheReadTokens)),1)])])])}),128))])):(i(),l("div",Ts,[o[7]||(o[7]=t("i",{class:"fas fa-chart-pie mb-3 text-2xl md:text-3xl"},null,-1)),t("p",Cs," 暂无"+d(e(a)==="daily"?"今日":"本月")+"模型使用数据 ",1)]))]))}},Is=q(Ls,[["__scopeId","data-v-b3b8dc5f"]]),Ds={class:"glass-strong mb-6 rounded-3xl p-4 shadow-xl md:mb-8 md:p-6"},Ps={class:"flex flex-col items-center justify-between gap-4 md:flex-row"},As={class:"flex items-center gap-2 md:gap-4"},qs={class:"flex items-center"},Ks={class:"mb-6 md:mb-8"},Ms={class:"flex justify-center"},Rs={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"},js={key:0,class:"tab-content"},Us={key:0,class:"mb-6 md:mb-8"},Es={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"},Fs={key:1,class:"fade-in"},Ns={class:"glass-strong rounded-3xl p-4 shadow-xl md:p-6"},Os={class:"mb-4 border-b border-gray-200 pb-4 dark:border-gray-700 md:mb-6 md:pb-6"},Vs={class:"flex flex-col items-start justify-between gap-3 md:flex-row md:items-center md:gap-4"},Ws={class:"flex w-full gap-2 md:w-auto"},Bs=["disabled"],zs=["disabled"],Js={class:"mb-6 grid grid-cols-1 gap-4 md:mb-8 md:gap-6 lg:grid-cols-2"},Ys={key:1,class:"tab-content"},Hs={class:"glass-strong rounded-3xl shadow-xl"},Qs={__name:"ApiStatsView",setup(h){const n=st(),a=K(),m=lt(),x=k("stats"),c=V(()=>m.isDarkMode),{apiKey:s,apiId:o,loading:p,modelStatsLoading:v,oemLoading:w,error:u,statsPeriod:g,statsData:E,oemSettings:T}=A(a),{queryStats:M,switchPeriod:I,loadStatsWithApiId:R,loadOemSettings:N,reset:O}=a,F=_=>{(_.ctrlKey||_.metaKey)&&_.key==="Enter"&&(!p.value&&s.value.trim()&&M(),_.preventDefault()),_.key==="Escape"&&O()};return et(()=>{console.log("API Stats Page loaded"),m.initTheme(),N();const _=n.query.apiId,f=n.query.apiKey;_&&_.match(/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i)?(o.value=_,R()):f&&f.length>10&&(s.value=f),document.addEventListener("keydown",F)}),at(()=>{document.removeEventListener("keydown",F)}),rt(s,_=>{_||a.clearData()}),(_,f)=>{const j=ot("router-link");return i(),l("div",{class:L(["min-h-screen p-4 md:p-6",c.value?"gradient-bg-dark":"gradient-bg"])},[t("div",Ds,[t("div",Ps,[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",As,[t("div",qs,[S(dt,{mode:"dropdown"})]),f[6]||(f[6]=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)),e(T).ldapEnabled?(i(),it(j,{key:0,class:"user-login-button flex items-center gap-2 rounded-2xl px-4 py-2 text-white transition-all duration-300 md:px-5 md:py-2.5",to:"/user-login"},{default:J(()=>f[4]||(f[4]=[t("i",{class:"fas fa-user text-sm md:text-base"},null,-1),t("span",{class:"text-xs font-semibold tracking-wide md:text-sm"},"用户登录",-1)])),_:1,__:[4]})):C("",!0),S(j,{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:J(()=>f[5]||(f[5]=[t("i",{class:"fas fa-shield-alt text-sm md:text-base"},null,-1),t("span",{class:"text-xs font-semibold tracking-wide md:text-sm"},"管理后台",-1)])),_:1,__:[5]})])])]),t("div",Ks,[t("div",Ms,[t("div",Rs,[t("button",{class:L(["tab-pill-button",x.value==="stats"?"active":""]),onClick:f[0]||(f[0]=U=>x.value="stats")},f[7]||(f[7]=[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:L(["tab-pill-button",x.value==="tutorial"?"active":""]),onClick:f[1]||(f[1]=U=>x.value="tutorial")},f[8]||(f[8]=[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"?(i(),l("div",js,[S($t),e(u)?(i(),l("div",Us,[t("div",Es,[f[9]||(f[9]=t("i",{class:"fas fa-exclamation-triangle mr-2"},null,-1)),y(" "+d(e(u)),1)])])):C("",!0),e(E)?(i(),l("div",Fs,[t("div",Ns,[t("div",Os,[t("div",Vs,[f[12]||(f[12]=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",Ws,[t("button",{class:L(["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]=U=>e(I)("daily"))},f[10]||(f[10]=[t("i",{class:"fas fa-calendar-day text-xs md:text-sm"},null,-1),y(" 今日 ",-1)]),10,Bs),t("button",{class:L(["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]=U=>e(I)("monthly"))},f[11]||(f[11]=[t("i",{class:"fas fa-calendar-alt text-xs md:text-sm"},null,-1),y(" 本月 ",-1)]),10,zs)])])]),S(re),t("div",Js,[S(we),S(rs)]),S(Is)])])):C("",!0)])):C("",!0),x.value==="tutorial"?(i(),l("div",Ys,[t("div",Hs,[S(xt)])])):C("",!0)],2)}}},ia=q(Qs,[["__scopeId","data-v-2c2af211"]]);export{ia as default};
|