mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 09:38:02 +00:00
31 lines
248 KiB
JavaScript
31 lines
248 KiB
JavaScript
import{E as ua}from"./element-plus-CKhypU-Q.js";import{aP as ws,r as C,c as P,q as ut,V as hs,o as Se,x as d,y as l,z as e,I as he,C as j,P as g,R as re,J as ca,L as w,B as Ct,K as D,aq as te,Q as Z,ac as ne,T as ga,a5 as Ee,D as pa,_ as Ye,Y as Te,an as _e,O as h,aa as it,aV as dt,al as be,f as lt,u as nt,aU as ma}from"./vue-vendor-BVUySZOn.js";import{c as E,_ as Ue,s as V,u as xa}from"./index-D_nz3yuo.js";import{Q as Fe}from"./vendor-Dr8jvgFu.js";import{_ as ya}from"./WindowCountdown-Cb_iHkvc.js";import{C as $t,_ as fa}from"./ActionDropdown-WPuy1CxB.js";import"./chart-ChB167Jv.js";const zt=ws("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 k=await E.get("/admin/supported-clients");return k.success?this.supportedClients=k.data||[]:(this.error=k.message||"加载支持的客户端失败",console.error("Failed to load supported clients:",this.error)),this.supportedClients}catch(k){return this.error=k.message||"加载支持的客户端失败",console.error("Error loading supported clients:",k),[]}finally{this.loading=!1}}}}),qt=ws("apiKeys",()=>{const k=C([]),N=C(!1),p=C(null),W=C("all"),G=C(""),L=C("asc"),A=async()=>{N.value=!0,p.value=null;try{const _=await E.get("/admin/api-keys");if(_.success)k.value=_.data||[];else throw new Error(_.message||"获取API Keys失败")}catch(_){throw p.value=_.message,_}finally{N.value=!1}};return{apiKeys:k,loading:N,error:p,statsTimeRange:W,sortBy:G,sortOrder:L,fetchApiKeys:A,createApiKey:async _=>{N.value=!0,p.value=null;try{const F=await E.post("/admin/api-keys",_);if(F.success)return await A(),F.data;throw new Error(F.message||"创建API Key失败")}catch(F){throw p.value=F.message,F}finally{N.value=!1}},updateApiKey:async(_,F)=>{N.value=!0,p.value=null;try{const K=await E.put(`/admin/api-keys/${_}`,F);if(K.success)return await A(),K;throw new Error(K.message||"更新API Key失败")}catch(K){throw p.value=K.message,K}finally{N.value=!1}},toggleApiKey:async _=>{N.value=!0,p.value=null;try{const F=await E.put(`/admin/api-keys/${_}/toggle`);if(F.success)return await A(),F;throw new Error(F.message||"切换状态失败")}catch(F){throw p.value=F.message,F}finally{N.value=!1}},renewApiKey:async(_,F)=>{N.value=!0,p.value=null;try{const K=await E.put(`/admin/api-keys/${_}`,F);if(K.success)return await A(),K;throw new Error(K.message||"续期失败")}catch(K){throw p.value=K.message,K}finally{N.value=!1}},deleteApiKey:async _=>{N.value=!0,p.value=null;try{const F=await E.delete(`/admin/api-keys/${_}`);if(F.success)return await A(),F;throw new Error(F.message||"删除失败")}catch(F){throw p.value=F.message,F}finally{N.value=!1}},fetchApiKeyStats:async(_,F="all")=>{try{const K=await E.get(`/admin/api-keys/${_}/stats`,{params:{timeRange:F}});if(K.success)return K.stats;throw new Error(K.message||"获取统计失败")}catch(K){return console.error("获取API Key统计失败:",K),null}},fetchTags:async()=>{try{const _=await E.get("/admin/api-keys/tags");if(_.success)return _.data||[];throw new Error(_.message||"获取标签失败")}catch(_){return console.error("获取标签失败:",_),[]}},sortApiKeys:_=>{G.value===_?L.value=L.value==="asc"?"desc":"asc":(G.value=_,L.value="asc")},reset:()=>{k.value=[],N.value=!1,p.value=null,W.value="all",G.value="",L.value="asc"}}}),ba={class:"flex-shrink-0 border-b border-gray-200 p-3 dark:border-gray-600"},va={class:"relative"},ka={class:"custom-scrollbar flex-1 overflow-y-auto"},wa={key:0,class:"border-b border-gray-200 dark:border-gray-600"},ha=["onClick"],Aa={class:"text-gray-700 dark:text-gray-300"},$a={key:0,class:"ml-2 text-xs text-gray-400 dark:text-gray-500"},Ca={class:"text-gray-700 dark:text-gray-300"},Ia={key:1},Ka=["onClick"],La={class:"flex items-center justify-between"},Da={class:"text-gray-700 dark:text-gray-300"},_a={class:"text-xs text-gray-500 dark:text-gray-400"},Ta={key:2},Sa={class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"},Ua=["onClick"],Pa={class:"flex items-center justify-between"},Ra={class:"text-gray-700 dark:text-gray-300"},Ma={class:"text-xs text-gray-400 dark:text-gray-500"},Va={key:3},Ea=["onClick"],Oa={class:"flex items-center justify-between"},ja={class:"text-gray-700 dark:text-gray-300"},Ga={class:"text-xs text-gray-400 dark:text-gray-500"},za={key:4},qa=["onClick"],Fa={class:"flex items-center justify-between"},Wa={class:"text-gray-700 dark:text-gray-300"},Ba={class:"text-xs text-gray-400 dark:text-gray-500"},Na={key:5},Ha=["onClick"],Ya={class:"flex items-center justify-between"},Qa={class:"text-gray-700 dark:text-gray-300"},Ja={class:"text-xs text-gray-400 dark:text-gray-500"},Xa={key:6,class:"px-4 py-8 text-center text-gray-500 dark:text-gray-400"},Za={__name:"AccountSelector",props:{modelValue:{type:String,default:""},platform:{type:String,required:!0,validator:k=>["claude","gemini","openai","bedrock","droid"].includes(k)},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(k,{emit:N}){const p=k,W=N,G=C(!1),L=C(""),A=C(null),B=C(null),T=C({}),Q=C(null),H=C(""),O=P(()=>p.specialOptions||[]),y=P(()=>{const n=O.value.find(c=>c.value===p.modelValue);if(n)return n.label;if(!p.modelValue)return p.defaultOptionText;if(p.modelValue.startsWith("group:")){const c=p.modelValue.substring(6),o=p.groups.find(f=>f.id===c);return o?`${o.name} (${o.memberCount||0} 个成员)`:""}if(p.modelValue.startsWith("console:")){const c=p.modelValue.substring(8),o=p.accounts.find(f=>f.id===c&&f.platform==="claude-console");return o?`${o.name} (${S(o)})`:""}if(p.modelValue.startsWith("responses:")){const c=p.modelValue.substring(10),o=p.accounts.find(f=>f.id===c&&f.platform==="openai-responses");return o?`${o.name} (${S(o)})`:""}if(p.modelValue.startsWith("api:")){const c=p.modelValue.substring(4),o=p.accounts.find(f=>f.id===c&&f.platform==="gemini-api");return o?`${o.name} (${S(o)})`:""}const m=p.accounts.find(c=>c.id===p.modelValue);return m?`${m.name} (${S(m)})`:""}),S=n=>{if(!n)return"未知";if(!(n.isActive==="true"||n.isActive===!0))switch(n.status){case"unauthorized":return"未授权";case"error":return"Token错误";case"created":return"待验证";case"rate_limited":return"限流中";case"quota_exceeded":return"额度超限";default:return"异常"}return n.status==="rate_limited"?"限流中":"正常"},s=P(()=>[...p.accounts].sort((n,m)=>{const c=new Date(n.createdAt||0);return new Date(m.createdAt||0)-c})),q=P(()=>{let n=p.groups.filter(m=>m.platform?m.platform===p.platform:!0);if(L.value){const m=L.value.toLowerCase();n=n.filter(c=>c.name.toLowerCase().includes(m))}return n}),_=P(()=>{let n=[];if(p.platform==="claude"?n=s.value.filter(m=>m.platform==="claude-oauth"):p.platform==="openai"?n=s.value.filter(m=>m.platform==="openai"):p.platform==="droid"?n=s.value.filter(m=>m.platform==="droid"):p.platform==="gemini"?n=s.value.filter(m=>m.platform==="gemini"):n=s.value.filter(m=>!["claude-oauth","claude-console","openai-responses","gemini-api"].includes(m.platform)),L.value){const m=L.value.toLowerCase();n=n.filter(c=>c.name.toLowerCase().includes(m))}return n}),F=P(()=>{if(p.platform!=="claude")return[];let n=s.value.filter(m=>m.platform==="claude-console");if(L.value){const m=L.value.toLowerCase();n=n.filter(c=>c.name.toLowerCase().includes(m))}return n}),K=P(()=>{if(p.platform!=="openai")return[];let n=s.value.filter(m=>m.platform==="openai-responses");if(L.value){const m=L.value.toLowerCase();n=n.filter(c=>c.name.toLowerCase().includes(m))}return n}),$=P(()=>{if(p.platform!=="gemini")return[];let n=s.value.filter(m=>m.platform==="gemini-api");if(L.value){const m=L.value.toLowerCase();n=n.filter(c=>c.name.toLowerCase().includes(m))}return n}),J=P(()=>q.value.length>0||_.value.length>0||F.value.length>0||K.value.length>0||$.value.length>0),ue=n=>{if(!n)return"";const m=new Date(n),o=(new Date-m)/(1e3*60*60);return o<24?"今天创建":o<48?"昨天创建":o<168?`${Math.floor(o/24)} 天前`:m.toLocaleDateString("zh-CN",{month:"2-digit",day:"2-digit"})},oe=()=>{if(!G.value||!B.value||!Q.value)return;const n=Q.value;if(!n)return;const m=n.getBoundingClientRect(),c=window.innerHeight,o=window.innerWidth,f=c-m.bottom,se=m.top,pe=8,xe=f-pe,Ae=se-pe;let me=!1,$e=xe;H.value==="above"&&Ae>=150?(me=!0,$e=Ae):H.value==="below"&&xe>=150?(me=!1,$e=xe):Ae>xe&&xe<200&&(me=!0,$e=Ae),H.value=me?"above":"below";let Y=m.left;const ve=m.width;Y+ve>o-pe&&(Y=o-ve-pe),Y<pe&&(Y=pe),T.value={position:"fixed",left:`${Y}px`,width:`${m.width}px`,maxHeight:`${Math.min($e,400)}px`,...me?{bottom:`${c-m.top}px`}:{top:`${m.bottom}px`}}},ye=()=>{if(!G.value&&Q.value){const n=Q.value.getBoundingClientRect(),c=window.innerHeight-n.bottom,o=8;T.value={position:"fixed",left:`${n.left}px`,width:`${n.width}px`,maxHeight:`${Math.min(c-o,400)}px`,top:`${n.bottom}px`}}G.value=!G.value,G.value&&pa(()=>{var n;oe(),(n=A.value)==null||n.focus()})},ge=n=>{W("update:modelValue",n||""),G.value=!1,L.value=""},Ke=()=>{},I=()=>{var n;L.value="",(n=A.value)==null||n.focus()},i=n=>{var m,c;!((m=Q.value)!=null&&m.contains(n.target))&&!((c=B.value)!=null&&c.contains(n.target))&&(G.value=!1)},u=()=>{G.value&&oe()};return ut(()=>{document.addEventListener("click",i),window.addEventListener("scroll",u,!0),window.addEventListener("resize",oe)}),hs(()=>{document.removeEventListener("click",i),window.removeEventListener("scroll",u,!0),window.removeEventListener("resize",oe)}),Se(G,n=>{n||(L.value="",H.value="")}),(n,m)=>(l(),d("div",{ref_key:"triggerRef",ref:Q,class:"relative"},[e("div",{class:j(["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":k.disabled}]),onClick:m[0]||(m[0]=c=>!k.disabled&&ye())},[e("span",{class:j(k.modelValue?"text-gray-900 dark:text-gray-200":"text-gray-500 dark:text-gray-400")},g(y.value),3),e("i",{class:j(["fas fa-chevron-down text-gray-400 transition-transform duration-200 dark:text-gray-500",{"rotate-180":G.value}])},null,2)],2),(l(),he(Ee,{to:"body"},[re(ga,{"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:ca(()=>[G.value?(l(),d("div",{key:0,ref_key:"dropdownRef",ref:B,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:Ct(T.value)},[e("div",ba,[e("div",va,[D(e("input",{ref_key:"searchInput",ref:A,"onUpdate:modelValue":m[1]||(m[1]=c=>L.value=c),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:Ke},null,544),[[te,L.value]]),m[4]||(m[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)),L.value?(l(),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:I},m[3]||(m[3]=[e("i",{class:"fas fa-times text-sm"},null,-1)]))):w("",!0)])]),e("div",ka,[O.value.length>0?(l(),d("div",wa,[(l(!0),d(Z,null,ne(O.value,c=>(l(),d("div",{key:`special-${c.value}`,class:j(["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":k.modelValue===c.value}]),onClick:o=>ge(c.value)},[e("span",Aa,g(c.label),1),c.description?(l(),d("span",$a,g(c.description),1)):w("",!0)],10,ha))),128))])):w("",!0),e("div",{class:j(["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":!k.modelValue}]),onClick:m[2]||(m[2]=c=>ge(null))},[e("span",Ca,g(k.defaultOptionText),1)],2),q.value.length>0?(l(),d("div",Ia,[m[5]||(m[5]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"}," 调度分组 ",-1)),(l(!0),d(Z,null,ne(q.value,c=>(l(),d("div",{key:`group:${c.id}`,class:j(["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":k.modelValue===`group:${c.id}`}]),onClick:o=>ge(`group:${c.id}`)},[e("div",La,[e("span",Da,g(c.name),1),e("span",_a,g(c.memberCount||0)+" 个成员",1)])],10,Ka))),128))])):w("",!0),_.value.length>0?(l(),d("div",Ta,[e("div",Sa,g(k.platform==="claude"?"Claude OAuth 专属账号":k.platform==="openai"?"OpenAI 专属账号":k.platform==="droid"?"Droid 专属账号":k.platform==="gemini"?"Gemini OAuth 专属账号":"OAuth 专属账号"),1),(l(!0),d(Z,null,ne(_.value,c=>(l(),d("div",{key:c.id,class:j(["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":k.modelValue===c.id}]),onClick:o=>ge(c.id)},[e("div",Pa,[e("div",null,[e("span",Ra,g(c.name),1),e("span",{class:j(["ml-2 rounded-full px-2 py-0.5 text-xs",c.isActive?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":c.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"])},g(S(c)),3)]),e("span",Ma,g(ue(c.createdAt)),1)])],10,Ua))),128))])):w("",!0),k.platform==="claude"&&F.value.length>0?(l(),d("div",Va,[m[6]||(m[6]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"}," Claude Console 专属账号 ",-1)),(l(!0),d(Z,null,ne(F.value,c=>(l(),d("div",{key:c.id,class:j(["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":k.modelValue===`console:${c.id}`}]),onClick:o=>ge(`console:${c.id}`)},[e("div",Oa,[e("div",null,[e("span",ja,g(c.name),1),e("span",{class:j(["ml-2 rounded-full px-2 py-0.5 text-xs",c.isActive?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":c.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"])},g(S(c)),3)]),e("span",Ga,g(ue(c.createdAt)),1)])],10,Ea))),128))])):w("",!0),k.platform==="openai"&&K.value.length>0?(l(),d("div",za,[m[7]||(m[7]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"}," OpenAI-Responses 专属账号 ",-1)),(l(!0),d(Z,null,ne(K.value,c=>(l(),d("div",{key:c.id,class:j(["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":k.modelValue===`responses:${c.id}`}]),onClick:o=>ge(`responses:${c.id}`)},[e("div",Fa,[e("div",null,[e("span",Wa,g(c.name),1),e("span",{class:j(["ml-2 rounded-full px-2 py-0.5 text-xs",c.isActive==="true"||c.isActive===!0?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":c.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"])},g(S(c)),3)]),e("span",Ba,g(ue(c.createdAt)),1)])],10,qa))),128))])):w("",!0),k.platform==="gemini"&&$.value.length>0?(l(),d("div",Na,[m[8]||(m[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)),(l(!0),d(Z,null,ne($.value,c=>(l(),d("div",{key:c.id,class:j(["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":k.modelValue===`api:${c.id}`}]),onClick:o=>ge(`api:${c.id}`)},[e("div",Ya,[e("div",null,[e("span",Qa,g(c.name),1),e("span",{class:j(["ml-2 rounded-full px-2 py-0.5 text-xs",c.isActive==="true"||c.isActive===!0?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":c.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"])},g(S(c)),3)]),e("span",Ja,g(ue(c.createdAt)),1)])],10,Ha))),128))])):w("",!0),L.value&&!J.value?(l(),d("div",Xa,m[9]||(m[9]=[e("i",{class:"fas fa-search mb-2 text-2xl"},null,-1),e("p",{class:"text-sm"},"没有找到匹配的账号",-1)]))):w("",!0)])],4)):w("",!0)]),_:1})]))],512))}},Le=Ue(Za,[["__scopeId","data-v-32c162ec"]]),er={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},tr={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6"},sr={class:"mb-4 flex items-center justify-between"},ar={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"},rr={class:"flex items-center gap-3 sm:gap-4"},or={class:"flex cursor-pointer items-center"},lr={class:"flex cursor-pointer items-center"},nr={key:0,class:"mt-3"},ir={class:"flex items-center gap-4"},dr={class:"flex-1"},ur={class:"flex items-center gap-2"},cr={class:"mt-2 flex items-start text-xs text-amber-600 dark:text-amber-400"},gr=["placeholder"],pr={key:0,class:"mt-1 text-xs text-red-500 dark:text-red-400"},mr={class:"space-y-4"},xr={key:0},yr={class:"flex flex-wrap gap-2"},fr=["onClick"],br={key:1},vr={class:"flex flex-wrap gap-2"},kr=["onClick"],wr={class:"flex gap-2"},hr=["onKeypress"],Ar={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},$r={class:"space-y-2"},Cr={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},Ir={class:"space-y-2"},Kr={class:"flex gap-2"},Lr={class:"space-y-2"},Dr={class:"flex gap-2"},_r={class:"space-y-2"},Tr={class:"flex gap-2"},Sr={class:"mb-3 rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800"},Ur={class:"flex items-center gap-4"},Pr={class:"flex cursor-pointer items-center"},Rr={class:"flex cursor-pointer items-center"},Mr={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Vr={key:0},Er={key:1},Or={key:0},jr={key:0,class:"mt-3"},Gr=["min"],zr={key:1,class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},qr={key:1},Fr={class:"flex items-center gap-2"},Wr=["max","placeholder"],Br={class:"mt-2 flex flex-wrap gap-2"},Nr=["onClick"],Hr={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Yr={class:"flex flex-wrap gap-4"},Qr={class:"flex cursor-pointer items-center"},Jr={class:"flex cursor-pointer items-center"},Xr={class:"flex cursor-pointer items-center"},Zr={class:"flex cursor-pointer items-center"},eo={class:"mb-2 flex items-center justify-between"},to=["disabled"],so={class:"grid grid-cols-1 gap-3"},ao={class:"mb-2 flex items-center"},ro={key:0,class:"space-y-3"},oo={class:"mb-3 flex min-h-[32px] flex-wrap gap-2 rounded-lg border border-gray-200 bg-gray-50 p-2"},lo=["onClick"],no={key:0,class:"text-sm text-gray-400"},io={class:"space-y-3"},uo={class:"flex flex-wrap gap-2"},co=["onClick"],go={key:0,class:"text-sm italic text-gray-400"},po={class:"flex gap-2"},mo=["onKeydown"],xo={class:"mb-2 flex items-center"},yo={key:0,class:"rounded-lg border border-green-200 bg-green-50 p-3 dark:border-green-700 dark:bg-green-900/20"},fo={class:"space-y-1"},bo=["id","value"],vo=["for"],ko={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},wo={class:"block text-xs text-gray-500 dark:text-gray-400"},ho={class:"flex gap-3 pt-2"},Ao=["disabled"],$o={key:0,class:"loading-spinner mr-2"},Co={key:1,class:"fas fa-plus mr-2"},Io={__name:"CreateApiKeyModal",props:{accounts:{type:Object,default:()=>({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]})}},emits:["close","success","batch-success"],setup(k,{emit:N}){const p=k,W=N,G=zt(),L=qt(),A=C(!1),B=C(!1),T=C({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),Q=C({name:""}),H=C(""),O=C([]),y=P(()=>O.value.filter(c=>!s.tags.includes(c))),S=C([]),s=Ye({createType:"single",batchCount:10,name:"",description:"",rateLimitWindow:"",rateLimitRequests:"",rateLimitCost:"",concurrencyLimit:"",dailyCostLimit:"",totalCostLimit:"",weeklyOpusCostLimit:"",expireDuration:"",customExpireDate:"",expiresAt:null,expirationMode:"fixed",activationDays:30,activationUnit:"days",permissions:[],claudeAccountId:"",geminiAccountId:"",openaiAccountId:"",bedrockAccountId:"",droidAccountId:"",enableModelRestriction:!1,restrictedModels:[],modelInput:"",enableClientRestriction:!1,allowedClients:[],tags:[]});ut(async()=>{if(S.value=await G.loadSupportedClients(),O.value=await L.fetchTags(),p.accounts){const c=(p.accounts.gemini||[]).map(f=>({...f,platform:f.platform||"gemini"})),o=[];p.accounts.openai&&p.accounts.openai.forEach(f=>{o.push({...f,platform:f.platform||"openai"})}),p.accounts.openaiResponses&&p.accounts.openaiResponses.forEach(f=>{o.push({...f,platform:f.platform||"openai-responses"})}),T.value={claude:p.accounts.claude||[],gemini:c,openai:o,bedrock:p.accounts.bedrock||[],droid:(p.accounts.droid||[]).map(f=>({...f,platform:f.platform||"droid"})),claudeGroups:p.accounts.claudeGroups||[],geminiGroups:p.accounts.geminiGroups||[],openaiGroups:p.accounts.openaiGroups||[],droidGroups:p.accounts.droidGroups||[]}}});const q=async()=>{var c,o;B.value=!0;try{const[f,se,pe,xe,Ae,me,$e,Y,ve]=await Promise.all([E.get("/admin/claude-accounts"),E.get("/admin/claude-console-accounts"),E.get("/admin/gemini-accounts"),E.get("/admin/gemini-api-accounts"),E.get("/admin/openai-accounts"),E.get("/admin/openai-responses-accounts"),E.get("/admin/bedrock-accounts"),E.get("/admin/droid-accounts"),E.get("/admin/account-groups")]),X=[];f.success&&((c=f.data)==null||c.forEach(le=>{X.push({...le,platform:"claude-oauth",isDedicated:le.accountType==="dedicated"})})),se.success&&((o=se.data)==null||o.forEach(le=>{X.push({...le,platform:"claude-console",isDedicated:le.accountType==="dedicated"})})),T.value.claude=X;const Ie=[];pe.success&&(pe.data||[]).forEach(le=>{Ie.push({...le,platform:"gemini",isDedicated:le.accountType==="dedicated"})}),xe.success&&(xe.data||[]).forEach(le=>{Ie.push({...le,platform:"gemini-api",isDedicated:le.accountType==="dedicated"})}),T.value.gemini=Ie;const Qe=[];if(Ae.success&&(Ae.data||[]).forEach(le=>{Qe.push({...le,platform:"openai",isDedicated:le.accountType==="dedicated"})}),me.success&&(me.data||[]).forEach(le=>{Qe.push({...le,platform:"openai-responses",isDedicated:le.accountType==="dedicated"})}),T.value.openai=Qe,$e.success&&(T.value.bedrock=($e.data||[]).map(le=>({...le,isDedicated:le.accountType==="dedicated"}))),Y.success&&(T.value.droid=(Y.data||[]).map(le=>({...le,platform:"droid",isDedicated:le.accountType==="dedicated"}))),ve.success){const le=ve.data||[];T.value.claudeGroups=le.filter(Re=>Re.platform==="claude"),T.value.geminiGroups=le.filter(Re=>Re.platform==="gemini"),T.value.openaiGroups=le.filter(Re=>Re.platform==="openai"),T.value.droidGroups=le.filter(Re=>Re.platform==="droid")}V("账号列表已刷新","success")}catch{V("刷新账号列表失败","error")}finally{B.value=!1}},_=P(()=>{const c=new Date;return c.setMinutes(c.getMinutes()+1),c.toISOString().slice(0,16)}),F=()=>{if(!s.expireDuration){s.expiresAt=null;return}if(s.expireDuration==="custom")return;const c=new Date,f=s.expireDuration.match(/(\d+)([dhmy])/);if(f){const[,se,pe]=f,xe=parseInt(se);switch(pe){case"d":c.setDate(c.getDate()+xe);break;case"h":c.setHours(c.getHours()+xe);break;case"m":c.setMonth(c.getMonth()+xe);break;case"y":c.setFullYear(c.getFullYear()+xe);break}s.expiresAt=c.toISOString()}},K=()=>{s.customExpireDate&&(s.expiresAt=new Date(s.customExpireDate).toISOString())},$=c=>new Date(c).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),J=()=>{s.modelInput&&!s.restrictedModels.includes(s.modelInput)&&(s.restrictedModels.push(s.modelInput),s.modelInput="")},ue=c=>{s.restrictedModels.splice(c,1)},oe=C(["claude-opus-4-20250514","claude-opus-4-1-20250805"]),ye=P(()=>oe.value.filter(c=>!s.restrictedModels.includes(c))),ge=c=>{s.restrictedModels.includes(c)||s.restrictedModels.push(c)},Ke=()=>{if(H.value&&H.value.trim()){const c=H.value.trim();s.tags.includes(c)||s.tags.push(c),H.value=""}},I=c=>{s.tags.includes(c)||s.tags.push(c)},i=c=>{s.tags.splice(c,1)},u=()=>s.activationUnit==="hours"?[{value:1,label:"1小时"},{value:3,label:"3小时"},{value:6,label:"6小时"},{value:12,label:"12小时"}]:[{value:30,label:"30天"},{value:90,label:"90天"},{value:180,label:"180天"},{value:365,label:"365天"}],n=()=>{s.activationUnit==="hours"?s.activationDays>24&&(s.activationDays=24):s.activationDays<1&&(s.activationDays=1)},m=async()=>{if(Q.value.name="",!s.name||!s.name.trim()){Q.value.name="请输入API Key名称";return}if(s.createType==="batch"&&(!s.batchCount||s.batchCount<2||s.batchCount>500)){V("批量创建数量必须在 2-500 之间","error");return}if(s.rateLimitWindow&&(!s.rateLimitCost||parseFloat(s.rateLimitCost)===0)){let c=!1;if(window.showConfirm?c=await window.showConfirm("费用限制提醒",`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
|
||
是否继续?`,"继续创建","返回修改"):c=confirm(`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
是否继续?`),!c)return}A.value=!0;try{const c={description:s.description||void 0,tokenLimit:0,rateLimitWindow:s.rateLimitWindow!==""&&s.rateLimitWindow!==null?parseInt(s.rateLimitWindow):null,rateLimitRequests:s.rateLimitRequests!==""&&s.rateLimitRequests!==null?parseInt(s.rateLimitRequests):null,rateLimitCost:s.rateLimitCost!==""&&s.rateLimitCost!==null?parseFloat(s.rateLimitCost):null,concurrencyLimit:s.concurrencyLimit!==""&&s.concurrencyLimit!==null?parseInt(s.concurrencyLimit):0,dailyCostLimit:s.dailyCostLimit!==""&&s.dailyCostLimit!==null?parseFloat(s.dailyCostLimit):0,totalCostLimit:s.totalCostLimit!==""&&s.totalCostLimit!==null?parseFloat(s.totalCostLimit):0,weeklyOpusCostLimit:s.weeklyOpusCostLimit!==""&&s.weeklyOpusCostLimit!==null?parseFloat(s.weeklyOpusCostLimit):0,expiresAt:s.expirationMode==="fixed"&&s.expiresAt||void 0,expirationMode:s.expirationMode,activationDays:s.expirationMode==="activation"?s.activationDays:void 0,activationUnit:s.expirationMode==="activation"?s.activationUnit:void 0,permissions:s.permissions,tags:s.tags.length>0?s.tags:void 0,enableModelRestriction:s.enableModelRestriction,restrictedModels:s.restrictedModels,enableClientRestriction:s.enableClientRestriction,allowedClients:s.allowedClients};if(s.claudeAccountId&&(s.claudeAccountId.startsWith("console:")?(c.claudeConsoleAccountId=s.claudeAccountId.substring(8),delete c.claudeAccountId):(c.claudeAccountId=s.claudeAccountId,delete c.claudeConsoleAccountId)),s.geminiAccountId&&(c.geminiAccountId=s.geminiAccountId),s.openaiAccountId&&(c.openaiAccountId=s.openaiAccountId),s.bedrockAccountId&&(c.bedrockAccountId=s.bedrockAccountId),s.droidAccountId&&(c.droidAccountId=s.droidAccountId),s.createType==="single"){const o={...c,name:s.name},f=await E.post("/admin/api-keys",o);f.success?(V("API Key 创建成功","success"),W("success",f.data),W("close")):V(f.message||"创建失败","error")}else{const o={...c,createType:"batch",baseName:s.name,count:s.batchCount},f=await E.post("/admin/api-keys/batch",o);f.success?(V(`成功创建 ${f.data.length} 个 API Key`,"success"),W("batch-success",f.data),W("close")):V(f.message||"批量创建失败","error")}}catch{V("创建失败","error")}finally{A.value=!1}};return(c,o)=>(l(),he(Ee,{to:"body"},[e("div",er,[e("div",tr,[e("div",sr,[o[48]||(o[48]=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:o[0]||(o[0]=f=>c.$emit("close"))},o[47]||(o[47]=[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:Te(m,["prevent"])},[e("div",ar,[e("div",{class:j(["flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",s.createType==="batch"?"mb-3":""])},[o[51]||(o[51]=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",rr,[e("label",or,[D(e("input",{"onUpdate:modelValue":o[1]||(o[1]=f=>s.createType=f),class:"mr-1.5 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 sm:mr-2",type:"radio",value:"single"},null,512),[[_e,s.createType]]),o[49]||(o[49]=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"}),h(" 单个创建 ")],-1))]),e("label",lr,[D(e("input",{"onUpdate:modelValue":o[2]||(o[2]=f=>s.createType=f),class:"mr-1.5 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 sm:mr-2",type:"radio",value:"batch"},null,512),[[_e,s.createType]]),o[50]||(o[50]=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"}),h(" 批量创建 ")],-1))])])],2),s.createType==="batch"?(l(),d("div",nr,[e("div",ir,[e("div",dr,[o[53]||(o[53]=e("label",{class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"},"创建数量",-1)),e("div",ur,[D(e("input",{"onUpdate:modelValue":o[3]||(o[3]=f=>s.batchCount=f),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",max:"500",min:"2",placeholder:"输入数量 (2-500)",required:"",type:"number"},null,512),[[te,s.batchCount,void 0,{number:!0}]]),o[52]||(o[52]=e("div",{class:"whitespace-nowrap text-xs text-gray-500 dark:text-gray-400"}," 最大支持 500 个 ",-1))])])]),e("p",cr,[o[54]||(o[54]=e("i",{class:"fas fa-info-circle mr-1 mt-0.5 flex-shrink-0"},null,-1)),e("span",null,"批量创建时,每个 Key 的名称会自动添加序号后缀,例如:"+g(s.name||"MyKey")+"_1, "+g(s.name||"MyKey")+"_2 ...",1)])])):w("",!0)]),e("div",null,[o[55]||(o[55]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-2 sm:text-sm"},[h("名称 "),e("span",{class:"text-red-500"},"*")],-1)),e("div",null,[D(e("input",{"onUpdate:modelValue":o[4]||(o[4]=f=>s.name=f),class:j(["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:s.createType==="batch"?"输入基础名称(将自动添加序号)":"为您的 API Key 取一个名称",required:"",type:"text",onInput:o[5]||(o[5]=f=>Q.value.name="")},null,42,gr),[[te,s.name]])]),Q.value.name?(l(),d("p",pr,g(Q.value.name),1)):w("",!0)]),e("div",null,[o[63]||(o[63]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"标签",-1)),e("div",mr,[s.tags.length>0?(l(),d("div",xr,[o[57]||(o[57]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 已选择的标签: ",-1)),e("div",yr,[(l(!0),d(Z,null,ne(s.tags,(f,se)=>(l(),d("span",{key:"selected-"+se,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"},[h(g(f)+" ",1),e("button",{class:"ml-1 hover:text-blue-900 dark:hover:text-blue-300",type:"button",onClick:pe=>i(se)},o[56]||(o[56]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,fr)]))),128))])])):w("",!0),y.value.length>0?(l(),d("div",br,[o[59]||(o[59]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",vr,[(l(!0),d(Z,null,ne(y.value,f=>(l(),d("button",{key:"available-"+f,class:"inline-flex items-center gap-1 rounded-full bg-gray-100 px-3 py-1 text-sm text-gray-700 transition-colors hover:bg-blue-100 hover:text-blue-700 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-blue-900/30 dark:hover:text-blue-400",type:"button",onClick:se=>I(f)},[o[58]||(o[58]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),h(" "+g(f),1)],8,kr))),128))])])):w("",!0),e("div",null,[o[61]||(o[61]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",wr,[D(e("input",{"onUpdate:modelValue":o[6]||(o[6]=f=>H.value=f),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",placeholder:"输入新标签名称",type:"text",onKeypress:it(Te(Ke,["prevent"]),["enter"])},null,40,hr),[[te,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:Ke},o[60]||(o[60]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),o[62]||(o[62]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 用于标记不同团队或用途,方便筛选管理 ",-1))])]),e("div",Ar,[o[71]||(o[71]=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",$r,[e("div",Cr,[e("div",null,[o[64]||(o[64]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"时间窗口 (分钟)",-1)),D(e("input",{"onUpdate:modelValue":o[7]||(o[7]=f=>s.rateLimitWindow=f),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"1",placeholder:"无限制",type:"number"},null,512),[[te,s.rateLimitWindow]]),o[65]||(o[65]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"时间段单位",-1))]),e("div",null,[o[66]||(o[66]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"请求次数限制",-1)),D(e("input",{"onUpdate:modelValue":o[8]||(o[8]=f=>s.rateLimitRequests=f),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"1",placeholder:"无限制",type:"number"},null,512),[[te,s.rateLimitRequests]]),o[67]||(o[67]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大请求",-1))]),e("div",null,[o[68]||(o[68]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),D(e("input",{"onUpdate:modelValue":o[9]||(o[9]=f=>s.rateLimitCost=f),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"无限制",step:"0.01",type:"number"},null,512),[[te,s.rateLimitCost]]),o[69]||(o[69]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大费用",-1))])]),o[70]||(o[70]=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:"),h(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求 ")]),e("div",null,[e("strong",null,"示例2:"),h(" 时间窗口=1,费用=0.1 → 每分钟最多$0.1费用")]),e("div",null,[e("strong",null,"示例3:"),h(" 窗口=30,请求=50,费用=5 → 每30分钟50次请求且不超$5费用 ")])])],-1))])]),e("div",null,[o[73]||(o[73]=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("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:o[10]||(o[10]=f=>s.dailyCostLimit="50")}," $50 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[11]||(o[11]=f=>s.dailyCostLimit="100")}," $100 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[12]||(o[12]=f=>s.dailyCostLimit="200")}," $200 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[13]||(o[13]=f=>s.dailyCostLimit="")}," 自定义 ")]),D(e("input",{"onUpdate:modelValue":o[14]||(o[14]=f=>s.dailyCostLimit=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[te,s.dailyCostLimit]]),o[72]||(o[72]=e("p",{class:"dark:text灰-400 text-xs text-gray-500"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[o[75]||(o[75]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"总费用限制 (美元)",-1)),e("div",Lr,[e("div",Dr,[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:o[15]||(o[15]=f=>s.totalCostLimit="100")}," $100 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[16]||(o[16]=f=>s.totalCostLimit="500")}," $500 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[17]||(o[17]=f=>s.totalCostLimit="1000")}," $1000 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[18]||(o[18]=f=>s.totalCostLimit="")}," 自定义 ")]),D(e("input",{"onUpdate:modelValue":o[19]||(o[19]=f=>s.totalCostLimit=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[te,s.totalCostLimit]]),o[74]||(o[74]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 的累计总费用限制,达到限制后将拒绝所有后续请求,0 或留空表示无限制 ",-1))])]),e("div",null,[o[77]||(o[77]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"Opus 模型周费用限制 (美元)",-1)),e("div",_r,[e("div",Tr,[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:o[20]||(o[20]=f=>s.weeklyOpusCostLimit="100")}," $100 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[21]||(o[21]=f=>s.weeklyOpusCostLimit="500")}," $500 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[22]||(o[22]=f=>s.weeklyOpusCostLimit="1000")}," $1000 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[23]||(o[23]=f=>s.weeklyOpusCostLimit="")}," 自定义 ")]),D(e("input",{"onUpdate:modelValue":o[24]||(o[24]=f=>s.weeklyOpusCostLimit=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[te,s.weeklyOpusCostLimit]]),o[76]||(o[76]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户,0 或留空表示无限制 ",-1))])]),e("div",null,[o[78]||(o[78]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制 (可选)",-1)),D(e("input",{"onUpdate:modelValue":o[25]||(o[25]=f=>s.concurrencyLimit=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",type:"number"},null,512),[[te,s.concurrencyLimit]]),o[79]||(o[79]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 可同时处理的最大请求数,0 或留空表示无限制 ",-1))]),e("div",null,[o[80]||(o[80]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"备注 (可选)",-1)),D(e("textarea",{"onUpdate:modelValue":o[26]||(o[26]=f=>s.description=f),class:"form-input w-full resize-none border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",placeholder:"描述此 API Key 的用途...",rows:"2"},null,512),[[te,s.description]])]),e("div",null,[o[88]||(o[88]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"过期设置",-1)),e("div",Sr,[e("div",Ur,[e("label",Pr,[D(e("input",{"onUpdate:modelValue":o[27]||(o[27]=f=>s.expirationMode=f),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"fixed"},null,512),[[_e,s.expirationMode]]),o[81]||(o[81]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"固定时间过期",-1))]),e("label",Rr,[D(e("input",{"onUpdate:modelValue":o[28]||(o[28]=f=>s.expirationMode=f),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"activation"},null,512),[[_e,s.expirationMode]]),o[82]||(o[82]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"首次使用后激活",-1))])]),e("p",Mr,[s.expirationMode==="fixed"?(l(),d("span",Vr,o[83]||(o[83]=[e("i",{class:"fas fa-info-circle mr-1"},null,-1),h(" 固定时间模式:Key 创建后立即生效,按设定时间过期(支持小时和天数) ",-1)]))):(l(),d("span",Er,o[84]||(o[84]=[e("i",{class:"fas fa-info-circle mr-1"},null,-1),h(" 激活模式:Key 首次使用时激活,激活后按设定时间过期(支持小时和天数,适合批量销售) ",-1)])))])]),s.expirationMode==="fixed"?(l(),d("div",Or,[D(e("select",{"onUpdate:modelValue":o[29]||(o[29]=f=>s.expireDuration=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",onChange:F},o[85]||(o[85]=[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),[[dt,s.expireDuration]]),s.expireDuration==="custom"?(l(),d("div",jr,[D(e("input",{"onUpdate:modelValue":o[30]||(o[30]=f=>s.customExpireDate=f),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",min:_.value,type:"datetime-local",onChange:K},null,40,Gr),[[te,s.customExpireDate]])])):w("",!0),s.expiresAt?(l(),d("p",zr," 将于 "+g($(s.expiresAt))+" 过期 ",1)):w("",!0)])):(l(),d("div",qr,[e("div",Fr,[D(e("input",{"onUpdate:modelValue":o[31]||(o[31]=f=>s.activationDays=f),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",max:s.activationUnit==="hours"?8760:3650,min:"1",placeholder:s.activationUnit==="hours"?"输入小时数":"输入天数",type:"number"},null,8,Wr),[[te,s.activationDays,void 0,{number:!0}]]),D(e("select",{"onUpdate:modelValue":o[32]||(o[32]=f=>s.activationUnit=f),class:"form-input w-20 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",onChange:n},o[86]||(o[86]=[e("option",{value:"hours"},"小时",-1),e("option",{value:"days"},"天",-1)]),544),[[dt,s.activationUnit]])]),e("div",Br,[(l(!0),d(Z,null,ne(u(),f=>(l(),d("button",{key:f.value,class:"rounded-md border border-gray-300 px-3 py-1 text-xs hover:bg-gray-100 dark:border-gray-600 dark:hover:bg-gray-700",type:"button",onClick:se=>s.activationDays=f.value},g(f.label),9,Nr))),128))]),e("p",Hr,[o[87]||(o[87]=e("i",{class:"fas fa-clock mr-1"},null,-1)),h(" Key 将在首次使用后激活,激活后 "+g(s.activationDays||(s.activationUnit==="hours"?24:30))+" "+g(s.activationUnit==="hours"?"小时":"天")+"过期 ",1)])]))]),e("div",null,[o[93]||(o[93]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",Yr,[e("label",Qr,[D(e("input",{"onUpdate:modelValue":o[33]||(o[33]=f=>s.permissions=f),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"claude"},null,512),[[be,s.permissions]]),o[89]||(o[89]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"Claude",-1))]),e("label",Jr,[D(e("input",{"onUpdate:modelValue":o[34]||(o[34]=f=>s.permissions=f),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"gemini"},null,512),[[be,s.permissions]]),o[90]||(o[90]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"Gemini",-1))]),e("label",Xr,[D(e("input",{"onUpdate:modelValue":o[35]||(o[35]=f=>s.permissions=f),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"openai"},null,512),[[be,s.permissions]]),o[91]||(o[91]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"OpenAI",-1))]),e("label",Zr,[D(e("input",{"onUpdate:modelValue":o[36]||(o[36]=f=>s.permissions=f),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"droid"},null,512),[[be,s.permissions]]),o[92]||(o[92]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"Droid",-1))])]),o[94]||(o[94]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 不选择任何服务表示允许访问全部服务 ",-1))]),e("div",null,[e("div",eo,[o[95]||(o[95]=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:B.value,title:"刷新账号列表",type:"button",onClick:q},[e("i",{class:j(["fas",B.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,g(B.value?"刷新中...":"刷新账号"),1)],8,to)]),e("div",so,[e("div",null,[o[96]||(o[96]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),re(Le,{modelValue:s.claudeAccountId,"onUpdate:modelValue":o[37]||(o[37]=f=>s.claudeAccountId=f),accounts:T.value.claude,"default-option-text":"使用共享账号池",disabled:s.permissions.length>0&&!s.permissions.includes("claude"),groups:T.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[o[97]||(o[97]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),re(Le,{modelValue:s.geminiAccountId,"onUpdate:modelValue":o[38]||(o[38]=f=>s.geminiAccountId=f),accounts:T.value.gemini,"default-option-text":"使用共享账号池",disabled:s.permissions.length>0&&!s.permissions.includes("gemini"),groups:T.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[o[98]||(o[98]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),re(Le,{modelValue:s.openaiAccountId,"onUpdate:modelValue":o[39]||(o[39]=f=>s.openaiAccountId=f),accounts:T.value.openai,"default-option-text":"使用共享账号池",disabled:s.permissions.length>0&&!s.permissions.includes("openai"),groups:T.value.openaiGroups,placeholder:"请选择OpenAI账号",platform:"openai"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[o[99]||(o[99]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),re(Le,{modelValue:s.bedrockAccountId,"onUpdate:modelValue":o[40]||(o[40]=f=>s.bedrockAccountId=f),accounts:T.value.bedrock,"default-option-text":"使用共享账号池",disabled:s.permissions.length>0&&!s.permissions.includes("claude"),groups:[],placeholder:"请选择Bedrock账号",platform:"bedrock"},null,8,["modelValue","accounts","disabled"])]),e("div",null,[o[100]||(o[100]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),re(Le,{modelValue:s.droidAccountId,"onUpdate:modelValue":o[41]||(o[41]=f=>s.droidAccountId=f),accounts:T.value.droid,"default-option-text":"使用共享账号池",disabled:s.permissions.length>0&&!s.permissions.includes("droid"),groups:T.value.droidGroups,placeholder:"请选择Droid账号",platform:"droid"},null,8,["modelValue","accounts","disabled","groups"])])]),o[101]||(o[101]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 选择专属账号后,此API Key将只使用该账号,不选择则使用共享账号池 ",-1))]),e("div",null,[e("div",ao,[D(e("input",{id:"enableModelRestriction","onUpdate:modelValue":o[42]||(o[42]=f=>s.enableModelRestriction=f),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[be,s.enableModelRestriction]]),o[102]||(o[102]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"enableModelRestriction"}," 启用模型限制 ",-1))]),s.enableModelRestriction?(l(),d("div",ro,[e("div",null,[o[105]||(o[105]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600"},"限制的模型列表",-1)),e("div",oo,[(l(!0),d(Z,null,ne(s.restrictedModels,(f,se)=>(l(),d("span",{key:se,class:"inline-flex items-center rounded-full bg-red-100 px-3 py-1 text-sm text-red-800"},[h(g(f)+" ",1),e("button",{class:"ml-2 text-red-600 hover:text-red-800",type:"button",onClick:pe=>ue(se)},o[103]||(o[103]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,lo)]))),128)),s.restrictedModels.length===0?(l(),d("span",no," 暂无限制的模型 ")):w("",!0)]),e("div",io,[e("div",uo,[(l(!0),d(Z,null,ne(ye.value,f=>(l(),d("button",{key:f,class:"flex-shrink-0 rounded-lg bg-gray-100 px-3 py-1 text-xs text-gray-700 transition-colors hover:bg-gray-200 sm:text-sm",type:"button",onClick:se=>ge(f)},g(f),9,co))),128)),ye.value.length===0?(l(),d("span",go," 所有常用模型已在限制列表中 ")):w("",!0)]),e("div",po,[D(e("input",{"onUpdate:modelValue":o[43]||(o[43]=f=>s.modelInput=f),class:"form-input flex-1",placeholder:"输入模型名称,按回车添加",type:"text",onKeydown:it(Te(J,["prevent"]),["enter"])},null,40,mo),[[te,s.modelInput]]),e("button",{class:"rounded-lg bg-red-500 px-4 py-2 text-white transition-colors hover:bg-red-600",type:"button",onClick:J},o[104]||(o[104]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),o[106]||(o[106]=e("p",{class:"mt-2 text-xs text-gray-500"}," 设置此API Key无法访问的模型,例如:claude-opus-4-20250514 ",-1))])])):w("",!0)]),e("div",null,[e("div",xo,[D(e("input",{id:"enableClientRestriction","onUpdate:modelValue":o[44]||(o[44]=f=>s.enableClientRestriction=f),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[be,s.enableClientRestriction]]),o[107]||(o[107]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"enableClientRestriction"}," 启用客户端限制 ",-1))]),s.enableClientRestriction?(l(),d("div",yo,[e("div",null,[o[108]||(o[108]=e("label",{class:"mb-2 block text-xs font-medium text-gray-700 dark:text-gray-300"},"允许的客户端",-1)),e("div",fo,[(l(!0),d(Z,null,ne(S.value,f=>(l(),d("div",{key:f.id,class:"flex items-start"},[D(e("input",{id:`client_${f.id}`,"onUpdate:modelValue":o[45]||(o[45]=se=>s.allowedClients=se),class:"mt-0.5 h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox",value:f.id},null,8,bo),[[be,s.allowedClients]]),e("label",{class:"ml-2 flex-1 cursor-pointer",for:`client_${f.id}`},[e("span",ko,g(f.name),1),e("span",wo,g(f.description),1)],8,vo)]))),128))])])])):w("",!0)]),e("div",ho,[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:o[46]||(o[46]=f=>c.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-4 py-2.5 text-sm font-semibold",disabled:A.value,type:"submit"},[A.value?(l(),d("div",$o)):(l(),d("i",Co)),h(" "+g(A.value?"创建中...":"创建"),1)],8,Ao)])],32)])])]))}},Ko=Ue(Io,[["__scopeId","data-v-b8b28d06"]]),Lo={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},Do={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6 md:p-8"},_o={class:"mb-4 flex items-center justify-between sm:mb-6"},To=["value"],So={key:0,class:"text-gray-500"},Uo={class:"space-y-4"},Po={key:0},Ro={class:"flex flex-wrap gap-2"},Mo=["onClick"],Vo={key:1},Eo={class:"flex flex-wrap gap-2"},Oo=["onClick"],jo={class:"flex gap-2"},Go=["onKeypress"],zo={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},qo={class:"space-y-2"},Fo={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},Wo={class:"space-y-3"},Bo={class:"flex gap-2"},No={class:"space-y-3"},Ho={class:"flex gap-2"},Yo={class:"space-y-3"},Qo={class:"flex gap-2"},Jo={class:"mb-3 flex items-center"},Xo={class:"flex flex-wrap gap-4"},Zo={class:"flex cursor-pointer items-center"},el={class:"flex cursor-pointer items-center"},tl={class:"flex cursor-pointer items-center"},sl={class:"flex cursor-pointer items-center"},al={class:"mb-3 flex items-center justify-between"},rl=["disabled"],ol={class:"grid grid-cols-1 gap-3"},ll={class:"mb-3 flex items-center"},nl={key:0,class:"space-y-3"},il={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"},dl=["onClick"],ul={key:0,class:"text-sm text-gray-400 dark:text-gray-500"},cl={class:"space-y-3"},gl={class:"flex flex-wrap gap-2"},pl=["onClick"],ml={key:0,class:"text-sm italic text-gray-400 dark:text-gray-500"},xl={class:"flex gap-2"},yl=["onKeydown"],fl={class:"mb-3 flex items-center"},bl={key:0,class:"space-y-3"},vl={class:"space-y-2"},kl=["id","value"],wl=["for"],hl={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},Al={class:"block text-xs text-gray-500 dark:text-gray-400"},$l={class:"flex gap-3 pt-4"},Cl=["disabled"],Il={key:0,class:"loading-spinner mr-2"},Kl={key:1,class:"fas fa-save mr-2"},Ll={__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(k,{emit:N}){const p=k,W=N,G=zt(),L=qt(),A=C(!1),B=C(!1),T=C({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),Q=C([]),H=C([]),O=C(""),y=C([]),S=P(()=>y.value.filter(I=>!s.tags.includes(I))),s=Ye({name:"",tokenLimit:"",rateLimitWindow:"",rateLimitRequests:"",rateLimitCost:"",concurrencyLimit:"",dailyCostLimit:"",totalCostLimit:"",weeklyOpusCostLimit:"",permissions:[],claudeAccountId:"",geminiAccountId:"",openaiAccountId:"",bedrockAccountId:"",droidAccountId:"",enableModelRestriction:!1,restrictedModels:[],modelInput:"",enableClientRestriction:!1,allowedClients:[],tags:[],isActive:!0,ownerId:""}),q=()=>{s.modelInput&&!s.restrictedModels.includes(s.modelInput)&&(s.restrictedModels.push(s.modelInput),s.modelInput="")},_=I=>{s.restrictedModels.splice(I,1)},F=C(["claude-opus-4-20250514","claude-opus-4-1-20250805"]),K=P(()=>F.value.filter(I=>!s.restrictedModels.includes(I))),$=I=>{s.restrictedModels.includes(I)||s.restrictedModels.push(I)},J=()=>{if(O.value&&O.value.trim()){const I=O.value.trim();s.tags.includes(I)||s.tags.push(I),O.value=""}},ue=I=>{s.tags.includes(I)||s.tags.push(I)},oe=I=>{s.tags.splice(I,1)},ye=async()=>{if(s.rateLimitWindow&&(!s.rateLimitCost||parseFloat(s.rateLimitCost)===0)){let I=!1;if(window.showConfirm?I=await window.showConfirm("费用限制提醒",`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
|
||
是否继续?`,"继续保存","返回修改"):I=confirm(`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
是否继续?`),!I)return}A.value=!0;try{const I={name:s.name,tokenLimit:0,rateLimitWindow:s.rateLimitWindow!==""&&s.rateLimitWindow!==null?parseInt(s.rateLimitWindow):0,rateLimitRequests:s.rateLimitRequests!==""&&s.rateLimitRequests!==null?parseInt(s.rateLimitRequests):0,rateLimitCost:s.rateLimitCost!==""&&s.rateLimitCost!==null?parseFloat(s.rateLimitCost):0,concurrencyLimit:s.concurrencyLimit!==""&&s.concurrencyLimit!==null?parseInt(s.concurrencyLimit):0,dailyCostLimit:s.dailyCostLimit!==""&&s.dailyCostLimit!==null?parseFloat(s.dailyCostLimit):0,totalCostLimit:s.totalCostLimit!==""&&s.totalCostLimit!==null?parseFloat(s.totalCostLimit):0,weeklyOpusCostLimit:s.weeklyOpusCostLimit!==""&&s.weeklyOpusCostLimit!==null?parseFloat(s.weeklyOpusCostLimit):0,permissions:s.permissions,tags:s.tags};s.claudeAccountId?s.claudeAccountId.startsWith("console:")?(I.claudeConsoleAccountId=s.claudeAccountId.substring(8),I.claudeAccountId=null):(s.claudeAccountId.startsWith("group:"),I.claudeAccountId=s.claudeAccountId,I.claudeConsoleAccountId=null):(I.claudeAccountId=null,I.claudeConsoleAccountId=null),s.geminiAccountId?I.geminiAccountId=s.geminiAccountId:I.geminiAccountId=null,s.openaiAccountId?I.openaiAccountId=s.openaiAccountId:I.openaiAccountId=null,s.bedrockAccountId?I.bedrockAccountId=s.bedrockAccountId:I.bedrockAccountId=null,s.droidAccountId?I.droidAccountId=s.droidAccountId:I.droidAccountId=null,I.enableModelRestriction=s.enableModelRestriction,I.restrictedModels=s.restrictedModels,I.enableClientRestriction=s.enableClientRestriction,I.allowedClients=s.allowedClients,I.isActive=s.isActive,s.ownerId!==void 0&&(I.ownerId=s.ownerId);const i=await E.put(`/admin/api-keys/${p.apiKey.id}`,I);i.success?(W("success"),W("close")):V(i.message||"更新失败","error")}catch{V("更新失败","error")}finally{A.value=!1}},ge=async()=>{var I,i;B.value=!0;try{const[u,n,m,c,o,f,se,pe,xe]=await Promise.all([E.get("/admin/claude-accounts"),E.get("/admin/claude-console-accounts"),E.get("/admin/gemini-accounts"),E.get("/admin/gemini-api-accounts"),E.get("/admin/openai-accounts"),E.get("/admin/openai-responses-accounts"),E.get("/admin/bedrock-accounts"),E.get("/admin/droid-accounts"),E.get("/admin/account-groups")]),Ae=[];u.success&&((I=u.data)==null||I.forEach(Y=>{Ae.push({...Y,platform:"claude-oauth",isDedicated:Y.accountType==="dedicated"})})),n.success&&((i=n.data)==null||i.forEach(Y=>{Ae.push({...Y,platform:"claude-console",isDedicated:Y.accountType==="dedicated"})})),T.value.claude=Ae;const me=[];m.success&&(m.data||[]).forEach(Y=>{me.push({...Y,platform:"gemini",isDedicated:Y.accountType==="dedicated"})}),c.success&&(c.data||[]).forEach(Y=>{me.push({...Y,platform:"gemini-api",isDedicated:Y.accountType==="dedicated"})}),T.value.gemini=me;const $e=[];if(o.success&&(o.data||[]).forEach(Y=>{$e.push({...Y,platform:"openai",isDedicated:Y.accountType==="dedicated"})}),f.success&&(f.data||[]).forEach(Y=>{$e.push({...Y,platform:"openai-responses",isDedicated:Y.accountType==="dedicated"})}),T.value.openai=$e,se.success&&(T.value.bedrock=(se.data||[]).map(Y=>({...Y,isDedicated:Y.accountType==="dedicated"}))),pe.success&&(T.value.droid=(pe.data||[]).map(Y=>({...Y,platform:"droid",isDedicated:Y.accountType==="dedicated"}))),xe.success){const Y=xe.data||[];T.value.claudeGroups=Y.filter(ve=>ve.platform==="claude"),T.value.geminiGroups=Y.filter(ve=>ve.platform==="gemini"),T.value.openaiGroups=Y.filter(ve=>ve.platform==="openai"),T.value.droidGroups=Y.filter(ve=>ve.platform==="droid")}V("账号列表已刷新","success")}catch{V("刷新账号列表失败","error")}finally{B.value=!1}},Ke=async()=>{try{const I=await E.get("/admin/users");I.success&&(H.value=I.data||[])}catch{H.value=[{id:"admin",username:"admin",displayName:"Admin",email:"",role:"admin"}]}};return ut(async()=>{try{const[i,u]=await Promise.all([G.loadSupportedClients(),L.fetchTags(),Ke()]);Q.value=i||[],y.value=u||[]}catch{Q.value=[],y.value=[]}if(p.accounts){const i=(p.accounts.gemini||[]).map(n=>({...n,platform:n.platform||"gemini"})),u=[];p.accounts.openai&&p.accounts.openai.forEach(n=>{u.push({...n,platform:n.platform||"openai"})}),p.accounts.openaiResponses&&p.accounts.openaiResponses.forEach(n=>{u.push({...n,platform:n.platform||"openai-responses"})}),T.value={claude:p.accounts.claude||[],gemini:i,openai:u,bedrock:p.accounts.bedrock||[],droid:(p.accounts.droid||[]).map(n=>({...n,platform:n.platform||"droid"})),claudeGroups:p.accounts.claudeGroups||[],geminiGroups:p.accounts.geminiGroups||[],openaiGroups:p.accounts.openaiGroups||[],droidGroups:p.accounts.droidGroups||[]}}s.name=p.apiKey.name,s.tokenLimit=p.apiKey.tokenLimit||"",s.rateLimitCost=p.apiKey.rateLimitCost||"",p.apiKey.tokenLimit>0&&p.apiKey.rateLimitCost,s.rateLimitWindow=p.apiKey.rateLimitWindow||"",s.rateLimitRequests=p.apiKey.rateLimitRequests||"",s.concurrencyLimit=p.apiKey.concurrencyLimit||"",s.dailyCostLimit=p.apiKey.dailyCostLimit||"",s.totalCostLimit=p.apiKey.totalCostLimit||"",s.weeklyOpusCostLimit=p.apiKey.weeklyOpusCostLimit||"";const I=p.apiKey.permissions;if(Array.isArray(I)){const i=["claude","gemini","openai","droid"],u=[];for(const n of I)if(i.includes(n))u.push(n);else if(typeof n=="string"&&n.includes(",")){const m=n.split(",").map(c=>c.trim());for(const c of m)i.includes(c)&&!u.includes(c)&&u.push(c)}s.permissions=u}else if(I==="all"||!I)s.permissions=[];else if(typeof I=="string")if(I.startsWith("["))try{const i=JSON.parse(I);if(Array.isArray(i)){const u=["claude","gemini","openai","droid"],n=[];for(const m of i)if(u.includes(m))n.push(m);else if(typeof m=="string"&&m.includes(",")){const c=m.split(",").map(o=>o.trim());for(const o of c)u.includes(o)&&!n.includes(o)&&n.push(o)}s.permissions=n}else s.permissions=[]}catch{const u=["claude","gemini","openai","droid"],n=I.split(",").map(m=>m.trim());s.permissions=n.filter(m=>u.includes(m))}else if(I.includes(",")){const i=["claude","gemini","openai","droid"],u=I.split(",").map(n=>n.trim());s.permissions=u.filter(n=>i.includes(n))}else{const i=["claude","gemini","openai","droid"];s.permissions=i.includes(I)?[I]:[]}else s.permissions=[];p.apiKey.claudeConsoleAccountId?s.claudeAccountId=`console:${p.apiKey.claudeConsoleAccountId}`:s.claudeAccountId=p.apiKey.claudeAccountId||"",s.geminiAccountId=p.apiKey.geminiAccountId||"",s.openaiAccountId=p.apiKey.openaiAccountId||"",s.bedrockAccountId=p.apiKey.bedrockAccountId||"",s.droidAccountId=p.apiKey.droidAccountId||"",s.restrictedModels=p.apiKey.restrictedModels||[],s.allowedClients=p.apiKey.allowedClients||[],s.tags=p.apiKey.tags||[],s.enableModelRestriction=p.apiKey.enableModelRestriction===!0||p.apiKey.enableModelRestriction==="true",s.enableClientRestriction=p.apiKey.enableClientRestriction===!0||p.apiKey.enableClientRestriction==="true",s.isActive=p.apiKey.isActive===void 0||p.apiKey.isActive===!0||p.apiKey.isActive==="true",s.ownerId=p.apiKey.userId||"admin"}),(I,i)=>(l(),he(Ee,{to:"body"},[e("div",Lo,[e("div",Do,[e("div",_o,[i[39]||(i[39]=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:i[0]||(i[0]=u=>I.$emit("close"))},i[38]||(i[38]=[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:Te(ye,["prevent"])},[e("div",null,[i[40]||(i[40]=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,[D(e("input",{"onUpdate:modelValue":i[1]||(i[1]=u=>s.name=u),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),[[te,s.name]])]),i[41]||(i[41]=e("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400 sm:mt-2"}," 用于识别此 API Key 的用途 ",-1))]),e("div",null,[i[42]||(i[42]=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)),D(e("select",{"onUpdate:modelValue":i[2]||(i[2]=u=>s.ownerId=u),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200"},[(l(!0),d(Z,null,ne(H.value,u=>(l(),d("option",{key:u.id,value:u.id},[h(g(u.displayName)+" ("+g(u.username)+") ",1),u.role==="admin"?(l(),d("span",So,"- 管理员")):w("",!0)],8,To))),128))],512),[[dt,s.ownerId]]),i[43]||(i[43]=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,[i[51]||(i[51]=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",Uo,[s.tags.length>0?(l(),d("div",Po,[i[45]||(i[45]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 已选择的标签: ",-1)),e("div",Ro,[(l(!0),d(Z,null,ne(s.tags,(u,n)=>(l(),d("span",{key:"selected-"+n,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"},[h(g(u)+" ",1),e("button",{class:"ml-1 hover:text-blue-900 dark:hover:text-blue-300",type:"button",onClick:m=>oe(n)},i[44]||(i[44]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,Mo)]))),128))])])):w("",!0),S.value.length>0?(l(),d("div",Vo,[i[47]||(i[47]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",Eo,[(l(!0),d(Z,null,ne(S.value,u=>(l(),d("button",{key:"available-"+u,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:n=>ue(u)},[i[46]||(i[46]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),h(" "+g(u),1)],8,Oo))),128))])])):w("",!0),e("div",null,[i[49]||(i[49]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",jo,[D(e("input",{"onUpdate:modelValue":i[3]||(i[3]=u=>O.value=u),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:it(Te(J,["prevent"]),["enter"])},null,40,Go),[[te,O.value]]),e("button",{class:"rounded-lg bg-green-500 px-4 py-2 text-white transition-colors hover:bg-green-600",type:"button",onClick:J},i[48]||(i[48]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),i[50]||(i[50]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 用于标记不同团队或用途,方便筛选管理 ",-1))])]),e("div",zo,[i[59]||(i[59]=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",qo,[e("div",Fo,[e("div",null,[i[52]||(i[52]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"时间窗口 (分钟)",-1)),D(e("input",{"onUpdate:modelValue":i[4]||(i[4]=u=>s.rateLimitWindow=u),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),[[te,s.rateLimitWindow]]),i[53]||(i[53]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"时间段单位",-1))]),e("div",null,[i[54]||(i[54]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"请求次数限制",-1)),D(e("input",{"onUpdate:modelValue":i[5]||(i[5]=u=>s.rateLimitRequests=u),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),[[te,s.rateLimitRequests]]),i[55]||(i[55]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大请求",-1))]),e("div",null,[i[56]||(i[56]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),D(e("input",{"onUpdate:modelValue":i[6]||(i[6]=u=>s.rateLimitCost=u),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),[[te,s.rateLimitCost]]),i[57]||(i[57]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大费用",-1))])]),i[58]||(i[58]=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:"),h(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求 ")]),e("div",null,[e("strong",null,"示例2:"),h(" 时间窗口=1,费用=0.1 → 每分钟最多$0.1费用")]),e("div",null,[e("strong",null,"示例3:"),h(" 窗口=30,请求=50,费用=5 → 每30分钟50次请求且不超$5费用 ")])])],-1))])]),e("div",null,[i[61]||(i[61]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"每日费用限制 (美元)",-1)),e("div",Wo,[e("div",Bo,[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:i[7]||(i[7]=u=>s.dailyCostLimit="50")}," $50 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[8]||(i[8]=u=>s.dailyCostLimit="100")}," $100 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[9]||(i[9]=u=>s.dailyCostLimit="200")}," $200 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[10]||(i[10]=u=>s.dailyCostLimit="")}," 自定义 ")]),D(e("input",{"onUpdate:modelValue":i[11]||(i[11]=u=>s.dailyCostLimit=u),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),[[te,s.dailyCostLimit]]),i[60]||(i[60]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[i[63]||(i[63]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"总费用限制 (美元)",-1)),e("div",No,[e("div",Ho,[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:i[12]||(i[12]=u=>s.totalCostLimit="100")}," $100 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[13]||(i[13]=u=>s.totalCostLimit="500")}," $500 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[14]||(i[14]=u=>s.totalCostLimit="1000")}," $1000 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[15]||(i[15]=u=>s.totalCostLimit="")}," 自定义 ")]),D(e("input",{"onUpdate:modelValue":i[16]||(i[16]=u=>s.totalCostLimit=u),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),[[te,s.totalCostLimit]]),i[62]||(i[62]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 的累计总费用限制,达到限制后将拒绝所有后续请求,0 或留空表示无限制 ",-1))])]),e("div",null,[i[65]||(i[65]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"Opus 模型周费用限制 (美元)",-1)),e("div",Yo,[e("div",Qo,[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:i[17]||(i[17]=u=>s.weeklyOpusCostLimit="100")}," $100 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[18]||(i[18]=u=>s.weeklyOpusCostLimit="500")}," $500 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[19]||(i[19]=u=>s.weeklyOpusCostLimit="1000")}," $1000 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:i[20]||(i[20]=u=>s.weeklyOpusCostLimit="")}," 自定义 ")]),D(e("input",{"onUpdate:modelValue":i[21]||(i[21]=u=>s.weeklyOpusCostLimit=u),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),[[te,s.weeklyOpusCostLimit]]),i[64]||(i[64]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户,0 或留空表示无限制 ",-1))])]),e("div",null,[i[66]||(i[66]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制",-1)),D(e("input",{"onUpdate:modelValue":i[22]||(i[22]=u=>s.concurrencyLimit=u),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),[[te,s.concurrencyLimit]]),i[67]||(i[67]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 可同时处理的最大请求数 ",-1))]),e("div",null,[e("div",Jo,[D(e("input",{id:"editIsActive","onUpdate:modelValue":i[23]||(i[23]=u=>s.isActive=u),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),[[be,s.isActive]]),i[68]||(i[68]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"editIsActive"}," 激活账号 ",-1))]),i[69]||(i[69]=e("p",{class:"mb-4 text-xs text-gray-500 dark:text-gray-400"}," 取消勾选将禁用此 API Key,暂停所有请求,客户端返回 401 错误 ",-1))]),e("div",null,[i[74]||(i[74]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",Xo,[e("label",Zo,[D(e("input",{"onUpdate:modelValue":i[24]||(i[24]=u=>s.permissions=u),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"claude"},null,512),[[be,s.permissions]]),i[70]||(i[70]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"Claude",-1))]),e("label",el,[D(e("input",{"onUpdate:modelValue":i[25]||(i[25]=u=>s.permissions=u),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"gemini"},null,512),[[be,s.permissions]]),i[71]||(i[71]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"Gemini",-1))]),e("label",tl,[D(e("input",{"onUpdate:modelValue":i[26]||(i[26]=u=>s.permissions=u),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"openai"},null,512),[[be,s.permissions]]),i[72]||(i[72]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"OpenAI",-1))]),e("label",sl,[D(e("input",{"onUpdate:modelValue":i[27]||(i[27]=u=>s.permissions=u),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"droid"},null,512),[[be,s.permissions]]),i[73]||(i[73]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"Droid",-1))])]),i[75]||(i[75]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 不选择任何服务表示允许访问全部服务 ",-1))]),e("div",null,[e("div",al,[i[76]||(i[76]=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:B.value,title:"刷新账号列表",type:"button",onClick:ge},[e("i",{class:j(["fas",B.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,g(B.value?"刷新中...":"刷新账号"),1)],8,rl)]),e("div",ol,[e("div",null,[i[77]||(i[77]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),re(Le,{modelValue:s.claudeAccountId,"onUpdate:modelValue":i[28]||(i[28]=u=>s.claudeAccountId=u),accounts:T.value.claude,"default-option-text":"使用共享账号池",disabled:s.permissions.length>0&&!s.permissions.includes("claude"),groups:T.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[i[78]||(i[78]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),re(Le,{modelValue:s.geminiAccountId,"onUpdate:modelValue":i[29]||(i[29]=u=>s.geminiAccountId=u),accounts:T.value.gemini,"default-option-text":"使用共享账号池",disabled:s.permissions.length>0&&!s.permissions.includes("gemini"),groups:T.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[i[79]||(i[79]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),re(Le,{modelValue:s.openaiAccountId,"onUpdate:modelValue":i[30]||(i[30]=u=>s.openaiAccountId=u),accounts:T.value.openai,"default-option-text":"使用共享账号池",disabled:s.permissions.length>0&&!s.permissions.includes("openai"),groups:T.value.openaiGroups,placeholder:"请选择OpenAI账号",platform:"openai"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[i[80]||(i[80]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),re(Le,{modelValue:s.bedrockAccountId,"onUpdate:modelValue":i[31]||(i[31]=u=>s.bedrockAccountId=u),accounts:T.value.bedrock,"default-option-text":"使用共享账号池",disabled:s.permissions.length>0&&!s.permissions.includes("claude"),groups:[],placeholder:"请选择Bedrock账号",platform:"bedrock"},null,8,["modelValue","accounts","disabled"])]),e("div",null,[i[81]||(i[81]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),re(Le,{modelValue:s.droidAccountId,"onUpdate:modelValue":i[32]||(i[32]=u=>s.droidAccountId=u),accounts:T.value.droid,"default-option-text":"使用共享账号池",disabled:s.permissions.length>0&&!s.permissions.includes("droid"),groups:T.value.droidGroups,placeholder:"请选择Droid账号",platform:"droid"},null,8,["modelValue","accounts","disabled","groups"])])]),i[82]||(i[82]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 修改绑定账号将影响此API Key的请求路由 ",-1))]),e("div",null,[e("div",ll,[D(e("input",{id:"editEnableModelRestriction","onUpdate:modelValue":i[33]||(i[33]=u=>s.enableModelRestriction=u),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),[[be,s.enableModelRestriction]]),i[83]||(i[83]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"editEnableModelRestriction"}," 启用模型限制 ",-1))]),s.enableModelRestriction?(l(),d("div",nl,[e("div",null,[i[86]||(i[86]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600 dark:text-gray-400"},"限制的模型列表",-1)),e("div",il,[(l(!0),d(Z,null,ne(s.restrictedModels,(u,n)=>(l(),d("span",{key:n,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"},[h(g(u)+" ",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:m=>_(n)},i[84]||(i[84]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,dl)]))),128)),s.restrictedModels.length===0?(l(),d("span",ul," 暂无限制的模型 ")):w("",!0)]),e("div",cl,[e("div",gl,[(l(!0),d(Z,null,ne(K.value,u=>(l(),d("button",{key:u,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:n=>$(u)},g(u),9,pl))),128)),K.value.length===0?(l(),d("span",ml," 所有常用模型已在限制列表中 ")):w("",!0)]),e("div",xl,[D(e("input",{"onUpdate:modelValue":i[34]||(i[34]=u=>s.modelInput=u),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:it(Te(q,["prevent"]),["enter"])},null,40,yl),[[te,s.modelInput]]),e("button",{class:"rounded-lg bg-red-500 px-4 py-2 text-white transition-colors hover:bg-red-600",type:"button",onClick:q},i[85]||(i[85]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),i[87]||(i[87]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 设置此API Key无法访问的模型,例如:claude-opus-4-20250514 ",-1))])])):w("",!0)]),e("div",null,[e("div",fl,[D(e("input",{id:"editEnableClientRestriction","onUpdate:modelValue":i[35]||(i[35]=u=>s.enableClientRestriction=u),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),[[be,s.enableClientRestriction]]),i[88]||(i[88]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"editEnableClientRestriction"}," 启用客户端限制 ",-1))]),s.enableClientRestriction?(l(),d("div",bl,[e("div",null,[i[89]||(i[89]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600 dark:text-gray-400"},"允许的客户端",-1)),i[90]||(i[90]=e("p",{class:"mb-3 text-xs text-gray-500 dark:text-gray-400"}," 勾选允许使用此API Key的客户端 ",-1)),e("div",vl,[(l(!0),d(Z,null,ne(Q.value,u=>(l(),d("div",{key:u.id,class:"flex items-start"},[D(e("input",{id:`edit_client_${u.id}`,"onUpdate:modelValue":i[36]||(i[36]=n=>s.allowedClients=n),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:u.id},null,8,kl),[[be,s.allowedClients]]),e("label",{class:"ml-2 flex-1 cursor-pointer",for:`edit_client_${u.id}`},[e("span",hl,g(u.name),1),e("span",Al,g(u.description),1)],8,wl)]))),128))])])])):w("",!0)]),e("div",$l,[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:i[37]||(i[37]=u=>I.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:A.value,type:"submit"},[A.value?(l(),d("div",Il)):(l(),d("i",Kl)),h(" "+g(A.value?"保存中...":"保存修改"),1)],8,Cl)])],32)])])]))}},Dl=Ue(Ll,[["__scopeId","data-v-2bddb4c2"]]),_l={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},Tl={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-md flex-col p-8"},Sl={class:"mb-6 flex items-center justify-between"},Ul={class:"modal-scroll-content custom-scrollbar flex-1 space-y-6"},Pl={class:"rounded-lg border border-blue-200 bg-blue-50 p-4"},Rl={class:"flex items-start gap-3"},Ml={class:"text-sm text-gray-700"},Vl={class:"mt-1 text-xs text-gray-600"},El={key:0,class:"mt-3"},Ol=["min"],jl={key:1,class:"mt-2 text-xs text-gray-500"},Gl={class:"flex gap-3 pt-4"},zl=["disabled"],ql={key:0,class:"loading-spinner mr-2"},Fl={key:1,class:"fas fa-clock mr-2"},Wl={__name:"RenewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close","success"],setup(k,{emit:N}){const p=k,W=N,G=C(!1),L=Ye({renewDuration:"30d",customExpireDate:"",newExpiresAt:null}),A=P(()=>{const O=new Date;return p.apiKey.expiresAt&&new Date(p.apiKey.expiresAt)>O?new Date(p.apiKey.expiresAt).toISOString().slice(0,16):(O.setMinutes(O.getMinutes()+1),O.toISOString().slice(0,16))}),B=O=>new Date(O).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),T=()=>{if(!L.renewDuration){L.newExpiresAt=null;return}if(L.renewDuration==="permanent"){L.newExpiresAt=null;return}if(L.renewDuration==="custom")return;const O=p.apiKey.expiresAt&&new Date(p.apiKey.expiresAt)>new Date?new Date(p.apiKey.expiresAt):new Date,S=L.renewDuration.match(/(\d+)([dhmy])/);if(S){const[,s,q]=S,_=parseInt(s);switch(q){case"d":O.setDate(O.getDate()+_);break;case"h":O.setHours(O.getHours()+_);break;case"m":O.setMonth(O.getMonth()+_);break;case"y":O.setFullYear(O.getFullYear()+_);break}L.newExpiresAt=O.toISOString()}},Q=()=>{L.customExpireDate&&(L.newExpiresAt=new Date(L.customExpireDate).toISOString())},H=async()=>{G.value=!0;try{const O={expiresAt:L.renewDuration==="permanent"?null:L.newExpiresAt},y=await E.put(`/admin/api-keys/${p.apiKey.id}`,O);y.success?(V("API Key 续期成功","success"),W("success"),W("close")):V(y.message||"续期失败","error")}catch{V("续期失败","error")}finally{G.value=!1}};return T(),(O,y)=>(l(),he(Ee,{to:"body"},[e("div",_l,[e("div",Tl,[e("div",Sl,[y[5]||(y[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:y[0]||(y[0]=S=>O.$emit("close"))},y[4]||(y[4]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",Ul,[e("div",Pl,[e("div",Rl,[y[7]||(y[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,[y[6]||(y[6]=e("h4",{class:"mb-1 font-semibold text-gray-800"},"API Key 信息",-1)),e("p",Ml,g(k.apiKey.name),1),e("p",Vl," 当前过期时间:"+g(k.apiKey.expiresAt?B(k.apiKey.expiresAt):"永不过期"),1)])])]),e("div",null,[y[9]||(y[9]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700"},"续期时长",-1)),D(e("select",{"onUpdate:modelValue":y[1]||(y[1]=S=>L.renewDuration=S),class:"form-input w-full",onChange:T},y[8]||(y[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),[[dt,L.renewDuration]]),L.renewDuration==="custom"?(l(),d("div",El,[D(e("input",{"onUpdate:modelValue":y[2]||(y[2]=S=>L.customExpireDate=S),class:"form-input w-full",min:A.value,type:"datetime-local",onChange:Q},null,40,Ol),[[te,L.customExpireDate]])])):w("",!0),L.newExpiresAt?(l(),d("p",jl," 新的过期时间:"+g(B(L.newExpiresAt)),1)):w("",!0)])]),e("div",Gl,[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:y[3]||(y[3]=S=>O.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:G.value||!L.renewDuration,type:"button",onClick:H},[G.value?(l(),d("div",ql)):(l(),d("i",Fl)),h(" "+g(G.value?"续期中...":"确认续期"),1)],8,zl)])])])]))}},Bl=Ue(Wl,[["__scopeId","data-v-2fba52a3"]]),Nl={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},Hl={class:"modal-content custom-scrollbar mx-auto max-h-[90vh] w-full max-w-lg overflow-y-auto p-8"},Yl={class:"mb-6 space-y-4"},Ql={class:"rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-600 dark:bg-gray-800"},Jl={class:"font-medium text-gray-900 dark:text-gray-100"},Xl={key:0},Zl={class:"rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-600 dark:bg-gray-800"},en={class:"text-gray-700 dark:text-gray-300"},tn={class:"relative"},sn={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"},an={class:"absolute right-3 top-3"},rn=["title"],on={__name:"NewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close"],setup(k,{emit:N}){const p=k,W=N,G=C(!1),L=()=>{if(typeof window<"u"){const s=window.location.protocol,q=window.location.host;let _=s+"//"+q;const F=window.location.href,K=F.indexOf("/",8);return K!==-1&&(_=F.substring(0,K)),_}return""},A=P(()=>L()+"/api"),B=()=>{G.value=!G.value},T=()=>{const s=p.apiKey.apiKey||p.apiKey.key||"";return s?G.value||s.length<=12?s:s.substring(0,8)+"●".repeat(Math.max(0,s.length-12))+s.substring(s.length-4):""},Q=async(s,q)=>{try{await navigator.clipboard.writeText(s),V(q,"success")}catch{const F=document.createElement("textarea");F.value=s,document.body.appendChild(F),F.select();try{document.execCommand("copy"),V(q,"success")}catch{V("复制失败,请手动复制","error")}finally{document.body.removeChild(F)}}},H=async()=>{const s=p.apiKey.apiKey||p.apiKey.key||"";if(!s){V("API Key 不存在","error");return}const q=`export ANTHROPIC_BASE_URL="${A.value}"
|
||
export ANTHROPIC_AUTH_TOKEN="${s}"`;await Q(q,"配置信息已复制到剪贴板")},O=async()=>{const s=p.apiKey.apiKey||p.apiKey.key||"";if(!s){V("API Key 不存在","error");return}await Q(s,"API Key 已复制")},y=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","取消")&&W("close"):confirm(`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`)&&W("close")},S=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
建议您先复制API Key再关闭。`,"仍然关闭","返回复制")&&W("close"):confirm(`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&W("close")};return(s,q)=>(l(),he(Ee,{to:"body"},[e("div",Nl,[e("div",Hl,[e("div",{class:"mb-6 flex items-center justify-between"},[q[1]||(q[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:S},q[0]||(q[0]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),q[9]||(q[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",Yl,[e("div",null,[q[2]||(q[2]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"API Key 名称",-1)),e("div",Ql,[e("span",Jl,g(k.apiKey.name),1)])]),k.apiKey.description?(l(),d("div",Xl,[q[3]||(q[3]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"备注",-1)),e("div",Zl,[e("span",en,g(k.apiKey.description||"无描述"),1)])])):w("",!0),e("div",null,[q[4]||(q[4]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"API Key",-1)),e("div",tn,[e("div",sn,g(T()),1),e("div",an,[e("button",{class:"btn-icon-sm bg-gray-700 hover:bg-gray-800 dark:bg-gray-700 dark:hover:bg-gray-600",title:G.value?"隐藏API Key":"显示完整API Key",type:"button",onClick:B},[e("i",{class:j(["fas",G.value?"fa-eye-slash":"fa-eye","text-gray-300"])},null,2)],8,rn)])]),q[5]||(q[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:O},q[6]||(q[6]=[e("i",{class:"fas fa-key"},null,-1),h(" 仅复制密钥 ",-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},q[7]||(q[7]=[e("i",{class:"fas fa-copy"},null,-1),h(" 复制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:y},q[8]||(q[8]=[e("i",{class:"fas fa-check-circle"},null,-1),h(" 我已保存 ",-1)]))])])])]))}},ln=Ue(on,[["__scopeId","data-v-a3d3d870"]]),nn={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},dn={class:"modal-content custom-scrollbar mx-auto max-h-[90vh] w-full max-w-2xl overflow-y-auto p-8"},un={class:"mb-6 flex items-center justify-between"},cn={class:"flex items-center gap-3"},gn={class:"text-sm text-gray-600"},pn={class:"mb-6 grid grid-cols-2 gap-4 md:grid-cols-4"},mn={class:"rounded-lg border border-blue-200 bg-gradient-to-br from-blue-50 to-blue-100 p-4"},xn={class:"flex items-center justify-between"},yn={class:"mt-1 text-2xl font-bold text-blue-900"},fn={class:"rounded-lg border border-green-200 bg-gradient-to-br from-green-50 to-green-100 p-4"},bn={class:"flex items-center justify-between"},vn={class:"mt-1 truncate text-lg font-bold text-green-900"},kn={class:"rounded-lg border border-purple-200 bg-gradient-to-br from-purple-50 to-purple-100 p-4"},wn={class:"flex items-center justify-between"},hn={class:"mt-1 text-lg font-bold text-purple-900"},An={class:"rounded-lg border border-orange-200 bg-gradient-to-br from-orange-50 to-orange-100 p-4"},$n={class:"flex items-center justify-between"},Cn={class:"mt-1 text-lg font-bold text-orange-900"},In={class:"mb-6"},Kn={class:"mb-3 flex items-center justify-between"},Ln={class:"flex items-center gap-2"},Dn={key:0,class:"custom-scrollbar max-h-48 overflow-y-auto rounded-lg bg-gray-900 p-4"},_n={class:"font-mono text-xs text-gray-300"},Tn={__name:"BatchApiKeyModal",props:{apiKeys:{type:Array,required:!0}},emits:["close"],setup(k,{emit:N}){const p=k,W=N,G=C(!1),L=P(()=>{if(p.apiKeys.length>0){const S=p.apiKeys[0],s=S.name.match(/^(.+)_\d+$/);return s?s[1]:S.name}return""}),A=()=>{if(p.apiKeys.length===0)return"未知";const S=p.apiKeys[0].permissions;return{all:"全部服务",claude:"仅 Claude",gemini:"仅 Gemini"}[S]||S},B=()=>{if(p.apiKeys.length===0)return"未知";const S=p.apiKeys[0].expiresAt;if(!S)return"永不过期";const s=new Date(S),_=Math.ceil((s-new Date)/(1e3*60*60*24));return _<=7?`${_}天`:_<=30?`${Math.ceil(_/7)}周`:_<=365?`${Math.ceil(_/30)}个月`:`${Math.ceil(_/365)}年`},T=()=>{G.value=!G.value},Q=()=>{const s=p.apiKeys.slice(0,10).map(q=>`${q.name}: ${q.apiKey||q.key||""}`);return p.apiKeys.length>10&&s.push(`... 还有 ${p.apiKeys.length-10} 个 API Key`),s.join(`
|
||
`)},H=()=>{const S=p.apiKeys.map(K=>`${K.name}: ${K.apiKey||K.key||""}`).join(`
|
||
`),s=new Blob([S],{type:"text/plain;charset=utf-8"}),q=URL.createObjectURL(s),_=document.createElement("a");_.href=q;const F=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5);_.download=`api-keys-${L.value}-${F}.txt`,document.body.appendChild(_),_.click(),document.body.removeChild(_),URL.revokeObjectURL(q),V("API Keys 文件已下载","success")},O=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看这些 API Key,请确保已经下载并妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","返回下载")&&W("close"):confirm(`关闭后将无法再次查看这些 API Key,请确保已经下载并妥善保存。
|
||
|
||
确定要关闭吗?`)&&W("close")},y=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有下载 API Keys,关闭后将无法再次查看。
|
||
|
||
强烈建议您先下载保存。`,"仍然关闭","返回下载")&&W("close"):confirm(`您还没有下载 API Keys,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&W("close")};return(S,s)=>(l(),he(Ee,{to:"body"},[e("div",nn,[e("div",dn,[e("div",un,[e("div",cn,[s[1]||(s[1]=e("div",{class:"flex h-12 w-12 items-center justify-center rounded-xl bg-gradient-to-br from-green-500 to-green-600"},[e("i",{class:"fas fa-layer-group text-lg text-white"})],-1)),e("div",null,[s[0]||(s[0]=e("h3",{class:"text-xl font-bold text-gray-900"},"批量创建成功",-1)),e("p",gn,"成功创建 "+g(k.apiKeys.length)+" 个 API Key",1)])]),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600",title:"直接关闭(不推荐)",onClick:y},s[2]||(s[2]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),s[14]||(s[14]=e("div",{class:"mb-6 border-l-4 border-amber-400 bg-amber-50 p-4"},[e("div",{class:"flex items-start"},[e("div",{class:"mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-lg bg-amber-400"},[e("i",{class:"fas fa-exclamation-triangle text-sm text-white"})]),e("div",{class:"ml-3"},[e("h5",{class:"mb-1 font-semibold text-amber-900"},"重要提醒"),e("p",{class:"text-sm text-amber-800"}," 这是您唯一能看到所有 API Key 的机会。关闭此窗口后,系统将不再显示完整的 API Key。请立即下载并妥善保存。 ")])])],-1)),e("div",pn,[e("div",mn,[e("div",xn,[e("div",null,[s[3]||(s[3]=e("p",{class:"text-xs font-medium text-blue-600"},"创建数量",-1)),e("p",yn,g(k.apiKeys.length),1)]),s[4]||(s[4]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-lg bg-blue-500 bg-opacity-20"},[e("i",{class:"fas fa-key text-blue-600"})],-1))])]),e("div",fn,[e("div",bn,[e("div",null,[s[5]||(s[5]=e("p",{class:"text-xs font-medium text-green-600"},"基础名称",-1)),e("p",vn,g(L.value),1)]),s[6]||(s[6]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-lg bg-green-500 bg-opacity-20"},[e("i",{class:"fas fa-tag text-green-600"})],-1))])]),e("div",kn,[e("div",wn,[e("div",null,[s[7]||(s[7]=e("p",{class:"text-xs font-medium text-purple-600"},"权限范围",-1)),e("p",hn,g(A()),1)]),s[8]||(s[8]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-lg bg-purple-500 bg-opacity-20"},[e("i",{class:"fas fa-shield-alt text-purple-600"})],-1))])]),e("div",An,[e("div",$n,[e("div",null,[s[9]||(s[9]=e("p",{class:"text-xs font-medium text-orange-600"},"过期时间",-1)),e("p",Cn,g(B()),1)]),s[10]||(s[10]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-lg bg-orange-500 bg-opacity-20"},[e("i",{class:"fas fa-clock text-orange-600"})],-1))])])]),e("div",In,[e("div",Kn,[s[12]||(s[12]=e("label",{class:"text-sm font-semibold text-gray-700"},"API Keys 预览",-1)),e("div",Ln,[e("button",{class:"flex items-center gap-1 text-xs text-blue-600 hover:text-blue-800",type:"button",onClick:T},[e("i",{class:j(["fas",G.value?"fa-eye-slash":"fa-eye"])},null,2),h(" "+g(G.value?"隐藏":"显示")+"预览 ",1)]),s[11]||(s[11]=e("span",{class:"text-xs text-gray-500"},"(最多显示前10个)",-1))])]),G.value?(l(),d("div",Dn,[e("pre",_n,g(Q()),1)])):w("",!0)]),e("div",{class:"flex gap-3"},[e("button",{class:"btn btn-primary flex flex-1 items-center justify-center gap-2 px-6 py-3 font-semibold",onClick:H},s[13]||(s[13]=[e("i",{class:"fas fa-download"},null,-1),h(" 下载所有 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:O}," 我已保存 ")]),s[15]||(s[15]=e("div",{class:"mt-4 rounded-lg border border-blue-200 bg-blue-50 p-3"},[e("p",{class:"flex items-start text-xs text-blue-700"},[e("i",{class:"fas fa-info-circle mr-2 mt-0.5 flex-shrink-0"}),e("span",null," 下载的文件格式为文本文件(.txt),每行包含一个 API Key。 请将文件保存在安全的位置,避免泄露。 ")])],-1))])])]))}},Sn=Ue(Tn,[["__scopeId","data-v-b0b904b9"]]),Un={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},Pn={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6 md:p-8"},Rn={class:"mb-4 flex items-center justify-between sm:mb-6"},Mn={class:"flex items-center gap-2 sm:gap-3"},Vn={class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"},En={class:"rounded-lg bg-blue-50 p-4 dark:bg-blue-900/20"},On={class:"flex items-start gap-3"},jn={class:"mt-1 text-sm text-blue-700 dark:text-blue-400"},Gn={class:"space-y-4"},zn={class:"flex flex-wrap gap-4"},qn={class:"flex cursor-pointer items-center"},Fn={class:"flex cursor-pointer items-center"},Wn={class:"flex cursor-pointer items-center"},Bn={class:"flex cursor-pointer items-center"},Nn={key:0,class:"space-y-3"},Hn={key:0},Yn={class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"},Qn={class:"flex flex-wrap gap-2"},Jn=["onClick"],Xn={key:1},Zn={class:"flex flex-wrap gap-2"},ei=["onClick"],ti={class:"flex gap-2"},si=["onKeypress"],ai={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},ri={class:"space-y-2"},oi={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},li={class:"mb-3 flex items-center gap-4"},ni={class:"flex gap-4"},ii={class:"flex cursor-pointer items-center"},di={class:"flex cursor-pointer items-center"},ui={class:"flex cursor-pointer items-center"},ci={class:"space-y-3"},gi={class:"flex flex-wrap gap-4"},pi={class:"flex cursor-pointer items-center"},mi={class:"flex cursor-pointer items-center"},xi={class:"flex cursor-pointer items-center"},yi={key:0,class:"flex flex-wrap gap-4 pl-6"},fi={class:"flex cursor-pointer items-center"},bi={class:"flex cursor-pointer items-center"},vi={class:"flex cursor-pointer items-center"},ki={class:"flex cursor-pointer items-center"},wi={class:"mb-3 flex items-center justify-between"},hi=["disabled"],Ai={class:"grid grid-cols-1 gap-3"},$i={class:"flex gap-3 pt-4"},Ci=["disabled"],Ii={key:0,class:"loading-spinner mr-2"},Ki={key:1,class:"fas fa-save mr-2"},Gt="__KEEP_ORIGINAL__",Li={__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(k,{emit:N}){const p=k,W=N,G=qt(),L=C(!1),A=C(!1),B=C({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),T=C(""),Q=C([]),H=C("none"),O=C("none"),y=P(()=>p.selectedKeys.length),S=P(()=>Q.value.filter(u=>!s.tags.includes(u))),s=Ye({rateLimitCost:"",rateLimitWindow:"",rateLimitRequests:"",concurrencyLimit:"",dailyCostLimit:"",totalCostLimit:"",weeklyOpusCostLimit:"",permissions:[],claudeAccountId:"",geminiAccountId:"",openaiAccountId:"",bedrockAccountId:"",droidAccountId:"",tags:[],isActive:null}),q=[{value:Gt,label:"不修改"},{value:"SHARED_POOL",label:"使用共享账号池"}],_=u=>P({get:()=>s[u]===""?Gt:s[u],set:n=>{!n||n===Gt?s[u]="":s[u]=n}}),F=_("claudeAccountId"),K=_("geminiAccountId"),$=_("openaiAccountId"),J=_("bedrockAccountId"),ue=_("droidAccountId"),oe=u=>O.value==="none"||O.value==="all"?!0:O.value==="custom"?s.permissions.length===0||s.permissions.includes(u):!0,ye=()=>{if(T.value&&T.value.trim()){const u=T.value.trim();s.tags.includes(u)||s.tags.push(u),T.value=""}},ge=u=>{s.tags.includes(u)||s.tags.push(u)},Ke=u=>{s.tags.splice(u,1)},I=async()=>{var u,n;A.value=!0;try{const[m,c,o,f,se,pe,xe,Ae,me]=await Promise.all([E.get("/admin/claude-accounts"),E.get("/admin/claude-console-accounts"),E.get("/admin/gemini-accounts"),E.get("/admin/gemini-api-accounts"),E.get("/admin/openai-accounts"),E.get("/admin/openai-responses-accounts"),E.get("/admin/bedrock-accounts"),E.get("/admin/droid-accounts"),E.get("/admin/account-groups")]),$e=[];m.success&&((u=m.data)==null||u.forEach(X=>{$e.push({...X,platform:"claude-oauth",isDedicated:X.accountType==="dedicated"})})),c.success&&((n=c.data)==null||n.forEach(X=>{$e.push({...X,platform:"claude-console",isDedicated:X.accountType==="dedicated"})})),B.value.claude=$e;const Y=[];o.success&&(o.data||[]).forEach(X=>{Y.push({...X,platform:"gemini",isDedicated:X.accountType==="dedicated"})}),f.success&&(f.data||[]).forEach(X=>{Y.push({...X,platform:"gemini-api",isDedicated:X.accountType==="dedicated"})}),B.value.gemini=Y;const ve=[];if(se.success&&(se.data||[]).forEach(X=>{ve.push({...X,platform:"openai",isDedicated:X.accountType==="dedicated"})}),pe.success&&(pe.data||[]).forEach(X=>{ve.push({...X,platform:"openai-responses",isDedicated:X.accountType==="dedicated"})}),B.value.openai=ve,xe.success&&(B.value.bedrock=(xe.data||[]).map(X=>({...X,isDedicated:X.accountType==="dedicated"}))),Ae.success&&(B.value.droid=(Ae.data||[]).map(X=>({...X,platform:"droid",isDedicated:X.accountType==="dedicated"}))),me.success){const X=me.data||[];B.value.claudeGroups=X.filter(Ie=>Ie.platform==="claude"),B.value.geminiGroups=X.filter(Ie=>Ie.platform==="gemini"),B.value.openaiGroups=X.filter(Ie=>Ie.platform==="openai"),B.value.droidGroups=X.filter(Ie=>Ie.platform==="droid")}V("账号列表已刷新","success")}catch{V("刷新账号列表失败","error")}finally{A.value=!1}},i=async()=>{L.value=!0;try{const u={};s.rateLimitCost!==""&&s.rateLimitCost!==null&&(u.rateLimitCost=parseFloat(s.rateLimitCost)),s.rateLimitWindow!==""&&s.rateLimitWindow!==null&&(u.rateLimitWindow=parseInt(s.rateLimitWindow)),s.rateLimitRequests!==""&&s.rateLimitRequests!==null&&(u.rateLimitRequests=parseInt(s.rateLimitRequests)),s.concurrencyLimit!==""&&s.concurrencyLimit!==null&&(u.concurrencyLimit=parseInt(s.concurrencyLimit)),s.dailyCostLimit!==""&&s.dailyCostLimit!==null&&(u.dailyCostLimit=parseFloat(s.dailyCostLimit)),s.totalCostLimit!==""&&s.totalCostLimit!==null&&(u.totalCostLimit=parseFloat(s.totalCostLimit)),s.weeklyOpusCostLimit!==""&&s.weeklyOpusCostLimit!==null&&(u.weeklyOpusCostLimit=parseFloat(s.weeklyOpusCostLimit)),O.value!=="none"&&(O.value==="all"?u.permissions=[]:O.value==="custom"&&(u.permissions=s.permissions)),s.claudeAccountId!==""&&(s.claudeAccountId==="SHARED_POOL"?(u.claudeAccountId=null,u.claudeConsoleAccountId=null):s.claudeAccountId.startsWith("console:")?(u.claudeConsoleAccountId=s.claudeAccountId.substring(8),u.claudeAccountId=null):(s.claudeAccountId.startsWith("group:"),u.claudeAccountId=s.claudeAccountId,u.claudeConsoleAccountId=null)),s.geminiAccountId!==""&&(s.geminiAccountId==="SHARED_POOL"?u.geminiAccountId=null:u.geminiAccountId=s.geminiAccountId),s.openaiAccountId!==""&&(s.openaiAccountId==="SHARED_POOL"?u.openaiAccountId=null:u.openaiAccountId=s.openaiAccountId),s.bedrockAccountId!==""&&(s.bedrockAccountId==="SHARED_POOL"?u.bedrockAccountId=null:u.bedrockAccountId=s.bedrockAccountId),s.droidAccountId!==""&&(s.droidAccountId==="SHARED_POOL"?u.droidAccountId=null:u.droidAccountId=s.droidAccountId),s.isActive!==null&&(u.isActive=s.isActive),H.value!=="none"&&(u.tags=s.tags,u.tagOperation=H.value);const n=await E.put("/admin/api-keys/batch",{keyIds:p.selectedKeys,updates:u});if(n.success){const{successCount:m,failedCount:c,errors:o}=n.data;if(m>0){if(V(`成功批量编辑 ${m} 个 API Keys`,"success"),c>0){const f=o.map(se=>`${se.keyId}: ${se.error}`).join(`
|
||
`);V(`${c} 个编辑失败:
|
||
${f}`,"warning")}}else V("所有 API Keys 编辑失败","error");W("success"),W("close")}else V(n.message||"批量编辑失败","error")}catch(u){V("批量编辑失败","error"),console.error("批量编辑 API Keys 失败:",u)}finally{L.value=!1}};return ut(async()=>{if(Q.value=await G.fetchTags(),p.accounts){const u=(p.accounts.gemini||[]).map(m=>({...m,platform:m.platform||"gemini"})),n=[];p.accounts.openai&&p.accounts.openai.forEach(m=>{n.push({...m,platform:m.platform||"openai"})}),p.accounts.openaiResponses&&p.accounts.openaiResponses.forEach(m=>{n.push({...m,platform:m.platform||"openai-responses"})}),B.value={claude:p.accounts.claude||[],gemini:u,openai:n,bedrock:p.accounts.bedrock||[],droid:(p.accounts.droid||[]).map(m=>({...m,platform:m.platform||"droid"})),claudeGroups:p.accounts.claudeGroups||[],geminiGroups:p.accounts.geminiGroups||[],openaiGroups:p.accounts.openaiGroups||[],droidGroups:p.accounts.droidGroups||[]}}}),(u,n)=>(l(),he(Ee,{to:"body"},[e("div",Un,[e("div",Pn,[e("div",Rn,[e("div",Mn,[n[29]||(n[29]=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",Vn," 批量编辑 API Keys ("+g(y.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]=m=>u.$emit("close"))},n[30]||(n[30]=[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:Te(i,["prevent"])},[e("div",En,[e("div",On,[n[32]||(n[32]=e("i",{class:"fas fa-info-circle mt-1 text-blue-500"},null,-1)),e("div",null,[n[31]||(n[31]=e("p",{class:"text-sm font-medium text-blue-800 dark:text-blue-300"},"批量编辑说明",-1)),e("p",jn," 以下设置将应用到所选的 "+g(y.value)+" 个 API Key。只有填写或修改的字段才会被更新,空白字段将保持原值不变。 ",1)])])]),e("div",null,[n[42]||(n[42]=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",Gn,[e("div",zn,[e("label",qn,[D(e("input",{"onUpdate:modelValue":n[1]||(n[1]=m=>H.value=m),class:"mr-2",type:"radio",value:"replace"},null,512),[[_e,H.value]]),n[33]||(n[33]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"替换标签",-1))]),e("label",Fn,[D(e("input",{"onUpdate:modelValue":n[2]||(n[2]=m=>H.value=m),class:"mr-2",type:"radio",value:"add"},null,512),[[_e,H.value]]),n[34]||(n[34]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"添加标签",-1))]),e("label",Wn,[D(e("input",{"onUpdate:modelValue":n[3]||(n[3]=m=>H.value=m),class:"mr-2",type:"radio",value:"remove"},null,512),[[_e,H.value]]),n[35]||(n[35]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"移除标签",-1))]),e("label",Bn,[D(e("input",{"onUpdate:modelValue":n[4]||(n[4]=m=>H.value=m),class:"mr-2",type:"radio",value:"none"},null,512),[[_e,H.value]]),n[36]||(n[36]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"不修改标签",-1))])]),H.value!=="none"?(l(),d("div",Nn,[s.tags.length>0?(l(),d("div",Hn,[e("div",Yn,g(H.value==="replace"?"新标签列表:":H.value==="add"?"要添加的标签:":"要移除的标签:"),1),e("div",Qn,[(l(!0),d(Z,null,ne(s.tags,(m,c)=>(l(),d("span",{key:"selected-"+c,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"},[h(g(m)+" ",1),e("button",{class:"ml-1 hover:text-blue-900",type:"button",onClick:o=>Ke(c)},n[37]||(n[37]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,Jn)]))),128))])])):w("",!0),S.value.length>0?(l(),d("div",Xn,[n[39]||(n[39]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",Zn,[(l(!0),d(Z,null,ne(S.value,m=>(l(),d("button",{key:"available-"+m,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:c=>ge(m)},[n[38]||(n[38]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),h(" "+g(m),1)],8,ei))),128))])])):w("",!0),e("div",null,[n[41]||(n[41]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",ti,[D(e("input",{"onUpdate:modelValue":n[5]||(n[5]=m=>T.value=m),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",placeholder:"输入新标签名称",type:"text",onKeypress:it(Te(ye,["prevent"]),["enter"])},null,40,si),[[te,T.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:ye},n[40]||(n[40]=[e("i",{class:"fas fa-plus"},null,-1)]))])])])):w("",!0)])]),e("div",ai,[n[46]||(n[46]=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",ri,[e("div",oi,[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)),D(e("input",{"onUpdate:modelValue":n[6]||(n[6]=m=>s.rateLimitWindow=m),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),[[te,s.rateLimitWindow]])]),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)),D(e("input",{"onUpdate:modelValue":n[7]||(n[7]=m=>s.rateLimitRequests=m),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),[[te,s.rateLimitRequests]])]),e("div",null,[n[45]||(n[45]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),D(e("input",{"onUpdate:modelValue":n[8]||(n[8]=m=>s.rateLimitCost=m),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),[[te,s.rateLimitCost]])])])])]),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)),D(e("input",{"onUpdate:modelValue":n[9]||(n[9]=m=>s.dailyCostLimit=m),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),[[te,s.dailyCostLimit]])]),e("div",null,[n[48]||(n[48]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," 总费用限制 (美元) ",-1)),D(e("input",{"onUpdate:modelValue":n[10]||(n[10]=m=>s.totalCostLimit=m),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),[[te,s.totalCostLimit]])]),e("div",null,[n[49]||(n[49]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," Opus 模型周费用限制 (美元) ",-1)),D(e("input",{"onUpdate:modelValue":n[11]||(n[11]=m=>s.weeklyOpusCostLimit=m),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),[[te,s.weeklyOpusCostLimit]]),n[50]||(n[50]=e("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户 ",-1))]),e("div",null,[n[51]||(n[51]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制",-1)),D(e("input",{"onUpdate:modelValue":n[12]||(n[12]=m=>s.concurrencyLimit=m),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),[[te,s.concurrencyLimit]])]),e("div",null,[e("div",li,[n[55]||(n[55]=e("label",{class:"text-sm font-semibold text-gray-700 dark:text-gray-300"},"激活状态",-1)),e("div",ni,[e("label",ii,[D(e("input",{"onUpdate:modelValue":n[13]||(n[13]=m=>s.isActive=m),class:"mr-2",type:"radio",value:!0},null,512),[[_e,s.isActive]]),n[52]||(n[52]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"激活",-1))]),e("label",di,[D(e("input",{"onUpdate:modelValue":n[14]||(n[14]=m=>s.isActive=m),class:"mr-2",type:"radio",value:!1},null,512),[[_e,s.isActive]]),n[53]||(n[53]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"禁用",-1))]),e("label",ui,[D(e("input",{"onUpdate:modelValue":n[15]||(n[15]=m=>s.isActive=m),class:"mr-2",type:"radio",value:null},null,512),[[_e,s.isActive]]),n[54]||(n[54]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"不修改",-1))])])])]),e("div",null,[n[64]||(n[64]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",ci,[e("div",gi,[e("label",pi,[D(e("input",{"onUpdate:modelValue":n[16]||(n[16]=m=>O.value=m),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"none"},null,512),[[_e,O.value]]),n[56]||(n[56]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"不修改",-1))]),e("label",mi,[D(e("input",{"onUpdate:modelValue":n[17]||(n[17]=m=>O.value=m),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"all"},null,512),[[_e,O.value]]),n[57]||(n[57]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"全部服务",-1))]),e("label",xi,[D(e("input",{"onUpdate:modelValue":n[18]||(n[18]=m=>O.value=m),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"custom"},null,512),[[_e,O.value]]),n[58]||(n[58]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"自定义选择",-1))])]),O.value==="custom"?(l(),d("div",yi,[e("label",fi,[D(e("input",{"onUpdate:modelValue":n[19]||(n[19]=m=>s.permissions=m),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"claude"},null,512),[[be,s.permissions]]),n[59]||(n[59]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"Claude",-1))]),e("label",bi,[D(e("input",{"onUpdate:modelValue":n[20]||(n[20]=m=>s.permissions=m),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"gemini"},null,512),[[be,s.permissions]]),n[60]||(n[60]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"Gemini",-1))]),e("label",vi,[D(e("input",{"onUpdate:modelValue":n[21]||(n[21]=m=>s.permissions=m),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"openai"},null,512),[[be,s.permissions]]),n[61]||(n[61]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"OpenAI",-1))]),e("label",ki,[D(e("input",{"onUpdate:modelValue":n[22]||(n[22]=m=>s.permissions=m),class:"mr-2 rounded text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox",value:"droid"},null,512),[[be,s.permissions]]),n[62]||(n[62]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"Droid",-1))])])):w("",!0),n[63]||(n[63]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},' 选择"全部服务"表示允许访问所有服务,"自定义选择"可以选择多个特定服务 ',-1))])]),e("div",null,[e("div",wi,[n[65]||(n[65]=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:A.value,title:"刷新账号列表",type:"button",onClick:I},[e("i",{class:j(["fas",A.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,g(A.value?"刷新中...":"刷新账号"),1)],8,hi)]),e("div",Ai,[e("div",null,[n[66]||(n[66]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),re(Le,{modelValue:nt(F),"onUpdate:modelValue":n[23]||(n[23]=m=>lt(F)?F.value=m:null),accounts:B.value.claude,"default-option-text":"请选择Claude账号",disabled:!oe("claude"),groups:B.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude","special-options":q},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[n[67]||(n[67]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),re(Le,{modelValue:nt(K),"onUpdate:modelValue":n[24]||(n[24]=m=>lt(K)?K.value=m:null),accounts:B.value.gemini,"default-option-text":"请选择Gemini账号",disabled:!oe("gemini"),groups:B.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini","special-options":q},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[n[68]||(n[68]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),re(Le,{modelValue:nt($),"onUpdate:modelValue":n[25]||(n[25]=m=>lt($)?$.value=m:null),accounts:B.value.openai,"default-option-text":"请选择OpenAI账号",disabled:!oe("openai"),groups:B.value.openaiGroups,placeholder:"请选择OpenAI账号",platform:"openai","special-options":q},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[n[69]||(n[69]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),re(Le,{modelValue:nt(J),"onUpdate:modelValue":n[26]||(n[26]=m=>lt(J)?J.value=m:null),accounts:B.value.bedrock,"default-option-text":"请选择Bedrock账号",disabled:!oe("openai"),groups:[],placeholder:"请选择Bedrock账号",platform:"bedrock","special-options":q},null,8,["modelValue","accounts","disabled"])]),e("div",null,[n[70]||(n[70]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),re(Le,{modelValue:nt(ue),"onUpdate:modelValue":n[27]||(n[27]=m=>lt(ue)?ue.value=m:null),accounts:B.value.droid,"default-option-text":"请选择Droid账号",disabled:!oe("droid"),groups:B.value.droidGroups,placeholder:"请选择Droid账号",platform:"droid","special-options":q},null,8,["modelValue","accounts","disabled","groups"])])])]),e("div",$i,[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[28]||(n[28]=m=>u.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:L.value,type:"submit"},[L.value?(l(),d("div",Ii)):(l(),d("i",Ki)),h(" "+g(L.value?"保存中...":"批量保存"),1)],8,Ci)])],32)])])]))}},Di=Ue(Li,[["__scopeId","data-v-b437485b"]]),_i={key:0,class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},Ti={class:"modal-content relative mx-auto w-full max-w-lg p-8"},Si={class:"mb-6 flex items-center justify-between"},Ui={class:"flex items-center gap-3"},Pi={class:"text-sm text-gray-600 dark:text-gray-400"},Ri={class:"space-y-6"},Mi={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"},Vi={class:"flex items-center justify-between"},Ei={class:"text-sm font-semibold text-gray-800 dark:text-gray-200"},Oi={class:"ml-2 text-xs font-normal text-gray-600"},ji={class:"flex h-12 w-12 items-center justify-center rounded-lg bg-white shadow-sm dark:bg-gray-700"},Gi={key:0,class:"mb-4"},zi={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},qi={class:"mb-3 grid grid-cols-3 gap-2"},Fi=["onClick"],Wi={key:1,class:"animate-fadeIn"},Bi=["min"],Ni={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"},Hi={class:"flex items-center justify-between"},Yi={class:"text-sm font-semibold text-blue-900 dark:text-blue-200"},Qi={class:"flex gap-3 pt-2"},Ji=["disabled"],Xi={key:0,class:"loading-spinner mr-2"},Zi={key:1,class:"fas fa-save mr-2"},ed={__name:"ExpiryEditModal",props:{show:{type:Boolean,required:!0},apiKey:{type:Object,required:!0}},emits:["close","save"],setup(k,{expose:N,emit:p}){const W=k,G=p,L=C(!1),A=Ye({expireDuration:"",customExpireDate:"",expiresAt:null}),B=[{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 年"}],T=P(()=>{const K=new Date;return K.setMinutes(K.getMinutes()+1),K.toISOString().slice(0,16)});Se(()=>W.show,K=>{K&&Q()}),Se(()=>{var K;return(K=W.apiKey)==null?void 0:K.id},K=>{K&&W.show&&Q()});const Q=()=>{L.value=!1,W.apiKey.expiresAt?(A.expireDuration="custom",A.customExpireDate=new Date(W.apiKey.expiresAt).toISOString().slice(0,16),A.expiresAt=W.apiKey.expiresAt):(A.expireDuration="",A.customExpireDate="",A.expiresAt=null)},H=K=>{if(A.expireDuration=K,!K){A.expiresAt=null;return}if(K==="custom")return;const $=new Date,J=K.match(/(\d+)([dhmy])/);if(J){const[,ue,oe]=J,ye=parseInt(ue);switch(oe){case"d":$.setDate($.getDate()+ye);break;case"h":$.setHours($.getHours()+ye);break;case"m":$.setMonth($.getMonth()+ye);break;case"y":$.setFullYear($.getFullYear()+ye);break}A.expiresAt=$.toISOString()}},O=()=>{A.customExpireDate&&(A.expiresAt=new Date(A.customExpireDate).toISOString())},y=K=>K?new Date(K).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",S=K=>K?new Date(K)<new Date:!1,s=K=>{if(!K)return null;const $=new Date,ue=new Date(K)-$,oe=Math.ceil(ue/(1e3*60*60*24));return ue<0?{text:"已过期",class:"text-red-600"}:oe<=7?{text:`${oe} 天后过期`,class:"text-orange-600"}:oe<=30?{text:`${oe} 天后过期`,class:"text-yellow-600"}:{text:`${Math.ceil(oe/30)} 个月后过期`,class:"text-green-600"}},q=()=>{L.value=!0,G("save",{keyId:W.apiKey.id,expiresAt:A.expiresAt})},_=async()=>{let K=!0;window.showConfirm?K=await window.showConfirm("激活 API Key",`确定要立即激活此 API Key 吗?激活后将在 ${W.apiKey.activationDays||(W.apiKey.activationUnit==="hours"?24:30)} ${W.apiKey.activationUnit==="hours"?"小时":"天"}后自动过期。`,"确定激活","取消"):K=confirm(`确定要立即激活此 API Key 吗?激活后将在 ${W.apiKey.activationDays||(W.apiKey.activationUnit==="hours"?24:30)} ${W.apiKey.activationUnit==="hours"?"小时":"天"}后自动过期。`),K&&(L.value=!0,G("save",{keyId:W.apiKey.id,activateNow:!0}))};return N({resetSaving:()=>{L.value=!1}}),(K,$)=>(l(),he(Ee,{to:"body"},[k.show?(l(),d("div",_i,[e("div",{class:"fixed inset-0 bg-gray-900 bg-opacity-50 backdrop-blur-sm",onClick:$[0]||($[0]=J=>K.$emit("close"))}),e("div",Ti,[e("div",Si,[e("div",Ui,[$[6]||($[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,[$[5]||($[5]=e("h3",{class:"text-xl font-bold text-gray-900 dark:text-gray-100"},"修改过期时间",-1)),e("p",Pi,' 为 "'+g(k.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:$[1]||($[1]=J=>K.$emit("close"))},$[7]||($[7]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",Ri,[e("div",Mi,[e("div",Vi,[e("div",null,[$[12]||($[12]=e("p",{class:"mb-1 text-xs font-medium text-gray-600 dark:text-gray-400"},"当前状态",-1)),e("p",Ei,[k.apiKey.expirationMode==="activation"&&!k.apiKey.isActivated?(l(),d(Z,{key:0},[$[8]||($[8]=e("i",{class:"fas fa-pause-circle mr-1 text-blue-500"},null,-1)),$[9]||($[9]=h(" 未激活 ",-1)),e("span",Oi," (激活后 "+g(k.apiKey.activationDays||(k.apiKey.activationUnit==="hours"?24:30))+" "+g(k.apiKey.activationUnit==="hours"?"小时":"天")+"过期) ",1)],64)):k.apiKey.expiresAt?(l(),d(Z,{key:1},[h(g(y(k.apiKey.expiresAt))+" ",1),s(k.apiKey.expiresAt)?(l(),d("span",{key:0,class:j(["ml-2 text-xs font-normal",s(k.apiKey.expiresAt).class])}," ("+g(s(k.apiKey.expiresAt).text)+") ",3)):w("",!0)],64)):(l(),d(Z,{key:2},[$[10]||($[10]=e("i",{class:"fas fa-infinity mr-1 text-gray-500"},null,-1)),$[11]||($[11]=h(" 永不过期 ",-1))],64))])]),e("div",ji,[e("i",{class:j(["fas fa-hourglass-half text-lg",k.apiKey.expiresAt&&S(k.apiKey.expiresAt)?"text-red-500":"text-gray-400"])},null,2)])])]),k.apiKey.expirationMode==="activation"&&!k.apiKey.isActivated?(l(),d("div",Gi,[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:_},[$[13]||($[13]=e("i",{class:"fas fa-rocket mr-2"},null,-1)),h(" 立即激活 (激活后 "+g(k.apiKey.activationDays||(k.apiKey.activationUnit==="hours"?24:30))+" "+g(k.apiKey.activationUnit==="hours"?"小时":"天")+"过期) ",1)]),e("p",zi,[$[14]||($[14]=e("i",{class:"fas fa-info-circle mr-1"},null,-1)),h(" 点击立即激活此 API Key,激活后将在 "+g(k.apiKey.activationDays||(k.apiKey.activationUnit==="hours"?24:30))+" "+g(k.apiKey.activationUnit==="hours"?"小时":"天")+"后过期 ",1)])])):w("",!0),e("div",null,[$[16]||($[16]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"选择新的期限",-1)),e("div",qi,[(l(),d(Z,null,ne(B,J=>e("button",{key:J.value,class:j(["rounded-lg px-3 py-2 text-sm font-medium transition-all",A.expireDuration===J.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:ue=>H(J.value)},g(J.label),11,Fi)),64)),e("button",{class:j(["rounded-lg px-3 py-2 text-sm font-medium transition-all",A.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:$[2]||($[2]=J=>H("custom"))},$[15]||($[15]=[e("i",{class:"fas fa-calendar-alt mr-1"},null,-1),h(" 自定义 ",-1)]),2)])]),A.expireDuration==="custom"?(l(),d("div",Wi,[$[17]||($[17]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"选择日期和时间",-1)),D(e("input",{"onUpdate:modelValue":$[3]||($[3]=J=>A.customExpireDate=J),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:O},null,40,Bi),[[te,A.customExpireDate]]),$[18]||($[18]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 选择一个未来的日期和时间作为过期时间 ",-1))])):w("",!0),A.expiresAt!==k.apiKey.expiresAt?(l(),d("div",Ni,[e("div",Hi,[e("div",null,[$[21]||($[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"}),h(" 新的过期时间 ")],-1)),e("p",Yi,[A.expiresAt?(l(),d(Z,{key:0},[h(g(y(A.expiresAt))+" ",1),s(A.expiresAt)?(l(),d("span",{key:0,class:j(["ml-2 text-xs font-normal",s(A.expiresAt).class])}," ("+g(s(A.expiresAt).text)+") ",3)):w("",!0)],64)):(l(),d(Z,{key:1},[$[19]||($[19]=e("i",{class:"fas fa-infinity mr-1"},null,-1)),$[20]||($[20]=h(" 永不过期 ",-1))],64))])]),$[22]||($[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))])])):w("",!0),e("div",Qi,[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:$[4]||($[4]=J=>K.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-4 py-2.5 font-semibold",disabled:L.value||A.expiresAt===k.apiKey.expiresAt,onClick:q},[L.value?(l(),d("div",Xi)):(l(),d("i",Zi)),h(" "+g(L.value?"保存中...":"保存更改"),1)],8,Ji)])])])])):w("",!0)]))}},td=Ue(ed,[["__scopeId","data-v-fb30c1d3"]]),sd={class:"w-full"},ad={key:0,class:"flex items-center justify-center rounded-lg px-3 py-2 text-xs"},rd={key:1,class:"space-y-1.5"},od={class:"flex items-center justify-between text-[11px] font-medium"},ld={class:"text-gray-700 dark:text-gray-200"},nd={class:"relative h-1.5 overflow-hidden rounded-full bg-gray-200/85 dark:bg-gray-700/70"},id={class:"relative z-10 flex h-full items-center justify-between px-3"},dd={class:"flex items-center gap-1.5"},ud={class:"flex items-center gap-1.5"},cd={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"}},gd={__name:"LimitProgressBar",props:{type:{type:String,required:!0,validator:k=>["daily","opus","window","total"].includes(k)},variant:{type:String,default:"full",validator:k=>["full","compact"].includes(k)},label:{type:String,required:!0},current:{type:Number,default:0},limit:{type:Number,required:!0},showShine:{type:Boolean,default:!1}},setup(k){const N=k,p=P(()=>N.variant==="compact"),W=P(()=>{if(!N.limit||N.limit<=0)return 0;const y=N.current/N.limit*100;return Math.min(y,100)}),G=P(()=>{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)]"}}),L=P(()=>{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"}}),A=P(()=>{const y=W.value;return N.type==="daily"?y>=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":y>=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"?y>=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":y>=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"?y>=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":y>=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"?y>=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":y>=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"}),B=P(()=>{const y=W.value;if(y>=95)return"bg-rose-500 dark:bg-rose-400";if(y>=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"}}),T=P(()=>{const y=W.value;if(y>=95)return"text-rose-600 dark:text-rose-300";if(y>=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=P(()=>{const y=W.value;let S="";if(y>=90)S="text-red-700 dark:text-red-400";else if(y>=70)S="text-orange-700 dark:text-orange-400";else switch(N.type){case"daily":S="text-green-700 dark:text-green-400";break;case"opus":S="text-purple-700 dark:text-purple-400";break;case"window":S="text-blue-700 dark:text-blue-400";break;default:S="text-gray-600 dark:text-gray-400"}let s="";switch(N.type){case"daily":s="fas fa-calendar-day";break;case"opus":s="fas fa-gem";break;case"window":s="fas fa-clock";break;case"total":s="fas fa-wallet";break;default:s="fas fa-infinity"}return`${s} ${S}`}),H=P(()=>{if(W.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"}}),O=P(()=>{const y=W.value;if(y>70)return"text-white drop-shadow-[0_2px_4px_rgba(0,0,0,0.9)]";if(y>=90)return"text-red-700 dark:text-red-300";if(y>=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(y,S)=>(l(),d("div",sd,[!k.limit||k.limit<=0?(l(),d("div",ad,S[0]||(S[0]=[e("div",{class:"flex items-center gap-1.5 text-gray-600 dark:text-gray-300"},[e("i",{class:"fas fa-infinity text-sm text-gray-500 dark:text-gray-400"}),e("span",{class:"font-medium"},"无限制")],-1)]))):p.value?(l(),d("div",rd,[e("div",od,[e("div",{class:j(["flex items-center gap-1.5",T.value])},[e("i",{class:j(["text-[11px]",Q.value])},null,2),e("span",null,g(k.label),1)],2),e("span",ld,"$"+g(k.current.toFixed(2))+" / $"+g(k.limit.toFixed(2)),1)]),e("div",nd,[e("div",{class:j(["absolute inset-y-0 rounded-full transition-all duration-500 ease-out",B.value]),style:Ct({width:W.value+"%"})},null,6)])])):(l(),d("div",{key:2,class:j(["group relative h-9 w-full overflow-hidden rounded-xl border transition-all duration-300 ease-out",G.value])},[e("div",{class:j(["absolute inset-0",L.value])},null,2),e("div",{class:j(["absolute inset-0 h-full transition-all duration-500 ease-out",A.value]),style:Ct({width:W.value+"%"})},null,6),S[1]||(S[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",id,[e("div",dd,[e("i",{class:j(["text-xs",Q.value])},null,2),e("span",{class:j(["text-xs font-semibold",H.value])},g(k.label),3)]),e("div",ud,[e("span",{class:j(["text-xs font-bold tabular-nums",O.value])}," $"+g(k.current.toFixed(2))+" / $"+g(k.limit.toFixed(2)),3)])]),k.showShine&&W.value>0?(l(),d("div",cd)):w("",!0)],2))]))}},Ve=Ue(gd,[["__scopeId","data-v-8a01dc56"]]),pd={key:0,class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},md={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"},xd={class:"mb-4 flex items-center justify-between sm:mb-6"},yd={class:"flex items-center gap-2 sm:gap-3"},fd={class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"},bd={class:"modal-scroll-content custom-scrollbar flex-1 overflow-y-auto"},vd={class:"mb-6 grid grid-cols-1 gap-4 md:grid-cols-2"},kd={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"},wd={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},hd={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},Ad={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"},$d={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},Cd={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},Id={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"},Ld={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},Dd={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"},_d={class:"space-y-1 text-sm"},Td={class:"flex justify-between"},Sd={class:"font-semibold text-gray-900 dark:text-gray-100"},Ud={class:"flex justify-between"},Pd={class:"font-semibold text-gray-900 dark:text-gray-100"},Rd={class:"mb-6"},Md={class:"space-y-3 rounded-lg bg-gray-50 p-4 dark:bg-gray-700/50"},Vd={class:"flex items-center justify-between"},Ed={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},Od={class:"flex items-center justify-between"},jd={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},Gd={key:0,class:"flex items-center justify-between"},zd={class:"text-sm font-semibold text-purple-600"},qd={key:1,class:"flex items-center justify-between"},Fd={class:"text-sm font-semibold text-purple-600"},Wd={key:0,class:"mb-6"},Bd={class:"space-y-3 rounded-lg bg-gray-50 p-4 dark:bg-gray-700/50"},Nd={key:0,class:"space-y-1.5"},Hd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},Yd={key:1,class:"space-y-1.5"},Qd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},Jd={key:2,class:"space-y-1.5"},Xd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},Zd={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"},e0={class:"font-semibold text-purple-600 dark:text-purple-300"},t0={key:4,class:"space-y-2"},s0={__name:"UsageDetailModal",props:{show:{type:Boolean,required:!0},apiKey:{type:Object,required:!0}},emits:["close","open-timeline"],setup(k,{emit:N}){const p=k,W=N,G=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.total)==null?void 0:u.requests)||0}),L=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.daily)==null?void 0:u.requests)||0}),A=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.total)==null?void 0:u.tokens)||0}),B=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.daily)==null?void 0:u.tokens)||0}),T=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.total)==null?void 0:u.cost)||0}),Q=P(()=>p.apiKey.dailyCost||0),H=P(()=>p.apiKey.totalCostLimit||0),O=P(()=>p.apiKey.weeklyOpusCost||0),y=P(()=>p.apiKey.weeklyOpusCostLimit||0),S=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.total)==null?void 0:u.inputTokens)||0}),s=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.total)==null?void 0:u.outputTokens)||0}),q=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.total)==null?void 0:u.cacheCreateTokens)||0}),_=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.total)==null?void 0:u.cacheReadTokens)||0}),F=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.averages)==null?void 0:u.rpm)||0}),K=P(()=>{var i,u;return((u=(i=p.apiKey.usage)==null?void 0:i.averages)==null?void 0:u.tpm)||0}),$=P(()=>p.apiKey.dailyCostLimit>0||p.apiKey.totalCostLimit>0||p.apiKey.concurrencyLimit>0||p.apiKey.weeklyOpusCostLimit>0||p.apiKey.rateLimitWindow>0||p.apiKey.tokenLimit>0),J=P(()=>!p.apiKey.dailyCostLimit||p.apiKey.dailyCostLimit===0?0:Q.value/p.apiKey.dailyCostLimit*100),ue=P(()=>!H.value||H.value===0?0:T.value/H.value*100),oe=P(()=>!y.value||y.value===0?0:O.value/y.value*100),ye=i=>!i&&i!==0?"0":i.toLocaleString("zh-CN"),ge=i=>i>=1e6?(i/1e6).toFixed(1)+"M":i>=1e3?(i/1e3).toFixed(1)+"K":i.toString(),Ke=()=>{W("close")},I=()=>{var i;W("open-timeline",(i=p.apiKey)==null?void 0:i.id)};return(i,u)=>(l(),he(Ee,{to:"body"},[k.show?(l(),d("div",pd,[e("div",{class:"fixed inset-0 bg-gray-900 bg-opacity-50 backdrop-blur-sm",onClick:Ke}),e("div",md,[e("div",xd,[e("div",yd,[u[0]||(u[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",fd," 使用统计详情 - "+g(k.apiKey.name),1)]),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600",onClick:Ke},u[1]||(u[1]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),e("div",bd,[e("div",vd,[e("div",kd,[u[2]||(u[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",wd,g(ye(G.value)),1),e("div",hd," 今日: "+g(ye(L.value))+" 次 ",1)]),e("div",Ad,[u[3]||(u[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",$d,g(ge(A.value)),1),e("div",Cd," 今日: "+g(ge(B.value)),1)]),e("div",Id,[u[4]||(u[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," $"+g(T.value.toFixed(4)),1),e("div",Ld," 今日: $"+g(Q.value.toFixed(4)),1)]),e("div",Dd,[u[7]||(u[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",_d,[e("div",Td,[u[5]||(u[5]=e("span",{class:"text-gray-600 dark:text-gray-400"},"RPM:",-1)),e("span",Sd,g(F.value),1)]),e("div",Ud,[u[6]||(u[6]=e("span",{class:"text-gray-600 dark:text-gray-400"},"TPM:",-1)),e("span",Pd,g(K.value),1)])])])]),e("div",Rd,[u[12]||(u[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"}),h(" Token 使用分布 ")],-1)),e("div",Md,[e("div",Vd,[u[8]||(u[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",Ed,g(ge(S.value)),1)]),e("div",Od,[u[9]||(u[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",jd,g(ge(s.value)),1)]),q.value>0?(l(),d("div",Gd,[u[10]||(u[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",zd,g(ge(q.value)),1)])):w("",!0),_.value>0?(l(),d("div",qd,[u[11]||(u[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",Fd,g(ge(_.value)),1)])):w("",!0)])]),$.value?(l(),d("div",Wd,[u[15]||(u[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"}),h(" 限制设置 ")],-1)),e("div",Bd,[k.apiKey.dailyCostLimit>0?(l(),d("div",Nd,[re(Ve,{current:Q.value,label:"每日费用限制",limit:k.apiKey.dailyCostLimit,"show-shine":!0,type:"daily"},null,8,["current","limit"]),e("div",Hd," 已使用 "+g(Math.min(J.value,100).toFixed(1))+"% ",1)])):w("",!0),k.apiKey.weeklyOpusCostLimit>0?(l(),d("div",Yd,[re(Ve,{current:O.value,label:"Opus 周费用限制",limit:k.apiKey.weeklyOpusCostLimit,"show-shine":!0,type:"opus"},null,8,["current","limit"]),e("div",Qd," 已使用 "+g(Math.min(oe.value,100).toFixed(1))+"% ",1)])):w("",!0),k.apiKey.totalCostLimit>0?(l(),d("div",Jd,[re(Ve,{current:T.value,label:"总费用限制",limit:k.apiKey.totalCostLimit,"show-shine":!0,type:"total"},null,8,["current","limit"]),e("div",Xd," 已使用 "+g(Math.min(ue.value,100).toFixed(1))+"% ",1)])):w("",!0),k.apiKey.concurrencyLimit>0?(l(),d("div",Zd,[u[13]||(u[13]=e("span",{class:"text-gray-600 dark:text-gray-300"},"并发限制",-1)),e("span",e0,g(k.apiKey.currentConcurrency||0)+" / "+g(k.apiKey.concurrencyLimit),1)])):w("",!0),k.apiKey.rateLimitWindow>0?(l(),d("div",t0,[u[14]||(u[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"}),h(" 时间窗口限制 ")],-1)),re(ya,{"cost-limit":k.apiKey.rateLimitCost,"current-cost":k.apiKey.currentWindowCost,"current-requests":k.apiKey.currentWindowRequests,"current-tokens":k.apiKey.currentWindowTokens,label:"窗口状态","rate-limit-window":k.apiKey.rateLimitWindow,"request-limit":k.apiKey.rateLimitRequests,"show-progress":!0,"show-tooltip":!0,"token-limit":k.apiKey.tokenLimit,"window-end-time":k.apiKey.windowEndTime,"window-remaining-seconds":k.apiKey.windowRemainingSeconds,"window-start-time":k.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"])])):w("",!0)])])):w("",!0)]),e("div",{class:"mt-4 flex justify-end gap-2 sm:mt-6 sm:gap-3"},[e("button",{class:"btn btn-primary px-4 py-2 text-sm",type:"button",onClick:I}," 查看请求时间线 "),e("button",{class:"btn btn-secondary px-4 py-2 text-sm",type:"button",onClick:Ke}," 关闭 ")])])])):w("",!0)]))}},a0=Ue(s0,[["__scopeId","data-v-e4a6a155"]]),r0={class:"tab-content"},o0={class:"card p-4 sm:p-6"},l0={class:"mb-4 flex flex-col gap-4 sm:mb-6"},n0={class:"border-b border-gray-200 dark:border-gray-700"},i0={"aria-label":"Tabs",class:"-mb-px flex space-x-8"},d0={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"},u0={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"},c0={key:0,class:"tab-panel"},g0={class:"mb-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between"},p0={class:"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:gap-3"},m0={class:"group relative min-w-[140px]"},x0={key:0,class:"flex items-center"},y0={class:"group relative min-w-[140px]"},f0={class:"relative"},b0={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"},v0={class:"group relative min-w-[140px]"},k0={class:"relative"},w0={key:0,class:"absolute -right-2 -top-2 z-10 flex h-5 w-5 items-center justify-center rounded-full bg-orange-500 text-xs text-white shadow-sm"},h0={class:"flex min-w-[240px] flex-col gap-2 sm:flex-row sm:items-center"},A0={class:"sm:w-44"},$0={class:"group relative flex-1"},C0={class:"relative flex items-center"},I0=["placeholder"],K0={class:"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:gap-3"},L0=["disabled"],D0={class:"relative"},_0={class:"relative"},T0={key:0,class:"py-12 text-center"},S0={key:1,class:"py-12 text-center"},U0={key:2,class:"table-wrapper hidden md:block"},P0={class:"table-container"},R0={class:"w-full"},M0={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"},V0={key:0,class:"checkbox-column sticky left-0 z-20 min-w-[50px] px-3 py-4 text-left"},E0={class:"flex items-center"},O0=["indeterminate"],j0={key:1,class:"fas fa-sort ml-1 text-gray-400"},G0={key:1,class:"fas fa-sort ml-1 text-gray-400"},z0=["title"],q0={key:1,class:"fas fa-sort ml-1 text-gray-400"},F0={key:2,class:"fas fa-clock ml-1 text-gray-400",title:"索引更新中"},W0={key:1,class:"fas fa-sort ml-1 text-gray-400"},B0={key:1,class:"fas fa-sort ml-1 text-gray-400"},N0={key:1,class:"fas fa-sort ml-1 text-gray-400"},H0={key:0,class:"checkbox-column sticky left-0 z-10 px-3 py-3"},Y0={class:"flex items-center"},Q0=["value"],J0={class:"min-w-0"},X0=["title"],Z0={key:0,class:"mt-1 text-xs text-red-600"},eu={class:"px-3 py-3"},tu={class:"space-y-1"},su={key:0,class:"flex items-center gap-1 text-xs text-gray-400 dark:text-gray-500"},au={key:0,class:"flex items-center gap-1 text-xs"},ru={class:"truncate text-gray-600 dark:text-gray-400"},ou={key:1,class:"flex items-center gap-1 text-xs"},lu={class:"truncate text-gray-600 dark:text-gray-400"},nu={key:2,class:"flex items-center gap-1 text-xs"},iu={class:"truncate text-gray-600 dark:text-gray-400"},du={key:3,class:"flex items-center gap-1 text-xs"},uu={class:"truncate text-gray-600 dark:text-gray-400"},cu={key:4,class:"flex items-center gap-1 text-xs"},gu={class:"truncate text-gray-600 dark:text-gray-400"},pu={key:5,class:"text-xs text-gray-500 dark:text-gray-400"},mu={class:"px-3 py-3"},xu={class:"flex flex-wrap gap-1"},yu={key:0,class:"text-xs text-gray-400"},fu={class:"whitespace-nowrap px-3 py-3"},bu={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},vu={key:0,class:"flex items-center justify-end"},ku={key:1,class:"font-semibold text-blue-600 dark:text-blue-400",style:{"font-size":"14px"}},wu={key:2,class:"text-gray-400"},hu={class:"px-2 py-2",style:{"font-size":"12px"}},Au={class:"flex flex-col gap-2"},$u={key:0,class:"space-y-2"},Cu={key:2,class:"space-y-1.5"},Iu={class:"flex items-center justify-between text-[10px]"},Ku={class:"flex items-center gap-1 text-sky-600 dark:text-sky-300"},Lu={class:"font-medium"},Du={key:3,class:"flex items-center justify-center gap-1.5 py-2 text-gray-500 dark:text-gray-400"},_u={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Tu={key:0,class:"flex items-center justify-end"},Su={key:1,class:"flex items-center justify-end gap-1"},Uu={class:"font-medium text-purple-600 dark:text-purple-400",style:{"font-size":"13px"}},Pu={key:2,class:"text-gray-400"},Ru={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Mu={key:0,class:"flex items-center justify-end"},Vu={key:1,class:"flex items-center justify-end gap-1"},Eu={class:"font-medium text-gray-900 dark:text-gray-100",style:{"font-size":"13px"}},Ou={key:2,class:"text-gray-400"},ju={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Gu={class:"flex flex-col leading-tight"},zu=["title"],qu={key:1,class:"text-gray-400",style:{"font-size":"13px"}},Fu={key:2,class:"mt-1 text-xs text-gray-400 dark:text-gray-500"},Wu=["title"],Bu={key:0,class:"ml-1 text-gray-400 dark:text-gray-500"},Nu={key:4,class:"mt-1 text-xs text-gray-400 dark:text-gray-500"},Hu={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Yu={class:"whitespace-nowrap px-3 py-3 text-sm text-gray-700 dark:text-gray-300"},Qu={class:"inline-flex items-center gap-1.5"},Ju={key:0,class:"inline-flex items-center text-blue-600 dark:text-blue-400",style:{"font-size":"13px"}},Xu={key:1},Zu=["onClick"],ec=["onClick"],tc=["onClick"],sc=["onClick"],ac={class:"operations-column operations-cell whitespace-nowrap px-3 py-3",style:{"font-size":"13px"}},rc={class:"hidden gap-1 2xl:flex"},oc=["onClick"],lc=["onClick"],nc=["onClick"],ic=["onClick"],dc=["title","onClick"],uc={class:"ml-1"},cc=["onClick"],gc={class:"flex items-center gap-1 2xl:hidden"},pc=["onClick"],mc=["onClick"],xc={key:0},yc={class:"bg-gray-50 px-3 py-3 dark:bg-gray-700",colspan:"13"},fc={key:0,class:"py-4 text-center"},bc={class:"space-y-4"},vc={class:"mb-4 flex items-center justify-between"},kc={class:"flex items-center gap-2"},wc={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"},hc={class:"flex items-center gap-1"},Ac={class:"flex gap-1 rounded bg-gray-100 p-1 dark:bg-gray-700"},$c=["onClick"],Cc={key:0,class:"py-8 text-center"},Ic={class:"mb-3 flex items-center justify-center gap-2"},Kc=["onClick"],Lc={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"},Dc={class:"mb-3 flex items-start justify-between"},_c={class:"flex-1"},Tc={class:"mb-1 block text-sm font-semibold text-gray-800 dark:text-gray-200"},Sc={class:"rounded-full bg-blue-50 px-2 py-1 text-xs text-gray-500 dark:bg-blue-900/30 dark:text-gray-400"},Uc={class:"mb-3 space-y-2"},Pc={class:"flex items-center justify-between text-sm"},Rc={class:"font-semibold text-gray-900 dark:text-gray-100"},Mc={class:"flex items-center justify-between text-sm"},Vc={class:"font-semibold text-green-600"},Ec={class:"mt-2 border-t border-gray-100 pt-2 dark:border-gray-600"},Oc={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},jc={class:"font-medium"},Gc={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},zc={class:"font-medium"},qc={key:0,class:"flex items-center justify-between text-xs text-purple-600"},Fc={class:"font-medium"},Wc={key:1,class:"flex items-center justify-between text-xs text-purple-600"},Bc={class:"font-medium"},Nc={class:"mt-3 h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Hc={class:"mt-1 text-right"},Yc={class:"text-xs font-medium text-indigo-600"},Qc={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"},Jc={class:"flex items-center justify-between text-sm"},Xc={class:"flex gap-4 text-xs"},Zc={class:"text-gray-600 dark:text-gray-400"},eg={class:"font-semibold text-gray-800 dark:text-gray-200"},tg={class:"text-gray-600 dark:text-gray-400"},sg={class:"font-semibold text-gray-800 dark:text-gray-200"},ag={key:3,class:"space-y-3 md:hidden"},rg={class:"mb-3 flex items-start justify-between"},og={class:"flex items-center gap-3"},lg=["value"],ng={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},ig={class:"mt-0.5 text-xs text-gray-500 dark:text-gray-400"},dg={class:"mb-3 space-y-1.5"},ug={key:0,class:"flex flex-wrap items-center gap-1 text-xs"},cg={class:"text-gray-600 dark:text-gray-400"},gg={key:1,class:"flex flex-wrap items-center gap-1 text-xs"},pg={class:"text-gray-600 dark:text-gray-400"},mg={key:2,class:"flex flex-wrap items-center gap-1 text-xs"},xg={class:"text-gray-600 dark:text-gray-400"},yg={key:3,class:"flex flex-wrap items-center gap-1 text-xs"},fg={class:"text-gray-600 dark:text-gray-400"},bg={key:4,class:"flex flex-wrap items-center gap-1 text-xs"},vg={class:"text-gray-600 dark:text-gray-400"},kg={key:5,class:"text-xs text-gray-500 dark:text-gray-400"},wg={key:6,class:"text-xs text-red-600"},hg={class:"mb-3 space-y-2"},Ag={class:"rounded-lg bg-gray-50 p-3 dark:bg-gray-700"},$g={class:"mb-2 flex items-center justify-between"},Cg={class:"text-xs text-gray-600 dark:text-gray-400"},Ig=["onClick"],Kg={class:"grid grid-cols-2 gap-3"},Lg={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"},Dg={key:1,class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},_g={key:2,class:"text-sm font-semibold text-gray-400"},Tg={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"},Sg={key:1,class:"text-sm font-semibold text-green-600"},Ug={key:2,class:"text-sm font-semibold text-gray-400"},Pg={class:"mt-2 text-xs text-gray-600 dark:text-gray-400"},Rg={class:"flex items-center justify-between"},Mg={class:"font-medium text-gray-700 dark:text-gray-300"},Vg={class:"mt-1 flex items-center justify-between"},Eg={key:0,class:"text-gray-400 dark:text-gray-500"},Og=["title"],jg={key:0,class:"ml-1 text-gray-400 dark:text-gray-500"},Gg={key:2,class:"text-gray-400 dark:text-gray-500"},zg={class:"space-y-2"},qg={key:0,class:"space-y-2"},Fg={key:2,class:"space-y-2"},Wg={class:"flex items-center justify-between text-xs"},Bg={class:"flex items-center gap-1.5 text-sky-600 dark:text-sky-300"},Ng={class:"font-medium"},Hg={key:3,class:"flex items-center justify-center gap-1.5 py-2 text-gray-500 dark:text-gray-400"},Yg={class:"mb-3 text-xs text-gray-500 dark:text-gray-400"},Qg={class:"mb-1 flex justify-between"},Jg={class:"flex items-center justify-between"},Xg={class:"flex items-center gap-1"},Zg=["onClick"],ep={key:0,class:"mb-3 flex flex-wrap gap-1"},tp={class:"mt-3 flex gap-2 border-t border-gray-100 pt-3 dark:border-gray-600"},sp=["onClick"],ap=["onClick"],rp=["onClick"],op=["onClick"],lp=["onClick"],np={key:4,class:"mt-4 flex flex-col items-center justify-between gap-4 sm:mt-6 sm:flex-row"},ip={class:"flex w-full flex-col items-center gap-3 sm:w-auto sm:flex-row"},dp={class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},up={class:"flex items-center gap-2"},cp=["value"],gp={class:"flex items-center gap-2"},pp=["disabled"],mp={class:"flex items-center gap-1"},xp={key:1,class:"hidden px-2 text-gray-500 dark:text-gray-400 sm:inline"},yp=["onClick"],fp={key:2,class:"hidden px-2 text-gray-500 dark:text-gray-400 sm:inline"},bp=["disabled"],vp={key:1,class:"tab-panel"},kp={key:0,class:"py-12 text-center"},wp={key:1,class:"py-12 text-center"},hp={key:2},Ap={class:"mb-4 flex justify-end"},$p={class:"table-wrapper"},Cp={class:"table-container"},Ip={class:"w-full"},Kp={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"},Lp={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"},Dp={class:"divide-y divide-gray-200/50 dark:divide-gray-600/50"},_p={class:"name-column sticky left-0 z-10 px-3 py-3"},Tp={class:"flex items-center"},Sp={class:"min-w-0"},Up=["title"],Pp={class:"px-3 py-3"},Rp={class:"space-y-1"},Mp={key:0,class:"flex items-center gap-1 text-xs"},Vp={key:1,class:"flex items-center gap-1 text-xs"},Ep={key:2,class:"flex items-center gap-1 text-xs"},Op={key:3,class:"text-xs text-gray-500 dark:text-gray-400"},jp={key:0,class:"px-3 py-3"},Gp={class:"text-xs"},zp={key:0,class:"text-blue-600"},qp={key:1,class:"text-green-600"},Fp={key:2,class:"text-gray-500 dark:text-gray-400"},Wp={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Bp={class:"px-3 py-3"},Np={class:"text-xs"},Hp={key:0,class:"text-blue-600"},Yp={key:1,class:"text-green-600"},Qp={key:2,class:"text-gray-500 dark:text-gray-400"},Jp={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Xp={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"}},em={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},tm={class:"font-medium text-purple-600 dark:text-purple-400",style:{"font-size":"13px"}},sm={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},am={class:"flex items-center justify-end gap-1"},rm={class:"font-medium text-gray-900 dark:text-gray-100",style:{"font-size":"13px"}},om={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},lm={class:"flex flex-col leading-tight"},nm=["title"],im={key:1,class:"text-gray-400",style:{"font-size":"13px"}},dm={key:2,class:"mt-1 text-xs text-gray-400 dark:text-gray-500"},um=["title"],cm={key:0,class:"ml-1 text-gray-400 dark:text-gray-500"},gm={key:4,class:"mt-1 text-xs text-gray-400 dark:text-gray-500"},pm={class:"operations-column operations-cell px-3 py-3"},mm={class:"flex items-center gap-2"},xm=["onClick"],ym=["onClick"],ks=16,fm={__name:"ApiKeysView",setup(k){const N=ma(),p=zt(),W=xa(),G=C([]),L=P(()=>{var a;return((a=W.oemSettings)==null?void 0:a.ldapEnabled)||!1}),A=C([]),B=C(!1),T=C(!1),Q=C(!1),H=C(!1),O=C("today"),y=Ye({type:"preset",preset:"today",customStart:"",customEnd:"",customRange:null}),S=P(()=>Q.value),s=()=>{Q.value=!Q.value,Q.value||(A.value=[],B.value=!1,T.value=!1)},q=P(()=>[{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"}]),_=C("active"),F=C([]),K=C(!1),$=C("createdAt"),J=C("desc"),ue=C({}),oe=C({}),ye=C({page:1,pageSize:20,total:0,totalPages:0}),ge=C(new Map),Ke=C(new Set),I=C(new Map),i=C(new Set),u=C({}),n=C({}),m=C([new Date(2e3,1,1,0,0,0),new Date(2e3,2,1,23,59,59)]),c=C({claude:[],gemini:[],geminiApi:[],openai:[],openaiResponses:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),o=C(!1),f=C(!1),se=C(null),pe=C(null),xe=C(!1),Ae=C(null),me=C(""),$e=C([]),Y=C([]),ve=C([]),X=C(""),Ie=C("apiKey"),Qe=P(()=>[{value:"apiKey",label:"按Key名称",icon:"fa-key"},{value:"bindingAccount",label:"按所属账号",icon:"fa-id-badge"}]),le=P(()=>{const a=[{value:"",label:"所有标签",icon:"fa-asterisk"}];return $e.value.forEach(t=>{a.push({value:t,label:t,icon:"fa-tag"})}),a}),Re=P(()=>ve.value.map(a=>({value:a,label:a,icon:"fa-cube"}))),As=P(()=>me.value?G.value.filter(a=>a.tags&&a.tags.includes(me.value)).length:0),ke=C(1),Je=C((()=>{const a=localStorage.getItem("apiKeysPageSize");if(a){const t=parseInt(a,10);if([10,20,50,100].includes(t))return t}return 10})()),$s=[10,20,50,100],Xe=C(!1),ct=C(!1),gt=C(!1),It=C(!1),Kt=C(!1),pt=C(!1),Ft=C(null),Wt=C(null),Bt=C(null),Nt=C([]),mt=P(()=>G.value),ze=P(()=>ye.value.totalPages||0),Ze=P(()=>{const a=[],t=ke.value,x=ze.value;if(x<=7)for(let r=1;r<=x;r++)a.push(r);else{let r=Math.max(1,t-2),v=Math.min(x,t+2);t<=3?v=5:t>=x-2&&(r=x-4);for(let R=r;R<=v;R++)a.push(R)}return a}),Ht=P(()=>{const a=Ze.value;return a.length===0?!1:a[0]>1}),Yt=P(()=>{const a=Ze.value;return a.length===0?!1:a[a.length-1]<ze.value}),Cs=P(()=>{const a=Ze.value;return a.length===0?!1:Ht.value&&a[0]>2}),Is=P(()=>{const a=Ze.value;return a.length===0?!1:Yt.value&&a[a.length-1]<ze.value-1}),We=P(()=>G.value),xt=async(a=!1)=>{var t,x;if(!(f.value&&!a)){o.value=!0;try{const[r,v,R,M,U,ae,ie,b,z]=await Promise.all([E.get("/admin/claude-accounts"),E.get("/admin/claude-console-accounts"),E.get("/admin/gemini-accounts"),E.get("/admin/gemini-api-accounts"),E.get("/admin/openai-accounts"),E.get("/admin/openai-responses-accounts"),E.get("/admin/bedrock-accounts"),E.get("/admin/droid-accounts"),E.get("/admin/account-groups")]),de=[];r.success&&((t=r.data)==null||t.forEach(ee=>{de.push({...ee,platform:"claude-oauth",isDedicated:ee.accountType==="dedicated"})})),v.success&&((x=v.data)==null||x.forEach(ee=>{de.push({...ee,platform:"claude-console",isDedicated:ee.accountType==="dedicated"})})),c.value.claude=de;const we=[];if(R.success&&(R.data||[]).forEach(ee=>{we.push({...ee,platform:"gemini",isDedicated:ee.accountType==="dedicated"})}),M.success&&(c.value.geminiApi=(M.data||[]).map(ee=>({...ee,platform:"gemini-api",isDedicated:ee.accountType==="dedicated"})),c.value.geminiApi.forEach(ee=>{we.push(ee)})),c.value.gemini=we,U.success&&(c.value.openai=(U.data||[]).map(ee=>({...ee,isDedicated:ee.accountType==="dedicated"}))),ae.success&&(c.value.openaiResponses=(ae.data||[]).map(ee=>({...ee,isDedicated:ee.accountType==="dedicated"}))),ie.success&&(c.value.bedrock=(ie.data||[]).map(ee=>({...ee,isDedicated:ee.accountType==="dedicated"}))),b.success&&(c.value.droid=(b.data||[]).map(ee=>({...ee,platform:"droid",isDedicated:ee.accountType==="dedicated"}))),z.success){const ee=z.data||[];c.value.claudeGroups=ee.filter(ce=>ce.platform==="claude"),c.value.geminiGroups=ee.filter(ce=>ce.platform==="gemini"),c.value.openaiGroups=ee.filter(ce=>ce.platform==="openai"),c.value.droidGroups=ee.filter(ce=>ce.platform==="droid")}f.value=!0}catch{}finally{o.value=!1}}},Ks=async()=>{try{const a=await E.get("/admin/api-keys/used-models");a.success&&(ve.value=a.data||[])}catch(a){console.error("Failed to load used models:",a)}},Ce=async(a=!0)=>{var t,x,r;H.value=!0;try{a&&(ge.value.clear(),I.value.clear());const v=new URLSearchParams;v.set("page",ke.value.toString()),v.set("pageSize",Je.value.toString()),v.set("searchMode",Ie.value),X.value&&v.set("search",X.value),me.value&&v.set("tag",me.value),Y.value.length>0&&v.set("models",Y.value.join(","));const M=["name","createdAt","expiresAt","lastUsedAt","isActive","status","cost"].includes($.value)?$.value:"createdAt";v.set("sortBy",M),v.set("sortOrder",J.value),M==="cost"&&(y.type==="custom"&&y.customStart&&y.customEnd?(v.set("costTimeRange","custom"),v.set("costStartDate",y.customStart),v.set("costEndDate",y.customEnd)):v.set("costTimeRange",y.preset||"7days")),y.type==="custom"&&y.customStart&&y.customEnd?(v.set("startDate",y.customStart),v.set("endDate",y.customEnd),v.set("timeRange","custom")):y.preset==="all"?v.set("timeRange","all"):v.set("timeRange",y.preset);const U=await E.get(`/admin/api-keys?${v.toString()}`);U.success&&(G.value=((t=U.data)==null?void 0:t.items)||[],(x=U.data)!=null&&x.pagination&&(ye.value=U.data.pagination,ke.value>ye.value.totalPages&&ye.value.totalPages>0&&(ke.value=ye.value.totalPages)),(r=U.data)!=null&&r.availableTags&&($e.value=U.data.availableTags),Ls(),Ds())}catch{V("加载 API Keys 失败","error")}finally{H.value=!1}},Ls=async()=>{const a=G.value;if(!a||a.length===0)return;let t=y.preset,x=null,r=null;y.type==="custom"&&y.customStart&&y.customEnd&&(t="custom",x=y.customStart,r=y.customEnd);const v=a.filter(M=>{const U=ge.value.get(M.id);return!U||U.timeRange!==t||t==="custom"&&(U.startDate!==x||U.endDate!==r)});if(v.length===0)return;const R=v.map(M=>M.id);R.forEach(M=>Ke.value.add(M));try{const M={keyIds:R,timeRange:t};t==="custom"&&(M.startDate=x,M.endDate=r);const U=await E.post("/admin/api-keys/batch-stats",M);if(U.success&&U.data)for(const[ae,ie]of Object.entries(U.data))ge.value.set(ae,{stats:ie,timeRange:t,startDate:x,endDate:r,timestamp:Date.now()})}catch(M){console.error("加载统计数据失败:",M)}finally{R.forEach(M=>Ke.value.delete(M))}},fe=a=>{const t=ge.value.get(a);return(t==null?void 0:t.stats)||null},qe=a=>Ke.value.has(a),Ds=async()=>{const a=G.value;if(!a||a.length===0)return;const t=a.filter(r=>!(!r.lastUsedAt||I.value.has(r.id)));if(t.length===0)return;const x=t.map(r=>r.id);x.forEach(r=>i.value.add(r));try{const r=await E.post("/admin/api-keys/batch-last-usage",{keyIds:x});if(r.success&&r.data)for(const[v,R]of Object.entries(r.data))I.value.set(v,R)}catch(r){console.error("加载最后使用账号数据失败:",r)}finally{x.forEach(r=>i.value.delete(r))}},_s=a=>I.value.get(a)||null,yt=a=>i.value.has(a),ft=async()=>{_.value="deleted",K.value=!0;try{const a=await E.get("/admin/api-keys/deleted");a.success&&(F.value=a.apiKeys||[])}catch{V("加载已删除的 API Keys 失败","error")}finally{K.value=!1}},Be=a=>{if(a==="cost"){if(!bt.value){V("费用排序索引正在更新中,请稍后重试","warning");return}y.type==="custom"&&V("正在计算费用排序,可能需要几秒钟...","info")}$.value===a?J.value=J.value==="asc"?"desc":"asc":($.value=a,J.value=a==="cost"?"desc":"asc")},bt=P(()=>{if(y.type==="custom")return!0;const a=y.preset,t=oe.value[a];return(t==null?void 0:t.status)==="ready"}),Ts=P(()=>{if(y.type==="custom")return"点击按费用排序(实时计算,可能需要几秒钟)";const a=y.preset,t=oe.value[a];return t?t.status==="updating"?"费用排序索引正在更新中...":t.status==="ready"?`点击按费用排序(索引更新于: ${t.lastUpdate?new Date(t.lastUpdate).toLocaleString():"未知"})`:"费用排序索引状态未知":"费用排序索引未初始化"});let Ne=null;const Qt=async()=>{try{const a=await E.get("/admin/api-keys/cost-sort-status");a.success&&(oe.value=a.data||{},Ss())}catch(a){console.error("Failed to fetch cost sort status:",a)}},Ss=()=>{Ne&&clearTimeout(Ne);const t=Object.values(oe.value).some(x=>(x==null?void 0:x.status)==="updating")?1e4:6e4;Ne=setTimeout(Qt,t)},Lt=a=>!a&&a!==0?"0":a.toLocaleString("zh-CN"),De=a=>!a&&a!==0?"0":a>=1e6?(a/1e6).toFixed(1)+"M":a>=1e3?(a/1e3).toFixed(1)+"K":a.toString(),et=a=>{if(!a)return"未知账户";if(a.startsWith("group:")){const U=a.substring(6),ae=c.value.claudeGroups.find(de=>de.id===U);if(ae)return`分组-${ae.name}`;const ie=c.value.geminiGroups.find(de=>de.id===U);if(ie)return`分组-${ie.name}`;const b=c.value.openaiGroups.find(de=>de.id===U);if(b)return`分组-${b.name}`;const z=c.value.droidGroups.find(de=>de.id===U);return z?`分组-${z.name}`:`分组-${U.substring(0,8)}`}const t=c.value.claude.find(U=>U.id===a);if(t)return`${t.name}`;if(a.startsWith("api:")){const U=a.replace("api:",""),ae=c.value.gemini.find(ie=>ie.id===U&&ie.platform==="gemini-api");return ae?`${ae.name}`:`${U.substring(0,8)}`}const x=c.value.gemini.find(U=>U.id===a);if(x)return`${x.name}`;if(a.startsWith("responses:")){const U=a.replace("responses:",""),ae=c.value.openaiResponses.find(ie=>ie.id===U);return ae?`${ae.name}`:`${U.substring(0,8)}`}const r=c.value.openai.find(U=>U.id===a);if(r)return`${r.name}`;const v=c.value.openaiResponses.find(U=>U.id===a);if(v)return`${v.name}`;const R=c.value.bedrock.find(U=>U.id===a);if(R)return`${R.name}`;const M=c.value.droid.find(U=>U.id===a);return M?`${M.name}`:`${a.substring(0,8)}`},Us=a=>!!(a.claudeAccountId||a.claudeConsoleAccountId||a.geminiAccountId||a.openaiAccountId||a.bedrockAccountId||a.droidAccountId),Jt=a=>{if(a.claudeAccountId){const t=et(a.claudeAccountId);if(a.claudeAccountId.startsWith("group:"))return t;const x=c.value.claude.find(r=>r.id===a.claudeAccountId);return x?x.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}if(a.claudeConsoleAccountId){const t=c.value.claude.find(x=>x.id===a.claudeConsoleAccountId&&x.platform==="claude-console");return t?`Console-${t.name}`:"⚠️ Console账户不存在"}return""},Xt=a=>{if(a.geminiAccountId){const t=et(a.geminiAccountId);if(a.geminiAccountId.startsWith("group:"))return t;if(a.geminiAccountId.startsWith("api:")){const r=a.geminiAccountId.replace("api:",""),v=c.value.gemini.find(R=>R.id===r&&R.platform==="gemini-api");return v?v.accountType==="dedicated"?`🔒 API专属-${t}`:`API-${t}`:`⚠️ ${t} (账户不存在)`}const x=c.value.gemini.find(r=>r.id===a.geminiAccountId);return x?x.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},Zt=a=>{if(a.openaiAccountId){const t=et(a.openaiAccountId);if(a.openaiAccountId.startsWith("group:"))return t;let x=null;if(a.openaiAccountId.startsWith("responses:")){const r=a.openaiAccountId.replace("responses:","");x=c.value.openaiResponses.find(v=>v.id===r)}else x=c.value.openai.find(r=>r.id===a.openaiAccountId);return x?x.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},es=a=>{if(a.bedrockAccountId){const t=et(a.bedrockAccountId);if(a.bedrockAccountId.startsWith("group:"))return t;const x=c.value.bedrock.find(r=>r.id===a.bedrockAccountId);return x?x.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},ts=a=>{if(a.droidAccountId){const t=et(a.droidAccountId);if(a.droidAccountId.startsWith("group:"))return t;const x=c.value.droid.find(r=>r.id===a.droidAccountId);return x?x.accountType==="dedicated"?`🔒 专属-${t}`:t:`⚠️ ${t} (账户不存在)`}return""},tt=a=>a?new Date(a)<new Date:!1,st=a=>!a||tt(a)?!1:(new Date(a)-new Date)/(1e3*60*60*24)<=7,ss=a=>a?new Date(a).toLocaleDateString("zh-CN"):"",as=async a=>{ue.value[a]?ue.value[a]=!1:(ue.value[a]=!0,n.value[a]||ls(a),await vt(a,!0))},vt=async(a,t=!1)=>{if(!t&&u.value[a]&&u.value[a].length>0)return;const x=Oe(a);try{let r=`/admin/api-keys/${a}/model-stats`;const v=new URLSearchParams;if(x.customStart&&x.customEnd)v.append("startDate",x.customStart),v.append("endDate",x.customEnd),v.append("period","custom");else{const M=x.preset==="today"||x.preset==="7days"?"daily":"monthly";v.append("period",M)}r+="?"+v.toString();const R=await E.get(r);R.success&&(u.value[a]=R.data||[])}catch{V("加载模型统计失败","error"),u.value[a]=[]}},rs=(a,t)=>{const x=t.reduce((r,v)=>r+(v.allTokens||0),0);return x===0?0:Math.round(a/x*100)},Ps=a=>a.formatted&&a.formatted.total?a.formatted.total:a.cost!==void 0?`$${a.cost.toFixed(6)}`:"$0.000000",Rs=a=>{var t,x,r,v,R,M;if(y.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.requests!==void 0)return a.usage.custom.requests;if(a.usage.total&&a.usage.total.requests!==void 0)return a.usage.total.requests}return 0}else{if(y.preset==="today")return((x=(t=a.usage)==null?void 0:t.daily)==null?void 0:x.requests)||0;if(y.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].requests!==void 0?a.usage["7days"].requests:0;if(y.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].requests!==void 0)return a.usage["30days"].requests;if(a.usage.monthly&&a.usage.monthly.requests!==void 0)return a.usage.monthly.requests}return 0}else return y.preset==="all"?a.usage&&a.usage.all&&a.usage.all.requests!==void 0?a.usage.all.requests:((v=(r=a.usage)==null?void 0:r.total)==null?void 0:v.requests)||0:((M=(R=a.usage)==null?void 0:R.total)==null?void 0:M.requests)||0}},Ms=a=>{if(y.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.cost!==void 0)return a.usage.custom.cost;if(a.usage.total&&a.usage.total.cost!==void 0)return a.usage.total.cost}return 0}else{if(y.preset==="today")return a.dailyCost||0;if(y.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].cost!==void 0?a.usage["7days"].cost:a.weeklyCost||a.periodCost||0;if(y.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].cost!==void 0)return a.usage["30days"].cost;if(a.usage.monthly&&a.usage.monthly.cost!==void 0)return a.usage.monthly.cost;if(a.usage.total&&a.usage.total.cost!==void 0)return a.usage.total.cost}return a.monthlyCost||a.periodCost||0}else return y.preset==="all"?a.usage&&a.usage.all&&a.usage.all.cost!==void 0?a.usage.all.cost:a.totalCost||0:a.periodCost||a.totalCost||0}},Vs=a=>{var t,x,r,v,R,M;if(y.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.tokens!==void 0)return a.usage.custom.tokens;if(a.usage.total&&a.usage.total.tokens!==void 0)return a.usage.total.tokens}return 0}else{if(y.preset==="today")return((x=(t=a.usage)==null?void 0:t.daily)==null?void 0:x.tokens)||0;if(y.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].tokens!==void 0?a.usage["7days"].tokens:0;if(y.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].tokens!==void 0)return a.usage["30days"].tokens;if(a.usage.monthly&&a.usage.monthly.tokens!==void 0)return a.usage.monthly.tokens;if(a.usage.total&&a.usage.total.tokens!==void 0)return a.usage.total.tokens}return 0}else return y.preset==="all"?a.usage&&a.usage.all&&a.usage.all.tokens!==void 0?a.usage.all.tokens:((v=(r=a.usage)==null?void 0:r.total)==null?void 0:v.tokens)||0:((M=(R=a.usage)==null?void 0:R.total)==null?void 0:M.tokens)||0}},Es=a=>{var t,x,r,v,R,M;if(y.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.inputTokens!==void 0)return a.usage.custom.inputTokens;if(a.usage.total&&a.usage.total.inputTokens!==void 0)return a.usage.total.inputTokens}return 0}else{if(y.preset==="today")return((x=(t=a.usage)==null?void 0:t.daily)==null?void 0:x.inputTokens)||0;if(y.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].inputTokens!==void 0?a.usage["7days"].inputTokens:0;if(y.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].inputTokens!==void 0)return a.usage["30days"].inputTokens;if(a.usage.monthly&&a.usage.monthly.inputTokens!==void 0)return a.usage.monthly.inputTokens;if(a.usage.total&&a.usage.total.inputTokens!==void 0)return a.usage.total.inputTokens}return 0}else return y.preset==="all"?a.usage&&a.usage.all&&a.usage.all.inputTokens!==void 0?a.usage.all.inputTokens:((v=(r=a.usage)==null?void 0:r.total)==null?void 0:v.inputTokens)||0:((M=(R=a.usage)==null?void 0:R.total)==null?void 0:M.inputTokens)||0}},Os=a=>{var t,x,r,v,R,M;if(y.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.outputTokens!==void 0)return a.usage.custom.outputTokens;if(a.usage.total&&a.usage.total.outputTokens!==void 0)return a.usage.total.outputTokens}return 0}else{if(y.preset==="today")return((x=(t=a.usage)==null?void 0:t.daily)==null?void 0:x.outputTokens)||0;if(y.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].outputTokens!==void 0?a.usage["7days"].outputTokens:0;if(y.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].outputTokens!==void 0)return a.usage["30days"].outputTokens;if(a.usage.monthly&&a.usage.monthly.outputTokens!==void 0)return a.usage.monthly.outputTokens;if(a.usage.total&&a.usage.total.outputTokens!==void 0)return a.usage.total.outputTokens}return 0}else return y.preset==="all"?a.usage&&a.usage.all&&a.usage.all.outputTokens!==void 0?a.usage.all.outputTokens:((v=(r=a.usage)==null?void 0:r.total)==null?void 0:v.outputTokens)||0:((M=(R=a.usage)==null?void 0:R.total)==null?void 0:M.outputTokens)||0}},js=a=>{if(!u.value[a.id])return Ms(a);const t=u.value[a.id]||[];let x=0;return t.forEach(r=>{if(r.cost!==void 0)x+=r.cost;else if(r.formatted&&r.formatted.total){const v=r.formatted.total.replace("$","").replace(",",""),R=parseFloat(v);isNaN(R)||(x+=R)}}),x},Gs=a=>{if(os(a),$.value==="cost"){if(a==="custom")return;const t=oe.value[a];(!t||t.status!=="ready")&&($.value="createdAt",J.value="desc",V("当前时间范围的费用排序索引未就绪,已切换到默认排序","info"))}},os=a=>{if(y.preset=a,a==="custom"){if(y.type="custom",!y.customRange){const t=new Date,x=new Date(t);x.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";y.customRange=[r(x),r(t)],y.customStart=x.toISOString().split("T")[0],y.customEnd=t.toISOString().split("T")[0]}}else if(a==="all")y.type="preset",y.customStart=null,y.customEnd=null;else{y.type="preset";const t=new Date,x=new Date(t);a==="today"?x.setHours(0,0,0,0):a==="7days"?x.setDate(t.getDate()-6):a==="30days"&&x.setDate(t.getDate()-29),y.customStart=x.toISOString().split("T")[0],y.customEnd=t.toISOString().split("T")[0]}Ce()},zs=a=>{a&&a.length===2?(y.type="custom",y.preset="custom",y.customRange=a,y.customStart=a[0].split(" ")[0],y.customEnd=a[1].split(" ")[0],Ce()):a===null&&os("today")},ls=a=>{const t=new Date;new Date(t).setHours(0,0,0,0),n.value[a]={type:"preset",preset:"today",customStart:t.toISOString().split("T")[0],customEnd:t.toISOString().split("T")[0],customRange:null,presetOptions:[{value:"today",label:"今日",days:1},{value:"7days",label:"7天",days:7},{value:"30days",label:"30天",days:30},{value:"custom",label:"自定义",days:-1}]}},Oe=a=>(n.value[a]||ls(a),n.value[a]),ns=(a,t)=>{const x=Oe(t);x.type="preset",x.preset=a;const r=x.presetOptions.find(v=>v.value===a);if(r)if(a==="custom"){if(x.type="custom",!x.customRange){const v=new Date,R=new Date(v);R.setDate(v.getDate()-6);const M=U=>U.getFullYear()+"-"+String(U.getMonth()+1).padStart(2,"0")+"-"+String(U.getDate()).padStart(2,"0")+" 00:00:00";x.customRange=[M(R),M(v)],x.customStart=R.toISOString().split("T")[0],x.customEnd=v.toISOString().split("T")[0]}}else{const v=new Date,R=new Date(v);R.setDate(v.getDate()-(r.days-1)),x.customStart=R.toISOString().split("T")[0],x.customEnd=v.toISOString().split("T")[0];const M=U=>U.getFullYear()+"-"+String(U.getMonth()+1).padStart(2,"0")+"-"+String(U.getDate()).padStart(2,"0")+" 00:00:00";x.customRange=[M(R),M(v)]}vt(t,!0)},qs=(a,t)=>{const x=Oe(a);t&&t.length===2?(x.type="custom",x.preset="custom",x.customRange=t,x.customStart=t[0].split(" ")[0],x.customEnd=t[1].split(" ")[0],vt(a,!0)):t===null&&ns("7days",a)},is=a=>a>new Date,Fs=a=>{const t=Oe(a);t.type="preset",t.preset="today";const x=new Date;new Date(x).setHours(0,0,0,0),t.customStart=x.toISOString().split("T")[0],t.customEnd=x.toISOString().split("T")[0],t.customRange=null,vt(a,!0),V("已重置筛选条件并刷新数据","info")},Ws=()=>{Xe.value=!0,f.value||xt()},Dt=a=>{Ft.value=a,ct.value=!0,f.value||xt()},_t=a=>{Wt.value=a,gt.value=!0},Bs=a=>{Xe.value=!1,Bt.value=a,It.value=!0,Ce()},Ns=a=>{Xe.value=!1,Nt.value=a,Kt.value=!0,Ce()},Hs=()=>{if(A.value.length===0){V("请先选择要编辑的 API Keys","warning");return}pt.value=!0,f.value||xt()},Ys=()=>{pt.value=!1,A.value=[],Pe(),Ce()},Qs=()=>{ct.value=!1,V("API Key 更新成功","success"),Ce()},Js=()=>{gt.value=!1,V("API Key 续期成功","success"),Ce()},Xs=a=>{const t=[{key:"edit",label:"编辑",icon:"fa-edit",color:"blue",handler:()=>Dt(a)}];return a.expiresAt&&(tt(a.expiresAt)||st(a.expiresAt))&&t.push({key:"renew",label:"续期",icon:"fa-clock",color:"green",handler:()=>_t(a)}),t.push({key:"toggle",label:a.isActive?"禁用":"激活",icon:a.isActive?"fa-ban":"fa-check-circle",color:a.isActive?"orange":"green",handler:()=>Tt(a)}),t.push({key:"delete",label:"删除",icon:"fa-trash",color:"red",handler:()=>St(a.id)}),t},Tt=async a=>{let t=!0;if(a.isActive&&(window.showConfirm?t=await window.showConfirm("禁用 API Key",`确定要禁用 API Key "${a.name}" 吗?禁用后所有使用此 Key 的请求将返回 401 错误。`,"确定禁用","取消"):t=confirm(`确定要禁用 API Key "${a.name}" 吗?禁用后所有使用此 Key 的请求将返回 401 错误。`)),!!t)try{const x=await E.put(`/admin/api-keys/${a.id}`,{isActive:!a.isActive});if(x.success){V(`API Key 已${a.isActive?"禁用":"激活"}`,"success");const r=G.value.find(v=>v.id===a.id);r&&(r.isActive=!a.isActive)}else V(x.message||"操作失败","error")}catch{V("操作失败","error")}},St=async a=>{let t=!1;if(window.showConfirm?t=await window.showConfirm("删除 API Key","确定要删除这个 API Key 吗?此操作不可恢复。","确定删除","取消"):t=confirm("确定要删除这个 API Key 吗?此操作不可恢复。"),!!t)try{const x=await E.delete(`/admin/api-keys/${a}`);if(x.success){V("API Key 已删除","success");const r=A.value.indexOf(a);r>-1&&A.value.splice(r,1),Pe(),Ce()}else V(x.message||"删除失败","error")}catch{V("删除失败","error")}},Zs=async a=>{var x,r;let t=!1;if(window.showConfirm?t=await window.showConfirm("恢复 API Key","确定要恢复这个 API Key 吗?恢复后可以重新使用。","确定恢复","取消"):t=confirm("确定要恢复这个 API Key 吗?恢复后可以重新使用。"),!!t)try{const v=await E.post(`/admin/api-keys/${a}/restore`);v.success?(V("API Key 已成功恢复","success"),await ft(),await Ce()):V(v.error||"恢复失败","error")}catch(v){V(((r=(x=v.response)==null?void 0:x.data)==null?void 0:r.error)||"恢复失败","error")}},ea=async a=>{var x,r;let t=!1;if(window.showConfirm?t=await window.showConfirm("彻底删除 API Key","确定要彻底删除这个 API Key 吗?此操作不可恢复,所有相关数据将被永久删除。","确定彻底删除","取消"):t=confirm("确定要彻底删除这个 API Key 吗?此操作不可恢复,所有相关数据将被永久删除。"),!!t)try{const v=await E.delete(`/admin/api-keys/${a}/permanent`);v.success?(V("API Key 已彻底删除","success"),ft()):V(v.error||"彻底删除失败","error")}catch(v){V(((r=(x=v.response)==null?void 0:x.data)==null?void 0:r.error)||"彻底删除失败","error")}},ta=async()=>{var x,r;const a=F.value.length;if(a===0){V("没有需要清空的 API Keys","info");return}let t=!1;if(window.showConfirm?t=await window.showConfirm("清空所有已删除的 API Keys",`确定要彻底删除全部 ${a} 个已删除的 API Keys 吗?此操作不可恢复,所有相关数据将被永久删除。`,"确定清空全部","取消"):t=confirm(`确定要彻底删除全部 ${a} 个已删除的 API Keys 吗?此操作不可恢复。`),!!t)try{const v=await E.delete("/admin/api-keys/deleted/clear-all");v.success?(V(v.message||"已清空所有已删除的 API Keys","success"),v.details&&v.details.failedCount>0&&V(`${v.details.failedCount} 个清空失败`,"warning"),ft()):V(v.error||"清空失败","error")}catch(v){V(((r=(x=v.response)==null?void 0:x.data)==null?void 0:r.error)||"清空失败","error")}},sa=async()=>{const a=A.value.length;if(a===0){V("请先选择要删除的 API Keys","warning");return}let t=!1;const x=`确定要删除选中的 ${a} 个 API Key 吗?此操作不可恢复。`;if(window.showConfirm?t=await window.showConfirm("批量删除 API Keys",x,"确定删除","取消"):t=confirm(x),!t)return;const r=[...A.value];try{const v=await E.delete("/admin/api-keys/batch",{data:{keyIds:r}});if(v.success){const{successCount:R,failedCount:M,errors:U}=v.data;if(R>0){if(V(`成功删除 ${R} 个 API Keys`,"success"),M>0){const ae=U.map(ie=>`${ie.keyId}: ${ie.error}`).join(`
|
||
`);V(`${M} 个删除失败:
|
||
${ae}`,"warning")}}else V("所有 API Keys 删除失败","error");A.value=[],Pe(),Ce()}else V(v.message||"批量删除失败","error")}catch{V("批量删除失败","error")}},aa=()=>{if(B.value)We.value.forEach(a=>{A.value.includes(a.id)||A.value.push(a.id)});else{const a=new Set(We.value.map(t=>t.id));A.value=A.value.filter(t=>!a.has(t))}Pe()},Pe=()=>{const a=We.value.length,t=We.value.filter(x=>A.value.includes(x.id)).length;t===0?(B.value=!1,T.value=!1):t===a?(B.value=!0,T.value=!1):(B.value=!1,T.value=!0)},at=a=>{se.value=a},ds=()=>{se.value=null},ra=async({keyId:a,expiresAt:t,activateNow:x})=>{try{const r=await E.patch(`/admin/api-keys/${a}/expiration`,{expiresAt:t||null,activateNow:x||!1});if(r.success){V(x?"API Key已激活":"过期时间已更新","success");const v=G.value.find(R=>R.id===a);v&&(x&&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))),ds()}else V(r.message||"更新失败","error"),pe.value&&pe.value.resetSaving()}catch{V("更新失败","error"),pe.value&&pe.value.resetSaving()}},je=a=>a?new Date(a).toLocaleDateString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).replace(/\//g,"-"):"",us=a=>{if(a==null)return"--:--";const t=Math.floor(a/3600),x=Math.floor(a%3600/60),r=a%60;return t>0?`${t}h${x}m`:x>0?`${x}m${r}s`:`${r}s`},kt=a=>{var r,v,R,M,U,ae,ie,b,z,de,we,ee,ce,At,Me;const t=fe(a.id),x={...a,dailyCost:(t==null?void 0:t.dailyCost)??a.dailyCost??0,currentWindowCost:(t==null?void 0:t.currentWindowCost)??a.currentWindowCost??0,windowRemainingSeconds:(t==null?void 0:t.windowRemainingSeconds)??a.windowRemainingSeconds,windowStartTime:(t==null?void 0:t.windowStartTime)??a.windowStartTime??null,windowEndTime:(t==null?void 0:t.windowEndTime)??a.windowEndTime??null,usage:{...a.usage,total:{...(r=a.usage)==null?void 0:r.total,requests:(t==null?void 0:t.requests)??((R=(v=a.usage)==null?void 0:v.total)==null?void 0:R.requests)??0,tokens:(t==null?void 0:t.tokens)??((U=(M=a.usage)==null?void 0:M.total)==null?void 0:U.tokens)??0,cost:(t==null?void 0:t.allTimeCost)??((ie=(ae=a.usage)==null?void 0:ae.total)==null?void 0:ie.cost)??0,inputTokens:(t==null?void 0:t.inputTokens)??((z=(b=a.usage)==null?void 0:b.total)==null?void 0:z.inputTokens)??0,outputTokens:(t==null?void 0:t.outputTokens)??((we=(de=a.usage)==null?void 0:de.total)==null?void 0:we.outputTokens)??0,cacheCreateTokens:(t==null?void 0:t.cacheCreateTokens)??((ce=(ee=a.usage)==null?void 0:ee.total)==null?void 0:ce.cacheCreateTokens)??0,cacheReadTokens:(t==null?void 0:t.cacheReadTokens)??((Me=(At=a.usage)==null?void 0:At.total)==null?void 0:Me.cacheReadTokens)??0}}};Ae.value=x,xe.value=!0},oa=a=>{var x;const t=a||((x=Ae.value)==null?void 0:x.id);t&&(xe.value=!1,N.push(`/api-keys/${t}/usage-records`))},Ut=a=>{if(!a)return"从未使用";const t=new Date(a),r=new Date-t;return r<6e4?"刚刚":r<36e5?`${Math.floor(r/6e4)} 分钟前`:r<864e5?`${Math.floor(r/36e5)} 小时前`:r<6048e5?`${Math.floor(r/864e5)} 天前`:t.toLocaleDateString("zh-CN")},Pt={claude:"Claude",openai:"OpenAI",gemini:"Gemini",droid:"Droid",deleted:"已删除",other:"其他"},la=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,cs=a=>{if(!a)return"other";const t=String(a).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"},wt=a=>{if(!a)return null;const t=_s(a.id);return t!==null?t:a.lastUsage||null},Rt=a=>{if(yt(a==null?void 0:a.id))return!1;const t=wt(a);return!!(t&&(t.accountName||t.accountId||t.rawAccountId))},Mt=a=>{if(!a)return!1;if(a.accountCategory==="deleted")return!0;const t=typeof a.rawAccountId=="string"?a.rawAccountId.trim():"",x=typeof a.accountName=="string"?a.accountName.trim():"",r=typeof a.accountType=="string"?a.accountType.trim().toLowerCase():"";if(!t)return!1;const v=la.test(t),R=!x||x===t,M=cs(r);return v&&R&&(!r||r==="unknown"||M==="other")},na=a=>a?Mt(a)?"已删除":a.accountName||a.accountId||a.rawAccountId||"未知账号":"未知账号",rt=a=>na(wt(a)),Vt=a=>{const t=rt(a);return t.length>ks?`${t.slice(0,ks)}...`:t},ht=a=>{const t=wt(a);if(Mt(t))return Pt.deleted;const x=(t==null?void 0:t.accountCategory)||cs(t==null?void 0:t.accountType);return Pt[x]||Pt.other},Et=a=>{const t=wt(a);return Mt(t)},ia=()=>{X.value="",ke.value=1},da=()=>{try{const a=mt.value.map(b=>{var gs,ps,ms,xs,ys,fs,bs,vs;const z=Rs(b),de=js(b),we=Vs(b),ee=Es(b),ce=Os(b),At={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?je(b.activatedAt):"",过期时间:b.expiresAt?je(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?je(b.createdAt):"",创建者:b.createdBy||"",用户ID:b.userId||"",用户名:b.userUsername||"",标签:b.tags&&b.tags.length>0?b.tags.join(", "):"无",请求总数:z,"总费用($)":de.toFixed(2),Token数:De(we),输入Token:De(ee),输出Token:De(ce),最后使用时间:b.lastUsedAt?je(b.lastUsedAt):"从未使用",最后使用账号:rt(b),最后使用类型:ht(b)},Me={};let He=null;return y.preset==="today"?He=(ps=(gs=b.usage)==null?void 0:gs.daily)==null?void 0:ps.models:y.preset==="7days"?He=(xs=(ms=b.usage)==null?void 0:ms.weekly)==null?void 0:xs.models:y.preset==="30days"?He=(fs=(ys=b.usage)==null?void 0:ys.monthly)==null?void 0:fs.models:y.preset==="all"&&(He=(vs=(bs=b.usage)==null?void 0:bs.total)==null?void 0:vs.models),He&&Object.entries(He).forEach(([jt,ot])=>{let Ge=jt;jt.includes(":")&&(Ge=jt.split(":").pop()),Ge=Ge.replace(/[:/]/g,"_"),Me[`${Ge}_请求数`]=ot.requests||0,Me[`${Ge}_费用($)`]=(ot.cost||0).toFixed(2),Me[`${Ge}_Token`]=De(ot.totalTokens||0),Me[`${Ge}_输入Token`]=De(ot.inputTokens||0),Me[`${Ge}_输出Token`]=De(ot.outputTokens||0)}),{...At,...Me}}),t=Fe.utils.book_new(),x=Fe.utils.json_to_sheet(a),r=Fe.utils.decode_range(x["!ref"]),v=Object.keys(a[0]||{}),R=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});x["!cols"]=R;for(let b=r.s.c;b<=r.e.c;++b){const z=Fe.utils.encode_cell({r:0,c:b});if(!x[z])continue;const de=v[b],we=de&&de.includes("_");x[z].s={fill:{fgColor:{rgb:we?"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=Fe.utils.encode_cell({r:b,c:z});if(!x[de])continue;const we=v[z],ee=x[de].v,ce={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&&(ce.fill={fgColor:{rgb:"F2F2F2"}}),we==="名称"?ce.alignment={horizontal:"left",vertical:"center"}:we==="标签"?(ce.alignment={horizontal:"left",vertical:"center"},ee==="无"&&(ce.font={...ce.font,color:{rgb:"999999"},italic:!0})):we==="最后使用时间"?(ce.alignment={horizontal:"right",vertical:"center"},ee==="从未使用"&&(ce.font={...ce.font,color:{rgb:"999999"},italic:!0})):we&&we.includes("费用")?(ce.alignment={horizontal:"right",vertical:"center"},ce.font={...ce.font,color:{rgb:"0066CC"},bold:!0}):we&&(we.includes("Token")||we.includes("请求"))&&(ce.alignment={horizontal:"right",vertical:"center"}),x[de].s=ce}Fe.utils.book_append_sheet(t,x,"用量统计");const M=new Date,U=M.getFullYear()+String(M.getMonth()+1).padStart(2,"0")+String(M.getDate()).padStart(2,"0")+"_"+String(M.getHours()).padStart(2,"0")+String(M.getMinutes()).padStart(2,"0")+String(M.getSeconds()).padStart(2,"0");let ae="";y.type==="preset"?ae={today:"今日","7days":"最近7天","30days":"最近30天",all:"全部时间"}[y.preset]||y.preset:ae="自定义时间";const ie=`API_Keys_用量统计_${ae}_${U}.xlsx`;Fe.writeFile(t,ie),V(`成功导出 ${a.length} 条API Key用量数据`,"success")}catch{V("导出失败,请重试","error")}};Se([me,O],()=>{ke.value=1,A.value=[],Pe()});let Ot=null;return Se(X,()=>{Ot&&clearTimeout(Ot),Ot=setTimeout(()=>{ke.value=1,Ce(!1)},300)}),Se(Ie,()=>{ke.value=1,Ce(!1)}),Se(me,()=>{ke.value=1,Ce(!1)}),Se(Y,()=>{ke.value=1,Ce(!1)}),Se([$,J],()=>{Ce(!1)}),Se([ke,Je],([a,t],[x,r])=>{(a!==x||t!==r)&&Ce(!1),Pe()}),Se(Je,a=>{localStorage.setItem("apiKeysPageSize",a.toString())}),Se(G,()=>{const a=new Set(G.value.map(t=>t.id));A.value=A.value.filter(t=>a.has(t)),Pe()}),ut(async()=>{Qt(),await Promise.all([p.loadSupportedClients(),Ce(),Ks()]),Pe(),xt()}),hs(()=>{Ne&&(clearTimeout(Ne),Ne=null)}),(a,t)=>{const x=ua;return l(),d("div",r0,[e("div",o0,[e("div",l0,[t[156]||(t[156]=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",n0,[e("nav",i0,[e("button",{class:j(["whitespace-nowrap border-b-2 px-1 py-2 text-sm font-medium",_.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=>_.value="active")},[t[30]||(t[30]=h(" 活跃 API Keys ",-1)),G.value.length>0?(l(),d("span",d0,g(G.value.length),1)):w("",!0)],2),e("button",{class:j(["whitespace-nowrap border-b-2 px-1 py-2 text-sm font-medium",_.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:ft},[t[31]||(t[31]=h(" 已删除 API Keys ",-1)),F.value.length>0?(l(),d("span",u0,g(F.value.length),1)):w("",!0)],2)])]),_.value==="active"?(l(),d("div",c0,[e("div",g0,[e("div",p0,[e("div",m0,[t[32]||(t[32]=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)),re($t,{modelValue:y.preset,"onUpdate:modelValue":t[1]||(t[1]=r=>y.preset=r),icon:"fa-calendar-alt","icon-color":"text-blue-500",options:q.value,placeholder:"选择时间范围",onChange:Gs},null,8,["modelValue","options"])]),y.type==="custom"?(l(),d("div",x0,[re(x,{class:"api-key-date-picker custom-date-range-picker",clearable:!0,"default-time":m.value,"disabled-date":is,"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","model-value":y.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":zs},null,8,["default-time","model-value"])])):w("",!0),e("div",y0,[t[33]||(t[33]=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",f0,[re($t,{modelValue:me.value,"onUpdate:modelValue":t[2]||(t[2]=r=>me.value=r),icon:"fa-tags","icon-color":"text-purple-500",options:le.value,placeholder:"所有标签"},null,8,["modelValue","options"]),me.value?(l(),d("span",b0,g(As.value),1)):w("",!0)])]),e("div",v0,[t[34]||(t[34]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-orange-500 to-amber-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),e("div",k0,[re($t,{modelValue:Y.value,"onUpdate:modelValue":t[3]||(t[3]=r=>Y.value=r),icon:"fa-cube","icon-color":"text-orange-500",multiple:!0,options:Re.value,placeholder:"所有模型"},null,8,["modelValue","options"]),Y.value.length>0?(l(),d("span",w0,g(Y.value.length),1)):w("",!0)])]),e("div",h0,[e("div",A0,[re($t,{modelValue:Ie.value,"onUpdate:modelValue":t[4]||(t[4]=r=>Ie.value=r),icon:"fa-filter","icon-color":"text-cyan-500",options:Qe.value,placeholder:"选择搜索类型"},null,8,["modelValue","options"])]),e("div",$0,[t[37]||(t[37]=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",C0,[D(e("input",{"onUpdate:modelValue":t[5]||(t[5]=r=>X.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:Ie.value==="bindingAccount"?"搜索所属账号...":L.value?"搜索名称或所有者...":"搜索名称...",type:"text"},null,8,I0),[[te,X.value]]),t[36]||(t[36]=e("i",{class:"fas fa-search absolute left-3 text-sm text-cyan-500"},null,-1)),X.value?(l(),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:ia},t[35]||(t[35]=[e("i",{class:"fas fa-times text-xs"},null,-1)]))):w("",!0)])])])]),e("div",K0,[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:H.value,onClick:t[6]||(t[6]=r=>Ce())},[t[38]||(t[38]=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:j(["fas relative text-green-500",H.value?"fa-spinner fa-spin":"fa-sync-alt"])},null,2),t[39]||(t[39]=e("span",{class:"relative"},"刷新",-1))],8,L0),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:s},[e("i",{class:j(Q.value?"fas fa-times":"fas fa-check-square")},null,2),e("span",null,g(Q.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:da},t[40]||(t[40]=[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)])),A.value.length>0?(l(),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[7]||(t[7]=r=>Hs())},[t[41]||(t[41]=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[42]||(t[42]=e("i",{class:"fas fa-edit relative text-blue-600 dark:text-blue-400"},null,-1)),e("span",D0,"编辑选中 ("+g(A.value.length)+")",1)])):w("",!0),A.value.length>0?(l(),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[8]||(t[8]=r=>sa())},[t[43]||(t[43]=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[44]||(t[44]=e("i",{class:"fas fa-trash relative text-red-600 dark:text-red-400"},null,-1)),e("span",_0,"删除选中 ("+g(A.value.length)+")",1)])):w("",!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:Te(Ws,["stop"])},t[45]||(t[45]=[e("i",{class:"fas fa-plus"},null,-1),e("span",null,"创建新 Key",-1)]))])]),H.value?(l(),d("div",T0,t[46]||(t[46]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载 API Keys...",-1)]))):G.value.length===0?(l(),d("div",S0,t[47]||(t[47]=[e("div",{class:"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-700"},[e("i",{class:"fas fa-key text-xl text-gray-400"})],-1),e("p",{class:"text-lg text-gray-500 dark:text-gray-400"},"暂无 API Keys",-1),e("p",{class:"mt-2 text-sm text-gray-400"},"点击上方按钮创建您的第一个 API Key",-1)]))):(l(),d("div",U0,[e("div",P0,[e("table",R0,[e("thead",M0,[e("tr",null,[S.value?(l(),d("th",V0,[e("div",E0,[D(e("input",{"onUpdate:modelValue":t[9]||(t[9]=r=>B.value=r),class:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",indeterminate:T.value,type:"checkbox",onChange:aa},null,40,O0),[[be,B.value]])])])):w("",!0),e("th",{class:j(["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",S.value?"left-[50px]":"left-0"]),onClick:t[10]||(t[10]=r=>Be("name"))},[t[48]||(t[48]=h(" 名称 ",-1)),$.value==="name"?(l(),d("i",{key:0,class:j(["fas",J.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),d("i",j0))],2),t[54]||(t[54]=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[55]||(t[55]=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[11]||(t[11]=r=>Be("status"))},[t[49]||(t[49]=h(" 状态 ",-1)),$.value==="status"?(l(),d("i",{key:0,class:j(["fas",J.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),d("i",G0))]),e("th",{class:j(["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":bt.value,"cursor-not-allowed opacity-60":!bt.value}]),title:Ts.value,onClick:t[12]||(t[12]=r=>Be("cost"))},[t[50]||(t[50]=h(" 费用 ",-1)),$.value==="cost"?(l(),d("i",{key:0,class:j(["fas",J.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):bt.value?(l(),d("i",q0)):(l(),d("i",F0))],10,z0),t[56]||(t[56]=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[57]||(t[57]=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[58]||(t[58]=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[13]||(t[13]=r=>Be("lastUsedAt"))},[t[51]||(t[51]=h(" 最后使用 ",-1)),$.value==="lastUsedAt"?(l(),d("i",{key:0,class:j(["fas",J.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),d("i",W0))]),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=>Be("createdAt"))},[t[52]||(t[52]=h(" 创建时间 ",-1)),$.value==="createdAt"?(l(),d("i",{key:0,class:j(["fas",J.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),d("i",B0))]),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[15]||(t[15]=r=>Be("expiresAt"))},[t[53]||(t[53]=h(" 过期时间 ",-1)),$.value==="expiresAt"?(l(),d("i",{key:0,class:j(["fas",J.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(l(),d("i",N0))]),t[59]||(t[59]=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,[(l(!0),d(Z,null,ne(We.value,(r,v)=>{var R,M,U,ae,ie,b;return l(),d(Z,{key:r.id},[e("tr",{class:j(["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"])},[S.value?(l(),d("td",H0,[e("div",Y0,[D(e("input",{"onUpdate:modelValue":t[16]||(t[16]=z=>A.value=z),class:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",type:"checkbox",value:r.id,onChange:Pe},null,40,Q0),[[be,A.value]])])])):w("",!0),e("td",{class:j(["name-column sticky z-10 px-3 py-3",S.value?"left-[50px]":"left-0"])},[e("div",J0,[e("div",{class:"truncate text-sm font-semibold text-gray-900 dark:text-gray-100",title:r.name},g(r.name),9,X0),L.value&&r.ownerDisplayName?(l(),d("div",Z0,[t[60]||(t[60]=e("i",{class:"fas fa-user mr-1"},null,-1)),h(" "+g(r.ownerDisplayName),1)])):w("",!0)])],2),e("td",eu,[e("div",tu,[o.value&&Us(r)?(l(),d("div",su,t[61]||(t[61]=[e("i",{class:"fas fa-spinner fa-spin mr-1"},null,-1),h(" 加载中... ",-1)]))):(l(),d(Z,{key:1},[r.claudeAccountId||r.claudeConsoleAccountId?(l(),d("div",au,[t[62]||(t[62]=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]"}),h(" Claude ")],-1)),e("span",ru,g(Jt(r)),1)])):w("",!0),r.geminiAccountId?(l(),d("div",ou,[t[63]||(t[63]=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]"}),h(" Gemini ")],-1)),e("span",lu,g(Xt(r)),1)])):w("",!0),r.openaiAccountId?(l(),d("div",nu,[t[64]||(t[64]=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]"}),h(" OpenAI ")],-1)),e("span",iu,g(Zt(r)),1)])):w("",!0),r.bedrockAccountId?(l(),d("div",du,[t[65]||(t[65]=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]"}),h(" Bedrock ")],-1)),e("span",uu,g(es(r)),1)])):w("",!0),r.droidAccountId?(l(),d("div",cu,[t[66]||(t[66]=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]"}),h(" Droid ")],-1)),e("span",gu,g(ts(r)),1)])):w("",!0),!r.claudeAccountId&&!r.claudeConsoleAccountId&&!r.geminiAccountId&&!r.openaiAccountId&&!r.bedrockAccountId&&!r.droidAccountId?(l(),d("div",pu,t[67]||(t[67]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),h(" 共享池 ",-1)]))):w("",!0)],64))])]),e("td",mu,[e("div",xu,[(l(!0),d(Z,null,ne(r.tags||[],z=>(l(),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"},g(z),1))),128)),!r.tags||r.tags.length===0?(l(),d("span",yu,"无标签")):w("",!0)])]),e("td",fu,[e("span",{class:j(["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:j(["mr-2 h-2 w-2 rounded-full",r.isActive?"bg-green-500":"bg-red-500"])},null,2),h(" "+g(r.isActive?"活跃":"禁用"),1)],2)]),e("td",bu,[qe(r.id)?(l(),d("div",vu,t[68]||(t[68]=[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)?(l(),d("span",ku,g(fe(r.id).formattedCost||"$0.00"),1)):(l(),d("span",wu,"-"))]),e("td",hu,[e("div",Au,[qe(r.id)&&(r.dailyCostLimit>0||r.totalCostLimit>0||r.rateLimitWindow>0&&r.rateLimitCost>0)?(l(),d("div",$u,t[69]||(t[69]=[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)]))):(l(),d(Z,{key:1},[r.dailyCostLimit>0?(l(),he(Ve,{key:0,current:((R=fe(r.id))==null?void 0:R.dailyCost)||0,label:"每日限制",limit:r.dailyCostLimit,type:"daily",variant:"compact"},null,8,["current","limit"])):r.totalCostLimit>0?(l(),he(Ve,{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)?(l(),d("div",Cu,[re(Ve,{current:((U=fe(r.id))==null?void 0:U.currentWindowCost)||0,label:"窗口费用",limit:r.rateLimitCost,type:"window",variant:"compact"},null,8,["current","limit"]),e("div",Iu,[e("div",Ku,[t[70]||(t[70]=e("i",{class:"fas fa-clock text-[10px]"},null,-1)),e("span",Lu,g(r.rateLimitWindow)+"分钟窗口",1)]),e("span",{class:j(["font-bold",(((ae=fe(r.id))==null?void 0:ae.windowRemainingSeconds)||0)>0?"text-sky-700 dark:text-sky-300":"text-gray-400 dark:text-gray-500"])},g((((ie=fe(r.id))==null?void 0:ie.windowRemainingSeconds)||0)>0?us(((b=fe(r.id))==null?void 0:b.windowRemainingSeconds)||0):"未激活"),3)])])):(l(),d("div",Du,t[71]||(t[71]=[e("i",{class:"fas fa-infinity text-base"},null,-1),e("span",{class:"text-xs font-medium"},"无限制",-1)])))],64))])]),e("td",_u,[qe(r.id)?(l(),d("div",Tu,t[72]||(t[72]=[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)?(l(),d("div",Su,[e("span",Uu,g(De(fe(r.id).tokens||0)),1)])):(l(),d("span",Pu,"-"))]),e("td",Ru,[qe(r.id)?(l(),d("div",Mu,t[73]||(t[73]=[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)?(l(),d("div",Vu,[e("span",Eu,g(Lt(fe(r.id).requests||0)),1),t[74]||(t[74]=e("span",{class:"text-xs text-gray-500"},"次",-1))])):(l(),d("span",Ou,"-"))]),e("td",ju,[e("div",Gu,[r.lastUsedAt?(l(),d("span",{key:0,class:"cursor-help",style:{"font-size":"13px"},title:new Date(r.lastUsedAt).toLocaleString("zh-CN")},g(Ut(r.lastUsedAt)),9,zu)):(l(),d("span",qu,"从未使用")),r.lastUsedAt&&yt(r.id)?(l(),d("span",Fu,t[75]||(t[75]=[e("i",{class:"fas fa-spinner fa-spin mr-1"},null,-1),h(" 加载中... ",-1)]))):Rt(r)?(l(),d("span",{key:3,class:"mt-1 text-xs text-gray-500 dark:text-gray-400",title:rt(r)},[h(g(Vt(r))+" ",1),Et(r)?w("",!0):(l(),d("span",Bu," ("+g(ht(r))+") ",1))],8,Wu)):(l(),d("span",Nu," 暂无使用账号 "))])]),e("td",Hu,g(new Date(r.createdAt).toLocaleDateString()),1),e("td",Yu,[e("div",Qu,[r.expirationMode==="activation"&&!r.isActivated?(l(),d("span",Ju,[t[76]||(t[76]=e("i",{class:"fas fa-pause-circle mr-1 text-xs"},null,-1)),h(" 未激活 ( "+g(r.activationDays||(r.activationUnit==="hours"?24:30))+g(r.activationUnit==="hours"?"小时":"天")+") ",1)])):r.expiresAt?(l(),d("span",Xu,[tt(r.expiresAt)?(l(),d("span",{key:0,class:"inline-flex cursor-pointer items-center text-red-600 hover:underline",style:{"font-size":"13px"},onClick:Te(z=>at(r),["stop"])},t[77]||(t[77]=[e("i",{class:"fas fa-exclamation-circle mr-1 text-xs"},null,-1),h(" 已过期 ",-1)]),8,Zu)):st(r.expiresAt)?(l(),d("span",{key:1,class:"inline-flex cursor-pointer items-center text-orange-600 hover:underline",style:{"font-size":"13px"},onClick:Te(z=>at(r),["stop"])},[t[78]||(t[78]=e("i",{class:"fas fa-clock mr-1 text-xs"},null,-1)),h(" "+g(ss(r.expiresAt)),1)],8,ec)):(l(),d("span",{key:2,class:"cursor-pointer text-gray-600 hover:underline dark:text-gray-400",style:{"font-size":"13px"},onClick:Te(z=>at(r),["stop"])},g(ss(r.expiresAt)),9,tc))])):(l(),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:Te(z=>at(r),["stop"])},t[79]||(t[79]=[e("i",{class:"fas fa-infinity mr-1 text-xs"},null,-1),h(" 永不过期 ",-1)]),8,sc))])]),e("td",ac,[e("div",rc,[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=>kt(r)},t[80]||(t[80]=[e("i",{class:"fas fa-chart-line"},null,-1),e("span",{class:"ml-1"},"详情",-1)]),8,oc),r&&r.id?(l(),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=>as(r.id)},[e("i",{class:j(["fas",ue.value[r.id]?"fa-chevron-up":"fa-chevron-down"])},null,2),t[81]||(t[81]=e("span",{class:"ml-1"},"模型",-1))],8,lc)):w("",!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=>Dt(r)},t[82]||(t[82]=[e("i",{class:"fas fa-edit"},null,-1),e("span",{class:"ml-1"},"编辑",-1)]),8,nc),r.expiresAt&&(tt(r.expiresAt)||st(r.expiresAt))?(l(),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=>_t(r)},t[83]||(t[83]=[e("i",{class:"fas fa-clock"},null,-1),e("span",{class:"ml-1"},"续期",-1)]),8,ic)):w("",!0),e("button",{class:j([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=>Tt(r)},[e("i",{class:j(["fas",r.isActive?"fa-ban":"fa-check-circle"])},null,2),e("span",uc,g(r.isActive?"禁用":"激活"),1)],10,dc),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=>St(r.id)},t[84]||(t[84]=[e("i",{class:"fas fa-trash"},null,-1),e("span",{class:"ml-1"},"删除",-1)]),8,cc)]),e("div",gc,[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=>kt(r)},t[85]||(t[85]=[e("i",{class:"fas fa-chart-line"},null,-1)]),8,pc),r&&r.id?(l(),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=>as(r.id)},[e("i",{class:j(["fas",ue.value[r.id]?"fa-chevron-up":"fa-chevron-down"])},null,2)],8,mc)):w("",!0),re(fa,{actions:Xs(r)},null,8,["actions"])])])],2),r&&r.id&&ue.value[r.id]?(l(),d("tr",xc,[e("td",yc,[u.value[r.id]?w("",!0):(l(),d("div",fc,t[86]||(t[86]=[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",bc,[e("div",vc,[t[87]||(t[87]=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"}),h(" 模型使用分布 ")],-1)),e("div",kc,[u.value[r.id]&&u.value[r.id].length>0?(l(),d("span",wc,g(u.value[r.id].length)+" 个模型 ",1)):w("",!0),e("div",hc,[e("div",Ac,[(l(!0),d(Z,null,ne(Oe(r.id).presetOptions,z=>(l(),d("button",{key:z.value,class:j(["rounded px-2 py-1 text-xs font-medium transition-colors",Oe(r.id).preset===z.value&&Oe(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=>ns(z.value,r.id)},g(z.label),11,$c))),128))]),re(x,{class:"api-key-date-picker",clearable:!0,"default-time":m.value,"disabled-date":is,"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","model-value":Oe(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=>qs(r.id,z)},null,8,["default-time","model-value","onUpdate:modelValue"])])])]),u.value[r.id]&&u.value[r.id].length===0?(l(),d("div",Cc,[e("div",Ic,[t[89]||(t[89]=e("i",{class:"fas fa-chart-line text-lg text-gray-400"},null,-1)),t[90]||(t[90]=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=>Fs(r.id)},t[88]||(t[88]=[e("i",{class:"fas fa-sync-alt text-xs"},null,-1),e("span",{class:"text-xs"},"刷新",-1)]),8,Kc)]),t[91]||(t[91]=e("p",{class:"text-xs text-gray-400"}," 尝试调整时间范围或点击刷新重新加载数据 ",-1))])):u.value[r.id]&&u.value[r.id].length>0?(l(),d("div",Lc,[(l(!0),d(Z,null,ne(u.value[r.id],z=>(l(),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",Dc,[e("div",_c,[e("span",Tc,g(z.model),1),e("span",Sc,g(z.requests)+" 次请求",1)])]),e("div",Uc,[e("div",Pc,[t[92]||(t[92]=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"}),h(" 总Token: ")],-1)),e("span",Rc,g(De(z.allTokens)),1)]),e("div",Mc,[t[93]||(t[93]=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"}),h(" 费用: ")],-1)),e("span",Vc,g(Ps(z)),1)]),e("div",Ec,[e("div",Oc,[t[94]||(t[94]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-down mr-1 text-green-500"}),h(" 输入: ")],-1)),e("span",jc,g(De(z.inputTokens)),1)]),e("div",Gc,[t[95]||(t[95]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-up mr-1 text-blue-500"}),h(" 输出: ")],-1)),e("span",zc,g(De(z.outputTokens)),1)]),z.cacheCreateTokens>0?(l(),d("div",qc,[t[96]||(t[96]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-save mr-1"}),h(" 缓存创建: ")],-1)),e("span",Fc,g(De(z.cacheCreateTokens)),1)])):w("",!0),z.cacheReadTokens>0?(l(),d("div",Wc,[t[97]||(t[97]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-download mr-1"}),h(" 缓存读取: ")],-1)),e("span",Bc,g(De(z.cacheReadTokens)),1)])):w("",!0)])]),e("div",Nc,[e("div",{class:"h-2 rounded-full bg-gradient-to-r from-indigo-500 to-purple-600 transition-all duration-500",style:Ct({width:rs(z.allTokens,u.value[r.id])+"%"})},null,4)]),e("div",Hc,[e("span",Yc,g(rs(z.allTokens,u.value[r.id]))+"% ",1)])]))),128))])):w("",!0),u.value[r.id]&&u.value[r.id].length>0?(l(),d("div",Qc,[e("div",Jc,[t[100]||(t[100]=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"}),h(" 总计统计 ")],-1)),e("div",Xc,[e("span",Zc,[t[98]||(t[98]=h(" 总请求: ",-1)),e("span",eg,g(u.value[r.id].reduce((z,de)=>z+de.requests,0)),1)]),e("span",tg,[t[99]||(t[99]=h(" 总Token: ",-1)),e("span",sg,g(De(u.value[r.id].reduce((z,de)=>z+de.allTokens,0))),1)])])])])):w("",!0)])])])):w("",!0)],64)}),128))])])])])),!H.value&&mt.value.length>0?(l(),d("div",ag,[(l(!0),d(Z,null,ne(We.value,r=>{var v,R,M,U,ae,ie;return l(),d("div",{key:r.id,class:"card p-4 transition-shadow hover:shadow-lg"},[e("div",rg,[e("div",og,[S.value?D((l(),d("input",{key:0,"onUpdate:modelValue":t[17]||(t[17]=b=>A.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:Pe},null,40,lg)),[[be,A.value]]):w("",!0),e("div",null,[e("h4",ng,g(r.name),1),e("p",ig,g(r.id),1)])]),e("span",{class:j(["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:j(["mr-1.5 h-1.5 w-1.5 rounded-full",r.isActive?"bg-green-500":"bg-red-500"])},null,2),h(" "+g(r.isActive?"活跃":"已停用"),1)],2)]),e("div",dg,[r.claudeAccountId||r.claudeConsoleAccountId?(l(),d("div",ug,[t[101]||(t[101]=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"}),h(" Claude ")],-1)),e("span",cg,g(Jt(r)),1)])):w("",!0),r.geminiAccountId?(l(),d("div",gg,[t[102]||(t[102]=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"}),h(" Gemini ")],-1)),e("span",pg,g(Xt(r)),1)])):w("",!0),r.openaiAccountId?(l(),d("div",mg,[t[103]||(t[103]=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"}),h(" OpenAI ")],-1)),e("span",xg,g(Zt(r)),1)])):w("",!0),r.bedrockAccountId?(l(),d("div",yg,[t[104]||(t[104]=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"}),h(" Bedrock ")],-1)),e("span",fg,g(es(r)),1)])):w("",!0),r.droidAccountId?(l(),d("div",bg,[t[105]||(t[105]=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"}),h(" Droid ")],-1)),e("span",vg,g(ts(r)),1)])):w("",!0),!r.claudeAccountId&&!r.claudeConsoleAccountId&&!r.geminiAccountId&&!r.openaiAccountId&&!r.bedrockAccountId&&!r.droidAccountId?(l(),d("div",kg,t[106]||(t[106]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),h(" 使用共享池 ",-1)]))):w("",!0),L.value&&r.ownerDisplayName?(l(),d("div",wg,[t[107]||(t[107]=e("i",{class:"fas fa-user mr-1"},null,-1)),h(" "+g(r.ownerDisplayName),1)])):w("",!0)]),e("div",hg,[e("div",Ag,[e("div",$g,[e("span",Cg,g(y.type==="custom"?"累计统计":"今日使用"),1),e("button",{class:"text-xs text-blue-600 hover:text-blue-800",onClick:b=>kt(r)},t[108]||(t[108]=[e("i",{class:"fas fa-chart-line mr-1"},null,-1),h("详情 ",-1)]),8,Ig)]),e("div",Kg,[e("div",null,[qe(r.id)?(l(),d("div",Lg)):fe(r.id)?(l(),d("p",Dg,g(Lt(fe(r.id).requests||0))+" 次 ",1)):(l(),d("p",_g,"-")),t[109]||(t[109]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"请求",-1))]),e("div",null,[qe(r.id)?(l(),d("div",Tg)):fe(r.id)?(l(),d("p",Sg,g(fe(r.id).formattedCost||"$0.00"),1)):(l(),d("p",Ug,"-")),t[110]||(t[110]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"费用",-1))])]),e("div",Pg,[e("div",Rg,[t[111]||(t[111]=e("span",null,"最后使用",-1)),e("span",Mg,g(r.lastUsedAt?Ut(r.lastUsedAt):"从未使用"),1)]),e("div",Vg,[t[113]||(t[113]=e("span",null,"账号",-1)),r.lastUsedAt&&yt(r.id)?(l(),d("span",Eg,t[112]||(t[112]=[e("i",{class:"fas fa-spinner fa-spin mr-1"},null,-1),h(" 加载中... ",-1)]))):Rt(r)?(l(),d("span",{key:1,class:"truncate text-gray-500 dark:text-gray-400",style:{"max-width":"180px"},title:rt(r)},[h(g(Vt(r))+" ",1),Et(r)?w("",!0):(l(),d("span",jg," ("+g(ht(r))+") ",1))],8,Og)):(l(),d("span",Gg,"暂无使用账号"))])])]),e("div",zg,[qe(r.id)&&(r.dailyCostLimit>0||r.totalCostLimit>0||r.rateLimitWindow>0&&r.rateLimitCost>0)?(l(),d("div",qg,t[114]||(t[114]=[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)]))):(l(),d(Z,{key:1},[r.dailyCostLimit>0?(l(),he(Ve,{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?(l(),he(Ve,{key:1,current:((R=fe(r.id))==null?void 0:R.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)?(l(),d("div",Fg,[re(Ve,{current:((M=fe(r.id))==null?void 0:M.currentWindowCost)||0,label:"窗口费用",limit:r.rateLimitCost,type:"window",variant:"compact"},null,8,["current","limit"]),e("div",Wg,[e("div",Bg,[t[115]||(t[115]=e("i",{class:"fas fa-clock text-xs"},null,-1)),e("span",Ng,g(r.rateLimitWindow)+"分钟窗口",1)]),e("span",{class:j(["font-bold",(((U=fe(r.id))==null?void 0:U.windowRemainingSeconds)||0)>0?"text-sky-700 dark:text-sky-300":"text-gray-400 dark:text-gray-500"])},g((((ae=fe(r.id))==null?void 0:ae.windowRemainingSeconds)||0)>0?us(((ie=fe(r.id))==null?void 0:ie.windowRemainingSeconds)||0):"未激活"),3)])])):(l(),d("div",Hg,t[116]||(t[116]=[e("i",{class:"fas fa-infinity text-base"},null,-1),e("span",{class:"text-xs font-medium"},"无限制",-1)])))],64))])]),e("div",Yg,[e("div",Qg,[t[117]||(t[117]=e("span",null,"创建时间",-1)),e("span",null,g(je(r.createdAt)),1)]),e("div",Jg,[t[119]||(t[119]=e("span",null,"过期时间",-1)),e("div",Xg,[e("span",{class:j(st(r.expiresAt)?"font-semibold text-orange-600":"")},g(r.expiresAt?je(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:Te(b=>at(r),["stop"])},t[118]||(t[118]=[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?(l(),d("div",ep,[(l(!0),d(Z,null,ne(r.tags,b=>(l(),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"},g(b),1))),128))])):w("",!0),e("div",tp,[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=>kt(r)},t[120]||(t[120]=[e("i",{class:"fas fa-chart-line"},null,-1),h(" 查看详情 ",-1)]),8,sp),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=>Dt(r)},t[121]||(t[121]=[e("i",{class:"fas fa-edit mr-1"},null,-1),h(" 编辑 ",-1)]),8,ap),r.expiresAt&&(tt(r.expiresAt)||st(r.expiresAt))?(l(),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=>_t(r)},t[122]||(t[122]=[e("i",{class:"fas fa-clock mr-1"},null,-1),h(" 续期 ",-1)]),8,rp)):w("",!0),e("button",{class:j([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=>Tt(r)},[e("i",{class:j(["fas",r.isActive?"fa-ban":"fa-check-circle","mr-1"])},null,2),h(" "+g(r.isActive?"禁用":"激活"),1)],10,op),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=>St(r.id)},t[123]||(t[123]=[e("i",{class:"fas fa-trash"},null,-1)]),8,lp)])])}),128))])):w("",!0),mt.value.length>0?(l(),d("div",np,[e("div",ip,[e("span",dp," 共 "+g(mt.value.length)+" 条记录 ",1),e("div",up,[t[124]||(t[124]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},"每页显示",-1)),D(e("select",{"onUpdate:modelValue":t[18]||(t[18]=r=>Je.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"},[(l(),d(Z,null,ne($s,r=>e("option",{key:r,value:r},g(r),9,cp)),64))],512),[[dt,Je.value]]),t[125]||(t[125]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},"条",-1))])]),e("div",gp,[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:ke.value===1,onClick:t[19]||(t[19]=r=>ke.value--)},t[126]||(t[126]=[e("i",{class:"fas fa-chevron-left"},null,-1)]),8,pp),e("div",mp,[Ht.value?(l(),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[20]||(t[20]=r=>ke.value=1)}," 1 ")):w("",!0),Cs.value?(l(),d("span",xp,"...")):w("",!0),(l(!0),d(Z,null,ne(Ze.value,r=>(l(),d("button",{key:r,class:j(["rounded-md px-2 py-1 text-xs font-medium sm:px-3 sm:text-sm",r===ke.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=>ke.value=r},g(r),11,yp))),128)),Is.value?(l(),d("span",fp,"...")):w("",!0),Yt.value?(l(),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[21]||(t[21]=r=>ke.value=ze.value)},g(ze.value),1)):w("",!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:ke.value===ze.value||ze.value===0,onClick:t[22]||(t[22]=r=>ke.value++)},t[127]||(t[127]=[e("i",{class:"fas fa-chevron-right"},null,-1)]),8,bp)])])):w("",!0)])):_.value==="deleted"?(l(),d("div",vp,[K.value?(l(),d("div",kp,t[128]||(t[128]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载已删除的 API Keys...",-1)]))):F.value.length===0?(l(),d("div",wp,t[129]||(t[129]=[e("div",{class:"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-700"},[e("i",{class:"fas fa-trash text-xl text-gray-400"})],-1),e("p",{class:"text-lg text-gray-500 dark:text-gray-400"},"暂无已删除的 API Keys",-1),e("p",{class:"mt-2 text-sm text-gray-400"},"已删除的 API Keys 会出现在这里",-1)]))):(l(),d("div",hp,[e("div",Ap,[F.value.length>0?(l(),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:ta},[t[130]||(t[130]=e("i",{class:"fas fa-trash-alt mr-2"},null,-1)),h(" 清空所有已删除 ("+g(F.value.length)+") ",1)])):w("",!0)]),e("div",$p,[e("div",Cp,[e("table",Ip,[e("thead",Kp,[e("tr",null,[t[131]||(t[131]=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[132]||(t[132]=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)),L.value?(l(),d("th",Lp," 创建者 ")):w("",!0),t[133]||(t[133]=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[134]||(t[134]=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[135]||(t[135]=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[136]||(t[136]=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[137]||(t[137]=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[138]||(t[138]=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[139]||(t[139]=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[140]||(t[140]=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",Dp,[(l(!0),d(Z,null,ne(F.value,r=>{var v,R,M,U,ae,ie;return l(),d("tr",{key:r.id,class:"table-row"},[e("td",_p,[e("div",Tp,[t[141]||(t[141]=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",Sp,[e("div",{class:"truncate text-sm font-semibold text-gray-900 dark:text-gray-100",title:r.name},g(r.name),9,Up)])])]),e("td",Pp,[e("div",Rp,[r.claudeAccountId?(l(),d("div",Mp,t[142]||(t[142]=[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]"}),h(" Claude OAuth ")],-1)]))):r.claudeConsoleAccountId?(l(),d("div",Vp,t[143]||(t[143]=[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]"}),h(" Claude Console ")],-1)]))):r.geminiAccountId?(l(),d("div",Ep,t[144]||(t[144]=[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]"}),h(" Gemini ")],-1)]))):(l(),d("div",Op,t[145]||(t[145]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),h(" 共享池 ",-1)])))])]),L.value?(l(),d("td",jp,[e("div",Gp,[r.createdBy==="admin"?(l(),d("span",zp,t[146]||(t[146]=[e("i",{class:"fas fa-user-shield mr-1 text-xs"},null,-1),h(" 管理员 ",-1)]))):r.userUsername?(l(),d("span",qp,[t[147]||(t[147]=e("i",{class:"fas fa-user mr-1 text-xs"},null,-1)),h(" "+g(r.userUsername),1)])):(l(),d("span",Fp,t[148]||(t[148]=[e("i",{class:"fas fa-question-circle mr-1 text-xs"},null,-1),h(" 未知 ",-1)])))])])):w("",!0),e("td",Wp,g(je(r.createdAt)),1),e("td",Bp,[e("div",Np,[r.deletedByType==="admin"?(l(),d("span",Hp,[t[149]||(t[149]=e("i",{class:"fas fa-user-shield mr-1 text-xs"},null,-1)),h(" "+g(r.deletedBy),1)])):r.deletedByType==="user"?(l(),d("span",Yp,[t[150]||(t[150]=e("i",{class:"fas fa-user mr-1 text-xs"},null,-1)),h(" "+g(r.deletedBy),1)])):(l(),d("span",Qp,[t[151]||(t[151]=e("i",{class:"fas fa-cog mr-1 text-xs"},null,-1)),h(" "+g(r.deletedBy),1)]))])]),e("td",Jp,g(je(r.deletedAt)),1),e("td",Xp,[e("span",Zp," $"+g((((R=(v=r.usage)==null?void 0:v.total)==null?void 0:R.cost)||0).toFixed(2)),1)]),e("td",em,[e("span",tm,g(De(((U=(M=r.usage)==null?void 0:M.total)==null?void 0:U.tokens)||0)),1)]),e("td",sm,[e("div",am,[e("span",rm,g(Lt(((ie=(ae=r.usage)==null?void 0:ae.total)==null?void 0:ie.requests)||0)),1),t[152]||(t[152]=e("span",{class:"text-xs text-gray-500"},"次",-1))])]),e("td",om,[e("div",lm,[r.lastUsedAt?(l(),d("span",{key:0,class:"cursor-help",style:{"font-size":"13px"},title:new Date(r.lastUsedAt).toLocaleString("zh-CN")},g(Ut(r.lastUsedAt)),9,nm)):(l(),d("span",im,"从未使用")),r.lastUsedAt&&yt(r.id)?(l(),d("span",dm,t[153]||(t[153]=[e("i",{class:"fas fa-spinner fa-spin mr-1"},null,-1),h(" 加载中... ",-1)]))):Rt(r)?(l(),d("span",{key:3,class:"mt-1 text-xs text-gray-500 dark:text-gray-400",title:rt(r)},[h(g(Vt(r))+" ",1),Et(r)?w("",!0):(l(),d("span",cm," ("+g(ht(r))+") ",1))],8,um)):(l(),d("span",gm," 暂无使用账号 "))])]),e("td",pm,[e("div",mm,[r.canRestore?(l(),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=>Zs(r.id)},t[154]||(t[154]=[e("i",{class:"fas fa-undo mr-1"},null,-1),h(" 恢复 ",-1)]),8,xm)):w("",!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=>ea(r.id)},t[155]||(t[155]=[e("i",{class:"fas fa-times mr-1"},null,-1),h(" 彻底删除 ",-1)]),8,ym)])])])}),128))])])])])]))])):w("",!0)])]),Xe.value?(l(),he(Ko,{key:0,accounts:c.value,onBatchSuccess:Ns,onClose:t[23]||(t[23]=r=>Xe.value=!1),onSuccess:Bs},null,8,["accounts"])):w("",!0),ct.value?(l(),he(Dl,{key:1,accounts:c.value,"api-key":Ft.value,onClose:t[24]||(t[24]=r=>ct.value=!1),onSuccess:Qs},null,8,["accounts","api-key"])):w("",!0),gt.value?(l(),he(Bl,{key:2,"api-key":Wt.value,onClose:t[25]||(t[25]=r=>gt.value=!1),onSuccess:Js},null,8,["api-key"])):w("",!0),It.value?(l(),he(ln,{key:3,"api-key":Bt.value,onClose:t[26]||(t[26]=r=>It.value=!1)},null,8,["api-key"])):w("",!0),Kt.value?(l(),he(Sn,{key:4,"api-keys":Nt.value,onClose:t[27]||(t[27]=r=>Kt.value=!1)},null,8,["api-keys"])):w("",!0),pt.value?(l(),he(Di,{key:5,accounts:c.value,"selected-keys":A.value,onClose:t[28]||(t[28]=r=>pt.value=!1),onSuccess:Ys},null,8,["accounts","selected-keys"])):w("",!0),re(td,{ref_key:"expiryEditModalRef",ref:pe,"api-key":se.value||{id:null,expiresAt:null,name:""},show:!!se.value,onClose:ds,onSave:ra},null,8,["api-key","show"]),re(a0,{"api-key":Ae.value||{},show:xe.value,onClose:t[29]||(t[29]=r=>xe.value=!1),onOpenTimeline:oa},null,8,["api-key","show"])])}}},Im=Ue(fm,[["__scopeId","data-v-79881b9b"]]);export{Im as default};
|