mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 00:53:33 +00:00
31 lines
245 KiB
JavaScript
31 lines
245 KiB
JavaScript
import{E as oa}from"./element-plus-CqiD73Lu.js";import{aP as vs,r as L,c as O,q as nt,V as ks,o as Te,x as d,y as i,z as e,I as Ae,C as G,P as u,R as ae,J as la,L as A,B as ht,K as _,aq as ee,Q as X,ac as re,T as ia,a5 as Ve,D as na,_ as He,Y as Le,an as ce,O as $,aa as lt,aV as it,al as Pe,f as rt,u as ot}from"./vue-vendor-Bsazo-x0.js";import{c as q,_ as Se,s as E,u as da}from"./index-Cv-gO-fV.js";import{Q as ze}from"./vendor-Dr8jvgFu.js";import{_ as ua}from"./WindowCountdown-BTXjZ8Dc.js";import{C as Et,_ as ca}from"./ActionDropdown-CS_hPDMD.js";const jt=vs("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}}}}),Gt=vs("apiKeys",()=>{const w=L([]),N=L(!1),c=L(null),P=L("all"),B=L(""),C=L("asc"),U=async()=>{N.value=!0,c.value=null;try{const T=await q.get("/admin/api-keys");if(T.success)w.value=T.data||[];else throw new Error(T.message||"获取API Keys失败")}catch(T){throw c.value=T.message,T}finally{N.value=!1}};return{apiKeys:w,loading:N,error:c,statsTimeRange:P,sortBy:B,sortOrder:C,fetchApiKeys:U,createApiKey:async T=>{N.value=!0,c.value=null;try{const W=await q.post("/admin/api-keys",T);if(W.success)return await U(),W.data;throw new Error(W.message||"创建API Key失败")}catch(W){throw c.value=W.message,W}finally{N.value=!1}},updateApiKey:async(T,W)=>{N.value=!0,c.value=null;try{const I=await q.put(`/admin/api-keys/${T}`,W);if(I.success)return await U(),I;throw new Error(I.message||"更新API Key失败")}catch(I){throw c.value=I.message,I}finally{N.value=!1}},toggleApiKey:async T=>{N.value=!0,c.value=null;try{const W=await q.put(`/admin/api-keys/${T}/toggle`);if(W.success)return await U(),W;throw new Error(W.message||"切换状态失败")}catch(W){throw c.value=W.message,W}finally{N.value=!1}},renewApiKey:async(T,W)=>{N.value=!0,c.value=null;try{const I=await q.put(`/admin/api-keys/${T}`,W);if(I.success)return await U(),I;throw new Error(I.message||"续期失败")}catch(I){throw c.value=I.message,I}finally{N.value=!1}},deleteApiKey:async T=>{N.value=!0,c.value=null;try{const W=await q.delete(`/admin/api-keys/${T}`);if(W.success)return await U(),W;throw new Error(W.message||"删除失败")}catch(W){throw c.value=W.message,W}finally{N.value=!1}},fetchApiKeyStats:async(T,W="all")=>{try{const I=await q.get(`/admin/api-keys/${T}/stats`,{params:{timeRange:W}});if(I.success)return I.stats;throw new Error(I.message||"获取统计失败")}catch(I){return console.error("获取API Key统计失败:",I),null}},fetchTags:async()=>{try{const T=await q.get("/admin/api-keys/tags");if(T.success)return T.data||[];throw new Error(T.message||"获取标签失败")}catch(T){return console.error("获取标签失败:",T),[]}},sortApiKeys:T=>{B.value===T?C.value=C.value==="asc"?"desc":"asc":(B.value=T,C.value="asc")},reset:()=>{w.value=[],N.value=!1,c.value=null,P.value="all",B.value="",C.value="asc"}}}),ga={class:"flex-shrink-0 border-b border-gray-200 p-3 dark:border-gray-600"},pa={class:"relative"},ma={class:"custom-scrollbar flex-1 overflow-y-auto"},xa={key:0,class:"border-b border-gray-200 dark:border-gray-600"},ya=["onClick"],fa={class:"text-gray-700 dark:text-gray-300"},ba={key:0,class:"ml-2 text-xs text-gray-400 dark:text-gray-500"},va={class:"text-gray-700 dark:text-gray-300"},ka={key:1},wa=["onClick"],ha={class:"flex items-center justify-between"},Aa={class:"text-gray-700 dark:text-gray-300"},$a={class:"text-xs text-gray-500 dark:text-gray-400"},Ca={key:2},Ia={class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"},Ka=["onClick"],La={class:"flex items-center justify-between"},Da={class:"text-gray-700 dark:text-gray-300"},_a={class:"text-xs text-gray-400 dark:text-gray-500"},Ta={key:3},Sa=["onClick"],Ua={class:"flex items-center justify-between"},Pa={class:"text-gray-700 dark:text-gray-300"},Ra={class:"text-xs text-gray-400 dark:text-gray-500"},Ma={key:4},Va=["onClick"],Ea={class:"flex items-center justify-between"},Oa={class:"text-gray-700 dark:text-gray-300"},ja={class:"text-xs text-gray-400 dark:text-gray-500"},Ga={key:5},qa=["onClick"],za={class:"flex items-center justify-between"},Fa={class:"text-gray-700 dark:text-gray-300"},Wa={class:"text-xs text-gray-400 dark:text-gray-500"},Ba={key:6,class:"px-4 py-8 text-center text-gray-500 dark:text-gray-400"},Na={__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:"使用共享账号池"},specialOptions:{type:Array,default:()=>[]}},emits:["update:modelValue"],setup(w,{emit:N}){const c=w,P=N,B=L(!1),C=L(""),U=L(null),F=L(null),S=L({}),Q=L(null),H=L(""),f=O(()=>c.specialOptions||[]),D=O(()=>{const p=f.value.find(m=>m.value===c.modelValue);if(p)return p.label;if(!c.modelValue)return c.defaultOptionText;if(c.modelValue.startsWith("group:")){const m=c.modelValue.substring(6),l=c.groups.find(x=>x.id===m);return l?`${l.name} (${l.memberCount||0} 个成员)`:""}if(c.modelValue.startsWith("console:")){const m=c.modelValue.substring(8),l=c.accounts.find(x=>x.id===m&&x.platform==="claude-console");return l?`${l.name} (${y(l)})`:""}if(c.modelValue.startsWith("responses:")){const m=c.modelValue.substring(10),l=c.accounts.find(x=>x.id===m&&x.platform==="openai-responses");return l?`${l.name} (${y(l)})`:""}if(c.modelValue.startsWith("api:")){const m=c.modelValue.substring(4),l=c.accounts.find(x=>x.id===m&&x.platform==="gemini-api");return l?`${l.name} (${y(l)})`:""}const k=c.accounts.find(m=>m.id===c.modelValue);return k?`${k.name} (${y(k)})`:""}),y=p=>{if(!p)return"未知";if(!(p.isActive==="true"||p.isActive===!0))switch(p.status){case"unauthorized":return"未授权";case"error":return"Token错误";case"created":return"待验证";case"rate_limited":return"限流中";case"quota_exceeded":return"额度超限";default:return"异常"}return p.status==="rate_limited"?"限流中":"正常"},a=O(()=>[...c.accounts].sort((p,k)=>{const m=new Date(p.createdAt||0);return new Date(k.createdAt||0)-m})),j=O(()=>{let p=c.groups.filter(k=>k.platform?k.platform===c.platform:!0);if(C.value){const k=C.value.toLowerCase();p=p.filter(m=>m.name.toLowerCase().includes(k))}return p}),T=O(()=>{let p=[];if(c.platform==="claude"?p=a.value.filter(k=>k.platform==="claude-oauth"):c.platform==="openai"?p=a.value.filter(k=>k.platform==="openai"):c.platform==="droid"?p=a.value.filter(k=>k.platform==="droid"):c.platform==="gemini"?p=a.value.filter(k=>k.platform==="gemini"):p=a.value.filter(k=>!["claude-oauth","claude-console","openai-responses","gemini-api"].includes(k.platform)),C.value){const k=C.value.toLowerCase();p=p.filter(m=>m.name.toLowerCase().includes(k))}return p}),W=O(()=>{if(c.platform!=="claude")return[];let p=a.value.filter(k=>k.platform==="claude-console");if(C.value){const k=C.value.toLowerCase();p=p.filter(m=>m.name.toLowerCase().includes(k))}return p}),I=O(()=>{if(c.platform!=="openai")return[];let p=a.value.filter(k=>k.platform==="openai-responses");if(C.value){const k=C.value.toLowerCase();p=p.filter(m=>m.name.toLowerCase().includes(k))}return p}),K=O(()=>{if(c.platform!=="gemini")return[];let p=a.value.filter(k=>k.platform==="gemini-api");if(C.value){const k=C.value.toLowerCase();p=p.filter(m=>m.name.toLowerCase().includes(k))}return p}),te=O(()=>j.value.length>0||T.value.length>0||W.value.length>0||I.value.length>0||K.value.length>0),ne=p=>{if(!p)return"";const k=new Date(p),l=(new Date-k)/(1e3*60*60);return l<24?"今天创建":l<48?"昨天创建":l<168?`${Math.floor(l/24)} 天前`:k.toLocaleDateString("zh-CN",{month:"2-digit",day:"2-digit"})},ue=()=>{if(!B.value||!F.value||!Q.value)return;const p=Q.value;if(!p)return;const k=p.getBoundingClientRect(),m=window.innerHeight,l=window.innerWidth,x=m-k.bottom,oe=k.top,xe=8,be=x-xe,me=oe-xe;let we=!1,ye=be;H.value==="above"&&me>=150?(we=!0,ye=me):H.value==="below"&&be>=150?(we=!1,ye=be):me>be&&be<200&&(we=!0,ye=me),H.value=we?"above":"below";let Y=k.left;const J=k.width;Y+J>l-xe&&(Y=l-J-xe),Y<xe&&(Y=xe),S.value={position:"fixed",left:`${Y}px`,width:`${k.width}px`,maxHeight:`${Math.min(ye,400)}px`,...we?{bottom:`${m-k.top}px`}:{top:`${k.bottom}px`}}},ke=()=>{if(!B.value&&Q.value){const p=Q.value.getBoundingClientRect(),m=window.innerHeight-p.bottom,l=8;S.value={position:"fixed",left:`${p.left}px`,width:`${p.width}px`,maxHeight:`${Math.min(m-l,400)}px`,top:`${p.bottom}px`}}B.value=!B.value,B.value&&na(()=>{var p;ue(),(p=U.value)==null||p.focus()})},pe=p=>{P("update:modelValue",p||""),B.value=!1,C.value=""},$e=()=>{},h=()=>{var p;C.value="",(p=U.value)==null||p.focus()},o=p=>{var k,m;!((k=Q.value)!=null&&k.contains(p.target))&&!((m=F.value)!=null&&m.contains(p.target))&&(B.value=!1)},n=()=>{B.value&&ue()};return nt(()=>{document.addEventListener("click",o),window.addEventListener("scroll",n,!0),window.addEventListener("resize",ue)}),ks(()=>{document.removeEventListener("click",o),window.removeEventListener("scroll",n,!0),window.removeEventListener("resize",ue)}),Te(B,p=>{p||(C.value="",H.value="")}),(p,k)=>(i(),d("div",{ref_key:"triggerRef",ref:Q,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:k[0]||(k[0]=m=>!w.disabled&&ke())},[e("span",{class:G(w.modelValue?"text-gray-900 dark:text-gray-200":"text-gray-500 dark:text-gray-400")},u(D.value),3),e("i",{class:G(["fas fa-chevron-down text-gray-400 transition-transform duration-200 dark:text-gray-500",{"rotate-180":B.value}])},null,2)],2),(i(),Ae(Ve,{to:"body"},[ae(ia,{"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:la(()=>[B.value?(i(),d("div",{key:0,ref_key:"dropdownRef",ref:F,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:ht(S.value)},[e("div",ga,[e("div",pa,[_(e("input",{ref_key:"searchInput",ref:U,"onUpdate:modelValue":k[1]||(k[1]=m=>C.value=m),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:$e},null,544),[[ee,C.value]]),k[4]||(k[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)),C.value?(i(),d("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:h},k[3]||(k[3]=[e("i",{class:"fas fa-times text-sm"},null,-1)]))):A("",!0)])]),e("div",ma,[f.value.length>0?(i(),d("div",xa,[(i(!0),d(X,null,re(f.value,m=>(i(),d("div",{key:`special-${m.value}`,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===m.value}]),onClick:l=>pe(m.value)},[e("span",fa,u(m.label),1),m.description?(i(),d("span",ba,u(m.description),1)):A("",!0)],10,ya))),128))])):A("",!0),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:k[2]||(k[2]=m=>pe(null))},[e("span",va,u(w.defaultOptionText),1)],2),j.value.length>0?(i(),d("div",ka,[k[5]||(k[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)),(i(!0),d(X,null,re(j.value,m=>(i(),d("div",{key:`group:${m.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:${m.id}`}]),onClick:l=>pe(`group:${m.id}`)},[e("div",ha,[e("span",Aa,u(m.name),1),e("span",$a,u(m.memberCount||0)+" 个成员",1)])],10,wa))),128))])):A("",!0),T.value.length>0?(i(),d("div",Ca,[e("div",Ia,u(w.platform==="claude"?"Claude OAuth 专属账号":w.platform==="openai"?"OpenAI 专属账号":w.platform==="droid"?"Droid 专属账号":w.platform==="gemini"?"Gemini OAuth 专属账号":"OAuth 专属账号"),1),(i(!0),d(X,null,re(T.value,m=>(i(),d("div",{key:m.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===m.id}]),onClick:l=>pe(m.id)},[e("div",La,[e("div",null,[e("span",Da,u(m.name),1),e("span",{class:G(["ml-2 rounded-full px-2 py-0.5 text-xs",m.isActive?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":m.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"])},u(y(m)),3)]),e("span",_a,u(ne(m.createdAt)),1)])],10,Ka))),128))])):A("",!0),w.platform==="claude"&&W.value.length>0?(i(),d("div",Ta,[k[6]||(k[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)),(i(!0),d(X,null,re(W.value,m=>(i(),d("div",{key:m.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:${m.id}`}]),onClick:l=>pe(`console:${m.id}`)},[e("div",Ua,[e("div",null,[e("span",Pa,u(m.name),1),e("span",{class:G(["ml-2 rounded-full px-2 py-0.5 text-xs",m.isActive?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":m.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"])},u(y(m)),3)]),e("span",Ra,u(ne(m.createdAt)),1)])],10,Sa))),128))])):A("",!0),w.platform==="openai"&&I.value.length>0?(i(),d("div",Ma,[k[7]||(k[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)),(i(!0),d(X,null,re(I.value,m=>(i(),d("div",{key:m.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:${m.id}`}]),onClick:l=>pe(`responses:${m.id}`)},[e("div",Ea,[e("div",null,[e("span",Oa,u(m.name),1),e("span",{class:G(["ml-2 rounded-full px-2 py-0.5 text-xs",m.isActive==="true"||m.isActive===!0?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":m.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"])},u(y(m)),3)]),e("span",ja,u(ne(m.createdAt)),1)])],10,Va))),128))])):A("",!0),w.platform==="gemini"&&K.value.length>0?(i(),d("div",Ga,[k[8]||(k[8]=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"}," Gemini-API 专属账号 ",-1)),(i(!0),d(X,null,re(K.value,m=>(i(),d("div",{key:m.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===`api:${m.id}`}]),onClick:l=>pe(`api:${m.id}`)},[e("div",za,[e("div",null,[e("span",Fa,u(m.name),1),e("span",{class:G(["ml-2 rounded-full px-2 py-0.5 text-xs",m.isActive==="true"||m.isActive===!0?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":m.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"])},u(y(m)),3)]),e("span",Wa,u(ne(m.createdAt)),1)])],10,qa))),128))])):A("",!0),C.value&&!te.value?(i(),d("div",Ba,k[9]||(k[9]=[e("i",{class:"fas fa-search mb-2 text-2xl"},null,-1),e("p",{class:"text-sm"},"没有找到匹配的账号",-1)]))):A("",!0)])],4)):A("",!0)]),_:1})]))],512))}},Ie=Se(Na,[["__scopeId","data-v-32c162ec"]]),Ha={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},Ya={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6"},Qa={class:"mb-4 flex items-center justify-between"},Ja={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"},Xa={class:"flex items-center gap-3 sm:gap-4"},Za={class:"flex cursor-pointer items-center"},er={class:"flex cursor-pointer items-center"},tr={key:0,class:"mt-3"},sr={class:"flex items-center gap-4"},ar={class:"flex-1"},rr={class:"flex items-center gap-2"},or={class:"mt-2 flex items-start text-xs text-amber-600 dark:text-amber-400"},lr=["placeholder"],ir={key:0,class:"mt-1 text-xs text-red-500 dark:text-red-400"},nr={class:"space-y-4"},dr={key:0},ur={class:"flex flex-wrap gap-2"},cr=["onClick"],gr={key:1},pr={class:"flex flex-wrap gap-2"},mr=["onClick"],xr={class:"flex gap-2"},yr=["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"},vr={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},kr={class:"space-y-2"},wr={class:"flex gap-2"},hr={class:"space-y-2"},Ar={class:"flex gap-2"},$r={class:"space-y-2"},Cr={class:"flex gap-2"},Ir={class:"mb-3 rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800"},Kr={class:"flex items-center gap-4"},Lr={class:"flex cursor-pointer items-center"},Dr={class:"flex cursor-pointer items-center"},_r={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Tr={key:0},Sr={key:1},Ur={key:0},Pr={key:0,class:"mt-3"},Rr=["min"],Mr={key:1,class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Vr={key:1},Er={class:"flex items-center gap-2"},Or=["max","placeholder"],jr={class:"mt-2 flex flex-wrap gap-2"},Gr=["onClick"],qr={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},zr={class:"flex gap-4"},Fr={class:"flex cursor-pointer items-center"},Wr={class:"flex cursor-pointer items-center"},Br={class:"flex cursor-pointer items-center"},Nr={class:"flex cursor-pointer items-center"},Hr={class:"flex cursor-pointer items-center"},Yr={class:"mb-2 flex items-center justify-between"},Qr=["disabled"],Jr={class:"grid grid-cols-1 gap-3"},Xr={class:"mb-2 flex items-center"},Zr={key:0,class:"space-y-3"},eo={class:"mb-3 flex min-h-[32px] flex-wrap gap-2 rounded-lg border border-gray-200 bg-gray-50 p-2"},to=["onClick"],so={key:0,class:"text-sm text-gray-400"},ao={class:"space-y-3"},ro={class:"flex flex-wrap gap-2"},oo=["onClick"],lo={key:0,class:"text-sm italic text-gray-400"},io={class:"flex gap-2"},no=["onKeydown"],uo={class:"mb-2 flex items-center"},co={key:0,class:"rounded-lg border border-green-200 bg-green-50 p-3 dark:border-green-700 dark:bg-green-900/20"},go={class:"space-y-1"},po=["id","value"],mo=["for"],xo={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},yo={class:"block text-xs text-gray-500 dark:text-gray-400"},fo={class:"flex gap-3 pt-2"},bo=["disabled"],vo={key:0,class:"loading-spinner mr-2"},ko={key:1,class:"fas fa-plus mr-2"},wo={__name:"CreateApiKeyModal",props:{accounts:{type:Object,default:()=>({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]})}},emits:["close","success","batch-success"],setup(w,{emit:N}){const c=w,P=N,B=jt(),C=Gt(),U=L(!1),F=L(!1),S=L({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),Q=L({name:""}),H=L(""),f=L([]),D=O(()=>f.value.filter(m=>!a.tags.includes(m))),y=L([]),a=He({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:[]});nt(async()=>{if(y.value=await B.loadSupportedClients(),f.value=await C.fetchTags(),c.accounts){const m=(c.accounts.gemini||[]).map(x=>({...x,platform:x.platform||"gemini"})),l=[];c.accounts.openai&&c.accounts.openai.forEach(x=>{l.push({...x,platform:x.platform||"openai"})}),c.accounts.openaiResponses&&c.accounts.openaiResponses.forEach(x=>{l.push({...x,platform:x.platform||"openai-responses"})}),S.value={claude:c.accounts.claude||[],gemini:m,openai:l,bedrock:c.accounts.bedrock||[],droid:(c.accounts.droid||[]).map(x=>({...x,platform:x.platform||"droid"})),claudeGroups:c.accounts.claudeGroups||[],geminiGroups:c.accounts.geminiGroups||[],openaiGroups:c.accounts.openaiGroups||[],droidGroups:c.accounts.droidGroups||[]}}});const j=async()=>{var m,l;F.value=!0;try{const[x,oe,xe,be,me,we,ye,Y,J]=await Promise.all([q.get("/admin/claude-accounts"),q.get("/admin/claude-console-accounts"),q.get("/admin/gemini-accounts"),q.get("/admin/gemini-api-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")]),De=[];x.success&&((m=x.data)==null||m.forEach(le=>{De.push({...le,platform:"claude-oauth",isDedicated:le.accountType==="dedicated"})})),oe.success&&((l=oe.data)==null||l.forEach(le=>{De.push({...le,platform:"claude-console",isDedicated:le.accountType==="dedicated"})})),S.value.claude=De;const Ye=[];xe.success&&(xe.data||[]).forEach(le=>{Ye.push({...le,platform:"gemini",isDedicated:le.accountType==="dedicated"})}),be.success&&(be.data||[]).forEach(le=>{Ye.push({...le,platform:"gemini-api",isDedicated:le.accountType==="dedicated"})}),S.value.gemini=Ye;const ve=[];if(me.success&&(me.data||[]).forEach(le=>{ve.push({...le,platform:"openai",isDedicated:le.accountType==="dedicated"})}),we.success&&(we.data||[]).forEach(le=>{ve.push({...le,platform:"openai-responses",isDedicated:le.accountType==="dedicated"})}),S.value.openai=ve,ye.success&&(S.value.bedrock=(ye.data||[]).map(le=>({...le,isDedicated:le.accountType==="dedicated"}))),Y.success&&(S.value.droid=(Y.data||[]).map(le=>({...le,platform:"droid",isDedicated:le.accountType==="dedicated"}))),J.success){const le=J.data||[];S.value.claudeGroups=le.filter(_e=>_e.platform==="claude"),S.value.geminiGroups=le.filter(_e=>_e.platform==="gemini"),S.value.openaiGroups=le.filter(_e=>_e.platform==="openai"),S.value.droidGroups=le.filter(_e=>_e.platform==="droid")}E("账号列表已刷新","success")}catch{E("刷新账号列表失败","error")}finally{F.value=!1}},T=O(()=>{const m=new Date;return m.setMinutes(m.getMinutes()+1),m.toISOString().slice(0,16)}),W=()=>{if(!a.expireDuration){a.expiresAt=null;return}if(a.expireDuration==="custom")return;const m=new Date,x=a.expireDuration.match(/(\d+)([dhmy])/);if(x){const[,oe,xe]=x,be=parseInt(oe);switch(xe){case"d":m.setDate(m.getDate()+be);break;case"h":m.setHours(m.getHours()+be);break;case"m":m.setMonth(m.getMonth()+be);break;case"y":m.setFullYear(m.getFullYear()+be);break}a.expiresAt=m.toISOString()}},I=()=>{a.customExpireDate&&(a.expiresAt=new Date(a.customExpireDate).toISOString())},K=m=>new Date(m).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),te=()=>{a.modelInput&&!a.restrictedModels.includes(a.modelInput)&&(a.restrictedModels.push(a.modelInput),a.modelInput="")},ne=m=>{a.restrictedModels.splice(m,1)},ue=L(["claude-opus-4-20250514","claude-opus-4-1-20250805"]),ke=O(()=>ue.value.filter(m=>!a.restrictedModels.includes(m))),pe=m=>{a.restrictedModels.includes(m)||a.restrictedModels.push(m)},$e=()=>{if(H.value&&H.value.trim()){const m=H.value.trim();a.tags.includes(m)||a.tags.push(m),H.value=""}},h=m=>{a.tags.includes(m)||a.tags.push(m)},o=m=>{a.tags.splice(m,1)},n=()=>a.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天"}],p=()=>{a.activationUnit==="hours"?a.activationDays>24&&(a.activationDays=24):a.activationDays<1&&(a.activationDays=1)},k=async()=>{if(Q.value.name="",!a.name||!a.name.trim()){Q.value.name="请输入API Key名称";return}if(a.createType==="batch"&&(!a.batchCount||a.batchCount<2||a.batchCount>500)){E("批量创建数量必须在 2-500 之间","error");return}if(a.rateLimitWindow&&(!a.rateLimitCost||parseFloat(a.rateLimitCost)===0)){let m=!1;if(window.showConfirm?m=await window.showConfirm("费用限制提醒",`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
|
||
是否继续?`,"继续创建","返回修改"):m=confirm(`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
是否继续?`),!m)return}U.value=!0;try{const m={description:a.description||void 0,tokenLimit:0,rateLimitWindow:a.rateLimitWindow!==""&&a.rateLimitWindow!==null?parseInt(a.rateLimitWindow):null,rateLimitRequests:a.rateLimitRequests!==""&&a.rateLimitRequests!==null?parseInt(a.rateLimitRequests):null,rateLimitCost:a.rateLimitCost!==""&&a.rateLimitCost!==null?parseFloat(a.rateLimitCost):null,concurrencyLimit:a.concurrencyLimit!==""&&a.concurrencyLimit!==null?parseInt(a.concurrencyLimit):0,dailyCostLimit:a.dailyCostLimit!==""&&a.dailyCostLimit!==null?parseFloat(a.dailyCostLimit):0,totalCostLimit:a.totalCostLimit!==""&&a.totalCostLimit!==null?parseFloat(a.totalCostLimit):0,weeklyOpusCostLimit:a.weeklyOpusCostLimit!==""&&a.weeklyOpusCostLimit!==null?parseFloat(a.weeklyOpusCostLimit):0,expiresAt:a.expirationMode==="fixed"&&a.expiresAt||void 0,expirationMode:a.expirationMode,activationDays:a.expirationMode==="activation"?a.activationDays:void 0,activationUnit:a.expirationMode==="activation"?a.activationUnit:void 0,permissions:a.permissions,tags:a.tags.length>0?a.tags:void 0,enableModelRestriction:a.enableModelRestriction,restrictedModels:a.restrictedModels,enableClientRestriction:a.enableClientRestriction,allowedClients:a.allowedClients};if(a.claudeAccountId&&(a.claudeAccountId.startsWith("console:")?(m.claudeConsoleAccountId=a.claudeAccountId.substring(8),delete m.claudeAccountId):(m.claudeAccountId=a.claudeAccountId,delete m.claudeConsoleAccountId)),a.geminiAccountId&&(m.geminiAccountId=a.geminiAccountId),a.openaiAccountId&&(m.openaiAccountId=a.openaiAccountId),a.bedrockAccountId&&(m.bedrockAccountId=a.bedrockAccountId),a.droidAccountId&&(m.droidAccountId=a.droidAccountId),a.createType==="single"){const l={...m,name:a.name},x=await q.post("/admin/api-keys",l);x.success?(E("API Key 创建成功","success"),P("success",x.data),P("close")):E(x.message||"创建失败","error")}else{const l={...m,createType:"batch",baseName:a.name,count:a.batchCount},x=await q.post("/admin/api-keys/batch",l);x.success?(E(`成功创建 ${x.data.length} 个 API Key`,"success"),P("batch-success",x.data),P("close")):E(x.message||"批量创建失败","error")}}catch{E("创建失败","error")}finally{U.value=!1}};return(m,l)=>(i(),Ae(Ve,{to:"body"},[e("div",Ha,[e("div",Ya,[e("div",Qa,[l[49]||(l[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:l[0]||(l[0]=x=>m.$emit("close"))},l[48]||(l[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:Le(k,["prevent"])},[e("div",Ja,[e("div",{class:G(["flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",a.createType==="batch"?"mb-3":""])},[l[52]||(l[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",Xa,[e("label",Za,[_(e("input",{"onUpdate:modelValue":l[1]||(l[1]=x=>a.createType=x),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),[[ce,a.createType]]),l[50]||(l[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"}),$(" 单个创建 ")],-1))]),e("label",er,[_(e("input",{"onUpdate:modelValue":l[2]||(l[2]=x=>a.createType=x),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),[[ce,a.createType]]),l[51]||(l[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"}),$(" 批量创建 ")],-1))])])],2),a.createType==="batch"?(i(),d("div",tr,[e("div",sr,[e("div",ar,[l[54]||(l[54]=e("label",{class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"},"创建数量",-1)),e("div",rr,[_(e("input",{"onUpdate:modelValue":l[3]||(l[3]=x=>a.batchCount=x),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),[[ee,a.batchCount,void 0,{number:!0}]]),l[53]||(l[53]=e("div",{class:"whitespace-nowrap text-xs text-gray-500 dark:text-gray-400"}," 最大支持 500 个 ",-1))])])]),e("p",or,[l[55]||(l[55]=e("i",{class:"fas fa-info-circle mr-1 mt-0.5 flex-shrink-0"},null,-1)),e("span",null,"批量创建时,每个 Key 的名称会自动添加序号后缀,例如:"+u(a.name||"MyKey")+"_1, "+u(a.name||"MyKey")+"_2 ...",1)])])):A("",!0)]),e("div",null,[l[56]||(l[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"},[$("名称 "),e("span",{class:"text-red-500"},"*")],-1)),e("div",null,[_(e("input",{"onUpdate:modelValue":l[4]||(l[4]=x=>a.name=x),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":Q.value.name}]),placeholder:a.createType==="batch"?"输入基础名称(将自动添加序号)":"为您的 API Key 取一个名称",required:"",type:"text",onInput:l[5]||(l[5]=x=>Q.value.name="")},null,42,lr),[[ee,a.name]])]),Q.value.name?(i(),d("p",ir,u(Q.value.name),1)):A("",!0)]),e("div",null,[l[64]||(l[64]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"标签",-1)),e("div",nr,[a.tags.length>0?(i(),d("div",dr,[l[58]||(l[58]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 已选择的标签: ",-1)),e("div",ur,[(i(!0),d(X,null,re(a.tags,(x,oe)=>(i(),d("span",{key:"selected-"+oe,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"},[$(u(x)+" ",1),e("button",{class:"ml-1 hover:text-blue-900 dark:hover:text-blue-300",type:"button",onClick:xe=>o(oe)},l[57]||(l[57]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,cr)]))),128))])])):A("",!0),D.value.length>0?(i(),d("div",gr,[l[60]||(l[60]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",pr,[(i(!0),d(X,null,re(D.value,x=>(i(),d("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-400",type:"button",onClick:oe=>h(x)},[l[59]||(l[59]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),$(" "+u(x),1)],8,mr))),128))])])):A("",!0),e("div",null,[l[62]||(l[62]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",xr,[_(e("input",{"onUpdate:modelValue":l[6]||(l[6]=x=>H.value=x),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:lt(Le($e,["prevent"]),["enter"])},null,40,yr),[[ee,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:$e},l[61]||(l[61]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),l[63]||(l[63]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 用于标记不同团队或用途,方便筛选管理 ",-1))])]),e("div",fr,[l[72]||(l[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",br,[e("div",vr,[e("div",null,[l[65]||(l[65]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"时间窗口 (分钟)",-1)),_(e("input",{"onUpdate:modelValue":l[7]||(l[7]=x=>a.rateLimitWindow=x),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),[[ee,a.rateLimitWindow]]),l[66]||(l[66]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"时间段单位",-1))]),e("div",null,[l[67]||(l[67]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"请求次数限制",-1)),_(e("input",{"onUpdate:modelValue":l[8]||(l[8]=x=>a.rateLimitRequests=x),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),[[ee,a.rateLimitRequests]]),l[68]||(l[68]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大请求",-1))]),e("div",null,[l[69]||(l[69]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),_(e("input",{"onUpdate:modelValue":l[9]||(l[9]=x=>a.rateLimitCost=x),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),[[ee,a.rateLimitCost]]),l[70]||(l[70]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大费用",-1))])]),l[71]||(l[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:"),$(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求 ")]),e("div",null,[e("strong",null,"示例2:"),$(" 时间窗口=1,费用=0.1 → 每分钟最多$0.1费用")]),e("div",null,[e("strong",null,"示例3:"),$(" 窗口=30,请求=50,费用=5 → 每30分钟50次请求且不超$5费用 ")])])],-1))])]),e("div",null,[l[74]||(l[74]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"每日费用限制 (美元)",-1)),e("div",kr,[e("div",wr,[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:l[10]||(l[10]=x=>a.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:l[11]||(l[11]=x=>a.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:l[12]||(l[12]=x=>a.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:l[13]||(l[13]=x=>a.dailyCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":l[14]||(l[14]=x=>a.dailyCostLimit=x),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),[[ee,a.dailyCostLimit]]),l[73]||(l[73]=e("p",{class:"dark:text灰-400 text-xs text-gray-500"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[l[76]||(l[76]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"总费用限制 (美元)",-1)),e("div",hr,[e("div",Ar,[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:l[15]||(l[15]=x=>a.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:l[16]||(l[16]=x=>a.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:l[17]||(l[17]=x=>a.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:l[18]||(l[18]=x=>a.totalCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":l[19]||(l[19]=x=>a.totalCostLimit=x),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),[[ee,a.totalCostLimit]]),l[75]||(l[75]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 的累计总费用限制,达到限制后将拒绝所有后续请求,0 或留空表示无限制 ",-1))])]),e("div",null,[l[78]||(l[78]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"Opus 模型周费用限制 (美元)",-1)),e("div",$r,[e("div",Cr,[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:l[20]||(l[20]=x=>a.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:l[21]||(l[21]=x=>a.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:l[22]||(l[22]=x=>a.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:l[23]||(l[23]=x=>a.weeklyOpusCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":l[24]||(l[24]=x=>a.weeklyOpusCostLimit=x),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),[[ee,a.weeklyOpusCostLimit]]),l[77]||(l[77]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户,0 或留空表示无限制 ",-1))])]),e("div",null,[l[79]||(l[79]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制 (可选)",-1)),_(e("input",{"onUpdate:modelValue":l[25]||(l[25]=x=>a.concurrencyLimit=x),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),[[ee,a.concurrencyLimit]]),l[80]||(l[80]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 可同时处理的最大请求数,0 或留空表示无限制 ",-1))]),e("div",null,[l[81]||(l[81]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"备注 (可选)",-1)),_(e("textarea",{"onUpdate:modelValue":l[26]||(l[26]=x=>a.description=x),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),[[ee,a.description]])]),e("div",null,[l[89]||(l[89]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"过期设置",-1)),e("div",Ir,[e("div",Kr,[e("label",Lr,[_(e("input",{"onUpdate:modelValue":l[27]||(l[27]=x=>a.expirationMode=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"fixed"},null,512),[[ce,a.expirationMode]]),l[82]||(l[82]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"固定时间过期",-1))]),e("label",Dr,[_(e("input",{"onUpdate:modelValue":l[28]||(l[28]=x=>a.expirationMode=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"activation"},null,512),[[ce,a.expirationMode]]),l[83]||(l[83]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"首次使用后激活",-1))])]),e("p",_r,[a.expirationMode==="fixed"?(i(),d("span",Tr,l[84]||(l[84]=[e("i",{class:"fas fa-info-circle mr-1"},null,-1),$(" 固定时间模式:Key 创建后立即生效,按设定时间过期(支持小时和天数) ",-1)]))):(i(),d("span",Sr,l[85]||(l[85]=[e("i",{class:"fas fa-info-circle mr-1"},null,-1),$(" 激活模式:Key 首次使用时激活,激活后按设定时间过期(支持小时和天数,适合批量销售) ",-1)])))])]),a.expirationMode==="fixed"?(i(),d("div",Ur,[_(e("select",{"onUpdate:modelValue":l[29]||(l[29]=x=>a.expireDuration=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",onChange:W},l[86]||(l[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),[[it,a.expireDuration]]),a.expireDuration==="custom"?(i(),d("div",Pr,[_(e("input",{"onUpdate:modelValue":l[30]||(l[30]=x=>a.customExpireDate=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",min:T.value,type:"datetime-local",onChange:I},null,40,Rr),[[ee,a.customExpireDate]])])):A("",!0),a.expiresAt?(i(),d("p",Mr," 将于 "+u(K(a.expiresAt))+" 过期 ",1)):A("",!0)])):(i(),d("div",Vr,[e("div",Er,[_(e("input",{"onUpdate:modelValue":l[31]||(l[31]=x=>a.activationDays=x),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",max:a.activationUnit==="hours"?8760:3650,min:"1",placeholder:a.activationUnit==="hours"?"输入小时数":"输入天数",type:"number"},null,8,Or),[[ee,a.activationDays,void 0,{number:!0}]]),_(e("select",{"onUpdate:modelValue":l[32]||(l[32]=x=>a.activationUnit=x),class:"form-input w-20 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",onChange:p},l[87]||(l[87]=[e("option",{value:"hours"},"小时",-1),e("option",{value:"days"},"天",-1)]),544),[[it,a.activationUnit]])]),e("div",jr,[(i(!0),d(X,null,re(n(),x=>(i(),d("button",{key:x.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:oe=>a.activationDays=x.value},u(x.label),9,Gr))),128))]),e("p",qr,[l[88]||(l[88]=e("i",{class:"fas fa-clock mr-1"},null,-1)),$(" Key 将在首次使用后激活,激活后 "+u(a.activationDays||(a.activationUnit==="hours"?24:30))+" "+u(a.activationUnit==="hours"?"小时":"天")+"过期 ",1)])]))]),e("div",null,[l[95]||(l[95]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",zr,[e("label",Fr,[_(e("input",{"onUpdate:modelValue":l[33]||(l[33]=x=>a.permissions=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"all"},null,512),[[ce,a.permissions]]),l[90]||(l[90]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"全部服务",-1))]),e("label",Wr,[_(e("input",{"onUpdate:modelValue":l[34]||(l[34]=x=>a.permissions=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"claude"},null,512),[[ce,a.permissions]]),l[91]||(l[91]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Claude",-1))]),e("label",Br,[_(e("input",{"onUpdate:modelValue":l[35]||(l[35]=x=>a.permissions=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"gemini"},null,512),[[ce,a.permissions]]),l[92]||(l[92]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Gemini",-1))]),e("label",Nr,[_(e("input",{"onUpdate:modelValue":l[36]||(l[36]=x=>a.permissions=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"openai"},null,512),[[ce,a.permissions]]),l[93]||(l[93]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 OpenAI",-1))]),e("label",Hr,[_(e("input",{"onUpdate:modelValue":l[37]||(l[37]=x=>a.permissions=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"droid"},null,512),[[ce,a.permissions]]),l[94]||(l[94]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Droid",-1))])]),l[96]||(l[96]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 控制此 API Key 可以访问哪些服务 ",-1))]),e("div",null,[e("div",Yr,[l[97]||(l[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:F.value,title:"刷新账号列表",type:"button",onClick:j},[e("i",{class:G(["fas",F.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,u(F.value?"刷新中...":"刷新账号"),1)],8,Qr)]),e("div",Jr,[e("div",null,[l[98]||(l[98]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),ae(Ie,{modelValue:a.claudeAccountId,"onUpdate:modelValue":l[38]||(l[38]=x=>a.claudeAccountId=x),accounts:S.value.claude,"default-option-text":"使用共享账号池",disabled:a.permissions!=="all"&&a.permissions!=="claude",groups:S.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[l[99]||(l[99]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),ae(Ie,{modelValue:a.geminiAccountId,"onUpdate:modelValue":l[39]||(l[39]=x=>a.geminiAccountId=x),accounts:S.value.gemini,"default-option-text":"使用共享账号池",disabled:a.permissions!=="all"&&a.permissions!=="gemini",groups:S.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[l[100]||(l[100]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),ae(Ie,{modelValue:a.openaiAccountId,"onUpdate:modelValue":l[40]||(l[40]=x=>a.openaiAccountId=x),accounts:S.value.openai,"default-option-text":"使用共享账号池",disabled:a.permissions!=="all"&&a.permissions!=="openai",groups:S.value.openaiGroups,placeholder:"请选择OpenAI账号",platform:"openai"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[l[101]||(l[101]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),ae(Ie,{modelValue:a.bedrockAccountId,"onUpdate:modelValue":l[41]||(l[41]=x=>a.bedrockAccountId=x),accounts:S.value.bedrock,"default-option-text":"使用共享账号池",disabled:a.permissions!=="all"&&a.permissions!=="openai",groups:[],placeholder:"请选择Bedrock账号",platform:"bedrock"},null,8,["modelValue","accounts","disabled"])]),e("div",null,[l[102]||(l[102]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),ae(Ie,{modelValue:a.droidAccountId,"onUpdate:modelValue":l[42]||(l[42]=x=>a.droidAccountId=x),accounts:S.value.droid,"default-option-text":"使用共享账号池",disabled:a.permissions!=="all"&&a.permissions!=="droid",groups:S.value.droidGroups,placeholder:"请选择Droid账号",platform:"droid"},null,8,["modelValue","accounts","disabled","groups"])])]),l[103]||(l[103]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 选择专属账号后,此API Key将只使用该账号,不选择则使用共享账号池 ",-1))]),e("div",null,[e("div",Xr,[_(e("input",{id:"enableModelRestriction","onUpdate:modelValue":l[43]||(l[43]=x=>a.enableModelRestriction=x),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[Pe,a.enableModelRestriction]]),l[104]||(l[104]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"enableModelRestriction"}," 启用模型限制 ",-1))]),a.enableModelRestriction?(i(),d("div",Zr,[e("div",null,[l[107]||(l[107]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600"},"限制的模型列表",-1)),e("div",eo,[(i(!0),d(X,null,re(a.restrictedModels,(x,oe)=>(i(),d("span",{key:oe,class:"inline-flex items-center rounded-full bg-red-100 px-3 py-1 text-sm text-red-800"},[$(u(x)+" ",1),e("button",{class:"ml-2 text-red-600 hover:text-red-800",type:"button",onClick:xe=>ne(oe)},l[105]||(l[105]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,to)]))),128)),a.restrictedModels.length===0?(i(),d("span",so," 暂无限制的模型 ")):A("",!0)]),e("div",ao,[e("div",ro,[(i(!0),d(X,null,re(ke.value,x=>(i(),d("button",{key:x,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:oe=>pe(x)},u(x),9,oo))),128)),ke.value.length===0?(i(),d("span",lo," 所有常用模型已在限制列表中 ")):A("",!0)]),e("div",io,[_(e("input",{"onUpdate:modelValue":l[44]||(l[44]=x=>a.modelInput=x),class:"form-input flex-1",placeholder:"输入模型名称,按回车添加",type:"text",onKeydown:lt(Le(te,["prevent"]),["enter"])},null,40,no),[[ee,a.modelInput]]),e("button",{class:"rounded-lg bg-red-500 px-4 py-2 text-white transition-colors hover:bg-red-600",type:"button",onClick:te},l[106]||(l[106]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),l[108]||(l[108]=e("p",{class:"mt-2 text-xs text-gray-500"}," 设置此API Key无法访问的模型,例如:claude-opus-4-20250514 ",-1))])])):A("",!0)]),e("div",null,[e("div",uo,[_(e("input",{id:"enableClientRestriction","onUpdate:modelValue":l[45]||(l[45]=x=>a.enableClientRestriction=x),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[Pe,a.enableClientRestriction]]),l[109]||(l[109]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"enableClientRestriction"}," 启用客户端限制 ",-1))]),a.enableClientRestriction?(i(),d("div",co,[e("div",null,[l[110]||(l[110]=e("label",{class:"mb-2 block text-xs font-medium text-gray-700 dark:text-gray-300"},"允许的客户端",-1)),e("div",go,[(i(!0),d(X,null,re(y.value,x=>(i(),d("div",{key:x.id,class:"flex items-start"},[_(e("input",{id:`client_${x.id}`,"onUpdate:modelValue":l[46]||(l[46]=oe=>a.allowedClients=oe),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:x.id},null,8,po),[[Pe,a.allowedClients]]),e("label",{class:"ml-2 flex-1 cursor-pointer",for:`client_${x.id}`},[e("span",xo,u(x.name),1),e("span",yo,u(x.description),1)],8,mo)]))),128))])])])):A("",!0)]),e("div",fo,[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:l[47]||(l[47]=x=>m.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-4 py-2.5 text-sm font-semibold",disabled:U.value,type:"submit"},[U.value?(i(),d("div",vo)):(i(),d("i",ko)),$(" "+u(U.value?"创建中...":"创建"),1)],8,bo)])],32)])])]))}},ho=Se(wo,[["__scopeId","data-v-f400ad8a"]]),Ao={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},$o={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6 md:p-8"},Co={class:"mb-4 flex items-center justify-between sm:mb-6"},Io=["value"],Ko={key:0,class:"text-gray-500"},Lo={class:"space-y-4"},Do={key:0},_o={class:"flex flex-wrap gap-2"},To=["onClick"],So={key:1},Uo={class:"flex flex-wrap gap-2"},Po=["onClick"],Ro={class:"flex gap-2"},Mo=["onKeypress"],Vo={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},Eo={class:"space-y-2"},Oo={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},jo={class:"space-y-3"},Go={class:"flex gap-2"},qo={class:"space-y-3"},zo={class:"flex gap-2"},Fo={class:"space-y-3"},Wo={class:"flex gap-2"},Bo={class:"mb-3 flex items-center"},No={class:"flex gap-4"},Ho={class:"flex cursor-pointer items-center"},Yo={class:"flex cursor-pointer items-center"},Qo={class:"flex cursor-pointer items-center"},Jo={class:"flex cursor-pointer items-center"},Xo={class:"flex cursor-pointer items-center"},Zo={class:"mb-3 flex items-center justify-between"},el=["disabled"],tl={class:"grid grid-cols-1 gap-3"},sl={class:"mb-3 flex items-center"},al={key:0,class:"space-y-3"},rl={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"},ol=["onClick"],ll={key:0,class:"text-sm text-gray-400 dark:text-gray-500"},il={class:"space-y-3"},nl={class:"flex flex-wrap gap-2"},dl=["onClick"],ul={key:0,class:"text-sm italic text-gray-400 dark:text-gray-500"},cl={class:"flex gap-2"},gl=["onKeydown"],pl={class:"mb-3 flex items-center"},ml={key:0,class:"space-y-3"},xl={class:"space-y-2"},yl=["id","value"],fl=["for"],bl={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},vl={class:"block text-xs text-gray-500 dark:text-gray-400"},kl={class:"flex gap-3 pt-4"},wl=["disabled"],hl={key:0,class:"loading-spinner mr-2"},Al={key:1,class:"fas fa-save mr-2"},$l={__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:N}){const c=w,P=N,B=jt(),C=Gt(),U=L(!1),F=L(!1),S=L({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),Q=L([]),H=L([]),f=L(""),D=L([]),y=O(()=>D.value.filter(h=>!a.tags.includes(h))),a=He({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=()=>{a.modelInput&&!a.restrictedModels.includes(a.modelInput)&&(a.restrictedModels.push(a.modelInput),a.modelInput="")},T=h=>{a.restrictedModels.splice(h,1)},W=L(["claude-opus-4-20250514","claude-opus-4-1-20250805"]),I=O(()=>W.value.filter(h=>!a.restrictedModels.includes(h))),K=h=>{a.restrictedModels.includes(h)||a.restrictedModels.push(h)},te=()=>{if(f.value&&f.value.trim()){const h=f.value.trim();a.tags.includes(h)||a.tags.push(h),f.value=""}},ne=h=>{a.tags.includes(h)||a.tags.push(h)},ue=h=>{a.tags.splice(h,1)},ke=async()=>{if(a.rateLimitWindow&&(!a.rateLimitCost||parseFloat(a.rateLimitCost)===0)){let h=!1;if(window.showConfirm?h=await window.showConfirm("费用限制提醒",`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
|
||
是否继续?`,"继续保存","返回修改"):h=confirm(`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
是否继续?`),!h)return}U.value=!0;try{const h={name:a.name,tokenLimit:0,rateLimitWindow:a.rateLimitWindow!==""&&a.rateLimitWindow!==null?parseInt(a.rateLimitWindow):0,rateLimitRequests:a.rateLimitRequests!==""&&a.rateLimitRequests!==null?parseInt(a.rateLimitRequests):0,rateLimitCost:a.rateLimitCost!==""&&a.rateLimitCost!==null?parseFloat(a.rateLimitCost):0,concurrencyLimit:a.concurrencyLimit!==""&&a.concurrencyLimit!==null?parseInt(a.concurrencyLimit):0,dailyCostLimit:a.dailyCostLimit!==""&&a.dailyCostLimit!==null?parseFloat(a.dailyCostLimit):0,totalCostLimit:a.totalCostLimit!==""&&a.totalCostLimit!==null?parseFloat(a.totalCostLimit):0,weeklyOpusCostLimit:a.weeklyOpusCostLimit!==""&&a.weeklyOpusCostLimit!==null?parseFloat(a.weeklyOpusCostLimit):0,permissions:a.permissions,tags:a.tags};a.claudeAccountId?a.claudeAccountId.startsWith("console:")?(h.claudeConsoleAccountId=a.claudeAccountId.substring(8),h.claudeAccountId=null):(a.claudeAccountId.startsWith("group:"),h.claudeAccountId=a.claudeAccountId,h.claudeConsoleAccountId=null):(h.claudeAccountId=null,h.claudeConsoleAccountId=null),a.geminiAccountId?h.geminiAccountId=a.geminiAccountId:h.geminiAccountId=null,a.openaiAccountId?h.openaiAccountId=a.openaiAccountId:h.openaiAccountId=null,a.bedrockAccountId?h.bedrockAccountId=a.bedrockAccountId:h.bedrockAccountId=null,a.droidAccountId?h.droidAccountId=a.droidAccountId:h.droidAccountId=null,h.enableModelRestriction=a.enableModelRestriction,h.restrictedModels=a.restrictedModels,h.enableClientRestriction=a.enableClientRestriction,h.allowedClients=a.allowedClients,h.isActive=a.isActive,a.ownerId!==void 0&&(h.ownerId=a.ownerId);const o=await q.put(`/admin/api-keys/${c.apiKey.id}`,h);o.success?(P("success"),P("close")):E(o.message||"更新失败","error")}catch{E("更新失败","error")}finally{U.value=!1}},pe=async()=>{var h,o;F.value=!0;try{const[n,p,k,m,l,x,oe,xe,be]=await Promise.all([q.get("/admin/claude-accounts"),q.get("/admin/claude-console-accounts"),q.get("/admin/gemini-accounts"),q.get("/admin/gemini-api-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=[];n.success&&((h=n.data)==null||h.forEach(Y=>{me.push({...Y,platform:"claude-oauth",isDedicated:Y.accountType==="dedicated"})})),p.success&&((o=p.data)==null||o.forEach(Y=>{me.push({...Y,platform:"claude-console",isDedicated:Y.accountType==="dedicated"})})),S.value.claude=me;const we=[];k.success&&(k.data||[]).forEach(Y=>{we.push({...Y,platform:"gemini",isDedicated:Y.accountType==="dedicated"})}),m.success&&(m.data||[]).forEach(Y=>{we.push({...Y,platform:"gemini-api",isDedicated:Y.accountType==="dedicated"})}),S.value.gemini=we;const ye=[];if(l.success&&(l.data||[]).forEach(Y=>{ye.push({...Y,platform:"openai",isDedicated:Y.accountType==="dedicated"})}),x.success&&(x.data||[]).forEach(Y=>{ye.push({...Y,platform:"openai-responses",isDedicated:Y.accountType==="dedicated"})}),S.value.openai=ye,oe.success&&(S.value.bedrock=(oe.data||[]).map(Y=>({...Y,isDedicated:Y.accountType==="dedicated"}))),xe.success&&(S.value.droid=(xe.data||[]).map(Y=>({...Y,platform:"droid",isDedicated:Y.accountType==="dedicated"}))),be.success){const Y=be.data||[];S.value.claudeGroups=Y.filter(J=>J.platform==="claude"),S.value.geminiGroups=Y.filter(J=>J.platform==="gemini"),S.value.openaiGroups=Y.filter(J=>J.platform==="openai"),S.value.droidGroups=Y.filter(J=>J.platform==="droid")}E("账号列表已刷新","success")}catch{E("刷新账号列表失败","error")}finally{F.value=!1}},$e=async()=>{try{const h=await q.get("/admin/users");h.success&&(H.value=h.data||[])}catch{H.value=[{id:"admin",username:"admin",displayName:"Admin",email:"",role:"admin"}]}};return nt(async()=>{try{const[h,o]=await Promise.all([B.loadSupportedClients(),C.fetchTags(),$e()]);Q.value=h||[],D.value=o||[]}catch{Q.value=[],D.value=[]}if(c.accounts){const h=(c.accounts.gemini||[]).map(n=>({...n,platform:n.platform||"gemini"})),o=[];c.accounts.openai&&c.accounts.openai.forEach(n=>{o.push({...n,platform:n.platform||"openai"})}),c.accounts.openaiResponses&&c.accounts.openaiResponses.forEach(n=>{o.push({...n,platform:n.platform||"openai-responses"})}),S.value={claude:c.accounts.claude||[],gemini:h,openai:o,bedrock:c.accounts.bedrock||[],droid:(c.accounts.droid||[]).map(n=>({...n,platform:n.platform||"droid"})),claudeGroups:c.accounts.claudeGroups||[],geminiGroups:c.accounts.geminiGroups||[],openaiGroups:c.accounts.openaiGroups||[],droidGroups:c.accounts.droidGroups||[]}}a.name=c.apiKey.name,a.tokenLimit=c.apiKey.tokenLimit||"",a.rateLimitCost=c.apiKey.rateLimitCost||"",c.apiKey.tokenLimit>0&&c.apiKey.rateLimitCost,a.rateLimitWindow=c.apiKey.rateLimitWindow||"",a.rateLimitRequests=c.apiKey.rateLimitRequests||"",a.concurrencyLimit=c.apiKey.concurrencyLimit||"",a.dailyCostLimit=c.apiKey.dailyCostLimit||"",a.totalCostLimit=c.apiKey.totalCostLimit||"",a.weeklyOpusCostLimit=c.apiKey.weeklyOpusCostLimit||"",a.permissions=c.apiKey.permissions||"all",c.apiKey.claudeConsoleAccountId?a.claudeAccountId=`console:${c.apiKey.claudeConsoleAccountId}`:a.claudeAccountId=c.apiKey.claudeAccountId||"",a.geminiAccountId=c.apiKey.geminiAccountId||"",a.openaiAccountId=c.apiKey.openaiAccountId||"",a.bedrockAccountId=c.apiKey.bedrockAccountId||"",a.droidAccountId=c.apiKey.droidAccountId||"",a.restrictedModels=c.apiKey.restrictedModels||[],a.allowedClients=c.apiKey.allowedClients||[],a.tags=c.apiKey.tags||[],a.enableModelRestriction=c.apiKey.enableModelRestriction===!0||c.apiKey.enableModelRestriction==="true",a.enableClientRestriction=c.apiKey.enableClientRestriction===!0||c.apiKey.enableClientRestriction==="true",a.isActive=c.apiKey.isActive===void 0||c.apiKey.isActive===!0||c.apiKey.isActive==="true",a.ownerId=c.apiKey.userId||"admin"}),(h,o)=>(i(),Ae(Ve,{to:"body"},[e("div",Ao,[e("div",$o,[e("div",Co,[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]=n=>h.$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:Le(ke,["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]=n=>a.name=n),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),[[ee,a.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]=n=>a.ownerId=n),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200"},[(i(!0),d(X,null,re(H.value,n=>(i(),d("option",{key:n.id,value:n.id},[$(u(n.displayName)+" ("+u(n.username)+") ",1),n.role==="admin"?(i(),d("span",Ko,"- 管理员")):A("",!0)],8,Io))),128))],512),[[it,a.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",Lo,[a.tags.length>0?(i(),d("div",Do,[o[46]||(o[46]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 已选择的标签: ",-1)),e("div",_o,[(i(!0),d(X,null,re(a.tags,(n,p)=>(i(),d("span",{key:"selected-"+p,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"},[$(u(n)+" ",1),e("button",{class:"ml-1 hover:text-blue-900 dark:hover:text-blue-300",type:"button",onClick:k=>ue(p)},o[45]||(o[45]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,To)]))),128))])])):A("",!0),y.value.length>0?(i(),d("div",So,[o[48]||(o[48]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",Uo,[(i(!0),d(X,null,re(y.value,n=>(i(),d("button",{key:"available-"+n,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:p=>ne(n)},[o[47]||(o[47]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),$(" "+u(n),1)],8,Po))),128))])])):A("",!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",Ro,[_(e("input",{"onUpdate:modelValue":o[3]||(o[3]=n=>f.value=n),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:lt(Le(te,["prevent"]),["enter"])},null,40,Mo),[[ee,f.value]]),e("button",{class:"rounded-lg bg-green-500 px-4 py-2 text-white transition-colors hover:bg-green-600",type:"button",onClick:te},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",Vo,[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",Eo,[e("div",Oo,[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]=n=>a.rateLimitWindow=n),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),[[ee,a.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]=n=>a.rateLimitRequests=n),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),[[ee,a.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]=n=>a.rateLimitCost=n),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),[[ee,a.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:"),$(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求 ")]),e("div",null,[e("strong",null,"示例2:"),$(" 时间窗口=1,费用=0.1 → 每分钟最多$0.1费用")]),e("div",null,[e("strong",null,"示例3:"),$(" 窗口=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",jo,[e("div",Go,[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]=n=>a.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]=n=>a.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]=n=>a.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]=n=>a.dailyCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":o[11]||(o[11]=n=>a.dailyCostLimit=n),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),[[ee,a.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",qo,[e("div",zo,[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]=n=>a.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]=n=>a.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]=n=>a.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]=n=>a.totalCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":o[16]||(o[16]=n=>a.totalCostLimit=n),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),[[ee,a.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",Fo,[e("div",Wo,[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]=n=>a.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]=n=>a.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]=n=>a.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]=n=>a.weeklyOpusCostLimit="")}," 自定义 ")]),_(e("input",{"onUpdate:modelValue":o[21]||(o[21]=n=>a.weeklyOpusCostLimit=n),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),[[ee,a.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]=n=>a.concurrencyLimit=n),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),[[ee,a.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",Bo,[_(e("input",{id:"editIsActive","onUpdate:modelValue":o[23]||(o[23]=n=>a.isActive=n),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),[[Pe,a.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",No,[e("label",Ho,[_(e("input",{"onUpdate:modelValue":o[24]||(o[24]=n=>a.permissions=n),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"all"},null,512),[[ce,a.permissions]]),o[71]||(o[71]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"全部服务",-1))]),e("label",Yo,[_(e("input",{"onUpdate:modelValue":o[25]||(o[25]=n=>a.permissions=n),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"claude"},null,512),[[ce,a.permissions]]),o[72]||(o[72]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Claude",-1))]),e("label",Qo,[_(e("input",{"onUpdate:modelValue":o[26]||(o[26]=n=>a.permissions=n),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"gemini"},null,512),[[ce,a.permissions]]),o[73]||(o[73]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Gemini",-1))]),e("label",Jo,[_(e("input",{"onUpdate:modelValue":o[27]||(o[27]=n=>a.permissions=n),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"openai"},null,512),[[ce,a.permissions]]),o[74]||(o[74]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 OpenAI",-1))]),e("label",Xo,[_(e("input",{"onUpdate:modelValue":o[28]||(o[28]=n=>a.permissions=n),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"droid"},null,512),[[ce,a.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",Zo,[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:F.value,title:"刷新账号列表",type:"button",onClick:pe},[e("i",{class:G(["fas",F.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,u(F.value?"刷新中...":"刷新账号"),1)],8,el)]),e("div",tl,[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)),ae(Ie,{modelValue:a.claudeAccountId,"onUpdate:modelValue":o[29]||(o[29]=n=>a.claudeAccountId=n),accounts:S.value.claude,"default-option-text":"使用共享账号池",disabled:a.permissions!=="all"&&a.permissions!=="claude",groups:S.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)),ae(Ie,{modelValue:a.geminiAccountId,"onUpdate:modelValue":o[30]||(o[30]=n=>a.geminiAccountId=n),accounts:S.value.gemini,"default-option-text":"使用共享账号池",disabled:a.permissions!=="all"&&a.permissions!=="gemini",groups:S.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)),ae(Ie,{modelValue:a.openaiAccountId,"onUpdate:modelValue":o[31]||(o[31]=n=>a.openaiAccountId=n),accounts:S.value.openai,"default-option-text":"使用共享账号池",disabled:a.permissions!=="all"&&a.permissions!=="openai",groups:S.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)),ae(Ie,{modelValue:a.bedrockAccountId,"onUpdate:modelValue":o[32]||(o[32]=n=>a.bedrockAccountId=n),accounts:S.value.bedrock,"default-option-text":"使用共享账号池",disabled:a.permissions!=="all"&&a.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)),ae(Ie,{modelValue:a.droidAccountId,"onUpdate:modelValue":o[33]||(o[33]=n=>a.droidAccountId=n),accounts:S.value.droid,"default-option-text":"使用共享账号池",disabled:a.permissions!=="all"&&a.permissions!=="droid",groups:S.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",sl,[_(e("input",{id:"editEnableModelRestriction","onUpdate:modelValue":o[34]||(o[34]=n=>a.enableModelRestriction=n),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),[[Pe,a.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))]),a.enableModelRestriction?(i(),d("div",al,[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",rl,[(i(!0),d(X,null,re(a.restrictedModels,(n,p)=>(i(),d("span",{key:p,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"},[$(u(n)+" ",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:k=>T(p)},o[86]||(o[86]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,ol)]))),128)),a.restrictedModels.length===0?(i(),d("span",ll," 暂无限制的模型 ")):A("",!0)]),e("div",il,[e("div",nl,[(i(!0),d(X,null,re(I.value,n=>(i(),d("button",{key:n,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:p=>K(n)},u(n),9,dl))),128)),I.value.length===0?(i(),d("span",ul," 所有常用模型已在限制列表中 ")):A("",!0)]),e("div",cl,[_(e("input",{"onUpdate:modelValue":o[35]||(o[35]=n=>a.modelInput=n),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:lt(Le(j,["prevent"]),["enter"])},null,40,gl),[[ee,a.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))])])):A("",!0)]),e("div",null,[e("div",pl,[_(e("input",{id:"editEnableClientRestriction","onUpdate:modelValue":o[36]||(o[36]=n=>a.enableClientRestriction=n),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),[[Pe,a.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))]),a.enableClientRestriction?(i(),d("div",ml,[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",xl,[(i(!0),d(X,null,re(Q.value,n=>(i(),d("div",{key:n.id,class:"flex items-start"},[_(e("input",{id:`edit_client_${n.id}`,"onUpdate:modelValue":o[37]||(o[37]=p=>a.allowedClients=p),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:n.id},null,8,yl),[[Pe,a.allowedClients]]),e("label",{class:"ml-2 flex-1 cursor-pointer",for:`edit_client_${n.id}`},[e("span",bl,u(n.name),1),e("span",vl,u(n.description),1)],8,fl)]))),128))])])])):A("",!0)]),e("div",kl,[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]=n=>h.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:U.value,type:"submit"},[U.value?(i(),d("div",hl)):(i(),d("i",Al)),$(" "+u(U.value?"保存中...":"保存修改"),1)],8,wl)])],32)])])]))}},Cl=Se($l,[["__scopeId","data-v-fba61ad2"]]),Il={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},Kl={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-md flex-col p-8"},Ll={class:"mb-6 flex items-center justify-between"},Dl={class:"modal-scroll-content custom-scrollbar flex-1 space-y-6"},_l={class:"rounded-lg border border-blue-200 bg-blue-50 p-4"},Tl={class:"flex items-start gap-3"},Sl={class:"text-sm text-gray-700"},Ul={class:"mt-1 text-xs text-gray-600"},Pl={key:0,class:"mt-3"},Rl=["min"],Ml={key:1,class:"mt-2 text-xs text-gray-500"},Vl={class:"flex gap-3 pt-4"},El=["disabled"],Ol={key:0,class:"loading-spinner mr-2"},jl={key:1,class:"fas fa-clock mr-2"},Gl={__name:"RenewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close","success"],setup(w,{emit:N}){const c=w,P=N,B=L(!1),C=He({renewDuration:"30d",customExpireDate:"",newExpiresAt:null}),U=O(()=>{const f=new Date;return c.apiKey.expiresAt&&new Date(c.apiKey.expiresAt)>f?new Date(c.apiKey.expiresAt).toISOString().slice(0,16):(f.setMinutes(f.getMinutes()+1),f.toISOString().slice(0,16))}),F=f=>new Date(f).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),S=()=>{if(!C.renewDuration){C.newExpiresAt=null;return}if(C.renewDuration==="permanent"){C.newExpiresAt=null;return}if(C.renewDuration==="custom")return;const f=c.apiKey.expiresAt&&new Date(c.apiKey.expiresAt)>new Date?new Date(c.apiKey.expiresAt):new Date,y=C.renewDuration.match(/(\d+)([dhmy])/);if(y){const[,a,j]=y,T=parseInt(a);switch(j){case"d":f.setDate(f.getDate()+T);break;case"h":f.setHours(f.getHours()+T);break;case"m":f.setMonth(f.getMonth()+T);break;case"y":f.setFullYear(f.getFullYear()+T);break}C.newExpiresAt=f.toISOString()}},Q=()=>{C.customExpireDate&&(C.newExpiresAt=new Date(C.customExpireDate).toISOString())},H=async()=>{B.value=!0;try{const f={expiresAt:C.renewDuration==="permanent"?null:C.newExpiresAt},D=await q.put(`/admin/api-keys/${c.apiKey.id}`,f);D.success?(E("API Key 续期成功","success"),P("success"),P("close")):E(D.message||"续期失败","error")}catch{E("续期失败","error")}finally{B.value=!1}};return S(),(f,D)=>(i(),Ae(Ve,{to:"body"},[e("div",Il,[e("div",Kl,[e("div",Ll,[D[5]||(D[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:D[0]||(D[0]=y=>f.$emit("close"))},D[4]||(D[4]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",Dl,[e("div",_l,[e("div",Tl,[D[7]||(D[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,[D[6]||(D[6]=e("h4",{class:"mb-1 font-semibold text-gray-800"},"API Key 信息",-1)),e("p",Sl,u(w.apiKey.name),1),e("p",Ul," 当前过期时间:"+u(w.apiKey.expiresAt?F(w.apiKey.expiresAt):"永不过期"),1)])])]),e("div",null,[D[9]||(D[9]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700"},"续期时长",-1)),_(e("select",{"onUpdate:modelValue":D[1]||(D[1]=y=>C.renewDuration=y),class:"form-input w-full",onChange:S},D[8]||(D[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),[[it,C.renewDuration]]),C.renewDuration==="custom"?(i(),d("div",Pl,[_(e("input",{"onUpdate:modelValue":D[2]||(D[2]=y=>C.customExpireDate=y),class:"form-input w-full",min:U.value,type:"datetime-local",onChange:Q},null,40,Rl),[[ee,C.customExpireDate]])])):A("",!0),C.newExpiresAt?(i(),d("p",Ml," 新的过期时间:"+u(F(C.newExpiresAt)),1)):A("",!0)])]),e("div",Vl,[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:D[3]||(D[3]=y=>f.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:B.value||!C.renewDuration,type:"button",onClick:H},[B.value?(i(),d("div",Ol)):(i(),d("i",jl)),$(" "+u(B.value?"续期中...":"确认续期"),1)],8,El)])])])]))}},ql=Se(Gl,[["__scopeId","data-v-2fba52a3"]]),zl={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},Fl={class:"modal-content custom-scrollbar mx-auto max-h-[90vh] w-full max-w-lg overflow-y-auto p-8"},Wl={class:"mb-6 space-y-4"},Bl={class:"rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-600 dark:bg-gray-800"},Nl={class:"font-medium text-gray-900 dark:text-gray-100"},Hl={key:0},Yl={class:"rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-600 dark:bg-gray-800"},Ql={class:"text-gray-700 dark:text-gray-300"},Jl={class:"relative"},Xl={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"},Zl={class:"absolute right-3 top-3"},ei=["title"],ti={__name:"NewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close"],setup(w,{emit:N}){const c=w,P=N,B=L(!1),C=()=>{if(typeof window<"u"){const a=window.location.protocol,j=window.location.host;let T=a+"//"+j;const W=window.location.href,I=W.indexOf("/",8);return I!==-1&&(T=W.substring(0,I)),T}return""},U=O(()=>C()+"/api"),F=()=>{B.value=!B.value},S=()=>{const a=c.apiKey.apiKey||c.apiKey.key||"";return a?B.value||a.length<=12?a:a.substring(0,8)+"●".repeat(Math.max(0,a.length-12))+a.substring(a.length-4):""},Q=async(a,j)=>{try{await navigator.clipboard.writeText(a),E(j,"success")}catch{const W=document.createElement("textarea");W.value=a,document.body.appendChild(W),W.select();try{document.execCommand("copy"),E(j,"success")}catch{E("复制失败,请手动复制","error")}finally{document.body.removeChild(W)}}},H=async()=>{const a=c.apiKey.apiKey||c.apiKey.key||"";if(!a){E("API Key 不存在","error");return}const j=`export ANTHROPIC_BASE_URL="${U.value}"
|
||
export ANTHROPIC_AUTH_TOKEN="${a}"`;await Q(j,"配置信息已复制到剪贴板")},f=async()=>{const a=c.apiKey.apiKey||c.apiKey.key||"";if(!a){E("API Key 不存在","error");return}await Q(a,"API Key 已复制")},D=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","取消")&&P("close"):confirm(`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`)&&P("close")},y=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
建议您先复制API Key再关闭。`,"仍然关闭","返回复制")&&P("close"):confirm(`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&P("close")};return(a,j)=>(i(),Ae(Ve,{to:"body"},[e("div",zl,[e("div",Fl,[e("div",{class:"mb-6 flex items-center justify-between"},[j[1]||(j[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:y},j[0]||(j[0]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),j[9]||(j[9]=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",Wl,[e("div",null,[j[2]||(j[2]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"API Key 名称",-1)),e("div",Bl,[e("span",Nl,u(w.apiKey.name),1)])]),w.apiKey.description?(i(),d("div",Hl,[j[3]||(j[3]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"备注",-1)),e("div",Yl,[e("span",Ql,u(w.apiKey.description||"无描述"),1)])])):A("",!0),e("div",null,[j[4]||(j[4]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"API Key",-1)),e("div",Jl,[e("div",Xl,u(S()),1),e("div",Zl,[e("button",{class:"btn-icon-sm bg-gray-700 hover:bg-gray-800 dark:bg-gray-700 dark:hover:bg-gray-600",title:B.value?"隐藏API Key":"显示完整API Key",type:"button",onClick:F},[e("i",{class:G(["fas",B.value?"fa-eye-slash":"fa-eye","text-gray-300"])},null,2)],8,ei)])]),j[5]||(j[5]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 点击眼睛图标切换显示模式,使用下方按钮复制环境变量配置 ",-1))])]),e("div",{class:"flex flex-col gap-3 sm:gap-4"},[e("div",{class:"flex flex-col gap-3 sm:flex-row sm:gap-4"},[e("button",{class:"flex w-full items-center justify-center gap-2 rounded-xl border border-blue-200 bg-blue-50 px-5 py-3 text-sm font-semibold text-blue-700 transition-colors hover:border-blue-300 hover:bg-blue-100 dark:border-blue-500/50 dark:bg-blue-500/10 dark:text-blue-200 dark:hover:bg-blue-500/20 sm:flex-1 sm:text-base",onClick:f},j[6]||(j[6]=[e("i",{class:"fas fa-key"},null,-1),$(" 仅复制密钥 ",-1)])),e("button",{class:"btn btn-primary flex w-full items-center justify-center gap-2 px-5 py-3 text-sm font-semibold sm:flex-1 sm:text-base",onClick:H},j[7]||(j[7]=[e("i",{class:"fas fa-copy"},null,-1),$(" 复制Claude配置 ",-1)]))]),e("button",{class:"flex w-full items-center justify-center gap-2 rounded-xl border border-gray-300 bg-gray-200 px-5 py-3 text-sm font-semibold text-gray-800 transition-colors hover:border-gray-400 hover:bg-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 sm:text-base",onClick:D},j[8]||(j[8]=[e("i",{class:"fas fa-check-circle"},null,-1),$(" 我已保存 ",-1)]))])])])]))}},si=Se(ti,[["__scopeId","data-v-a3d3d870"]]),ai={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},ri={class:"modal-content custom-scrollbar mx-auto max-h-[90vh] w-full max-w-2xl overflow-y-auto p-8"},oi={class:"mb-6 flex items-center justify-between"},li={class:"flex items-center gap-3"},ii={class:"text-sm text-gray-600"},ni={class:"mb-6 grid grid-cols-2 gap-4 md:grid-cols-4"},di={class:"rounded-lg border border-blue-200 bg-gradient-to-br from-blue-50 to-blue-100 p-4"},ui={class:"flex items-center justify-between"},ci={class:"mt-1 text-2xl font-bold text-blue-900"},gi={class:"rounded-lg border border-green-200 bg-gradient-to-br from-green-50 to-green-100 p-4"},pi={class:"flex items-center justify-between"},mi={class:"mt-1 truncate text-lg font-bold text-green-900"},xi={class:"rounded-lg border border-purple-200 bg-gradient-to-br from-purple-50 to-purple-100 p-4"},yi={class:"flex items-center justify-between"},fi={class:"mt-1 text-lg font-bold text-purple-900"},bi={class:"rounded-lg border border-orange-200 bg-gradient-to-br from-orange-50 to-orange-100 p-4"},vi={class:"flex items-center justify-between"},ki={class:"mt-1 text-lg font-bold text-orange-900"},wi={class:"mb-6"},hi={class:"mb-3 flex items-center justify-between"},Ai={class:"flex items-center gap-2"},$i={key:0,class:"custom-scrollbar max-h-48 overflow-y-auto rounded-lg bg-gray-900 p-4"},Ci={class:"font-mono text-xs text-gray-300"},Ii={__name:"BatchApiKeyModal",props:{apiKeys:{type:Array,required:!0}},emits:["close"],setup(w,{emit:N}){const c=w,P=N,B=L(!1),C=O(()=>{if(c.apiKeys.length>0){const y=c.apiKeys[0],a=y.name.match(/^(.+)_\d+$/);return a?a[1]:y.name}return""}),U=()=>{if(c.apiKeys.length===0)return"未知";const y=c.apiKeys[0].permissions;return{all:"全部服务",claude:"仅 Claude",gemini:"仅 Gemini"}[y]||y},F=()=>{if(c.apiKeys.length===0)return"未知";const y=c.apiKeys[0].expiresAt;if(!y)return"永不过期";const a=new Date(y),T=Math.ceil((a-new Date)/(1e3*60*60*24));return T<=7?`${T}天`:T<=30?`${Math.ceil(T/7)}周`:T<=365?`${Math.ceil(T/30)}个月`:`${Math.ceil(T/365)}年`},S=()=>{B.value=!B.value},Q=()=>{const a=c.apiKeys.slice(0,10).map(j=>`${j.name}: ${j.apiKey||j.key||""}`);return c.apiKeys.length>10&&a.push(`... 还有 ${c.apiKeys.length-10} 个 API Key`),a.join(`
|
||
`)},H=()=>{const y=c.apiKeys.map(I=>`${I.name}: ${I.apiKey||I.key||""}`).join(`
|
||
`),a=new Blob([y],{type:"text/plain;charset=utf-8"}),j=URL.createObjectURL(a),T=document.createElement("a");T.href=j;const W=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5);T.download=`api-keys-${C.value}-${W}.txt`,document.body.appendChild(T),T.click(),document.body.removeChild(T),URL.revokeObjectURL(j),E("API Keys 文件已下载","success")},f=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看这些 API Key,请确保已经下载并妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","返回下载")&&P("close"):confirm(`关闭后将无法再次查看这些 API Key,请确保已经下载并妥善保存。
|
||
|
||
确定要关闭吗?`)&&P("close")},D=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有下载 API Keys,关闭后将无法再次查看。
|
||
|
||
强烈建议您先下载保存。`,"仍然关闭","返回下载")&&P("close"):confirm(`您还没有下载 API Keys,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&P("close")};return(y,a)=>(i(),Ae(Ve,{to:"body"},[e("div",ai,[e("div",ri,[e("div",oi,[e("div",li,[a[1]||(a[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,[a[0]||(a[0]=e("h3",{class:"text-xl font-bold text-gray-900"},"批量创建成功",-1)),e("p",ii,"成功创建 "+u(w.apiKeys.length)+" 个 API Key",1)])]),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600",title:"直接关闭(不推荐)",onClick:D},a[2]||(a[2]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),a[14]||(a[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",ni,[e("div",di,[e("div",ui,[e("div",null,[a[3]||(a[3]=e("p",{class:"text-xs font-medium text-blue-600"},"创建数量",-1)),e("p",ci,u(w.apiKeys.length),1)]),a[4]||(a[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",gi,[e("div",pi,[e("div",null,[a[5]||(a[5]=e("p",{class:"text-xs font-medium text-green-600"},"基础名称",-1)),e("p",mi,u(C.value),1)]),a[6]||(a[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",xi,[e("div",yi,[e("div",null,[a[7]||(a[7]=e("p",{class:"text-xs font-medium text-purple-600"},"权限范围",-1)),e("p",fi,u(U()),1)]),a[8]||(a[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",bi,[e("div",vi,[e("div",null,[a[9]||(a[9]=e("p",{class:"text-xs font-medium text-orange-600"},"过期时间",-1)),e("p",ki,u(F()),1)]),a[10]||(a[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",wi,[e("div",hi,[a[12]||(a[12]=e("label",{class:"text-sm font-semibold text-gray-700"},"API Keys 预览",-1)),e("div",Ai,[e("button",{class:"flex items-center gap-1 text-xs text-blue-600 hover:text-blue-800",type:"button",onClick:S},[e("i",{class:G(["fas",B.value?"fa-eye-slash":"fa-eye"])},null,2),$(" "+u(B.value?"隐藏":"显示")+"预览 ",1)]),a[11]||(a[11]=e("span",{class:"text-xs text-gray-500"},"(最多显示前10个)",-1))])]),B.value?(i(),d("div",$i,[e("pre",Ci,u(Q()),1)])):A("",!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},a[13]||(a[13]=[e("i",{class:"fas fa-download"},null,-1),$(" 下载所有 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:f}," 我已保存 ")]),a[15]||(a[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))])])]))}},Ki=Se(Ii,[["__scopeId","data-v-b0b904b9"]]),Li={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},Di={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6 md:p-8"},_i={class:"mb-4 flex items-center justify-between sm:mb-6"},Ti={class:"flex items-center gap-2 sm:gap-3"},Si={class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"},Ui={class:"rounded-lg bg-blue-50 p-4 dark:bg-blue-900/20"},Pi={class:"flex items-start gap-3"},Ri={class:"mt-1 text-sm text-blue-700 dark:text-blue-400"},Mi={class:"space-y-4"},Vi={class:"flex flex-wrap gap-4"},Ei={class:"flex cursor-pointer items-center"},Oi={class:"flex cursor-pointer items-center"},ji={class:"flex cursor-pointer items-center"},Gi={class:"flex cursor-pointer items-center"},qi={key:0,class:"space-y-3"},zi={key:0},Fi={class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"},Wi={class:"flex flex-wrap gap-2"},Bi=["onClick"],Ni={key:1},Hi={class:"flex flex-wrap gap-2"},Yi=["onClick"],Qi={class:"flex gap-2"},Ji=["onKeypress"],Xi={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},Zi={class:"space-y-2"},en={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},tn={class:"mb-3 flex items-center gap-4"},sn={class:"flex gap-4"},an={class:"flex cursor-pointer items-center"},rn={class:"flex cursor-pointer items-center"},on={class:"flex cursor-pointer items-center"},ln={class:"flex flex-wrap gap-4"},nn={class:"flex cursor-pointer items-center"},dn={class:"flex cursor-pointer items-center"},un={class:"flex cursor-pointer items-center"},cn={class:"flex cursor-pointer items-center"},gn={class:"flex cursor-pointer items-center"},pn={class:"flex cursor-pointer items-center"},mn={class:"mb-3 flex items-center justify-between"},xn=["disabled"],yn={class:"grid grid-cols-1 gap-3"},fn={class:"flex gap-3 pt-4"},bn=["disabled"],vn={key:0,class:"loading-spinner mr-2"},kn={key:1,class:"fas fa-save mr-2"},Ot="__KEEP_ORIGINAL__",wn={__name:"BatchEditApiKeyModal",props:{selectedKeys:{type:Array,required:!0},accounts:{type:Object,default:()=>({claude:[],gemini:[],openai:[],openaiResponses:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]})}},emits:["close","success"],setup(w,{emit:N}){const c=w,P=N,B=Gt(),C=L(!1),U=L(!1),F=L({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),S=L(""),Q=L([]),H=L("none"),f=O(()=>c.selectedKeys.length),D=O(()=>Q.value.filter(o=>!y.tags.includes(o))),y=He({rateLimitCost:"",rateLimitWindow:"",rateLimitRequests:"",concurrencyLimit:"",dailyCostLimit:"",totalCostLimit:"",weeklyOpusCostLimit:"",permissions:"",claudeAccountId:"",geminiAccountId:"",openaiAccountId:"",bedrockAccountId:"",droidAccountId:"",tags:[],isActive:null}),a=[{value:Ot,label:"不修改"},{value:"SHARED_POOL",label:"使用共享账号池"}],j=o=>O({get:()=>y[o]===""?Ot:y[o],set:n=>{!n||n===Ot?y[o]="":y[o]=n}}),T=j("claudeAccountId"),W=j("geminiAccountId"),I=j("openaiAccountId"),K=j("bedrockAccountId"),te=j("droidAccountId"),ne=o=>!y.permissions||y.permissions==="all"?!0:y.permissions===o,ue=()=>{if(S.value&&S.value.trim()){const o=S.value.trim();y.tags.includes(o)||y.tags.push(o),S.value=""}},ke=o=>{y.tags.includes(o)||y.tags.push(o)},pe=o=>{y.tags.splice(o,1)},$e=async()=>{var o,n;U.value=!0;try{const[p,k,m,l,x,oe,xe,be,me]=await Promise.all([q.get("/admin/claude-accounts"),q.get("/admin/claude-console-accounts"),q.get("/admin/gemini-accounts"),q.get("/admin/gemini-api-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")]),we=[];p.success&&((o=p.data)==null||o.forEach(J=>{we.push({...J,platform:"claude-oauth",isDedicated:J.accountType==="dedicated"})})),k.success&&((n=k.data)==null||n.forEach(J=>{we.push({...J,platform:"claude-console",isDedicated:J.accountType==="dedicated"})})),F.value.claude=we;const ye=[];m.success&&(m.data||[]).forEach(J=>{ye.push({...J,platform:"gemini",isDedicated:J.accountType==="dedicated"})}),l.success&&(l.data||[]).forEach(J=>{ye.push({...J,platform:"gemini-api",isDedicated:J.accountType==="dedicated"})}),F.value.gemini=ye;const Y=[];if(x.success&&(x.data||[]).forEach(J=>{Y.push({...J,platform:"openai",isDedicated:J.accountType==="dedicated"})}),oe.success&&(oe.data||[]).forEach(J=>{Y.push({...J,platform:"openai-responses",isDedicated:J.accountType==="dedicated"})}),F.value.openai=Y,xe.success&&(F.value.bedrock=(xe.data||[]).map(J=>({...J,isDedicated:J.accountType==="dedicated"}))),be.success&&(F.value.droid=(be.data||[]).map(J=>({...J,platform:"droid",isDedicated:J.accountType==="dedicated"}))),me.success){const J=me.data||[];F.value.claudeGroups=J.filter(De=>De.platform==="claude"),F.value.geminiGroups=J.filter(De=>De.platform==="gemini"),F.value.openaiGroups=J.filter(De=>De.platform==="openai"),F.value.droidGroups=J.filter(De=>De.platform==="droid")}E("账号列表已刷新","success")}catch{E("刷新账号列表失败","error")}finally{U.value=!1}},h=async()=>{C.value=!0;try{const o={};y.rateLimitCost!==""&&y.rateLimitCost!==null&&(o.rateLimitCost=parseFloat(y.rateLimitCost)),y.rateLimitWindow!==""&&y.rateLimitWindow!==null&&(o.rateLimitWindow=parseInt(y.rateLimitWindow)),y.rateLimitRequests!==""&&y.rateLimitRequests!==null&&(o.rateLimitRequests=parseInt(y.rateLimitRequests)),y.concurrencyLimit!==""&&y.concurrencyLimit!==null&&(o.concurrencyLimit=parseInt(y.concurrencyLimit)),y.dailyCostLimit!==""&&y.dailyCostLimit!==null&&(o.dailyCostLimit=parseFloat(y.dailyCostLimit)),y.totalCostLimit!==""&&y.totalCostLimit!==null&&(o.totalCostLimit=parseFloat(y.totalCostLimit)),y.weeklyOpusCostLimit!==""&&y.weeklyOpusCostLimit!==null&&(o.weeklyOpusCostLimit=parseFloat(y.weeklyOpusCostLimit)),y.permissions!==""&&(o.permissions=y.permissions),y.claudeAccountId!==""&&(y.claudeAccountId==="SHARED_POOL"?(o.claudeAccountId=null,o.claudeConsoleAccountId=null):y.claudeAccountId.startsWith("console:")?(o.claudeConsoleAccountId=y.claudeAccountId.substring(8),o.claudeAccountId=null):(y.claudeAccountId.startsWith("group:"),o.claudeAccountId=y.claudeAccountId,o.claudeConsoleAccountId=null)),y.geminiAccountId!==""&&(y.geminiAccountId==="SHARED_POOL"?o.geminiAccountId=null:o.geminiAccountId=y.geminiAccountId),y.openaiAccountId!==""&&(y.openaiAccountId==="SHARED_POOL"?o.openaiAccountId=null:o.openaiAccountId=y.openaiAccountId),y.bedrockAccountId!==""&&(y.bedrockAccountId==="SHARED_POOL"?o.bedrockAccountId=null:o.bedrockAccountId=y.bedrockAccountId),y.droidAccountId!==""&&(y.droidAccountId==="SHARED_POOL"?o.droidAccountId=null:o.droidAccountId=y.droidAccountId),y.isActive!==null&&(o.isActive=y.isActive),H.value!=="none"&&(o.tags=y.tags,o.tagOperation=H.value);const n=await q.put("/admin/api-keys/batch",{keyIds:c.selectedKeys,updates:o});if(n.success){const{successCount:p,failedCount:k,errors:m}=n.data;if(p>0){if(E(`成功批量编辑 ${p} 个 API Keys`,"success"),k>0){const l=m.map(x=>`${x.keyId}: ${x.error}`).join(`
|
||
`);E(`${k} 个编辑失败:
|
||
${l}`,"warning")}}else E("所有 API Keys 编辑失败","error");P("success"),P("close")}else E(n.message||"批量编辑失败","error")}catch(o){E("批量编辑失败","error"),console.error("批量编辑 API Keys 失败:",o)}finally{C.value=!1}};return nt(async()=>{if(Q.value=await B.fetchTags(),c.accounts){const o=(c.accounts.gemini||[]).map(p=>({...p,platform:p.platform||"gemini"})),n=[];c.accounts.openai&&c.accounts.openai.forEach(p=>{n.push({...p,platform:p.platform||"openai"})}),c.accounts.openaiResponses&&c.accounts.openaiResponses.forEach(p=>{n.push({...p,platform:p.platform||"openai-responses"})}),F.value={claude:c.accounts.claude||[],gemini:o,openai:n,bedrock:c.accounts.bedrock||[],droid:(c.accounts.droid||[]).map(p=>({...p,platform:p.platform||"droid"})),claudeGroups:c.accounts.claudeGroups||[],geminiGroups:c.accounts.geminiGroups||[],openaiGroups:c.accounts.openaiGroups||[],droidGroups:c.accounts.droidGroups||[]}}}),(o,n)=>(i(),Ae(Ve,{to:"body"},[e("div",Li,[e("div",Di,[e("div",_i,[e("div",Ti,[n[28]||(n[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",Si," 批量编辑 API Keys ("+u(f.value)+" 个) ",1)]),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600 dark:hover:text-gray-300",onClick:n[0]||(n[0]=p=>o.$emit("close"))},n[29]||(n[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:Le(h,["prevent"])},[e("div",Ui,[e("div",Pi,[n[31]||(n[31]=e("i",{class:"fas fa-info-circle mt-1 text-blue-500"},null,-1)),e("div",null,[n[30]||(n[30]=e("p",{class:"text-sm font-medium text-blue-800 dark:text-blue-300"},"批量编辑说明",-1)),e("p",Ri," 以下设置将应用到所选的 "+u(f.value)+" 个 API Key。只有填写或修改的字段才会被更新,空白字段将保持原值不变。 ",1)])])]),e("div",null,[n[41]||(n[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",Mi,[e("div",Vi,[e("label",Ei,[_(e("input",{"onUpdate:modelValue":n[1]||(n[1]=p=>H.value=p),class:"mr-2",type:"radio",value:"replace"},null,512),[[ce,H.value]]),n[32]||(n[32]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"替换标签",-1))]),e("label",Oi,[_(e("input",{"onUpdate:modelValue":n[2]||(n[2]=p=>H.value=p),class:"mr-2",type:"radio",value:"add"},null,512),[[ce,H.value]]),n[33]||(n[33]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"添加标签",-1))]),e("label",ji,[_(e("input",{"onUpdate:modelValue":n[3]||(n[3]=p=>H.value=p),class:"mr-2",type:"radio",value:"remove"},null,512),[[ce,H.value]]),n[34]||(n[34]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"移除标签",-1))]),e("label",Gi,[_(e("input",{"onUpdate:modelValue":n[4]||(n[4]=p=>H.value=p),class:"mr-2",type:"radio",value:"none"},null,512),[[ce,H.value]]),n[35]||(n[35]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"不修改标签",-1))])]),H.value!=="none"?(i(),d("div",qi,[y.tags.length>0?(i(),d("div",zi,[e("div",Fi,u(H.value==="replace"?"新标签列表:":H.value==="add"?"要添加的标签:":"要移除的标签:"),1),e("div",Wi,[(i(!0),d(X,null,re(y.tags,(p,k)=>(i(),d("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-300"},[$(u(p)+" ",1),e("button",{class:"ml-1 hover:text-blue-900",type:"button",onClick:m=>pe(k)},n[36]||(n[36]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,Bi)]))),128))])])):A("",!0),D.value.length>0?(i(),d("div",Ni,[n[38]||(n[38]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",Hi,[(i(!0),d(X,null,re(D.value,p=>(i(),d("button",{key:"available-"+p,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:k=>ke(p)},[n[37]||(n[37]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),$(" "+u(p),1)],8,Yi))),128))])])):A("",!0),e("div",null,[n[40]||(n[40]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",Qi,[_(e("input",{"onUpdate:modelValue":n[5]||(n[5]=p=>S.value=p),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",placeholder:"输入新标签名称",type:"text",onKeypress:lt(Le(ue,["prevent"]),["enter"])},null,40,Ji),[[ee,S.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:ue},n[39]||(n[39]=[e("i",{class:"fas fa-plus"},null,-1)]))])])])):A("",!0)])]),e("div",Xi,[n[45]||(n[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",Zi,[e("div",en,[e("div",null,[n[42]||(n[42]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"}," 时间窗口 (分钟) ",-1)),_(e("input",{"onUpdate:modelValue":n[6]||(n[6]=p=>y.rateLimitWindow=p),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),[[ee,y.rateLimitWindow]])]),e("div",null,[n[43]||(n[43]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"请求次数限制",-1)),_(e("input",{"onUpdate:modelValue":n[7]||(n[7]=p=>y.rateLimitRequests=p),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),[[ee,y.rateLimitRequests]])]),e("div",null,[n[44]||(n[44]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),_(e("input",{"onUpdate:modelValue":n[8]||(n[8]=p=>y.rateLimitCost=p),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),[[ee,y.rateLimitCost]])])])])]),e("div",null,[n[46]||(n[46]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," 每日费用限制 (美元) ",-1)),_(e("input",{"onUpdate:modelValue":n[9]||(n[9]=p=>y.dailyCostLimit=p),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),[[ee,y.dailyCostLimit]])]),e("div",null,[n[47]||(n[47]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," 总费用限制 (美元) ",-1)),_(e("input",{"onUpdate:modelValue":n[10]||(n[10]=p=>y.totalCostLimit=p),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),[[ee,y.totalCostLimit]])]),e("div",null,[n[48]||(n[48]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," Opus 模型周费用限制 (美元) ",-1)),_(e("input",{"onUpdate:modelValue":n[11]||(n[11]=p=>y.weeklyOpusCostLimit=p),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),[[ee,y.weeklyOpusCostLimit]]),n[49]||(n[49]=e("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户 ",-1))]),e("div",null,[n[50]||(n[50]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制",-1)),_(e("input",{"onUpdate:modelValue":n[12]||(n[12]=p=>y.concurrencyLimit=p),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),[[ee,y.concurrencyLimit]])]),e("div",null,[e("div",tn,[n[54]||(n[54]=e("label",{class:"text-sm font-semibold text-gray-700 dark:text-gray-300"},"激活状态",-1)),e("div",sn,[e("label",an,[_(e("input",{"onUpdate:modelValue":n[13]||(n[13]=p=>y.isActive=p),class:"mr-2",type:"radio",value:!0},null,512),[[ce,y.isActive]]),n[51]||(n[51]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"激活",-1))]),e("label",rn,[_(e("input",{"onUpdate:modelValue":n[14]||(n[14]=p=>y.isActive=p),class:"mr-2",type:"radio",value:!1},null,512),[[ce,y.isActive]]),n[52]||(n[52]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"禁用",-1))]),e("label",on,[_(e("input",{"onUpdate:modelValue":n[15]||(n[15]=p=>y.isActive=p),class:"mr-2",type:"radio",value:null},null,512),[[ce,y.isActive]]),n[53]||(n[53]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"不修改",-1))])])])]),e("div",null,[n[61]||(n[61]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",ln,[e("label",nn,[_(e("input",{"onUpdate:modelValue":n[16]||(n[16]=p=>y.permissions=p),class:"mr-2",type:"radio",value:""},null,512),[[ce,y.permissions]]),n[55]||(n[55]=e("span",{class:"text-sm text-gray-700"},"不修改",-1))]),e("label",dn,[_(e("input",{"onUpdate:modelValue":n[17]||(n[17]=p=>y.permissions=p),class:"mr-2",type:"radio",value:"all"},null,512),[[ce,y.permissions]]),n[56]||(n[56]=e("span",{class:"text-sm text-gray-700"},"全部服务",-1))]),e("label",un,[_(e("input",{"onUpdate:modelValue":n[18]||(n[18]=p=>y.permissions=p),class:"mr-2",type:"radio",value:"claude"},null,512),[[ce,y.permissions]]),n[57]||(n[57]=e("span",{class:"text-sm text-gray-700"},"仅 Claude",-1))]),e("label",cn,[_(e("input",{"onUpdate:modelValue":n[19]||(n[19]=p=>y.permissions=p),class:"mr-2",type:"radio",value:"gemini"},null,512),[[ce,y.permissions]]),n[58]||(n[58]=e("span",{class:"text-sm text-gray-700"},"仅 Gemini",-1))]),e("label",gn,[_(e("input",{"onUpdate:modelValue":n[20]||(n[20]=p=>y.permissions=p),class:"mr-2",type:"radio",value:"openai"},null,512),[[ce,y.permissions]]),n[59]||(n[59]=e("span",{class:"text-sm text-gray-700"},"仅 OpenAI",-1))]),e("label",pn,[_(e("input",{"onUpdate:modelValue":n[21]||(n[21]=p=>y.permissions=p),class:"mr-2",type:"radio",value:"droid"},null,512),[[ce,y.permissions]]),n[60]||(n[60]=e("span",{class:"text-sm text-gray-700"},"仅 Droid",-1))])])]),e("div",null,[e("div",mn,[n[62]||(n[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:U.value,title:"刷新账号列表",type:"button",onClick:$e},[e("i",{class:G(["fas",U.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,u(U.value?"刷新中...":"刷新账号"),1)],8,xn)]),e("div",yn,[e("div",null,[n[63]||(n[63]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),ae(Ie,{modelValue:ot(T),"onUpdate:modelValue":n[22]||(n[22]=p=>rt(T)?T.value=p:null),accounts:F.value.claude,"default-option-text":"请选择Claude账号",disabled:!ne("claude"),groups:F.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude","special-options":a},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[n[64]||(n[64]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),ae(Ie,{modelValue:ot(W),"onUpdate:modelValue":n[23]||(n[23]=p=>rt(W)?W.value=p:null),accounts:F.value.gemini,"default-option-text":"请选择Gemini账号",disabled:!ne("gemini"),groups:F.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini","special-options":a},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[n[65]||(n[65]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),ae(Ie,{modelValue:ot(I),"onUpdate:modelValue":n[24]||(n[24]=p=>rt(I)?I.value=p:null),accounts:F.value.openai,"default-option-text":"请选择OpenAI账号",disabled:!ne("openai"),groups:F.value.openaiGroups,placeholder:"请选择OpenAI账号",platform:"openai","special-options":a},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[n[66]||(n[66]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),ae(Ie,{modelValue:ot(K),"onUpdate:modelValue":n[25]||(n[25]=p=>rt(K)?K.value=p:null),accounts:F.value.bedrock,"default-option-text":"请选择Bedrock账号",disabled:!ne("openai"),groups:[],placeholder:"请选择Bedrock账号",platform:"bedrock","special-options":a},null,8,["modelValue","accounts","disabled"])]),e("div",null,[n[67]||(n[67]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),ae(Ie,{modelValue:ot(te),"onUpdate:modelValue":n[26]||(n[26]=p=>rt(te)?te.value=p:null),accounts:F.value.droid,"default-option-text":"请选择Droid账号",disabled:!ne("droid"),groups:F.value.droidGroups,placeholder:"请选择Droid账号",platform:"droid","special-options":a},null,8,["modelValue","accounts","disabled","groups"])])])]),e("div",fn,[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:n[27]||(n[27]=p=>o.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:C.value,type:"submit"},[C.value?(i(),d("div",vn)):(i(),d("i",kn)),$(" "+u(C.value?"保存中...":"批量保存"),1)],8,bn)])],32)])])]))}},hn=Se(wn,[["__scopeId","data-v-c0491882"]]),An={key:0,class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},$n={class:"modal-content relative mx-auto w-full max-w-lg p-8"},Cn={class:"mb-6 flex items-center justify-between"},In={class:"flex items-center gap-3"},Kn={class:"text-sm text-gray-600 dark:text-gray-400"},Ln={class:"space-y-6"},Dn={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"},_n={class:"flex items-center justify-between"},Tn={class:"text-sm font-semibold text-gray-800 dark:text-gray-200"},Sn={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"},Pn={key:0,class:"mb-4"},Rn={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Mn={class:"mb-3 grid grid-cols-3 gap-2"},Vn=["onClick"],En={key:1,class:"animate-fadeIn"},On=["min"],jn={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"},Gn={class:"flex items-center justify-between"},qn={class:"text-sm font-semibold text-blue-900 dark:text-blue-200"},zn={class:"flex gap-3 pt-2"},Fn=["disabled"],Wn={key:0,class:"loading-spinner mr-2"},Bn={key:1,class:"fas fa-save mr-2"},Nn={__name:"ExpiryEditModal",props:{show:{type:Boolean,required:!0},apiKey:{type:Object,required:!0}},emits:["close","save"],setup(w,{expose:N,emit:c}){const P=w,B=c,C=L(!1),U=He({expireDuration:"",customExpireDate:"",expiresAt:null}),F=[{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 年"}],S=O(()=>{const I=new Date;return I.setMinutes(I.getMinutes()+1),I.toISOString().slice(0,16)});Te(()=>P.show,I=>{I&&Q()}),Te(()=>{var I;return(I=P.apiKey)==null?void 0:I.id},I=>{I&&P.show&&Q()});const Q=()=>{C.value=!1,P.apiKey.expiresAt?(U.expireDuration="custom",U.customExpireDate=new Date(P.apiKey.expiresAt).toISOString().slice(0,16),U.expiresAt=P.apiKey.expiresAt):(U.expireDuration="",U.customExpireDate="",U.expiresAt=null)},H=I=>{if(U.expireDuration=I,!I){U.expiresAt=null;return}if(I==="custom")return;const K=new Date,te=I.match(/(\d+)([dhmy])/);if(te){const[,ne,ue]=te,ke=parseInt(ne);switch(ue){case"d":K.setDate(K.getDate()+ke);break;case"h":K.setHours(K.getHours()+ke);break;case"m":K.setMonth(K.getMonth()+ke);break;case"y":K.setFullYear(K.getFullYear()+ke);break}U.expiresAt=K.toISOString()}},f=()=>{U.customExpireDate&&(U.expiresAt=new Date(U.customExpireDate).toISOString())},D=I=>I?new Date(I).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",y=I=>I?new Date(I)<new Date:!1,a=I=>{if(!I)return null;const K=new Date,ne=new Date(I)-K,ue=Math.ceil(ne/(1e3*60*60*24));return ne<0?{text:"已过期",class:"text-red-600"}:ue<=7?{text:`${ue} 天后过期`,class:"text-orange-600"}:ue<=30?{text:`${ue} 天后过期`,class:"text-yellow-600"}:{text:`${Math.ceil(ue/30)} 个月后过期`,class:"text-green-600"}},j=()=>{C.value=!0,B("save",{keyId:P.apiKey.id,expiresAt:U.expiresAt})},T=async()=>{let I=!0;window.showConfirm?I=await window.showConfirm("激活 API Key",`确定要立即激活此 API Key 吗?激活后将在 ${P.apiKey.activationDays||(P.apiKey.activationUnit==="hours"?24:30)} ${P.apiKey.activationUnit==="hours"?"小时":"天"}后自动过期。`,"确定激活","取消"):I=confirm(`确定要立即激活此 API Key 吗?激活后将在 ${P.apiKey.activationDays||(P.apiKey.activationUnit==="hours"?24:30)} ${P.apiKey.activationUnit==="hours"?"小时":"天"}后自动过期。`),I&&(C.value=!0,B("save",{keyId:P.apiKey.id,activateNow:!0}))};return N({resetSaving:()=>{C.value=!1}}),(I,K)=>(i(),Ae(Ve,{to:"body"},[w.show?(i(),d("div",An,[e("div",{class:"fixed inset-0 bg-gray-900 bg-opacity-50 backdrop-blur-sm",onClick:K[0]||(K[0]=te=>I.$emit("close"))}),e("div",$n,[e("div",Cn,[e("div",In,[K[6]||(K[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,[K[5]||(K[5]=e("h3",{class:"text-xl font-bold text-gray-900 dark:text-gray-100"},"修改过期时间",-1)),e("p",Kn,' 为 "'+u(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:K[1]||(K[1]=te=>I.$emit("close"))},K[7]||(K[7]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",Ln,[e("div",Dn,[e("div",_n,[e("div",null,[K[12]||(K[12]=e("p",{class:"mb-1 text-xs font-medium text-gray-600 dark:text-gray-400"},"当前状态",-1)),e("p",Tn,[w.apiKey.expirationMode==="activation"&&!w.apiKey.isActivated?(i(),d(X,{key:0},[K[8]||(K[8]=e("i",{class:"fas fa-pause-circle mr-1 text-blue-500"},null,-1)),K[9]||(K[9]=$(" 未激活 ",-1)),e("span",Sn," (激活后 "+u(w.apiKey.activationDays||(w.apiKey.activationUnit==="hours"?24:30))+" "+u(w.apiKey.activationUnit==="hours"?"小时":"天")+"过期) ",1)],64)):w.apiKey.expiresAt?(i(),d(X,{key:1},[$(u(D(w.apiKey.expiresAt))+" ",1),a(w.apiKey.expiresAt)?(i(),d("span",{key:0,class:G(["ml-2 text-xs font-normal",a(w.apiKey.expiresAt).class])}," ("+u(a(w.apiKey.expiresAt).text)+") ",3)):A("",!0)],64)):(i(),d(X,{key:2},[K[10]||(K[10]=e("i",{class:"fas fa-infinity mr-1 text-gray-500"},null,-1)),K[11]||(K[11]=$(" 永不过期 ",-1))],64))])]),e("div",Un,[e("i",{class:G(["fas fa-hourglass-half text-lg",w.apiKey.expiresAt&&y(w.apiKey.expiresAt)?"text-red-500":"text-gray-400"])},null,2)])])]),w.apiKey.expirationMode==="activation"&&!w.apiKey.isActivated?(i(),d("div",Pn,[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:T},[K[13]||(K[13]=e("i",{class:"fas fa-rocket mr-2"},null,-1)),$(" 立即激活 (激活后 "+u(w.apiKey.activationDays||(w.apiKey.activationUnit==="hours"?24:30))+" "+u(w.apiKey.activationUnit==="hours"?"小时":"天")+"过期) ",1)]),e("p",Rn,[K[14]||(K[14]=e("i",{class:"fas fa-info-circle mr-1"},null,-1)),$(" 点击立即激活此 API Key,激活后将在 "+u(w.apiKey.activationDays||(w.apiKey.activationUnit==="hours"?24:30))+" "+u(w.apiKey.activationUnit==="hours"?"小时":"天")+"后过期 ",1)])])):A("",!0),e("div",null,[K[16]||(K[16]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"选择新的期限",-1)),e("div",Mn,[(i(),d(X,null,re(F,te=>e("button",{key:te.value,class:G(["rounded-lg px-3 py-2 text-sm font-medium transition-all",U.expireDuration===te.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:ne=>H(te.value)},u(te.label),11,Vn)),64)),e("button",{class:G(["rounded-lg px-3 py-2 text-sm font-medium transition-all",U.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:K[2]||(K[2]=te=>H("custom"))},K[15]||(K[15]=[e("i",{class:"fas fa-calendar-alt mr-1"},null,-1),$(" 自定义 ",-1)]),2)])]),U.expireDuration==="custom"?(i(),d("div",En,[K[17]||(K[17]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"选择日期和时间",-1)),_(e("input",{"onUpdate:modelValue":K[3]||(K[3]=te=>U.customExpireDate=te),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",min:S.value,type:"datetime-local",onChange:f},null,40,On),[[ee,U.customExpireDate]]),K[18]||(K[18]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 选择一个未来的日期和时间作为过期时间 ",-1))])):A("",!0),U.expiresAt!==w.apiKey.expiresAt?(i(),d("div",jn,[e("div",Gn,[e("div",null,[K[21]||(K[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"}),$(" 新的过期时间 ")],-1)),e("p",qn,[U.expiresAt?(i(),d(X,{key:0},[$(u(D(U.expiresAt))+" ",1),a(U.expiresAt)?(i(),d("span",{key:0,class:G(["ml-2 text-xs font-normal",a(U.expiresAt).class])}," ("+u(a(U.expiresAt).text)+") ",3)):A("",!0)],64)):(i(),d(X,{key:1},[K[19]||(K[19]=e("i",{class:"fas fa-infinity mr-1"},null,-1)),K[20]||(K[20]=$(" 永不过期 ",-1))],64))])]),K[22]||(K[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))])])):A("",!0),e("div",zn,[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:K[4]||(K[4]=te=>I.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-4 py-2.5 font-semibold",disabled:C.value||U.expiresAt===w.apiKey.expiresAt,onClick:j},[C.value?(i(),d("div",Wn)):(i(),d("i",Bn)),$(" "+u(C.value?"保存中...":"保存更改"),1)],8,Fn)])])])])):A("",!0)]))}},Hn=Se(Nn,[["__scopeId","data-v-fb30c1d3"]]),Yn={class:"w-full"},Qn={key:0,class:"flex items-center justify-center rounded-lg px-3 py-2 text-xs"},Jn={key:1,class:"space-y-1.5"},Xn={class:"flex items-center justify-between text-[11px] font-medium"},Zn={class:"text-gray-700 dark:text-gray-200"},ed={class:"relative h-1.5 overflow-hidden rounded-full bg-gray-200/85 dark:bg-gray-700/70"},td={class:"relative z-10 flex h-full items-center justify-between px-3"},sd={class:"flex items-center gap-1.5"},ad={class:"flex items-center gap-1.5"},rd={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"}},od={__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 N=w,c=O(()=>N.variant==="compact"),P=O(()=>{if(!N.limit||N.limit<=0)return 0;const D=N.current/N.limit*100;return Math.min(D,100)}),B=O(()=>{switch(N.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)]"}}),C=O(()=>{switch(N.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"}}),U=O(()=>{const D=P.value;return N.type==="daily"?D>=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":D>=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":N.type==="opus"?D>=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":D>=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":N.type==="window"?D>=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":D>=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":N.type==="total"?D>=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":D>=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"}),F=O(()=>{const D=P.value;if(D>=95)return"bg-rose-500 dark:bg-rose-400";if(D>=80)return"bg-amber-400 dark:bg-amber-300";switch(N.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"}}),S=O(()=>{const D=P.value;if(D>=95)return"text-rose-600 dark:text-rose-300";if(D>=80)return"text-amber-600 dark:text-amber-300";switch(N.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"}}),Q=O(()=>{const D=P.value;let y="";if(D>=90)y="text-red-700 dark:text-red-400";else if(D>=70)y="text-orange-700 dark:text-orange-400";else switch(N.type){case"daily":y="text-green-700 dark:text-green-400";break;case"opus":y="text-purple-700 dark:text-purple-400";break;case"window":y="text-blue-700 dark:text-blue-400";break;default:y="text-gray-600 dark:text-gray-400"}let a="";switch(N.type){case"daily":a="fas fa-calendar-day";break;case"opus":a="fas fa-gem";break;case"window":a="fas fa-clock";break;case"total":a="fas fa-wallet";break;default:a="fas fa-infinity"}return`${a} ${y}`}),H=O(()=>{if(P.value>40)return"text-white drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)]";switch(N.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"}}),f=O(()=>{const D=P.value;if(D>70)return"text-white drop-shadow-[0_2px_4px_rgba(0,0,0,0.9)]";if(D>=90)return"text-red-700 dark:text-red-300";if(D>=70)return"text-orange-700 dark:text-orange-300";switch(N.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(D,y)=>(i(),d("div",Yn,[!w.limit||w.limit<=0?(i(),d("div",Qn,y[0]||(y[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)]))):c.value?(i(),d("div",Jn,[e("div",Xn,[e("div",{class:G(["flex items-center gap-1.5",S.value])},[e("i",{class:G(["text-[11px]",Q.value])},null,2),e("span",null,u(w.label),1)],2),e("span",Zn,"$"+u(w.current.toFixed(2))+" / $"+u(w.limit.toFixed(2)),1)]),e("div",ed,[e("div",{class:G(["absolute inset-y-0 rounded-full transition-all duration-500 ease-out",F.value]),style:ht({width:P.value+"%"})},null,6)])])):(i(),d("div",{key:2,class:G(["group relative h-9 w-full overflow-hidden rounded-xl border transition-all duration-300 ease-out",B.value])},[e("div",{class:G(["absolute inset-0",C.value])},null,2),e("div",{class:G(["absolute inset-0 h-full transition-all duration-500 ease-out",U.value]),style:ht({width:P.value+"%"})},null,6),y[1]||(y[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",td,[e("div",sd,[e("i",{class:G(["text-xs",Q.value])},null,2),e("span",{class:G(["text-xs font-semibold",H.value])},u(w.label),3)]),e("div",ad,[e("span",{class:G(["text-xs font-bold tabular-nums",f.value])}," $"+u(w.current.toFixed(2))+" / $"+u(w.limit.toFixed(2)),3)])]),w.showShine&&P.value>0?(i(),d("div",rd)):A("",!0)],2))]))}},Me=Se(od,[["__scopeId","data-v-8a01dc56"]]),ld={key:0,class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},id={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"},nd={class:"mb-4 flex items-center justify-between sm:mb-6"},dd={class:"flex items-center gap-2 sm:gap-3"},ud={class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"},cd={class:"modal-scroll-content custom-scrollbar flex-1 overflow-y-auto"},gd={class:"mb-6 grid grid-cols-1 gap-4 md:grid-cols-2"},pd={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"},md={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},xd={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},yd={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"},fd={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},bd={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},vd={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"},kd={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},wd={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},hd={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"},Ad={class:"space-y-1 text-sm"},$d={class:"flex justify-between"},Cd={class:"font-semibold text-gray-900 dark:text-gray-100"},Id={class:"flex justify-between"},Kd={class:"font-semibold text-gray-900 dark:text-gray-100"},Ld={class:"mb-6"},Dd={class:"space-y-3 rounded-lg bg-gray-50 p-4 dark:bg-gray-700/50"},_d={class:"flex items-center justify-between"},Td={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},Sd={class:"flex items-center justify-between"},Ud={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},Pd={key:0,class:"flex items-center justify-between"},Rd={class:"text-sm font-semibold text-purple-600"},Md={key:1,class:"flex items-center justify-between"},Vd={class:"text-sm font-semibold text-purple-600"},Ed={key:0,class:"mb-6"},Od={class:"space-y-3 rounded-lg bg-gray-50 p-4 dark:bg-gray-700/50"},jd={key:0,class:"space-y-1.5"},Gd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},qd={key:1,class:"space-y-1.5"},zd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},Fd={key:2,class:"space-y-1.5"},Wd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},Bd={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"},Nd={class:"font-semibold text-purple-600 dark:text-purple-300"},Hd={key:4,class:"space-y-2"},Yd={__name:"UsageDetailModal",props:{show:{type:Boolean,required:!0},apiKey:{type:Object,required:!0}},emits:["close"],setup(w,{emit:N}){const c=w,P=N,B=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.total)==null?void 0:o.requests)||0}),C=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.daily)==null?void 0:o.requests)||0}),U=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.total)==null?void 0:o.tokens)||0}),F=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.daily)==null?void 0:o.tokens)||0}),S=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.total)==null?void 0:o.cost)||0}),Q=O(()=>c.apiKey.dailyCost||0),H=O(()=>c.apiKey.totalCostLimit||0),f=O(()=>c.apiKey.weeklyOpusCost||0),D=O(()=>c.apiKey.weeklyOpusCostLimit||0),y=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.total)==null?void 0:o.inputTokens)||0}),a=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.total)==null?void 0:o.outputTokens)||0}),j=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.total)==null?void 0:o.cacheCreateTokens)||0}),T=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.total)==null?void 0:o.cacheReadTokens)||0}),W=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.averages)==null?void 0:o.rpm)||0}),I=O(()=>{var h,o;return((o=(h=c.apiKey.usage)==null?void 0:h.averages)==null?void 0:o.tpm)||0}),K=O(()=>c.apiKey.dailyCostLimit>0||c.apiKey.totalCostLimit>0||c.apiKey.concurrencyLimit>0||c.apiKey.weeklyOpusCostLimit>0||c.apiKey.rateLimitWindow>0||c.apiKey.tokenLimit>0),te=O(()=>!c.apiKey.dailyCostLimit||c.apiKey.dailyCostLimit===0?0:Q.value/c.apiKey.dailyCostLimit*100),ne=O(()=>!H.value||H.value===0?0:S.value/H.value*100),ue=O(()=>!D.value||D.value===0?0:f.value/D.value*100),ke=h=>!h&&h!==0?"0":h.toLocaleString("zh-CN"),pe=h=>h>=1e6?(h/1e6).toFixed(1)+"M":h>=1e3?(h/1e3).toFixed(1)+"K":h.toString(),$e=()=>{P("close")};return(h,o)=>(i(),Ae(Ve,{to:"body"},[w.show?(i(),d("div",ld,[e("div",{class:"fixed inset-0 bg-gray-900 bg-opacity-50 backdrop-blur-sm",onClick:$e}),e("div",id,[e("div",nd,[e("div",dd,[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",ud," 使用统计详情 - "+u(w.apiKey.name),1)]),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600",onClick:$e},o[1]||(o[1]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),e("div",cd,[e("div",gd,[e("div",pd,[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",md,u(ke(B.value)),1),e("div",xd," 今日: "+u(ke(C.value))+" 次 ",1)]),e("div",yd,[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",fd,u(pe(U.value)),1),e("div",bd," 今日: "+u(pe(F.value)),1)]),e("div",vd,[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",kd," $"+u(S.value.toFixed(4)),1),e("div",wd," 今日: $"+u(Q.value.toFixed(4)),1)]),e("div",hd,[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",Ad,[e("div",$d,[o[5]||(o[5]=e("span",{class:"text-gray-600 dark:text-gray-400"},"RPM:",-1)),e("span",Cd,u(W.value),1)]),e("div",Id,[o[6]||(o[6]=e("span",{class:"text-gray-600 dark:text-gray-400"},"TPM:",-1)),e("span",Kd,u(I.value),1)])])])]),e("div",Ld,[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"}),$(" Token 使用分布 ")],-1)),e("div",Dd,[e("div",_d,[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",Td,u(pe(y.value)),1)]),e("div",Sd,[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,u(pe(a.value)),1)]),j.value>0?(i(),d("div",Pd,[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",Rd,u(pe(j.value)),1)])):A("",!0),T.value>0?(i(),d("div",Md,[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",Vd,u(pe(T.value)),1)])):A("",!0)])]),K.value?(i(),d("div",Ed,[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"}),$(" 限制设置 ")],-1)),e("div",Od,[w.apiKey.dailyCostLimit>0?(i(),d("div",jd,[ae(Me,{current:Q.value,label:"每日费用限制",limit:w.apiKey.dailyCostLimit,"show-shine":!0,type:"daily"},null,8,["current","limit"]),e("div",Gd," 已使用 "+u(Math.min(te.value,100).toFixed(1))+"% ",1)])):A("",!0),w.apiKey.weeklyOpusCostLimit>0?(i(),d("div",qd,[ae(Me,{current:f.value,label:"Opus 周费用限制",limit:w.apiKey.weeklyOpusCostLimit,"show-shine":!0,type:"opus"},null,8,["current","limit"]),e("div",zd," 已使用 "+u(Math.min(ue.value,100).toFixed(1))+"% ",1)])):A("",!0),w.apiKey.totalCostLimit>0?(i(),d("div",Fd,[ae(Me,{current:S.value,label:"总费用限制",limit:w.apiKey.totalCostLimit,"show-shine":!0,type:"total"},null,8,["current","limit"]),e("div",Wd," 已使用 "+u(Math.min(ne.value,100).toFixed(1))+"% ",1)])):A("",!0),w.apiKey.concurrencyLimit>0?(i(),d("div",Bd,[o[13]||(o[13]=e("span",{class:"text-gray-600 dark:text-gray-300"},"并发限制",-1)),e("span",Nd,u(w.apiKey.currentConcurrency||0)+" / "+u(w.apiKey.concurrencyLimit),1)])):A("",!0),w.apiKey.rateLimitWindow>0?(i(),d("div",Hd,[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"}),$(" 时间窗口限制 ")],-1)),ae(ua,{"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"])])):A("",!0)])])):A("",!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:$e}," 关闭 ")])])])):A("",!0)]))}},Qd=Se(Yd,[["__scopeId","data-v-da99842f"]]),Jd={class:"tab-content"},Xd={class:"card p-4 sm:p-6"},Zd={class:"mb-4 flex flex-col gap-4 sm:mb-6"},e0={class:"border-b border-gray-200 dark:border-gray-700"},t0={"aria-label":"Tabs",class:"-mb-px flex space-x-8"},s0={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"},a0={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"},r0={key:0,class:"tab-panel"},o0={class:"mb-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between"},l0={class:"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:gap-3"},i0={class:"group relative min-w-[140px]"},n0={key:0,class:"flex items-center"},d0={class:"group relative min-w-[140px]"},u0={class:"relative"},c0={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"},g0={class:"flex min-w-[240px] flex-col gap-2 sm:flex-row sm:items-center"},p0={class:"sm:w-44"},m0={class:"group relative flex-1"},x0={class:"relative flex items-center"},y0=["placeholder"],f0={class:"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:gap-3"},b0=["disabled"],v0={class:"relative"},k0={class:"relative"},w0={key:0,class:"py-12 text-center"},h0={key:1,class:"py-12 text-center"},A0={key:2,class:"table-wrapper hidden md:block"},$0={class:"table-container"},C0={class:"w-full"},I0={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"},K0={key:0,class:"checkbox-column sticky left-0 z-20 min-w-[50px] px-3 py-4 text-left"},L0={class:"flex items-center"},D0=["indeterminate"],_0={key:1,class:"fas fa-sort ml-1 text-gray-400"},T0={key:1,class:"fas fa-sort ml-1 text-gray-400"},S0=["title"],U0={key:1,class:"fas fa-sort ml-1 text-gray-400"},P0={key:2,class:"fas fa-clock ml-1 text-gray-400",title:"索引更新中"},R0={key:1,class:"fas fa-sort ml-1 text-gray-400"},M0={key:1,class:"fas fa-sort ml-1 text-gray-400"},V0={key:1,class:"fas fa-sort ml-1 text-gray-400"},E0={key:0,class:"checkbox-column sticky left-0 z-10 px-3 py-3"},O0={class:"flex items-center"},j0=["value"],G0={class:"min-w-0"},q0=["title"],z0={key:0,class:"mt-1 text-xs text-red-600"},F0={class:"px-3 py-3"},W0={class:"space-y-1"},B0={key:0,class:"flex items-center gap-1 text-xs text-gray-400 dark:text-gray-500"},N0={key:0,class:"flex items-center gap-1 text-xs"},H0={class:"truncate text-gray-600 dark:text-gray-400"},Y0={key:1,class:"flex items-center gap-1 text-xs"},Q0={class:"truncate text-gray-600 dark:text-gray-400"},J0={key:2,class:"flex items-center gap-1 text-xs"},X0={class:"truncate text-gray-600 dark:text-gray-400"},Z0={key:3,class:"flex items-center gap-1 text-xs"},eu={class:"truncate text-gray-600 dark:text-gray-400"},tu={key:4,class:"flex items-center gap-1 text-xs"},su={class:"truncate text-gray-600 dark:text-gray-400"},au={key:5,class:"text-xs text-gray-500 dark:text-gray-400"},ru={class:"px-3 py-3"},ou={class:"flex flex-wrap gap-1"},lu={key:0,class:"text-xs text-gray-400"},iu={class:"whitespace-nowrap px-3 py-3"},nu={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},du={key:0,class:"flex items-center justify-end"},uu={key:1,class:"font-semibold text-blue-600 dark:text-blue-400",style:{"font-size":"14px"}},cu={key:2,class:"text-gray-400"},gu={class:"px-2 py-2",style:{"font-size":"12px"}},pu={class:"flex flex-col gap-2"},mu={key:0,class:"space-y-2"},xu={key:2,class:"space-y-1.5"},yu={class:"flex items-center justify-between text-[10px]"},fu={class:"flex items-center gap-1 text-sky-600 dark:text-sky-300"},bu={class:"font-medium"},vu={key:3,class:"flex items-center justify-center gap-1.5 py-2 text-gray-500 dark:text-gray-400"},ku={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},wu={key:0,class:"flex items-center justify-end"},hu={key:1,class:"flex items-center justify-end gap-1"},Au={class:"font-medium text-purple-600 dark:text-purple-400",style:{"font-size":"13px"}},$u={key:2,class:"text-gray-400"},Cu={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Iu={key:0,class:"flex items-center justify-end"},Ku={key:1,class:"flex items-center justify-end gap-1"},Lu={class:"font-medium text-gray-900 dark:text-gray-100",style:{"font-size":"13px"}},Du={key:2,class:"text-gray-400"},_u={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Tu={class:"flex flex-col leading-tight"},Su=["title"],Uu={key:1,class:"text-gray-400",style:{"font-size":"13px"}},Pu={key:2,class:"mt-1 text-xs text-gray-400 dark:text-gray-500"},Ru=["title"],Mu={key:0,class:"ml-1 text-gray-400 dark:text-gray-500"},Vu={key:4,class:"mt-1 text-xs text-gray-400 dark:text-gray-500"},Eu={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Ou={class:"whitespace-nowrap px-3 py-3 text-sm text-gray-700 dark:text-gray-300"},ju={class:"inline-flex items-center gap-1.5"},Gu={key:0,class:"inline-flex items-center text-blue-600 dark:text-blue-400",style:{"font-size":"13px"}},qu={key:1},zu=["onClick"],Fu=["onClick"],Wu=["onClick"],Bu=["onClick"],Nu={class:"operations-column operations-cell whitespace-nowrap px-3 py-3",style:{"font-size":"13px"}},Hu={class:"hidden gap-1 2xl:flex"},Yu=["onClick"],Qu=["onClick"],Ju=["onClick"],Xu=["onClick"],Zu=["title","onClick"],ec={class:"ml-1"},tc=["onClick"],sc={class:"flex items-center gap-1 2xl:hidden"},ac=["onClick"],rc=["onClick"],oc={key:0},lc={class:"bg-gray-50 px-3 py-3 dark:bg-gray-700",colspan:"13"},ic={key:0,class:"py-4 text-center"},nc={class:"space-y-4"},dc={class:"mb-4 flex items-center justify-between"},uc={class:"flex items-center gap-2"},cc={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"},gc={class:"flex items-center gap-1"},pc={class:"flex gap-1 rounded bg-gray-100 p-1 dark:bg-gray-700"},mc=["onClick"],xc={key:0,class:"py-8 text-center"},yc={class:"mb-3 flex items-center justify-center gap-2"},fc=["onClick"],bc={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"},vc={class:"mb-3 flex items-start justify-between"},kc={class:"flex-1"},wc={class:"mb-1 block text-sm font-semibold text-gray-800 dark:text-gray-200"},hc={class:"rounded-full bg-blue-50 px-2 py-1 text-xs text-gray-500 dark:bg-blue-900/30 dark:text-gray-400"},Ac={class:"mb-3 space-y-2"},$c={class:"flex items-center justify-between text-sm"},Cc={class:"font-semibold text-gray-900 dark:text-gray-100"},Ic={class:"flex items-center justify-between text-sm"},Kc={class:"font-semibold text-green-600"},Lc={class:"mt-2 border-t border-gray-100 pt-2 dark:border-gray-600"},Dc={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},_c={class:"font-medium"},Tc={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},Sc={class:"font-medium"},Uc={key:0,class:"flex items-center justify-between text-xs text-purple-600"},Pc={class:"font-medium"},Rc={key:1,class:"flex items-center justify-between text-xs text-purple-600"},Mc={class:"font-medium"},Vc={class:"mt-3 h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Ec={class:"mt-1 text-right"},Oc={class:"text-xs font-medium text-indigo-600"},jc={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"},Gc={class:"flex items-center justify-between text-sm"},qc={class:"flex gap-4 text-xs"},zc={class:"text-gray-600 dark:text-gray-400"},Fc={class:"font-semibold text-gray-800 dark:text-gray-200"},Wc={class:"text-gray-600 dark:text-gray-400"},Bc={class:"font-semibold text-gray-800 dark:text-gray-200"},Nc={key:3,class:"space-y-3 md:hidden"},Hc={class:"mb-3 flex items-start justify-between"},Yc={class:"flex items-center gap-3"},Qc=["value"],Jc={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},Xc={class:"mt-0.5 text-xs text-gray-500 dark:text-gray-400"},Zc={class:"mb-3 space-y-1.5"},eg={key:0,class:"flex flex-wrap items-center gap-1 text-xs"},tg={class:"text-gray-600 dark:text-gray-400"},sg={key:1,class:"flex flex-wrap items-center gap-1 text-xs"},ag={class:"text-gray-600 dark:text-gray-400"},rg={key:2,class:"flex flex-wrap items-center gap-1 text-xs"},og={class:"text-gray-600 dark:text-gray-400"},lg={key:3,class:"flex flex-wrap items-center gap-1 text-xs"},ig={class:"text-gray-600 dark:text-gray-400"},ng={key:4,class:"flex flex-wrap items-center gap-1 text-xs"},dg={class:"text-gray-600 dark:text-gray-400"},ug={key:5,class:"text-xs text-gray-500 dark:text-gray-400"},cg={key:6,class:"text-xs text-red-600"},gg={class:"mb-3 space-y-2"},pg={class:"rounded-lg bg-gray-50 p-3 dark:bg-gray-700"},mg={class:"mb-2 flex items-center justify-between"},xg={class:"text-xs text-gray-600 dark:text-gray-400"},yg=["onClick"],fg={class:"grid grid-cols-2 gap-3"},bg={key:0,class:"h-5 w-12 animate-pulse rounded bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700"},vg={key:1,class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},kg={key:2,class:"text-sm font-semibold text-gray-400"},wg={key:0,class:"h-5 w-14 animate-pulse rounded bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700"},hg={key:1,class:"text-sm font-semibold text-green-600"},Ag={key:2,class:"text-sm font-semibold text-gray-400"},$g={class:"mt-2 text-xs text-gray-600 dark:text-gray-400"},Cg={class:"flex items-center justify-between"},Ig={class:"font-medium text-gray-700 dark:text-gray-300"},Kg={class:"mt-1 flex items-center justify-between"},Lg={key:0,class:"text-gray-400 dark:text-gray-500"},Dg=["title"],_g={key:0,class:"ml-1 text-gray-400 dark:text-gray-500"},Tg={key:2,class:"text-gray-400 dark:text-gray-500"},Sg={class:"space-y-2"},Ug={key:0,class:"space-y-2"},Pg={key:2,class:"space-y-2"},Rg={class:"flex items-center justify-between text-xs"},Mg={class:"flex items-center gap-1.5 text-sky-600 dark:text-sky-300"},Vg={class:"font-medium"},Eg={key:3,class:"flex items-center justify-center gap-1.5 py-2 text-gray-500 dark:text-gray-400"},Og={class:"mb-3 text-xs text-gray-500 dark:text-gray-400"},jg={class:"mb-1 flex justify-between"},Gg={class:"flex items-center justify-between"},qg={class:"flex items-center gap-1"},zg=["onClick"],Fg={key:0,class:"mb-3 flex flex-wrap gap-1"},Wg={class:"mt-3 flex gap-2 border-t border-gray-100 pt-3 dark:border-gray-600"},Bg=["onClick"],Ng=["onClick"],Hg=["onClick"],Yg=["onClick"],Qg=["onClick"],Jg={key:4,class:"mt-4 flex flex-col items-center justify-between gap-4 sm:mt-6 sm:flex-row"},Xg={class:"flex w-full flex-col items-center gap-3 sm:w-auto sm:flex-row"},Zg={class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},ep={class:"flex items-center gap-2"},tp=["value"],sp={class:"flex items-center gap-2"},ap=["disabled"],rp={class:"flex items-center gap-1"},op={key:1,class:"hidden px-2 text-gray-500 dark:text-gray-400 sm:inline"},lp=["onClick"],ip={key:2,class:"hidden px-2 text-gray-500 dark:text-gray-400 sm:inline"},np=["disabled"],dp={key:1,class:"tab-panel"},up={key:0,class:"py-12 text-center"},cp={key:1,class:"py-12 text-center"},gp={key:2},pp={class:"mb-4 flex justify-end"},mp={class:"table-wrapper"},xp={class:"table-container"},yp={class:"w-full"},fp={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"},bp={key:0,class:"min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"},vp={class:"divide-y divide-gray-200/50 dark:divide-gray-600/50"},kp={class:"name-column sticky left-0 z-10 px-3 py-3"},wp={class:"flex items-center"},hp={class:"min-w-0"},Ap=["title"],$p={class:"px-3 py-3"},Cp={class:"space-y-1"},Ip={key:0,class:"flex items-center gap-1 text-xs"},Kp={key:1,class:"flex items-center gap-1 text-xs"},Lp={key:2,class:"flex items-center gap-1 text-xs"},Dp={key:3,class:"text-xs text-gray-500 dark:text-gray-400"},_p={key:0,class:"px-3 py-3"},Tp={class:"text-xs"},Sp={key:0,class:"text-blue-600"},Up={key:1,class:"text-green-600"},Pp={key:2,class:"text-gray-500 dark:text-gray-400"},Rp={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Mp={class:"px-3 py-3"},Vp={class:"text-xs"},Ep={key:0,class:"text-blue-600"},Op={key:1,class:"text-green-600"},jp={key:2,class:"text-gray-500 dark:text-gray-400"},Gp={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},qp={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},zp={class:"font-medium text-blue-600 dark:text-blue-400",style:{"font-size":"13px"}},Fp={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Wp={class:"font-medium text-purple-600 dark:text-purple-400",style:{"font-size":"13px"}},Bp={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Np={class:"flex items-center justify-end gap-1"},Hp={class:"font-medium text-gray-900 dark:text-gray-100",style:{"font-size":"13px"}},Yp={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Qp={class:"flex flex-col leading-tight"},Jp=["title"],Xp={key:1,class:"text-gray-400",style:{"font-size":"13px"}},Zp={key:2,class:"mt-1 text-xs text-gray-400 dark:text-gray-500"},em=["title"],tm={key:0,class:"ml-1 text-gray-400 dark:text-gray-500"},sm={key:4,class:"mt-1 text-xs text-gray-400 dark:text-gray-500"},am={class:"operations-column operations-cell px-3 py-3"},rm={class:"flex items-center gap-2"},om=["onClick"],lm=["onClick"],bs=16,im={__name:"ApiKeysView",setup(w){const N=jt(),c=da(),P=L([]),B=O(()=>{var s;return((s=c.oemSettings)==null?void 0:s.ldapEnabled)||!1}),C=L([]),U=L(!1),F=L(!1),S=L(!1),Q=L(!1),H=L("today"),f=He({type:"preset",preset:"today",customStart:"",customEnd:"",customRange:null}),D=O(()=>S.value),y=()=>{S.value=!S.value,S.value||(C.value=[],U.value=!1,F.value=!1)},a=O(()=>[{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=L("active"),T=L([]),W=L(!1),I=L("createdAt"),K=L("desc"),te=L({}),ne=L({}),ue=L({page:1,pageSize:20,total:0,totalPages:0}),ke=L(new Map),pe=L(new Set),$e=L(new Map),h=L(new Set),o=L({}),n=L({}),p=L([new Date(2e3,1,1,0,0,0),new Date(2e3,2,1,23,59,59)]),k=L({claude:[],gemini:[],geminiApi:[],openai:[],openaiResponses:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),m=L(!1),l=L(!1),x=L(null),oe=L(null),xe=L(!1),be=L(null),me=L(""),we=L([]),ye=L(""),Y=L("apiKey"),J=O(()=>[{value:"apiKey",label:"按Key名称",icon:"fa-key"},{value:"bindingAccount",label:"按所属账号",icon:"fa-id-badge"}]),De=O(()=>{const s=[{value:"",label:"所有标签",icon:"fa-asterisk"}];return we.value.forEach(t=>{s.push({value:t,label:t,icon:"fa-tag"})}),s}),Ye=O(()=>me.value?P.value.filter(s=>s.tags&&s.tags.includes(me.value)).length:0),ve=L(1),_e=L((()=>{const s=localStorage.getItem("apiKeysPageSize");if(s){const t=parseInt(s,10);if([10,20,50,100].includes(t))return t}return 10})()),ws=[10,20,50,100],Qe=L(!1),dt=L(!1),ut=L(!1),At=L(!1),$t=L(!1),ct=L(!1),qt=L(null),zt=L(null),Ft=L(null),Wt=L([]),gt=O(()=>P.value),Ge=O(()=>ue.value.totalPages||0),Je=O(()=>{const s=[],t=ve.value,g=Ge.value;if(g<=7)for(let r=1;r<=g;r++)s.push(r);else{let r=Math.max(1,t-2),v=Math.min(g,t+2);t<=3?v=5:t>=g-2&&(r=g-4);for(let M=r;M<=v;M++)s.push(M)}return s}),Bt=O(()=>{const s=Je.value;return s.length===0?!1:s[0]>1}),Nt=O(()=>{const s=Je.value;return s.length===0?!1:s[s.length-1]<Ge.value}),hs=O(()=>{const s=Je.value;return s.length===0?!1:Bt.value&&s[0]>2}),As=O(()=>{const s=Je.value;return s.length===0?!1:Nt.value&&s[s.length-1]<Ge.value-1}),Fe=O(()=>P.value),pt=async(s=!1)=>{var t,g;if(!(l.value&&!s)){m.value=!0;try{const[r,v,M,V,R,se,ie,b,z]=await Promise.all([q.get("/admin/claude-accounts"),q.get("/admin/claude-console-accounts"),q.get("/admin/gemini-accounts"),q.get("/admin/gemini-api-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")]),de=[];r.success&&((t=r.data)==null||t.forEach(Z=>{de.push({...Z,platform:"claude-oauth",isDedicated:Z.accountType==="dedicated"})})),v.success&&((g=v.data)==null||g.forEach(Z=>{de.push({...Z,platform:"claude-console",isDedicated:Z.accountType==="dedicated"})})),k.value.claude=de;const he=[];if(M.success&&(M.data||[]).forEach(Z=>{he.push({...Z,platform:"gemini",isDedicated:Z.accountType==="dedicated"})}),V.success&&(k.value.geminiApi=(V.data||[]).map(Z=>({...Z,platform:"gemini-api",isDedicated:Z.accountType==="dedicated"})),k.value.geminiApi.forEach(Z=>{he.push(Z)})),k.value.gemini=he,R.success&&(k.value.openai=(R.data||[]).map(Z=>({...Z,isDedicated:Z.accountType==="dedicated"}))),se.success&&(k.value.openaiResponses=(se.data||[]).map(Z=>({...Z,isDedicated:Z.accountType==="dedicated"}))),ie.success&&(k.value.bedrock=(ie.data||[]).map(Z=>({...Z,isDedicated:Z.accountType==="dedicated"}))),b.success&&(k.value.droid=(b.data||[]).map(Z=>({...Z,platform:"droid",isDedicated:Z.accountType==="dedicated"}))),z.success){const Z=z.data||[];k.value.claudeGroups=Z.filter(ge=>ge.platform==="claude"),k.value.geminiGroups=Z.filter(ge=>ge.platform==="gemini"),k.value.openaiGroups=Z.filter(ge=>ge.platform==="openai"),k.value.droidGroups=Z.filter(ge=>ge.platform==="droid")}l.value=!0}catch{}finally{m.value=!1}}},Ce=async(s=!0)=>{var t,g,r;Q.value=!0;try{s&&(ke.value.clear(),$e.value.clear());const v=new URLSearchParams;v.set("page",ve.value.toString()),v.set("pageSize",_e.value.toString()),v.set("searchMode",Y.value),ye.value&&v.set("search",ye.value),me.value&&v.set("tag",me.value);const V=["name","createdAt","expiresAt","lastUsedAt","isActive","status","cost"].includes(I.value)?I.value:"createdAt";v.set("sortBy",V),v.set("sortOrder",K.value),V==="cost"&&(f.type==="custom"&&f.customStart&&f.customEnd?(v.set("costTimeRange","custom"),v.set("costStartDate",f.customStart),v.set("costEndDate",f.customEnd)):v.set("costTimeRange",f.preset||"7days")),f.type==="custom"&&f.customStart&&f.customEnd?(v.set("startDate",f.customStart),v.set("endDate",f.customEnd),v.set("timeRange","custom")):f.preset==="all"?v.set("timeRange","all"):v.set("timeRange",f.preset);const R=await q.get(`/admin/api-keys?${v.toString()}`);R.success&&(P.value=((t=R.data)==null?void 0:t.items)||[],(g=R.data)!=null&&g.pagination&&(ue.value=R.data.pagination,ve.value>ue.value.totalPages&&ue.value.totalPages>0&&(ve.value=ue.value.totalPages)),(r=R.data)!=null&&r.availableTags&&(we.value=R.data.availableTags),$s(),Cs())}catch{E("加载 API Keys 失败","error")}finally{Q.value=!1}},$s=async()=>{const s=P.value;if(!s||s.length===0)return;let t=f.preset,g=null,r=null;f.type==="custom"&&f.customStart&&f.customEnd&&(t="custom",g=f.customStart,r=f.customEnd);const v=s.filter(V=>{const R=ke.value.get(V.id);return!R||R.timeRange!==t||t==="custom"&&(R.startDate!==g||R.endDate!==r)});if(v.length===0)return;const M=v.map(V=>V.id);M.forEach(V=>pe.value.add(V));try{const V={keyIds:M,timeRange:t};t==="custom"&&(V.startDate=g,V.endDate=r);const R=await q.post("/admin/api-keys/batch-stats",V);if(R.success&&R.data)for(const[se,ie]of Object.entries(R.data))ke.value.set(se,{stats:ie,timeRange:t,startDate:g,endDate:r,timestamp:Date.now()})}catch(V){console.error("加载统计数据失败:",V)}finally{M.forEach(V=>pe.value.delete(V))}},fe=s=>{const t=ke.value.get(s);return(t==null?void 0:t.stats)||null},qe=s=>pe.value.has(s),Cs=async()=>{const s=P.value;if(!s||s.length===0)return;const t=s.filter(r=>!(!r.lastUsedAt||$e.value.has(r.id)));if(t.length===0)return;const g=t.map(r=>r.id);g.forEach(r=>h.value.add(r));try{const r=await q.post("/admin/api-keys/batch-last-usage",{keyIds:g});if(r.success&&r.data)for(const[v,M]of Object.entries(r.data))$e.value.set(v,M)}catch(r){console.error("加载最后使用账号数据失败:",r)}finally{g.forEach(r=>h.value.delete(r))}},Is=s=>$e.value.get(s)||null,mt=s=>h.value.has(s),xt=async()=>{j.value="deleted",W.value=!0;try{const s=await q.get("/admin/api-keys/deleted");s.success&&(T.value=s.apiKeys||[])}catch{E("加载已删除的 API Keys 失败","error")}finally{W.value=!1}},We=s=>{if(s==="cost"){if(!yt.value){E("费用排序索引正在更新中,请稍后重试","warning");return}f.type==="custom"&&E("正在计算费用排序,可能需要几秒钟...","info")}I.value===s?K.value=K.value==="asc"?"desc":"asc":(I.value=s,K.value=s==="cost"?"desc":"asc")},yt=O(()=>{if(f.type==="custom")return!0;const s=f.preset,t=ne.value[s];return(t==null?void 0:t.status)==="ready"}),Ks=O(()=>{if(f.type==="custom")return"点击按费用排序(实时计算,可能需要几秒钟)";const s=f.preset,t=ne.value[s];return t?t.status==="updating"?"费用排序索引正在更新中...":t.status==="ready"?`点击按费用排序(索引更新于: ${t.lastUpdate?new Date(t.lastUpdate).toLocaleString():"未知"})`:"费用排序索引状态未知":"费用排序索引未初始化"});let Be=null;const Ht=async()=>{try{const s=await q.get("/admin/api-keys/cost-sort-status");s.success&&(ne.value=s.data||{},Ls())}catch(s){console.error("Failed to fetch cost sort status:",s)}},Ls=()=>{Be&&clearTimeout(Be);const t=Object.values(ne.value).some(g=>(g==null?void 0:g.status)==="updating")?1e4:6e4;Be=setTimeout(Ht,t)},Ct=s=>!s&&s!==0?"0":s.toLocaleString("zh-CN"),Ke=s=>!s&&s!==0?"0":s>=1e6?(s/1e6).toFixed(1)+"M":s>=1e3?(s/1e3).toFixed(1)+"K":s.toString(),Xe=s=>{if(!s)return"未知账户";if(s.startsWith("group:")){const R=s.substring(6),se=k.value.claudeGroups.find(de=>de.id===R);if(se)return`分组-${se.name}`;const ie=k.value.geminiGroups.find(de=>de.id===R);if(ie)return`分组-${ie.name}`;const b=k.value.openaiGroups.find(de=>de.id===R);if(b)return`分组-${b.name}`;const z=k.value.droidGroups.find(de=>de.id===R);return z?`分组-${z.name}`:`分组-${R.substring(0,8)}`}const t=k.value.claude.find(R=>R.id===s);if(t)return`${t.name}`;if(s.startsWith("api:")){const R=s.replace("api:",""),se=k.value.gemini.find(ie=>ie.id===R&&ie.platform==="gemini-api");return se?`${se.name}`:`${R.substring(0,8)}`}const g=k.value.gemini.find(R=>R.id===s);if(g)return`${g.name}`;if(s.startsWith("responses:")){const R=s.replace("responses:",""),se=k.value.openaiResponses.find(ie=>ie.id===R);return se?`${se.name}`:`${R.substring(0,8)}`}const r=k.value.openai.find(R=>R.id===s);if(r)return`${r.name}`;const v=k.value.openaiResponses.find(R=>R.id===s);if(v)return`${v.name}`;const M=k.value.bedrock.find(R=>R.id===s);if(M)return`${M.name}`;const V=k.value.droid.find(R=>R.id===s);return V?`${V.name}`:`${s.substring(0,8)}`},Ds=s=>!!(s.claudeAccountId||s.claudeConsoleAccountId||s.geminiAccountId||s.openaiAccountId||s.bedrockAccountId||s.droidAccountId),Yt=s=>{if(s.claudeAccountId){const t=Xe(s.claudeAccountId);if(s.claudeAccountId.startsWith("group:"))return t;const g=k.value.claude.find(r=>r.id===s.claudeAccountId);return g?g.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}if(s.claudeConsoleAccountId){const t=k.value.claude.find(g=>g.id===s.claudeConsoleAccountId&&g.platform==="claude-console");return t?`Console-${t.name}`:"⚠️ Console账户不存在"}return""},Qt=s=>{if(s.geminiAccountId){const t=Xe(s.geminiAccountId);if(s.geminiAccountId.startsWith("group:"))return t;if(s.geminiAccountId.startsWith("api:")){const r=s.geminiAccountId.replace("api:",""),v=k.value.gemini.find(M=>M.id===r&&M.platform==="gemini-api");return v?v.accountType==="dedicated"?`🔒 API专属-${t}`:`API-${t}`:`⚠️ ${t} (账户不存在)`}const g=k.value.gemini.find(r=>r.id===s.geminiAccountId);return g?g.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},Jt=s=>{if(s.openaiAccountId){const t=Xe(s.openaiAccountId);if(s.openaiAccountId.startsWith("group:"))return t;let g=null;if(s.openaiAccountId.startsWith("responses:")){const r=s.openaiAccountId.replace("responses:","");g=k.value.openaiResponses.find(v=>v.id===r)}else g=k.value.openai.find(r=>r.id===s.openaiAccountId);return g?g.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},Xt=s=>{if(s.bedrockAccountId){const t=Xe(s.bedrockAccountId);if(s.bedrockAccountId.startsWith("group:"))return t;const g=k.value.bedrock.find(r=>r.id===s.bedrockAccountId);return g?g.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},Zt=s=>{if(s.droidAccountId){const t=Xe(s.droidAccountId);if(s.droidAccountId.startsWith("group:"))return t;const g=k.value.droid.find(r=>r.id===s.droidAccountId);return g?g.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},Ze=s=>s?new Date(s)<new Date:!1,et=s=>!s||Ze(s)?!1:(new Date(s)-new Date)/(1e3*60*60*24)<=7,es=s=>s?new Date(s).toLocaleDateString("zh-CN"):"",ts=async s=>{te.value[s]?te.value[s]=!1:(te.value[s]=!0,n.value[s]||rs(s),await ft(s,!0))},ft=async(s,t=!1)=>{if(!t&&o.value[s]&&o.value[s].length>0)return;const g=Ee(s);try{let r=`/admin/api-keys/${s}/model-stats`;const v=new URLSearchParams;if(g.customStart&&g.customEnd)v.append("startDate",g.customStart),v.append("endDate",g.customEnd),v.append("period","custom");else{const V=g.preset==="today"||g.preset==="7days"?"daily":"monthly";v.append("period",V)}r+="?"+v.toString();const M=await q.get(r);M.success&&(o.value[s]=M.data||[])}catch{E("加载模型统计失败","error"),o.value[s]=[]}},ss=(s,t)=>{const g=t.reduce((r,v)=>r+(v.allTokens||0),0);return g===0?0:Math.round(s/g*100)},_s=s=>s.formatted&&s.formatted.total?s.formatted.total:s.cost!==void 0?`$${s.cost.toFixed(6)}`:"$0.000000",Ts=s=>{var t,g,r,v,M,V;if(f.type==="custom"){if(s.usage){if(s.usage.custom&&s.usage.custom.requests!==void 0)return s.usage.custom.requests;if(s.usage.total&&s.usage.total.requests!==void 0)return s.usage.total.requests}return 0}else{if(f.preset==="today")return((g=(t=s.usage)==null?void 0:t.daily)==null?void 0:g.requests)||0;if(f.preset==="7days")return s.usage&&s.usage["7days"]&&s.usage["7days"].requests!==void 0?s.usage["7days"].requests:0;if(f.preset==="30days"){if(s.usage){if(s.usage["30days"]&&s.usage["30days"].requests!==void 0)return s.usage["30days"].requests;if(s.usage.monthly&&s.usage.monthly.requests!==void 0)return s.usage.monthly.requests}return 0}else return f.preset==="all"?s.usage&&s.usage.all&&s.usage.all.requests!==void 0?s.usage.all.requests:((v=(r=s.usage)==null?void 0:r.total)==null?void 0:v.requests)||0:((V=(M=s.usage)==null?void 0:M.total)==null?void 0:V.requests)||0}},Ss=s=>{if(f.type==="custom"){if(s.usage){if(s.usage.custom&&s.usage.custom.cost!==void 0)return s.usage.custom.cost;if(s.usage.total&&s.usage.total.cost!==void 0)return s.usage.total.cost}return 0}else{if(f.preset==="today")return s.dailyCost||0;if(f.preset==="7days")return s.usage&&s.usage["7days"]&&s.usage["7days"].cost!==void 0?s.usage["7days"].cost:s.weeklyCost||s.periodCost||0;if(f.preset==="30days"){if(s.usage){if(s.usage["30days"]&&s.usage["30days"].cost!==void 0)return s.usage["30days"].cost;if(s.usage.monthly&&s.usage.monthly.cost!==void 0)return s.usage.monthly.cost;if(s.usage.total&&s.usage.total.cost!==void 0)return s.usage.total.cost}return s.monthlyCost||s.periodCost||0}else return f.preset==="all"?s.usage&&s.usage.all&&s.usage.all.cost!==void 0?s.usage.all.cost:s.totalCost||0:s.periodCost||s.totalCost||0}},Us=s=>{var t,g,r,v,M,V;if(f.type==="custom"){if(s.usage){if(s.usage.custom&&s.usage.custom.tokens!==void 0)return s.usage.custom.tokens;if(s.usage.total&&s.usage.total.tokens!==void 0)return s.usage.total.tokens}return 0}else{if(f.preset==="today")return((g=(t=s.usage)==null?void 0:t.daily)==null?void 0:g.tokens)||0;if(f.preset==="7days")return s.usage&&s.usage["7days"]&&s.usage["7days"].tokens!==void 0?s.usage["7days"].tokens:0;if(f.preset==="30days"){if(s.usage){if(s.usage["30days"]&&s.usage["30days"].tokens!==void 0)return s.usage["30days"].tokens;if(s.usage.monthly&&s.usage.monthly.tokens!==void 0)return s.usage.monthly.tokens;if(s.usage.total&&s.usage.total.tokens!==void 0)return s.usage.total.tokens}return 0}else return f.preset==="all"?s.usage&&s.usage.all&&s.usage.all.tokens!==void 0?s.usage.all.tokens:((v=(r=s.usage)==null?void 0:r.total)==null?void 0:v.tokens)||0:((V=(M=s.usage)==null?void 0:M.total)==null?void 0:V.tokens)||0}},Ps=s=>{var t,g,r,v,M,V;if(f.type==="custom"){if(s.usage){if(s.usage.custom&&s.usage.custom.inputTokens!==void 0)return s.usage.custom.inputTokens;if(s.usage.total&&s.usage.total.inputTokens!==void 0)return s.usage.total.inputTokens}return 0}else{if(f.preset==="today")return((g=(t=s.usage)==null?void 0:t.daily)==null?void 0:g.inputTokens)||0;if(f.preset==="7days")return s.usage&&s.usage["7days"]&&s.usage["7days"].inputTokens!==void 0?s.usage["7days"].inputTokens:0;if(f.preset==="30days"){if(s.usage){if(s.usage["30days"]&&s.usage["30days"].inputTokens!==void 0)return s.usage["30days"].inputTokens;if(s.usage.monthly&&s.usage.monthly.inputTokens!==void 0)return s.usage.monthly.inputTokens;if(s.usage.total&&s.usage.total.inputTokens!==void 0)return s.usage.total.inputTokens}return 0}else return f.preset==="all"?s.usage&&s.usage.all&&s.usage.all.inputTokens!==void 0?s.usage.all.inputTokens:((v=(r=s.usage)==null?void 0:r.total)==null?void 0:v.inputTokens)||0:((V=(M=s.usage)==null?void 0:M.total)==null?void 0:V.inputTokens)||0}},Rs=s=>{var t,g,r,v,M,V;if(f.type==="custom"){if(s.usage){if(s.usage.custom&&s.usage.custom.outputTokens!==void 0)return s.usage.custom.outputTokens;if(s.usage.total&&s.usage.total.outputTokens!==void 0)return s.usage.total.outputTokens}return 0}else{if(f.preset==="today")return((g=(t=s.usage)==null?void 0:t.daily)==null?void 0:g.outputTokens)||0;if(f.preset==="7days")return s.usage&&s.usage["7days"]&&s.usage["7days"].outputTokens!==void 0?s.usage["7days"].outputTokens:0;if(f.preset==="30days"){if(s.usage){if(s.usage["30days"]&&s.usage["30days"].outputTokens!==void 0)return s.usage["30days"].outputTokens;if(s.usage.monthly&&s.usage.monthly.outputTokens!==void 0)return s.usage.monthly.outputTokens;if(s.usage.total&&s.usage.total.outputTokens!==void 0)return s.usage.total.outputTokens}return 0}else return f.preset==="all"?s.usage&&s.usage.all&&s.usage.all.outputTokens!==void 0?s.usage.all.outputTokens:((v=(r=s.usage)==null?void 0:r.total)==null?void 0:v.outputTokens)||0:((V=(M=s.usage)==null?void 0:M.total)==null?void 0:V.outputTokens)||0}},Ms=s=>{if(!o.value[s.id])return Ss(s);const t=o.value[s.id]||[];let g=0;return t.forEach(r=>{if(r.cost!==void 0)g+=r.cost;else if(r.formatted&&r.formatted.total){const v=r.formatted.total.replace("$","").replace(",",""),M=parseFloat(v);isNaN(M)||(g+=M)}}),g},Vs=s=>{if(as(s),I.value==="cost"){if(s==="custom")return;const t=ne.value[s];(!t||t.status!=="ready")&&(I.value="createdAt",K.value="desc",E("当前时间范围的费用排序索引未就绪,已切换到默认排序","info"))}},as=s=>{if(f.preset=s,s==="custom"){if(f.type="custom",!f.customRange){const t=new Date,g=new Date(t);g.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";f.customRange=[r(g),r(t)],f.customStart=g.toISOString().split("T")[0],f.customEnd=t.toISOString().split("T")[0]}}else if(s==="all")f.type="preset",f.customStart=null,f.customEnd=null;else{f.type="preset";const t=new Date,g=new Date(t);s==="today"?g.setHours(0,0,0,0):s==="7days"?g.setDate(t.getDate()-6):s==="30days"&&g.setDate(t.getDate()-29),f.customStart=g.toISOString().split("T")[0],f.customEnd=t.toISOString().split("T")[0]}Ce()},Es=s=>{s&&s.length===2?(f.type="custom",f.preset="custom",f.customRange=s,f.customStart=s[0].split(" ")[0],f.customEnd=s[1].split(" ")[0],Ce()):s===null&&as("today")},rs=s=>{const t=new Date;new Date(t).setHours(0,0,0,0),n.value[s]={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}]}},Ee=s=>(n.value[s]||rs(s),n.value[s]),os=(s,t)=>{const g=Ee(t);g.type="preset",g.preset=s;const r=g.presetOptions.find(v=>v.value===s);if(r)if(s==="custom"){if(g.type="custom",!g.customRange){const v=new Date,M=new Date(v);M.setDate(v.getDate()-6);const V=R=>R.getFullYear()+"-"+String(R.getMonth()+1).padStart(2,"0")+"-"+String(R.getDate()).padStart(2,"0")+" 00:00:00";g.customRange=[V(M),V(v)],g.customStart=M.toISOString().split("T")[0],g.customEnd=v.toISOString().split("T")[0]}}else{const v=new Date,M=new Date(v);M.setDate(v.getDate()-(r.days-1)),g.customStart=M.toISOString().split("T")[0],g.customEnd=v.toISOString().split("T")[0];const V=R=>R.getFullYear()+"-"+String(R.getMonth()+1).padStart(2,"0")+"-"+String(R.getDate()).padStart(2,"0")+" 00:00:00";g.customRange=[V(M),V(v)]}ft(t,!0)},Os=(s,t)=>{const g=Ee(s);t&&t.length===2?(g.type="custom",g.preset="custom",g.customRange=t,g.customStart=t[0].split(" ")[0],g.customEnd=t[1].split(" ")[0],ft(s,!0)):t===null&&os("7days",s)},ls=s=>s>new Date,js=s=>{const t=Ee(s);t.type="preset",t.preset="today";const g=new Date;new Date(g).setHours(0,0,0,0),t.customStart=g.toISOString().split("T")[0],t.customEnd=g.toISOString().split("T")[0],t.customRange=null,ft(s,!0),E("已重置筛选条件并刷新数据","info")},Gs=()=>{Qe.value=!0,l.value||pt()},It=s=>{qt.value=s,dt.value=!0,l.value||pt()},Kt=s=>{zt.value=s,ut.value=!0},qs=s=>{Qe.value=!1,Ft.value=s,At.value=!0,Ce()},zs=s=>{Qe.value=!1,Wt.value=s,$t.value=!0,Ce()},Fs=()=>{if(C.value.length===0){E("请先选择要编辑的 API Keys","warning");return}ct.value=!0,l.value||pt()},Ws=()=>{ct.value=!1,C.value=[],Ue(),Ce()},Bs=()=>{dt.value=!1,E("API Key 更新成功","success"),Ce()},Ns=()=>{ut.value=!1,E("API Key 续期成功","success"),Ce()},Hs=s=>{const t=[{key:"edit",label:"编辑",icon:"fa-edit",color:"blue",handler:()=>It(s)}];return s.expiresAt&&(Ze(s.expiresAt)||et(s.expiresAt))&&t.push({key:"renew",label:"续期",icon:"fa-clock",color:"green",handler:()=>Kt(s)}),t.push({key:"toggle",label:s.isActive?"禁用":"激活",icon:s.isActive?"fa-ban":"fa-check-circle",color:s.isActive?"orange":"green",handler:()=>Lt(s)}),t.push({key:"delete",label:"删除",icon:"fa-trash",color:"red",handler:()=>Dt(s.id)}),t},Lt=async s=>{let t=!0;if(s.isActive&&(window.showConfirm?t=await window.showConfirm("禁用 API Key",`确定要禁用 API Key "${s.name}" 吗?禁用后所有使用此 Key 的请求将返回 401 错误。`,"确定禁用","取消"):t=confirm(`确定要禁用 API Key "${s.name}" 吗?禁用后所有使用此 Key 的请求将返回 401 错误。`)),!!t)try{const g=await q.put(`/admin/api-keys/${s.id}`,{isActive:!s.isActive});if(g.success){E(`API Key 已${s.isActive?"禁用":"激活"}`,"success");const r=P.value.find(v=>v.id===s.id);r&&(r.isActive=!s.isActive)}else E(g.message||"操作失败","error")}catch{E("操作失败","error")}},Dt=async s=>{let t=!1;if(window.showConfirm?t=await window.showConfirm("删除 API Key","确定要删除这个 API Key 吗?此操作不可恢复。","确定删除","取消"):t=confirm("确定要删除这个 API Key 吗?此操作不可恢复。"),!!t)try{const g=await q.delete(`/admin/api-keys/${s}`);if(g.success){E("API Key 已删除","success");const r=C.value.indexOf(s);r>-1&&C.value.splice(r,1),Ue(),Ce()}else E(g.message||"删除失败","error")}catch{E("删除失败","error")}},Ys=async s=>{var g,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/${s}/restore`);v.success?(E("API Key 已成功恢复","success"),await xt(),await Ce()):E(v.error||"恢复失败","error")}catch(v){E(((r=(g=v.response)==null?void 0:g.data)==null?void 0:r.error)||"恢复失败","error")}},Qs=async s=>{var g,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/${s}/permanent`);v.success?(E("API Key 已彻底删除","success"),xt()):E(v.error||"彻底删除失败","error")}catch(v){E(((r=(g=v.response)==null?void 0:g.data)==null?void 0:r.error)||"彻底删除失败","error")}},Js=async()=>{var g,r;const s=T.value.length;if(s===0){E("没有需要清空的 API Keys","info");return}let t=!1;if(window.showConfirm?t=await window.showConfirm("清空所有已删除的 API Keys",`确定要彻底删除全部 ${s} 个已删除的 API Keys 吗?此操作不可恢复,所有相关数据将被永久删除。`,"确定清空全部","取消"):t=confirm(`确定要彻底删除全部 ${s} 个已删除的 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"),xt()):E(v.error||"清空失败","error")}catch(v){E(((r=(g=v.response)==null?void 0:g.data)==null?void 0:r.error)||"清空失败","error")}},Xs=async()=>{const s=C.value.length;if(s===0){E("请先选择要删除的 API Keys","warning");return}let t=!1;const g=`确定要删除选中的 ${s} 个 API Key 吗?此操作不可恢复。`;if(window.showConfirm?t=await window.showConfirm("批量删除 API Keys",g,"确定删除","取消"):t=confirm(g),!t)return;const r=[...C.value];try{const v=await q.delete("/admin/api-keys/batch",{data:{keyIds:r}});if(v.success){const{successCount:M,failedCount:V,errors:R}=v.data;if(M>0){if(E(`成功删除 ${M} 个 API Keys`,"success"),V>0){const se=R.map(ie=>`${ie.keyId}: ${ie.error}`).join(`
|
||
`);E(`${V} 个删除失败:
|
||
${se}`,"warning")}}else E("所有 API Keys 删除失败","error");C.value=[],Ue(),Ce()}else E(v.message||"批量删除失败","error")}catch{E("批量删除失败","error")}},Zs=()=>{if(U.value)Fe.value.forEach(s=>{C.value.includes(s.id)||C.value.push(s.id)});else{const s=new Set(Fe.value.map(t=>t.id));C.value=C.value.filter(t=>!s.has(t))}Ue()},Ue=()=>{const s=Fe.value.length,t=Fe.value.filter(g=>C.value.includes(g.id)).length;t===0?(U.value=!1,F.value=!1):t===s?(U.value=!0,F.value=!1):(U.value=!1,F.value=!0)},tt=s=>{x.value=s},is=()=>{x.value=null},ea=async({keyId:s,expiresAt:t,activateNow:g})=>{try{const r=await q.patch(`/admin/api-keys/${s}/expiration`,{expiresAt:t||null,activateNow:g||!1});if(r.success){E(g?"API Key已激活":"过期时间已更新","success");const v=P.value.find(M=>M.id===s);v&&(g&&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))),is()}else E(r.message||"更新失败","error"),oe.value&&oe.value.resetSaving()}catch{E("更新失败","error"),oe.value&&oe.value.resetSaving()}},Oe=s=>s?new Date(s).toLocaleDateString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).replace(/\//g,"-"):"",ns=s=>{if(s==null)return"--:--";const t=Math.floor(s/3600),g=Math.floor(s%3600/60),r=s%60;return t>0?`${t}h${g}m`:g>0?`${g}m${r}s`:`${r}s`},bt=s=>{var r,v,M,V,R,se,ie,b,z,de,he,Z,ge,wt,Re;const t=fe(s.id),g={...s,dailyCost:(t==null?void 0:t.dailyCost)??s.dailyCost??0,currentWindowCost:(t==null?void 0:t.currentWindowCost)??s.currentWindowCost??0,windowRemainingSeconds:(t==null?void 0:t.windowRemainingSeconds)??s.windowRemainingSeconds,windowStartTime:(t==null?void 0:t.windowStartTime)??s.windowStartTime??null,windowEndTime:(t==null?void 0:t.windowEndTime)??s.windowEndTime??null,usage:{...s.usage,total:{...(r=s.usage)==null?void 0:r.total,requests:(t==null?void 0:t.requests)??((M=(v=s.usage)==null?void 0:v.total)==null?void 0:M.requests)??0,tokens:(t==null?void 0:t.tokens)??((R=(V=s.usage)==null?void 0:V.total)==null?void 0:R.tokens)??0,cost:(t==null?void 0:t.allTimeCost)??((ie=(se=s.usage)==null?void 0:se.total)==null?void 0:ie.cost)??0,inputTokens:(t==null?void 0:t.inputTokens)??((z=(b=s.usage)==null?void 0:b.total)==null?void 0:z.inputTokens)??0,outputTokens:(t==null?void 0:t.outputTokens)??((he=(de=s.usage)==null?void 0:de.total)==null?void 0:he.outputTokens)??0,cacheCreateTokens:(t==null?void 0:t.cacheCreateTokens)??((ge=(Z=s.usage)==null?void 0:Z.total)==null?void 0:ge.cacheCreateTokens)??0,cacheReadTokens:(t==null?void 0:t.cacheReadTokens)??((Re=(wt=s.usage)==null?void 0:wt.total)==null?void 0:Re.cacheReadTokens)??0}}};be.value=g,xe.value=!0},_t=s=>{if(!s)return"从未使用";const t=new Date(s),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")},Tt={claude:"Claude",openai:"OpenAI",gemini:"Gemini",droid:"Droid",deleted:"已删除",other:"其他"},ta=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,ds=s=>{if(!s)return"other";const t=String(s).toLowerCase();return t==="claude-console"||t==="claude_console"||t==="claude"?"claude":t==="openai"||t==="openai-responses"||t==="openai_responses"||t==="azure-openai"||t==="azure_openai"?"openai":t==="gemini"||t==="gemini-api"||t==="gemini_api"?"gemini":t==="droid"?"droid":"other"},vt=s=>{if(!s)return null;const t=Is(s.id);return t!==null?t:s.lastUsage||null},St=s=>{if(mt(s==null?void 0:s.id))return!1;const t=vt(s);return!!(t&&(t.accountName||t.accountId||t.rawAccountId))},Ut=s=>{if(!s)return!1;if(s.accountCategory==="deleted")return!0;const t=typeof s.rawAccountId=="string"?s.rawAccountId.trim():"",g=typeof s.accountName=="string"?s.accountName.trim():"",r=typeof s.accountType=="string"?s.accountType.trim().toLowerCase():"";if(!t)return!1;const v=ta.test(t),M=!g||g===t,V=ds(r);return v&&M&&(!r||r==="unknown"||V==="other")},sa=s=>s?Ut(s)?"已删除":s.accountName||s.accountId||s.rawAccountId||"未知账号":"未知账号",st=s=>sa(vt(s)),Pt=s=>{const t=st(s);return t.length>bs?`${t.slice(0,bs)}...`:t},kt=s=>{const t=vt(s);if(Ut(t))return Tt.deleted;const g=(t==null?void 0:t.accountCategory)||ds(t==null?void 0:t.accountType);return Tt[g]||Tt.other},Rt=s=>{const t=vt(s);return Ut(t)},aa=()=>{ye.value="",ve.value=1},ra=()=>{try{const s=gt.value.map(b=>{var us,cs,gs,ps,ms,xs,ys,fs;const z=Ts(b),de=Ms(b),he=Us(b),Z=Ps(b),ge=Rs(b),wt={ID:b.id||"",名称:b.name||"",描述:b.description||"",状态:b.isActive?"启用":"禁用",API密钥:b.apiKey||"",过期模式:b.expirationMode==="activation"?"首次使用后激活":b.expirationMode==="fixed"?"固定时间":"无",激活期限:b.activationDays||"",激活单位:b.activationUnit==="hours"?"小时":b.activationUnit==="days"?"天":"",已激活:b.isActivated?"是":"否",激活时间:b.activatedAt?Oe(b.activatedAt):"",过期时间:b.expiresAt?Oe(b.expiresAt):"",服务权限:b.permissions==="all"?"全部服务":b.permissions==="claude"?"仅Claude":b.permissions==="gemini"?"仅Gemini":b.permissions==="openai"?"仅OpenAI":b.permissions==="droid"?"仅Droid":b.permissions||"",令牌限制:b.tokenLimit==="0"||b.tokenLimit===0?"无限制":b.tokenLimit||"",并发限制:b.concurrencyLimit==="0"||b.concurrencyLimit===0?"无限制":b.concurrencyLimit||"","速率窗口(分钟)":b.rateLimitWindow==="0"||b.rateLimitWindow===0?"无限制":b.rateLimitWindow||"",速率请求限制:b.rateLimitRequests==="0"||b.rateLimitRequests===0?"无限制":b.rateLimitRequests||"","日费用限制($)":b.dailyCostLimit==="0"||b.dailyCostLimit===0?"无限制":`$${b.dailyCostLimit}`||"","总费用限制($)":b.totalCostLimit==="0"||b.totalCostLimit===0?"无限制":`$${b.totalCostLimit}`||"",Claude专属账户:b.claudeAccountId||"",Claude控制台账户:b.claudeConsoleAccountId||"",Gemini专属账户:b.geminiAccountId||"",OpenAI专属账户:b.openaiAccountId||"","Azure OpenAI专属账户":b.azureOpenaiAccountId||"",Bedrock专属账户:b.bedrockAccountId||"",Droid专属账户:b.droidAccountId||"",启用模型限制:b.enableModelRestriction?"是":"否",限制的模型:b.restrictedModels&&b.restrictedModels.length>0?b.restrictedModels.join("; "):"",启用客户端限制:b.enableClientRestriction?"是":"否",允许的客户端:b.allowedClients&&b.allowedClients.length>0?b.allowedClients.join("; "):"",创建时间:b.createdAt?Oe(b.createdAt):"",创建者:b.createdBy||"",用户ID:b.userId||"",用户名:b.userUsername||"",标签:b.tags&&b.tags.length>0?b.tags.join(", "):"无",请求总数:z,"总费用($)":de.toFixed(2),Token数:Ke(he),输入Token:Ke(Z),输出Token:Ke(ge),最后使用时间:b.lastUsedAt?Oe(b.lastUsedAt):"从未使用",最后使用账号:st(b),最后使用类型:kt(b)},Re={};let Ne=null;return f.preset==="today"?Ne=(cs=(us=b.usage)==null?void 0:us.daily)==null?void 0:cs.models:f.preset==="7days"?Ne=(ps=(gs=b.usage)==null?void 0:gs.weekly)==null?void 0:ps.models:f.preset==="30days"?Ne=(xs=(ms=b.usage)==null?void 0:ms.monthly)==null?void 0:xs.models:f.preset==="all"&&(Ne=(fs=(ys=b.usage)==null?void 0:ys.total)==null?void 0:fs.models),Ne&&Object.entries(Ne).forEach(([Vt,at])=>{let je=Vt;Vt.includes(":")&&(je=Vt.split(":").pop()),je=je.replace(/[:/]/g,"_"),Re[`${je}_请求数`]=at.requests||0,Re[`${je}_费用($)`]=(at.cost||0).toFixed(2),Re[`${je}_Token`]=Ke(at.totalTokens||0),Re[`${je}_输入Token`]=Ke(at.inputTokens||0),Re[`${je}_输出Token`]=Ke(at.outputTokens||0)}),{...wt,...Re}}),t=ze.utils.book_new(),g=ze.utils.json_to_sheet(s),r=ze.utils.decode_range(g["!ref"]),v=Object.keys(s[0]||{}),M=v.map(b=>b==="ID"?{wch:40}:b==="名称"?{wch:25}:b==="描述"?{wch:30}:b==="API密钥"?{wch:45}:b==="标签"?{wch:20}:b.includes("时间")?{wch:20}:b.includes("限制")?{wch:15}:b.includes("费用")?{wch:15}:b.includes("Token")?{wch:15}:b.includes("请求")?{wch:12}:b.includes("账户")?{wch:30}:b.includes("权限")||b.includes("模型")||b.includes("客户端")?{wch:20}:b.includes("激活")||b.includes("过期")?{wch:18}:{wch:15});g["!cols"]=M;for(let b=r.s.c;b<=r.e.c;++b){const z=ze.utils.encode_cell({r:0,c:b});if(!g[z])continue;const de=v[b],he=de&&de.includes("_");g[z].s={fill:{fgColor:{rgb:he?"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 b=1;b<=r.e.r;++b)for(let z=r.s.c;z<=r.e.c;++z){const de=ze.utils.encode_cell({r:b,c:z});if(!g[de])continue;const he=v[z],Z=g[de].v,ge={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"}}}};b%2===0&&(ge.fill={fgColor:{rgb:"F2F2F2"}}),he==="名称"?ge.alignment={horizontal:"left",vertical:"center"}:he==="标签"?(ge.alignment={horizontal:"left",vertical:"center"},Z==="无"&&(ge.font={...ge.font,color:{rgb:"999999"},italic:!0})):he==="最后使用时间"?(ge.alignment={horizontal:"right",vertical:"center"},Z==="从未使用"&&(ge.font={...ge.font,color:{rgb:"999999"},italic:!0})):he&&he.includes("费用")?(ge.alignment={horizontal:"right",vertical:"center"},ge.font={...ge.font,color:{rgb:"0066CC"},bold:!0}):he&&(he.includes("Token")||he.includes("请求"))&&(ge.alignment={horizontal:"right",vertical:"center"}),g[de].s=ge}ze.utils.book_append_sheet(t,g,"用量统计");const V=new Date,R=V.getFullYear()+String(V.getMonth()+1).padStart(2,"0")+String(V.getDate()).padStart(2,"0")+"_"+String(V.getHours()).padStart(2,"0")+String(V.getMinutes()).padStart(2,"0")+String(V.getSeconds()).padStart(2,"0");let se="";f.type==="preset"?se={today:"今日","7days":"最近7天","30days":"最近30天",all:"全部时间"}[f.preset]||f.preset:se="自定义时间";const ie=`API_Keys_用量统计_${se}_${R}.xlsx`;ze.writeFile(t,ie),E(`成功导出 ${s.length} 条API Key用量数据`,"success")}catch{E("导出失败,请重试","error")}};Te([me,H],()=>{ve.value=1,C.value=[],Ue()});let Mt=null;return Te(ye,()=>{Mt&&clearTimeout(Mt),Mt=setTimeout(()=>{ve.value=1,Ce(!1)},300)}),Te(Y,()=>{ve.value=1,Ce(!1)}),Te(me,()=>{ve.value=1,Ce(!1)}),Te([I,K],()=>{Ce(!1)}),Te([ve,_e],([s,t],[g,r])=>{(s!==g||t!==r)&&Ce(!1),Ue()}),Te(_e,s=>{localStorage.setItem("apiKeysPageSize",s.toString())}),Te(P,()=>{const s=new Set(P.value.map(t=>t.id));C.value=C.value.filter(t=>s.has(t)),Ue()}),nt(async()=>{Ht(),await Promise.all([N.loadSupportedClients(),Ce()]),Ue(),pt()}),ks(()=>{Be&&(clearTimeout(Be),Be=null)}),(s,t)=>{const g=oa;return i(),d("div",Jd,[e("div",Xd,[e("div",Zd,[t[154]||(t[154]=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",e0,[e("nav",t0,[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[29]||(t[29]=$(" 活跃 API Keys ",-1)),P.value.length>0?(i(),d("span",s0,u(P.value.length),1)):A("",!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:xt},[t[30]||(t[30]=$(" 已删除 API Keys ",-1)),T.value.length>0?(i(),d("span",a0,u(T.value.length),1)):A("",!0)],2)])]),j.value==="active"?(i(),d("div",r0,[e("div",o0,[e("div",l0,[e("div",i0,[t[31]||(t[31]=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)),ae(Et,{modelValue:f.preset,"onUpdate:modelValue":t[1]||(t[1]=r=>f.preset=r),icon:"fa-calendar-alt","icon-color":"text-blue-500",options:a.value,placeholder:"选择时间范围",onChange:Vs},null,8,["modelValue","options"])]),f.type==="custom"?(i(),d("div",n0,[ae(g,{class:"api-key-date-picker custom-date-range-picker",clearable:!0,"default-time":p.value,"disabled-date":ls,"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","model-value":f.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":Es},null,8,["default-time","model-value"])])):A("",!0),e("div",d0,[t[32]||(t[32]=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",u0,[ae(Et,{modelValue:me.value,"onUpdate:modelValue":t[2]||(t[2]=r=>me.value=r),icon:"fa-tags","icon-color":"text-purple-500",options:De.value,placeholder:"所有标签"},null,8,["modelValue","options"]),me.value?(i(),d("span",c0,u(Ye.value),1)):A("",!0)])]),e("div",g0,[e("div",p0,[ae(Et,{modelValue:Y.value,"onUpdate:modelValue":t[3]||(t[3]=r=>Y.value=r),icon:"fa-filter","icon-color":"text-cyan-500",options:J.value,placeholder:"选择搜索类型"},null,8,["modelValue","options"])]),e("div",m0,[t[35]||(t[35]=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",x0,[_(e("input",{"onUpdate:modelValue":t[4]||(t[4]=r=>ye.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:Y.value==="bindingAccount"?"搜索所属账号...":B.value?"搜索名称或所有者...":"搜索名称...",type:"text"},null,8,y0),[[ee,ye.value]]),t[34]||(t[34]=e("i",{class:"fas fa-search absolute left-3 text-sm text-cyan-500"},null,-1)),ye.value?(i(),d("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:aa},t[33]||(t[33]=[e("i",{class:"fas fa-times text-xs"},null,-1)]))):A("",!0)])])])]),e("div",f0,[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:Q.value,onClick:t[5]||(t[5]=r=>Ce())},[t[36]||(t[36]=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",Q.value?"fa-spinner fa-spin":"fa-sync-alt"])},null,2),t[37]||(t[37]=e("span",{class:"relative"},"刷新",-1))],8,b0),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:y},[e("i",{class:G(S.value?"fas fa-times":"fas fa-check-square")},null,2),e("span",null,u(S.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:ra},t[38]||(t[38]=[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)])),C.value.length>0?(i(),d("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[6]||(t[6]=r=>Fs())},[t[39]||(t[39]=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[40]||(t[40]=e("i",{class:"fas fa-edit relative text-blue-600 dark:text-blue-400"},null,-1)),e("span",v0,"编辑选中 ("+u(C.value.length)+")",1)])):A("",!0),C.value.length>0?(i(),d("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[7]||(t[7]=r=>Xs())},[t[41]||(t[41]=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[42]||(t[42]=e("i",{class:"fas fa-trash relative text-red-600 dark:text-red-400"},null,-1)),e("span",k0,"删除选中 ("+u(C.value.length)+")",1)])):A("",!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:Le(Gs,["stop"])},t[43]||(t[43]=[e("i",{class:"fas fa-plus"},null,-1),e("span",null,"创建新 Key",-1)]))])]),Q.value?(i(),d("div",w0,t[44]||(t[44]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载 API Keys...",-1)]))):P.value.length===0?(i(),d("div",h0,t[45]||(t[45]=[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)]))):(i(),d("div",A0,[e("div",$0,[e("table",C0,[e("thead",I0,[e("tr",null,[D.value?(i(),d("th",K0,[e("div",L0,[_(e("input",{"onUpdate:modelValue":t[8]||(t[8]=r=>U.value=r),class:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",indeterminate:F.value,type:"checkbox",onChange:Zs},null,40,D0),[[Pe,U.value]])])])):A("",!0),e("th",{class:G(["name-column sticky z-20 min-w-[140px] 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",D.value?"left-[50px]":"left-0"]),onClick:t[9]||(t[9]=r=>We("name"))},[t[46]||(t[46]=$(" 名称 ",-1)),I.value==="name"?(i(),d("i",{key:0,class:G(["fas",K.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",_0))],2),t[52]||(t[52]=e("th",{class:"min-w-[140px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 所属账号 ",-1)),t[53]||(t[53]=e("th",{class:"min-w-[100px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 标签 ",-1)),e("th",{class:"min-w-[80px] 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[10]||(t[10]=r=>We("status"))},[t[47]||(t[47]=$(" 状态 ",-1)),I.value==="status"?(i(),d("i",{key:0,class:G(["fas",K.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",T0))]),e("th",{class:G(["min-w-[70px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300",{"cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-600":yt.value,"cursor-not-allowed opacity-60":!yt.value}]),title:Ks.value,onClick:t[11]||(t[11]=r=>We("cost"))},[t[48]||(t[48]=$(" 费用 ",-1)),I.value==="cost"?(i(),d("i",{key:0,class:G(["fas",K.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):yt.value?(i(),d("i",U0)):(i(),d("i",P0))],10,S0),t[54]||(t[54]=e("th",{class:"min-w-[180px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 限制 ",-1)),t[55]||(t[55]=e("th",{class:"min-w-[80px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," Token ",-1)),t[56]||(t[56]=e("th",{class:"min-w-[80px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 请求数 ",-1)),e("th",{class:"min-w-[100px] 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=>We("lastUsedAt"))},[t[49]||(t[49]=$(" 最后使用 ",-1)),I.value==="lastUsedAt"?(i(),d("i",{key:0,class:G(["fas",K.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",R0))]),e("th",{class:"min-w-[100px] 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=>We("createdAt"))},[t[50]||(t[50]=$(" 创建时间 ",-1)),I.value==="createdAt"?(i(),d("i",{key:0,class:G(["fas",K.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",M0))]),e("th",{class:"min-w-[100px] 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[14]||(t[14]=r=>We("expiresAt"))},[t[51]||(t[51]=$(" 过期时间 ",-1)),I.value==="expiresAt"?(i(),d("i",{key:0,class:G(["fas",K.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",V0))]),t[57]||(t[57]=e("th",{class:"operations-column sticky right-0 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("tbody",null,[(i(!0),d(X,null,re(Fe.value,(r,v)=>{var M,V,R,se,ie,b;return i(),d(X,{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"])},[D.value?(i(),d("td",E0,[e("div",O0,[_(e("input",{"onUpdate:modelValue":t[15]||(t[15]=z=>C.value=z),class:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",type:"checkbox",value:r.id,onChange:Ue},null,40,j0),[[Pe,C.value]])])])):A("",!0),e("td",{class:G(["name-column sticky z-10 px-3 py-3",D.value?"left-[50px]":"left-0"])},[e("div",G0,[e("div",{class:"truncate text-sm font-semibold text-gray-900 dark:text-gray-100",title:r.name},u(r.name),9,q0),B.value&&r.ownerDisplayName?(i(),d("div",z0,[t[58]||(t[58]=e("i",{class:"fas fa-user mr-1"},null,-1)),$(" "+u(r.ownerDisplayName),1)])):A("",!0)])],2),e("td",F0,[e("div",W0,[m.value&&Ds(r)?(i(),d("div",B0,t[59]||(t[59]=[e("i",{class:"fas fa-spinner fa-spin mr-1"},null,-1),$(" 加载中... ",-1)]))):(i(),d(X,{key:1},[r.claudeAccountId||r.claudeConsoleAccountId?(i(),d("div",N0,[t[60]||(t[60]=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]"}),$(" Claude ")],-1)),e("span",H0,u(Yt(r)),1)])):A("",!0),r.geminiAccountId?(i(),d("div",Y0,[t[61]||(t[61]=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]"}),$(" Gemini ")],-1)),e("span",Q0,u(Qt(r)),1)])):A("",!0),r.openaiAccountId?(i(),d("div",J0,[t[62]||(t[62]=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]"}),$(" OpenAI ")],-1)),e("span",X0,u(Jt(r)),1)])):A("",!0),r.bedrockAccountId?(i(),d("div",Z0,[t[63]||(t[63]=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]"}),$(" Bedrock ")],-1)),e("span",eu,u(Xt(r)),1)])):A("",!0),r.droidAccountId?(i(),d("div",tu,[t[64]||(t[64]=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]"}),$(" Droid ")],-1)),e("span",su,u(Zt(r)),1)])):A("",!0),!r.claudeAccountId&&!r.claudeConsoleAccountId&&!r.geminiAccountId&&!r.openaiAccountId&&!r.bedrockAccountId&&!r.droidAccountId?(i(),d("div",au,t[65]||(t[65]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),$(" 共享池 ",-1)]))):A("",!0)],64))])]),e("td",ru,[e("div",ou,[(i(!0),d(X,null,re(r.tags||[],z=>(i(),d("span",{key:z,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"},u(z),1))),128)),!r.tags||r.tags.length===0?(i(),d("span",lu,"无标签")):A("",!0)])]),e("td",iu,[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),$(" "+u(r.isActive?"活跃":"禁用"),1)],2)]),e("td",nu,[qe(r.id)?(i(),d("div",du,t[66]||(t[66]=[e("div",{class:"h-5 w-14 animate-pulse rounded bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700"},null,-1)]))):fe(r.id)?(i(),d("span",uu,u(fe(r.id).formattedCost||"$0.00"),1)):(i(),d("span",cu,"-"))]),e("td",gu,[e("div",pu,[qe(r.id)&&(r.dailyCostLimit>0||r.totalCostLimit>0||r.rateLimitWindow>0&&r.rateLimitCost>0)?(i(),d("div",mu,t[67]||(t[67]=[e("div",{class:"h-4 w-full animate-pulse rounded bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700"},null,-1),e("div",{class:"h-3 w-2/3 animate-pulse rounded bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700"},null,-1)]))):(i(),d(X,{key:1},[r.dailyCostLimit>0?(i(),Ae(Me,{key:0,current:((M=fe(r.id))==null?void 0:M.dailyCost)||0,label:"每日限制",limit:r.dailyCostLimit,type:"daily",variant:"compact"},null,8,["current","limit"])):r.totalCostLimit>0?(i(),Ae(Me,{key:1,current:((V=fe(r.id))==null?void 0:V.allTimeCost)||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)?(i(),d("div",xu,[ae(Me,{current:((R=fe(r.id))==null?void 0:R.currentWindowCost)||0,label:"窗口费用",limit:r.rateLimitCost,type:"window",variant:"compact"},null,8,["current","limit"]),e("div",yu,[e("div",fu,[t[68]||(t[68]=e("i",{class:"fas fa-clock text-[10px]"},null,-1)),e("span",bu,u(r.rateLimitWindow)+"分钟窗口",1)]),e("span",{class:G(["font-bold",(((se=fe(r.id))==null?void 0:se.windowRemainingSeconds)||0)>0?"text-sky-700 dark:text-sky-300":"text-gray-400 dark:text-gray-500"])},u((((ie=fe(r.id))==null?void 0:ie.windowRemainingSeconds)||0)>0?ns(((b=fe(r.id))==null?void 0:b.windowRemainingSeconds)||0):"未激活"),3)])])):(i(),d("div",vu,t[69]||(t[69]=[e("i",{class:"fas fa-infinity text-base"},null,-1),e("span",{class:"text-xs font-medium"},"无限制",-1)])))],64))])]),e("td",ku,[qe(r.id)?(i(),d("div",wu,t[70]||(t[70]=[e("div",{class:"h-5 w-16 animate-pulse rounded bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700"},null,-1)]))):fe(r.id)?(i(),d("div",hu,[e("span",Au,u(Ke(fe(r.id).tokens||0)),1)])):(i(),d("span",$u,"-"))]),e("td",Cu,[qe(r.id)?(i(),d("div",Iu,t[71]||(t[71]=[e("div",{class:"h-5 w-12 animate-pulse rounded bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700"},null,-1)]))):fe(r.id)?(i(),d("div",Ku,[e("span",Lu,u(Ct(fe(r.id).requests||0)),1),t[72]||(t[72]=e("span",{class:"text-xs text-gray-500"},"次",-1))])):(i(),d("span",Du,"-"))]),e("td",_u,[e("div",Tu,[r.lastUsedAt?(i(),d("span",{key:0,class:"cursor-help",style:{"font-size":"13px"},title:new Date(r.lastUsedAt).toLocaleString("zh-CN")},u(_t(r.lastUsedAt)),9,Su)):(i(),d("span",Uu,"从未使用")),r.lastUsedAt&&mt(r.id)?(i(),d("span",Pu,t[73]||(t[73]=[e("i",{class:"fas fa-spinner fa-spin mr-1"},null,-1),$(" 加载中... ",-1)]))):St(r)?(i(),d("span",{key:3,class:"mt-1 text-xs text-gray-500 dark:text-gray-400",title:st(r)},[$(u(Pt(r))+" ",1),Rt(r)?A("",!0):(i(),d("span",Mu," ("+u(kt(r))+") ",1))],8,Ru)):(i(),d("span",Vu," 暂无使用账号 "))])]),e("td",Eu,u(new Date(r.createdAt).toLocaleDateString()),1),e("td",Ou,[e("div",ju,[r.expirationMode==="activation"&&!r.isActivated?(i(),d("span",Gu,[t[74]||(t[74]=e("i",{class:"fas fa-pause-circle mr-1 text-xs"},null,-1)),$(" 未激活 ( "+u(r.activationDays||(r.activationUnit==="hours"?24:30))+u(r.activationUnit==="hours"?"小时":"天")+") ",1)])):r.expiresAt?(i(),d("span",qu,[Ze(r.expiresAt)?(i(),d("span",{key:0,class:"inline-flex cursor-pointer items-center text-red-600 hover:underline",style:{"font-size":"13px"},onClick:Le(z=>tt(r),["stop"])},t[75]||(t[75]=[e("i",{class:"fas fa-exclamation-circle mr-1 text-xs"},null,-1),$(" 已过期 ",-1)]),8,zu)):et(r.expiresAt)?(i(),d("span",{key:1,class:"inline-flex cursor-pointer items-center text-orange-600 hover:underline",style:{"font-size":"13px"},onClick:Le(z=>tt(r),["stop"])},[t[76]||(t[76]=e("i",{class:"fas fa-clock mr-1 text-xs"},null,-1)),$(" "+u(es(r.expiresAt)),1)],8,Fu)):(i(),d("span",{key:2,class:"cursor-pointer text-gray-600 hover:underline dark:text-gray-400",style:{"font-size":"13px"},onClick:Le(z=>tt(r),["stop"])},u(es(r.expiresAt)),9,Wu))])):(i(),d("span",{key:2,class:"inline-flex cursor-pointer items-center text-gray-400 hover:underline dark:text-gray-500",style:{"font-size":"13px"},onClick:Le(z=>tt(r),["stop"])},t[77]||(t[77]=[e("i",{class:"fas fa-infinity mr-1 text-xs"},null,-1),$(" 永不过期 ",-1)]),8,Bu))])]),e("td",Nu,[e("div",Hu,[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:z=>bt(r)},t[78]||(t[78]=[e("i",{class:"fas fa-chart-line"},null,-1),e("span",{class:"ml-1"},"详情",-1)]),8,Yu),r&&r.id?(i(),d("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:z=>ts(r.id)},[e("i",{class:G(["fas",te.value[r.id]?"fa-chevron-up":"fa-chevron-down"])},null,2),t[79]||(t[79]=e("span",{class:"ml-1"},"模型",-1))],8,Qu)):A("",!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:z=>It(r)},t[80]||(t[80]=[e("i",{class:"fas fa-edit"},null,-1),e("span",{class:"ml-1"},"编辑",-1)]),8,Ju),r.expiresAt&&(Ze(r.expiresAt)||et(r.expiresAt))?(i(),d("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:z=>Kt(r)},t[81]||(t[81]=[e("i",{class:"fas fa-clock"},null,-1),e("span",{class:"ml-1"},"续期",-1)]),8,Xu)):A("",!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:z=>Lt(r)},[e("i",{class:G(["fas",r.isActive?"fa-ban":"fa-check-circle"])},null,2),e("span",ec,u(r.isActive?"禁用":"激活"),1)],10,Zu),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:z=>Dt(r.id)},t[82]||(t[82]=[e("i",{class:"fas fa-trash"},null,-1),e("span",{class:"ml-1"},"删除",-1)]),8,tc)]),e("div",sc,[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:z=>bt(r)},t[83]||(t[83]=[e("i",{class:"fas fa-chart-line"},null,-1)]),8,ac),r&&r.id?(i(),d("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:z=>ts(r.id)},[e("i",{class:G(["fas",te.value[r.id]?"fa-chevron-up":"fa-chevron-down"])},null,2)],8,rc)):A("",!0),ae(ca,{actions:Hs(r)},null,8,["actions"])])])],2),r&&r.id&&te.value[r.id]?(i(),d("tr",oc,[e("td",lc,[o.value[r.id]?A("",!0):(i(),d("div",ic,t[84]||(t[84]=[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",nc,[e("div",dc,[t[85]||(t[85]=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"}),$(" 模型使用分布 ")],-1)),e("div",uc,[o.value[r.id]&&o.value[r.id].length>0?(i(),d("span",cc,u(o.value[r.id].length)+" 个模型 ",1)):A("",!0),e("div",gc,[e("div",pc,[(i(!0),d(X,null,re(Ee(r.id).presetOptions,z=>(i(),d("button",{key:z.value,class:G(["rounded px-2 py-1 text-xs font-medium transition-colors",Ee(r.id).preset===z.value&&Ee(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:de=>os(z.value,r.id)},u(z.label),11,mc))),128))]),ae(g,{class:"api-key-date-picker",clearable:!0,"default-time":p.value,"disabled-date":ls,"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","model-value":Ee(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":z=>Os(r.id,z)},null,8,["default-time","model-value","onUpdate:modelValue"])])])]),o.value[r.id]&&o.value[r.id].length===0?(i(),d("div",xc,[e("div",yc,[t[87]||(t[87]=e("i",{class:"fas fa-chart-line text-lg text-gray-400"},null,-1)),t[88]||(t[88]=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:z=>js(r.id)},t[86]||(t[86]=[e("i",{class:"fas fa-sync-alt text-xs"},null,-1),e("span",{class:"text-xs"},"刷新",-1)]),8,fc)]),t[89]||(t[89]=e("p",{class:"text-xs text-gray-400"}," 尝试调整时间范围或点击刷新重新加载数据 ",-1))])):o.value[r.id]&&o.value[r.id].length>0?(i(),d("div",bc,[(i(!0),d(X,null,re(o.value[r.id],z=>(i(),d("div",{key:z.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",vc,[e("div",kc,[e("span",wc,u(z.model),1),e("span",hc,u(z.requests)+" 次请求",1)])]),e("div",Ac,[e("div",$c,[t[90]||(t[90]=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"}),$(" 总Token: ")],-1)),e("span",Cc,u(Ke(z.allTokens)),1)]),e("div",Ic,[t[91]||(t[91]=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"}),$(" 费用: ")],-1)),e("span",Kc,u(_s(z)),1)]),e("div",Lc,[e("div",Dc,[t[92]||(t[92]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-down mr-1 text-green-500"}),$(" 输入: ")],-1)),e("span",_c,u(Ke(z.inputTokens)),1)]),e("div",Tc,[t[93]||(t[93]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-up mr-1 text-blue-500"}),$(" 输出: ")],-1)),e("span",Sc,u(Ke(z.outputTokens)),1)]),z.cacheCreateTokens>0?(i(),d("div",Uc,[t[94]||(t[94]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-save mr-1"}),$(" 缓存创建: ")],-1)),e("span",Pc,u(Ke(z.cacheCreateTokens)),1)])):A("",!0),z.cacheReadTokens>0?(i(),d("div",Rc,[t[95]||(t[95]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-download mr-1"}),$(" 缓存读取: ")],-1)),e("span",Mc,u(Ke(z.cacheReadTokens)),1)])):A("",!0)])]),e("div",Vc,[e("div",{class:"h-2 rounded-full bg-gradient-to-r from-indigo-500 to-purple-600 transition-all duration-500",style:ht({width:ss(z.allTokens,o.value[r.id])+"%"})},null,4)]),e("div",Ec,[e("span",Oc,u(ss(z.allTokens,o.value[r.id]))+"% ",1)])]))),128))])):A("",!0),o.value[r.id]&&o.value[r.id].length>0?(i(),d("div",jc,[e("div",Gc,[t[98]||(t[98]=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"}),$(" 总计统计 ")],-1)),e("div",qc,[e("span",zc,[t[96]||(t[96]=$(" 总请求: ",-1)),e("span",Fc,u(o.value[r.id].reduce((z,de)=>z+de.requests,0)),1)]),e("span",Wc,[t[97]||(t[97]=$(" 总Token: ",-1)),e("span",Bc,u(Ke(o.value[r.id].reduce((z,de)=>z+de.allTokens,0))),1)])])])])):A("",!0)])])])):A("",!0)],64)}),128))])])])])),!Q.value&>.value.length>0?(i(),d("div",Nc,[(i(!0),d(X,null,re(Fe.value,r=>{var v,M,V,R,se,ie;return i(),d("div",{key:r.id,class:"card p-4 transition-shadow hover:shadow-lg"},[e("div",Hc,[e("div",Yc,[D.value?_((i(),d("input",{key:0,"onUpdate:modelValue":t[16]||(t[16]=b=>C.value=b),class:"mt-1 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",type:"checkbox",value:r.id,onChange:Ue},null,40,Qc)),[[Pe,C.value]]):A("",!0),e("div",null,[e("h4",Jc,u(r.name),1),e("p",Xc,u(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),$(" "+u(r.isActive?"活跃":"已停用"),1)],2)]),e("div",Zc,[r.claudeAccountId||r.claudeConsoleAccountId?(i(),d("div",eg,[t[99]||(t[99]=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"}),$(" Claude ")],-1)),e("span",tg,u(Yt(r)),1)])):A("",!0),r.geminiAccountId?(i(),d("div",sg,[t[100]||(t[100]=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"}),$(" Gemini ")],-1)),e("span",ag,u(Qt(r)),1)])):A("",!0),r.openaiAccountId?(i(),d("div",rg,[t[101]||(t[101]=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"}),$(" OpenAI ")],-1)),e("span",og,u(Jt(r)),1)])):A("",!0),r.bedrockAccountId?(i(),d("div",lg,[t[102]||(t[102]=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"}),$(" Bedrock ")],-1)),e("span",ig,u(Xt(r)),1)])):A("",!0),r.droidAccountId?(i(),d("div",ng,[t[103]||(t[103]=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"}),$(" Droid ")],-1)),e("span",dg,u(Zt(r)),1)])):A("",!0),!r.claudeAccountId&&!r.claudeConsoleAccountId&&!r.geminiAccountId&&!r.openaiAccountId&&!r.bedrockAccountId&&!r.droidAccountId?(i(),d("div",ug,t[104]||(t[104]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),$(" 使用共享池 ",-1)]))):A("",!0),B.value&&r.ownerDisplayName?(i(),d("div",cg,[t[105]||(t[105]=e("i",{class:"fas fa-user mr-1"},null,-1)),$(" "+u(r.ownerDisplayName),1)])):A("",!0)]),e("div",gg,[e("div",pg,[e("div",mg,[e("span",xg,u(f.type==="custom"?"累计统计":"今日使用"),1),e("button",{class:"text-xs text-blue-600 hover:text-blue-800",onClick:b=>bt(r)},t[106]||(t[106]=[e("i",{class:"fas fa-chart-line mr-1"},null,-1),$("详情 ",-1)]),8,yg)]),e("div",fg,[e("div",null,[qe(r.id)?(i(),d("div",bg)):fe(r.id)?(i(),d("p",vg,u(Ct(fe(r.id).requests||0))+" 次 ",1)):(i(),d("p",kg,"-")),t[107]||(t[107]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"请求",-1))]),e("div",null,[qe(r.id)?(i(),d("div",wg)):fe(r.id)?(i(),d("p",hg,u(fe(r.id).formattedCost||"$0.00"),1)):(i(),d("p",Ag,"-")),t[108]||(t[108]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"费用",-1))])]),e("div",$g,[e("div",Cg,[t[109]||(t[109]=e("span",null,"最后使用",-1)),e("span",Ig,u(r.lastUsedAt?_t(r.lastUsedAt):"从未使用"),1)]),e("div",Kg,[t[111]||(t[111]=e("span",null,"账号",-1)),r.lastUsedAt&&mt(r.id)?(i(),d("span",Lg,t[110]||(t[110]=[e("i",{class:"fas fa-spinner fa-spin mr-1"},null,-1),$(" 加载中... ",-1)]))):St(r)?(i(),d("span",{key:1,class:"truncate text-gray-500 dark:text-gray-400",style:{"max-width":"180px"},title:st(r)},[$(u(Pt(r))+" ",1),Rt(r)?A("",!0):(i(),d("span",_g," ("+u(kt(r))+") ",1))],8,Dg)):(i(),d("span",Tg,"暂无使用账号"))])])]),e("div",Sg,[qe(r.id)&&(r.dailyCostLimit>0||r.totalCostLimit>0||r.rateLimitWindow>0&&r.rateLimitCost>0)?(i(),d("div",Ug,t[112]||(t[112]=[e("div",{class:"h-4 w-full animate-pulse rounded bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700"},null,-1),e("div",{class:"h-3 w-2/3 animate-pulse rounded bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700"},null,-1)]))):(i(),d(X,{key:1},[r.dailyCostLimit>0?(i(),Ae(Me,{key:0,current:((v=fe(r.id))==null?void 0:v.dailyCost)||0,label:"每日限制",limit:r.dailyCostLimit,type:"daily",variant:"compact"},null,8,["current","limit"])):r.totalCostLimit>0?(i(),Ae(Me,{key:1,current:((M=fe(r.id))==null?void 0:M.allTimeCost)||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)?(i(),d("div",Pg,[ae(Me,{current:((V=fe(r.id))==null?void 0:V.currentWindowCost)||0,label:"窗口费用",limit:r.rateLimitCost,type:"window",variant:"compact"},null,8,["current","limit"]),e("div",Rg,[e("div",Mg,[t[113]||(t[113]=e("i",{class:"fas fa-clock text-xs"},null,-1)),e("span",Vg,u(r.rateLimitWindow)+"分钟窗口",1)]),e("span",{class:G(["font-bold",(((R=fe(r.id))==null?void 0:R.windowRemainingSeconds)||0)>0?"text-sky-700 dark:text-sky-300":"text-gray-400 dark:text-gray-500"])},u((((se=fe(r.id))==null?void 0:se.windowRemainingSeconds)||0)>0?ns(((ie=fe(r.id))==null?void 0:ie.windowRemainingSeconds)||0):"未激活"),3)])])):(i(),d("div",Eg,t[114]||(t[114]=[e("i",{class:"fas fa-infinity text-base"},null,-1),e("span",{class:"text-xs font-medium"},"无限制",-1)])))],64))])]),e("div",Og,[e("div",jg,[t[115]||(t[115]=e("span",null,"创建时间",-1)),e("span",null,u(Oe(r.createdAt)),1)]),e("div",Gg,[t[117]||(t[117]=e("span",null,"过期时间",-1)),e("div",qg,[e("span",{class:G(et(r.expiresAt)?"font-semibold text-orange-600":"")},u(r.expiresAt?Oe(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:Le(b=>tt(r),["stop"])},t[116]||(t[116]=[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,zg)])])]),r.tags&&r.tags.length>0?(i(),d("div",Fg,[(i(!0),d(X,null,re(r.tags,b=>(i(),d("span",{key:b,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"},u(b),1))),128))])):A("",!0),e("div",Wg,[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:b=>bt(r)},t[118]||(t[118]=[e("i",{class:"fas fa-chart-line"},null,-1),$(" 查看详情 ",-1)]),8,Bg),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:b=>It(r)},t[119]||(t[119]=[e("i",{class:"fas fa-edit mr-1"},null,-1),$(" 编辑 ",-1)]),8,Ng),r.expiresAt&&(Ze(r.expiresAt)||et(r.expiresAt))?(i(),d("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:b=>Kt(r)},t[120]||(t[120]=[e("i",{class:"fas fa-clock mr-1"},null,-1),$(" 续期 ",-1)]),8,Hg)):A("",!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:b=>Lt(r)},[e("i",{class:G(["fas",r.isActive?"fa-ban":"fa-check-circle","mr-1"])},null,2),$(" "+u(r.isActive?"禁用":"激活"),1)],10,Yg),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:b=>Dt(r.id)},t[121]||(t[121]=[e("i",{class:"fas fa-trash"},null,-1)]),8,Qg)])])}),128))])):A("",!0),gt.value.length>0?(i(),d("div",Jg,[e("div",Xg,[e("span",Zg," 共 "+u(gt.value.length)+" 条记录 ",1),e("div",ep,[t[122]||(t[122]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},"每页显示",-1)),_(e("select",{"onUpdate:modelValue":t[17]||(t[17]=r=>_e.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"},[(i(),d(X,null,re(ws,r=>e("option",{key:r,value:r},u(r),9,tp)),64))],512),[[it,_e.value]]),t[123]||(t[123]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},"条",-1))])]),e("div",sp,[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:ve.value===1,onClick:t[18]||(t[18]=r=>ve.value--)},t[124]||(t[124]=[e("i",{class:"fas fa-chevron-left"},null,-1)]),8,ap),e("div",rp,[Bt.value?(i(),d("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[19]||(t[19]=r=>ve.value=1)}," 1 ")):A("",!0),hs.value?(i(),d("span",op,"...")):A("",!0),(i(!0),d(X,null,re(Je.value,r=>(i(),d("button",{key:r,class:G(["rounded-md px-2 py-1 text-xs font-medium sm:px-3 sm:text-sm",r===ve.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=>ve.value=r},u(r),11,lp))),128)),As.value?(i(),d("span",ip,"...")):A("",!0),Nt.value?(i(),d("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[20]||(t[20]=r=>ve.value=Ge.value)},u(Ge.value),1)):A("",!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:ve.value===Ge.value||Ge.value===0,onClick:t[21]||(t[21]=r=>ve.value++)},t[125]||(t[125]=[e("i",{class:"fas fa-chevron-right"},null,-1)]),8,np)])])):A("",!0)])):j.value==="deleted"?(i(),d("div",dp,[W.value?(i(),d("div",up,t[126]||(t[126]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载已删除的 API Keys...",-1)]))):T.value.length===0?(i(),d("div",cp,t[127]||(t[127]=[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)]))):(i(),d("div",gp,[e("div",pp,[T.value.length>0?(i(),d("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:Js},[t[128]||(t[128]=e("i",{class:"fas fa-trash-alt mr-2"},null,-1)),$(" 清空所有已删除 ("+u(T.value.length)+") ",1)])):A("",!0)]),e("div",mp,[e("div",xp,[e("table",yp,[e("thead",fp,[e("tr",null,[t[129]||(t[129]=e("th",{class:"name-column sticky left-0 z-20 min-w-[140px] 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:"min-w-[140px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 所属账号 ",-1)),B.value?(i(),d("th",bp," 创建者 ")):A("",!0),t[131]||(t[131]=e("th",{class:"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[132]||(t[132]=e("th",{class:"min-w-[100px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 删除者 ",-1)),t[133]||(t[133]=e("th",{class:"min-w-[100px] 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:"min-w-[70px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 费用 ",-1)),t[135]||(t[135]=e("th",{class:"min-w-[80px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," Token ",-1)),t[136]||(t[136]=e("th",{class:"min-w-[80px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 请求数 ",-1)),t[137]||(t[137]=e("th",{class:"min-w-[100px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 最后使用 ",-1)),t[138]||(t[138]=e("th",{class:"operations-column sticky right-0 min-w-[140px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 操作 ",-1))])]),e("tbody",vp,[(i(!0),d(X,null,re(T.value,r=>{var v,M,V,R,se,ie;return i(),d("tr",{key:r.id,class:"table-row"},[e("td",kp,[e("div",wp,[t[139]||(t[139]=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",hp,[e("div",{class:"truncate text-sm font-semibold text-gray-900 dark:text-gray-100",title:r.name},u(r.name),9,Ap)])])]),e("td",$p,[e("div",Cp,[r.claudeAccountId?(i(),d("div",Ip,t[140]||(t[140]=[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]"}),$(" Claude OAuth ")],-1)]))):r.claudeConsoleAccountId?(i(),d("div",Kp,t[141]||(t[141]=[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]"}),$(" Claude Console ")],-1)]))):r.geminiAccountId?(i(),d("div",Lp,t[142]||(t[142]=[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]"}),$(" Gemini ")],-1)]))):(i(),d("div",Dp,t[143]||(t[143]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),$(" 共享池 ",-1)])))])]),B.value?(i(),d("td",_p,[e("div",Tp,[r.createdBy==="admin"?(i(),d("span",Sp,t[144]||(t[144]=[e("i",{class:"fas fa-user-shield mr-1 text-xs"},null,-1),$(" 管理员 ",-1)]))):r.userUsername?(i(),d("span",Up,[t[145]||(t[145]=e("i",{class:"fas fa-user mr-1 text-xs"},null,-1)),$(" "+u(r.userUsername),1)])):(i(),d("span",Pp,t[146]||(t[146]=[e("i",{class:"fas fa-question-circle mr-1 text-xs"},null,-1),$(" 未知 ",-1)])))])])):A("",!0),e("td",Rp,u(Oe(r.createdAt)),1),e("td",Mp,[e("div",Vp,[r.deletedByType==="admin"?(i(),d("span",Ep,[t[147]||(t[147]=e("i",{class:"fas fa-user-shield mr-1 text-xs"},null,-1)),$(" "+u(r.deletedBy),1)])):r.deletedByType==="user"?(i(),d("span",Op,[t[148]||(t[148]=e("i",{class:"fas fa-user mr-1 text-xs"},null,-1)),$(" "+u(r.deletedBy),1)])):(i(),d("span",jp,[t[149]||(t[149]=e("i",{class:"fas fa-cog mr-1 text-xs"},null,-1)),$(" "+u(r.deletedBy),1)]))])]),e("td",Gp,u(Oe(r.deletedAt)),1),e("td",qp,[e("span",zp," $"+u((((M=(v=r.usage)==null?void 0:v.total)==null?void 0:M.cost)||0).toFixed(2)),1)]),e("td",Fp,[e("span",Wp,u(Ke(((R=(V=r.usage)==null?void 0:V.total)==null?void 0:R.tokens)||0)),1)]),e("td",Bp,[e("div",Np,[e("span",Hp,u(Ct(((ie=(se=r.usage)==null?void 0:se.total)==null?void 0:ie.requests)||0)),1),t[150]||(t[150]=e("span",{class:"text-xs text-gray-500"},"次",-1))])]),e("td",Yp,[e("div",Qp,[r.lastUsedAt?(i(),d("span",{key:0,class:"cursor-help",style:{"font-size":"13px"},title:new Date(r.lastUsedAt).toLocaleString("zh-CN")},u(_t(r.lastUsedAt)),9,Jp)):(i(),d("span",Xp,"从未使用")),r.lastUsedAt&&mt(r.id)?(i(),d("span",Zp,t[151]||(t[151]=[e("i",{class:"fas fa-spinner fa-spin mr-1"},null,-1),$(" 加载中... ",-1)]))):St(r)?(i(),d("span",{key:3,class:"mt-1 text-xs text-gray-500 dark:text-gray-400",title:st(r)},[$(u(Pt(r))+" ",1),Rt(r)?A("",!0):(i(),d("span",tm," ("+u(kt(r))+") ",1))],8,em)):(i(),d("span",sm," 暂无使用账号 "))])]),e("td",am,[e("div",rm,[r.canRestore?(i(),d("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:b=>Ys(r.id)},t[152]||(t[152]=[e("i",{class:"fas fa-undo mr-1"},null,-1),$(" 恢复 ",-1)]),8,om)):A("",!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:b=>Qs(r.id)},t[153]||(t[153]=[e("i",{class:"fas fa-times mr-1"},null,-1),$(" 彻底删除 ",-1)]),8,lm)])])])}),128))])])])])]))])):A("",!0)])]),Qe.value?(i(),Ae(ho,{key:0,accounts:k.value,onBatchSuccess:zs,onClose:t[22]||(t[22]=r=>Qe.value=!1),onSuccess:qs},null,8,["accounts"])):A("",!0),dt.value?(i(),Ae(Cl,{key:1,accounts:k.value,"api-key":qt.value,onClose:t[23]||(t[23]=r=>dt.value=!1),onSuccess:Bs},null,8,["accounts","api-key"])):A("",!0),ut.value?(i(),Ae(ql,{key:2,"api-key":zt.value,onClose:t[24]||(t[24]=r=>ut.value=!1),onSuccess:Ns},null,8,["api-key"])):A("",!0),At.value?(i(),Ae(si,{key:3,"api-key":Ft.value,onClose:t[25]||(t[25]=r=>At.value=!1)},null,8,["api-key"])):A("",!0),$t.value?(i(),Ae(Ki,{key:4,"api-keys":Wt.value,onClose:t[26]||(t[26]=r=>$t.value=!1)},null,8,["api-keys"])):A("",!0),ct.value?(i(),Ae(hn,{key:5,accounts:k.value,"selected-keys":C.value,onClose:t[27]||(t[27]=r=>ct.value=!1),onSuccess:Ws},null,8,["accounts","selected-keys"])):A("",!0),ae(Hn,{ref_key:"expiryEditModalRef",ref:oe,"api-key":x.value||{id:null,expiresAt:null,name:""},show:!!x.value,onClose:is,onSave:ea},null,8,["api-key","show"]),ae(Qd,{"api-key":be.value||{},show:xe.value,onClose:t[28]||(t[28]=r=>xe.value=!1)},null,8,["api-key","show"])])}}},mm=Se(im,[["__scopeId","data-v-40c53d21"]]);export{mm as default};
|