mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 17:54:50 +00:00
3 lines
13 KiB
JavaScript
3 lines
13 KiB
JavaScript
import{E as de,a as ie,b as ce,c as pe,d as ue}from"./element-plus-BSjV1f9S.js";import{b as G}from"./vendor-Dr8jvgFu.js";import{c as D,aX as ge,r as h,_ as O,o as J,q as xe,x as p,z as e,R as g,P as o,u as c,J as w,O as K,Q as $,ac as U,aU as ye,y as i,I as Q}from"./vue-vendor-DV7DYXbz.js";import{c as P,f as x,b0 as X,s as j}from"./index-BahP9Xx9.js";import{R as me}from"./RecordDetailModal-iWzEw88d.js";const ke={class:"space-y-4 p-4 lg:p-6"},fe={class:"flex flex-wrap items-center justify-between gap-3"},_e={class:"flex items-center gap-3"},ve={class:"text-xl font-bold text-gray-900 dark:text-gray-100"},be={class:"text-xs text-gray-500 dark:text-gray-400"},he={class:"text-xs text-gray-500 dark:text-gray-400"},we={class:"flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400"},Re={key:0},Ie={key:1},Ce={class:"grid gap-3 md:grid-cols-2 xl:grid-cols-4"},Te={class:"rounded-xl border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},De={class:"mt-1 text-2xl font-bold text-gray-900 dark:text-gray-100"},Ke={class:"rounded-xl border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},Pe={class:"mt-1 text-2xl font-bold text-gray-900 dark:text-gray-100"},Se={class:"rounded-xl border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},Ve={class:"mt-1 text-2xl font-bold text-yellow-600 dark:text-yellow-400"},ze={class:"rounded-xl border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},Oe={class:"mt-1 text-2xl font-bold text-gray-900 dark:text-gray-100"},$e={class:"rounded-xl border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},Ue={class:"flex flex-wrap items-center gap-3"},je={class:"rounded-xl border border-gray-200 bg-white shadow-sm dark:border-gray-800 dark:bg-gray-900"},Ae={key:0,class:"flex items-center justify-center p-10 text-gray-500 dark:text-gray-400"},Ee={key:1},Fe={key:0,class:"flex flex-col items-center gap-2 p-10 text-gray-500 dark:text-gray-400"},Ne={key:1,class:"space-y-4"},Be={class:"hidden overflow-x-auto md:block"},Ye={class:"min-w-full divide-y divide-gray-200 dark:divide-gray-800"},Me={class:"divide-y divide-gray-200 bg-white dark:divide-gray-800 dark:bg-gray-900"},qe={class:"whitespace-nowrap px-4 py-3 text-sm text-gray-800 dark:text-gray-100"},He={class:"px-4 py-3 text-sm text-gray-800 dark:text-gray-100"},Le={class:"flex flex-col"},Ge={class:"font-semibold"},Je={class:"text-xs text-gray-500 dark:text-gray-400"},Qe={class:"whitespace-nowrap px-4 py-3 text-sm text-gray-800 dark:text-gray-100"},Xe={class:"whitespace-nowrap px-4 py-3 text-sm text-blue-600 dark:text-blue-400"},Ze={class:"whitespace-nowrap px-4 py-3 text-sm text-green-600 dark:text-green-400"},We={class:"whitespace-nowrap px-4 py-3 text-sm text-purple-600 dark:text-purple-400"},et={class:"whitespace-nowrap px-4 py-3 text-sm text-gray-800 dark:text-gray-100"},tt={class:"whitespace-nowrap px-4 py-3 text-sm text-yellow-600 dark:text-yellow-400"},at={class:"whitespace-nowrap px-4 py-3 text-right text-sm"},st={class:"space-y-3 md:hidden"},ot={class:"flex items-center justify-between"},lt={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},rt={class:"text-xs text-gray-500 dark:text-gray-400"},nt={class:"text-xs text-gray-500 dark:text-gray-400"},dt={class:"mt-3 grid grid-cols-2 gap-2 text-sm text-gray-700 dark:text-gray-300"},it={class:"text-yellow-600 dark:text-yellow-400"},ct={class:"flex items-center justify-between px-4 pb-4"},pt={class:"text-sm text-gray-500 dark:text-gray-400"},ft={__name:"AccountUsageRecordsView",setup(ut){const N=ge(),Z=ye(),f=D(()=>N.params.accountId),C=D(()=>N.query.platform),A=h(!1),S=h(!1),V=h([]),B=h([]),Y=h([]),n=O({currentPage:1,pageSize:50,totalRecords:0}),s=O({dateRange:null,model:"",apiKeyId:"",sortOrder:"desc"}),y=O({totalRequests:0,totalTokens:0,totalCost:0,avgCost:0}),R=O({id:f.value,name:"",platform:C.value||""}),E=h(!1),F=h(null),W=D(()=>R.name||R.id||f.value),M=D(()=>{const l={claude:"Claude官方","claude-console":"Claude Console",ccr:"Claude Console Relay",openai:"OpenAI","openai-responses":"OpenAI Responses",gemini:"Gemini","gemini-api":"Gemini API",droid:"Droid",unknown:"未知渠道"},t=R.platform||C.value||"unknown";return l[t]||"未知渠道"}),q=D(()=>!s.dateRange||s.dateRange.length!==2?"":`${P(s.dateRange[0])} ~ ${P(s.dateRange[1])}`),T=l=>{const t=typeof l=="number"?l:0;return t>=1?`$${t.toFixed(2)}`:t>=.001?`$${t.toFixed(4)}`:`$${t.toFixed(6)}`},H=l=>{const t={page:l,pageSize:n.pageSize,sortOrder:s.sortOrder};return s.model&&(t.model=s.model),s.apiKeyId&&(t.apiKeyId=s.apiKeyId),s.dateRange&&s.dateRange.length===2&&(t.startDate=G(s.dateRange[0]).toISOString(),t.endDate=G(s.dateRange[1]).toISOString()),C.value&&(t.platform=C.value),t},ee=l=>{var m,k,_,a,v;V.value=l.records||[];const t=l.pagination||{};n.currentPage=t.currentPage||1,n.pageSize=t.pageSize||n.pageSize,n.totalRecords=t.totalRecords||0;const r=l.filters||{};if(r.model!==void 0&&(s.model=r.model||""),r.apiKeyId!==void 0&&(s.apiKeyId=r.apiKeyId||""),r.sortOrder&&(s.sortOrder=r.sortOrder),r.startDate&&r.endDate){const b=[r.startDate,r.endDate],d=s.dateRange||[];(d[0]!==b[0]||d[1]!==b[1])&&(s.dateRange=b)}const u=l.summary||{};y.totalRequests=u.totalRequests||0,y.totalTokens=u.totalTokens||0,y.totalCost=u.totalCost||0,y.avgCost=u.avgCost||0,R.id=((m=l.accountInfo)==null?void 0:m.id)||f.value,R.name=((k=l.accountInfo)==null?void 0:k.name)||"",R.platform=((_=l.accountInfo)==null?void 0:_.platform)||C.value||"",B.value=((a=l.availableFilters)==null?void 0:a.models)||[],Y.value=((v=l.availableFilters)==null?void 0:v.apiKeys)||[]},I=async(l=n.currentPage)=>{A.value=!0;try{const t=await X(f.value,H(l));ee(t.data||{})}catch(t){j(`加载请求记录失败:${t.message||"未知错误"}`,"error")}finally{A.value=!1}},te=l=>{n.currentPage=l,I(l)},ae=l=>{n.pageSize=l,n.currentPage=1,I(1)},se=()=>{s.model="",s.apiKeyId="",s.dateRange=null,s.sortOrder="desc",n.currentPage=1,I(1)},L=l=>{F.value=l,E.value=!0},oe=()=>{E.value=!1,F.value=null},le=()=>{Z.push("/accounts")},re=async()=>{var l;if(!S.value){S.value=!0;try{const t=[];let r=1,u=1;const m=50;for(;r<=u&&r<=m;){const z=(await X(f.value,{...H(r),pageSize:200})).data||{};t.push(...z.records||[]),u=((l=z.pagination)==null?void 0:l.totalPages)||1,r+=1}if(t.length===0){j("没有可导出的记录","info");return}const _=[["时间","API Key","模型","输入Token","输出Token","缓存创建Token","缓存读取Token","总Token","费用"].join(",")];t.forEach(d=>{const z=[P(d.timestamp),d.apiKeyName||d.apiKeyId||"",d.model||"",d.inputTokens||0,d.outputTokens||0,d.cacheCreateTokens||0,d.cacheReadTokens||0,d.totalTokens||0,d.costFormatted||T(d.cost)];_.push(z.map(ne=>`"${String(ne).replace(/"/g,'""')}"`).join(","))});const a=new Blob([_.join(`
|
||
`)],{type:"text/csv;charset=utf-8;"}),v=URL.createObjectURL(a),b=document.createElement("a");b.href=v,b.download=`account-${f.value}-usage-records.csv`,b.click(),URL.revokeObjectURL(v),j("导出 CSV 成功","success")}catch(t){j(`导出失败:${t.message||"未知错误"}`,"error")}finally{S.value=!1}}};return J(()=>[s.model,s.apiKeyId,s.sortOrder],()=>{n.currentPage=1,I(1)}),J(()=>s.dateRange,()=>{n.currentPage=1,I(1)},{deep:!0}),xe(()=>{I()}),(l,t)=>{const r=de,u=ue,m=ie,k=ce,_=pe;return i(),p("div",ke,[e("div",fe,[e("div",_e,[e("button",{class:"rounded-full border border-gray-200 px-3 py-2 text-sm text-gray-700 transition hover:bg-gray-100 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800",onClick:le}," ← 返回 "),e("div",null,[t[4]||(t[4]=e("p",{class:"text-xs font-semibold uppercase tracking-wide text-blue-600 dark:text-blue-400"}," 账户请求详情时间线 ",-1)),e("h2",ve,o(W.value),1),e("p",be,"ID: "+o(f.value),1),e("p",he,"渠道:"+o(M.value),1)])]),e("div",we,[t[5]||(t[5]=e("i",{class:"fas fa-clock text-blue-500"},null,-1)),q.value?(i(),p("span",Re,o(q.value),1)):(i(),p("span",Ie,"显示近 5000 条记录"))])]),e("div",Ce,[e("div",Te,[t[6]||(t[6]=e("p",{class:"text-xs uppercase text-gray-500 dark:text-gray-400"},"总请求",-1)),e("p",De,o(c(x)(y.totalRequests)),1)]),e("div",Ke,[t[7]||(t[7]=e("p",{class:"text-xs uppercase text-gray-500 dark:text-gray-400"},"总 Token",-1)),e("p",Pe,o(c(x)(y.totalTokens)),1)]),e("div",Se,[t[8]||(t[8]=e("p",{class:"text-xs uppercase text-gray-500 dark:text-gray-400"},"总费用",-1)),e("p",Ve,o(T(y.totalCost)),1)]),e("div",ze,[t[9]||(t[9]=e("p",{class:"text-xs uppercase text-gray-500 dark:text-gray-400"},"平均费用/次",-1)),e("p",Oe,o(T(y.avgCost)),1)])]),e("div",$e,[e("div",Ue,[g(r,{modelValue:s.dateRange,"onUpdate:modelValue":t[0]||(t[0]=a=>s.dateRange=a),class:"max-w-[320px]",clearable:"","end-placeholder":"结束时间",format:"YYYY-MM-DD HH:mm:ss","start-placeholder":"开始时间",type:"datetimerange","unlink-panels":"","value-format":"YYYY-MM-DDTHH:mm:ss[Z]"},null,8,["modelValue"]),g(m,{modelValue:s.model,"onUpdate:modelValue":t[1]||(t[1]=a=>s.model=a),class:"w-[180px]",clearable:"",filterable:"",placeholder:"所有模型"},{default:w(()=>[(i(!0),p($,null,U(B.value,a=>(i(),Q(u,{key:a,label:a,value:a},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),g(m,{modelValue:s.apiKeyId,"onUpdate:modelValue":t[2]||(t[2]=a=>s.apiKeyId=a),class:"w-[220px]",clearable:"",filterable:"",placeholder:"所有 API Key"},{default:w(()=>[(i(!0),p($,null,U(Y.value,a=>(i(),Q(u,{key:a.id,label:a.name||a.id,value:a.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),g(m,{modelValue:s.sortOrder,"onUpdate:modelValue":t[3]||(t[3]=a=>s.sortOrder=a),class:"w-[140px]",placeholder:"排序"},{default:w(()=>[g(u,{label:"时间降序",value:"desc"}),g(u,{label:"时间升序",value:"asc"})]),_:1},8,["modelValue"]),g(k,{onClick:se},{default:w(()=>t[10]||(t[10]=[e("i",{class:"fas fa-undo mr-2"},null,-1),K(" 重置 ",-1)])),_:1,__:[10]}),g(k,{loading:S.value,type:"primary",onClick:re},{default:w(()=>t[11]||(t[11]=[e("i",{class:"fas fa-file-export mr-2"},null,-1),K(" 导出 CSV ",-1)])),_:1,__:[11]},8,["loading"])])]),e("div",je,[A.value?(i(),p("div",Ae,t[12]||(t[12]=[e("i",{class:"fas fa-spinner fa-spin mr-2"},null,-1),K(" 加载中... ",-1)]))):(i(),p("div",Ee,[V.value.length===0?(i(),p("div",Fe,t[13]||(t[13]=[e("i",{class:"fas fa-inbox text-2xl"},null,-1),e("p",null,"暂无记录",-1)]))):(i(),p("div",Ne,[e("div",Be,[e("table",Ye,[t[15]||(t[15]=e("thead",{class:"bg-gray-50 dark:bg-gray-800"},[e("tr",null,[e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 时间 "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," API Key "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 模型 "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 输入 "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 输出 "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 缓存(创/读) "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 总 Token "),e("th",{class:"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 费用 "),e("th",{class:"px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-300"}," 操作 ")])],-1)),e("tbody",Me,[(i(!0),p($,null,U(V.value,a=>(i(),p("tr",{key:a.timestamp+a.model},[e("td",qe,o(c(P)(a.timestamp)),1),e("td",He,[e("div",Le,[e("span",Ge,o(a.apiKeyName||a.apiKeyId||"未知 Key"),1),e("span",Je," ID: "+o(a.apiKeyId),1)])]),e("td",Qe,o(a.model),1),e("td",Xe,o(c(x)(a.inputTokens)),1),e("td",Ze,o(c(x)(a.outputTokens)),1),e("td",We,o(c(x)(a.cacheCreateTokens))+" / "+o(c(x)(a.cacheReadTokens)),1),e("td",et,o(c(x)(a.totalTokens)),1),e("td",tt,o(a.costFormatted||T(a.cost)),1),e("td",at,[g(k,{size:"small",onClick:v=>L(a)},{default:w(()=>t[14]||(t[14]=[K("详情",-1)])),_:2,__:[14]},1032,["onClick"])])]))),128))])])]),e("div",st,[(i(!0),p($,null,U(V.value,a=>(i(),p("div",{key:a.timestamp+a.model,class:"rounded-lg border border-gray-200 bg-white p-4 shadow-sm dark:border-gray-800 dark:bg-gray-900"},[e("div",ot,[e("div",null,[e("p",lt,o(a.apiKeyName||a.apiKeyId||"未知 Key"),1),e("p",rt," ID: "+o(a.apiKeyId)+" · "+o(c(P)(a.timestamp)),1),e("p",nt," 渠道:"+o(M.value),1)]),g(k,{size:"small",onClick:v=>L(a)},{default:w(()=>t[16]||(t[16]=[K("详情",-1)])),_:2,__:[16]},1032,["onClick"])]),e("div",dt,[e("div",null,"模型:"+o(a.model),1),e("div",null,"总 Token:"+o(c(x)(a.totalTokens)),1),e("div",null,"输入:"+o(c(x)(a.inputTokens)),1),e("div",null,"输出:"+o(c(x)(a.outputTokens)),1),e("div",null," 缓存创/读:"+o(c(x)(a.cacheCreateTokens))+" / "+o(c(x)(a.cacheReadTokens)),1),e("div",it," 费用:"+o(a.costFormatted||T(a.cost)),1)])]))),128))]),e("div",ct,[e("div",pt," 共 "+o(n.totalRecords)+" 条记录 ",1),g(_,{background:"","current-page":n.currentPage,layout:"prev, pager, next, sizes","page-size":n.pageSize,"page-sizes":[20,50,100,200],total:n.totalRecords,onCurrentChange:te,onSizeChange:ae},null,8,["current-page","page-size","total"])])]))]))]),g(me,{record:F.value,show:E.value,onClose:oe},null,8,["record","show"])])}}};export{ft as default};
|