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