mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 00:53:33 +00:00
31 lines
231 KiB
JavaScript
31 lines
231 KiB
JavaScript
import{E as hs}from"./element-plus-CqiD73Lu.js";import{aP as Nt,r as T,c as j,q as Je,V as As,o as De,x as n,y as l,z as e,I as pe,C as G,P as c,R as ue,J as $s,L as $,B as it,K as _,aq as ae,Q,ac as se,T as Cs,a5 as Se,D as Is,_ as Be,Y as ve,an as ie,O as I,aa as Qe,aV as Ie,al as Le}from"./vue-vendor-Bsazo-x0.js";import{c as q,_ as Ce,s as E,u as Ks}from"./index-YEDBx2po.js";import{Q as je}from"./vendor-Dr8jvgFu.js";import{_ as Ls}from"./WindowCountdown-BTXjZ8Dc.js";import{C as bt}from"./CustomDropdown-CVU5yU-s.js";const vt=Nt("clients",{state:()=>({supportedClients:[],loading:!1,error:null}),actions:{async loadSupportedClients(){if(this.supportedClients.length>0)return this.supportedClients;this.loading=!0,this.error=null;try{const w=await q.get("/admin/supported-clients");return w.success?this.supportedClients=w.data||[]:(this.error=w.message||"加载支持的客户端失败",console.error("Failed to load supported clients:",this.error)),this.supportedClients}catch(w){return this.error=w.message||"加载支持的客户端失败",console.error("Error loading supported clients:",w),[]}finally{this.loading=!1}}}}),kt=Nt("apiKeys",()=>{const w=T([]),F=T(!1),p=T(null),V=T("all"),z=T(""),K=T("asc"),R=async()=>{F.value=!0,p.value=null;try{const M=await q.get("/admin/api-keys");if(M.success)w.value=M.data||[];else throw new Error(M.message||"获取API Keys失败")}catch(M){throw p.value=M.message,M}finally{F.value=!1}};return{apiKeys:w,loading:F,error:p,statsTimeRange:V,sortBy:z,sortOrder:K,fetchApiKeys:R,createApiKey:async M=>{F.value=!0,p.value=null;try{const N=await q.post("/admin/api-keys",M);if(N.success)return await R(),N.data;throw new Error(N.message||"创建API Key失败")}catch(N){throw p.value=N.message,N}finally{F.value=!1}},updateApiKey:async(M,N)=>{F.value=!0,p.value=null;try{const L=await q.put(`/admin/api-keys/${M}`,N);if(L.success)return await R(),L;throw new Error(L.message||"更新API Key失败")}catch(L){throw p.value=L.message,L}finally{F.value=!1}},toggleApiKey:async M=>{F.value=!0,p.value=null;try{const N=await q.put(`/admin/api-keys/${M}/toggle`);if(N.success)return await R(),N;throw new Error(N.message||"切换状态失败")}catch(N){throw p.value=N.message,N}finally{F.value=!1}},renewApiKey:async(M,N)=>{F.value=!0,p.value=null;try{const L=await q.put(`/admin/api-keys/${M}`,N);if(L.success)return await R(),L;throw new Error(L.message||"续期失败")}catch(L){throw p.value=L.message,L}finally{F.value=!1}},deleteApiKey:async M=>{F.value=!0,p.value=null;try{const N=await q.delete(`/admin/api-keys/${M}`);if(N.success)return await R(),N;throw new Error(N.message||"删除失败")}catch(N){throw p.value=N.message,N}finally{F.value=!1}},fetchApiKeyStats:async(M,N="all")=>{try{const L=await q.get(`/admin/api-keys/${M}/stats`,{params:{timeRange:N}});if(L.success)return L.stats;throw new Error(L.message||"获取统计失败")}catch(L){return console.error("获取API Key统计失败:",L),null}},fetchTags:async()=>{try{const M=await q.get("/admin/api-keys/tags");if(M.success)return M.data||[];throw new Error(M.message||"获取标签失败")}catch(M){return console.error("获取标签失败:",M),[]}},sortApiKeys:M=>{z.value===M?K.value=K.value==="asc"?"desc":"asc":(z.value=M,K.value="asc")},reset:()=>{w.value=[],F.value=!1,p.value=null,V.value="all",z.value="",K.value="asc"}}}),Ds={class:"flex-shrink-0 border-b border-gray-200 p-3 dark:border-gray-600"},_s={class:"relative"},Ss={class:"custom-scrollbar flex-1 overflow-y-auto"},Ts={class:"text-gray-700 dark:text-gray-300"},Ms={key:0},Ps=["onClick"],Rs={class:"flex items-center justify-between"},Us={class:"text-gray-700 dark:text-gray-300"},Vs={class:"text-xs text-gray-500 dark:text-gray-400"},Os={key:1},Es={class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"},js=["onClick"],Gs={class:"flex items-center justify-between"},qs={class:"text-gray-700 dark:text-gray-300"},zs={class:"text-xs text-gray-400 dark:text-gray-500"},Fs={key:2},Bs=["onClick"],Ws={class:"flex items-center justify-between"},Hs={class:"text-gray-700 dark:text-gray-300"},Ns={class:"text-xs text-gray-400 dark:text-gray-500"},Ys={key:3},Qs=["onClick"],Js={class:"flex items-center justify-between"},Xs={class:"text-gray-700 dark:text-gray-300"},Zs={class:"text-xs text-gray-400 dark:text-gray-500"},ea={key:4,class:"px-4 py-8 text-center text-gray-500 dark:text-gray-400"},ta={__name:"AccountSelector",props:{modelValue:{type:String,default:""},platform:{type:String,required:!0,validator:w=>["claude","gemini","openai","bedrock","droid"].includes(w)},accounts:{type:Array,default:()=>[]},groups:{type:Array,default:()=>[]},disabled:{type:Boolean,default:!1},placeholder:{type:String,default:"请选择账号"},defaultOptionText:{type:String,default:"使用共享账号池"}},emits:["update:modelValue"],setup(w,{emit:F}){const p=w,V=F,z=T(!1),K=T(""),R=T(null),O=T(null),P=T({}),Y=T(null),H=T(""),h=j(()=>{if(!p.modelValue)return p.defaultOptionText;if(p.modelValue.startsWith("group:")){const g=p.modelValue.substring(6),k=p.groups.find(Z=>Z.id===g);return k?`${k.name} (${k.memberCount||0} 个成员)`:""}if(p.modelValue.startsWith("console:")){const g=p.modelValue.substring(8),k=p.accounts.find(Z=>Z.id===g&&Z.platform==="claude-console");return k?`${k.name} (${C(k)})`:""}if(p.modelValue.startsWith("responses:")){const g=p.modelValue.substring(10),k=p.accounts.find(Z=>Z.id===g&&Z.platform==="openai-responses");return k?`${k.name} (${C(k)})`:""}const o=p.accounts.find(g=>g.id===p.modelValue);return o?`${o.name} (${C(o)})`:""}),C=o=>{if(!o)return"未知";if(!(o.isActive==="true"||o.isActive===!0))switch(o.status){case"unauthorized":return"未授权";case"error":return"Token错误";case"created":return"待验证";case"rate_limited":return"限流中";case"quota_exceeded":return"额度超限";default:return"异常"}return o.status==="rate_limited"?"限流中":"正常"},u=j(()=>[...p.accounts].sort((o,g)=>{const k=new Date(o.createdAt||0);return new Date(g.createdAt||0)-k})),s=j(()=>{let o=p.groups.filter(g=>g.platform?g.platform===p.platform:!0);if(K.value){const g=K.value.toLowerCase();o=o.filter(k=>k.name.toLowerCase().includes(g))}return o}),J=j(()=>{let o=[];if(p.platform==="claude"?o=u.value.filter(g=>g.platform==="claude-oauth"):p.platform==="openai"?o=u.value.filter(g=>g.platform==="openai"):p.platform==="droid"?o=u.value.filter(g=>g.platform==="droid"):o=u.value.filter(g=>!["claude-oauth","claude-console","openai-responses"].includes(g.platform)),K.value){const g=K.value.toLowerCase();o=o.filter(k=>k.name.toLowerCase().includes(g))}return o}),M=j(()=>{if(p.platform!=="claude")return[];let o=u.value.filter(g=>g.platform==="claude-console");if(K.value){const g=K.value.toLowerCase();o=o.filter(k=>k.name.toLowerCase().includes(g))}return o}),N=j(()=>{if(p.platform!=="openai")return[];let o=u.value.filter(g=>g.platform==="openai-responses");if(K.value){const g=K.value.toLowerCase();o=o.filter(k=>k.name.toLowerCase().includes(g))}return o}),L=j(()=>s.value.length>0||J.value.length>0||M.value.length>0||N.value.length>0),y=o=>{if(!o)return"";const g=new Date(o),Z=(new Date-g)/(1e3*60*60);return Z<24?"今天创建":Z<48?"昨天创建":Z<168?`${Math.floor(Z/24)} 天前`:g.toLocaleDateString("zh-CN",{month:"2-digit",day:"2-digit"})},d=()=>{if(!z.value||!O.value||!Y.value)return;const o=Y.value;if(!o)return;const g=o.getBoundingClientRect(),k=window.innerHeight,Z=window.innerWidth,U=k-g.bottom,i=g.top,f=8,ne=U-f,me=i-f;let te=!1,ke=ne;H.value==="above"&&me>=150?(te=!0,ke=me):H.value==="below"&&ne>=150?(te=!1,ke=ne):me>ne&&ne<200&&(te=!0,ke=me),H.value=te?"above":"below";let X=g.left;const xe=g.width;X+xe>Z-f&&(X=Z-xe-f),X<f&&(X=f),P.value={position:"fixed",left:`${X}px`,width:`${g.width}px`,maxHeight:`${Math.min(ke,400)}px`,...te?{bottom:`${k-g.top}px`}:{top:`${g.bottom}px`}}},x=()=>{if(!z.value&&Y.value){const o=Y.value.getBoundingClientRect(),k=window.innerHeight-o.bottom,Z=8;P.value={position:"fixed",left:`${o.left}px`,width:`${o.width}px`,maxHeight:`${Math.min(k-Z,400)}px`,top:`${o.bottom}px`}}z.value=!z.value,z.value&&Is(()=>{var o;d(),(o=R.value)==null||o.focus()})},re=o=>{V("update:modelValue",o||""),z.value=!1,K.value=""},ce=()=>{},W=()=>{var o;K.value="",(o=R.value)==null||o.focus()},ge=o=>{var g,k;!((g=Y.value)!=null&&g.contains(o.target))&&!((k=O.value)!=null&&k.contains(o.target))&&(z.value=!1)},b=()=>{z.value&&d()};return Je(()=>{document.addEventListener("click",ge),window.addEventListener("scroll",b,!0),window.addEventListener("resize",d)}),As(()=>{document.removeEventListener("click",ge),window.removeEventListener("scroll",b,!0),window.removeEventListener("resize",d)}),De(z,o=>{o||(K.value="",H.value="")}),(o,g)=>(l(),n("div",{ref_key:"triggerRef",ref:Y,class:"relative"},[e("div",{class:G(["form-input flex w-full cursor-pointer items-center justify-between border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",{"opacity-50":w.disabled}]),onClick:g[0]||(g[0]=k=>!w.disabled&&x())},[e("span",{class:G(w.modelValue?"text-gray-900 dark:text-gray-200":"text-gray-500 dark:text-gray-400")},c(h.value),3),e("i",{class:G(["fas fa-chevron-down text-gray-400 transition-transform duration-200 dark:text-gray-500",{"rotate-180":z.value}])},null,2)],2),(l(),pe(Se,{to:"body"},[ue(Cs,{"enter-active-class":"transition ease-out duration-100","enter-from-class":"transform opacity-0 scale-95","enter-to-class":"transform opacity-100 scale-100","leave-active-class":"transition ease-in duration-75","leave-from-class":"transform opacity-100 scale-100","leave-to-class":"transform opacity-0 scale-95"},{default:$s(()=>[z.value?(l(),n("div",{key:0,ref_key:"dropdownRef",ref:O,class:"absolute z-50 flex flex-col rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-600 dark:bg-gray-800",style:it(P.value)},[e("div",Ds,[e("div",_s,[_(e("input",{ref_key:"searchInput",ref:R,"onUpdate:modelValue":g[1]||(g[1]=k=>K.value=k),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",placeholder:"搜索账号名称...",style:{"padding-left":"40px","padding-right":"36px"},type:"text",onInput:ce},null,544),[[ae,K.value]]),g[4]||(g[4]=e("i",{class:"fas fa-search pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-sm text-gray-400 dark:text-gray-500"},null,-1)),K.value?(l(),n("button",{key:0,class:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-400",type:"button",onClick:W},g[3]||(g[3]=[e("i",{class:"fas fa-times text-sm"},null,-1)]))):$("",!0)])]),e("div",Ss,[e("div",{class:G(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":!w.modelValue}]),onClick:g[2]||(g[2]=k=>re(null))},[e("span",Ts,c(w.defaultOptionText),1)],2),s.value.length>0?(l(),n("div",Ms,[g[5]||(g[5]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"}," 调度分组 ",-1)),(l(!0),n(Q,null,se(s.value,k=>(l(),n("div",{key:`group:${k.id}`,class:G(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":w.modelValue===`group:${k.id}`}]),onClick:Z=>re(`group:${k.id}`)},[e("div",Rs,[e("span",Us,c(k.name),1),e("span",Vs,c(k.memberCount||0)+" 个成员",1)])],10,Ps))),128))])):$("",!0),J.value.length>0?(l(),n("div",Os,[e("div",Es,c(w.platform==="claude"?"Claude OAuth 专属账号":w.platform==="openai"?"OpenAI 专属账号":w.platform==="droid"?"Droid 专属账号":"OAuth 专属账号"),1),(l(!0),n(Q,null,se(J.value,k=>(l(),n("div",{key:k.id,class:G(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":w.modelValue===k.id}]),onClick:Z=>re(k.id)},[e("div",Gs,[e("div",null,[e("span",qs,c(k.name),1),e("span",{class:G(["ml-2 rounded-full px-2 py-0.5 text-xs",k.isActive?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":k.status==="unauthorized"?"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400":"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400"])},c(C(k)),3)]),e("span",zs,c(y(k.createdAt)),1)])],10,js))),128))])):$("",!0),w.platform==="claude"&&M.value.length>0?(l(),n("div",Fs,[g[6]||(g[6]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"}," Claude Console 专属账号 ",-1)),(l(!0),n(Q,null,se(M.value,k=>(l(),n("div",{key:k.id,class:G(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":w.modelValue===`console:${k.id}`}]),onClick:Z=>re(`console:${k.id}`)},[e("div",Ws,[e("div",null,[e("span",Hs,c(k.name),1),e("span",{class:G(["ml-2 rounded-full px-2 py-0.5 text-xs",k.isActive?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":k.status==="unauthorized"?"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400":"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400"])},c(C(k)),3)]),e("span",Ns,c(y(k.createdAt)),1)])],10,Bs))),128))])):$("",!0),w.platform==="openai"&&N.value.length>0?(l(),n("div",Ys,[g[7]||(g[7]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"}," OpenAI-Responses 专属账号 ",-1)),(l(!0),n(Q,null,se(N.value,k=>(l(),n("div",{key:k.id,class:G(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":w.modelValue===`responses:${k.id}`}]),onClick:Z=>re(`responses:${k.id}`)},[e("div",Js,[e("div",null,[e("span",Xs,c(k.name),1),e("span",{class:G(["ml-2 rounded-full px-2 py-0.5 text-xs",k.isActive==="true"||k.isActive===!0?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":k.status==="rate_limited"?"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400":"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400"])},c(C(k)),3)]),e("span",Zs,c(y(k.createdAt)),1)])],10,Qs))),128))])):$("",!0),K.value&&!L.value?(l(),n("div",ea,g[8]||(g[8]=[e("i",{class:"fas fa-search mb-2 text-2xl"},null,-1),e("p",{class:"text-sm"},"没有找到匹配的账号",-1)]))):$("",!0)])],4)):$("",!0)]),_:1})]))],512))}},Ke=Ce(ta,[["__scopeId","data-v-442d3713"]]),sa={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},aa={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6"},ra={class:"mb-4 flex items-center justify-between"},oa={class:"rounded-lg border border-blue-200 bg-gradient-to-r from-blue-50 to-indigo-50 p-3 dark:border-blue-700 dark:from-blue-900/20 dark:to-indigo-900/20 sm:p-4"},la={class:"flex items-center gap-3 sm:gap-4"},ia={class:"flex cursor-pointer items-center"},na={class:"flex cursor-pointer items-center"},da={key:0,class:"mt-3"},ua={class:"flex items-center gap-4"},ca={class:"flex-1"},ga={class:"flex items-center gap-2"},pa={class:"mt-2 flex items-start text-xs text-amber-600 dark:text-amber-400"},ma=["placeholder"],xa={key:0,class:"mt-1 text-xs text-red-500 dark:text-red-400"},ya={class:"space-y-4"},fa={key:0},ba={class:"flex flex-wrap gap-2"},va=["onClick"],ka={key:1},wa={class:"flex flex-wrap gap-2"},ha=["onClick"],Aa={class:"flex gap-2"},$a=["onKeypress"],Ca={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},Ia={class:"space-y-2"},Ka={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},La={class:"space-y-2"},Da={class:"flex gap-2"},_a={class:"space-y-2"},Sa={class:"flex gap-2"},Ta={class:"space-y-2"},Ma={class:"flex gap-2"},Pa={class:"mb-3 rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800"},Ra={class:"flex items-center gap-4"},Ua={class:"flex cursor-pointer items-center"},Va={class:"flex cursor-pointer items-center"},Oa={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Ea={key:0},ja={key:1},Ga={key:0},qa={key:0,class:"mt-3"},za=["min"],Fa={key:1,class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Ba={key:1},Wa={class:"flex items-center gap-2"},Ha=["max","placeholder"],Na={class:"mt-2 flex flex-wrap gap-2"},Ya=["onClick"],Qa={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Ja={class:"flex gap-4"},Xa={class:"flex cursor-pointer items-center"},Za={class:"flex cursor-pointer items-center"},er={class:"flex cursor-pointer items-center"},tr={class:"flex cursor-pointer items-center"},sr={class:"flex cursor-pointer items-center"},ar={class:"mb-2 flex items-center justify-between"},rr=["disabled"],or={class:"grid grid-cols-1 gap-3"},lr={class:"mb-2 flex items-center"},ir={key:0,class:"space-y-3"},nr={class:"mb-3 flex min-h-[32px] flex-wrap gap-2 rounded-lg border border-gray-200 bg-gray-50 p-2"},dr=["onClick"],ur={key:0,class:"text-sm text-gray-400"},cr={class:"space-y-3"},gr={class:"flex flex-wrap gap-2"},pr=["onClick"],mr={key:0,class:"text-sm italic text-gray-400"},xr={class:"flex gap-2"},yr=["onKeydown"],fr={class:"mb-2 flex items-center"},br={key:0,class:"rounded-lg border border-green-200 bg-green-50 p-3 dark:border-green-700 dark:bg-green-900/20"},vr={class:"space-y-1"},kr=["id","value"],wr=["for"],hr={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},Ar={class:"block text-xs text-gray-500 dark:text-gray-400"},$r={class:"flex gap-3 pt-2"},Cr=["disabled"],Ir={key:0,class:"loading-spinner mr-2"},Kr={key:1,class:"fas fa-plus mr-2"},Lr={__name:"CreateApiKeyModal",props:{accounts:{type:Object,default:()=>({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]})}},emits:["close","success","batch-success"],setup(w,{emit:F}){const p=w,V=F,z=vt(),K=kt(),R=T(!1),O=T(!1),P=T({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),Y=T({name:""}),H=T(""),h=T([]),C=j(()=>h.value.filter(U=>!s.tags.includes(U))),u=T([]),s=Be({createType:"single",batchCount:10,name:"",description:"",rateLimitWindow:"",rateLimitRequests:"",rateLimitCost:"",concurrencyLimit:"",dailyCostLimit:"",totalCostLimit:"",weeklyOpusCostLimit:"",expireDuration:"",customExpireDate:"",expiresAt:null,expirationMode:"fixed",activationDays:30,activationUnit:"days",permissions:"all",claudeAccountId:"",geminiAccountId:"",openaiAccountId:"",bedrockAccountId:"",droidAccountId:"",enableModelRestriction:!1,restrictedModels:[],modelInput:"",enableClientRestriction:!1,allowedClients:[],tags:[]});Je(async()=>{if(u.value=await z.loadSupportedClients(),h.value=await K.fetchTags(),p.accounts){const U=[];p.accounts.openai&&p.accounts.openai.forEach(i=>{U.push({...i,platform:"openai"})}),p.accounts.openaiResponses&&p.accounts.openaiResponses.forEach(i=>{U.push({...i,platform:"openai-responses"})}),P.value={claude:p.accounts.claude||[],gemini:p.accounts.gemini||[],openai:U,bedrock:p.accounts.bedrock||[],droid:(p.accounts.droid||[]).map(i=>({...i,platform:"droid"})),claudeGroups:p.accounts.claudeGroups||[],geminiGroups:p.accounts.geminiGroups||[],openaiGroups:p.accounts.openaiGroups||[],droidGroups:p.accounts.droidGroups||[]}}await J()});const J=async()=>{var U,i;O.value=!0;try{const[f,ne,me,te,ke,X,xe,Te]=await Promise.all([q.get("/admin/claude-accounts"),q.get("/admin/claude-console-accounts"),q.get("/admin/gemini-accounts"),q.get("/admin/openai-accounts"),q.get("/admin/openai-responses-accounts"),q.get("/admin/bedrock-accounts"),q.get("/admin/droid-accounts"),q.get("/admin/account-groups")]),Me=[];f.success&&((U=f.data)==null||U.forEach(le=>{Me.push({...le,platform:"claude-oauth",isDedicated:le.accountType==="dedicated"})})),ne.success&&((i=ne.data)==null||i.forEach(le=>{Me.push({...le,platform:"claude-console",isDedicated:le.accountType==="dedicated"})})),P.value.claude=Me,me.success&&(P.value.gemini=(me.data||[]).map(le=>({...le,isDedicated:le.accountType==="dedicated"})));const Pe=[];if(te.success&&(te.data||[]).forEach(le=>{Pe.push({...le,platform:"openai",isDedicated:le.accountType==="dedicated"})}),ke.success&&(ke.data||[]).forEach(le=>{Pe.push({...le,platform:"openai-responses",isDedicated:le.accountType==="dedicated"})}),P.value.openai=Pe,X.success&&(P.value.bedrock=(X.data||[]).map(le=>({...le,isDedicated:le.accountType==="dedicated"}))),xe.success&&(P.value.droid=(xe.data||[]).map(le=>({...le,platform:"droid",isDedicated:le.accountType==="dedicated"}))),Te.success){const le=Te.data||[];P.value.claudeGroups=le.filter($e=>$e.platform==="claude"),P.value.geminiGroups=le.filter($e=>$e.platform==="gemini"),P.value.openaiGroups=le.filter($e=>$e.platform==="openai"),P.value.droidGroups=le.filter($e=>$e.platform==="droid")}E("账号列表已刷新","success")}catch{E("刷新账号列表失败","error")}finally{O.value=!1}},M=j(()=>{const U=new Date;return U.setMinutes(U.getMinutes()+1),U.toISOString().slice(0,16)}),N=()=>{if(!s.expireDuration){s.expiresAt=null;return}if(s.expireDuration==="custom")return;const U=new Date,f=s.expireDuration.match(/(\d+)([dhmy])/);if(f){const[,ne,me]=f,te=parseInt(ne);switch(me){case"d":U.setDate(U.getDate()+te);break;case"h":U.setHours(U.getHours()+te);break;case"m":U.setMonth(U.getMonth()+te);break;case"y":U.setFullYear(U.getFullYear()+te);break}s.expiresAt=U.toISOString()}},L=()=>{s.customExpireDate&&(s.expiresAt=new Date(s.customExpireDate).toISOString())},y=U=>new Date(U).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),d=()=>{s.modelInput&&!s.restrictedModels.includes(s.modelInput)&&(s.restrictedModels.push(s.modelInput),s.modelInput="")},x=U=>{s.restrictedModels.splice(U,1)},re=T(["claude-opus-4-20250514","claude-opus-4-1-20250805"]),ce=j(()=>re.value.filter(U=>!s.restrictedModels.includes(U))),W=U=>{s.restrictedModels.includes(U)||s.restrictedModels.push(U)},ge=()=>{if(H.value&&H.value.trim()){const U=H.value.trim();s.tags.includes(U)||s.tags.push(U),H.value=""}},b=U=>{s.tags.includes(U)||s.tags.push(U)},o=U=>{s.tags.splice(U,1)},g=()=>s.activationUnit==="hours"?[{value:1,label:"1小时"},{value:3,label:"3小时"},{value:6,label:"6小时"},{value:12,label:"12小时"}]:[{value:30,label:"30天"},{value:90,label:"90天"},{value:180,label:"180天"},{value:365,label:"365天"}],k=()=>{s.activationUnit==="hours"?s.activationDays>24&&(s.activationDays=24):s.activationDays<1&&(s.activationDays=1)},Z=async()=>{if(Y.value.name="",!s.name||!s.name.trim()){Y.value.name="请输入API Key名称";return}if(s.createType==="batch"&&(!s.batchCount||s.batchCount<2||s.batchCount>500)){E("批量创建数量必须在 2-500 之间","error");return}if(s.rateLimitWindow&&(!s.rateLimitCost||parseFloat(s.rateLimitCost)===0)){let U=!1;if(window.showConfirm?U=await window.showConfirm("费用限制提醒",`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
|
||
是否继续?`,"继续创建","返回修改"):U=confirm(`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
是否继续?`),!U)return}R.value=!0;try{const U={description:s.description||void 0,tokenLimit:0,rateLimitWindow:s.rateLimitWindow!==""&&s.rateLimitWindow!==null?parseInt(s.rateLimitWindow):null,rateLimitRequests:s.rateLimitRequests!==""&&s.rateLimitRequests!==null?parseInt(s.rateLimitRequests):null,rateLimitCost:s.rateLimitCost!==""&&s.rateLimitCost!==null?parseFloat(s.rateLimitCost):null,concurrencyLimit:s.concurrencyLimit!==""&&s.concurrencyLimit!==null?parseInt(s.concurrencyLimit):0,dailyCostLimit:s.dailyCostLimit!==""&&s.dailyCostLimit!==null?parseFloat(s.dailyCostLimit):0,totalCostLimit:s.totalCostLimit!==""&&s.totalCostLimit!==null?parseFloat(s.totalCostLimit):0,weeklyOpusCostLimit:s.weeklyOpusCostLimit!==""&&s.weeklyOpusCostLimit!==null?parseFloat(s.weeklyOpusCostLimit):0,expiresAt:s.expirationMode==="fixed"&&s.expiresAt||void 0,expirationMode:s.expirationMode,activationDays:s.expirationMode==="activation"?s.activationDays:void 0,activationUnit:s.expirationMode==="activation"?s.activationUnit:void 0,permissions:s.permissions,tags:s.tags.length>0?s.tags:void 0,enableModelRestriction:s.enableModelRestriction,restrictedModels:s.restrictedModels,enableClientRestriction:s.enableClientRestriction,allowedClients:s.allowedClients};if(s.claudeAccountId&&(s.claudeAccountId.startsWith("console:")?(U.claudeConsoleAccountId=s.claudeAccountId.substring(8),delete U.claudeAccountId):(U.claudeAccountId=s.claudeAccountId,delete U.claudeConsoleAccountId)),s.geminiAccountId&&(U.geminiAccountId=s.geminiAccountId),s.openaiAccountId&&(U.openaiAccountId=s.openaiAccountId),s.bedrockAccountId&&(U.bedrockAccountId=s.bedrockAccountId),s.droidAccountId&&(U.droidAccountId=s.droidAccountId),s.createType==="single"){const i={...U,name:s.name},f=await q.post("/admin/api-keys",i);f.success?(E("API Key 创建成功","success"),V("success",f.data),V("close")):E(f.message||"创建失败","error")}else{const i={...U,createType:"batch",baseName:s.name,count:s.batchCount},f=await q.post("/admin/api-keys/batch",i);f.success?(E(`成功创建 ${f.data.length} 个 API Key`,"success"),V("batch-success",f.data),V("close")):E(f.message||"批量创建失败","error")}}catch{E("创建失败","error")}finally{R.value=!1}};return(U,i)=>(l(),pe(Se,{to:"body"},[e("div",sa,[e("div",aa,[e("div",ra,[i[49]||(i[49]=e("div",{class:"flex items-center gap-2 sm:gap-3"},[e("div",{class:"flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-blue-600 sm:h-10 sm:w-10 sm:rounded-xl"},[e("i",{class:"fas fa-key text-sm text-white sm:text-base"})]),e("h3",{class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"}," 创建新的 API Key ")],-1)),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300",onClick:i[0]||(i[0]=f=>U.$emit("close"))},i[48]||(i[48]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),e("form",{class:"modal-scroll-content custom-scrollbar flex-1 space-y-4",onSubmit:ve(Z,["prevent"])},[e("div",oa,[e("div",{class:G(["flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",s.createType==="batch"?"mb-3":""])},[i[52]||(i[52]=e("label",{class:"flex h-full items-center text-xs font-semibold text-gray-700 dark:text-gray-300 sm:text-sm"},"创建类型",-1)),e("div",la,[e("label",ia,[_(e("input",{"onUpdate:modelValue":i[1]||(i[1]=f=>s.createType=f),class:"mr-1.5 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 sm:mr-2",type:"radio",value:"single"},null,512),[[ie,s.createType]]),i[50]||(i[50]=e("span",{class:"flex items-center text-xs text-gray-700 dark:text-gray-300 sm:text-sm"},[e("i",{class:"fas fa-key mr-1 text-xs"}),I(" 单个创建 ")],-1))]),e("label",na,[_(e("input",{"onUpdate:modelValue":i[2]||(i[2]=f=>s.createType=f),class:"mr-1.5 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 sm:mr-2",type:"radio",value:"batch"},null,512),[[ie,s.createType]]),i[51]||(i[51]=e("span",{class:"flex items-center text-xs text-gray-700 dark:text-gray-300 sm:text-sm"},[e("i",{class:"fas fa-layer-group mr-1 text-xs"}),I(" 批量创建 ")],-1))])])],2),s.createType==="batch"?(l(),n("div",da,[e("div",ua,[e("div",ca,[i[54]||(i[54]=e("label",{class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"},"创建数量",-1)),e("div",ga,[_(e("input",{"onUpdate:modelValue":i[3]||(i[3]=f=>s.batchCount=f),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",max:"500",min:"2",placeholder:"输入数量 (2-500)",required:"",type:"number"},null,512),[[ae,s.batchCount,void 0,{number:!0}]]),i[53]||(i[53]=e("div",{class:"whitespace-nowrap text-xs text-gray-500 dark:text-gray-400"}," 最大支持 500 个 ",-1))])])]),e("p",pa,[i[55]||(i[55]=e("i",{class:"fas fa-info-circle mr-1 mt-0.5 flex-shrink-0"},null,-1)),e("span",null,"批量创建时,每个 Key 的名称会自动添加序号后缀,例如:"+c(s.name||"MyKey")+"_1, "+c(s.name||"MyKey")+"_2 ...",1)])])):$("",!0)]),e("div",null,[i[56]||(i[56]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-2 sm:text-sm"},[I("名称 "),e("span",{class:"text-red-500"},"*")],-1)),e("div",null,[_(e("input",{"onUpdate:modelValue":i[4]||(i[4]=f=>s.name=f),class:G(["form-input flex-1 border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",{"border-red-500":Y.value.name}]),placeholder:s.createType==="batch"?"输入基础名称(将自动添加序号)":"为您的 API Key 取一个名称",required:"",type:"text",onInput:i[5]||(i[5]=f=>Y.value.name="")},null,42,ma),[[ae,s.name]])]),Y.value.name?(l(),n("p",xa,c(Y.value.name),1)):$("",!0)]),e("div",null,[i[64]||(i[64]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"标签",-1)),e("div",ya,[s.tags.length>0?(l(),n("div",fa,[i[58]||(i[58]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 已选择的标签: ",-1)),e("div",ba,[(l(!0),n(Q,null,se(s.tags,(f,ne)=>(l(),n("span",{key:"selected-"+ne,class:"inline-flex items-center gap-1 rounded-full bg-blue-100 px-3 py-1 text-sm text-blue-800 dark:bg-blue-900/30 dark:text-blue-400"},[I(c(f)+" ",1),e("button",{class:"ml-1 hover:text-blue-900 dark:hover:text-blue-300",type:"button",onClick:me=>o(ne)},i[57]||(i[57]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,va)]))),128))])])):$("",!0),C.value.length>0?(l(),n("div",ka,[i[60]||(i[60]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",wa,[(l(!0),n(Q,null,se(C.value,f=>(l(),n("button",{key:"available-"+f,class:"inline-flex items-center gap-1 rounded-full bg-gray-100 px-3 py-1 text-sm text-gray-700 transition-colors hover:bg-blue-100 hover:text-blue-700 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-blue-900/30 dark:hover:text-blue-400",type:"button",onClick:ne=>b(f)},[i[59]||(i[59]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),I(" "+c(f),1)],8,ha))),128))])])):$("",!0),e("div",null,[i[62]||(i[62]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",Aa,[_(e("input",{"onUpdate:modelValue":i[6]||(i[6]=f=>H.value=f),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",placeholder:"输入新标签名称",type:"text",onKeypress:Qe(ve(ge,["prevent"]),["enter"])},null,40,$a),[[ae,H.value]]),e("button",{class:"rounded-lg bg-green-500 px-4 py-2 text-white transition-colors hover:bg-green-600",type:"button",onClick:ge},i[61]||(i[61]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),i[63]||(i[63]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 用于标记不同团队或用途,方便筛选管理 ",-1))])]),e("div",Ca,[i[72]||(i[72]=e("div",{class:"mb-2 flex items-center gap-2"},[e("div",{class:"flex h-6 w-6 flex-shrink-0 items-center justify-center rounded bg-blue-500"},[e("i",{class:"fas fa-tachometer-alt text-xs text-white"})]),e("h4",{class:"text-sm font-semibold text-gray-800 dark:text-gray-200"}," 速率限制设置 (可选) ")],-1)),e("div",Ia,[e("div",Ka,[e("div",null,[i[65]||(i[65]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"时间窗口 (分钟)",-1)),_(e("input",{"onUpdate:modelValue":i[7]||(i[7]=f=>s.rateLimitWindow=f),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"1",placeholder:"无限制",type:"number"},null,512),[[ae,s.rateLimitWindow]]),i[66]||(i[66]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"时间段单位",-1))]),e("div",null,[i[67]||(i[67]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"请求次数限制",-1)),_(e("input",{"onUpdate:modelValue":i[8]||(i[8]=f=>s.rateLimitRequests=f),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"1",placeholder:"无限制",type:"number"},null,512),[[ae,s.rateLimitRequests]]),i[68]||(i[68]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大请求",-1))]),e("div",null,[i[69]||(i[69]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),_(e("input",{"onUpdate:modelValue":i[9]||(i[9]=f=>s.rateLimitCost=f),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"无限制",step:"0.01",type:"number"},null,512),[[ae,s.rateLimitCost]]),i[70]||(i[70]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大费用",-1))])]),i[71]||(i[71]=e("div",{class:"rounded-lg bg-blue-100 p-2 dark:bg-blue-900/30"},[e("h5",{class:"mb-1 text-xs font-semibold text-blue-800 dark:text-blue-400"}," 💡 使用示例 "),e("div",{class:"space-y-0.5 text-xs text-blue-700 dark:text-blue-300"},[e("div",null,[e("strong",null,"示例1:"),I(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求 ")]),e("div",null,[e("strong",null,"示例2:"),I(" 时间窗口=1,费用=0.1 → 每分钟最多$0.1费用")]),e("div",null,[e("strong",null,"示例3:"),I(" 窗口=30,请求=50,费用=5 → 每30分钟50次请求且不超$5费用 ")])])],-1))])]),e("div",null,[i[74]||(i[74]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"每日费用限制 (美元)",-1)),e("div",La,[e("div",Da,[e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[10]||(i[10]=f=>s.dailyCostLimit="50")}," $50 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[11]||(i[11]=f=>s.dailyCostLimit="100")}," $100 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[12]||(i[12]=f=>s.dailyCostLimit="200")}," $200 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[13]||(i[13]=f=>s.dailyCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":i[14]||(i[14]=f=>s.dailyCostLimit=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[ae,s.dailyCostLimit]]),i[73]||(i[73]=e("p",{class:"dark:text灰-400 text-xs text-gray-500"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[i[76]||(i[76]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"总费用限制 (美元)",-1)),e("div",_a,[e("div",Sa,[e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[15]||(i[15]=f=>s.totalCostLimit="100")}," $100 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[16]||(i[16]=f=>s.totalCostLimit="500")}," $500 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[17]||(i[17]=f=>s.totalCostLimit="1000")}," $1000 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[18]||(i[18]=f=>s.totalCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":i[19]||(i[19]=f=>s.totalCostLimit=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[ae,s.totalCostLimit]]),i[75]||(i[75]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 的累计总费用限制,达到限制后将拒绝所有后续请求,0 或留空表示无限制 ",-1))])]),e("div",null,[i[78]||(i[78]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"Opus 模型周费用限制 (美元)",-1)),e("div",Ta,[e("div",Ma,[e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[20]||(i[20]=f=>s.weeklyOpusCostLimit="100")}," $100 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[21]||(i[21]=f=>s.weeklyOpusCostLimit="500")}," $500 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[22]||(i[22]=f=>s.weeklyOpusCostLimit="1000")}," $1000 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[23]||(i[23]=f=>s.weeklyOpusCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":i[24]||(i[24]=f=>s.weeklyOpusCostLimit=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[ae,s.weeklyOpusCostLimit]]),i[77]||(i[77]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户,0 或留空表示无限制 ",-1))])]),e("div",null,[i[79]||(i[79]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制 (可选)",-1)),_(e("input",{"onUpdate:modelValue":i[25]||(i[25]=f=>s.concurrencyLimit=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",type:"number"},null,512),[[ae,s.concurrencyLimit]]),i[80]||(i[80]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 可同时处理的最大请求数,0 或留空表示无限制 ",-1))]),e("div",null,[i[81]||(i[81]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"备注 (可选)",-1)),_(e("textarea",{"onUpdate:modelValue":i[26]||(i[26]=f=>s.description=f),class:"form-input w-full resize-none border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",placeholder:"描述此 API Key 的用途...",rows:"2"},null,512),[[ae,s.description]])]),e("div",null,[i[89]||(i[89]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"过期设置",-1)),e("div",Pa,[e("div",Ra,[e("label",Ua,[_(e("input",{"onUpdate:modelValue":i[27]||(i[27]=f=>s.expirationMode=f),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"fixed"},null,512),[[ie,s.expirationMode]]),i[82]||(i[82]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"固定时间过期",-1))]),e("label",Va,[_(e("input",{"onUpdate:modelValue":i[28]||(i[28]=f=>s.expirationMode=f),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"activation"},null,512),[[ie,s.expirationMode]]),i[83]||(i[83]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"首次使用后激活",-1))])]),e("p",Oa,[s.expirationMode==="fixed"?(l(),n("span",Ea,i[84]||(i[84]=[e("i",{class:"fas fa-info-circle mr-1"},null,-1),I(" 固定时间模式:Key 创建后立即生效,按设定时间过期(支持小时和天数) ",-1)]))):(l(),n("span",ja,i[85]||(i[85]=[e("i",{class:"fas fa-info-circle mr-1"},null,-1),I(" 激活模式:Key 首次使用时激活,激活后按设定时间过期(支持小时和天数,适合批量销售) ",-1)])))])]),s.expirationMode==="fixed"?(l(),n("div",Ga,[_(e("select",{"onUpdate:modelValue":i[29]||(i[29]=f=>s.expireDuration=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",onChange:N},i[86]||(i[86]=[e("option",{value:""},"永不过期",-1),e("option",{value:"1h"},"1 小时",-1),e("option",{value:"3h"},"3 小时",-1),e("option",{value:"6h"},"6 小时",-1),e("option",{value:"12h"},"12 小时",-1),e("option",{value:"1d"},"1 天",-1),e("option",{value:"7d"},"7 天",-1),e("option",{value:"30d"},"30 天",-1),e("option",{value:"90d"},"90 天",-1),e("option",{value:"180d"},"180 天",-1),e("option",{value:"365d"},"365 天",-1),e("option",{value:"custom"},"自定义日期",-1)]),544),[[Ie,s.expireDuration]]),s.expireDuration==="custom"?(l(),n("div",qa,[_(e("input",{"onUpdate:modelValue":i[30]||(i[30]=f=>s.customExpireDate=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",min:M.value,type:"datetime-local",onChange:L},null,40,za),[[ae,s.customExpireDate]])])):$("",!0),s.expiresAt?(l(),n("p",Fa," 将于 "+c(y(s.expiresAt))+" 过期 ",1)):$("",!0)])):(l(),n("div",Ba,[e("div",Wa,[_(e("input",{"onUpdate:modelValue":i[31]||(i[31]=f=>s.activationDays=f),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",max:s.activationUnit==="hours"?8760:3650,min:"1",placeholder:s.activationUnit==="hours"?"输入小时数":"输入天数",type:"number"},null,8,Ha),[[ae,s.activationDays,void 0,{number:!0}]]),_(e("select",{"onUpdate:modelValue":i[32]||(i[32]=f=>s.activationUnit=f),class:"form-input w-20 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",onChange:k},i[87]||(i[87]=[e("option",{value:"hours"},"小时",-1),e("option",{value:"days"},"天",-1)]),544),[[Ie,s.activationUnit]])]),e("div",Na,[(l(!0),n(Q,null,se(g(),f=>(l(),n("button",{key:f.value,class:"rounded-md border border-gray-300 px-3 py-1 text-xs hover:bg-gray-100 dark:border-gray-600 dark:hover:bg-gray-700",type:"button",onClick:ne=>s.activationDays=f.value},c(f.label),9,Ya))),128))]),e("p",Qa,[i[88]||(i[88]=e("i",{class:"fas fa-clock mr-1"},null,-1)),I(" Key 将在首次使用后激活,激活后 "+c(s.activationDays||(s.activationUnit==="hours"?24:30))+" "+c(s.activationUnit==="hours"?"小时":"天")+"过期 ",1)])]))]),e("div",null,[i[95]||(i[95]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",Ja,[e("label",Xa,[_(e("input",{"onUpdate:modelValue":i[33]||(i[33]=f=>s.permissions=f),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"all"},null,512),[[ie,s.permissions]]),i[90]||(i[90]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"全部服务",-1))]),e("label",Za,[_(e("input",{"onUpdate:modelValue":i[34]||(i[34]=f=>s.permissions=f),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"claude"},null,512),[[ie,s.permissions]]),i[91]||(i[91]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Claude",-1))]),e("label",er,[_(e("input",{"onUpdate:modelValue":i[35]||(i[35]=f=>s.permissions=f),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"gemini"},null,512),[[ie,s.permissions]]),i[92]||(i[92]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Gemini",-1))]),e("label",tr,[_(e("input",{"onUpdate:modelValue":i[36]||(i[36]=f=>s.permissions=f),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"openai"},null,512),[[ie,s.permissions]]),i[93]||(i[93]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 OpenAI",-1))]),e("label",sr,[_(e("input",{"onUpdate:modelValue":i[37]||(i[37]=f=>s.permissions=f),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"droid"},null,512),[[ie,s.permissions]]),i[94]||(i[94]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Droid",-1))])]),i[96]||(i[96]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 控制此 API Key 可以访问哪些服务 ",-1))]),e("div",null,[e("div",ar,[i[97]||(i[97]=e("label",{class:"text-sm font-semibold text-gray-700 dark:text-gray-300"},"专属账号绑定 (可选)",-1)),e("button",{class:"flex items-center gap-1 text-sm text-blue-600 transition-colors hover:text-blue-800 disabled:cursor-not-allowed disabled:opacity-50 dark:text-blue-400 dark:hover:text-blue-300",disabled:O.value,title:"刷新账号列表",type:"button",onClick:J},[e("i",{class:G(["fas",O.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,c(O.value?"刷新中...":"刷新账号"),1)],8,rr)]),e("div",or,[e("div",null,[i[98]||(i[98]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),ue(Ke,{modelValue:s.claudeAccountId,"onUpdate:modelValue":i[38]||(i[38]=f=>s.claudeAccountId=f),accounts:P.value.claude,"default-option-text":"使用共享账号池",disabled:s.permissions!=="all"&&s.permissions!=="claude",groups:P.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[i[99]||(i[99]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),ue(Ke,{modelValue:s.geminiAccountId,"onUpdate:modelValue":i[39]||(i[39]=f=>s.geminiAccountId=f),accounts:P.value.gemini,"default-option-text":"使用共享账号池",disabled:s.permissions!=="all"&&s.permissions!=="gemini",groups:P.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[i[100]||(i[100]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),ue(Ke,{modelValue:s.openaiAccountId,"onUpdate:modelValue":i[40]||(i[40]=f=>s.openaiAccountId=f),accounts:P.value.openai,"default-option-text":"使用共享账号池",disabled:s.permissions!=="all"&&s.permissions!=="openai",groups:P.value.openaiGroups,placeholder:"请选择OpenAI账号",platform:"openai"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[i[101]||(i[101]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),ue(Ke,{modelValue:s.bedrockAccountId,"onUpdate:modelValue":i[41]||(i[41]=f=>s.bedrockAccountId=f),accounts:P.value.bedrock,"default-option-text":"使用共享账号池",disabled:s.permissions!=="all"&&s.permissions!=="openai",groups:[],placeholder:"请选择Bedrock账号",platform:"bedrock"},null,8,["modelValue","accounts","disabled"])]),e("div",null,[i[102]||(i[102]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),ue(Ke,{modelValue:s.droidAccountId,"onUpdate:modelValue":i[42]||(i[42]=f=>s.droidAccountId=f),accounts:P.value.droid,"default-option-text":"使用共享账号池",disabled:s.permissions!=="all"&&s.permissions!=="droid",groups:P.value.droidGroups,placeholder:"请选择Droid账号",platform:"droid"},null,8,["modelValue","accounts","disabled","groups"])])]),i[103]||(i[103]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 选择专属账号后,此API Key将只使用该账号,不选择则使用共享账号池 ",-1))]),e("div",null,[e("div",lr,[_(e("input",{id:"enableModelRestriction","onUpdate:modelValue":i[43]||(i[43]=f=>s.enableModelRestriction=f),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[Le,s.enableModelRestriction]]),i[104]||(i[104]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"enableModelRestriction"}," 启用模型限制 ",-1))]),s.enableModelRestriction?(l(),n("div",ir,[e("div",null,[i[107]||(i[107]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600"},"限制的模型列表",-1)),e("div",nr,[(l(!0),n(Q,null,se(s.restrictedModels,(f,ne)=>(l(),n("span",{key:ne,class:"inline-flex items-center rounded-full bg-red-100 px-3 py-1 text-sm text-red-800"},[I(c(f)+" ",1),e("button",{class:"ml-2 text-red-600 hover:text-red-800",type:"button",onClick:me=>x(ne)},i[105]||(i[105]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,dr)]))),128)),s.restrictedModels.length===0?(l(),n("span",ur," 暂无限制的模型 ")):$("",!0)]),e("div",cr,[e("div",gr,[(l(!0),n(Q,null,se(ce.value,f=>(l(),n("button",{key:f,class:"flex-shrink-0 rounded-lg bg-gray-100 px-3 py-1 text-xs text-gray-700 transition-colors hover:bg-gray-200 sm:text-sm",type:"button",onClick:ne=>W(f)},c(f),9,pr))),128)),ce.value.length===0?(l(),n("span",mr," 所有常用模型已在限制列表中 ")):$("",!0)]),e("div",xr,[_(e("input",{"onUpdate:modelValue":i[44]||(i[44]=f=>s.modelInput=f),class:"form-input flex-1",placeholder:"输入模型名称,按回车添加",type:"text",onKeydown:Qe(ve(d,["prevent"]),["enter"])},null,40,yr),[[ae,s.modelInput]]),e("button",{class:"rounded-lg bg-red-500 px-4 py-2 text-white transition-colors hover:bg-red-600",type:"button",onClick:d},i[106]||(i[106]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),i[108]||(i[108]=e("p",{class:"mt-2 text-xs text-gray-500"}," 设置此API Key无法访问的模型,例如:claude-opus-4-20250514 ",-1))])])):$("",!0)]),e("div",null,[e("div",fr,[_(e("input",{id:"enableClientRestriction","onUpdate:modelValue":i[45]||(i[45]=f=>s.enableClientRestriction=f),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[Le,s.enableClientRestriction]]),i[109]||(i[109]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"enableClientRestriction"}," 启用客户端限制 ",-1))]),s.enableClientRestriction?(l(),n("div",br,[e("div",null,[i[110]||(i[110]=e("label",{class:"mb-2 block text-xs font-medium text-gray-700 dark:text-gray-300"},"允许的客户端",-1)),e("div",vr,[(l(!0),n(Q,null,se(u.value,f=>(l(),n("div",{key:f.id,class:"flex items-start"},[_(e("input",{id:`client_${f.id}`,"onUpdate:modelValue":i[46]||(i[46]=ne=>s.allowedClients=ne),class:"mt-0.5 h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox",value:f.id},null,8,kr),[[Le,s.allowedClients]]),e("label",{class:"ml-2 flex-1 cursor-pointer",for:`client_${f.id}`},[e("span",hr,c(f.name),1),e("span",Ar,c(f.description),1)],8,wr)]))),128))])])])):$("",!0)]),e("div",$r,[e("button",{class:"flex-1 rounded-lg bg-gray-100 px-4 py-2.5 text-sm font-semibold text-gray-700 transition-colors hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[47]||(i[47]=f=>U.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-4 py-2.5 text-sm font-semibold",disabled:R.value,type:"submit"},[R.value?(l(),n("div",Ir)):(l(),n("i",Kr)),I(" "+c(R.value?"创建中...":"创建"),1)],8,Cr)])],32)])])]))}},Dr=Ce(Lr,[["__scopeId","data-v-4adaa454"]]),_r={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},Sr={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6 md:p-8"},Tr={class:"mb-4 flex items-center justify-between sm:mb-6"},Mr=["value"],Pr={key:0,class:"text-gray-500"},Rr={class:"space-y-4"},Ur={key:0},Vr={class:"flex flex-wrap gap-2"},Or=["onClick"],Er={key:1},jr={class:"flex flex-wrap gap-2"},Gr=["onClick"],qr={class:"flex gap-2"},zr=["onKeypress"],Fr={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},Br={class:"space-y-2"},Wr={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},Hr={class:"space-y-3"},Nr={class:"flex gap-2"},Yr={class:"space-y-3"},Qr={class:"flex gap-2"},Jr={class:"space-y-3"},Xr={class:"flex gap-2"},Zr={class:"mb-3 flex items-center"},eo={class:"flex gap-4"},to={class:"flex cursor-pointer items-center"},so={class:"flex cursor-pointer items-center"},ao={class:"flex cursor-pointer items-center"},ro={class:"flex cursor-pointer items-center"},oo={class:"flex cursor-pointer items-center"},lo={class:"mb-3 flex items-center justify-between"},io=["disabled"],no={class:"grid grid-cols-1 gap-3"},uo={class:"mb-3 flex items-center"},co={key:0,class:"space-y-3"},go={class:"mb-3 flex min-h-[32px] flex-wrap gap-2 rounded-lg border border-gray-200 bg-gray-50 p-2 dark:border-gray-600 dark:bg-gray-700"},po=["onClick"],mo={key:0,class:"text-sm text-gray-400 dark:text-gray-500"},xo={class:"space-y-3"},yo={class:"flex flex-wrap gap-2"},fo=["onClick"],bo={key:0,class:"text-sm italic text-gray-400 dark:text-gray-500"},vo={class:"flex gap-2"},ko=["onKeydown"],wo={class:"mb-3 flex items-center"},ho={key:0,class:"space-y-3"},Ao={class:"space-y-2"},$o=["id","value"],Co=["for"],Io={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},Ko={class:"block text-xs text-gray-500 dark:text-gray-400"},Lo={class:"flex gap-3 pt-4"},Do=["disabled"],_o={key:0,class:"loading-spinner mr-2"},So={key:1,class:"fas fa-save mr-2"},To={__name:"EditApiKeyModal",props:{apiKey:{type:Object,required:!0},accounts:{type:Object,default:()=>({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[],openaiResponses:[]})}},emits:["close","success"],setup(w,{emit:F}){const p=w,V=F,z=vt(),K=kt(),R=T(!1),O=T(!1),P=T({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),Y=T([]),H=T([]),h=T(""),C=T([]),u=j(()=>C.value.filter(b=>!s.tags.includes(b))),s=Be({name:"",tokenLimit:"",rateLimitWindow:"",rateLimitRequests:"",rateLimitCost:"",concurrencyLimit:"",dailyCostLimit:"",totalCostLimit:"",weeklyOpusCostLimit:"",permissions:"all",claudeAccountId:"",geminiAccountId:"",openaiAccountId:"",bedrockAccountId:"",droidAccountId:"",enableModelRestriction:!1,restrictedModels:[],modelInput:"",enableClientRestriction:!1,allowedClients:[],tags:[],isActive:!0,ownerId:""}),J=()=>{s.modelInput&&!s.restrictedModels.includes(s.modelInput)&&(s.restrictedModels.push(s.modelInput),s.modelInput="")},M=b=>{s.restrictedModels.splice(b,1)},N=T(["claude-opus-4-20250514","claude-opus-4-1-20250805"]),L=j(()=>N.value.filter(b=>!s.restrictedModels.includes(b))),y=b=>{s.restrictedModels.includes(b)||s.restrictedModels.push(b)},d=()=>{if(h.value&&h.value.trim()){const b=h.value.trim();s.tags.includes(b)||s.tags.push(b),h.value=""}},x=b=>{s.tags.includes(b)||s.tags.push(b)},re=b=>{s.tags.splice(b,1)},ce=async()=>{if(s.rateLimitWindow&&(!s.rateLimitCost||parseFloat(s.rateLimitCost)===0)){let b=!1;if(window.showConfirm?b=await window.showConfirm("费用限制提醒",`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
|
||
是否继续?`,"继续保存","返回修改"):b=confirm(`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
是否继续?`),!b)return}R.value=!0;try{const b={name:s.name,tokenLimit:0,rateLimitWindow:s.rateLimitWindow!==""&&s.rateLimitWindow!==null?parseInt(s.rateLimitWindow):0,rateLimitRequests:s.rateLimitRequests!==""&&s.rateLimitRequests!==null?parseInt(s.rateLimitRequests):0,rateLimitCost:s.rateLimitCost!==""&&s.rateLimitCost!==null?parseFloat(s.rateLimitCost):0,concurrencyLimit:s.concurrencyLimit!==""&&s.concurrencyLimit!==null?parseInt(s.concurrencyLimit):0,dailyCostLimit:s.dailyCostLimit!==""&&s.dailyCostLimit!==null?parseFloat(s.dailyCostLimit):0,totalCostLimit:s.totalCostLimit!==""&&s.totalCostLimit!==null?parseFloat(s.totalCostLimit):0,weeklyOpusCostLimit:s.weeklyOpusCostLimit!==""&&s.weeklyOpusCostLimit!==null?parseFloat(s.weeklyOpusCostLimit):0,permissions:s.permissions,tags:s.tags};s.claudeAccountId?s.claudeAccountId.startsWith("console:")?(b.claudeConsoleAccountId=s.claudeAccountId.substring(8),b.claudeAccountId=null):(s.claudeAccountId.startsWith("group:"),b.claudeAccountId=s.claudeAccountId,b.claudeConsoleAccountId=null):(b.claudeAccountId=null,b.claudeConsoleAccountId=null),s.geminiAccountId?b.geminiAccountId=s.geminiAccountId:b.geminiAccountId=null,s.openaiAccountId?b.openaiAccountId=s.openaiAccountId:b.openaiAccountId=null,s.bedrockAccountId?b.bedrockAccountId=s.bedrockAccountId:b.bedrockAccountId=null,s.droidAccountId?b.droidAccountId=s.droidAccountId:b.droidAccountId=null,b.enableModelRestriction=s.enableModelRestriction,b.restrictedModels=s.restrictedModels,b.enableClientRestriction=s.enableClientRestriction,b.allowedClients=s.allowedClients,b.isActive=s.isActive,s.ownerId!==void 0&&(b.ownerId=s.ownerId);const o=await q.put(`/admin/api-keys/${p.apiKey.id}`,b);o.success?(V("success"),V("close")):E(o.message||"更新失败","error")}catch{E("更新失败","error")}finally{R.value=!1}},W=async()=>{var b,o;O.value=!0;try{const[g,k,Z,U,i,f,ne,me]=await Promise.all([q.get("/admin/claude-accounts"),q.get("/admin/claude-console-accounts"),q.get("/admin/gemini-accounts"),q.get("/admin/openai-accounts"),q.get("/admin/openai-responses-accounts"),q.get("/admin/bedrock-accounts"),q.get("/admin/droid-accounts"),q.get("/admin/account-groups")]),te=[];g.success&&((b=g.data)==null||b.forEach(X=>{te.push({...X,platform:"claude-oauth",isDedicated:X.accountType==="dedicated"})})),k.success&&((o=k.data)==null||o.forEach(X=>{te.push({...X,platform:"claude-console",isDedicated:X.accountType==="dedicated"})})),P.value.claude=te,Z.success&&(P.value.gemini=(Z.data||[]).map(X=>({...X,isDedicated:X.accountType==="dedicated"})));const ke=[];if(U.success&&(U.data||[]).forEach(X=>{ke.push({...X,platform:"openai",isDedicated:X.accountType==="dedicated"})}),i.success&&(i.data||[]).forEach(X=>{ke.push({...X,platform:"openai-responses",isDedicated:X.accountType==="dedicated"})}),P.value.openai=ke,f.success&&(P.value.bedrock=(f.data||[]).map(X=>({...X,isDedicated:X.accountType==="dedicated"}))),ne.success&&(P.value.droid=(ne.data||[]).map(X=>({...X,platform:"droid",isDedicated:X.accountType==="dedicated"}))),me.success){const X=me.data||[];P.value.claudeGroups=X.filter(xe=>xe.platform==="claude"),P.value.geminiGroups=X.filter(xe=>xe.platform==="gemini"),P.value.openaiGroups=X.filter(xe=>xe.platform==="openai"),P.value.droidGroups=X.filter(xe=>xe.platform==="droid")}E("账号列表已刷新","success")}catch{E("刷新账号列表失败","error")}finally{O.value=!1}},ge=async()=>{try{const b=await q.get("/admin/users");b.success&&(H.value=b.data||[])}catch{H.value=[{id:"admin",username:"admin",displayName:"Admin",email:"",role:"admin"}]}};return Je(async()=>{try{const[b,o]=await Promise.all([z.loadSupportedClients(),K.fetchTags(),ge()]);Y.value=b||[],C.value=o||[]}catch{Y.value=[],C.value=[]}if(p.accounts){const b=[];p.accounts.openai&&p.accounts.openai.forEach(o=>{b.push({...o,platform:"openai"})}),p.accounts.openaiResponses&&p.accounts.openaiResponses.forEach(o=>{b.push({...o,platform:"openai-responses"})}),P.value={claude:p.accounts.claude||[],gemini:p.accounts.gemini||[],openai:b,bedrock:p.accounts.bedrock||[],droid:(p.accounts.droid||[]).map(o=>({...o,platform:"droid"})),claudeGroups:p.accounts.claudeGroups||[],geminiGroups:p.accounts.geminiGroups||[],openaiGroups:p.accounts.openaiGroups||[],droidGroups:p.accounts.droidGroups||[]}}await W(),s.name=p.apiKey.name,s.tokenLimit=p.apiKey.tokenLimit||"",s.rateLimitCost=p.apiKey.rateLimitCost||"",p.apiKey.tokenLimit>0&&p.apiKey.rateLimitCost,s.rateLimitWindow=p.apiKey.rateLimitWindow||"",s.rateLimitRequests=p.apiKey.rateLimitRequests||"",s.concurrencyLimit=p.apiKey.concurrencyLimit||"",s.dailyCostLimit=p.apiKey.dailyCostLimit||"",s.totalCostLimit=p.apiKey.totalCostLimit||"",s.weeklyOpusCostLimit=p.apiKey.weeklyOpusCostLimit||"",s.permissions=p.apiKey.permissions||"all",p.apiKey.claudeConsoleAccountId?s.claudeAccountId=`console:${p.apiKey.claudeConsoleAccountId}`:s.claudeAccountId=p.apiKey.claudeAccountId||"",s.geminiAccountId=p.apiKey.geminiAccountId||"",s.openaiAccountId=p.apiKey.openaiAccountId||"",s.bedrockAccountId=p.apiKey.bedrockAccountId||"",s.droidAccountId=p.apiKey.droidAccountId||"",s.restrictedModels=p.apiKey.restrictedModels||[],s.allowedClients=p.apiKey.allowedClients||[],s.tags=p.apiKey.tags||[],s.enableModelRestriction=p.apiKey.enableModelRestriction||!1,s.enableClientRestriction=p.apiKey.enableClientRestriction||!1,s.isActive=p.apiKey.isActive!==void 0?p.apiKey.isActive:!0,s.ownerId=p.apiKey.userId||"admin"}),(b,o)=>(l(),pe(Se,{to:"body"},[e("div",_r,[e("div",Sr,[e("div",Tr,[o[40]||(o[40]=e("div",{class:"flex items-center gap-2 sm:gap-3"},[e("div",{class:"flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-blue-600 sm:h-10 sm:w-10 sm:rounded-xl"},[e("i",{class:"fas fa-edit text-sm text-white sm:text-base"})]),e("h3",{class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"}," 编辑 API Key ")],-1)),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300",onClick:o[0]||(o[0]=g=>b.$emit("close"))},o[39]||(o[39]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),e("form",{class:"modal-scroll-content custom-scrollbar flex-1 space-y-4 sm:space-y-6",onSubmit:ve(ce,["prevent"])},[e("div",null,[o[41]||(o[41]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-3 sm:text-sm"},"名称",-1)),e("div",null,[_(e("input",{"onUpdate:modelValue":o[1]||(o[1]=g=>s.name=g),class:"form-input flex-1 border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",maxlength:"100",placeholder:"请输入API Key名称",required:"",type:"text"},null,512),[[ae,s.name]])]),o[42]||(o[42]=e("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400 sm:mt-2"}," 用于识别此 API Key 的用途 ",-1))]),e("div",null,[o[43]||(o[43]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-3 sm:text-sm"},"所有者",-1)),_(e("select",{"onUpdate:modelValue":o[2]||(o[2]=g=>s.ownerId=g),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200"},[(l(!0),n(Q,null,se(H.value,g=>(l(),n("option",{key:g.id,value:g.id},[I(c(g.displayName)+" ("+c(g.username)+") ",1),g.role==="admin"?(l(),n("span",Pr,"- 管理员")):$("",!0)],8,Mr))),128))],512),[[Ie,s.ownerId]]),o[44]||(o[44]=e("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400 sm:mt-2"}," 分配此 API Key 给指定用户或管理员,管理员分配时不受用户 API Key 数量限制 ",-1))]),e("div",null,[o[52]||(o[52]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-3 sm:text-sm"},"标签",-1)),e("div",Rr,[s.tags.length>0?(l(),n("div",Ur,[o[46]||(o[46]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 已选择的标签: ",-1)),e("div",Vr,[(l(!0),n(Q,null,se(s.tags,(g,k)=>(l(),n("span",{key:"selected-"+k,class:"inline-flex items-center gap-1 rounded-full bg-blue-100 px-3 py-1 text-sm text-blue-800 dark:bg-blue-900/30 dark:text-blue-400"},[I(c(g)+" ",1),e("button",{class:"ml-1 hover:text-blue-900 dark:hover:text-blue-300",type:"button",onClick:Z=>re(k)},o[45]||(o[45]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,Or)]))),128))])])):$("",!0),u.value.length>0?(l(),n("div",Er,[o[48]||(o[48]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",jr,[(l(!0),n(Q,null,se(u.value,g=>(l(),n("button",{key:"available-"+g,class:"inline-flex items-center gap-1 rounded-full bg-gray-100 px-3 py-1 text-sm text-gray-700 transition-colors hover:bg-blue-100 hover:text-blue-700 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-blue-900/30 dark:hover:text-blue-400",type:"button",onClick:k=>x(g)},[o[47]||(o[47]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),I(" "+c(g),1)],8,Gr))),128))])])):$("",!0),e("div",null,[o[50]||(o[50]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",qr,[_(e("input",{"onUpdate:modelValue":o[3]||(o[3]=g=>h.value=g),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",placeholder:"输入新标签名称",type:"text",onKeypress:Qe(ve(d,["prevent"]),["enter"])},null,40,zr),[[ae,h.value]]),e("button",{class:"rounded-lg bg-green-500 px-4 py-2 text-white transition-colors hover:bg-green-600",type:"button",onClick:d},o[49]||(o[49]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),o[51]||(o[51]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 用于标记不同团队或用途,方便筛选管理 ",-1))])]),e("div",Fr,[o[60]||(o[60]=e("div",{class:"mb-2 flex items-center gap-2"},[e("div",{class:"flex h-6 w-6 flex-shrink-0 items-center justify-center rounded bg-blue-500"},[e("i",{class:"fas fa-tachometer-alt text-xs text-white"})]),e("h4",{class:"text-sm font-semibold text-gray-800 dark:text-gray-200"}," 速率限制设置 (可选) ")],-1)),e("div",Br,[e("div",Wr,[e("div",null,[o[53]||(o[53]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"时间窗口 (分钟)",-1)),_(e("input",{"onUpdate:modelValue":o[4]||(o[4]=g=>s.rateLimitWindow=g),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"1",placeholder:"无限制",type:"number"},null,512),[[ae,s.rateLimitWindow]]),o[54]||(o[54]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"时间段单位",-1))]),e("div",null,[o[55]||(o[55]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"请求次数限制",-1)),_(e("input",{"onUpdate:modelValue":o[5]||(o[5]=g=>s.rateLimitRequests=g),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"1",placeholder:"无限制",type:"number"},null,512),[[ae,s.rateLimitRequests]]),o[56]||(o[56]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大请求",-1))]),e("div",null,[o[57]||(o[57]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),_(e("input",{"onUpdate:modelValue":o[6]||(o[6]=g=>s.rateLimitCost=g),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"无限制",step:"0.01",type:"number"},null,512),[[ae,s.rateLimitCost]]),o[58]||(o[58]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大费用",-1))])]),o[59]||(o[59]=e("div",{class:"rounded-lg bg-blue-100 p-2 dark:bg-blue-900/30"},[e("h5",{class:"mb-1 text-xs font-semibold text-blue-800 dark:text-blue-400"}," 💡 使用示例 "),e("div",{class:"space-y-0.5 text-xs text-blue-700 dark:text-blue-300"},[e("div",null,[e("strong",null,"示例1:"),I(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求 ")]),e("div",null,[e("strong",null,"示例2:"),I(" 时间窗口=1,费用=0.1 → 每分钟最多$0.1费用")]),e("div",null,[e("strong",null,"示例3:"),I(" 窗口=30,请求=50,费用=5 → 每30分钟50次请求且不超$5费用 ")])])],-1))])]),e("div",null,[o[62]||(o[62]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"每日费用限制 (美元)",-1)),e("div",Hr,[e("div",Nr,[e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[7]||(o[7]=g=>s.dailyCostLimit="50")}," $50 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[8]||(o[8]=g=>s.dailyCostLimit="100")}," $100 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[9]||(o[9]=g=>s.dailyCostLimit="200")}," $200 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[10]||(o[10]=g=>s.dailyCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":o[11]||(o[11]=g=>s.dailyCostLimit=g),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[ae,s.dailyCostLimit]]),o[61]||(o[61]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[o[64]||(o[64]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"总费用限制 (美元)",-1)),e("div",Yr,[e("div",Qr,[e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[12]||(o[12]=g=>s.totalCostLimit="100")}," $100 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[13]||(o[13]=g=>s.totalCostLimit="500")}," $500 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[14]||(o[14]=g=>s.totalCostLimit="1000")}," $1000 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[15]||(o[15]=g=>s.totalCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":o[16]||(o[16]=g=>s.totalCostLimit=g),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[ae,s.totalCostLimit]]),o[63]||(o[63]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 的累计总费用限制,达到限制后将拒绝所有后续请求,0 或留空表示无限制 ",-1))])]),e("div",null,[o[66]||(o[66]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"Opus 模型周费用限制 (美元)",-1)),e("div",Jr,[e("div",Xr,[e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[17]||(o[17]=g=>s.weeklyOpusCostLimit="100")}," $100 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[18]||(o[18]=g=>s.weeklyOpusCostLimit="500")}," $500 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[19]||(o[19]=g=>s.weeklyOpusCostLimit="1000")}," $1000 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[20]||(o[20]=g=>s.weeklyOpusCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":o[21]||(o[21]=g=>s.weeklyOpusCostLimit=g),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[ae,s.weeklyOpusCostLimit]]),o[65]||(o[65]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户,0 或留空表示无限制 ",-1))])]),e("div",null,[o[67]||(o[67]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制",-1)),_(e("input",{"onUpdate:modelValue":o[22]||(o[22]=g=>s.concurrencyLimit=g),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",type:"number"},null,512),[[ae,s.concurrencyLimit]]),o[68]||(o[68]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 可同时处理的最大请求数 ",-1))]),e("div",null,[e("div",Zr,[_(e("input",{id:"editIsActive","onUpdate:modelValue":o[23]||(o[23]=g=>s.isActive=g),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox"},null,512),[[Le,s.isActive]]),o[69]||(o[69]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"editIsActive"}," 激活账号 ",-1))]),o[70]||(o[70]=e("p",{class:"mb-4 text-xs text-gray-500 dark:text-gray-400"}," 取消勾选将禁用此 API Key,暂停所有请求,客户端返回 401 错误 ",-1))]),e("div",null,[o[76]||(o[76]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",eo,[e("label",to,[_(e("input",{"onUpdate:modelValue":o[24]||(o[24]=g=>s.permissions=g),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"all"},null,512),[[ie,s.permissions]]),o[71]||(o[71]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"全部服务",-1))]),e("label",so,[_(e("input",{"onUpdate:modelValue":o[25]||(o[25]=g=>s.permissions=g),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"claude"},null,512),[[ie,s.permissions]]),o[72]||(o[72]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Claude",-1))]),e("label",ao,[_(e("input",{"onUpdate:modelValue":o[26]||(o[26]=g=>s.permissions=g),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"gemini"},null,512),[[ie,s.permissions]]),o[73]||(o[73]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Gemini",-1))]),e("label",ro,[_(e("input",{"onUpdate:modelValue":o[27]||(o[27]=g=>s.permissions=g),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"openai"},null,512),[[ie,s.permissions]]),o[74]||(o[74]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 OpenAI",-1))]),e("label",oo,[_(e("input",{"onUpdate:modelValue":o[28]||(o[28]=g=>s.permissions=g),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"droid"},null,512),[[ie,s.permissions]]),o[75]||(o[75]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Droid",-1))])]),o[77]||(o[77]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 控制此 API Key 可以访问哪些服务 ",-1))]),e("div",null,[e("div",lo,[o[78]||(o[78]=e("label",{class:"text-sm font-semibold text-gray-700 dark:text-gray-300"},"专属账号绑定",-1)),e("button",{class:"flex items-center gap-1 text-sm text-blue-600 transition-colors hover:text-blue-800 disabled:cursor-not-allowed disabled:opacity-50 dark:text-blue-400 dark:hover:text-blue-300",disabled:O.value,title:"刷新账号列表",type:"button",onClick:W},[e("i",{class:G(["fas",O.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,c(O.value?"刷新中...":"刷新账号"),1)],8,io)]),e("div",no,[e("div",null,[o[79]||(o[79]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),ue(Ke,{modelValue:s.claudeAccountId,"onUpdate:modelValue":o[29]||(o[29]=g=>s.claudeAccountId=g),accounts:P.value.claude,"default-option-text":"使用共享账号池",disabled:s.permissions!=="all"&&s.permissions!=="claude",groups:P.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[o[80]||(o[80]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),ue(Ke,{modelValue:s.geminiAccountId,"onUpdate:modelValue":o[30]||(o[30]=g=>s.geminiAccountId=g),accounts:P.value.gemini,"default-option-text":"使用共享账号池",disabled:s.permissions!=="all"&&s.permissions!=="gemini",groups:P.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[o[81]||(o[81]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),ue(Ke,{modelValue:s.openaiAccountId,"onUpdate:modelValue":o[31]||(o[31]=g=>s.openaiAccountId=g),accounts:P.value.openai,"default-option-text":"使用共享账号池",disabled:s.permissions!=="all"&&s.permissions!=="openai",groups:P.value.openaiGroups,placeholder:"请选择OpenAI账号",platform:"openai"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[o[82]||(o[82]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),ue(Ke,{modelValue:s.bedrockAccountId,"onUpdate:modelValue":o[32]||(o[32]=g=>s.bedrockAccountId=g),accounts:P.value.bedrock,"default-option-text":"使用共享账号池",disabled:s.permissions!=="all"&&s.permissions!=="openai",groups:[],placeholder:"请选择Bedrock账号",platform:"bedrock"},null,8,["modelValue","accounts","disabled"])]),e("div",null,[o[83]||(o[83]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),ue(Ke,{modelValue:s.droidAccountId,"onUpdate:modelValue":o[33]||(o[33]=g=>s.droidAccountId=g),accounts:P.value.droid,"default-option-text":"使用共享账号池",disabled:s.permissions!=="all"&&s.permissions!=="droid",groups:P.value.droidGroups,placeholder:"请选择Droid账号",platform:"droid"},null,8,["modelValue","accounts","disabled","groups"])])]),o[84]||(o[84]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 修改绑定账号将影响此API Key的请求路由 ",-1))]),e("div",null,[e("div",uo,[_(e("input",{id:"editEnableModelRestriction","onUpdate:modelValue":o[34]||(o[34]=g=>s.enableModelRestriction=g),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox"},null,512),[[Le,s.enableModelRestriction]]),o[85]||(o[85]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"editEnableModelRestriction"}," 启用模型限制 ",-1))]),s.enableModelRestriction?(l(),n("div",co,[e("div",null,[o[88]||(o[88]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600 dark:text-gray-400"},"限制的模型列表",-1)),e("div",go,[(l(!0),n(Q,null,se(s.restrictedModels,(g,k)=>(l(),n("span",{key:k,class:"inline-flex items-center rounded-full bg-red-100 px-3 py-1 text-sm text-red-800 dark:bg-red-900/30 dark:text-red-400"},[I(c(g)+" ",1),e("button",{class:"ml-2 text-red-600 hover:text-red-800 dark:text-red-400 dark:hover:text-red-300",type:"button",onClick:Z=>M(k)},o[86]||(o[86]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,po)]))),128)),s.restrictedModels.length===0?(l(),n("span",mo," 暂无限制的模型 ")):$("",!0)]),e("div",xo,[e("div",yo,[(l(!0),n(Q,null,se(L.value,g=>(l(),n("button",{key:g,class:"flex-shrink-0 rounded-lg bg-gray-100 px-3 py-1 text-xs text-gray-700 transition-colors hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600 sm:text-sm",type:"button",onClick:k=>y(g)},c(g),9,fo))),128)),L.value.length===0?(l(),n("span",bo," 所有常用模型已在限制列表中 ")):$("",!0)]),e("div",vo,[_(e("input",{"onUpdate:modelValue":o[35]||(o[35]=g=>s.modelInput=g),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",placeholder:"输入模型名称,按回车添加",type:"text",onKeydown:Qe(ve(J,["prevent"]),["enter"])},null,40,ko),[[ae,s.modelInput]]),e("button",{class:"rounded-lg bg-red-500 px-4 py-2 text-white transition-colors hover:bg-red-600",type:"button",onClick:J},o[87]||(o[87]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),o[89]||(o[89]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 设置此API Key无法访问的模型,例如:claude-opus-4-20250514 ",-1))])])):$("",!0)]),e("div",null,[e("div",wo,[_(e("input",{id:"editEnableClientRestriction","onUpdate:modelValue":o[36]||(o[36]=g=>s.enableClientRestriction=g),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox"},null,512),[[Le,s.enableClientRestriction]]),o[90]||(o[90]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"editEnableClientRestriction"}," 启用客户端限制 ",-1))]),s.enableClientRestriction?(l(),n("div",ho,[e("div",null,[o[91]||(o[91]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600 dark:text-gray-400"},"允许的客户端",-1)),o[92]||(o[92]=e("p",{class:"mb-3 text-xs text-gray-500 dark:text-gray-400"}," 勾选允许使用此API Key的客户端 ",-1)),e("div",Ao,[(l(!0),n(Q,null,se(Y.value,g=>(l(),n("div",{key:g.id,class:"flex items-start"},[_(e("input",{id:`edit_client_${g.id}`,"onUpdate:modelValue":o[37]||(o[37]=k=>s.allowedClients=k),class:"mt-0.5 h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox",value:g.id},null,8,$o),[[Le,s.allowedClients]]),e("label",{class:"ml-2 flex-1 cursor-pointer",for:`edit_client_${g.id}`},[e("span",Io,c(g.name),1),e("span",Ko,c(g.description),1)],8,Co)]))),128))])])])):$("",!0)]),e("div",Lo,[e("button",{class:"flex-1 rounded-xl bg-gray-100 px-6 py-3 font-semibold text-gray-700 transition-colors hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[38]||(o[38]=g=>b.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:R.value,type:"submit"},[R.value?(l(),n("div",_o)):(l(),n("i",So)),I(" "+c(R.value?"保存中...":"保存修改"),1)],8,Do)])],32)])])]))}},Mo=Ce(To,[["__scopeId","data-v-52c5d9eb"]]),Po={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},Ro={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-md flex-col p-8"},Uo={class:"mb-6 flex items-center justify-between"},Vo={class:"modal-scroll-content custom-scrollbar flex-1 space-y-6"},Oo={class:"rounded-lg border border-blue-200 bg-blue-50 p-4"},Eo={class:"flex items-start gap-3"},jo={class:"text-sm text-gray-700"},Go={class:"mt-1 text-xs text-gray-600"},qo={key:0,class:"mt-3"},zo=["min"],Fo={key:1,class:"mt-2 text-xs text-gray-500"},Bo={class:"flex gap-3 pt-4"},Wo=["disabled"],Ho={key:0,class:"loading-spinner mr-2"},No={key:1,class:"fas fa-clock mr-2"},Yo={__name:"RenewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close","success"],setup(w,{emit:F}){const p=w,V=F,z=T(!1),K=Be({renewDuration:"30d",customExpireDate:"",newExpiresAt:null}),R=j(()=>{const h=new Date;return p.apiKey.expiresAt&&new Date(p.apiKey.expiresAt)>h?new Date(p.apiKey.expiresAt).toISOString().slice(0,16):(h.setMinutes(h.getMinutes()+1),h.toISOString().slice(0,16))}),O=h=>new Date(h).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),P=()=>{if(!K.renewDuration){K.newExpiresAt=null;return}if(K.renewDuration==="permanent"){K.newExpiresAt=null;return}if(K.renewDuration==="custom")return;const h=p.apiKey.expiresAt&&new Date(p.apiKey.expiresAt)>new Date?new Date(p.apiKey.expiresAt):new Date,u=K.renewDuration.match(/(\d+)([dhmy])/);if(u){const[,s,J]=u,M=parseInt(s);switch(J){case"d":h.setDate(h.getDate()+M);break;case"h":h.setHours(h.getHours()+M);break;case"m":h.setMonth(h.getMonth()+M);break;case"y":h.setFullYear(h.getFullYear()+M);break}K.newExpiresAt=h.toISOString()}},Y=()=>{K.customExpireDate&&(K.newExpiresAt=new Date(K.customExpireDate).toISOString())},H=async()=>{z.value=!0;try{const h={expiresAt:K.renewDuration==="permanent"?null:K.newExpiresAt},C=await q.put(`/admin/api-keys/${p.apiKey.id}`,h);C.success?(E("API Key 续期成功","success"),V("success"),V("close")):E(C.message||"续期失败","error")}catch{E("续期失败","error")}finally{z.value=!1}};return P(),(h,C)=>(l(),pe(Se,{to:"body"},[e("div",Po,[e("div",Ro,[e("div",Uo,[C[5]||(C[5]=e("div",{class:"flex items-center gap-3"},[e("div",{class:"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-green-500 to-green-600"},[e("i",{class:"fas fa-clock text-white"})]),e("h3",{class:"text-xl font-bold text-gray-900"},"续期 API Key")],-1)),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600",onClick:C[0]||(C[0]=u=>h.$emit("close"))},C[4]||(C[4]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",Vo,[e("div",Oo,[e("div",Eo,[C[7]||(C[7]=e("div",{class:"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-lg bg-blue-500"},[e("i",{class:"fas fa-info text-sm text-white"})],-1)),e("div",null,[C[6]||(C[6]=e("h4",{class:"mb-1 font-semibold text-gray-800"},"API Key 信息",-1)),e("p",jo,c(w.apiKey.name),1),e("p",Go," 当前过期时间:"+c(w.apiKey.expiresAt?O(w.apiKey.expiresAt):"永不过期"),1)])])]),e("div",null,[C[9]||(C[9]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700"},"续期时长",-1)),_(e("select",{"onUpdate:modelValue":C[1]||(C[1]=u=>K.renewDuration=u),class:"form-input w-full",onChange:P},C[8]||(C[8]=[e("option",{value:"7d"},"延长 7 天",-1),e("option",{value:"30d"},"延长 30 天",-1),e("option",{value:"90d"},"延长 90 天",-1),e("option",{value:"180d"},"延长 180 天",-1),e("option",{value:"365d"},"延长 365 天",-1),e("option",{value:"custom"},"自定义日期",-1),e("option",{value:"permanent"},"设为永不过期",-1)]),544),[[Ie,K.renewDuration]]),K.renewDuration==="custom"?(l(),n("div",qo,[_(e("input",{"onUpdate:modelValue":C[2]||(C[2]=u=>K.customExpireDate=u),class:"form-input w-full",min:R.value,type:"datetime-local",onChange:Y},null,40,zo),[[ae,K.customExpireDate]])])):$("",!0),K.newExpiresAt?(l(),n("p",Fo," 新的过期时间:"+c(O(K.newExpiresAt)),1)):$("",!0)])]),e("div",Bo,[e("button",{class:"flex-1 rounded-xl bg-gray-100 px-6 py-3 font-semibold text-gray-700 transition-colors hover:bg-gray-200",type:"button",onClick:C[3]||(C[3]=u=>h.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:z.value||!K.renewDuration,type:"button",onClick:H},[z.value?(l(),n("div",Ho)):(l(),n("i",No)),I(" "+c(z.value?"续期中...":"确认续期"),1)],8,Wo)])])])]))}},Qo=Ce(Yo,[["__scopeId","data-v-2fba52a3"]]),Jo={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},Xo={class:"modal-content custom-scrollbar mx-auto max-h-[90vh] w-full max-w-lg overflow-y-auto p-8"},Zo={class:"mb-6 space-y-4"},el={class:"rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-600 dark:bg-gray-800"},tl={class:"font-medium text-gray-900 dark:text-gray-100"},sl={key:0},al={class:"rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-600 dark:bg-gray-800"},rl={class:"text-gray-700 dark:text-gray-300"},ol={class:"relative"},ll={class:"flex min-h-[60px] items-center break-all rounded-lg border border-gray-700 bg-gray-900 p-4 pr-14 font-mono text-sm text-white dark:border-gray-600 dark:bg-gray-900"},il={class:"absolute right-3 top-3"},nl=["title"],dl={__name:"NewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close"],setup(w,{emit:F}){const p=w,V=F,z=T(!1),K=()=>{if(typeof window<"u"){const C=window.location.protocol,u=window.location.host;let s=C+"//"+u;const J=window.location.href,M=J.indexOf("/",8);return M!==-1&&(s=J.substring(0,M)),s}return""},R=j(()=>K()+"/api"),O=()=>{z.value=!z.value},P=()=>{const C=p.apiKey.apiKey||p.apiKey.key||"";return C?z.value||C.length<=12?C:C.substring(0,8)+"●".repeat(Math.max(0,C.length-12))+C.substring(C.length-4):""},Y=async()=>{const C=p.apiKey.apiKey||p.apiKey.key||"";if(!C){E("API Key 不存在","error");return}const u=`ANTHROPIC_BASE_URL="${R.value}"
|
||
ANTHROPIC_AUTH_TOKEN="${C}"`;try{await navigator.clipboard.writeText(u),E("配置信息已复制到剪贴板","success")}catch{const J=document.createElement("textarea");J.value=u,document.body.appendChild(J),J.select();try{document.execCommand("copy"),E("配置信息已复制到剪贴板","success")}catch{E("复制失败,请手动复制","error")}finally{document.body.removeChild(J)}}},H=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","取消")&&V("close"):confirm(`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`)&&V("close")},h=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
建议您先复制API Key再关闭。`,"仍然关闭","返回复制")&&V("close"):confirm(`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&V("close")};return(C,u)=>(l(),pe(Se,{to:"body"},[e("div",Jo,[e("div",Xo,[e("div",{class:"mb-6 flex items-center justify-between"},[u[1]||(u[1]=e("div",{class:"flex items-center gap-3"},[e("div",{class:"flex h-12 w-12 items-center justify-center rounded-xl bg-gradient-to-br from-green-500 to-green-600"},[e("i",{class:"fas fa-check text-lg text-white"})]),e("div",null,[e("h3",{class:"text-xl font-bold text-gray-900 dark:text-gray-100"},"API Key 创建成功"),e("p",{class:"text-sm text-gray-600 dark:text-gray-400"},"请妥善保存您的 API Key")])],-1)),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300",title:"直接关闭(不推荐)",onClick:h},u[0]||(u[0]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),u[7]||(u[7]=e("div",{class:"mb-6 border-l-4 border-amber-400 bg-amber-50 p-4 dark:border-amber-500 dark:bg-amber-900/20"},[e("div",{class:"flex items-start"},[e("div",{class:"mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-lg bg-amber-400 dark:bg-amber-500"},[e("i",{class:"fas fa-exclamation-triangle text-sm text-white"})]),e("div",{class:"ml-3"},[e("h5",{class:"mb-1 font-semibold text-amber-900 dark:text-amber-400"},"重要提醒"),e("p",{class:"text-sm text-amber-800 dark:text-amber-300"}," 这是您唯一能看到完整 API Key 的机会。关闭此窗口后,系统将不再显示完整的 API Key。请立即复制并妥善保存。 ")])])],-1)),e("div",Zo,[e("div",null,[u[2]||(u[2]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"API Key 名称",-1)),e("div",el,[e("span",tl,c(w.apiKey.name),1)])]),w.apiKey.description?(l(),n("div",sl,[u[3]||(u[3]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"备注",-1)),e("div",al,[e("span",rl,c(w.apiKey.description||"无描述"),1)])])):$("",!0),e("div",null,[u[4]||(u[4]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"API Key",-1)),e("div",ol,[e("div",ll,c(P()),1),e("div",il,[e("button",{class:"btn-icon-sm bg-gray-700 hover:bg-gray-800 dark:bg-gray-700 dark:hover:bg-gray-600",title:z.value?"隐藏API Key":"显示完整API Key",type:"button",onClick:O},[e("i",{class:G(["fas",z.value?"fa-eye-slash":"fa-eye","text-gray-300"])},null,2)],8,nl)])]),u[5]||(u[5]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 点击眼睛图标切换显示模式,使用下方按钮复制环境变量配置 ",-1))])]),e("div",{class:"flex gap-3"},[e("button",{class:"btn btn-primary flex flex-1 items-center justify-center gap-2 px-6 py-3 font-semibold",onClick:Y},u[6]||(u[6]=[e("i",{class:"fas fa-copy"},null,-1),I(" 复制配置信息 ",-1)])),e("button",{class:"rounded-xl border border-gray-300 bg-gray-200 px-6 py-3 font-semibold text-gray-800 transition-colors hover:bg-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600",onClick:H}," 我已保存 ")])])])]))}},ul=Ce(dl,[["__scopeId","data-v-40dee5bf"]]),cl={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},gl={class:"modal-content custom-scrollbar mx-auto max-h-[90vh] w-full max-w-2xl overflow-y-auto p-8"},pl={class:"mb-6 flex items-center justify-between"},ml={class:"flex items-center gap-3"},xl={class:"text-sm text-gray-600"},yl={class:"mb-6 grid grid-cols-2 gap-4 md:grid-cols-4"},fl={class:"rounded-lg border border-blue-200 bg-gradient-to-br from-blue-50 to-blue-100 p-4"},bl={class:"flex items-center justify-between"},vl={class:"mt-1 text-2xl font-bold text-blue-900"},kl={class:"rounded-lg border border-green-200 bg-gradient-to-br from-green-50 to-green-100 p-4"},wl={class:"flex items-center justify-between"},hl={class:"mt-1 truncate text-lg font-bold text-green-900"},Al={class:"rounded-lg border border-purple-200 bg-gradient-to-br from-purple-50 to-purple-100 p-4"},$l={class:"flex items-center justify-between"},Cl={class:"mt-1 text-lg font-bold text-purple-900"},Il={class:"rounded-lg border border-orange-200 bg-gradient-to-br from-orange-50 to-orange-100 p-4"},Kl={class:"flex items-center justify-between"},Ll={class:"mt-1 text-lg font-bold text-orange-900"},Dl={class:"mb-6"},_l={class:"mb-3 flex items-center justify-between"},Sl={class:"flex items-center gap-2"},Tl={key:0,class:"custom-scrollbar max-h-48 overflow-y-auto rounded-lg bg-gray-900 p-4"},Ml={class:"font-mono text-xs text-gray-300"},Pl={__name:"BatchApiKeyModal",props:{apiKeys:{type:Array,required:!0}},emits:["close"],setup(w,{emit:F}){const p=w,V=F,z=T(!1),K=j(()=>{if(p.apiKeys.length>0){const u=p.apiKeys[0],s=u.name.match(/^(.+)_\d+$/);return s?s[1]:u.name}return""}),R=()=>{if(p.apiKeys.length===0)return"未知";const u=p.apiKeys[0].permissions;return{all:"全部服务",claude:"仅 Claude",gemini:"仅 Gemini"}[u]||u},O=()=>{if(p.apiKeys.length===0)return"未知";const u=p.apiKeys[0].expiresAt;if(!u)return"永不过期";const s=new Date(u),M=Math.ceil((s-new Date)/(1e3*60*60*24));return M<=7?`${M}天`:M<=30?`${Math.ceil(M/7)}周`:M<=365?`${Math.ceil(M/30)}个月`:`${Math.ceil(M/365)}年`},P=()=>{z.value=!z.value},Y=()=>{const s=p.apiKeys.slice(0,10).map(J=>`${J.name}: ${J.apiKey||J.key||""}`);return p.apiKeys.length>10&&s.push(`... 还有 ${p.apiKeys.length-10} 个 API Key`),s.join(`
|
||
`)},H=()=>{const u=p.apiKeys.map(L=>`${L.name}: ${L.apiKey||L.key||""}`).join(`
|
||
`),s=new Blob([u],{type:"text/plain;charset=utf-8"}),J=URL.createObjectURL(s),M=document.createElement("a");M.href=J;const N=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5);M.download=`api-keys-${K.value}-${N}.txt`,document.body.appendChild(M),M.click(),document.body.removeChild(M),URL.revokeObjectURL(J),E("API Keys 文件已下载","success")},h=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看这些 API Key,请确保已经下载并妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","返回下载")&&V("close"):confirm(`关闭后将无法再次查看这些 API Key,请确保已经下载并妥善保存。
|
||
|
||
确定要关闭吗?`)&&V("close")},C=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有下载 API Keys,关闭后将无法再次查看。
|
||
|
||
强烈建议您先下载保存。`,"仍然关闭","返回下载")&&V("close"):confirm(`您还没有下载 API Keys,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&V("close")};return(u,s)=>(l(),pe(Se,{to:"body"},[e("div",cl,[e("div",gl,[e("div",pl,[e("div",ml,[s[1]||(s[1]=e("div",{class:"flex h-12 w-12 items-center justify-center rounded-xl bg-gradient-to-br from-green-500 to-green-600"},[e("i",{class:"fas fa-layer-group text-lg text-white"})],-1)),e("div",null,[s[0]||(s[0]=e("h3",{class:"text-xl font-bold text-gray-900"},"批量创建成功",-1)),e("p",xl,"成功创建 "+c(w.apiKeys.length)+" 个 API Key",1)])]),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600",title:"直接关闭(不推荐)",onClick:C},s[2]||(s[2]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),s[14]||(s[14]=e("div",{class:"mb-6 border-l-4 border-amber-400 bg-amber-50 p-4"},[e("div",{class:"flex items-start"},[e("div",{class:"mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-lg bg-amber-400"},[e("i",{class:"fas fa-exclamation-triangle text-sm text-white"})]),e("div",{class:"ml-3"},[e("h5",{class:"mb-1 font-semibold text-amber-900"},"重要提醒"),e("p",{class:"text-sm text-amber-800"}," 这是您唯一能看到所有 API Key 的机会。关闭此窗口后,系统将不再显示完整的 API Key。请立即下载并妥善保存。 ")])])],-1)),e("div",yl,[e("div",fl,[e("div",bl,[e("div",null,[s[3]||(s[3]=e("p",{class:"text-xs font-medium text-blue-600"},"创建数量",-1)),e("p",vl,c(w.apiKeys.length),1)]),s[4]||(s[4]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-lg bg-blue-500 bg-opacity-20"},[e("i",{class:"fas fa-key text-blue-600"})],-1))])]),e("div",kl,[e("div",wl,[e("div",null,[s[5]||(s[5]=e("p",{class:"text-xs font-medium text-green-600"},"基础名称",-1)),e("p",hl,c(K.value),1)]),s[6]||(s[6]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-lg bg-green-500 bg-opacity-20"},[e("i",{class:"fas fa-tag text-green-600"})],-1))])]),e("div",Al,[e("div",$l,[e("div",null,[s[7]||(s[7]=e("p",{class:"text-xs font-medium text-purple-600"},"权限范围",-1)),e("p",Cl,c(R()),1)]),s[8]||(s[8]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-lg bg-purple-500 bg-opacity-20"},[e("i",{class:"fas fa-shield-alt text-purple-600"})],-1))])]),e("div",Il,[e("div",Kl,[e("div",null,[s[9]||(s[9]=e("p",{class:"text-xs font-medium text-orange-600"},"过期时间",-1)),e("p",Ll,c(O()),1)]),s[10]||(s[10]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-lg bg-orange-500 bg-opacity-20"},[e("i",{class:"fas fa-clock text-orange-600"})],-1))])])]),e("div",Dl,[e("div",_l,[s[12]||(s[12]=e("label",{class:"text-sm font-semibold text-gray-700"},"API Keys 预览",-1)),e("div",Sl,[e("button",{class:"flex items-center gap-1 text-xs text-blue-600 hover:text-blue-800",type:"button",onClick:P},[e("i",{class:G(["fas",z.value?"fa-eye-slash":"fa-eye"])},null,2),I(" "+c(z.value?"隐藏":"显示")+"预览 ",1)]),s[11]||(s[11]=e("span",{class:"text-xs text-gray-500"},"(最多显示前10个)",-1))])]),z.value?(l(),n("div",Tl,[e("pre",Ml,c(Y()),1)])):$("",!0)]),e("div",{class:"flex gap-3"},[e("button",{class:"btn btn-primary flex flex-1 items-center justify-center gap-2 px-6 py-3 font-semibold",onClick:H},s[13]||(s[13]=[e("i",{class:"fas fa-download"},null,-1),I(" 下载所有 API Keys ",-1)])),e("button",{class:"rounded-xl border border-gray-300 bg-gray-200 px-6 py-3 font-semibold text-gray-800 transition-colors hover:bg-gray-300",onClick:h}," 我已保存 ")]),s[15]||(s[15]=e("div",{class:"mt-4 rounded-lg border border-blue-200 bg-blue-50 p-3"},[e("p",{class:"flex items-start text-xs text-blue-700"},[e("i",{class:"fas fa-info-circle mr-2 mt-0.5 flex-shrink-0"}),e("span",null," 下载的文件格式为文本文件(.txt),每行包含一个 API Key。 请将文件保存在安全的位置,避免泄露。 ")])],-1))])])]))}},Rl=Ce(Pl,[["__scopeId","data-v-b0b904b9"]]),Ul={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},Vl={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6 md:p-8"},Ol={class:"mb-4 flex items-center justify-between sm:mb-6"},El={class:"flex items-center gap-2 sm:gap-3"},jl={class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"},Gl={class:"rounded-lg bg-blue-50 p-4 dark:bg-blue-900/20"},ql={class:"flex items-start gap-3"},zl={class:"mt-1 text-sm text-blue-700 dark:text-blue-400"},Fl={class:"space-y-4"},Bl={class:"flex flex-wrap gap-4"},Wl={class:"flex cursor-pointer items-center"},Hl={class:"flex cursor-pointer items-center"},Nl={class:"flex cursor-pointer items-center"},Yl={class:"flex cursor-pointer items-center"},Ql={key:0,class:"space-y-3"},Jl={key:0},Xl={class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"},Zl={class:"flex flex-wrap gap-2"},ei=["onClick"],ti={key:1},si={class:"flex flex-wrap gap-2"},ai=["onClick"],ri={class:"flex gap-2"},oi=["onKeypress"],li={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},ii={class:"space-y-2"},ni={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},di={class:"mb-3 flex items-center gap-4"},ui={class:"flex gap-4"},ci={class:"flex cursor-pointer items-center"},gi={class:"flex cursor-pointer items-center"},pi={class:"flex cursor-pointer items-center"},mi={class:"flex flex-wrap gap-4"},xi={class:"flex cursor-pointer items-center"},yi={class:"flex cursor-pointer items-center"},fi={class:"flex cursor-pointer items-center"},bi={class:"flex cursor-pointer items-center"},vi={class:"flex cursor-pointer items-center"},ki={class:"flex cursor-pointer items-center"},wi={class:"mb-3 flex items-center justify-between"},hi=["disabled"],Ai={class:"grid grid-cols-1 gap-3"},$i=["disabled"],Ci={key:0,label:"账号分组"},Ii=["value"],Ki={key:1,label:"专属账号"},Li=["value"],Di=["disabled"],_i={key:0,label:"账号分组"},Si=["value"],Ti={key:1,label:"专属账号"},Mi=["value"],Pi=["disabled"],Ri={key:0,label:"账号分组"},Ui=["value"],Vi={key:1,label:"专属账号"},Oi=["value"],Ei=["disabled"],ji={key:0,label:"专属账号"},Gi=["value"],qi=["disabled"],zi={key:0,label:"账号分组"},Fi=["value"],Bi={key:1,label:"专属账号"},Wi=["value"],Hi={class:"flex gap-3 pt-4"},Ni=["disabled"],Yi={key:0,class:"loading-spinner mr-2"},Qi={key:1,class:"fas fa-save mr-2"},Ji={__name:"BatchEditApiKeyModal",props:{selectedKeys:{type:Array,required:!0},accounts:{type:Object,default:()=>({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]})}},emits:["close","success"],setup(w,{emit:F}){const p=w,V=F,z=kt(),K=T(!1),R=T(!1),O=T({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),P=T(""),Y=T([]),H=T("none"),h=j(()=>p.selectedKeys.length),C=j(()=>Y.value.filter(y=>!u.tags.includes(y))),u=Be({rateLimitCost:"",rateLimitWindow:"",rateLimitRequests:"",concurrencyLimit:"",dailyCostLimit:"",totalCostLimit:"",weeklyOpusCostLimit:"",permissions:"",claudeAccountId:"",geminiAccountId:"",openaiAccountId:"",bedrockAccountId:"",droidAccountId:"",tags:[],isActive:null}),s=()=>{if(P.value&&P.value.trim()){const y=P.value.trim();u.tags.includes(y)||u.tags.push(y),P.value=""}},J=y=>{u.tags.includes(y)||u.tags.push(y)},M=y=>{u.tags.splice(y,1)},N=async()=>{var y,d;R.value=!0;try{const[x,re,ce,W,ge,b,o]=await Promise.all([q.get("/admin/claude-accounts"),q.get("/admin/claude-console-accounts"),q.get("/admin/gemini-accounts"),q.get("/admin/openai-accounts"),q.get("/admin/bedrock-accounts"),q.get("/admin/droid-accounts"),q.get("/admin/account-groups")]),g=[];if(x.success&&((y=x.data)==null||y.forEach(k=>{g.push({...k,platform:"claude-oauth",isDedicated:k.accountType==="dedicated"})})),re.success&&((d=re.data)==null||d.forEach(k=>{g.push({...k,platform:"claude-console",isDedicated:k.accountType==="dedicated"})})),O.value.claude=g,ce.success&&(O.value.gemini=(ce.data||[]).map(k=>({...k,isDedicated:k.accountType==="dedicated"}))),W.success&&(O.value.openai=(W.data||[]).map(k=>({...k,isDedicated:k.accountType==="dedicated"}))),ge.success&&(O.value.bedrock=(ge.data||[]).map(k=>({...k,isDedicated:k.accountType==="dedicated"}))),b.success&&(O.value.droid=(b.data||[]).map(k=>({...k,platform:"droid",isDedicated:k.accountType==="dedicated"}))),o.success){const k=o.data||[];O.value.claudeGroups=k.filter(Z=>Z.platform==="claude"),O.value.geminiGroups=k.filter(Z=>Z.platform==="gemini"),O.value.openaiGroups=k.filter(Z=>Z.platform==="openai"),O.value.droidGroups=k.filter(Z=>Z.platform==="droid")}E("账号列表已刷新","success")}catch{E("刷新账号列表失败","error")}finally{R.value=!1}},L=async()=>{K.value=!0;try{const y={};u.rateLimitCost!==""&&u.rateLimitCost!==null&&(y.rateLimitCost=parseFloat(u.rateLimitCost)),u.rateLimitWindow!==""&&u.rateLimitWindow!==null&&(y.rateLimitWindow=parseInt(u.rateLimitWindow)),u.rateLimitRequests!==""&&u.rateLimitRequests!==null&&(y.rateLimitRequests=parseInt(u.rateLimitRequests)),u.concurrencyLimit!==""&&u.concurrencyLimit!==null&&(y.concurrencyLimit=parseInt(u.concurrencyLimit)),u.dailyCostLimit!==""&&u.dailyCostLimit!==null&&(y.dailyCostLimit=parseFloat(u.dailyCostLimit)),u.totalCostLimit!==""&&u.totalCostLimit!==null&&(y.totalCostLimit=parseFloat(u.totalCostLimit)),u.weeklyOpusCostLimit!==""&&u.weeklyOpusCostLimit!==null&&(y.weeklyOpusCostLimit=parseFloat(u.weeklyOpusCostLimit)),u.permissions!==""&&(y.permissions=u.permissions),u.claudeAccountId!==""&&(u.claudeAccountId==="SHARED_POOL"?(y.claudeAccountId=null,y.claudeConsoleAccountId=null):u.claudeAccountId.startsWith("console:")?(y.claudeConsoleAccountId=u.claudeAccountId.substring(8),y.claudeAccountId=null):(u.claudeAccountId.startsWith("group:"),y.claudeAccountId=u.claudeAccountId,y.claudeConsoleAccountId=null)),u.geminiAccountId!==""&&(u.geminiAccountId==="SHARED_POOL"?y.geminiAccountId=null:y.geminiAccountId=u.geminiAccountId),u.openaiAccountId!==""&&(u.openaiAccountId==="SHARED_POOL"?y.openaiAccountId=null:y.openaiAccountId=u.openaiAccountId),u.bedrockAccountId!==""&&(u.bedrockAccountId==="SHARED_POOL"?y.bedrockAccountId=null:y.bedrockAccountId=u.bedrockAccountId),u.droidAccountId!==""&&(u.droidAccountId==="SHARED_POOL"?y.droidAccountId=null:y.droidAccountId=u.droidAccountId),u.isActive!==null&&(y.isActive=u.isActive),H.value!=="none"&&(y.tags=u.tags,y.tagOperation=H.value);const d=await q.put("/admin/api-keys/batch",{keyIds:p.selectedKeys,updates:y});if(d.success){const{successCount:x,failedCount:re,errors:ce}=d.data;if(x>0){if(E(`成功批量编辑 ${x} 个 API Keys`,"success"),re>0){const W=ce.map(ge=>`${ge.keyId}: ${ge.error}`).join(`
|
||
`);E(`${re} 个编辑失败:
|
||
${W}`,"warning")}}else E("所有 API Keys 编辑失败","error");V("success"),V("close")}else E(d.message||"批量编辑失败","error")}catch(y){E("批量编辑失败","error"),console.error("批量编辑 API Keys 失败:",y)}finally{K.value=!1}};return Je(async()=>{Y.value=await z.fetchTags(),p.accounts&&(O.value={claude:p.accounts.claude||[],gemini:p.accounts.gemini||[],openai:p.accounts.openai||[],bedrock:p.accounts.bedrock||[],droid:p.accounts.droid||[],claudeGroups:p.accounts.claudeGroups||[],geminiGroups:p.accounts.geminiGroups||[],openaiGroups:p.accounts.openaiGroups||[],droidGroups:p.accounts.droidGroups||[]})}),(y,d)=>(l(),pe(Se,{to:"body"},[e("div",Ul,[e("div",Vl,[e("div",Ol,[e("div",El,[d[28]||(d[28]=e("div",{class:"flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-blue-600 sm:h-10 sm:w-10 sm:rounded-xl"},[e("i",{class:"fas fa-edit text-sm text-white sm:text-base"})],-1)),e("h3",jl," 批量编辑 API Keys ("+c(h.value)+" 个) ",1)]),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600 dark:hover:text-gray-300",onClick:d[0]||(d[0]=x=>y.$emit("close"))},d[29]||(d[29]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),e("form",{class:"modal-scroll-content custom-scrollbar flex-1 space-y-4 sm:space-y-6",onSubmit:ve(L,["prevent"])},[e("div",Gl,[e("div",ql,[d[31]||(d[31]=e("i",{class:"fas fa-info-circle mt-1 text-blue-500"},null,-1)),e("div",null,[d[30]||(d[30]=e("p",{class:"text-sm font-medium text-blue-800 dark:text-blue-300"},"批量编辑说明",-1)),e("p",zl," 以下设置将应用到所选的 "+c(h.value)+" 个 API Key。只有填写或修改的字段才会被更新,空白字段将保持原值不变。 ",1)])])]),e("div",null,[d[41]||(d[41]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-3 sm:text-sm"}," 标签 (批量操作) ",-1)),e("div",Fl,[e("div",Bl,[e("label",Wl,[_(e("input",{"onUpdate:modelValue":d[1]||(d[1]=x=>H.value=x),class:"mr-2",type:"radio",value:"replace"},null,512),[[ie,H.value]]),d[32]||(d[32]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"替换标签",-1))]),e("label",Hl,[_(e("input",{"onUpdate:modelValue":d[2]||(d[2]=x=>H.value=x),class:"mr-2",type:"radio",value:"add"},null,512),[[ie,H.value]]),d[33]||(d[33]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"添加标签",-1))]),e("label",Nl,[_(e("input",{"onUpdate:modelValue":d[3]||(d[3]=x=>H.value=x),class:"mr-2",type:"radio",value:"remove"},null,512),[[ie,H.value]]),d[34]||(d[34]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"移除标签",-1))]),e("label",Yl,[_(e("input",{"onUpdate:modelValue":d[4]||(d[4]=x=>H.value=x),class:"mr-2",type:"radio",value:"none"},null,512),[[ie,H.value]]),d[35]||(d[35]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"不修改标签",-1))])]),H.value!=="none"?(l(),n("div",Ql,[u.tags.length>0?(l(),n("div",Jl,[e("div",Xl,c(H.value==="replace"?"新标签列表:":H.value==="add"?"要添加的标签:":"要移除的标签:"),1),e("div",Zl,[(l(!0),n(Q,null,se(u.tags,(x,re)=>(l(),n("span",{key:"selected-"+re,class:"inline-flex items-center gap-1 rounded-full bg-blue-100 px-3 py-1 text-sm text-blue-800 dark:bg-blue-900/30 dark:text-blue-300"},[I(c(x)+" ",1),e("button",{class:"ml-1 hover:text-blue-900",type:"button",onClick:ce=>M(re)},d[36]||(d[36]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,ei)]))),128))])])):$("",!0),C.value.length>0?(l(),n("div",ti,[d[38]||(d[38]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",si,[(l(!0),n(Q,null,se(C.value,x=>(l(),n("button",{key:"available-"+x,class:"inline-flex items-center gap-1 rounded-full bg-gray-100 px-3 py-1 text-sm text-gray-700 transition-colors hover:bg-blue-100 hover:text-blue-700 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-blue-900/30 dark:hover:text-blue-300",type:"button",onClick:re=>J(x)},[d[37]||(d[37]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),I(" "+c(x),1)],8,ai))),128))])])):$("",!0),e("div",null,[d[40]||(d[40]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",ri,[_(e("input",{"onUpdate:modelValue":d[5]||(d[5]=x=>P.value=x),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",placeholder:"输入新标签名称",type:"text",onKeypress:Qe(ve(s,["prevent"]),["enter"])},null,40,oi),[[ae,P.value]]),e("button",{class:"rounded-lg bg-green-500 px-4 py-2 text-white transition-colors hover:bg-green-600 dark:bg-green-600 dark:hover:bg-green-700",type:"button",onClick:s},d[39]||(d[39]=[e("i",{class:"fas fa-plus"},null,-1)]))])])])):$("",!0)])]),e("div",li,[d[45]||(d[45]=e("div",{class:"mb-2 flex items-center gap-2"},[e("div",{class:"flex h-6 w-6 flex-shrink-0 items-center justify-center rounded bg-blue-500"},[e("i",{class:"fas fa-tachometer-alt text-xs text-white"})]),e("h4",{class:"text-sm font-semibold text-gray-800 dark:text-gray-200"},"速率限制设置")],-1)),e("div",ii,[e("div",ni,[e("div",null,[d[42]||(d[42]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"}," 时间窗口 (分钟) ",-1)),_(e("input",{"onUpdate:modelValue":d[6]||(d[6]=x=>u.rateLimitWindow=x),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"1",placeholder:"不修改",type:"number"},null,512),[[ae,u.rateLimitWindow]])]),e("div",null,[d[43]||(d[43]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"请求次数限制",-1)),_(e("input",{"onUpdate:modelValue":d[7]||(d[7]=x=>u.rateLimitRequests=x),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"1",placeholder:"不修改",type:"number"},null,512),[[ae,u.rateLimitRequests]])]),e("div",null,[d[44]||(d[44]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),_(e("input",{"onUpdate:modelValue":d[8]||(d[8]=x=>u.rateLimitCost=x),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"0",placeholder:"不修改",step:"0.01",type:"number"},null,512),[[ae,u.rateLimitCost]])])])])]),e("div",null,[d[46]||(d[46]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," 每日费用限制 (美元) ",-1)),_(e("input",{"onUpdate:modelValue":d[9]||(d[9]=x=>u.dailyCostLimit=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"0",placeholder:"不修改 (0 表示无限制)",step:"0.01",type:"number"},null,512),[[ae,u.dailyCostLimit]])]),e("div",null,[d[47]||(d[47]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," 总费用限制 (美元) ",-1)),_(e("input",{"onUpdate:modelValue":d[10]||(d[10]=x=>u.totalCostLimit=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"0",placeholder:"不修改 (0 表示无限制)",step:"0.01",type:"number"},null,512),[[ae,u.totalCostLimit]])]),e("div",null,[d[48]||(d[48]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," Opus 模型周费用限制 (美元) ",-1)),_(e("input",{"onUpdate:modelValue":d[11]||(d[11]=x=>u.weeklyOpusCostLimit=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"0",placeholder:"不修改 (0 表示无限制)",step:"0.01",type:"number"},null,512),[[ae,u.weeklyOpusCostLimit]]),d[49]||(d[49]=e("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户 ",-1))]),e("div",null,[d[50]||(d[50]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制",-1)),_(e("input",{"onUpdate:modelValue":d[12]||(d[12]=x=>u.concurrencyLimit=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"0",placeholder:"不修改 (0 表示无限制)",type:"number"},null,512),[[ae,u.concurrencyLimit]])]),e("div",null,[e("div",di,[d[54]||(d[54]=e("label",{class:"text-sm font-semibold text-gray-700 dark:text-gray-300"},"激活状态",-1)),e("div",ui,[e("label",ci,[_(e("input",{"onUpdate:modelValue":d[13]||(d[13]=x=>u.isActive=x),class:"mr-2",type:"radio",value:!0},null,512),[[ie,u.isActive]]),d[51]||(d[51]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"激活",-1))]),e("label",gi,[_(e("input",{"onUpdate:modelValue":d[14]||(d[14]=x=>u.isActive=x),class:"mr-2",type:"radio",value:!1},null,512),[[ie,u.isActive]]),d[52]||(d[52]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"禁用",-1))]),e("label",pi,[_(e("input",{"onUpdate:modelValue":d[15]||(d[15]=x=>u.isActive=x),class:"mr-2",type:"radio",value:null},null,512),[[ie,u.isActive]]),d[53]||(d[53]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"不修改",-1))])])])]),e("div",null,[d[61]||(d[61]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",mi,[e("label",xi,[_(e("input",{"onUpdate:modelValue":d[16]||(d[16]=x=>u.permissions=x),class:"mr-2",type:"radio",value:""},null,512),[[ie,u.permissions]]),d[55]||(d[55]=e("span",{class:"text-sm text-gray-700"},"不修改",-1))]),e("label",yi,[_(e("input",{"onUpdate:modelValue":d[17]||(d[17]=x=>u.permissions=x),class:"mr-2",type:"radio",value:"all"},null,512),[[ie,u.permissions]]),d[56]||(d[56]=e("span",{class:"text-sm text-gray-700"},"全部服务",-1))]),e("label",fi,[_(e("input",{"onUpdate:modelValue":d[18]||(d[18]=x=>u.permissions=x),class:"mr-2",type:"radio",value:"claude"},null,512),[[ie,u.permissions]]),d[57]||(d[57]=e("span",{class:"text-sm text-gray-700"},"仅 Claude",-1))]),e("label",bi,[_(e("input",{"onUpdate:modelValue":d[19]||(d[19]=x=>u.permissions=x),class:"mr-2",type:"radio",value:"gemini"},null,512),[[ie,u.permissions]]),d[58]||(d[58]=e("span",{class:"text-sm text-gray-700"},"仅 Gemini",-1))]),e("label",vi,[_(e("input",{"onUpdate:modelValue":d[20]||(d[20]=x=>u.permissions=x),class:"mr-2",type:"radio",value:"openai"},null,512),[[ie,u.permissions]]),d[59]||(d[59]=e("span",{class:"text-sm text-gray-700"},"仅 OpenAI",-1))]),e("label",ki,[_(e("input",{"onUpdate:modelValue":d[21]||(d[21]=x=>u.permissions=x),class:"mr-2",type:"radio",value:"droid"},null,512),[[ie,u.permissions]]),d[60]||(d[60]=e("span",{class:"text-sm text-gray-700"},"仅 Droid",-1))])])]),e("div",null,[e("div",wi,[d[62]||(d[62]=e("label",{class:"text-sm font-semibold text-gray-700 dark:text-gray-300"},"专属账号绑定",-1)),e("button",{class:"flex items-center gap-1 text-sm text-blue-600 transition-colors hover:text-blue-800 disabled:cursor-not-allowed disabled:opacity-50 dark:text-blue-400 dark:hover:text-blue-300",disabled:R.value,title:"刷新账号列表",type:"button",onClick:N},[e("i",{class:G(["fas",R.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,c(R.value?"刷新中...":"刷新账号"),1)],8,hi)]),e("div",Ai,[e("div",null,[d[65]||(d[65]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),_(e("select",{"onUpdate:modelValue":d[22]||(d[22]=x=>u.claudeAccountId=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",disabled:u.permissions&&!["all","claude"].includes(u.permissions)},[d[63]||(d[63]=e("option",{value:""},"不修改",-1)),d[64]||(d[64]=e("option",{value:"SHARED_POOL"},"使用共享账号池",-1)),O.value.claudeGroups.length>0?(l(),n("optgroup",Ci,[(l(!0),n(Q,null,se(O.value.claudeGroups,x=>(l(),n("option",{key:x.id,value:`group:${x.id}`}," 分组 - "+c(x.name),9,Ii))),128))])):$("",!0),O.value.claude.length>0?(l(),n("optgroup",Ki,[(l(!0),n(Q,null,se(O.value.claude,x=>(l(),n("option",{key:x.id,value:x.platform==="claude-console"?`console:${x.id}`:x.id},c(x.name)+" ("+c(x.platform==="claude-console"?"Console":"OAuth")+") ",9,Li))),128))])):$("",!0)],8,$i),[[Ie,u.claudeAccountId]])]),e("div",null,[d[68]||(d[68]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),_(e("select",{"onUpdate:modelValue":d[23]||(d[23]=x=>u.geminiAccountId=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",disabled:u.permissions&&!["all","gemini"].includes(u.permissions)},[d[66]||(d[66]=e("option",{value:""},"不修改",-1)),d[67]||(d[67]=e("option",{value:"SHARED_POOL"},"使用共享账号池",-1)),O.value.geminiGroups.length>0?(l(),n("optgroup",_i,[(l(!0),n(Q,null,se(O.value.geminiGroups,x=>(l(),n("option",{key:x.id,value:`group:${x.id}`}," 分组 - "+c(x.name),9,Si))),128))])):$("",!0),O.value.gemini.length>0?(l(),n("optgroup",Ti,[(l(!0),n(Q,null,se(O.value.gemini,x=>(l(),n("option",{key:x.id,value:x.id},c(x.name),9,Mi))),128))])):$("",!0)],8,Di),[[Ie,u.geminiAccountId]])]),e("div",null,[d[71]||(d[71]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),_(e("select",{"onUpdate:modelValue":d[24]||(d[24]=x=>u.openaiAccountId=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",disabled:u.permissions&&!["all","openai"].includes(u.permissions)},[d[69]||(d[69]=e("option",{value:""},"不修改",-1)),d[70]||(d[70]=e("option",{value:"SHARED_POOL"},"使用共享账号池",-1)),O.value.openaiGroups.length>0?(l(),n("optgroup",Ri,[(l(!0),n(Q,null,se(O.value.openaiGroups,x=>(l(),n("option",{key:x.id,value:`group:${x.id}`}," 分组 - "+c(x.name),9,Ui))),128))])):$("",!0),O.value.openai.length>0?(l(),n("optgroup",Vi,[(l(!0),n(Q,null,se(O.value.openai,x=>(l(),n("option",{key:x.id,value:x.id},c(x.name),9,Oi))),128))])):$("",!0)],8,Pi),[[Ie,u.openaiAccountId]])]),e("div",null,[d[74]||(d[74]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),_(e("select",{"onUpdate:modelValue":d[25]||(d[25]=x=>u.bedrockAccountId=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",disabled:u.permissions&&!["all","openai"].includes(u.permissions)},[d[72]||(d[72]=e("option",{value:""},"不修改",-1)),d[73]||(d[73]=e("option",{value:"SHARED_POOL"},"使用共享账号池",-1)),O.value.bedrock.length>0?(l(),n("optgroup",ji,[(l(!0),n(Q,null,se(O.value.bedrock,x=>(l(),n("option",{key:x.id,value:x.id},c(x.name),9,Gi))),128))])):$("",!0)],8,Ei),[[Ie,u.bedrockAccountId]])]),e("div",null,[d[77]||(d[77]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),_(e("select",{"onUpdate:modelValue":d[26]||(d[26]=x=>u.droidAccountId=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",disabled:u.permissions&&!["all","droid"].includes(u.permissions)},[d[75]||(d[75]=e("option",{value:""},"不修改",-1)),d[76]||(d[76]=e("option",{value:"SHARED_POOL"},"使用共享账号池",-1)),O.value.droidGroups.length>0?(l(),n("optgroup",zi,[(l(!0),n(Q,null,se(O.value.droidGroups,x=>(l(),n("option",{key:x.id,value:`group:${x.id}`}," 分组 - "+c(x.name),9,Fi))),128))])):$("",!0),O.value.droid.length>0?(l(),n("optgroup",Bi,[(l(!0),n(Q,null,se(O.value.droid,x=>(l(),n("option",{key:x.id,value:x.id},c(x.name),9,Wi))),128))])):$("",!0)],8,qi),[[Ie,u.droidAccountId]])])])]),e("div",Hi,[e("button",{class:"flex-1 rounded-xl bg-gray-100 px-6 py-3 font-semibold text-gray-700 transition-colors hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:d[27]||(d[27]=x=>y.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:K.value,type:"submit"},[K.value?(l(),n("div",Yi)):(l(),n("i",Qi)),I(" "+c(K.value?"保存中...":"批量保存"),1)],8,Ni)])],32)])])]))}},Xi=Ce(Ji,[["__scopeId","data-v-1534b0b7"]]),Zi={key:0,class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},en={class:"modal-content relative mx-auto w-full max-w-lg p-8"},tn={class:"mb-6 flex items-center justify-between"},sn={class:"flex items-center gap-3"},an={class:"text-sm text-gray-600 dark:text-gray-400"},rn={class:"space-y-6"},on={class:"rounded-lg border border-gray-200 bg-gradient-to-r from-gray-50 to-gray-100 p-4 dark:border-gray-600 dark:from-gray-700 dark:to-gray-800"},ln={class:"flex items-center justify-between"},nn={class:"text-sm font-semibold text-gray-800 dark:text-gray-200"},dn={class:"ml-2 text-xs font-normal text-gray-600"},un={class:"flex h-12 w-12 items-center justify-center rounded-lg bg-white shadow-sm dark:bg-gray-700"},cn={key:0,class:"mb-4"},gn={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},pn={class:"mb-3 grid grid-cols-3 gap-2"},mn=["onClick"],xn={key:1,class:"animate-fadeIn"},yn=["min"],fn={key:2,class:"rounded-lg border border-blue-200 bg-gradient-to-r from-blue-50 to-indigo-50 p-4 dark:border-blue-700 dark:from-blue-900/20 dark:to-indigo-900/20"},bn={class:"flex items-center justify-between"},vn={class:"text-sm font-semibold text-blue-900 dark:text-blue-200"},kn={class:"flex gap-3 pt-2"},wn=["disabled"],hn={key:0,class:"loading-spinner mr-2"},An={key:1,class:"fas fa-save mr-2"},$n={__name:"ExpiryEditModal",props:{show:{type:Boolean,required:!0},apiKey:{type:Object,required:!0}},emits:["close","save"],setup(w,{expose:F,emit:p}){const V=w,z=p,K=T(!1),R=Be({expireDuration:"",customExpireDate:"",expiresAt:null}),O=[{value:"",label:"永不过期"},{value:"1d",label:"1 天"},{value:"7d",label:"7 天"},{value:"30d",label:"30 天"},{value:"90d",label:"90 天"},{value:"180d",label:"180 天"},{value:"365d",label:"1 年"},{value:"730d",label:"2 年"}],P=j(()=>{const L=new Date;return L.setMinutes(L.getMinutes()+1),L.toISOString().slice(0,16)});De(()=>V.show,L=>{L&&Y()}),De(()=>{var L;return(L=V.apiKey)==null?void 0:L.id},L=>{L&&V.show&&Y()});const Y=()=>{K.value=!1,V.apiKey.expiresAt?(R.expireDuration="custom",R.customExpireDate=new Date(V.apiKey.expiresAt).toISOString().slice(0,16),R.expiresAt=V.apiKey.expiresAt):(R.expireDuration="",R.customExpireDate="",R.expiresAt=null)},H=L=>{if(R.expireDuration=L,!L){R.expiresAt=null;return}if(L==="custom")return;const y=new Date,d=L.match(/(\d+)([dhmy])/);if(d){const[,x,re]=d,ce=parseInt(x);switch(re){case"d":y.setDate(y.getDate()+ce);break;case"h":y.setHours(y.getHours()+ce);break;case"m":y.setMonth(y.getMonth()+ce);break;case"y":y.setFullYear(y.getFullYear()+ce);break}R.expiresAt=y.toISOString()}},h=()=>{R.customExpireDate&&(R.expiresAt=new Date(R.customExpireDate).toISOString())},C=L=>L?new Date(L).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",u=L=>L?new Date(L)<new Date:!1,s=L=>{if(!L)return null;const y=new Date,x=new Date(L)-y,re=Math.ceil(x/(1e3*60*60*24));return x<0?{text:"已过期",class:"text-red-600"}:re<=7?{text:`${re} 天后过期`,class:"text-orange-600"}:re<=30?{text:`${re} 天后过期`,class:"text-yellow-600"}:{text:`${Math.ceil(re/30)} 个月后过期`,class:"text-green-600"}},J=()=>{K.value=!0,z("save",{keyId:V.apiKey.id,expiresAt:R.expiresAt})},M=async()=>{let L=!0;window.showConfirm?L=await window.showConfirm("激活 API Key",`确定要立即激活此 API Key 吗?激活后将在 ${V.apiKey.activationDays||(V.apiKey.activationUnit==="hours"?24:30)} ${V.apiKey.activationUnit==="hours"?"小时":"天"}后自动过期。`,"确定激活","取消"):L=confirm(`确定要立即激活此 API Key 吗?激活后将在 ${V.apiKey.activationDays||(V.apiKey.activationUnit==="hours"?24:30)} ${V.apiKey.activationUnit==="hours"?"小时":"天"}后自动过期。`),L&&(K.value=!0,z("save",{keyId:V.apiKey.id,activateNow:!0}))};return F({resetSaving:()=>{K.value=!1}}),(L,y)=>(l(),pe(Se,{to:"body"},[w.show?(l(),n("div",Zi,[e("div",{class:"fixed inset-0 bg-gray-900 bg-opacity-50 backdrop-blur-sm",onClick:y[0]||(y[0]=d=>L.$emit("close"))}),e("div",en,[e("div",tn,[e("div",sn,[y[6]||(y[6]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-amber-500 to-orange-600"},[e("i",{class:"fas fa-clock text-white"})],-1)),e("div",null,[y[5]||(y[5]=e("h3",{class:"text-xl font-bold text-gray-900 dark:text-gray-100"},"修改过期时间",-1)),e("p",an,' 为 "'+c(w.apiKey.name||"API Key")+'" 设置新的过期时间 ',1)])]),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300",onClick:y[1]||(y[1]=d=>L.$emit("close"))},y[7]||(y[7]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",rn,[e("div",on,[e("div",ln,[e("div",null,[y[12]||(y[12]=e("p",{class:"mb-1 text-xs font-medium text-gray-600 dark:text-gray-400"},"当前状态",-1)),e("p",nn,[w.apiKey.expirationMode==="activation"&&!w.apiKey.isActivated?(l(),n(Q,{key:0},[y[8]||(y[8]=e("i",{class:"fas fa-pause-circle mr-1 text-blue-500"},null,-1)),y[9]||(y[9]=I(" 未激活 ",-1)),e("span",dn," (激活后 "+c(w.apiKey.activationDays||(w.apiKey.activationUnit==="hours"?24:30))+" "+c(w.apiKey.activationUnit==="hours"?"小时":"天")+"过期) ",1)],64)):w.apiKey.expiresAt?(l(),n(Q,{key:1},[I(c(C(w.apiKey.expiresAt))+" ",1),s(w.apiKey.expiresAt)?(l(),n("span",{key:0,class:G(["ml-2 text-xs font-normal",s(w.apiKey.expiresAt).class])}," ("+c(s(w.apiKey.expiresAt).text)+") ",3)):$("",!0)],64)):(l(),n(Q,{key:2},[y[10]||(y[10]=e("i",{class:"fas fa-infinity mr-1 text-gray-500"},null,-1)),y[11]||(y[11]=I(" 永不过期 ",-1))],64))])]),e("div",un,[e("i",{class:G(["fas fa-hourglass-half text-lg",w.apiKey.expiresAt&&u(w.apiKey.expiresAt)?"text-red-500":"text-gray-400"])},null,2)])])]),w.apiKey.expirationMode==="activation"&&!w.apiKey.isActivated?(l(),n("div",cn,[e("button",{class:"w-full rounded-lg bg-gradient-to-r from-blue-500 to-blue-600 px-4 py-3 font-semibold text-white transition-all hover:from-blue-600 hover:to-blue-700 hover:shadow-lg",onClick:M},[y[13]||(y[13]=e("i",{class:"fas fa-rocket mr-2"},null,-1)),I(" 立即激活 (激活后 "+c(w.apiKey.activationDays||(w.apiKey.activationUnit==="hours"?24:30))+" "+c(w.apiKey.activationUnit==="hours"?"小时":"天")+"过期) ",1)]),e("p",gn,[y[14]||(y[14]=e("i",{class:"fas fa-info-circle mr-1"},null,-1)),I(" 点击立即激活此 API Key,激活后将在 "+c(w.apiKey.activationDays||(w.apiKey.activationUnit==="hours"?24:30))+" "+c(w.apiKey.activationUnit==="hours"?"小时":"天")+"后过期 ",1)])])):$("",!0),e("div",null,[y[16]||(y[16]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"选择新的期限",-1)),e("div",pn,[(l(),n(Q,null,se(O,d=>e("button",{key:d.value,class:G(["rounded-lg px-3 py-2 text-sm font-medium transition-all",R.expireDuration===d.value?"bg-blue-500 text-white shadow-md":"bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600"]),onClick:x=>H(d.value)},c(d.label),11,mn)),64)),e("button",{class:G(["rounded-lg px-3 py-2 text-sm font-medium transition-all",R.expireDuration==="custom"?"bg-blue-500 text-white shadow-md":"bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600"]),onClick:y[2]||(y[2]=d=>H("custom"))},y[15]||(y[15]=[e("i",{class:"fas fa-calendar-alt mr-1"},null,-1),I(" 自定义 ",-1)]),2)])]),R.expireDuration==="custom"?(l(),n("div",xn,[y[17]||(y[17]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"选择日期和时间",-1)),_(e("input",{"onUpdate:modelValue":y[3]||(y[3]=d=>R.customExpireDate=d),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",min:P.value,type:"datetime-local",onChange:h},null,40,yn),[[ae,R.customExpireDate]]),y[18]||(y[18]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 选择一个未来的日期和时间作为过期时间 ",-1))])):$("",!0),R.expiresAt!==w.apiKey.expiresAt?(l(),n("div",fn,[e("div",bn,[e("div",null,[y[21]||(y[21]=e("p",{class:"mb-1 text-xs font-medium text-blue-700 dark:text-blue-400"},[e("i",{class:"fas fa-arrow-right mr-1"}),I(" 新的过期时间 ")],-1)),e("p",vn,[R.expiresAt?(l(),n(Q,{key:0},[I(c(C(R.expiresAt))+" ",1),s(R.expiresAt)?(l(),n("span",{key:0,class:G(["ml-2 text-xs font-normal",s(R.expiresAt).class])}," ("+c(s(R.expiresAt).text)+") ",3)):$("",!0)],64)):(l(),n(Q,{key:1},[y[19]||(y[19]=e("i",{class:"fas fa-infinity mr-1"},null,-1)),y[20]||(y[20]=I(" 永不过期 ",-1))],64))])]),y[22]||(y[22]=e("div",{class:"flex h-12 w-12 items-center justify-center rounded-lg bg-white shadow-sm dark:bg-gray-700"},[e("i",{class:"fas fa-check text-lg text-green-500"})],-1))])])):$("",!0),e("div",kn,[e("button",{class:"flex-1 rounded-lg bg-gray-100 px-4 py-2.5 font-semibold text-gray-700 transition-colors hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",onClick:y[4]||(y[4]=d=>L.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-4 py-2.5 font-semibold",disabled:K.value||R.expiresAt===w.apiKey.expiresAt,onClick:J},[K.value?(l(),n("div",hn)):(l(),n("i",An)),I(" "+c(K.value?"保存中...":"保存更改"),1)],8,wn)])])])])):$("",!0)]))}},Cn=Ce($n,[["__scopeId","data-v-fb30c1d3"]]),In={class:"w-full"},Kn={key:0,class:"flex items-center justify-center rounded-lg px-3 py-2 text-xs"},Ln={key:1,class:"space-y-1.5"},Dn={class:"flex items-center justify-between text-[11px] font-medium"},_n={class:"text-gray-700 dark:text-gray-200"},Sn={class:"relative h-1.5 overflow-hidden rounded-full bg-gray-200/85 dark:bg-gray-700/70"},Tn={class:"relative z-10 flex h-full items-center justify-between px-3"},Mn={class:"flex items-center gap-1.5"},Pn={class:"flex items-center gap-1.5"},Rn={key:0,class:"pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-700 group-hover:opacity-30",style:{background:"linear-gradient(105deg, transparent 35%, rgba(255,255,255,0.55) 48%, transparent 63%)",animation:"shine 2.8s infinite"}},Un={__name:"LimitProgressBar",props:{type:{type:String,required:!0,validator:w=>["daily","opus","window","total"].includes(w)},variant:{type:String,default:"full",validator:w=>["full","compact"].includes(w)},label:{type:String,required:!0},current:{type:Number,default:0},limit:{type:Number,required:!0},showShine:{type:Boolean,default:!1}},setup(w){const F=w,p=j(()=>F.variant==="compact"),V=j(()=>{if(!F.limit||F.limit<=0)return 0;const C=F.current/F.limit*100;return Math.min(C,100)}),z=j(()=>{switch(F.type){case"daily":return"border-emerald-200/80 bg-white/80 shadow-[0_10px_24px_rgba(16,185,129,0.18)] group-hover:shadow-[0_14px_30px_rgba(16,185,129,0.22)] dark:border-emerald-500/40 dark:bg-emerald-950/40 dark:shadow-[0_12px_28px_rgba(0,0,0,0.45)]";case"opus":return"border-violet-200/80 bg-white/80 shadow-[0_10px_24px_rgba(139,92,246,0.18)] group-hover:shadow-[0_14px_30px_rgba(139,92,246,0.22)] dark:border-violet-500/40 dark:bg-violet-950/40 dark:shadow-[0_12px_28px_rgba(0,0,0,0.45)]";case"window":return"border-sky-200/80 bg-white/80 shadow-[0_10px_24px_rgba(56,189,248,0.18)] group-hover:shadow-[0_14px_30px_rgba(56,189,248,0.22)] dark:border-sky-500/40 dark:bg-sky-950/40 dark:shadow-[0_12px_28px_rgba(0,0,0,0.45)]";case"total":return"border-blue-200/80 bg-white/80 shadow-[0_10px_24px_rgba(59,130,246,0.18)] group-hover:shadow-[0_14px_30px_rgba(59,130,246,0.22)] dark:border-blue-500/40 dark:bg-blue-950/40 dark:shadow-[0_12px_28px_rgba(0,0,0,0.45)]";default:return"border-gray-200/80 bg-white/80 shadow-[0_10px_24px_rgba(148,163,184,0.18)] group-hover:shadow-[0_14px_30px_rgba(148,163,184,0.22)] dark:border-gray-600/50 dark:bg-gray-900/50 dark:shadow-[0_12px_28px_rgba(0,0,0,0.45)]"}}),K=j(()=>{switch(F.type){case"daily":return"bg-gradient-to-r from-emerald-50 via-green-50 to-emerald-100 dark:from-emerald-900/40 dark:via-emerald-900/20 dark:to-emerald-800/30";case"opus":return"bg-gradient-to-r from-violet-50 via-violet-100 to-fuchsia-100 dark:from-violet-900/40 dark:via-violet-900/20 dark:to-fuchsia-900/30";case"window":return"bg-gradient-to-r from-sky-50 via-sky-100 to-cyan-100 dark:from-sky-900/40 dark:via-sky-900/20 dark:to-cyan-900/30";case"total":return"bg-gradient-to-r from-blue-50 via-blue-100 to-sky-100 dark:from-blue-900/40 dark:via-blue-900/20 dark:to-sky-900/30";default:return"bg-gradient-to-r from-gray-100 via-gray-50 to-gray-200 dark:from-gray-900/30 dark:via-gray-900/10 dark:to-gray-800/30"}}),R=j(()=>{const C=V.value;return F.type==="daily"?C>=90?"bg-gradient-to-r from-rose-500 via-red-500 to-rose-600 dark:from-rose-500 dark:via-red-500 dark:to-rose-600":C>=70?"bg-gradient-to-r from-amber-400 via-orange-400 to-amber-500 dark:from-amber-400 dark:via-orange-400 dark:to-amber-500":"bg-gradient-to-r from-emerald-400 via-emerald-500 to-teal-500 dark:from-emerald-400 dark:via-emerald-500 dark:to-teal-500":F.type==="opus"?C>=90?"bg-gradient-to-r from-rose-500 via-red-500 to-rose-600 dark:from-rose-500 dark:via-red-500 dark:to-rose-600":C>=70?"bg-gradient-to-r from-amber-400 via-orange-400 to-amber-500 dark:from-amber-400 dark:via-orange-400 dark:to-amber-500":"bg-gradient-to-r from-violet-400 via-purple-500 to-fuchsia-500 dark:from-violet-400 dark:via-purple-500 dark:to-fuchsia-500":F.type==="window"?C>=90?"bg-gradient-to-r from-rose-500 via-red-500 to-rose-600 dark:from-rose-500 dark:via-red-500 dark:to-rose-600":C>=70?"bg-gradient-to-r from-amber-400 via-orange-400 to-amber-500 dark:from-amber-400 dark:via-orange-400 dark:to-amber-500":"bg-gradient-to-r from-sky-400 via-cyan-400 to-blue-500 dark:from-sky-400 dark:via-cyan-400 dark:to-blue-500":F.type==="total"?C>=90?"bg-gradient-to-r from-rose-500 via-red-500 to-rose-600 dark:from-rose-500 dark:via-red-500 dark:to-rose-600":C>=70?"bg-gradient-to-r from-amber-400 via-orange-400 to-amber-500 dark:from-amber-400 dark:via-orange-400 dark:to-amber-500":"bg-gradient-to-r from-sky-500 via-blue-500 to-cyan-500 dark:from-sky-500 dark:via-blue-500 dark:to-cyan-500":"bg-gray-300 dark:bg-gray-400"}),O=j(()=>{const C=V.value;if(C>=95)return"bg-rose-500 dark:bg-rose-400";if(C>=80)return"bg-amber-400 dark:bg-amber-300";switch(F.type){case"daily":return"bg-emerald-500 dark:bg-emerald-400";case"opus":return"bg-violet-500 dark:bg-violet-400";case"window":return"bg-sky-500 dark:bg-sky-400";case"total":return"bg-blue-500 dark:bg-blue-400";default:return"bg-slate-400 dark:bg-slate-500"}}),P=j(()=>{const C=V.value;if(C>=95)return"text-rose-600 dark:text-rose-300";if(C>=80)return"text-amber-600 dark:text-amber-300";switch(F.type){case"daily":return"text-emerald-600 dark:text-emerald-300";case"opus":return"text-violet-600 dark:text-violet-300";case"window":return"text-sky-600 dark:text-sky-300";case"total":return"text-blue-600 dark:text-blue-300";default:return"text-gray-600 dark:text-gray-300"}}),Y=j(()=>{const C=V.value;let u="";if(C>=90)u="text-red-700 dark:text-red-400";else if(C>=70)u="text-orange-700 dark:text-orange-400";else switch(F.type){case"daily":u="text-green-700 dark:text-green-400";break;case"opus":u="text-purple-700 dark:text-purple-400";break;case"window":u="text-blue-700 dark:text-blue-400";break;default:u="text-gray-600 dark:text-gray-400"}let s="";switch(F.type){case"daily":s="fas fa-calendar-day";break;case"opus":s="fas fa-gem";break;case"window":s="fas fa-clock";break;case"total":s="fas fa-wallet";break;default:s="fas fa-infinity"}return`${s} ${u}`}),H=j(()=>{if(V.value>40)return"text-white drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)]";switch(F.type){case"daily":return"text-gray-900 dark:text-gray-100";case"opus":return"text-purple-900 dark:text-purple-100";case"window":return"text-blue-900 dark:text-blue-100";case"total":return"text-blue-900 dark:text-blue-100";default:return"text-gray-900 dark:text-gray-100"}}),h=j(()=>{const C=V.value;if(C>70)return"text-white drop-shadow-[0_2px_4px_rgba(0,0,0,0.9)]";if(C>=90)return"text-red-700 dark:text-red-300";if(C>=70)return"text-orange-700 dark:text-orange-300";switch(F.type){case"daily":return"text-green-800 dark:text-green-200";case"opus":return"text-purple-800 dark:text-purple-200";case"window":return"text-blue-800 dark:text-blue-200";case"total":return"text-blue-800 dark:text-blue-200";default:return"text-gray-900 dark:text-gray-100"}});return(C,u)=>(l(),n("div",In,[!w.limit||w.limit<=0?(l(),n("div",Kn,u[0]||(u[0]=[e("div",{class:"flex items-center gap-1.5 text-gray-600 dark:text-gray-300"},[e("i",{class:"fas fa-infinity text-sm text-gray-500 dark:text-gray-400"}),e("span",{class:"font-medium"},"无限制")],-1)]))):p.value?(l(),n("div",Ln,[e("div",Dn,[e("div",{class:G(["flex items-center gap-1.5",P.value])},[e("i",{class:G(["text-[11px]",Y.value])},null,2),e("span",null,c(w.label),1)],2),e("span",_n,"$"+c(w.current.toFixed(2))+" / $"+c(w.limit.toFixed(2)),1)]),e("div",Sn,[e("div",{class:G(["absolute inset-y-0 rounded-full transition-all duration-500 ease-out",O.value]),style:it({width:V.value+"%"})},null,6)])])):(l(),n("div",{key:2,class:G(["group relative h-9 w-full overflow-hidden rounded-xl border transition-all duration-300 ease-out",z.value])},[e("div",{class:G(["absolute inset-0",K.value])},null,2),e("div",{class:G(["absolute inset-0 h-full transition-all duration-500 ease-out",R.value]),style:it({width:V.value+"%"})},null,6),u[1]||(u[1]=e("div",{class:"pointer-events-none absolute inset-0 rounded-xl border border-white/50 opacity-40 mix-blend-overlay dark:border-white/10"},null,-1)),e("div",Tn,[e("div",Mn,[e("i",{class:G(["text-xs",Y.value])},null,2),e("span",{class:G(["text-xs font-semibold",H.value])},c(w.label),3)]),e("div",Pn,[e("span",{class:G(["text-xs font-bold tabular-nums",h.value])}," $"+c(w.current.toFixed(2))+" / $"+c(w.limit.toFixed(2)),3)])]),w.showShine&&V.value>0?(l(),n("div",Rn)):$("",!0)],2))]))}},_e=Ce(Un,[["__scopeId","data-v-8a01dc56"]]),Vn={key:0,class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},On={class:"modal-content relative mx-auto flex max-h-[90vh] w-[95%] max-w-5xl flex-col p-4 sm:w-full sm:p-6 md:p-8"},En={class:"mb-4 flex items-center justify-between sm:mb-6"},jn={class:"flex items-center gap-2 sm:gap-3"},Gn={class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"},qn={class:"modal-scroll-content custom-scrollbar flex-1 overflow-y-auto"},zn={class:"mb-6 grid grid-cols-1 gap-4 md:grid-cols-2"},Fn={class:"rounded-lg border border-blue-200 bg-gradient-to-br from-blue-50 to-blue-100 p-4 dark:border-blue-700 dark:from-blue-900/20 dark:to-blue-800/20"},Bn={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},Wn={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},Hn={class:"rounded-lg border border-green-200 bg-gradient-to-br from-green-50 to-green-100 p-4 dark:border-green-700 dark:from-green-900/20 dark:to-green-800/20"},Nn={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},Yn={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},Qn={class:"rounded-lg border border-yellow-200 bg-gradient-to-br from-yellow-50 to-yellow-100 p-4 dark:border-yellow-700 dark:from-yellow-900/20 dark:to-yellow-800/20"},Jn={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},Xn={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},Zn={class:"rounded-lg border border-purple-200 bg-gradient-to-br from-purple-50 to-purple-100 p-4 dark:border-purple-700 dark:from-purple-900/20 dark:to-purple-800/20"},ed={class:"space-y-1 text-sm"},td={class:"flex justify-between"},sd={class:"font-semibold text-gray-900 dark:text-gray-100"},ad={class:"flex justify-between"},rd={class:"font-semibold text-gray-900 dark:text-gray-100"},od={class:"mb-6"},ld={class:"space-y-3 rounded-lg bg-gray-50 p-4 dark:bg-gray-700/50"},id={class:"flex items-center justify-between"},nd={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},dd={class:"flex items-center justify-between"},ud={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},cd={key:0,class:"flex items-center justify-between"},gd={class:"text-sm font-semibold text-purple-600"},pd={key:1,class:"flex items-center justify-between"},md={class:"text-sm font-semibold text-purple-600"},xd={key:0,class:"mb-6"},yd={class:"space-y-3 rounded-lg bg-gray-50 p-4 dark:bg-gray-700/50"},fd={key:0,class:"space-y-1.5"},bd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},vd={key:1,class:"space-y-1.5"},kd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},wd={key:2,class:"space-y-1.5"},hd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},Ad={key:3,class:"flex items-center justify-between rounded-lg border border-purple-200/70 bg-white/60 px-3 py-2 text-sm shadow-sm dark:border-purple-500/40 dark:bg-purple-950/20"},$d={class:"font-semibold text-purple-600 dark:text-purple-300"},Cd={key:4,class:"space-y-2"},Id={__name:"UsageDetailModal",props:{show:{type:Boolean,required:!0},apiKey:{type:Object,required:!0}},emits:["close"],setup(w,{emit:F}){const p=w,V=F,z=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.total)==null?void 0:o.requests)||0}),K=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.daily)==null?void 0:o.requests)||0}),R=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.total)==null?void 0:o.tokens)||0}),O=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.daily)==null?void 0:o.tokens)||0}),P=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.total)==null?void 0:o.cost)||0}),Y=j(()=>p.apiKey.dailyCost||0),H=j(()=>p.apiKey.totalCostLimit||0),h=j(()=>p.apiKey.weeklyOpusCost||0),C=j(()=>p.apiKey.weeklyOpusCostLimit||0),u=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.total)==null?void 0:o.inputTokens)||0}),s=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.total)==null?void 0:o.outputTokens)||0}),J=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.total)==null?void 0:o.cacheCreateTokens)||0}),M=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.total)==null?void 0:o.cacheReadTokens)||0}),N=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.averages)==null?void 0:o.rpm)||0}),L=j(()=>{var b,o;return((o=(b=p.apiKey.usage)==null?void 0:b.averages)==null?void 0:o.tpm)||0}),y=j(()=>p.apiKey.dailyCostLimit>0||p.apiKey.totalCostLimit>0||p.apiKey.concurrencyLimit>0||p.apiKey.weeklyOpusCostLimit>0||p.apiKey.rateLimitWindow>0||p.apiKey.tokenLimit>0),d=j(()=>!p.apiKey.dailyCostLimit||p.apiKey.dailyCostLimit===0?0:Y.value/p.apiKey.dailyCostLimit*100),x=j(()=>!H.value||H.value===0?0:P.value/H.value*100),re=j(()=>!C.value||C.value===0?0:h.value/C.value*100),ce=b=>!b&&b!==0?"0":b.toLocaleString("zh-CN"),W=b=>b>=1e6?(b/1e6).toFixed(1)+"M":b>=1e3?(b/1e3).toFixed(1)+"K":b.toString(),ge=()=>{V("close")};return(b,o)=>(l(),pe(Se,{to:"body"},[w.show?(l(),n("div",Vn,[e("div",{class:"fixed inset-0 bg-gray-900 bg-opacity-50 backdrop-blur-sm",onClick:ge}),e("div",On,[e("div",En,[e("div",jn,[o[0]||(o[0]=e("div",{class:"flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-blue-600 sm:h-10 sm:w-10 sm:rounded-xl"},[e("i",{class:"fas fa-chart-line text-sm text-white sm:text-base"})],-1)),e("h3",Gn," 使用统计详情 - "+c(w.apiKey.name),1)]),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600",onClick:ge},o[1]||(o[1]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),e("div",qn,[e("div",zn,[e("div",Fn,[o[2]||(o[2]=e("div",{class:"mb-3 flex items-center justify-between"},[e("span",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},"总请求数"),e("i",{class:"fas fa-paper-plane text-blue-500"})],-1)),e("div",Bn,c(ce(z.value)),1),e("div",Wn," 今日: "+c(ce(K.value))+" 次 ",1)]),e("div",Hn,[o[3]||(o[3]=e("div",{class:"mb-3 flex items-center justify-between"},[e("span",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},"总Token数"),e("i",{class:"fas fa-coins text-green-500"})],-1)),e("div",Nn,c(W(R.value)),1),e("div",Yn," 今日: "+c(W(O.value)),1)]),e("div",Qn,[o[4]||(o[4]=e("div",{class:"mb-3 flex items-center justify-between"},[e("span",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},"总费用"),e("i",{class:"fas fa-dollar-sign text-yellow-600"})],-1)),e("div",Jn," $"+c(P.value.toFixed(4)),1),e("div",Xn," 今日: $"+c(Y.value.toFixed(4)),1)]),e("div",Zn,[o[7]||(o[7]=e("div",{class:"mb-3 flex items-center justify-between"},[e("span",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},"平均速率"),e("i",{class:"fas fa-tachometer-alt text-purple-500"})],-1)),e("div",ed,[e("div",td,[o[5]||(o[5]=e("span",{class:"text-gray-600 dark:text-gray-400"},"RPM:",-1)),e("span",sd,c(N.value),1)]),e("div",ad,[o[6]||(o[6]=e("span",{class:"text-gray-600 dark:text-gray-400"},"TPM:",-1)),e("span",rd,c(L.value),1)])])])]),e("div",od,[o[12]||(o[12]=e("h4",{class:"mb-3 flex items-center text-sm font-semibold text-gray-700 dark:text-gray-300"},[e("i",{class:"fas fa-chart-pie mr-2 text-indigo-500"}),I(" Token 使用分布 ")],-1)),e("div",ld,[e("div",id,[o[8]||(o[8]=e("div",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-down mr-2 text-green-500"}),e("span",{class:"text-sm text-gray-600 dark:text-gray-400"},"输入 Token")],-1)),e("span",nd,c(W(u.value)),1)]),e("div",dd,[o[9]||(o[9]=e("div",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-up mr-2 text-blue-500"}),e("span",{class:"text-sm text-gray-600 dark:text-gray-400"},"输出 Token")],-1)),e("span",ud,c(W(s.value)),1)]),J.value>0?(l(),n("div",cd,[o[10]||(o[10]=e("div",{class:"flex items-center"},[e("i",{class:"fas fa-save mr-2 text-purple-500"}),e("span",{class:"text-sm text-gray-600 dark:text-gray-400"},"缓存创建 Token")],-1)),e("span",gd,c(W(J.value)),1)])):$("",!0),M.value>0?(l(),n("div",pd,[o[11]||(o[11]=e("div",{class:"flex items-center"},[e("i",{class:"fas fa-download mr-2 text-purple-500"}),e("span",{class:"text-sm text-gray-600 dark:text-gray-400"},"缓存读取 Token")],-1)),e("span",md,c(W(M.value)),1)])):$("",!0)])]),y.value?(l(),n("div",xd,[o[15]||(o[15]=e("h4",{class:"mb-3 flex items-center text-sm font-semibold text-gray-700 dark:text-gray-300"},[e("i",{class:"fas fa-shield-alt mr-2 text-red-500"}),I(" 限制设置 ")],-1)),e("div",yd,[w.apiKey.dailyCostLimit>0?(l(),n("div",fd,[ue(_e,{current:Y.value,label:"每日费用限制",limit:w.apiKey.dailyCostLimit,"show-shine":!0,type:"daily"},null,8,["current","limit"]),e("div",bd," 已使用 "+c(Math.min(d.value,100).toFixed(1))+"% ",1)])):$("",!0),w.apiKey.weeklyOpusCostLimit>0?(l(),n("div",vd,[ue(_e,{current:h.value,label:"Opus 周费用限制",limit:w.apiKey.weeklyOpusCostLimit,"show-shine":!0,type:"opus"},null,8,["current","limit"]),e("div",kd," 已使用 "+c(Math.min(re.value,100).toFixed(1))+"% ",1)])):$("",!0),w.apiKey.totalCostLimit>0?(l(),n("div",wd,[ue(_e,{current:P.value,label:"总费用限制",limit:w.apiKey.totalCostLimit,"show-shine":!0,type:"total"},null,8,["current","limit"]),e("div",hd," 已使用 "+c(Math.min(x.value,100).toFixed(1))+"% ",1)])):$("",!0),w.apiKey.concurrencyLimit>0?(l(),n("div",Ad,[o[13]||(o[13]=e("span",{class:"text-gray-600 dark:text-gray-300"},"并发限制",-1)),e("span",$d,c(w.apiKey.currentConcurrency||0)+" / "+c(w.apiKey.concurrencyLimit),1)])):$("",!0),w.apiKey.rateLimitWindow>0?(l(),n("div",Cd,[o[14]||(o[14]=e("h5",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},[e("i",{class:"fas fa-clock mr-1 text-blue-500"}),I(" 时间窗口限制 ")],-1)),ue(Ls,{"cost-limit":w.apiKey.rateLimitCost,"current-cost":w.apiKey.currentWindowCost,"current-requests":w.apiKey.currentWindowRequests,"current-tokens":w.apiKey.currentWindowTokens,label:"窗口状态","rate-limit-window":w.apiKey.rateLimitWindow,"request-limit":w.apiKey.rateLimitRequests,"show-progress":!0,"show-tooltip":!0,"token-limit":w.apiKey.tokenLimit,"window-end-time":w.apiKey.windowEndTime,"window-remaining-seconds":w.apiKey.windowRemainingSeconds,"window-start-time":w.apiKey.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"])])):$("",!0)])])):$("",!0)]),e("div",{class:"mt-4 flex justify-end gap-2 sm:mt-6 sm:gap-3"},[e("button",{class:"btn btn-secondary px-4 py-2 text-sm",type:"button",onClick:ge}," 关闭 ")])])])):$("",!0)]))}},Kd=Ce(Id,[["__scopeId","data-v-da99842f"]]),Ld={class:"tab-content"},Dd={class:"card p-4 sm:p-6"},_d={class:"mb-4 flex flex-col gap-4 sm:mb-6"},Sd={class:"border-b border-gray-200 dark:border-gray-700"},Td={"aria-label":"Tabs",class:"-mb-px flex space-x-8"},Md={key:0,class:"ml-2 rounded-full bg-gray-100 px-2.5 py-0.5 text-xs font-medium text-gray-900 dark:bg-gray-700 dark:text-gray-100"},Pd={key:0,class:"ml-2 rounded-full bg-gray-100 px-2.5 py-0.5 text-xs font-medium text-gray-900 dark:bg-gray-700 dark:text-gray-100"},Rd={key:0,class:"tab-panel"},Ud={class:"mb-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between"},Vd={class:"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:gap-3"},Od={class:"group relative min-w-[140px]"},Ed={key:0,class:"flex items-center"},jd={class:"group relative min-w-[140px]"},Gd={class:"relative"},qd={key:0,class:"absolute -right-2 -top-2 z-10 flex h-5 w-5 items-center justify-center rounded-full bg-purple-500 text-xs text-white shadow-sm"},zd={class:"flex min-w-[240px] flex-col gap-2 sm:flex-row sm:items-center"},Fd={class:"sm:w-44"},Bd={class:"group relative flex-1"},Wd={class:"relative flex items-center"},Hd=["placeholder"],Nd={class:"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:gap-3"},Yd=["disabled"],Qd={class:"relative"},Jd={class:"relative"},Xd={key:0,class:"py-12 text-center"},Zd={key:1,class:"py-12 text-center"},e0={key:2,class:"table-wrapper hidden md:block"},t0={class:"table-container"},s0={class:"w-full table-fixed"},a0={class:"sticky top-0 z-10 bg-gradient-to-b from-gray-50 to-gray-100/90 backdrop-blur-sm dark:from-gray-700 dark:to-gray-800/90"},r0={key:0,class:"w-[50px] px-3 py-4 text-left"},o0={class:"flex items-center"},l0=["indeterminate"],i0={key:1,class:"fas fa-sort ml-1 text-gray-400"},n0={key:1,class:"fas fa-sort ml-1 text-gray-400"},d0={key:1,class:"fas fa-sort ml-1 text-gray-400"},u0={key:1,class:"fas fa-sort ml-1 text-gray-400"},c0={key:1,class:"fas fa-sort ml-1 text-gray-400"},g0={key:1,class:"fas fa-sort ml-1 text-gray-400"},p0={key:1,class:"fas fa-sort ml-1 text-gray-400"},m0={key:1,class:"fas fa-sort ml-1 text-gray-400"},x0={key:0,class:"px-3 py-3"},y0={class:"flex items-center"},f0=["value"],b0={class:"px-3 py-3"},v0={class:"min-w-0"},k0=["title"],w0={key:0,class:"mt-1 text-xs text-red-600"},h0={class:"px-3 py-3"},A0={class:"space-y-1"},$0={key:0,class:"flex items-center gap-1 text-xs"},C0={class:"truncate text-gray-600 dark:text-gray-400"},I0={key:1,class:"flex items-center gap-1 text-xs"},K0={class:"truncate text-gray-600 dark:text-gray-400"},L0={key:2,class:"flex items-center gap-1 text-xs"},D0={class:"truncate text-gray-600 dark:text-gray-400"},_0={key:3,class:"flex items-center gap-1 text-xs"},S0={class:"truncate text-gray-600 dark:text-gray-400"},T0={key:4,class:"flex items-center gap-1 text-xs"},M0={class:"truncate text-gray-600 dark:text-gray-400"},P0={key:5,class:"text-xs text-gray-500 dark:text-gray-400"},R0={class:"px-3 py-3"},U0={class:"flex flex-wrap gap-1"},V0={key:0,class:"text-xs text-gray-400"},O0={class:"whitespace-nowrap px-3 py-3"},E0={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},j0={class:"font-semibold text-blue-600 dark:text-blue-400",style:{"font-size":"14px"}},G0={class:"px-2 py-2",style:{"font-size":"12px"}},q0={class:"flex flex-col gap-2"},z0={key:2,class:"space-y-1.5"},F0={class:"flex items-center justify-between text-[10px]"},B0={class:"flex items-center gap-1 text-sky-600 dark:text-sky-300"},W0={class:"font-medium"},H0={key:3,class:"flex items-center justify-center gap-1.5 py-2 text-gray-500 dark:text-gray-400"},N0={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Y0={class:"flex items-center justify-end gap-1"},Q0={class:"font-medium text-purple-600 dark:text-purple-400",style:{"font-size":"13px"}},J0={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},X0={class:"flex items-center justify-end gap-1"},Z0={class:"font-medium text-gray-900 dark:text-gray-100",style:{"font-size":"13px"}},eu={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},tu=["title"],su={key:1,class:"text-gray-400",style:{"font-size":"13px"}},au={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},ru={class:"whitespace-nowrap px-3 py-3 text-sm text-gray-700 dark:text-gray-300"},ou={class:"inline-flex items-center gap-1.5"},lu={key:0,class:"inline-flex items-center text-blue-600 dark:text-blue-400",style:{"font-size":"13px"}},iu={key:1},nu=["onClick"],du=["onClick"],uu=["onClick"],cu=["onClick"],gu={class:"operations-column operations-cell whitespace-nowrap px-3 py-3",style:{"font-size":"13px"}},pu={class:"flex gap-1"},mu=["onClick"],xu=["onClick"],yu=["onClick"],fu=["onClick"],bu=["title","onClick"],vu={class:"ml-1 hidden xl:inline"},ku=["onClick"],wu={key:0},hu={class:"bg-gray-50 px-3 py-3 dark:bg-gray-700",colspan:"13"},Au={key:0,class:"py-4 text-center"},$u={class:"space-y-4"},Cu={class:"mb-4 flex items-center justify-between"},Iu={class:"flex items-center gap-2"},Ku={key:0,class:"rounded-full bg-gray-100 px-2 py-1 text-xs text-gray-500 dark:bg-gray-700 dark:text-gray-400"},Lu={class:"flex items-center gap-1"},Du={class:"flex gap-1 rounded bg-gray-100 p-1 dark:bg-gray-700"},_u=["onClick"],Su={key:0,class:"py-8 text-center"},Tu={class:"mb-3 flex items-center justify-center gap-2"},Mu=["onClick"],Pu={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"},Ru={class:"mb-3 flex items-start justify-between"},Uu={class:"flex-1"},Vu={class:"mb-1 block text-sm font-semibold text-gray-800 dark:text-gray-200"},Ou={class:"rounded-full bg-blue-50 px-2 py-1 text-xs text-gray-500 dark:bg-blue-900/30 dark:text-gray-400"},Eu={class:"mb-3 space-y-2"},ju={class:"flex items-center justify-between text-sm"},Gu={class:"font-semibold text-gray-900 dark:text-gray-100"},qu={class:"flex items-center justify-between text-sm"},zu={class:"font-semibold text-green-600"},Fu={class:"mt-2 border-t border-gray-100 pt-2 dark:border-gray-600"},Bu={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},Wu={class:"font-medium"},Hu={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},Nu={class:"font-medium"},Yu={key:0,class:"flex items-center justify-between text-xs text-purple-600"},Qu={class:"font-medium"},Ju={key:1,class:"flex items-center justify-between text-xs text-purple-600"},Xu={class:"font-medium"},Zu={class:"mt-3 h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},ec={class:"mt-1 text-right"},tc={class:"text-xs font-medium text-indigo-600"},sc={key:2,class:"mt-4 rounded-lg border border-indigo-100 bg-gradient-to-r from-indigo-50 to-purple-50 p-3 dark:border-indigo-700 dark:from-indigo-900/20 dark:to-purple-900/20"},ac={class:"flex items-center justify-between text-sm"},rc={class:"flex gap-4 text-xs"},oc={class:"text-gray-600 dark:text-gray-400"},lc={class:"font-semibold text-gray-800 dark:text-gray-200"},ic={class:"text-gray-600 dark:text-gray-400"},nc={class:"font-semibold text-gray-800 dark:text-gray-200"},dc={key:3,class:"space-y-3 md:hidden"},uc={class:"mb-3 flex items-start justify-between"},cc={class:"flex items-center gap-3"},gc=["value"],pc={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},mc={class:"mt-0.5 text-xs text-gray-500 dark:text-gray-400"},xc={class:"mb-3 space-y-1.5"},yc={key:0,class:"flex flex-wrap items-center gap-1 text-xs"},fc={class:"text-gray-600 dark:text-gray-400"},bc={key:1,class:"flex flex-wrap items-center gap-1 text-xs"},vc={class:"text-gray-600 dark:text-gray-400"},kc={key:2,class:"flex flex-wrap items-center gap-1 text-xs"},wc={class:"text-gray-600 dark:text-gray-400"},hc={key:3,class:"flex flex-wrap items-center gap-1 text-xs"},Ac={class:"text-gray-600 dark:text-gray-400"},$c={key:4,class:"flex flex-wrap items-center gap-1 text-xs"},Cc={class:"text-gray-600 dark:text-gray-400"},Ic={key:5,class:"text-xs text-gray-500 dark:text-gray-400"},Kc={key:6,class:"text-xs text-red-600"},Lc={class:"mb-3 space-y-2"},Dc={class:"rounded-lg bg-gray-50 p-3 dark:bg-gray-700"},_c={class:"mb-2 flex items-center justify-between"},Sc={class:"text-xs text-gray-600 dark:text-gray-400"},Tc=["onClick"],Mc={class:"grid grid-cols-2 gap-3"},Pc={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},Rc={class:"text-sm font-semibold text-green-600"},Uc={class:"mt-2 flex items-center justify-between"},Vc={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},Oc={class:"space-y-2"},Ec={key:2,class:"space-y-2"},jc={class:"flex items-center justify-between text-xs"},Gc={class:"flex items-center gap-1.5 text-sky-600 dark:text-sky-300"},qc={class:"font-medium"},zc={key:3,class:"flex items-center justify-center gap-1.5 py-2 text-gray-500 dark:text-gray-400"},Fc={class:"mb-3 text-xs text-gray-500 dark:text-gray-400"},Bc={class:"mb-1 flex justify-between"},Wc={class:"flex items-center justify-between"},Hc={class:"flex items-center gap-1"},Nc=["onClick"],Yc={key:0,class:"mb-3 flex flex-wrap gap-1"},Qc={class:"mt-3 flex gap-2 border-t border-gray-100 pt-3 dark:border-gray-600"},Jc=["onClick"],Xc=["onClick"],Zc=["onClick"],eg=["onClick"],tg=["onClick"],sg={key:4,class:"mt-4 flex flex-col items-center justify-between gap-4 sm:mt-6 sm:flex-row"},ag={class:"flex w-full flex-col items-center gap-3 sm:w-auto sm:flex-row"},rg={class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},og={class:"flex items-center gap-2"},lg=["value"],ig={class:"flex items-center gap-2"},ng=["disabled"],dg={class:"flex items-center gap-1"},ug={key:1,class:"hidden px-2 text-gray-500 dark:text-gray-400 sm:inline"},cg=["onClick"],gg={key:2,class:"hidden px-2 text-gray-500 dark:text-gray-400 sm:inline"},pg=["disabled"],mg={key:1,class:"tab-panel"},xg={key:0,class:"py-12 text-center"},yg={key:1,class:"py-12 text-center"},fg={key:2},bg={class:"mb-4 flex justify-end"},vg={class:"table-wrapper"},kg={class:"table-container"},wg={class:"w-full table-fixed"},hg={class:"bg-gray-50/80 backdrop-blur-sm dark:bg-gray-700/80"},Ag={key:0,class:"w-[15%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"},$g={class:"divide-y divide-gray-200/50 dark:divide-gray-600/50"},Cg={class:"px-3 py-3"},Ig={class:"flex items-center"},Kg={class:"min-w-0"},Lg=["title"],Dg={class:"px-3 py-3"},_g={class:"space-y-1"},Sg={key:0,class:"flex items-center gap-1 text-xs"},Tg={key:1,class:"flex items-center gap-1 text-xs"},Mg={key:2,class:"flex items-center gap-1 text-xs"},Pg={key:3,class:"text-xs text-gray-500 dark:text-gray-400"},Rg={key:0,class:"px-3 py-3"},Ug={class:"text-xs"},Vg={key:0,class:"text-blue-600"},Og={key:1,class:"text-green-600"},Eg={key:2,class:"text-gray-500 dark:text-gray-400"},jg={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Gg={class:"px-3 py-3"},qg={class:"text-xs"},zg={key:0,class:"text-blue-600"},Fg={key:1,class:"text-green-600"},Bg={key:2,class:"text-gray-500 dark:text-gray-400"},Wg={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Hg={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Ng={class:"font-medium text-blue-600 dark:text-blue-400",style:{"font-size":"13px"}},Yg={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Qg={class:"font-medium text-purple-600 dark:text-purple-400",style:{"font-size":"13px"}},Jg={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Xg={class:"flex items-center justify-end gap-1"},Zg={class:"font-medium text-gray-900 dark:text-gray-100",style:{"font-size":"13px"}},ep={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},tp={key:0,style:{"font-size":"13px"}},sp={key:1,class:"text-gray-400",style:{"font-size":"13px"}},ap={class:"operations-column operations-cell px-3 py-3"},rp={class:"flex items-center gap-2"},op=["onClick"],lp=["onClick"],ip={__name:"ApiKeysView",setup(w){const F=vt(),p=Ks(),V=T([]),z=j(()=>{var a;return((a=p.oemSettings)==null?void 0:a.ldapEnabled)||!1}),K=T([]),R=T(!1),O=T(!1),P=T(!1),Y=T(!1),H=T("today"),h=Be({type:"preset",preset:"today",customStart:"",customEnd:"",customRange:null}),C=j(()=>P.value),u=()=>{P.value=!P.value,P.value||(K.value=[],R.value=!1,O.value=!1)},s=j(()=>[{value:"today",label:"今日",icon:"fa-calendar-day"},{value:"7days",label:"最近7天",icon:"fa-calendar-week"},{value:"30days",label:"最近30天",icon:"fa-calendar-alt"},{value:"all",label:"全部时间",icon:"fa-infinity"},{value:"custom",label:"自定义范围",icon:"fa-calendar-check"}]),J=T("active"),M=T([]),N=T(!1),L=T("periodCost"),y=T("desc"),d=T({}),x=T({}),re=T({}),ce=T([new Date(2e3,1,1,0,0,0),new Date(2e3,2,1,23,59,59)]),W=T({claude:[],gemini:[],openai:[],openaiResponses:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),ge=T(null),b=T(null),o=T(!1),g=T(null),k=T(""),Z=T([]),U=T(""),i=T("apiKey"),f=j(()=>[{value:"apiKey",label:"按Key名称",icon:"fa-key"},{value:"bindingAccount",label:"按所属账号",icon:"fa-id-badge"}]),ne=j(()=>{const a=[{value:"",label:"所有标签",icon:"fa-asterisk"}];return Z.value.forEach(t=>{a.push({value:t,label:t,icon:"fa-tag"})}),a}),me=j(()=>k.value?V.value.filter(a=>a.tags&&a.tags.includes(k.value)).length:0),te=T(1),X=T((()=>{const a=localStorage.getItem("apiKeysPageSize");if(a){const t=parseInt(a,10);if([10,20,50,100].includes(t))return t}return 10})()),xe=[10,20,50,100],Te=T(!1),Me=T(!1),Pe=T(!1),le=T(!1),$e=T(!1),Xe=T(!1),wt=T(null),ht=T(null),At=T(null),$t=T([]),Yt=a=>{const t=new Set,m=(...S)=>{S.forEach(B=>{if(typeof B!="string")return;const D=B.trim();D&&t.add(D)})},r=S=>typeof S!="string"?"":S.replace(/^⚠️\s*/,"").replace(/^🔒\s*/,"").trim(),v=(S,B)=>{const D=r(B);m(S,B,D),D&&m(`${S} ${D}`)};return(a.claudeAccountId||a.claudeConsoleAccountId)&&v("Claude",dt(a)),a.geminiAccountId&&v("Gemini",ut(a)),a.openaiAccountId&&v("OpenAI",ct(a)),a.bedrockAccountId&&v("Bedrock",gt(a)),a.droidAccountId&&v("Droid",pt(a)),!a.claudeAccountId&&!a.claudeConsoleAccountId&&!a.geminiAccountId&&!a.openaiAccountId&&!a.bedrockAccountId&&!a.droidAccountId&&m("共享池"),Array.from(t)},Ge=j(()=>{let a=V.value;if(k.value&&(a=V.value.filter(m=>m.tags&&m.tags.includes(k.value))),U.value){const m=U.value.toLowerCase().trim();a=a.filter(r=>{if(i.value==="bindingAccount"){const S=Yt(r);return S.length===0?!1:S.some(B=>B.toLowerCase().includes(m))}const v=r.name&&r.name.toLowerCase().includes(m);if(z.value){const S=r.ownerDisplayName&&r.ownerDisplayName.toLowerCase().includes(m);return v||S}return v})}return L.value?[...a].sort((m,r)=>{let v=m[L.value],S=r[L.value];return L.value==="status"?(v=m.isActive?1:0,S=r.isActive?1:0):L.value==="periodRequests"?(v=rt(m),S=rt(r)):L.value==="periodCost"?(v=mt(m),S=mt(r)):L.value==="periodTokens"?(v=ot(m),S=ot(r)):L.value==="dailyCost"?(v=m.dailyCost||0,S=r.dailyCost||0):L.value==="totalCost"?(v=m.totalCost||0,S=r.totalCost||0):(L.value==="createdAt"||L.value==="expiresAt"||L.value==="lastUsedAt")&&(v=v?new Date(v).getTime():0,S=S?new Date(S).getTime():0),v<S?y.value==="asc"?-1:1:v>S?y.value==="asc"?1:-1:0}):a}),Ee=j(()=>{const a=Ge.value.length;return Math.ceil(a/X.value)||0}),We=j(()=>{const a=[],t=te.value,m=Ee.value;if(m<=7)for(let r=1;r<=m;r++)a.push(r);else{let r=Math.max(1,t-2),v=Math.min(m,t+2);t<=3?v=5:t>=m-2&&(r=m-4);for(let S=r;S<=v;S++)a.push(S)}return a}),Ct=j(()=>{const a=We.value;return a.length===0?!1:a[0]>1}),It=j(()=>{const a=We.value;return a.length===0?!1:a[a.length-1]<Ee.value}),Qt=j(()=>{const a=We.value;return a.length===0?!1:Ct.value&&a[0]>2}),Jt=j(()=>{const a=We.value;return a.length===0?!1:It.value&&a[a.length-1]<Ee.value-1}),qe=j(()=>{const a=(te.value-1)*X.value,t=a+X.value;return Ge.value.slice(a,t)}),Ze=async()=>{var a,t;try{const[m,r,v,S,B,D,oe,ye]=await Promise.all([q.get("/admin/claude-accounts"),q.get("/admin/claude-console-accounts"),q.get("/admin/gemini-accounts"),q.get("/admin/openai-accounts"),q.get("/admin/openai-responses-accounts"),q.get("/admin/bedrock-accounts"),q.get("/admin/droid-accounts"),q.get("/admin/account-groups")]),A=[];if(m.success&&((a=m.data)==null||a.forEach(ee=>{A.push({...ee,platform:"claude-oauth",isDedicated:ee.accountType==="dedicated"})})),r.success&&((t=r.data)==null||t.forEach(ee=>{A.push({...ee,platform:"claude-console",isDedicated:ee.accountType==="dedicated"})})),W.value.claude=A,v.success&&(W.value.gemini=(v.data||[]).map(ee=>({...ee,isDedicated:ee.accountType==="dedicated"}))),S.success&&(W.value.openai=(S.data||[]).map(ee=>({...ee,isDedicated:ee.accountType==="dedicated"}))),B.success&&(W.value.openaiResponses=(B.data||[]).map(ee=>({...ee,isDedicated:ee.accountType==="dedicated"}))),D.success&&(W.value.bedrock=(D.data||[]).map(ee=>({...ee,isDedicated:ee.accountType==="dedicated"}))),oe.success&&(W.value.droid=(oe.data||[]).map(ee=>({...ee,platform:"droid",isDedicated:ee.accountType==="dedicated"}))),ye.success){const ee=ye.data||[];W.value.claudeGroups=ee.filter(de=>de.platform==="claude"),W.value.geminiGroups=ee.filter(de=>de.platform==="gemini"),W.value.openaiGroups=ee.filter(de=>de.platform==="openai"),W.value.droidGroups=ee.filter(de=>de.platform==="droid")}}catch{}},we=async()=>{Y.value=!0;try{let a={};h.type==="custom"&&h.customStart&&h.customEnd?(a.startDate=h.customStart,a.endDate=h.customEnd,a.timeRange="custom"):h.preset==="all"?a.timeRange="all":a.timeRange=h.preset;const t=new URLSearchParams(a).toString(),m=await q.get(`/admin/api-keys?${t}`);if(m.success){V.value=m.data||[];const r=new Set;V.value.forEach(v=>{v.tags&&Array.isArray(v.tags)&&v.tags.forEach(S=>r.add(S))}),Z.value=Array.from(r).sort()}}catch{E("加载 API Keys 失败","error")}finally{Y.value=!1}},et=async()=>{J.value="deleted",N.value=!0;try{const a=await q.get("/admin/api-keys/deleted");a.success&&(M.value=a.apiKeys||[])}catch{E("加载已删除的 API Keys 失败","error")}finally{N.value=!1}},Re=a=>{L.value===a?y.value=y.value==="asc"?"desc":"asc":(L.value=a,y.value="asc")},nt=a=>!a&&a!==0?"0":a.toLocaleString("zh-CN"),be=a=>!a&&a!==0?"0":a>=1e6?(a/1e6).toFixed(1)+"M":a>=1e3?(a/1e3).toFixed(1)+"K":a.toString(),He=a=>{if(!a)return"未知账户";if(a.startsWith("group:")){const D=a.substring(6),oe=W.value.claudeGroups.find(de=>de.id===D);if(oe)return`分组-${oe.name}`;const ye=W.value.geminiGroups.find(de=>de.id===D);if(ye)return`分组-${ye.name}`;const A=W.value.openaiGroups.find(de=>de.id===D);if(A)return`分组-${A.name}`;const ee=W.value.droidGroups.find(de=>de.id===D);return ee?`分组-${ee.name}`:`分组-${D.substring(0,8)}`}const t=W.value.claude.find(D=>D.id===a);if(t)return`${t.name}`;const m=W.value.gemini.find(D=>D.id===a);if(m)return`${m.name}`;if(a.startsWith("responses:")){const D=a.replace("responses:",""),oe=W.value.openaiResponses.find(ye=>ye.id===D);return oe?`${oe.name}`:`${D.substring(0,8)}`}const r=W.value.openai.find(D=>D.id===a);if(r)return`${r.name}`;const v=W.value.openaiResponses.find(D=>D.id===a);if(v)return`${v.name}`;const S=W.value.bedrock.find(D=>D.id===a);if(S)return`${S.name}`;const B=W.value.droid.find(D=>D.id===a);return B?`${B.name}`:`${a.substring(0,8)}`},dt=a=>{if(a.claudeAccountId){const t=He(a.claudeAccountId);if(a.claudeAccountId.startsWith("group:"))return t;const m=W.value.claude.find(r=>r.id===a.claudeAccountId);return m?m.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}if(a.claudeConsoleAccountId){const t=W.value.claude.find(m=>m.id===a.claudeConsoleAccountId&&m.platform==="claude-console");return t?`Console-${t.name}`:"⚠️ Console账户不存在"}return""},ut=a=>{if(a.geminiAccountId){const t=He(a.geminiAccountId);if(a.geminiAccountId.startsWith("group:"))return t;const m=W.value.gemini.find(r=>r.id===a.geminiAccountId);return m?m.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},ct=a=>{if(a.openaiAccountId){const t=He(a.openaiAccountId);if(a.openaiAccountId.startsWith("group:"))return t;let m=null;if(a.openaiAccountId.startsWith("responses:")){const r=a.openaiAccountId.replace("responses:","");m=W.value.openaiResponses.find(v=>v.id===r)}else m=W.value.openai.find(r=>r.id===a.openaiAccountId);return m?m.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},gt=a=>{if(a.bedrockAccountId){const t=He(a.bedrockAccountId);if(a.bedrockAccountId.startsWith("group:"))return t;const m=W.value.bedrock.find(r=>r.id===a.bedrockAccountId);return m?m.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},pt=a=>{if(a.droidAccountId){const t=He(a.droidAccountId);if(a.droidAccountId.startsWith("group:"))return t;const m=W.value.droid.find(r=>r.id===a.droidAccountId);return m?m.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},tt=a=>a?new Date(a)<new Date:!1,st=a=>!a||tt(a)?!1:(new Date(a)-new Date)/(1e3*60*60*24)<=7,Kt=a=>a?new Date(a).toLocaleDateString("zh-CN"):"",Xt=async a=>{d.value[a]?d.value[a]=!1:(d.value[a]=!0,re.value[a]||St(a),await at(a,!0))},at=async(a,t=!1)=>{if(!t&&x.value[a]&&x.value[a].length>0)return;const m=Ue(a);try{let r=`/admin/api-keys/${a}/model-stats`;const v=new URLSearchParams;if(m.customStart&&m.customEnd)v.append("startDate",m.customStart),v.append("endDate",m.customEnd),v.append("period","custom");else{const B=m.preset==="today"||m.preset==="7days"?"daily":"monthly";v.append("period",B)}r+="?"+v.toString();const S=await q.get(r);S.success&&(x.value[a]=S.data||[])}catch{E("加载模型统计失败","error"),x.value[a]=[]}},Lt=(a,t)=>{const m=t.reduce((r,v)=>r+(v.allTokens||0),0);return m===0?0:Math.round(a/m*100)},Zt=a=>a.formatted&&a.formatted.total?a.formatted.total:a.cost!==void 0?`$${a.cost.toFixed(6)}`:"$0.000000",rt=a=>{var t,m,r,v,S,B;if(h.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.requests!==void 0)return a.usage.custom.requests;if(a.usage.total&&a.usage.total.requests!==void 0)return a.usage.total.requests}return 0}else{if(h.preset==="today")return((m=(t=a.usage)==null?void 0:t.daily)==null?void 0:m.requests)||0;if(h.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].requests!==void 0?a.usage["7days"].requests:0;if(h.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].requests!==void 0)return a.usage["30days"].requests;if(a.usage.monthly&&a.usage.monthly.requests!==void 0)return a.usage.monthly.requests}return 0}else return h.preset==="all"?a.usage&&a.usage.all&&a.usage.all.requests!==void 0?a.usage.all.requests:((v=(r=a.usage)==null?void 0:r.total)==null?void 0:v.requests)||0:((B=(S=a.usage)==null?void 0:S.total)==null?void 0:B.requests)||0}},Dt=a=>{if(h.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.cost!==void 0)return a.usage.custom.cost;if(a.usage.total&&a.usage.total.cost!==void 0)return a.usage.total.cost}return 0}else{if(h.preset==="today")return a.dailyCost||0;if(h.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].cost!==void 0?a.usage["7days"].cost:a.weeklyCost||a.periodCost||0;if(h.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].cost!==void 0)return a.usage["30days"].cost;if(a.usage.monthly&&a.usage.monthly.cost!==void 0)return a.usage.monthly.cost;if(a.usage.total&&a.usage.total.cost!==void 0)return a.usage.total.cost}return a.monthlyCost||a.periodCost||0}else return h.preset==="all"?a.usage&&a.usage.all&&a.usage.all.cost!==void 0?a.usage.all.cost:a.totalCost||0:a.periodCost||a.totalCost||0}},ot=a=>{var t,m,r,v,S,B;if(h.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.tokens!==void 0)return a.usage.custom.tokens;if(a.usage.total&&a.usage.total.tokens!==void 0)return a.usage.total.tokens}return 0}else{if(h.preset==="today")return((m=(t=a.usage)==null?void 0:t.daily)==null?void 0:m.tokens)||0;if(h.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].tokens!==void 0?a.usage["7days"].tokens:0;if(h.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].tokens!==void 0)return a.usage["30days"].tokens;if(a.usage.monthly&&a.usage.monthly.tokens!==void 0)return a.usage.monthly.tokens;if(a.usage.total&&a.usage.total.tokens!==void 0)return a.usage.total.tokens}return 0}else return h.preset==="all"?a.usage&&a.usage.all&&a.usage.all.tokens!==void 0?a.usage.all.tokens:((v=(r=a.usage)==null?void 0:r.total)==null?void 0:v.tokens)||0:((B=(S=a.usage)==null?void 0:S.total)==null?void 0:B.tokens)||0}},es=a=>{var t,m,r,v,S,B;if(h.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.inputTokens!==void 0)return a.usage.custom.inputTokens;if(a.usage.total&&a.usage.total.inputTokens!==void 0)return a.usage.total.inputTokens}return 0}else{if(h.preset==="today")return((m=(t=a.usage)==null?void 0:t.daily)==null?void 0:m.inputTokens)||0;if(h.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].inputTokens!==void 0?a.usage["7days"].inputTokens:0;if(h.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].inputTokens!==void 0)return a.usage["30days"].inputTokens;if(a.usage.monthly&&a.usage.monthly.inputTokens!==void 0)return a.usage.monthly.inputTokens;if(a.usage.total&&a.usage.total.inputTokens!==void 0)return a.usage.total.inputTokens}return 0}else return h.preset==="all"?a.usage&&a.usage.all&&a.usage.all.inputTokens!==void 0?a.usage.all.inputTokens:((v=(r=a.usage)==null?void 0:r.total)==null?void 0:v.inputTokens)||0:((B=(S=a.usage)==null?void 0:S.total)==null?void 0:B.inputTokens)||0}},ts=a=>{var t,m,r,v,S,B;if(h.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.outputTokens!==void 0)return a.usage.custom.outputTokens;if(a.usage.total&&a.usage.total.outputTokens!==void 0)return a.usage.total.outputTokens}return 0}else{if(h.preset==="today")return((m=(t=a.usage)==null?void 0:t.daily)==null?void 0:m.outputTokens)||0;if(h.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].outputTokens!==void 0?a.usage["7days"].outputTokens:0;if(h.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].outputTokens!==void 0)return a.usage["30days"].outputTokens;if(a.usage.monthly&&a.usage.monthly.outputTokens!==void 0)return a.usage.monthly.outputTokens;if(a.usage.total&&a.usage.total.outputTokens!==void 0)return a.usage.total.outputTokens}return 0}else return h.preset==="all"?a.usage&&a.usage.all&&a.usage.all.outputTokens!==void 0?a.usage.all.outputTokens:((v=(r=a.usage)==null?void 0:r.total)==null?void 0:v.outputTokens)||0:((B=(S=a.usage)==null?void 0:S.total)==null?void 0:B.outputTokens)||0}},mt=a=>{if(!x.value[a.id])return Dt(a);const t=x.value[a.id]||[];let m=0;return t.forEach(r=>{if(r.cost!==void 0)m+=r.cost;else if(r.formatted&&r.formatted.total){const v=r.formatted.total.replace("$","").replace(",",""),S=parseFloat(v);isNaN(S)||(m+=S)}}),m},ss=a=>{_t(a)},_t=a=>{if(h.preset=a,a==="custom"){if(h.type="custom",!h.customRange){const t=new Date,m=new Date(t);m.setDate(t.getDate()-6);const r=v=>v.getFullYear()+"-"+String(v.getMonth()+1).padStart(2,"0")+"-"+String(v.getDate()).padStart(2,"0")+" 00:00:00";h.customRange=[r(m),r(t)],h.customStart=m.toISOString().split("T")[0],h.customEnd=t.toISOString().split("T")[0]}}else if(a==="all")h.type="preset",h.customStart=null,h.customEnd=null;else{h.type="preset";const t=new Date,m=new Date(t);a==="today"?m.setHours(0,0,0,0):a==="7days"?m.setDate(t.getDate()-6):a==="30days"&&m.setDate(t.getDate()-29),h.customStart=m.toISOString().split("T")[0],h.customEnd=t.toISOString().split("T")[0]}we()},as=a=>{a&&a.length===2?(h.type="custom",h.preset="custom",h.customRange=a,h.customStart=a[0].split(" ")[0],h.customEnd=a[1].split(" ")[0],we()):a===null&&_t("today")},St=a=>{const t=new Date;new Date(t).setHours(0,0,0,0),re.value[a]={type:"preset",preset:"today",customStart:t.toISOString().split("T")[0],customEnd:t.toISOString().split("T")[0],customRange:null,presetOptions:[{value:"today",label:"今日",days:1},{value:"7days",label:"7天",days:7},{value:"30days",label:"30天",days:30},{value:"custom",label:"自定义",days:-1}]}},Ue=a=>(re.value[a]||St(a),re.value[a]),Tt=(a,t)=>{const m=Ue(t);m.type="preset",m.preset=a;const r=m.presetOptions.find(v=>v.value===a);if(r)if(a==="custom"){if(m.type="custom",!m.customRange){const v=new Date,S=new Date(v);S.setDate(v.getDate()-6);const B=D=>D.getFullYear()+"-"+String(D.getMonth()+1).padStart(2,"0")+"-"+String(D.getDate()).padStart(2,"0")+" 00:00:00";m.customRange=[B(S),B(v)],m.customStart=S.toISOString().split("T")[0],m.customEnd=v.toISOString().split("T")[0]}}else{const v=new Date,S=new Date(v);S.setDate(v.getDate()-(r.days-1)),m.customStart=S.toISOString().split("T")[0],m.customEnd=v.toISOString().split("T")[0];const B=D=>D.getFullYear()+"-"+String(D.getMonth()+1).padStart(2,"0")+"-"+String(D.getDate()).padStart(2,"0")+" 00:00:00";m.customRange=[B(S),B(v)]}at(t,!0)},rs=(a,t)=>{const m=Ue(a);t&&t.length===2?(m.type="custom",m.preset="custom",m.customRange=t,m.customStart=t[0].split(" ")[0],m.customEnd=t[1].split(" ")[0],at(a,!0)):t===null&&Tt("7days",a)},Mt=a=>a>new Date,os=a=>{const t=Ue(a);t.type="preset",t.preset="today";const m=new Date;new Date(m).setHours(0,0,0,0),t.customStart=m.toISOString().split("T")[0],t.customEnd=m.toISOString().split("T")[0],t.customRange=null,at(a,!0),E("已重置筛选条件并刷新数据","info")},ls=async()=>{await Ze(),Te.value=!0},Pt=async a=>{await Ze(),wt.value=a,Me.value=!0},Rt=a=>{ht.value=a,Pe.value=!0},is=a=>{Te.value=!1,At.value=a,le.value=!0,we()},ns=a=>{Te.value=!1,$t.value=a,$e.value=!0,we()},ds=async()=>{if(K.value.length===0){E("请先选择要编辑的 API Keys","warning");return}await Ze(),Xe.value=!0},us=()=>{Xe.value=!1,K.value=[],he(),we()},cs=()=>{Me.value=!1,E("API Key 更新成功","success"),we()},gs=()=>{Pe.value=!1,E("API Key 续期成功","success"),we()},Ut=async a=>{let t=!0;if(a.isActive&&(window.showConfirm?t=await window.showConfirm("禁用 API Key",`确定要禁用 API Key "${a.name}" 吗?禁用后所有使用此 Key 的请求将返回 401 错误。`,"确定禁用","取消"):t=confirm(`确定要禁用 API Key "${a.name}" 吗?禁用后所有使用此 Key 的请求将返回 401 错误。`)),!!t)try{const m=await q.put(`/admin/api-keys/${a.id}`,{isActive:!a.isActive});if(m.success){E(`API Key 已${a.isActive?"禁用":"激活"}`,"success");const r=V.value.find(v=>v.id===a.id);r&&(r.isActive=!a.isActive)}else E(m.message||"操作失败","error")}catch{E("操作失败","error")}},Vt=async a=>{let t=!1;if(window.showConfirm?t=await window.showConfirm("删除 API Key","确定要删除这个 API Key 吗?此操作不可恢复。","确定删除","取消"):t=confirm("确定要删除这个 API Key 吗?此操作不可恢复。"),!!t)try{const m=await q.delete(`/admin/api-keys/${a}`);if(m.success){E("API Key 已删除","success");const r=K.value.indexOf(a);r>-1&&K.value.splice(r,1),he(),we()}else E(m.message||"删除失败","error")}catch{E("删除失败","error")}},ps=async a=>{var m,r;let t=!1;if(window.showConfirm?t=await window.showConfirm("恢复 API Key","确定要恢复这个 API Key 吗?恢复后可以重新使用。","确定恢复","取消"):t=confirm("确定要恢复这个 API Key 吗?恢复后可以重新使用。"),!!t)try{const v=await q.post(`/admin/api-keys/${a}/restore`);v.success?(E("API Key 已成功恢复","success"),await et(),await we()):E(v.error||"恢复失败","error")}catch(v){E(((r=(m=v.response)==null?void 0:m.data)==null?void 0:r.error)||"恢复失败","error")}},ms=async a=>{var m,r;let t=!1;if(window.showConfirm?t=await window.showConfirm("彻底删除 API Key","确定要彻底删除这个 API Key 吗?此操作不可恢复,所有相关数据将被永久删除。","确定彻底删除","取消"):t=confirm("确定要彻底删除这个 API Key 吗?此操作不可恢复,所有相关数据将被永久删除。"),!!t)try{const v=await q.delete(`/admin/api-keys/${a}/permanent`);v.success?(E("API Key 已彻底删除","success"),et()):E(v.error||"彻底删除失败","error")}catch(v){E(((r=(m=v.response)==null?void 0:m.data)==null?void 0:r.error)||"彻底删除失败","error")}},xs=async()=>{var m,r;const a=M.value.length;if(a===0){E("没有需要清空的 API Keys","info");return}let t=!1;if(window.showConfirm?t=await window.showConfirm("清空所有已删除的 API Keys",`确定要彻底删除全部 ${a} 个已删除的 API Keys 吗?此操作不可恢复,所有相关数据将被永久删除。`,"确定清空全部","取消"):t=confirm(`确定要彻底删除全部 ${a} 个已删除的 API Keys 吗?此操作不可恢复。`),!!t)try{const v=await q.delete("/admin/api-keys/deleted/clear-all");v.success?(E(v.message||"已清空所有已删除的 API Keys","success"),v.details&&v.details.failedCount>0&&E(`${v.details.failedCount} 个清空失败`,"warning"),et()):E(v.error||"清空失败","error")}catch(v){E(((r=(m=v.response)==null?void 0:m.data)==null?void 0:r.error)||"清空失败","error")}},ys=async()=>{const a=K.value.length;if(a===0){E("请先选择要删除的 API Keys","warning");return}let t=!1;const m=`确定要删除选中的 ${a} 个 API Key 吗?此操作不可恢复。`;if(window.showConfirm?t=await window.showConfirm("批量删除 API Keys",m,"确定删除","取消"):t=confirm(m),!t)return;const r=[...K.value];try{const v=await q.delete("/admin/api-keys/batch",{data:{keyIds:r}});if(v.success){const{successCount:S,failedCount:B,errors:D}=v.data;if(S>0){if(E(`成功删除 ${S} 个 API Keys`,"success"),B>0){const oe=D.map(ye=>`${ye.keyId}: ${ye.error}`).join(`
|
||
`);E(`${B} 个删除失败:
|
||
${oe}`,"warning")}}else E("所有 API Keys 删除失败","error");K.value=[],he(),we()}else E(v.message||"批量删除失败","error")}catch{E("批量删除失败","error")}},fs=()=>{if(R.value)qe.value.forEach(a=>{K.value.includes(a.id)||K.value.push(a.id)});else{const a=new Set(qe.value.map(t=>t.id));K.value=K.value.filter(t=>!a.has(t))}he()},he=()=>{const a=qe.value.length,t=qe.value.filter(m=>K.value.includes(m.id)).length;t===0?(R.value=!1,O.value=!1):t===a?(R.value=!0,O.value=!1):(R.value=!1,O.value=!0)},Ne=a=>{ge.value=a},Ot=()=>{ge.value=null},bs=async({keyId:a,expiresAt:t,activateNow:m})=>{try{const r=await q.patch(`/admin/api-keys/${a}/expiration`,{expiresAt:t||null,activateNow:m||!1});if(r.success){E(m?"API Key已激活":"过期时间已更新","success");const v=V.value.find(S=>S.id===a);v&&(m&&r.updates?(v.isActivated=!0,v.activatedAt=r.updates.activatedAt,v.expiresAt=r.updates.expiresAt):(v.expiresAt=t||null,t&&!v.isActivated&&(v.isActivated=!0))),Ot()}else E(r.message||"更新失败","error"),b.value&&b.value.resetSaving()}catch{E("更新失败","error"),b.value&&b.value.resetSaving()}},Ve=a=>a?new Date(a).toLocaleDateString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).replace(/\//g,"-"):"",Et=a=>{if(a==null)return"--:--";const t=Math.floor(a/3600),m=Math.floor(a%3600/60),r=a%60;return t>0?`${t}h${m}m`:m>0?`${m}m${r}s`:`${r}s`},xt=a=>{g.value=a,o.value=!0},yt=a=>{if(!a)return"从未使用";const t=new Date(a),r=new Date-t;return r<6e4?"刚刚":r<36e5?`${Math.floor(r/6e4)} 分钟前`:r<864e5?`${Math.floor(r/36e5)} 小时前`:r<6048e5?`${Math.floor(r/864e5)} 天前`:t.toLocaleDateString("zh-CN")},vs=()=>{U.value="",te.value=1},ks=()=>{try{const a=Ge.value.map(A=>{var jt,Gt,qt,zt,Ft,Bt,Wt,Ht;const ee=rt(A),de=mt(A),Ae=ot(A),lt=es(A),fe=ts(A),ws={ID:A.id||"",名称:A.name||"",描述:A.description||"",状态:A.isActive?"启用":"禁用",API密钥:A.apiKey||"",过期模式:A.expirationMode==="activation"?"首次使用后激活":A.expirationMode==="fixed"?"固定时间":"无",激活期限:A.activationDays||"",激活单位:A.activationUnit==="hours"?"小时":A.activationUnit==="days"?"天":"",已激活:A.isActivated?"是":"否",激活时间:A.activatedAt?Ve(A.activatedAt):"",过期时间:A.expiresAt?Ve(A.expiresAt):"",服务权限:A.permissions==="all"?"全部服务":A.permissions==="claude"?"仅Claude":A.permissions==="gemini"?"仅Gemini":A.permissions==="openai"?"仅OpenAI":A.permissions==="droid"?"仅Droid":A.permissions||"",令牌限制:A.tokenLimit==="0"||A.tokenLimit===0?"无限制":A.tokenLimit||"",并发限制:A.concurrencyLimit==="0"||A.concurrencyLimit===0?"无限制":A.concurrencyLimit||"","速率窗口(分钟)":A.rateLimitWindow==="0"||A.rateLimitWindow===0?"无限制":A.rateLimitWindow||"",速率请求限制:A.rateLimitRequests==="0"||A.rateLimitRequests===0?"无限制":A.rateLimitRequests||"","日费用限制($)":A.dailyCostLimit==="0"||A.dailyCostLimit===0?"无限制":`$${A.dailyCostLimit}`||"","总费用限制($)":A.totalCostLimit==="0"||A.totalCostLimit===0?"无限制":`$${A.totalCostLimit}`||"",Claude专属账户:A.claudeAccountId||"",Claude控制台账户:A.claudeConsoleAccountId||"",Gemini专属账户:A.geminiAccountId||"",OpenAI专属账户:A.openaiAccountId||"","Azure OpenAI专属账户":A.azureOpenaiAccountId||"",Bedrock专属账户:A.bedrockAccountId||"",Droid专属账户:A.droidAccountId||"",启用模型限制:A.enableModelRestriction?"是":"否",限制的模型:A.restrictedModels&&A.restrictedModels.length>0?A.restrictedModels.join("; "):"",启用客户端限制:A.enableClientRestriction?"是":"否",允许的客户端:A.allowedClients&&A.allowedClients.length>0?A.allowedClients.join("; "):"",创建时间:A.createdAt?Ve(A.createdAt):"",创建者:A.createdBy||"",用户ID:A.userId||"",用户名:A.userUsername||"",标签:A.tags&&A.tags.length>0?A.tags.join(", "):"无",请求总数:ee,"总费用($)":de.toFixed(2),Token数:be(Ae),输入Token:be(lt),输出Token:be(fe),最后使用时间:A.lastUsedAt?Ve(A.lastUsedAt):"从未使用"},ze={};let Fe=null;return h.preset==="today"?Fe=(Gt=(jt=A.usage)==null?void 0:jt.daily)==null?void 0:Gt.models:h.preset==="7days"?Fe=(zt=(qt=A.usage)==null?void 0:qt.weekly)==null?void 0:zt.models:h.preset==="30days"?Fe=(Bt=(Ft=A.usage)==null?void 0:Ft.monthly)==null?void 0:Bt.models:h.preset==="all"&&(Fe=(Ht=(Wt=A.usage)==null?void 0:Wt.total)==null?void 0:Ht.models),Fe&&Object.entries(Fe).forEach(([ft,Ye])=>{let Oe=ft;ft.includes(":")&&(Oe=ft.split(":").pop()),Oe=Oe.replace(/[:/]/g,"_"),ze[`${Oe}_请求数`]=Ye.requests||0,ze[`${Oe}_费用($)`]=(Ye.cost||0).toFixed(2),ze[`${Oe}_Token`]=be(Ye.totalTokens||0),ze[`${Oe}_输入Token`]=be(Ye.inputTokens||0),ze[`${Oe}_输出Token`]=be(Ye.outputTokens||0)}),{...ws,...ze}}),t=je.utils.book_new(),m=je.utils.json_to_sheet(a),r=je.utils.decode_range(m["!ref"]),v=Object.keys(a[0]||{}),S=v.map(A=>A==="ID"?{wch:40}:A==="名称"?{wch:25}:A==="描述"?{wch:30}:A==="API密钥"?{wch:45}:A==="标签"?{wch:20}:A.includes("时间")?{wch:20}:A.includes("限制")?{wch:15}:A.includes("费用")?{wch:15}:A.includes("Token")?{wch:15}:A.includes("请求")?{wch:12}:A.includes("账户")?{wch:30}:A.includes("权限")||A.includes("模型")||A.includes("客户端")?{wch:20}:A.includes("激活")||A.includes("过期")?{wch:18}:{wch:15});m["!cols"]=S;for(let A=r.s.c;A<=r.e.c;++A){const ee=je.utils.encode_cell({r:0,c:A});if(!m[ee])continue;const de=v[A],Ae=de&&de.includes("_");m[ee].s={fill:{fgColor:{rgb:Ae?"70AD47":"4472C4"}},font:{color:{rgb:"FFFFFF"},bold:!0,sz:12},alignment:{horizontal:"center",vertical:"center"},border:{top:{style:"thin",color:{rgb:"2F5597"}},bottom:{style:"thin",color:{rgb:"2F5597"}},left:{style:"thin",color:{rgb:"2F5597"}},right:{style:"thin",color:{rgb:"2F5597"}}}}}for(let A=1;A<=r.e.r;++A)for(let ee=r.s.c;ee<=r.e.c;++ee){const de=je.utils.encode_cell({r:A,c:ee});if(!m[de])continue;const Ae=v[ee],lt=m[de].v,fe={font:{sz:11},border:{top:{style:"thin",color:{rgb:"D3D3D3"}},bottom:{style:"thin",color:{rgb:"D3D3D3"}},left:{style:"thin",color:{rgb:"D3D3D3"}},right:{style:"thin",color:{rgb:"D3D3D3"}}}};A%2===0&&(fe.fill={fgColor:{rgb:"F2F2F2"}}),Ae==="名称"?fe.alignment={horizontal:"left",vertical:"center"}:Ae==="标签"?(fe.alignment={horizontal:"left",vertical:"center"},lt==="无"&&(fe.font={...fe.font,color:{rgb:"999999"},italic:!0})):Ae==="最后使用时间"?(fe.alignment={horizontal:"right",vertical:"center"},lt==="从未使用"&&(fe.font={...fe.font,color:{rgb:"999999"},italic:!0})):Ae&&Ae.includes("费用")?(fe.alignment={horizontal:"right",vertical:"center"},fe.font={...fe.font,color:{rgb:"0066CC"},bold:!0}):Ae&&(Ae.includes("Token")||Ae.includes("请求"))&&(fe.alignment={horizontal:"right",vertical:"center"}),m[de].s=fe}je.utils.book_append_sheet(t,m,"用量统计");const B=new Date,D=B.getFullYear()+String(B.getMonth()+1).padStart(2,"0")+String(B.getDate()).padStart(2,"0")+"_"+String(B.getHours()).padStart(2,"0")+String(B.getMinutes()).padStart(2,"0")+String(B.getSeconds()).padStart(2,"0");let oe="";h.type==="preset"?oe={today:"今日","7days":"最近7天","30days":"最近30天",all:"全部时间"}[h.preset]||h.preset:oe="自定义时间";const ye=`API_Keys_用量统计_${oe}_${D}.xlsx`;je.writeFile(t,ye),E(`成功导出 ${a.length} 条API Key用量数据`,"success")}catch{E("导出失败,请重试","error")}};return De([k,H],()=>{te.value=1,K.value=[],he()}),De(U,()=>{te.value=1,he()}),De(i,()=>{te.value=1,he()}),De([te,X],()=>{he()}),De(X,a=>{localStorage.setItem("apiKeysPageSize",a.toString())}),De(V,()=>{const a=new Set(V.value.map(t=>t.id));K.value=K.value.filter(t=>a.has(t)),he()}),Je(async()=>{await Promise.all([F.loadSupportedClients(),Ze(),we()]),he()}),(a,t)=>{const m=hs;return l(),n("div",Ld,[e("div",Dd,[e("div",_d,[t[149]||(t[149]=e("div",null,[e("h3",{class:"mb-1 text-lg font-bold text-gray-900 dark:text-gray-100 sm:mb-2 sm:text-xl"}," API Keys 管理 "),e("p",{class:"text-sm text-gray-600 dark:text-gray-400 sm:text-base"}," 管理和监控您的 API 密钥 ")],-1)),e("div",Sd,[e("nav",Td,[e("button",{class:G(["whitespace-nowrap border-b-2 px-1 py-2 text-sm font-medium",J.value==="active"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:text-gray-400 dark:hover:border-gray-500 dark:hover:text-gray-300"]),onClick:t[0]||(t[0]=r=>J.value="active")},[t[35]||(t[35]=I(" 活跃 API Keys ",-1)),V.value.length>0?(l(),n("span",Md,c(V.value.length),1)):$("",!0)],2),e("button",{class:G(["whitespace-nowrap border-b-2 px-1 py-2 text-sm font-medium",J.value==="deleted"?"border-blue-500 text-blue-600":"border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 dark:text-gray-400 dark:hover:border-gray-500 dark:hover:text-gray-300"]),onClick:et},[t[36]||(t[36]=I(" 已删除 API Keys ",-1)),M.value.length>0?(l(),n("span",Pd,c(M.value.length),1)):$("",!0)],2)])]),J.value==="active"?(l(),n("div",Rd,[e("div",Ud,[e("div",Vd,[e("div",Od,[t[37]||(t[37]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-blue-500 to-purple-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),ue(bt,{modelValue:h.preset,"onUpdate:modelValue":t[1]||(t[1]=r=>h.preset=r),icon:"fa-calendar-alt","icon-color":"text-blue-500",options:s.value,placeholder:"选择时间范围",onChange:ss},null,8,["modelValue","options"])]),h.type==="custom"?(l(),n("div",Ed,[ue(m,{class:"api-key-date-picker custom-date-range-picker",clearable:!0,"default-time":ce.value,"disabled-date":Mt,"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","model-value":h.customRange,"range-separator":"至",size:"small","start-placeholder":"开始日期",style:{width:"320px",height:"38px"},type:"datetimerange","unlink-panels":!1,"value-format":"YYYY-MM-DD HH:mm:ss","onUpdate:modelValue":as},null,8,["default-time","model-value"])])):$("",!0),e("div",jd,[t[38]||(t[38]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-purple-500 to-pink-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),e("div",Gd,[ue(bt,{modelValue:k.value,"onUpdate:modelValue":t[2]||(t[2]=r=>k.value=r),icon:"fa-tags","icon-color":"text-purple-500",options:ne.value,placeholder:"所有标签",onChange:t[3]||(t[3]=r=>te.value=1)},null,8,["modelValue","options"]),k.value?(l(),n("span",qd,c(me.value),1)):$("",!0)])]),e("div",zd,[e("div",Fd,[ue(bt,{modelValue:i.value,"onUpdate:modelValue":t[4]||(t[4]=r=>i.value=r),icon:"fa-filter","icon-color":"text-cyan-500",options:f.value,placeholder:"选择搜索类型",onChange:t[5]||(t[5]=r=>te.value=1)},null,8,["modelValue","options"])]),e("div",Bd,[t[41]||(t[41]=e("div",{class:"pointer-events-none absolute -inset-0.5 rounded-lg bg-gradient-to-r from-cyan-500 to-teal-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),e("div",Wd,[_(e("input",{"onUpdate:modelValue":t[6]||(t[6]=r=>U.value=r),class:"h-10 w-full rounded-lg border border-gray-200 bg-white px-3 pl-9 text-sm text-gray-700 placeholder-gray-400 shadow-sm transition-all duration-200 hover:border-gray-300 focus:border-cyan-500 focus:outline-none focus:ring-2 focus:ring-cyan-500/20 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:placeholder-gray-500 dark:hover:border-gray-500",placeholder:i.value==="bindingAccount"?"搜索所属账号...":z.value?"搜索名称或所有者...":"搜索名称...",type:"text",onInput:t[7]||(t[7]=r=>te.value=1)},null,40,Hd),[[ae,U.value]]),t[40]||(t[40]=e("i",{class:"fas fa-search absolute left-3 text-sm text-cyan-500"},null,-1)),U.value?(l(),n("button",{key:0,class:"absolute right-2 flex h-5 w-5 items-center justify-center rounded-full text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300",onClick:vs},t[39]||(t[39]=[e("i",{class:"fas fa-times text-xs"},null,-1)]))):$("",!0)])])])]),e("div",Nd,[e("button",{class:"group relative flex items-center justify-center gap-2 rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition-all duration-200 hover:border-gray-300 hover:shadow-md disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:border-gray-500 sm:w-auto",disabled:Y.value,onClick:t[8]||(t[8]=r=>we())},[t[42]||(t[42]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-green-500 to-teal-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),e("i",{class:G(["fas relative text-green-500",Y.value?"fa-spinner fa-spin":"fa-sync-alt"])},null,2),t[43]||(t[43]=e("span",{class:"relative"},"刷新",-1))],8,Yd),e("button",{class:"flex items-center gap-2 rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition-all duration-200 hover:border-gray-300 hover:bg-gray-50 hover:shadow-md dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700",onClick:u},[e("i",{class:G(P.value?"fas fa-times":"fas fa-check-square")},null,2),e("span",null,c(P.value?"取消选择":"选择"),1)]),e("button",{class:"group relative flex items-center justify-center gap-2 rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition-all duration-200 hover:border-gray-300 hover:shadow-md dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:border-gray-500 sm:w-auto",onClick:ks},t[44]||(t[44]=[e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-emerald-500 to-green-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1),e("i",{class:"fas fa-file-excel relative text-emerald-500"},null,-1),e("span",{class:"relative"},"导出数据",-1)])),K.value.length>0?(l(),n("button",{key:0,class:"group relative flex items-center justify-center gap-2 rounded-lg border border-blue-200 bg-blue-50 px-4 py-2 text-sm font-medium text-blue-700 shadow-sm transition-all duration-200 hover:border-blue-300 hover:bg-blue-100 hover:shadow-md dark:border-blue-700 dark:bg-blue-900/30 dark:text-blue-300 dark:hover:bg-blue-900/50 sm:w-auto",onClick:t[9]||(t[9]=r=>ds())},[t[45]||(t[45]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-blue-500 to-indigo-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),t[46]||(t[46]=e("i",{class:"fas fa-edit relative text-blue-600 dark:text-blue-400"},null,-1)),e("span",Qd,"编辑选中 ("+c(K.value.length)+")",1)])):$("",!0),K.value.length>0?(l(),n("button",{key:1,class:"group relative flex items-center justify-center gap-2 rounded-lg border border-red-200 bg-red-50 px-4 py-2 text-sm font-medium text-red-700 shadow-sm transition-all duration-200 hover:border-red-300 hover:bg-red-100 hover:shadow-md dark:border-red-700 dark:bg-red-900/30 dark:text-red-300 dark:hover:bg-red-900/50 sm:w-auto",onClick:t[10]||(t[10]=r=>ys())},[t[47]||(t[47]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-red-500 to-pink-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),t[48]||(t[48]=e("i",{class:"fas fa-trash relative text-red-600 dark:text-red-400"},null,-1)),e("span",Jd,"删除选中 ("+c(K.value.length)+")",1)])):$("",!0),e("button",{class:"flex w-full items-center justify-center gap-2 rounded-lg bg-gradient-to-r from-blue-500 to-blue-600 px-5 py-2 text-sm font-medium text-white shadow-md transition-all duration-200 hover:from-blue-600 hover:to-blue-700 hover:shadow-lg sm:w-auto",onClick:ve(ls,["stop"])},t[49]||(t[49]=[e("i",{class:"fas fa-plus"},null,-1),e("span",null,"创建新 Key",-1)]))])]),Y.value?(l(),n("div",Xd,t[50]||(t[50]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载 API Keys...",-1)]))):V.value.length===0?(l(),n("div",Zd,t[51]||(t[51]=[e("div",{class:"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-700"},[e("i",{class:"fas fa-key text-xl text-gray-400"})],-1),e("p",{class:"text-lg text-gray-500 dark:text-gray-400"},"暂无 API Keys",-1),e("p",{class:"mt-2 text-sm text-gray-400"},"点击上方按钮创建您的第一个 API Key",-1)]))):(l(),n("div",e0,[e("div",t0,[e("table",s0,[e("thead",a0,[e("tr",null,[C.value?(l(),n("th",r0,[e("div",o0,[_(e("input",{"onUpdate:modelValue":t[11]||(t[11]=r=>R.value=r),class:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",indeterminate:O.value,type:"checkbox",onChange:fs},null,40,l0),[[Le,R.value]])])])):$("",!0),e("th",{class:"w-[14%] min-w-[120px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:t[12]||(t[12]=r=>Re("name"))},[t[52]||(t[52]=I(" 名称 ",-1)),L.value==="name"?(l(),n("i",{key:0,class:G(["fas",y.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),n("i",i0))]),t[60]||(t[60]=e("th",{class:"w-[15%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 所属账号 ",-1)),t[61]||(t[61]=e("th",{class:"w-[10%] min-w-[80px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 标签 ",-1)),e("th",{class:"w-[6%] min-w-[60px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:t[13]||(t[13]=r=>Re("status"))},[t[53]||(t[53]=I(" 状态 ",-1)),L.value==="status"?(l(),n("i",{key:0,class:G(["fas",y.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),n("i",n0))]),e("th",{class:"w-[4%] min-w-[40px] cursor-pointer px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:t[14]||(t[14]=r=>Re("periodCost"))},[t[54]||(t[54]=I(" 费用 ",-1)),L.value==="periodCost"?(l(),n("i",{key:0,class:G(["fas",y.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),n("i",d0))]),t[62]||(t[62]=e("th",{class:"w-[14%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 限制 ",-1)),e("th",{class:"w-[5%] min-w-[45px] cursor-pointer px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:t[15]||(t[15]=r=>Re("periodTokens"))},[t[55]||(t[55]=I(" Token ",-1)),L.value==="periodTokens"?(l(),n("i",{key:0,class:G(["fas",y.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),n("i",u0))]),e("th",{class:"w-[5%] min-w-[45px] cursor-pointer px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:t[16]||(t[16]=r=>Re("periodRequests"))},[t[56]||(t[56]=I(" 请求数 ",-1)),L.value==="periodRequests"?(l(),n("i",{key:0,class:G(["fas",y.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),n("i",c0))]),e("th",{class:"w-[8%] min-w-[70px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:t[17]||(t[17]=r=>Re("lastUsedAt"))},[t[57]||(t[57]=I(" 最后使用 ",-1)),L.value==="lastUsedAt"?(l(),n("i",{key:0,class:G(["fas",y.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),n("i",g0))]),e("th",{class:"w-[8%] min-w-[70px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:t[18]||(t[18]=r=>Re("createdAt"))},[t[58]||(t[58]=I(" 创建时间 ",-1)),L.value==="createdAt"?(l(),n("i",{key:0,class:G(["fas",y.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),n("i",p0))]),e("th",{class:"w-[8%] min-w-[70px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:t[19]||(t[19]=r=>Re("expiresAt"))},[t[59]||(t[59]=I(" 过期时间 ",-1)),L.value==="expiresAt"?(l(),n("i",{key:0,class:G(["fas",y.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),n("i",m0))]),t[63]||(t[63]=e("th",{class:"operations-column sticky right-0 w-[23%] min-w-[200px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 操作 ",-1))])]),e("tbody",null,[(l(!0),n(Q,null,se(qe.value,(r,v)=>{var S,B;return l(),n(Q,{key:r.id},[e("tr",{class:G(["table-row transition-all duration-150",v%2===0?"bg-white dark:bg-gray-800/40":"bg-gray-50/70 dark:bg-gray-700/30","border-b-2 border-gray-200/80 dark:border-gray-700/50","hover:bg-blue-50/60 hover:shadow-sm dark:hover:bg-blue-900/20"])},[C.value?(l(),n("td",x0,[e("div",y0,[_(e("input",{"onUpdate:modelValue":t[20]||(t[20]=D=>K.value=D),class:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",type:"checkbox",value:r.id,onChange:he},null,40,f0),[[Le,K.value]])])])):$("",!0),e("td",b0,[e("div",v0,[e("div",{class:"truncate text-sm font-semibold text-gray-900 dark:text-gray-100",title:r.name},c(r.name),9,k0),z.value&&r.ownerDisplayName?(l(),n("div",w0,[t[64]||(t[64]=e("i",{class:"fas fa-user mr-1"},null,-1)),I(" "+c(r.ownerDisplayName),1)])):$("",!0)])]),e("td",h0,[e("div",A0,[r.claudeAccountId||r.claudeConsoleAccountId?(l(),n("div",$0,[t[65]||(t[65]=e("span",{class:"inline-flex items-center rounded bg-indigo-100 px-1.5 py-0.5 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300"},[e("i",{class:"fas fa-brain mr-1 text-[10px]"}),I(" Claude ")],-1)),e("span",C0,c(dt(r)),1)])):$("",!0),r.geminiAccountId?(l(),n("div",I0,[t[66]||(t[66]=e("span",{class:"inline-flex items-center rounded bg-yellow-100 px-1.5 py-0.5 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300"},[e("i",{class:"fas fa-robot mr-1 text-[10px]"}),I(" Gemini ")],-1)),e("span",K0,c(ut(r)),1)])):$("",!0),r.openaiAccountId?(l(),n("div",L0,[t[67]||(t[67]=e("span",{class:"inline-flex items-center rounded bg-gray-100 px-1.5 py-0.5 text-gray-700 dark:bg-gray-700 dark:text-gray-300"},[e("i",{class:"fa-openai mr-1 text-[10px]"}),I(" OpenAI ")],-1)),e("span",D0,c(ct(r)),1)])):$("",!0),r.bedrockAccountId?(l(),n("div",_0,[t[68]||(t[68]=e("span",{class:"inline-flex items-center rounded bg-orange-100 px-1.5 py-0.5 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300"},[e("i",{class:"fas fa-cloud mr-1 text-[10px]"}),I(" Bedrock ")],-1)),e("span",S0,c(gt(r)),1)])):$("",!0),r.droidAccountId?(l(),n("div",T0,[t[69]||(t[69]=e("span",{class:"inline-flex items-center rounded bg-cyan-100 px-1.5 py-0.5 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-300"},[e("i",{class:"fas fa-robot mr-1 text-[10px]"}),I(" Droid ")],-1)),e("span",M0,c(pt(r)),1)])):$("",!0),!r.claudeAccountId&&!r.claudeConsoleAccountId&&!r.geminiAccountId&&!r.openaiAccountId&&!r.bedrockAccountId&&!r.droidAccountId?(l(),n("div",P0,t[70]||(t[70]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),I(" 共享池 ",-1)]))):$("",!0)])]),e("td",R0,[e("div",U0,[(l(!0),n(Q,null,se(r.tags||[],D=>(l(),n("span",{key:D,class:"inline-flex items-center rounded-full bg-blue-100 px-2 py-0.5 text-xs text-blue-800 dark:bg-blue-900/30 dark:text-blue-300"},c(D),1))),128)),!r.tags||r.tags.length===0?(l(),n("span",V0,"无标签")):$("",!0)])]),e("td",O0,[e("span",{class:G(["inline-flex items-center rounded-full px-3 py-1 text-xs font-semibold",r.isActive?"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300":"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300"])},[e("div",{class:G(["mr-2 h-2 w-2 rounded-full",r.isActive?"bg-green-500":"bg-red-500"])},null,2),I(" "+c(r.isActive?"活跃":"禁用"),1)],2)]),e("td",E0,[e("span",j0," $"+c(Dt(r).toFixed(2)),1)]),e("td",G0,[e("div",q0,[r.dailyCostLimit>0?(l(),pe(_e,{key:0,current:r.dailyCost||0,label:"每日限制",limit:r.dailyCostLimit,type:"daily",variant:"compact"},null,8,["current","limit"])):r.totalCostLimit>0?(l(),pe(_e,{key:1,current:((B=(S=r.usage)==null?void 0:S.total)==null?void 0:B.cost)||0,label:"总费用限制",limit:r.totalCostLimit,type:"total",variant:"compact"},null,8,["current","limit"])):r.rateLimitWindow>0&&r.rateLimitCost>0&&(!r.dailyCostLimit||r.dailyCostLimit===0)&&(!r.totalCostLimit||r.totalCostLimit===0)?(l(),n("div",z0,[ue(_e,{current:r.currentWindowCost||0,label:"窗口费用",limit:r.rateLimitCost,type:"window",variant:"compact"},null,8,["current","limit"]),e("div",F0,[e("div",B0,[t[71]||(t[71]=e("i",{class:"fas fa-clock text-[10px]"},null,-1)),e("span",W0,c(r.rateLimitWindow)+"分钟窗口",1)]),e("span",{class:G(["font-bold",r.windowRemainingSeconds>0?"text-sky-700 dark:text-sky-300":"text-gray-400 dark:text-gray-500"])},c(r.windowRemainingSeconds>0?Et(r.windowRemainingSeconds):"未激活"),3)])])):(l(),n("div",H0,t[72]||(t[72]=[e("i",{class:"fas fa-infinity text-base"},null,-1),e("span",{class:"text-xs font-medium"},"无限制",-1)])))])]),e("td",N0,[e("div",Y0,[e("span",Q0,c(be(ot(r))),1)])]),e("td",J0,[e("div",X0,[e("span",Z0,c(nt(rt(r))),1),t[73]||(t[73]=e("span",{class:"text-xs text-gray-500"},"次",-1))])]),e("td",eu,[r.lastUsedAt?(l(),n("span",{key:0,class:"cursor-help",style:{"font-size":"13px"},title:new Date(r.lastUsedAt).toLocaleString("zh-CN")},c(yt(r.lastUsedAt)),9,tu)):(l(),n("span",su,"从未使用"))]),e("td",au,c(new Date(r.createdAt).toLocaleDateString()),1),e("td",ru,[e("div",ou,[r.expirationMode==="activation"&&!r.isActivated?(l(),n("span",lu,[t[74]||(t[74]=e("i",{class:"fas fa-pause-circle mr-1 text-xs"},null,-1)),I(" 未激活 ( "+c(r.activationDays||(r.activationUnit==="hours"?24:30))+c(r.activationUnit==="hours"?"小时":"天")+") ",1)])):r.expiresAt?(l(),n("span",iu,[tt(r.expiresAt)?(l(),n("span",{key:0,class:"inline-flex cursor-pointer items-center text-red-600 hover:underline",style:{"font-size":"13px"},onClick:ve(D=>Ne(r),["stop"])},t[75]||(t[75]=[e("i",{class:"fas fa-exclamation-circle mr-1 text-xs"},null,-1),I(" 已过期 ",-1)]),8,nu)):st(r.expiresAt)?(l(),n("span",{key:1,class:"inline-flex cursor-pointer items-center text-orange-600 hover:underline",style:{"font-size":"13px"},onClick:ve(D=>Ne(r),["stop"])},[t[76]||(t[76]=e("i",{class:"fas fa-clock mr-1 text-xs"},null,-1)),I(" "+c(Kt(r.expiresAt)),1)],8,du)):(l(),n("span",{key:2,class:"cursor-pointer text-gray-600 hover:underline dark:text-gray-400",style:{"font-size":"13px"},onClick:ve(D=>Ne(r),["stop"])},c(Kt(r.expiresAt)),9,uu))])):(l(),n("span",{key:2,class:"inline-flex cursor-pointer items-center text-gray-400 hover:underline dark:text-gray-500",style:{"font-size":"13px"},onClick:ve(D=>Ne(r),["stop"])},t[77]||(t[77]=[e("i",{class:"fas fa-infinity mr-1 text-xs"},null,-1),I(" 永不过期 ",-1)]),8,cu))])]),e("td",gu,[e("div",pu,[e("button",{class:"rounded px-2 py-1 text-xs font-medium text-purple-600 transition-colors hover:bg-purple-50 hover:text-purple-900 dark:hover:bg-purple-900/20",title:"查看详细统计",onClick:D=>xt(r)},t[78]||(t[78]=[e("i",{class:"fas fa-chart-line"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"详情",-1)]),8,mu),r&&r.id?(l(),n("button",{key:0,class:"rounded px-2 py-1 text-xs font-medium text-indigo-600 transition-colors hover:bg-indigo-50 hover:text-indigo-900 dark:hover:bg-indigo-900/20",title:"模型使用分布",onClick:D=>Xt(r.id)},[e("i",{class:G(["fas",d.value[r.id]?"fa-chevron-up":"fa-chevron-down"])},null,2),t[79]||(t[79]=e("span",{class:"ml-1 hidden xl:inline"},"模型",-1))],8,xu)):$("",!0),e("button",{class:"rounded px-2 py-1 text-xs font-medium text-blue-600 transition-colors hover:bg-blue-50 hover:text-blue-900 dark:hover:bg-blue-900/20",title:"编辑",onClick:D=>Pt(r)},t[80]||(t[80]=[e("i",{class:"fas fa-edit"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"编辑",-1)]),8,yu),r.expiresAt&&(tt(r.expiresAt)||st(r.expiresAt))?(l(),n("button",{key:1,class:"rounded px-2 py-1 text-xs font-medium text-green-600 transition-colors hover:bg-green-50 hover:text-green-900 dark:hover:bg-green-900/20",title:"续期",onClick:D=>Rt(r)},t[81]||(t[81]=[e("i",{class:"fas fa-clock"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"续期",-1)]),8,fu)):$("",!0),e("button",{class:G([r.isActive?"text-orange-600 hover:bg-orange-50 hover:text-orange-900 dark:hover:bg-orange-900/20":"text-green-600 hover:bg-green-50 hover:text-green-900 dark:hover:bg-green-900/20","rounded px-2 py-1 text-xs font-medium transition-colors"]),title:r.isActive?"禁用":"激活",onClick:D=>Ut(r)},[e("i",{class:G(["fas",r.isActive?"fa-ban":"fa-check-circle"])},null,2),e("span",vu,c(r.isActive?"禁用":"激活"),1)],10,bu),e("button",{class:"rounded px-2 py-1 text-xs font-medium text-red-600 transition-colors hover:bg-red-50 hover:text-red-900 dark:hover:bg-red-900/20",title:"删除",onClick:D=>Vt(r.id)},t[82]||(t[82]=[e("i",{class:"fas fa-trash"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"删除",-1)]),8,ku)])])],2),r&&r.id&&d.value[r.id]?(l(),n("tr",wu,[e("td",hu,[x.value[r.id]?$("",!0):(l(),n("div",Au,t[83]||(t[83]=[e("div",{class:"loading-spinner mx-auto"},null,-1),e("p",{class:"mt-2 text-sm text-gray-500 dark:text-gray-400"}," 加载模型统计... ",-1)]))),e("div",$u,[e("div",Cu,[t[84]||(t[84]=e("h5",{class:"flex items-center text-sm font-semibold text-gray-700 dark:text-gray-300"},[e("i",{class:"fas fa-chart-pie mr-2 text-indigo-500"}),I(" 模型使用分布 ")],-1)),e("div",Iu,[x.value[r.id]&&x.value[r.id].length>0?(l(),n("span",Ku,c(x.value[r.id].length)+" 个模型 ",1)):$("",!0),e("div",Lu,[e("div",Du,[(l(!0),n(Q,null,se(Ue(r.id).presetOptions,D=>(l(),n("button",{key:D.value,class:G(["rounded px-2 py-1 text-xs font-medium transition-colors",Ue(r.id).preset===D.value&&Ue(r.id).type==="preset"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-gray-200"]),onClick:oe=>Tt(D.value,r.id)},c(D.label),11,_u))),128))]),ue(m,{class:"api-key-date-picker",clearable:!0,"default-time":ce.value,"disabled-date":Mt,"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","model-value":Ue(r.id).customRange,"range-separator":"至",size:"small","start-placeholder":"开始日期",style:{width:"280px"},type:"datetimerange","unlink-panels":!1,"value-format":"YYYY-MM-DD HH:mm:ss","onUpdate:modelValue":D=>rs(r.id,D)},null,8,["default-time","model-value","onUpdate:modelValue"])])])]),x.value[r.id]&&x.value[r.id].length===0?(l(),n("div",Su,[e("div",Tu,[t[86]||(t[86]=e("i",{class:"fas fa-chart-line text-lg text-gray-400"},null,-1)),t[87]||(t[87]=e("p",{class:"text-sm text-gray-500 dark:text-gray-400"}," 暂无模型使用数据 ",-1)),e("button",{class:"ml-2 flex items-center gap-1 text-sm text-blue-500 transition-colors hover:text-blue-700",title:"重置筛选条件并刷新",onClick:D=>os(r.id)},t[85]||(t[85]=[e("i",{class:"fas fa-sync-alt text-xs"},null,-1),e("span",{class:"text-xs"},"刷新",-1)]),8,Mu)]),t[88]||(t[88]=e("p",{class:"text-xs text-gray-400"}," 尝试调整时间范围或点击刷新重新加载数据 ",-1))])):x.value[r.id]&&x.value[r.id].length>0?(l(),n("div",Pu,[(l(!0),n(Q,null,se(x.value[r.id],D=>(l(),n("div",{key:D.model,class:"rounded-xl border border-gray-200 bg-gradient-to-br from-white to-gray-50 p-4 transition-all duration-200 hover:border-indigo-300 hover:shadow-lg dark:border-gray-600 dark:from-gray-800 dark:to-gray-700 dark:hover:border-indigo-500"},[e("div",Ru,[e("div",Uu,[e("span",Vu,c(D.model),1),e("span",Ou,c(D.requests)+" 次请求",1)])]),e("div",Eu,[e("div",ju,[t[89]||(t[89]=e("span",{class:"flex items-center text-gray-600 dark:text-gray-400"},[e("i",{class:"fas fa-coins mr-1 text-xs text-yellow-500"}),I(" 总Token: ")],-1)),e("span",Gu,c(be(D.allTokens)),1)]),e("div",qu,[t[90]||(t[90]=e("span",{class:"flex items-center text-gray-600 dark:text-gray-400"},[e("i",{class:"fas fa-dollar-sign mr-1 text-xs text-green-500"}),I(" 费用: ")],-1)),e("span",zu,c(Zt(D)),1)]),e("div",Fu,[e("div",Bu,[t[91]||(t[91]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-down mr-1 text-green-500"}),I(" 输入: ")],-1)),e("span",Wu,c(be(D.inputTokens)),1)]),e("div",Hu,[t[92]||(t[92]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-up mr-1 text-blue-500"}),I(" 输出: ")],-1)),e("span",Nu,c(be(D.outputTokens)),1)]),D.cacheCreateTokens>0?(l(),n("div",Yu,[t[93]||(t[93]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-save mr-1"}),I(" 缓存创建: ")],-1)),e("span",Qu,c(be(D.cacheCreateTokens)),1)])):$("",!0),D.cacheReadTokens>0?(l(),n("div",Ju,[t[94]||(t[94]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-download mr-1"}),I(" 缓存读取: ")],-1)),e("span",Xu,c(be(D.cacheReadTokens)),1)])):$("",!0)])]),e("div",Zu,[e("div",{class:"h-2 rounded-full bg-gradient-to-r from-indigo-500 to-purple-600 transition-all duration-500",style:it({width:Lt(D.allTokens,x.value[r.id])+"%"})},null,4)]),e("div",ec,[e("span",tc,c(Lt(D.allTokens,x.value[r.id]))+"% ",1)])]))),128))])):$("",!0),x.value[r.id]&&x.value[r.id].length>0?(l(),n("div",sc,[e("div",ac,[t[97]||(t[97]=e("span",{class:"flex items-center font-semibold text-gray-700 dark:text-gray-300"},[e("i",{class:"fas fa-calculator mr-2 text-indigo-500"}),I(" 总计统计 ")],-1)),e("div",rc,[e("span",oc,[t[95]||(t[95]=I(" 总请求: ",-1)),e("span",lc,c(x.value[r.id].reduce((D,oe)=>D+oe.requests,0)),1)]),e("span",ic,[t[96]||(t[96]=I(" 总Token: ",-1)),e("span",nc,c(be(x.value[r.id].reduce((D,oe)=>D+oe.allTokens,0))),1)])])])])):$("",!0)])])])):$("",!0)],64)}),128))])])])])),!Y.value&&Ge.value.length>0?(l(),n("div",dc,[(l(!0),n(Q,null,se(qe.value,r=>{var v,S,B,D;return l(),n("div",{key:r.id,class:"card p-4 transition-shadow hover:shadow-lg"},[e("div",uc,[e("div",cc,[C.value?_((l(),n("input",{key:0,"onUpdate:modelValue":t[21]||(t[21]=oe=>K.value=oe),class:"mt-1 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",type:"checkbox",value:r.id,onChange:he},null,40,gc)),[[Le,K.value]]):$("",!0),e("div",null,[e("h4",pc,c(r.name),1),e("p",mc,c(r.id),1)])]),e("span",{class:G(["inline-flex items-center rounded-full px-2 py-1 text-xs font-semibold",r.isActive?"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300":"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300"])},[e("div",{class:G(["mr-1.5 h-1.5 w-1.5 rounded-full",r.isActive?"bg-green-500":"bg-red-500"])},null,2),I(" "+c(r.isActive?"活跃":"已停用"),1)],2)]),e("div",xc,[r.claudeAccountId||r.claudeConsoleAccountId?(l(),n("div",yc,[t[98]||(t[98]=e("span",{class:"inline-flex items-center rounded bg-indigo-100 px-2 py-0.5 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300"},[e("i",{class:"fas fa-brain mr-1"}),I(" Claude ")],-1)),e("span",fc,c(dt(r)),1)])):$("",!0),r.geminiAccountId?(l(),n("div",bc,[t[99]||(t[99]=e("span",{class:"inline-flex items-center rounded bg-yellow-100 px-2 py-0.5 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300"},[e("i",{class:"fas fa-robot mr-1"}),I(" Gemini ")],-1)),e("span",vc,c(ut(r)),1)])):$("",!0),r.openaiAccountId?(l(),n("div",kc,[t[100]||(t[100]=e("span",{class:"inline-flex items-center rounded bg-gray-100 px-2 py-0.5 text-gray-700 dark:bg-gray-700 dark:text-gray-300"},[e("i",{class:"fa-openai mr-1"}),I(" OpenAI ")],-1)),e("span",wc,c(ct(r)),1)])):$("",!0),r.bedrockAccountId?(l(),n("div",hc,[t[101]||(t[101]=e("span",{class:"inline-flex items-center rounded bg-orange-100 px-2 py-0.5 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300"},[e("i",{class:"fas fa-cloud mr-1"}),I(" Bedrock ")],-1)),e("span",Ac,c(gt(r)),1)])):$("",!0),r.droidAccountId?(l(),n("div",$c,[t[102]||(t[102]=e("span",{class:"inline-flex items-center rounded bg-cyan-100 px-2 py-0.5 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-300"},[e("i",{class:"fas fa-robot mr-1"}),I(" Droid ")],-1)),e("span",Cc,c(pt(r)),1)])):$("",!0),!r.claudeAccountId&&!r.claudeConsoleAccountId&&!r.geminiAccountId&&!r.openaiAccountId&&!r.bedrockAccountId&&!r.droidAccountId?(l(),n("div",Ic,t[103]||(t[103]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),I(" 使用共享池 ",-1)]))):$("",!0),z.value&&r.ownerDisplayName?(l(),n("div",Kc,[t[104]||(t[104]=e("i",{class:"fas fa-user mr-1"},null,-1)),I(" "+c(r.ownerDisplayName),1)])):$("",!0)]),e("div",Lc,[e("div",Dc,[e("div",_c,[e("span",Sc,c(h.type==="custom"?"累计统计":"今日使用"),1),e("button",{class:"text-xs text-blue-600 hover:text-blue-800",onClick:oe=>xt(r)},t[105]||(t[105]=[e("i",{class:"fas fa-chart-line mr-1"},null,-1),I("详情 ",-1)]),8,Tc)]),e("div",Mc,[e("div",null,[e("p",Pc,c(nt(((S=(v=r.usage)==null?void 0:v.daily)==null?void 0:S.requests)||0))+" 次 ",1),t[106]||(t[106]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"请求",-1))]),e("div",null,[e("p",Rc," $"+c((r.dailyCost||0).toFixed(2)),1),t[107]||(t[107]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"费用",-1))])]),e("div",Uc,[t[108]||(t[108]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400"},"最后使用",-1)),e("span",Vc,c(yt(r.lastUsedAt)),1)])]),e("div",Oc,[r.dailyCostLimit>0?(l(),pe(_e,{key:0,current:r.dailyCost||0,label:"每日限制",limit:r.dailyCostLimit,type:"daily",variant:"compact"},null,8,["current","limit"])):r.totalCostLimit>0?(l(),pe(_e,{key:1,current:((D=(B=r.usage)==null?void 0:B.total)==null?void 0:D.cost)||0,label:"总费用限制",limit:r.totalCostLimit,type:"total",variant:"compact"},null,8,["current","limit"])):r.rateLimitWindow>0&&r.rateLimitCost>0&&(!r.dailyCostLimit||r.dailyCostLimit===0)&&(!r.totalCostLimit||r.totalCostLimit===0)?(l(),n("div",Ec,[ue(_e,{current:r.currentWindowCost||0,label:"窗口费用",limit:r.rateLimitCost,type:"window",variant:"compact"},null,8,["current","limit"]),e("div",jc,[e("div",Gc,[t[109]||(t[109]=e("i",{class:"fas fa-clock text-xs"},null,-1)),e("span",qc,c(r.rateLimitWindow)+"分钟窗口",1)]),e("span",{class:G(["font-bold",r.windowRemainingSeconds>0?"text-sky-700 dark:text-sky-300":"text-gray-400 dark:text-gray-500"])},c(r.windowRemainingSeconds>0?Et(r.windowRemainingSeconds):"未激活"),3)])])):(l(),n("div",zc,t[110]||(t[110]=[e("i",{class:"fas fa-infinity text-base"},null,-1),e("span",{class:"text-xs font-medium"},"无限制",-1)])))])]),e("div",Fc,[e("div",Bc,[t[111]||(t[111]=e("span",null,"创建时间",-1)),e("span",null,c(Ve(r.createdAt)),1)]),e("div",Wc,[t[113]||(t[113]=e("span",null,"过期时间",-1)),e("div",Hc,[e("span",{class:G(st(r.expiresAt)?"font-semibold text-orange-600":"")},c(r.expiresAt?Ve(r.expiresAt):"永不过期"),3),e("button",{class:"inline-flex h-5 w-5 items-center justify-center rounded text-gray-300 transition-all duration-200 hover:bg-blue-50 hover:text-blue-500 dark:hover:bg-blue-900/20",title:"编辑过期时间",onClick:ve(oe=>Ne(r),["stop"])},t[112]||(t[112]=[e("svg",{class:"h-3 w-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{d:"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"})],-1)]),8,Nc)])])]),r.tags&&r.tags.length>0?(l(),n("div",Yc,[(l(!0),n(Q,null,se(r.tags,oe=>(l(),n("span",{key:oe,class:"inline-flex items-center rounded-full bg-blue-100 px-2 py-0.5 text-xs text-blue-800 dark:bg-blue-900/30 dark:text-blue-300"},c(oe),1))),128))])):$("",!0),e("div",Qc,[e("button",{class:"flex flex-1 items-center justify-center gap-1 rounded-lg bg-blue-50 px-3 py-1.5 text-xs text-blue-600 transition-colors hover:bg-blue-100 dark:bg-blue-900/30 dark:hover:bg-blue-900/50",onClick:oe=>xt(r)},t[114]||(t[114]=[e("i",{class:"fas fa-chart-line"},null,-1),I(" 查看详情 ",-1)]),8,Jc),e("button",{class:"flex-1 rounded-lg bg-gray-50 px-3 py-1.5 text-xs text-gray-600 transition-colors hover:bg-gray-100 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",onClick:oe=>Pt(r)},t[115]||(t[115]=[e("i",{class:"fas fa-edit mr-1"},null,-1),I(" 编辑 ",-1)]),8,Xc),r.expiresAt&&(tt(r.expiresAt)||st(r.expiresAt))?(l(),n("button",{key:0,class:"flex-1 rounded-lg bg-orange-50 px-3 py-1.5 text-xs text-orange-600 transition-colors hover:bg-orange-100 dark:bg-orange-900/30 dark:hover:bg-orange-900/50",onClick:oe=>Rt(r)},t[116]||(t[116]=[e("i",{class:"fas fa-clock mr-1"},null,-1),I(" 续期 ",-1)]),8,Zc)):$("",!0),e("button",{class:G([r.isActive?"bg-orange-50 text-orange-600 hover:bg-orange-100 dark:bg-orange-900/30 dark:hover:bg-orange-900/50":"bg-green-50 text-green-600 hover:bg-green-100 dark:bg-green-900/30 dark:hover:bg-green-900/50","rounded-lg px-3 py-1.5 text-xs transition-colors"]),onClick:oe=>Ut(r)},[e("i",{class:G(["fas",r.isActive?"fa-ban":"fa-check-circle","mr-1"])},null,2),I(" "+c(r.isActive?"禁用":"激活"),1)],10,eg),e("button",{class:"rounded-lg bg-red-50 px-3 py-1.5 text-xs text-red-600 transition-colors hover:bg-red-100 dark:bg-red-900/30 dark:hover:bg-red-900/50",onClick:oe=>Vt(r.id)},t[117]||(t[117]=[e("i",{class:"fas fa-trash"},null,-1)]),8,tg)])])}),128))])):$("",!0),Ge.value.length>0?(l(),n("div",sg,[e("div",ag,[e("span",rg," 共 "+c(Ge.value.length)+" 条记录 ",1),e("div",og,[t[118]||(t[118]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},"每页显示",-1)),_(e("select",{"onUpdate:modelValue":t[22]||(t[22]=r=>X.value=r),class:"rounded-md border border-gray-200 bg-white px-2 py-1 text-xs text-gray-700 transition-colors hover:border-gray-300 focus:border-transparent focus:outline-none focus:ring-2 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:border-gray-500 sm:text-sm",onChange:t[23]||(t[23]=r=>te.value=1)},[(l(),n(Q,null,se(xe,r=>e("option",{key:r,value:r},c(r),9,lg)),64))],544),[[Ie,X.value]]),t[119]||(t[119]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},"条",-1))])]),e("div",ig,[e("button",{class:"rounded-md border border-gray-300 bg-white px-3 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700 sm:py-1 sm:text-sm",disabled:te.value===1,onClick:t[24]||(t[24]=r=>te.value--)},t[120]||(t[120]=[e("i",{class:"fas fa-chevron-left"},null,-1)]),8,ng),e("div",dg,[Ct.value?(l(),n("button",{key:0,class:"hidden rounded-md border border-gray-300 bg-white px-3 py-1 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700 sm:block",onClick:t[25]||(t[25]=r=>te.value=1)}," 1 ")):$("",!0),Qt.value?(l(),n("span",ug,"...")):$("",!0),(l(!0),n(Q,null,se(We.value,r=>(l(),n("button",{key:r,class:G(["rounded-md px-2 py-1 text-xs font-medium sm:px-3 sm:text-sm",r===te.value?"bg-blue-600 text-white":"border border-gray-300 bg-white text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700"]),onClick:v=>te.value=r},c(r),11,cg))),128)),Jt.value?(l(),n("span",gg,"...")):$("",!0),It.value?(l(),n("button",{key:3,class:"hidden rounded-md border border-gray-300 bg-white px-3 py-1 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700 sm:block",onClick:t[26]||(t[26]=r=>te.value=Ee.value)},c(Ee.value),1)):$("",!0)]),e("button",{class:"rounded-md border border-gray-300 bg-white px-3 py-1.5 text-xs font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700 sm:py-1 sm:text-sm",disabled:te.value===Ee.value||Ee.value===0,onClick:t[27]||(t[27]=r=>te.value++)},t[121]||(t[121]=[e("i",{class:"fas fa-chevron-right"},null,-1)]),8,pg)])])):$("",!0)])):J.value==="deleted"?(l(),n("div",mg,[N.value?(l(),n("div",xg,t[122]||(t[122]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载已删除的 API Keys...",-1)]))):M.value.length===0?(l(),n("div",yg,t[123]||(t[123]=[e("div",{class:"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-700"},[e("i",{class:"fas fa-trash text-xl text-gray-400"})],-1),e("p",{class:"text-lg text-gray-500 dark:text-gray-400"},"暂无已删除的 API Keys",-1),e("p",{class:"mt-2 text-sm text-gray-400"},"已删除的 API Keys 会出现在这里",-1)]))):(l(),n("div",fg,[e("div",bg,[M.value.length>0?(l(),n("button",{key:0,class:"rounded-lg bg-red-600 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-red-700 dark:bg-red-600 dark:hover:bg-red-700",onClick:xs},[t[124]||(t[124]=e("i",{class:"fas fa-trash-alt mr-2"},null,-1)),I(" 清空所有已删除 ("+c(M.value.length)+") ",1)])):$("",!0)]),e("div",vg,[e("div",kg,[e("table",wg,[e("thead",hg,[e("tr",null,[t[125]||(t[125]=e("th",{class:"w-[14%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 名称 ",-1)),t[126]||(t[126]=e("th",{class:"w-[15%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 所属账号 ",-1)),z.value?(l(),n("th",Ag," 创建者 ")):$("",!0),t[127]||(t[127]=e("th",{class:"w-[15%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 创建时间 ",-1)),t[128]||(t[128]=e("th",{class:"w-[10%] min-w-[90px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 删除者 ",-1)),t[129]||(t[129]=e("th",{class:"w-[10%] min-w-[90px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 删除时间 ",-1)),t[130]||(t[130]=e("th",{class:"w-[8%] min-w-[60px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 费用 ",-1)),t[131]||(t[131]=e("th",{class:"w-[8%] min-w-[60px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," Token ",-1)),t[132]||(t[132]=e("th",{class:"w-[8%] min-w-[60px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 请求数 ",-1)),t[133]||(t[133]=e("th",{class:"w-[9%] min-w-[80px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 最后使用 ",-1)),t[134]||(t[134]=e("th",{class:"operations-column sticky right-0 w-[15%] min-w-[160px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 操作 ",-1))])]),e("tbody",$g,[(l(!0),n(Q,null,se(M.value,r=>{var v,S,B,D,oe,ye;return l(),n("tr",{key:r.id,class:"table-row"},[e("td",Cg,[e("div",Ig,[t[135]||(t[135]=e("div",{class:"mr-2 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-red-500 to-red-600"},[e("i",{class:"fas fa-trash text-[10px] text-white"})],-1)),e("div",Kg,[e("div",{class:"truncate text-sm font-semibold text-gray-900 dark:text-gray-100",title:r.name},c(r.name),9,Lg)])])]),e("td",Dg,[e("div",_g,[r.claudeAccountId?(l(),n("div",Sg,t[136]||(t[136]=[e("span",{class:"inline-flex items-center rounded bg-blue-100 px-1.5 py-0.5 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300"},[e("i",{class:"fas fa-robot mr-1 text-[10px]"}),I(" Claude OAuth ")],-1)]))):r.claudeConsoleAccountId?(l(),n("div",Tg,t[137]||(t[137]=[e("span",{class:"inline-flex items-center rounded bg-green-100 px-1.5 py-0.5 text-green-700 dark:bg-green-900/30 dark:text-green-300"},[e("i",{class:"fas fa-terminal mr-1 text-[10px]"}),I(" Claude Console ")],-1)]))):r.geminiAccountId?(l(),n("div",Mg,t[138]||(t[138]=[e("span",{class:"inline-flex items-center rounded bg-purple-100 px-1.5 py-0.5 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300"},[e("i",{class:"fa-google mr-1 text-[10px]"}),I(" Gemini ")],-1)]))):(l(),n("div",Pg,t[139]||(t[139]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),I(" 共享池 ",-1)])))])]),z.value?(l(),n("td",Rg,[e("div",Ug,[r.createdBy==="admin"?(l(),n("span",Vg,t[140]||(t[140]=[e("i",{class:"fas fa-user-shield mr-1 text-xs"},null,-1),I(" 管理员 ",-1)]))):r.userUsername?(l(),n("span",Og,[t[141]||(t[141]=e("i",{class:"fas fa-user mr-1 text-xs"},null,-1)),I(" "+c(r.userUsername),1)])):(l(),n("span",Eg,t[142]||(t[142]=[e("i",{class:"fas fa-question-circle mr-1 text-xs"},null,-1),I(" 未知 ",-1)])))])])):$("",!0),e("td",jg,c(Ve(r.createdAt)),1),e("td",Gg,[e("div",qg,[r.deletedByType==="admin"?(l(),n("span",zg,[t[143]||(t[143]=e("i",{class:"fas fa-user-shield mr-1 text-xs"},null,-1)),I(" "+c(r.deletedBy),1)])):r.deletedByType==="user"?(l(),n("span",Fg,[t[144]||(t[144]=e("i",{class:"fas fa-user mr-1 text-xs"},null,-1)),I(" "+c(r.deletedBy),1)])):(l(),n("span",Bg,[t[145]||(t[145]=e("i",{class:"fas fa-cog mr-1 text-xs"},null,-1)),I(" "+c(r.deletedBy),1)]))])]),e("td",Wg,c(Ve(r.deletedAt)),1),e("td",Hg,[e("span",Ng," $"+c((((S=(v=r.usage)==null?void 0:v.total)==null?void 0:S.cost)||0).toFixed(2)),1)]),e("td",Yg,[e("span",Qg,c(be(((D=(B=r.usage)==null?void 0:B.total)==null?void 0:D.tokens)||0)),1)]),e("td",Jg,[e("div",Xg,[e("span",Zg,c(nt(((ye=(oe=r.usage)==null?void 0:oe.total)==null?void 0:ye.requests)||0)),1),t[146]||(t[146]=e("span",{class:"text-xs text-gray-500"},"次",-1))])]),e("td",ep,[r.lastUsedAt?(l(),n("span",tp,c(yt(r.lastUsedAt)),1)):(l(),n("span",sp,"从未使用"))]),e("td",ap,[e("div",rp,[r.canRestore?(l(),n("button",{key:0,class:"rounded-lg bg-green-50 px-3 py-1.5 text-xs font-medium text-green-600 transition-colors hover:bg-green-100 dark:bg-green-900/30 dark:text-green-400 dark:hover:bg-green-900/50",title:"恢复 API Key",onClick:A=>ps(r.id)},t[147]||(t[147]=[e("i",{class:"fas fa-undo mr-1"},null,-1),I(" 恢复 ",-1)]),8,op)):$("",!0),e("button",{class:"rounded-lg bg-red-50 px-3 py-1.5 text-xs font-medium text-red-600 transition-colors hover:bg-red-100 dark:bg-red-900/30 dark:text-red-400 dark:hover:bg-red-900/50",title:"彻底删除 API Key",onClick:A=>ms(r.id)},t[148]||(t[148]=[e("i",{class:"fas fa-times mr-1"},null,-1),I(" 彻底删除 ",-1)]),8,lp)])])])}),128))])])])])]))])):$("",!0)])]),Te.value?(l(),pe(Dr,{key:0,accounts:W.value,onBatchSuccess:ns,onClose:t[28]||(t[28]=r=>Te.value=!1),onSuccess:is},null,8,["accounts"])):$("",!0),Me.value?(l(),pe(Mo,{key:1,accounts:W.value,"api-key":wt.value,onClose:t[29]||(t[29]=r=>Me.value=!1),onSuccess:cs},null,8,["accounts","api-key"])):$("",!0),Pe.value?(l(),pe(Qo,{key:2,"api-key":ht.value,onClose:t[30]||(t[30]=r=>Pe.value=!1),onSuccess:gs},null,8,["api-key"])):$("",!0),le.value?(l(),pe(ul,{key:3,"api-key":At.value,onClose:t[31]||(t[31]=r=>le.value=!1)},null,8,["api-key"])):$("",!0),$e.value?(l(),pe(Rl,{key:4,"api-keys":$t.value,onClose:t[32]||(t[32]=r=>$e.value=!1)},null,8,["api-keys"])):$("",!0),Xe.value?(l(),pe(Xi,{key:5,accounts:W.value,"selected-keys":K.value,onClose:t[33]||(t[33]=r=>Xe.value=!1),onSuccess:us},null,8,["accounts","selected-keys"])):$("",!0),ue(Cn,{ref_key:"expiryEditModalRef",ref:b,"api-key":ge.value||{id:null,expiresAt:null,name:""},show:!!ge.value,onClose:Ot,onSave:bs},null,8,["api-key","show"]),ue(Kd,{"api-key":g.value||{},show:o.value,onClose:t[34]||(t[34]=r=>o.value=!1)},null,8,["api-key","show"])])}}},mp=Ce(ip,[["__scopeId","data-v-b49fddcc"]]);export{mp as default};
|