mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 00:53:33 +00:00
31 lines
230 KiB
JavaScript
31 lines
230 KiB
JavaScript
import{E as Cs}from"./element-plus-CqiD73Lu.js";import{aP as Jt,r as M,c as E,q as Ze,V as Is,o as De,x as d,y as i,z as e,I as me,C as j,P as u,R as ne,J as Ks,L as h,B as dt,K as T,aq as se,Q as ae,ac as ie,T as Ls,a5 as Te,D as Ds,_ as Fe,Y as we,an as de,O as A,aa as Je,aV as Xe,al as Le,f as Ye,u as Qe}from"./vue-vendor-Bsazo-x0.js";import{c as G,_ as Ke,s as O,u as Ss}from"./index-BMheApHH.js";import{Q as Ee}from"./vendor-Dr8jvgFu.js";import{_ as Ts}from"./WindowCountdown-BTXjZ8Dc.js";import{C as kt}from"./CustomDropdown-Bwqmw2OO.js";const ht=Jt("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 b=await G.get("/admin/supported-clients");return b.success?this.supportedClients=b.data||[]:(this.error=b.message||"加载支持的客户端失败",console.error("Failed to load supported clients:",this.error)),this.supportedClients}catch(b){return this.error=b.message||"加载支持的客户端失败",console.error("Error loading supported clients:",b),[]}finally{this.loading=!1}}}}),At=Jt("apiKeys",()=>{const b=M([]),B=M(!1),c=M(null),R=M("all"),F=M(""),C=M("asc"),V=async()=>{B.value=!0,c.value=null;try{const _=await G.get("/admin/api-keys");if(_.success)b.value=_.data||[];else throw new Error(_.message||"获取API Keys失败")}catch(_){throw c.value=_.message,_}finally{B.value=!1}};return{apiKeys:b,loading:B,error:c,statsTimeRange:R,sortBy:F,sortOrder:C,fetchApiKeys:V,createApiKey:async _=>{B.value=!0,c.value=null;try{const z=await G.post("/admin/api-keys",_);if(z.success)return await V(),z.data;throw new Error(z.message||"创建API Key失败")}catch(z){throw c.value=z.message,z}finally{B.value=!1}},updateApiKey:async(_,z)=>{B.value=!0,c.value=null;try{const $=await G.put(`/admin/api-keys/${_}`,z);if($.success)return await V(),$;throw new Error($.message||"更新API Key失败")}catch($){throw c.value=$.message,$}finally{B.value=!1}},toggleApiKey:async _=>{B.value=!0,c.value=null;try{const z=await G.put(`/admin/api-keys/${_}/toggle`);if(z.success)return await V(),z;throw new Error(z.message||"切换状态失败")}catch(z){throw c.value=z.message,z}finally{B.value=!1}},renewApiKey:async(_,z)=>{B.value=!0,c.value=null;try{const $=await G.put(`/admin/api-keys/${_}`,z);if($.success)return await V(),$;throw new Error($.message||"续期失败")}catch($){throw c.value=$.message,$}finally{B.value=!1}},deleteApiKey:async _=>{B.value=!0,c.value=null;try{const z=await G.delete(`/admin/api-keys/${_}`);if(z.success)return await V(),z;throw new Error(z.message||"删除失败")}catch(z){throw c.value=z.message,z}finally{B.value=!1}},fetchApiKeyStats:async(_,z="all")=>{try{const $=await G.get(`/admin/api-keys/${_}/stats`,{params:{timeRange:z}});if($.success)return $.stats;throw new Error($.message||"获取统计失败")}catch($){return console.error("获取API Key统计失败:",$),null}},fetchTags:async()=>{try{const _=await G.get("/admin/api-keys/tags");if(_.success)return _.data||[];throw new Error(_.message||"获取标签失败")}catch(_){return console.error("获取标签失败:",_),[]}},sortApiKeys:_=>{F.value===_?C.value=C.value==="asc"?"desc":"asc":(F.value=_,C.value="asc")},reset:()=>{b.value=[],B.value=!1,c.value=null,R.value="all",F.value="",C.value="asc"}}}),_s={class:"flex-shrink-0 border-b border-gray-200 p-3 dark:border-gray-600"},Ms={class:"relative"},Ps={class:"custom-scrollbar flex-1 overflow-y-auto"},Vs={key:0,class:"border-b border-gray-200 dark:border-gray-600"},Rs=["onClick"],Us={class:"text-gray-700 dark:text-gray-300"},Os={key:0,class:"ml-2 text-xs text-gray-400 dark:text-gray-500"},Es={class:"text-gray-700 dark:text-gray-300"},js={key:1},Gs=["onClick"],qs={class:"flex items-center justify-between"},zs={class:"text-gray-700 dark:text-gray-300"},Fs={class:"text-xs text-gray-500 dark:text-gray-400"},Bs={key:2},Ws={class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"},Ns=["onClick"],Hs={class:"flex items-center justify-between"},Ys={class:"text-gray-700 dark:text-gray-300"},Qs={class:"text-xs text-gray-400 dark:text-gray-500"},Js={key:3},Xs=["onClick"],Zs={class:"flex items-center justify-between"},ea={class:"text-gray-700 dark:text-gray-300"},ta={class:"text-xs text-gray-400 dark:text-gray-500"},sa={key:4},aa=["onClick"],ra={class:"flex items-center justify-between"},oa={class:"text-gray-700 dark:text-gray-300"},la={class:"text-xs text-gray-400 dark:text-gray-500"},na={key:5,class:"px-4 py-8 text-center text-gray-500 dark:text-gray-400"},ia={__name:"AccountSelector",props:{modelValue:{type:String,default:""},platform:{type:String,required:!0,validator:b=>["claude","gemini","openai","bedrock","droid"].includes(b)},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(b,{emit:B}){const c=b,R=B,F=M(!1),C=M(""),V=M(null),q=M(null),P=M({}),Q=M(null),H=M(""),v=E(()=>c.specialOptions||[]),D=E(()=>{const l=v.value.find(I=>I.value===c.modelValue);if(l)return l.label;if(!c.modelValue)return c.defaultOptionText;if(c.modelValue.startsWith("group:")){const I=c.modelValue.substring(6),w=c.groups.find(n=>n.id===I);return w?`${w.name} (${w.memberCount||0} 个成员)`:""}if(c.modelValue.startsWith("console:")){const I=c.modelValue.substring(8),w=c.accounts.find(n=>n.id===I&&n.platform==="claude-console");return w?`${w.name} (${m(w)})`:""}if(c.modelValue.startsWith("responses:")){const I=c.modelValue.substring(10),w=c.accounts.find(n=>n.id===I&&n.platform==="openai-responses");return w?`${w.name} (${m(w)})`:""}const p=c.accounts.find(I=>I.id===c.modelValue);return p?`${p.name} (${m(p)})`:""}),m=l=>{if(!l)return"未知";if(!(l.isActive==="true"||l.isActive===!0))switch(l.status){case"unauthorized":return"未授权";case"error":return"Token错误";case"created":return"待验证";case"rate_limited":return"限流中";case"quota_exceeded":return"额度超限";default:return"异常"}return l.status==="rate_limited"?"限流中":"正常"},t=E(()=>[...c.accounts].sort((l,p)=>{const I=new Date(l.createdAt||0);return new Date(p.createdAt||0)-I})),U=E(()=>{let l=c.groups.filter(p=>p.platform?p.platform===c.platform:!0);if(C.value){const p=C.value.toLowerCase();l=l.filter(I=>I.name.toLowerCase().includes(p))}return l}),_=E(()=>{let l=[];if(c.platform==="claude"?l=t.value.filter(p=>p.platform==="claude-oauth"):c.platform==="openai"?l=t.value.filter(p=>p.platform==="openai"):c.platform==="droid"?l=t.value.filter(p=>p.platform==="droid"):l=t.value.filter(p=>!["claude-oauth","claude-console","openai-responses"].includes(p.platform)),C.value){const p=C.value.toLowerCase();l=l.filter(I=>I.name.toLowerCase().includes(p))}return l}),z=E(()=>{if(c.platform!=="claude")return[];let l=t.value.filter(p=>p.platform==="claude-console");if(C.value){const p=C.value.toLowerCase();l=l.filter(I=>I.name.toLowerCase().includes(p))}return l}),$=E(()=>{if(c.platform!=="openai")return[];let l=t.value.filter(p=>p.platform==="openai-responses");if(C.value){const p=C.value.toLowerCase();l=l.filter(I=>I.name.toLowerCase().includes(p))}return l}),L=E(()=>U.value.length>0||_.value.length>0||z.value.length>0||$.value.length>0),ee=l=>{if(!l)return"";const p=new Date(l),w=(new Date-p)/(1e3*60*60);return w<24?"今天创建":w<48?"昨天创建":w<168?`${Math.floor(w/24)} 天前`:p.toLocaleDateString("zh-CN",{month:"2-digit",day:"2-digit"})},J=()=>{if(!F.value||!q.value||!Q.value)return;const l=Q.value;if(!l)return;const p=l.getBoundingClientRect(),I=window.innerHeight,w=window.innerWidth,n=I-p.bottom,x=p.top,oe=8,pe=n-oe,X=x-oe;let te=!1,N=pe;H.value==="above"&&X>=150?(te=!0,N=X):H.value==="below"&&pe>=150?(te=!1,N=pe):X>pe&&pe<200&&(te=!0,N=X),H.value=te?"above":"below";let xe=p.left;const Ce=p.width;xe+Ce>w-oe&&(xe=w-Ce-oe),xe<oe&&(xe=oe),P.value={position:"fixed",left:`${xe}px`,width:`${p.width}px`,maxHeight:`${Math.min(N,400)}px`,...te?{bottom:`${I-p.top}px`}:{top:`${p.bottom}px`}}},ge=()=>{if(!F.value&&Q.value){const l=Q.value.getBoundingClientRect(),I=window.innerHeight-l.bottom,w=8;P.value={position:"fixed",left:`${l.left}px`,width:`${l.width}px`,maxHeight:`${Math.min(I-w,400)}px`,top:`${l.bottom}px`}}F.value=!F.value,F.value&&Ds(()=>{var l;J(),(l=V.value)==null||l.focus()})},ue=l=>{R("update:modelValue",l||""),F.value=!1,C.value=""},Y=()=>{},ye=()=>{var l;C.value="",(l=V.value)==null||l.focus()},f=l=>{var p,I;!((p=Q.value)!=null&&p.contains(l.target))&&!((I=q.value)!=null&&I.contains(l.target))&&(F.value=!1)},o=()=>{F.value&&J()};return Ze(()=>{document.addEventListener("click",f),window.addEventListener("scroll",o,!0),window.addEventListener("resize",J)}),Is(()=>{document.removeEventListener("click",f),window.removeEventListener("scroll",o,!0),window.removeEventListener("resize",J)}),De(F,l=>{l||(C.value="",H.value="")}),(l,p)=>(i(),d("div",{ref_key:"triggerRef",ref:Q,class:"relative"},[e("div",{class:j(["form-input flex w-full cursor-pointer items-center justify-between border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",{"opacity-50":b.disabled}]),onClick:p[0]||(p[0]=I=>!b.disabled&&ge())},[e("span",{class:j(b.modelValue?"text-gray-900 dark:text-gray-200":"text-gray-500 dark:text-gray-400")},u(D.value),3),e("i",{class:j(["fas fa-chevron-down text-gray-400 transition-transform duration-200 dark:text-gray-500",{"rotate-180":F.value}])},null,2)],2),(i(),me(Te,{to:"body"},[ne(Ls,{"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:Ks(()=>[F.value?(i(),d("div",{key:0,ref_key:"dropdownRef",ref:q,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:dt(P.value)},[e("div",_s,[e("div",Ms,[T(e("input",{ref_key:"searchInput",ref:V,"onUpdate:modelValue":p[1]||(p[1]=I=>C.value=I),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:Y},null,544),[[se,C.value]]),p[4]||(p[4]=e("i",{class:"fas fa-search pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-sm text-gray-400 dark:text-gray-500"},null,-1)),C.value?(i(),d("button",{key:0,class:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-400",type:"button",onClick:ye},p[3]||(p[3]=[e("i",{class:"fas fa-times text-sm"},null,-1)]))):h("",!0)])]),e("div",Ps,[v.value.length>0?(i(),d("div",Vs,[(i(!0),d(ae,null,ie(v.value,I=>(i(),d("div",{key:`special-${I.value}`,class:j(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":b.modelValue===I.value}]),onClick:w=>ue(I.value)},[e("span",Us,u(I.label),1),I.description?(i(),d("span",Os,u(I.description),1)):h("",!0)],10,Rs))),128))])):h("",!0),e("div",{class:j(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":!b.modelValue}]),onClick:p[2]||(p[2]=I=>ue(null))},[e("span",Es,u(b.defaultOptionText),1)],2),U.value.length>0?(i(),d("div",js,[p[5]||(p[5]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"}," 调度分组 ",-1)),(i(!0),d(ae,null,ie(U.value,I=>(i(),d("div",{key:`group:${I.id}`,class:j(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":b.modelValue===`group:${I.id}`}]),onClick:w=>ue(`group:${I.id}`)},[e("div",qs,[e("span",zs,u(I.name),1),e("span",Fs,u(I.memberCount||0)+" 个成员",1)])],10,Gs))),128))])):h("",!0),_.value.length>0?(i(),d("div",Bs,[e("div",Ws,u(b.platform==="claude"?"Claude OAuth 专属账号":b.platform==="openai"?"OpenAI 专属账号":b.platform==="droid"?"Droid 专属账号":"OAuth 专属账号"),1),(i(!0),d(ae,null,ie(_.value,I=>(i(),d("div",{key:I.id,class:j(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":b.modelValue===I.id}]),onClick:w=>ue(I.id)},[e("div",Hs,[e("div",null,[e("span",Ys,u(I.name),1),e("span",{class:j(["ml-2 rounded-full px-2 py-0.5 text-xs",I.isActive?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":I.status==="unauthorized"?"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400":"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400"])},u(m(I)),3)]),e("span",Qs,u(ee(I.createdAt)),1)])],10,Ns))),128))])):h("",!0),b.platform==="claude"&&z.value.length>0?(i(),d("div",Js,[p[6]||(p[6]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"}," Claude Console 专属账号 ",-1)),(i(!0),d(ae,null,ie(z.value,I=>(i(),d("div",{key:I.id,class:j(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":b.modelValue===`console:${I.id}`}]),onClick:w=>ue(`console:${I.id}`)},[e("div",Zs,[e("div",null,[e("span",ea,u(I.name),1),e("span",{class:j(["ml-2 rounded-full px-2 py-0.5 text-xs",I.isActive?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":I.status==="unauthorized"?"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400":"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400"])},u(m(I)),3)]),e("span",ta,u(ee(I.createdAt)),1)])],10,Xs))),128))])):h("",!0),b.platform==="openai"&&$.value.length>0?(i(),d("div",sa,[p[7]||(p[7]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500 dark:bg-gray-700 dark:text-gray-400"}," OpenAI-Responses 专属账号 ",-1)),(i(!0),d(ae,null,ie($.value,I=>(i(),d("div",{key:I.id,class:j(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-gray-700",{"bg-blue-50 dark:bg-blue-900/20":b.modelValue===`responses:${I.id}`}]),onClick:w=>ue(`responses:${I.id}`)},[e("div",ra,[e("div",null,[e("span",oa,u(I.name),1),e("span",{class:j(["ml-2 rounded-full px-2 py-0.5 text-xs",I.isActive==="true"||I.isActive===!0?"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400":I.status==="rate_limited"?"bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-400":"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400"])},u(m(I)),3)]),e("span",la,u(ee(I.createdAt)),1)])],10,aa))),128))])):h("",!0),C.value&&!L.value?(i(),d("div",na,p[8]||(p[8]=[e("i",{class:"fas fa-search mb-2 text-2xl"},null,-1),e("p",{class:"text-sm"},"没有找到匹配的账号",-1)]))):h("",!0)])],4)):h("",!0)]),_:1})]))],512))}},ve=Ke(ia,[["__scopeId","data-v-23b4b39f"]]),da={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},ua={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6"},ca={class:"mb-4 flex items-center justify-between"},ga={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"},pa={class:"flex items-center gap-3 sm:gap-4"},ma={class:"flex cursor-pointer items-center"},xa={class:"flex cursor-pointer items-center"},ya={key:0,class:"mt-3"},fa={class:"flex items-center gap-4"},ba={class:"flex-1"},va={class:"flex items-center gap-2"},ka={class:"mt-2 flex items-start text-xs text-amber-600 dark:text-amber-400"},wa=["placeholder"],ha={key:0,class:"mt-1 text-xs text-red-500 dark:text-red-400"},Aa={class:"space-y-4"},$a={key:0},Ca={class:"flex flex-wrap gap-2"},Ia=["onClick"],Ka={key:1},La={class:"flex flex-wrap gap-2"},Da=["onClick"],Sa={class:"flex gap-2"},Ta=["onKeypress"],_a={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},Ma={class:"space-y-2"},Pa={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},Va={class:"space-y-2"},Ra={class:"flex gap-2"},Ua={class:"space-y-2"},Oa={class:"flex gap-2"},Ea={class:"space-y-2"},ja={class:"flex gap-2"},Ga={class:"mb-3 rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800"},qa={class:"flex items-center gap-4"},za={class:"flex cursor-pointer items-center"},Fa={class:"flex cursor-pointer items-center"},Ba={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Wa={key:0},Na={key:1},Ha={key:0},Ya={key:0,class:"mt-3"},Qa=["min"],Ja={key:1,class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Xa={key:1},Za={class:"flex items-center gap-2"},er=["max","placeholder"],tr={class:"mt-2 flex flex-wrap gap-2"},sr=["onClick"],ar={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},rr={class:"flex gap-4"},or={class:"flex cursor-pointer items-center"},lr={class:"flex cursor-pointer items-center"},nr={class:"flex cursor-pointer items-center"},ir={class:"flex cursor-pointer items-center"},dr={class:"flex cursor-pointer items-center"},ur={class:"mb-2 flex items-center justify-between"},cr=["disabled"],gr={class:"grid grid-cols-1 gap-3"},pr={class:"mb-2 flex items-center"},mr={key:0,class:"space-y-3"},xr={class:"mb-3 flex min-h-[32px] flex-wrap gap-2 rounded-lg border border-gray-200 bg-gray-50 p-2"},yr=["onClick"],fr={key:0,class:"text-sm text-gray-400"},br={class:"space-y-3"},vr={class:"flex flex-wrap gap-2"},kr=["onClick"],wr={key:0,class:"text-sm italic text-gray-400"},hr={class:"flex gap-2"},Ar=["onKeydown"],$r={class:"mb-2 flex items-center"},Cr={key:0,class:"rounded-lg border border-green-200 bg-green-50 p-3 dark:border-green-700 dark:bg-green-900/20"},Ir={class:"space-y-1"},Kr=["id","value"],Lr=["for"],Dr={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},Sr={class:"block text-xs text-gray-500 dark:text-gray-400"},Tr={class:"flex gap-3 pt-2"},_r=["disabled"],Mr={key:0,class:"loading-spinner mr-2"},Pr={key:1,class:"fas fa-plus mr-2"},Vr={__name:"CreateApiKeyModal",props:{accounts:{type:Object,default:()=>({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]})}},emits:["close","success","batch-success"],setup(b,{emit:B}){const c=b,R=B,F=ht(),C=At(),V=M(!1),q=M(!1),P=M({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),Q=M({name:""}),H=M(""),v=M([]),D=E(()=>v.value.filter(w=>!t.tags.includes(w))),m=M([]),t=Fe({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:[]});Ze(async()=>{if(m.value=await F.loadSupportedClients(),v.value=await C.fetchTags(),c.accounts){const w=[];c.accounts.openai&&c.accounts.openai.forEach(n=>{w.push({...n,platform:"openai"})}),c.accounts.openaiResponses&&c.accounts.openaiResponses.forEach(n=>{w.push({...n,platform:"openai-responses"})}),P.value={claude:c.accounts.claude||[],gemini:c.accounts.gemini||[],openai:w,bedrock:c.accounts.bedrock||[],droid:(c.accounts.droid||[]).map(n=>({...n,platform:"droid"})),claudeGroups:c.accounts.claudeGroups||[],geminiGroups:c.accounts.geminiGroups||[],openaiGroups:c.accounts.openaiGroups||[],droidGroups:c.accounts.droidGroups||[]}}await U()});const U=async()=>{var w,n;q.value=!0;try{const[x,oe,pe,X,te,N,xe,Ce]=await Promise.all([G.get("/admin/claude-accounts"),G.get("/admin/claude-console-accounts"),G.get("/admin/gemini-accounts"),G.get("/admin/openai-accounts"),G.get("/admin/openai-responses-accounts"),G.get("/admin/bedrock-accounts"),G.get("/admin/droid-accounts"),G.get("/admin/account-groups")]),_e=[];x.success&&((w=x.data)==null||w.forEach(le=>{_e.push({...le,platform:"claude-oauth",isDedicated:le.accountType==="dedicated"})})),oe.success&&((n=oe.data)==null||n.forEach(le=>{_e.push({...le,platform:"claude-console",isDedicated:le.accountType==="dedicated"})})),P.value.claude=_e,pe.success&&(P.value.gemini=(pe.data||[]).map(le=>({...le,isDedicated:le.accountType==="dedicated"})));const Me=[];if(X.success&&(X.data||[]).forEach(le=>{Me.push({...le,platform:"openai",isDedicated:le.accountType==="dedicated"})}),te.success&&(te.data||[]).forEach(le=>{Me.push({...le,platform:"openai-responses",isDedicated:le.accountType==="dedicated"})}),P.value.openai=Me,N.success&&(P.value.bedrock=(N.data||[]).map(le=>({...le,isDedicated:le.accountType==="dedicated"}))),xe.success&&(P.value.droid=(xe.data||[]).map(le=>({...le,platform:"droid",isDedicated:le.accountType==="dedicated"}))),Ce.success){const le=Ce.data||[];P.value.claudeGroups=le.filter(Ie=>Ie.platform==="claude"),P.value.geminiGroups=le.filter(Ie=>Ie.platform==="gemini"),P.value.openaiGroups=le.filter(Ie=>Ie.platform==="openai"),P.value.droidGroups=le.filter(Ie=>Ie.platform==="droid")}O("账号列表已刷新","success")}catch{O("刷新账号列表失败","error")}finally{q.value=!1}},_=E(()=>{const w=new Date;return w.setMinutes(w.getMinutes()+1),w.toISOString().slice(0,16)}),z=()=>{if(!t.expireDuration){t.expiresAt=null;return}if(t.expireDuration==="custom")return;const w=new Date,x=t.expireDuration.match(/(\d+)([dhmy])/);if(x){const[,oe,pe]=x,X=parseInt(oe);switch(pe){case"d":w.setDate(w.getDate()+X);break;case"h":w.setHours(w.getHours()+X);break;case"m":w.setMonth(w.getMonth()+X);break;case"y":w.setFullYear(w.getFullYear()+X);break}t.expiresAt=w.toISOString()}},$=()=>{t.customExpireDate&&(t.expiresAt=new Date(t.customExpireDate).toISOString())},L=w=>new Date(w).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),ee=()=>{t.modelInput&&!t.restrictedModels.includes(t.modelInput)&&(t.restrictedModels.push(t.modelInput),t.modelInput="")},J=w=>{t.restrictedModels.splice(w,1)},ge=M(["claude-opus-4-20250514","claude-opus-4-1-20250805"]),ue=E(()=>ge.value.filter(w=>!t.restrictedModels.includes(w))),Y=w=>{t.restrictedModels.includes(w)||t.restrictedModels.push(w)},ye=()=>{if(H.value&&H.value.trim()){const w=H.value.trim();t.tags.includes(w)||t.tags.push(w),H.value=""}},f=w=>{t.tags.includes(w)||t.tags.push(w)},o=w=>{t.tags.splice(w,1)},l=()=>t.activationUnit==="hours"?[{value:1,label:"1小时"},{value:3,label:"3小时"},{value:6,label:"6小时"},{value:12,label:"12小时"}]:[{value:30,label:"30天"},{value:90,label:"90天"},{value:180,label:"180天"},{value:365,label:"365天"}],p=()=>{t.activationUnit==="hours"?t.activationDays>24&&(t.activationDays=24):t.activationDays<1&&(t.activationDays=1)},I=async()=>{if(Q.value.name="",!t.name||!t.name.trim()){Q.value.name="请输入API Key名称";return}if(t.createType==="batch"&&(!t.batchCount||t.batchCount<2||t.batchCount>500)){O("批量创建数量必须在 2-500 之间","error");return}if(t.rateLimitWindow&&(!t.rateLimitCost||parseFloat(t.rateLimitCost)===0)){let w=!1;if(window.showConfirm?w=await window.showConfirm("费用限制提醒",`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
|
||
是否继续?`,"继续创建","返回修改"):w=confirm(`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
是否继续?`),!w)return}V.value=!0;try{const w={description:t.description||void 0,tokenLimit:0,rateLimitWindow:t.rateLimitWindow!==""&&t.rateLimitWindow!==null?parseInt(t.rateLimitWindow):null,rateLimitRequests:t.rateLimitRequests!==""&&t.rateLimitRequests!==null?parseInt(t.rateLimitRequests):null,rateLimitCost:t.rateLimitCost!==""&&t.rateLimitCost!==null?parseFloat(t.rateLimitCost):null,concurrencyLimit:t.concurrencyLimit!==""&&t.concurrencyLimit!==null?parseInt(t.concurrencyLimit):0,dailyCostLimit:t.dailyCostLimit!==""&&t.dailyCostLimit!==null?parseFloat(t.dailyCostLimit):0,totalCostLimit:t.totalCostLimit!==""&&t.totalCostLimit!==null?parseFloat(t.totalCostLimit):0,weeklyOpusCostLimit:t.weeklyOpusCostLimit!==""&&t.weeklyOpusCostLimit!==null?parseFloat(t.weeklyOpusCostLimit):0,expiresAt:t.expirationMode==="fixed"&&t.expiresAt||void 0,expirationMode:t.expirationMode,activationDays:t.expirationMode==="activation"?t.activationDays:void 0,activationUnit:t.expirationMode==="activation"?t.activationUnit:void 0,permissions:t.permissions,tags:t.tags.length>0?t.tags:void 0,enableModelRestriction:t.enableModelRestriction,restrictedModels:t.restrictedModels,enableClientRestriction:t.enableClientRestriction,allowedClients:t.allowedClients};if(t.claudeAccountId&&(t.claudeAccountId.startsWith("console:")?(w.claudeConsoleAccountId=t.claudeAccountId.substring(8),delete w.claudeAccountId):(w.claudeAccountId=t.claudeAccountId,delete w.claudeConsoleAccountId)),t.geminiAccountId&&(w.geminiAccountId=t.geminiAccountId),t.openaiAccountId&&(w.openaiAccountId=t.openaiAccountId),t.bedrockAccountId&&(w.bedrockAccountId=t.bedrockAccountId),t.droidAccountId&&(w.droidAccountId=t.droidAccountId),t.createType==="single"){const n={...w,name:t.name},x=await G.post("/admin/api-keys",n);x.success?(O("API Key 创建成功","success"),R("success",x.data),R("close")):O(x.message||"创建失败","error")}else{const n={...w,createType:"batch",baseName:t.name,count:t.batchCount},x=await G.post("/admin/api-keys/batch",n);x.success?(O(`成功创建 ${x.data.length} 个 API Key`,"success"),R("batch-success",x.data),R("close")):O(x.message||"批量创建失败","error")}}catch{O("创建失败","error")}finally{V.value=!1}};return(w,n)=>(i(),me(Te,{to:"body"},[e("div",da,[e("div",ua,[e("div",ca,[n[49]||(n[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:n[0]||(n[0]=x=>w.$emit("close"))},n[48]||(n[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:we(I,["prevent"])},[e("div",ga,[e("div",{class:j(["flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",t.createType==="batch"?"mb-3":""])},[n[52]||(n[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",pa,[e("label",ma,[T(e("input",{"onUpdate:modelValue":n[1]||(n[1]=x=>t.createType=x),class:"mr-1.5 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 sm:mr-2",type:"radio",value:"single"},null,512),[[de,t.createType]]),n[50]||(n[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"}),A(" 单个创建 ")],-1))]),e("label",xa,[T(e("input",{"onUpdate:modelValue":n[2]||(n[2]=x=>t.createType=x),class:"mr-1.5 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700 sm:mr-2",type:"radio",value:"batch"},null,512),[[de,t.createType]]),n[51]||(n[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"}),A(" 批量创建 ")],-1))])])],2),t.createType==="batch"?(i(),d("div",ya,[e("div",fa,[e("div",ba,[n[54]||(n[54]=e("label",{class:"mb-1 block text-xs font-medium text-gray-600 dark:text-gray-400"},"创建数量",-1)),e("div",va,[T(e("input",{"onUpdate:modelValue":n[3]||(n[3]=x=>t.batchCount=x),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",max:"500",min:"2",placeholder:"输入数量 (2-500)",required:"",type:"number"},null,512),[[se,t.batchCount,void 0,{number:!0}]]),n[53]||(n[53]=e("div",{class:"whitespace-nowrap text-xs text-gray-500 dark:text-gray-400"}," 最大支持 500 个 ",-1))])])]),e("p",ka,[n[55]||(n[55]=e("i",{class:"fas fa-info-circle mr-1 mt-0.5 flex-shrink-0"},null,-1)),e("span",null,"批量创建时,每个 Key 的名称会自动添加序号后缀,例如:"+u(t.name||"MyKey")+"_1, "+u(t.name||"MyKey")+"_2 ...",1)])])):h("",!0)]),e("div",null,[n[56]||(n[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"},[A("名称 "),e("span",{class:"text-red-500"},"*")],-1)),e("div",null,[T(e("input",{"onUpdate:modelValue":n[4]||(n[4]=x=>t.name=x),class:j(["form-input flex-1 border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",{"border-red-500":Q.value.name}]),placeholder:t.createType==="batch"?"输入基础名称(将自动添加序号)":"为您的 API Key 取一个名称",required:"",type:"text",onInput:n[5]||(n[5]=x=>Q.value.name="")},null,42,wa),[[se,t.name]])]),Q.value.name?(i(),d("p",ha,u(Q.value.name),1)):h("",!0)]),e("div",null,[n[64]||(n[64]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"标签",-1)),e("div",Aa,[t.tags.length>0?(i(),d("div",$a,[n[58]||(n[58]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 已选择的标签: ",-1)),e("div",Ca,[(i(!0),d(ae,null,ie(t.tags,(x,oe)=>(i(),d("span",{key:"selected-"+oe,class:"inline-flex items-center gap-1 rounded-full bg-blue-100 px-3 py-1 text-sm text-blue-800 dark:bg-blue-900/30 dark:text-blue-400"},[A(u(x)+" ",1),e("button",{class:"ml-1 hover:text-blue-900 dark:hover:text-blue-300",type:"button",onClick:pe=>o(oe)},n[57]||(n[57]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,Ia)]))),128))])])):h("",!0),D.value.length>0?(i(),d("div",Ka,[n[60]||(n[60]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",La,[(i(!0),d(ae,null,ie(D.value,x=>(i(),d("button",{key:"available-"+x,class:"inline-flex items-center gap-1 rounded-full bg-gray-100 px-3 py-1 text-sm text-gray-700 transition-colors hover:bg-blue-100 hover:text-blue-700 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-blue-900/30 dark:hover:text-blue-400",type:"button",onClick:oe=>f(x)},[n[59]||(n[59]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),A(" "+u(x),1)],8,Da))),128))])])):h("",!0),e("div",null,[n[62]||(n[62]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",Sa,[T(e("input",{"onUpdate:modelValue":n[6]||(n[6]=x=>H.value=x),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",placeholder:"输入新标签名称",type:"text",onKeypress:Je(we(ye,["prevent"]),["enter"])},null,40,Ta),[[se,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:ye},n[61]||(n[61]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),n[63]||(n[63]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 用于标记不同团队或用途,方便筛选管理 ",-1))])]),e("div",_a,[n[72]||(n[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",Ma,[e("div",Pa,[e("div",null,[n[65]||(n[65]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"时间窗口 (分钟)",-1)),T(e("input",{"onUpdate:modelValue":n[7]||(n[7]=x=>t.rateLimitWindow=x),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"1",placeholder:"无限制",type:"number"},null,512),[[se,t.rateLimitWindow]]),n[66]||(n[66]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"时间段单位",-1))]),e("div",null,[n[67]||(n[67]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"请求次数限制",-1)),T(e("input",{"onUpdate:modelValue":n[8]||(n[8]=x=>t.rateLimitRequests=x),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"1",placeholder:"无限制",type:"number"},null,512),[[se,t.rateLimitRequests]]),n[68]||(n[68]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大请求",-1))]),e("div",null,[n[69]||(n[69]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),T(e("input",{"onUpdate:modelValue":n[9]||(n[9]=x=>t.rateLimitCost=x),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"无限制",step:"0.01",type:"number"},null,512),[[se,t.rateLimitCost]]),n[70]||(n[70]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大费用",-1))])]),n[71]||(n[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:"),A(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求 ")]),e("div",null,[e("strong",null,"示例2:"),A(" 时间窗口=1,费用=0.1 → 每分钟最多$0.1费用")]),e("div",null,[e("strong",null,"示例3:"),A(" 窗口=30,请求=50,费用=5 → 每30分钟50次请求且不超$5费用 ")])])],-1))])]),e("div",null,[n[74]||(n[74]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"每日费用限制 (美元)",-1)),e("div",Va,[e("div",Ra,[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:n[10]||(n[10]=x=>t.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:n[11]||(n[11]=x=>t.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:n[12]||(n[12]=x=>t.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:n[13]||(n[13]=x=>t.dailyCostLimit="")}," 自定义 ")]),T(e("input",{"onUpdate:modelValue":n[14]||(n[14]=x=>t.dailyCostLimit=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[se,t.dailyCostLimit]]),n[73]||(n[73]=e("p",{class:"dark:text灰-400 text-xs text-gray-500"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[n[76]||(n[76]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"总费用限制 (美元)",-1)),e("div",Ua,[e("div",Oa,[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:n[15]||(n[15]=x=>t.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:n[16]||(n[16]=x=>t.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:n[17]||(n[17]=x=>t.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:n[18]||(n[18]=x=>t.totalCostLimit="")}," 自定义 ")]),T(e("input",{"onUpdate:modelValue":n[19]||(n[19]=x=>t.totalCostLimit=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[se,t.totalCostLimit]]),n[75]||(n[75]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 的累计总费用限制,达到限制后将拒绝所有后续请求,0 或留空表示无限制 ",-1))])]),e("div",null,[n[78]||(n[78]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"Opus 模型周费用限制 (美元)",-1)),e("div",Ea,[e("div",ja,[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:n[20]||(n[20]=x=>t.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:n[21]||(n[21]=x=>t.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:n[22]||(n[22]=x=>t.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:n[23]||(n[23]=x=>t.weeklyOpusCostLimit="")}," 自定义 ")]),T(e("input",{"onUpdate:modelValue":n[24]||(n[24]=x=>t.weeklyOpusCostLimit=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[se,t.weeklyOpusCostLimit]]),n[77]||(n[77]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户,0 或留空表示无限制 ",-1))])]),e("div",null,[n[79]||(n[79]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制 (可选)",-1)),T(e("input",{"onUpdate:modelValue":n[25]||(n[25]=x=>t.concurrencyLimit=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",min:"0",placeholder:"0 表示无限制",type:"number"},null,512),[[se,t.concurrencyLimit]]),n[80]||(n[80]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 可同时处理的最大请求数,0 或留空表示无限制 ",-1))]),e("div",null,[n[81]||(n[81]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"备注 (可选)",-1)),T(e("textarea",{"onUpdate:modelValue":n[26]||(n[26]=x=>t.description=x),class:"form-input w-full resize-none border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:placeholder-gray-400",placeholder:"描述此 API Key 的用途...",rows:"2"},null,512),[[se,t.description]])]),e("div",null,[n[89]||(n[89]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"过期设置",-1)),e("div",Ga,[e("div",qa,[e("label",za,[T(e("input",{"onUpdate:modelValue":n[27]||(n[27]=x=>t.expirationMode=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"fixed"},null,512),[[de,t.expirationMode]]),n[82]||(n[82]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"固定时间过期",-1))]),e("label",Fa,[T(e("input",{"onUpdate:modelValue":n[28]||(n[28]=x=>t.expirationMode=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"activation"},null,512),[[de,t.expirationMode]]),n[83]||(n[83]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"首次使用后激活",-1))])]),e("p",Ba,[t.expirationMode==="fixed"?(i(),d("span",Wa,n[84]||(n[84]=[e("i",{class:"fas fa-info-circle mr-1"},null,-1),A(" 固定时间模式:Key 创建后立即生效,按设定时间过期(支持小时和天数) ",-1)]))):(i(),d("span",Na,n[85]||(n[85]=[e("i",{class:"fas fa-info-circle mr-1"},null,-1),A(" 激活模式:Key 首次使用时激活,激活后按设定时间过期(支持小时和天数,适合批量销售) ",-1)])))])]),t.expirationMode==="fixed"?(i(),d("div",Ha,[T(e("select",{"onUpdate:modelValue":n[29]||(n[29]=x=>t.expireDuration=x),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",onChange:z},n[86]||(n[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),[[Xe,t.expireDuration]]),t.expireDuration==="custom"?(i(),d("div",Ya,[T(e("input",{"onUpdate:modelValue":n[30]||(n[30]=x=>t.customExpireDate=x),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:$},null,40,Qa),[[se,t.customExpireDate]])])):h("",!0),t.expiresAt?(i(),d("p",Ja," 将于 "+u(L(t.expiresAt))+" 过期 ",1)):h("",!0)])):(i(),d("div",Xa,[e("div",Za,[T(e("input",{"onUpdate:modelValue":n[31]||(n[31]=x=>t.activationDays=x),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",max:t.activationUnit==="hours"?8760:3650,min:"1",placeholder:t.activationUnit==="hours"?"输入小时数":"输入天数",type:"number"},null,8,er),[[se,t.activationDays,void 0,{number:!0}]]),T(e("select",{"onUpdate:modelValue":n[32]||(n[32]=x=>t.activationUnit=x),class:"form-input w-20 border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",onChange:p},n[87]||(n[87]=[e("option",{value:"hours"},"小时",-1),e("option",{value:"days"},"天",-1)]),544),[[Xe,t.activationUnit]])]),e("div",tr,[(i(!0),d(ae,null,ie(l(),x=>(i(),d("button",{key:x.value,class:"rounded-md border border-gray-300 px-3 py-1 text-xs hover:bg-gray-100 dark:border-gray-600 dark:hover:bg-gray-700",type:"button",onClick:oe=>t.activationDays=x.value},u(x.label),9,sr))),128))]),e("p",ar,[n[88]||(n[88]=e("i",{class:"fas fa-clock mr-1"},null,-1)),A(" Key 将在首次使用后激活,激活后 "+u(t.activationDays||(t.activationUnit==="hours"?24:30))+" "+u(t.activationUnit==="hours"?"小时":"天")+"过期 ",1)])]))]),e("div",null,[n[95]||(n[95]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",rr,[e("label",or,[T(e("input",{"onUpdate:modelValue":n[33]||(n[33]=x=>t.permissions=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"all"},null,512),[[de,t.permissions]]),n[90]||(n[90]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"全部服务",-1))]),e("label",lr,[T(e("input",{"onUpdate:modelValue":n[34]||(n[34]=x=>t.permissions=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"claude"},null,512),[[de,t.permissions]]),n[91]||(n[91]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Claude",-1))]),e("label",nr,[T(e("input",{"onUpdate:modelValue":n[35]||(n[35]=x=>t.permissions=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"gemini"},null,512),[[de,t.permissions]]),n[92]||(n[92]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Gemini",-1))]),e("label",ir,[T(e("input",{"onUpdate:modelValue":n[36]||(n[36]=x=>t.permissions=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"openai"},null,512),[[de,t.permissions]]),n[93]||(n[93]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 OpenAI",-1))]),e("label",dr,[T(e("input",{"onUpdate:modelValue":n[37]||(n[37]=x=>t.permissions=x),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"droid"},null,512),[[de,t.permissions]]),n[94]||(n[94]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Droid",-1))])]),n[96]||(n[96]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 控制此 API Key 可以访问哪些服务 ",-1))]),e("div",null,[e("div",ur,[n[97]||(n[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:q.value,title:"刷新账号列表",type:"button",onClick:U},[e("i",{class:j(["fas",q.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,u(q.value?"刷新中...":"刷新账号"),1)],8,cr)]),e("div",gr,[e("div",null,[n[98]||(n[98]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),ne(ve,{modelValue:t.claudeAccountId,"onUpdate:modelValue":n[38]||(n[38]=x=>t.claudeAccountId=x),accounts:P.value.claude,"default-option-text":"使用共享账号池",disabled:t.permissions!=="all"&&t.permissions!=="claude",groups:P.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[n[99]||(n[99]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),ne(ve,{modelValue:t.geminiAccountId,"onUpdate:modelValue":n[39]||(n[39]=x=>t.geminiAccountId=x),accounts:P.value.gemini,"default-option-text":"使用共享账号池",disabled:t.permissions!=="all"&&t.permissions!=="gemini",groups:P.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[n[100]||(n[100]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),ne(ve,{modelValue:t.openaiAccountId,"onUpdate:modelValue":n[40]||(n[40]=x=>t.openaiAccountId=x),accounts:P.value.openai,"default-option-text":"使用共享账号池",disabled:t.permissions!=="all"&&t.permissions!=="openai",groups:P.value.openaiGroups,placeholder:"请选择OpenAI账号",platform:"openai"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[n[101]||(n[101]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),ne(ve,{modelValue:t.bedrockAccountId,"onUpdate:modelValue":n[41]||(n[41]=x=>t.bedrockAccountId=x),accounts:P.value.bedrock,"default-option-text":"使用共享账号池",disabled:t.permissions!=="all"&&t.permissions!=="openai",groups:[],placeholder:"请选择Bedrock账号",platform:"bedrock"},null,8,["modelValue","accounts","disabled"])]),e("div",null,[n[102]||(n[102]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),ne(ve,{modelValue:t.droidAccountId,"onUpdate:modelValue":n[42]||(n[42]=x=>t.droidAccountId=x),accounts:P.value.droid,"default-option-text":"使用共享账号池",disabled:t.permissions!=="all"&&t.permissions!=="droid",groups:P.value.droidGroups,placeholder:"请选择Droid账号",platform:"droid"},null,8,["modelValue","accounts","disabled","groups"])])]),n[103]||(n[103]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 选择专属账号后,此API Key将只使用该账号,不选择则使用共享账号池 ",-1))]),e("div",null,[e("div",pr,[T(e("input",{id:"enableModelRestriction","onUpdate:modelValue":n[43]||(n[43]=x=>t.enableModelRestriction=x),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[Le,t.enableModelRestriction]]),n[104]||(n[104]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"enableModelRestriction"}," 启用模型限制 ",-1))]),t.enableModelRestriction?(i(),d("div",mr,[e("div",null,[n[107]||(n[107]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600"},"限制的模型列表",-1)),e("div",xr,[(i(!0),d(ae,null,ie(t.restrictedModels,(x,oe)=>(i(),d("span",{key:oe,class:"inline-flex items-center rounded-full bg-red-100 px-3 py-1 text-sm text-red-800"},[A(u(x)+" ",1),e("button",{class:"ml-2 text-red-600 hover:text-red-800",type:"button",onClick:pe=>J(oe)},n[105]||(n[105]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,yr)]))),128)),t.restrictedModels.length===0?(i(),d("span",fr," 暂无限制的模型 ")):h("",!0)]),e("div",br,[e("div",vr,[(i(!0),d(ae,null,ie(ue.value,x=>(i(),d("button",{key:x,class:"flex-shrink-0 rounded-lg bg-gray-100 px-3 py-1 text-xs text-gray-700 transition-colors hover:bg-gray-200 sm:text-sm",type:"button",onClick:oe=>Y(x)},u(x),9,kr))),128)),ue.value.length===0?(i(),d("span",wr," 所有常用模型已在限制列表中 ")):h("",!0)]),e("div",hr,[T(e("input",{"onUpdate:modelValue":n[44]||(n[44]=x=>t.modelInput=x),class:"form-input flex-1",placeholder:"输入模型名称,按回车添加",type:"text",onKeydown:Je(we(ee,["prevent"]),["enter"])},null,40,Ar),[[se,t.modelInput]]),e("button",{class:"rounded-lg bg-red-500 px-4 py-2 text-white transition-colors hover:bg-red-600",type:"button",onClick:ee},n[106]||(n[106]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),n[108]||(n[108]=e("p",{class:"mt-2 text-xs text-gray-500"}," 设置此API Key无法访问的模型,例如:claude-opus-4-20250514 ",-1))])])):h("",!0)]),e("div",null,[e("div",$r,[T(e("input",{id:"enableClientRestriction","onUpdate:modelValue":n[45]||(n[45]=x=>t.enableClientRestriction=x),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[Le,t.enableClientRestriction]]),n[109]||(n[109]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"enableClientRestriction"}," 启用客户端限制 ",-1))]),t.enableClientRestriction?(i(),d("div",Cr,[e("div",null,[n[110]||(n[110]=e("label",{class:"mb-2 block text-xs font-medium text-gray-700 dark:text-gray-300"},"允许的客户端",-1)),e("div",Ir,[(i(!0),d(ae,null,ie(m.value,x=>(i(),d("div",{key:x.id,class:"flex items-start"},[T(e("input",{id:`client_${x.id}`,"onUpdate:modelValue":n[46]||(n[46]=oe=>t.allowedClients=oe),class:"mt-0.5 h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox",value:x.id},null,8,Kr),[[Le,t.allowedClients]]),e("label",{class:"ml-2 flex-1 cursor-pointer",for:`client_${x.id}`},[e("span",Dr,u(x.name),1),e("span",Sr,u(x.description),1)],8,Lr)]))),128))])])])):h("",!0)]),e("div",Tr,[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:n[47]||(n[47]=x=>w.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-4 py-2.5 text-sm font-semibold",disabled:V.value,type:"submit"},[V.value?(i(),d("div",Mr)):(i(),d("i",Pr)),A(" "+u(V.value?"创建中...":"创建"),1)],8,_r)])],32)])])]))}},Rr=Ke(Vr,[["__scopeId","data-v-4adaa454"]]),Ur={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},Or={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6 md:p-8"},Er={class:"mb-4 flex items-center justify-between sm:mb-6"},jr=["value"],Gr={key:0,class:"text-gray-500"},qr={class:"space-y-4"},zr={key:0},Fr={class:"flex flex-wrap gap-2"},Br=["onClick"],Wr={key:1},Nr={class:"flex flex-wrap gap-2"},Hr=["onClick"],Yr={class:"flex gap-2"},Qr=["onKeypress"],Jr={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},Xr={class:"space-y-2"},Zr={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},eo={class:"space-y-3"},to={class:"flex gap-2"},so={class:"space-y-3"},ao={class:"flex gap-2"},ro={class:"space-y-3"},oo={class:"flex gap-2"},lo={class:"mb-3 flex items-center"},no={class:"flex gap-4"},io={class:"flex cursor-pointer items-center"},uo={class:"flex cursor-pointer items-center"},co={class:"flex cursor-pointer items-center"},go={class:"flex cursor-pointer items-center"},po={class:"flex cursor-pointer items-center"},mo={class:"mb-3 flex items-center justify-between"},xo=["disabled"],yo={class:"grid grid-cols-1 gap-3"},fo={class:"mb-3 flex items-center"},bo={key:0,class:"space-y-3"},vo={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"},ko=["onClick"],wo={key:0,class:"text-sm text-gray-400 dark:text-gray-500"},ho={class:"space-y-3"},Ao={class:"flex flex-wrap gap-2"},$o=["onClick"],Co={key:0,class:"text-sm italic text-gray-400 dark:text-gray-500"},Io={class:"flex gap-2"},Ko=["onKeydown"],Lo={class:"mb-3 flex items-center"},Do={key:0,class:"space-y-3"},So={class:"space-y-2"},To=["id","value"],_o=["for"],Mo={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},Po={class:"block text-xs text-gray-500 dark:text-gray-400"},Vo={class:"flex gap-3 pt-4"},Ro=["disabled"],Uo={key:0,class:"loading-spinner mr-2"},Oo={key:1,class:"fas fa-save mr-2"},Eo={__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(b,{emit:B}){const c=b,R=B,F=ht(),C=At(),V=M(!1),q=M(!1),P=M({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),Q=M([]),H=M([]),v=M(""),D=M([]),m=E(()=>D.value.filter(f=>!t.tags.includes(f))),t=Fe({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:""}),U=()=>{t.modelInput&&!t.restrictedModels.includes(t.modelInput)&&(t.restrictedModels.push(t.modelInput),t.modelInput="")},_=f=>{t.restrictedModels.splice(f,1)},z=M(["claude-opus-4-20250514","claude-opus-4-1-20250805"]),$=E(()=>z.value.filter(f=>!t.restrictedModels.includes(f))),L=f=>{t.restrictedModels.includes(f)||t.restrictedModels.push(f)},ee=()=>{if(v.value&&v.value.trim()){const f=v.value.trim();t.tags.includes(f)||t.tags.push(f),v.value=""}},J=f=>{t.tags.includes(f)||t.tags.push(f)},ge=f=>{t.tags.splice(f,1)},ue=async()=>{if(t.rateLimitWindow&&(!t.rateLimitCost||parseFloat(t.rateLimitCost)===0)){let f=!1;if(window.showConfirm?f=await window.showConfirm("费用限制提醒",`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
|
||
是否继续?`,"继续保存","返回修改"):f=confirm(`您设置了时间窗口但费用限制为0,这意味着不会有费用限制。
|
||
是否继续?`),!f)return}V.value=!0;try{const f={name:t.name,tokenLimit:0,rateLimitWindow:t.rateLimitWindow!==""&&t.rateLimitWindow!==null?parseInt(t.rateLimitWindow):0,rateLimitRequests:t.rateLimitRequests!==""&&t.rateLimitRequests!==null?parseInt(t.rateLimitRequests):0,rateLimitCost:t.rateLimitCost!==""&&t.rateLimitCost!==null?parseFloat(t.rateLimitCost):0,concurrencyLimit:t.concurrencyLimit!==""&&t.concurrencyLimit!==null?parseInt(t.concurrencyLimit):0,dailyCostLimit:t.dailyCostLimit!==""&&t.dailyCostLimit!==null?parseFloat(t.dailyCostLimit):0,totalCostLimit:t.totalCostLimit!==""&&t.totalCostLimit!==null?parseFloat(t.totalCostLimit):0,weeklyOpusCostLimit:t.weeklyOpusCostLimit!==""&&t.weeklyOpusCostLimit!==null?parseFloat(t.weeklyOpusCostLimit):0,permissions:t.permissions,tags:t.tags};t.claudeAccountId?t.claudeAccountId.startsWith("console:")?(f.claudeConsoleAccountId=t.claudeAccountId.substring(8),f.claudeAccountId=null):(t.claudeAccountId.startsWith("group:"),f.claudeAccountId=t.claudeAccountId,f.claudeConsoleAccountId=null):(f.claudeAccountId=null,f.claudeConsoleAccountId=null),t.geminiAccountId?f.geminiAccountId=t.geminiAccountId:f.geminiAccountId=null,t.openaiAccountId?f.openaiAccountId=t.openaiAccountId:f.openaiAccountId=null,t.bedrockAccountId?f.bedrockAccountId=t.bedrockAccountId:f.bedrockAccountId=null,t.droidAccountId?f.droidAccountId=t.droidAccountId:f.droidAccountId=null,f.enableModelRestriction=t.enableModelRestriction,f.restrictedModels=t.restrictedModels,f.enableClientRestriction=t.enableClientRestriction,f.allowedClients=t.allowedClients,f.isActive=t.isActive,t.ownerId!==void 0&&(f.ownerId=t.ownerId);const o=await G.put(`/admin/api-keys/${c.apiKey.id}`,f);o.success?(R("success"),R("close")):O(o.message||"更新失败","error")}catch{O("更新失败","error")}finally{V.value=!1}},Y=async()=>{var f,o;q.value=!0;try{const[l,p,I,w,n,x,oe,pe]=await Promise.all([G.get("/admin/claude-accounts"),G.get("/admin/claude-console-accounts"),G.get("/admin/gemini-accounts"),G.get("/admin/openai-accounts"),G.get("/admin/openai-responses-accounts"),G.get("/admin/bedrock-accounts"),G.get("/admin/droid-accounts"),G.get("/admin/account-groups")]),X=[];l.success&&((f=l.data)==null||f.forEach(N=>{X.push({...N,platform:"claude-oauth",isDedicated:N.accountType==="dedicated"})})),p.success&&((o=p.data)==null||o.forEach(N=>{X.push({...N,platform:"claude-console",isDedicated:N.accountType==="dedicated"})})),P.value.claude=X,I.success&&(P.value.gemini=(I.data||[]).map(N=>({...N,isDedicated:N.accountType==="dedicated"})));const te=[];if(w.success&&(w.data||[]).forEach(N=>{te.push({...N,platform:"openai",isDedicated:N.accountType==="dedicated"})}),n.success&&(n.data||[]).forEach(N=>{te.push({...N,platform:"openai-responses",isDedicated:N.accountType==="dedicated"})}),P.value.openai=te,x.success&&(P.value.bedrock=(x.data||[]).map(N=>({...N,isDedicated:N.accountType==="dedicated"}))),oe.success&&(P.value.droid=(oe.data||[]).map(N=>({...N,platform:"droid",isDedicated:N.accountType==="dedicated"}))),pe.success){const N=pe.data||[];P.value.claudeGroups=N.filter(xe=>xe.platform==="claude"),P.value.geminiGroups=N.filter(xe=>xe.platform==="gemini"),P.value.openaiGroups=N.filter(xe=>xe.platform==="openai"),P.value.droidGroups=N.filter(xe=>xe.platform==="droid")}O("账号列表已刷新","success")}catch{O("刷新账号列表失败","error")}finally{q.value=!1}},ye=async()=>{try{const f=await G.get("/admin/users");f.success&&(H.value=f.data||[])}catch{H.value=[{id:"admin",username:"admin",displayName:"Admin",email:"",role:"admin"}]}};return Ze(async()=>{try{const[f,o]=await Promise.all([F.loadSupportedClients(),C.fetchTags(),ye()]);Q.value=f||[],D.value=o||[]}catch{Q.value=[],D.value=[]}if(c.accounts){const f=[];c.accounts.openai&&c.accounts.openai.forEach(o=>{f.push({...o,platform:"openai"})}),c.accounts.openaiResponses&&c.accounts.openaiResponses.forEach(o=>{f.push({...o,platform:"openai-responses"})}),P.value={claude:c.accounts.claude||[],gemini:c.accounts.gemini||[],openai:f,bedrock:c.accounts.bedrock||[],droid:(c.accounts.droid||[]).map(o=>({...o,platform:"droid"})),claudeGroups:c.accounts.claudeGroups||[],geminiGroups:c.accounts.geminiGroups||[],openaiGroups:c.accounts.openaiGroups||[],droidGroups:c.accounts.droidGroups||[]}}await Y(),t.name=c.apiKey.name,t.tokenLimit=c.apiKey.tokenLimit||"",t.rateLimitCost=c.apiKey.rateLimitCost||"",c.apiKey.tokenLimit>0&&c.apiKey.rateLimitCost,t.rateLimitWindow=c.apiKey.rateLimitWindow||"",t.rateLimitRequests=c.apiKey.rateLimitRequests||"",t.concurrencyLimit=c.apiKey.concurrencyLimit||"",t.dailyCostLimit=c.apiKey.dailyCostLimit||"",t.totalCostLimit=c.apiKey.totalCostLimit||"",t.weeklyOpusCostLimit=c.apiKey.weeklyOpusCostLimit||"",t.permissions=c.apiKey.permissions||"all",c.apiKey.claudeConsoleAccountId?t.claudeAccountId=`console:${c.apiKey.claudeConsoleAccountId}`:t.claudeAccountId=c.apiKey.claudeAccountId||"",t.geminiAccountId=c.apiKey.geminiAccountId||"",t.openaiAccountId=c.apiKey.openaiAccountId||"",t.bedrockAccountId=c.apiKey.bedrockAccountId||"",t.droidAccountId=c.apiKey.droidAccountId||"",t.restrictedModels=c.apiKey.restrictedModels||[],t.allowedClients=c.apiKey.allowedClients||[],t.tags=c.apiKey.tags||[],t.enableModelRestriction=c.apiKey.enableModelRestriction||!1,t.enableClientRestriction=c.apiKey.enableClientRestriction||!1,t.isActive=c.apiKey.isActive!==void 0?c.apiKey.isActive:!0,t.ownerId=c.apiKey.userId||"admin"}),(f,o)=>(i(),me(Te,{to:"body"},[e("div",Ur,[e("div",Or,[e("div",Er,[o[40]||(o[40]=e("div",{class:"flex items-center gap-2 sm:gap-3"},[e("div",{class:"flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-blue-600 sm:h-10 sm:w-10 sm:rounded-xl"},[e("i",{class:"fas fa-edit text-sm text-white sm:text-base"})]),e("h3",{class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"}," 编辑 API Key ")],-1)),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300",onClick:o[0]||(o[0]=l=>f.$emit("close"))},o[39]||(o[39]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),e("form",{class:"modal-scroll-content custom-scrollbar flex-1 space-y-4 sm:space-y-6",onSubmit:we(ue,["prevent"])},[e("div",null,[o[41]||(o[41]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-3 sm:text-sm"},"名称",-1)),e("div",null,[T(e("input",{"onUpdate:modelValue":o[1]||(o[1]=l=>t.name=l),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),[[se,t.name]])]),o[42]||(o[42]=e("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400 sm:mt-2"}," 用于识别此 API Key 的用途 ",-1))]),e("div",null,[o[43]||(o[43]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-3 sm:text-sm"},"所有者",-1)),T(e("select",{"onUpdate:modelValue":o[2]||(o[2]=l=>t.ownerId=l),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200"},[(i(!0),d(ae,null,ie(H.value,l=>(i(),d("option",{key:l.id,value:l.id},[A(u(l.displayName)+" ("+u(l.username)+") ",1),l.role==="admin"?(i(),d("span",Gr,"- 管理员")):h("",!0)],8,jr))),128))],512),[[Xe,t.ownerId]]),o[44]||(o[44]=e("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400 sm:mt-2"}," 分配此 API Key 给指定用户或管理员,管理员分配时不受用户 API Key 数量限制 ",-1))]),e("div",null,[o[52]||(o[52]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 dark:text-gray-300 sm:mb-3 sm:text-sm"},"标签",-1)),e("div",qr,[t.tags.length>0?(i(),d("div",zr,[o[46]||(o[46]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 已选择的标签: ",-1)),e("div",Fr,[(i(!0),d(ae,null,ie(t.tags,(l,p)=>(i(),d("span",{key:"selected-"+p,class:"inline-flex items-center gap-1 rounded-full bg-blue-100 px-3 py-1 text-sm text-blue-800 dark:bg-blue-900/30 dark:text-blue-400"},[A(u(l)+" ",1),e("button",{class:"ml-1 hover:text-blue-900 dark:hover:text-blue-300",type:"button",onClick:I=>ge(p)},o[45]||(o[45]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,Br)]))),128))])])):h("",!0),m.value.length>0?(i(),d("div",Wr,[o[48]||(o[48]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",Nr,[(i(!0),d(ae,null,ie(m.value,l=>(i(),d("button",{key:"available-"+l,class:"inline-flex items-center gap-1 rounded-full bg-gray-100 px-3 py-1 text-sm text-gray-700 transition-colors hover:bg-blue-100 hover:text-blue-700 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-blue-900/30 dark:hover:text-blue-400",type:"button",onClick:p=>J(l)},[o[47]||(o[47]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),A(" "+u(l),1)],8,Hr))),128))])])):h("",!0),e("div",null,[o[50]||(o[50]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",Yr,[T(e("input",{"onUpdate:modelValue":o[3]||(o[3]=l=>v.value=l),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:Je(we(ee,["prevent"]),["enter"])},null,40,Qr),[[se,v.value]]),e("button",{class:"rounded-lg bg-green-500 px-4 py-2 text-white transition-colors hover:bg-green-600",type:"button",onClick:ee},o[49]||(o[49]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),o[51]||(o[51]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 用于标记不同团队或用途,方便筛选管理 ",-1))])]),e("div",Jr,[o[60]||(o[60]=e("div",{class:"mb-2 flex items-center gap-2"},[e("div",{class:"flex h-6 w-6 flex-shrink-0 items-center justify-center rounded bg-blue-500"},[e("i",{class:"fas fa-tachometer-alt text-xs text-white"})]),e("h4",{class:"text-sm font-semibold text-gray-800 dark:text-gray-200"}," 速率限制设置 (可选) ")],-1)),e("div",Xr,[e("div",Zr,[e("div",null,[o[53]||(o[53]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"时间窗口 (分钟)",-1)),T(e("input",{"onUpdate:modelValue":o[4]||(o[4]=l=>t.rateLimitWindow=l),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),[[se,t.rateLimitWindow]]),o[54]||(o[54]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"时间段单位",-1))]),e("div",null,[o[55]||(o[55]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"请求次数限制",-1)),T(e("input",{"onUpdate:modelValue":o[5]||(o[5]=l=>t.rateLimitRequests=l),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),[[se,t.rateLimitRequests]]),o[56]||(o[56]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大请求",-1))]),e("div",null,[o[57]||(o[57]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),T(e("input",{"onUpdate:modelValue":o[6]||(o[6]=l=>t.rateLimitCost=l),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),[[se,t.rateLimitCost]]),o[58]||(o[58]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500 dark:text-gray-400"},"窗口内最大费用",-1))])]),o[59]||(o[59]=e("div",{class:"rounded-lg bg-blue-100 p-2 dark:bg-blue-900/30"},[e("h5",{class:"mb-1 text-xs font-semibold text-blue-800 dark:text-blue-400"}," 💡 使用示例 "),e("div",{class:"space-y-0.5 text-xs text-blue-700 dark:text-blue-300"},[e("div",null,[e("strong",null,"示例1:"),A(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求 ")]),e("div",null,[e("strong",null,"示例2:"),A(" 时间窗口=1,费用=0.1 → 每分钟最多$0.1费用")]),e("div",null,[e("strong",null,"示例3:"),A(" 窗口=30,请求=50,费用=5 → 每30分钟50次请求且不超$5费用 ")])])],-1))])]),e("div",null,[o[62]||(o[62]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"每日费用限制 (美元)",-1)),e("div",eo,[e("div",to,[e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[7]||(o[7]=l=>t.dailyCostLimit="50")}," $50 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[8]||(o[8]=l=>t.dailyCostLimit="100")}," $100 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[9]||(o[9]=l=>t.dailyCostLimit="200")}," $200 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[10]||(o[10]=l=>t.dailyCostLimit="")}," 自定义 ")]),T(e("input",{"onUpdate:modelValue":o[11]||(o[11]=l=>t.dailyCostLimit=l),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),[[se,t.dailyCostLimit]]),o[61]||(o[61]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[o[64]||(o[64]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"总费用限制 (美元)",-1)),e("div",so,[e("div",ao,[e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[12]||(o[12]=l=>t.totalCostLimit="100")}," $100 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[13]||(o[13]=l=>t.totalCostLimit="500")}," $500 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[14]||(o[14]=l=>t.totalCostLimit="1000")}," $1000 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[15]||(o[15]=l=>t.totalCostLimit="")}," 自定义 ")]),T(e("input",{"onUpdate:modelValue":o[16]||(o[16]=l=>t.totalCostLimit=l),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),[[se,t.totalCostLimit]]),o[63]||(o[63]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 的累计总费用限制,达到限制后将拒绝所有后续请求,0 或留空表示无限制 ",-1))])]),e("div",null,[o[66]||(o[66]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"Opus 模型周费用限制 (美元)",-1)),e("div",ro,[e("div",oo,[e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[17]||(o[17]=l=>t.weeklyOpusCostLimit="100")}," $100 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[18]||(o[18]=l=>t.weeklyOpusCostLimit="500")}," $500 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[19]||(o[19]=l=>t.weeklyOpusCostLimit="1000")}," $1000 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[20]||(o[20]=l=>t.weeklyOpusCostLimit="")}," 自定义 ")]),T(e("input",{"onUpdate:modelValue":o[21]||(o[21]=l=>t.weeklyOpusCostLimit=l),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),[[se,t.weeklyOpusCostLimit]]),o[65]||(o[65]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户,0 或留空表示无限制 ",-1))])]),e("div",null,[o[67]||(o[67]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制",-1)),T(e("input",{"onUpdate:modelValue":o[22]||(o[22]=l=>t.concurrencyLimit=l),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),[[se,t.concurrencyLimit]]),o[68]||(o[68]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 设置此 API Key 可同时处理的最大请求数 ",-1))]),e("div",null,[e("div",lo,[T(e("input",{id:"editIsActive","onUpdate:modelValue":o[23]||(o[23]=l=>t.isActive=l),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox"},null,512),[[Le,t.isActive]]),o[69]||(o[69]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"editIsActive"}," 激活账号 ",-1))]),o[70]||(o[70]=e("p",{class:"mb-4 text-xs text-gray-500 dark:text-gray-400"}," 取消勾选将禁用此 API Key,暂停所有请求,客户端返回 401 错误 ",-1))]),e("div",null,[o[76]||(o[76]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",no,[e("label",io,[T(e("input",{"onUpdate:modelValue":o[24]||(o[24]=l=>t.permissions=l),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"all"},null,512),[[de,t.permissions]]),o[71]||(o[71]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"全部服务",-1))]),e("label",uo,[T(e("input",{"onUpdate:modelValue":o[25]||(o[25]=l=>t.permissions=l),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"claude"},null,512),[[de,t.permissions]]),o[72]||(o[72]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Claude",-1))]),e("label",co,[T(e("input",{"onUpdate:modelValue":o[26]||(o[26]=l=>t.permissions=l),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"gemini"},null,512),[[de,t.permissions]]),o[73]||(o[73]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Gemini",-1))]),e("label",go,[T(e("input",{"onUpdate:modelValue":o[27]||(o[27]=l=>t.permissions=l),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"openai"},null,512),[[de,t.permissions]]),o[74]||(o[74]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 OpenAI",-1))]),e("label",po,[T(e("input",{"onUpdate:modelValue":o[28]||(o[28]=l=>t.permissions=l),class:"mr-2 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"radio",value:"droid"},null,512),[[de,t.permissions]]),o[75]||(o[75]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"仅 Droid",-1))])]),o[77]||(o[77]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 控制此 API Key 可以访问哪些服务 ",-1))]),e("div",null,[e("div",mo,[o[78]||(o[78]=e("label",{class:"text-sm font-semibold text-gray-700 dark:text-gray-300"},"专属账号绑定",-1)),e("button",{class:"flex items-center gap-1 text-sm text-blue-600 transition-colors hover:text-blue-800 disabled:cursor-not-allowed disabled:opacity-50 dark:text-blue-400 dark:hover:text-blue-300",disabled:q.value,title:"刷新账号列表",type:"button",onClick:Y},[e("i",{class:j(["fas",q.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,u(q.value?"刷新中...":"刷新账号"),1)],8,xo)]),e("div",yo,[e("div",null,[o[79]||(o[79]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),ne(ve,{modelValue:t.claudeAccountId,"onUpdate:modelValue":o[29]||(o[29]=l=>t.claudeAccountId=l),accounts:P.value.claude,"default-option-text":"使用共享账号池",disabled:t.permissions!=="all"&&t.permissions!=="claude",groups:P.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[o[80]||(o[80]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),ne(ve,{modelValue:t.geminiAccountId,"onUpdate:modelValue":o[30]||(o[30]=l=>t.geminiAccountId=l),accounts:P.value.gemini,"default-option-text":"使用共享账号池",disabled:t.permissions!=="all"&&t.permissions!=="gemini",groups:P.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[o[81]||(o[81]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),ne(ve,{modelValue:t.openaiAccountId,"onUpdate:modelValue":o[31]||(o[31]=l=>t.openaiAccountId=l),accounts:P.value.openai,"default-option-text":"使用共享账号池",disabled:t.permissions!=="all"&&t.permissions!=="openai",groups:P.value.openaiGroups,placeholder:"请选择OpenAI账号",platform:"openai"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[o[82]||(o[82]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),ne(ve,{modelValue:t.bedrockAccountId,"onUpdate:modelValue":o[32]||(o[32]=l=>t.bedrockAccountId=l),accounts:P.value.bedrock,"default-option-text":"使用共享账号池",disabled:t.permissions!=="all"&&t.permissions!=="openai",groups:[],placeholder:"请选择Bedrock账号",platform:"bedrock"},null,8,["modelValue","accounts","disabled"])]),e("div",null,[o[83]||(o[83]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),ne(ve,{modelValue:t.droidAccountId,"onUpdate:modelValue":o[33]||(o[33]=l=>t.droidAccountId=l),accounts:P.value.droid,"default-option-text":"使用共享账号池",disabled:t.permissions!=="all"&&t.permissions!=="droid",groups:P.value.droidGroups,placeholder:"请选择Droid账号",platform:"droid"},null,8,["modelValue","accounts","disabled","groups"])])]),o[84]||(o[84]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 修改绑定账号将影响此API Key的请求路由 ",-1))]),e("div",null,[e("div",fo,[T(e("input",{id:"editEnableModelRestriction","onUpdate:modelValue":o[34]||(o[34]=l=>t.enableModelRestriction=l),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox"},null,512),[[Le,t.enableModelRestriction]]),o[85]||(o[85]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"editEnableModelRestriction"}," 启用模型限制 ",-1))]),t.enableModelRestriction?(i(),d("div",bo,[e("div",null,[o[88]||(o[88]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600 dark:text-gray-400"},"限制的模型列表",-1)),e("div",vo,[(i(!0),d(ae,null,ie(t.restrictedModels,(l,p)=>(i(),d("span",{key:p,class:"inline-flex items-center rounded-full bg-red-100 px-3 py-1 text-sm text-red-800 dark:bg-red-900/30 dark:text-red-400"},[A(u(l)+" ",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:I=>_(p)},o[86]||(o[86]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,ko)]))),128)),t.restrictedModels.length===0?(i(),d("span",wo," 暂无限制的模型 ")):h("",!0)]),e("div",ho,[e("div",Ao,[(i(!0),d(ae,null,ie($.value,l=>(i(),d("button",{key:l,class:"flex-shrink-0 rounded-lg bg-gray-100 px-3 py-1 text-xs text-gray-700 transition-colors hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600 sm:text-sm",type:"button",onClick:p=>L(l)},u(l),9,$o))),128)),$.value.length===0?(i(),d("span",Co," 所有常用模型已在限制列表中 ")):h("",!0)]),e("div",Io,[T(e("input",{"onUpdate:modelValue":o[35]||(o[35]=l=>t.modelInput=l),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:Je(we(U,["prevent"]),["enter"])},null,40,Ko),[[se,t.modelInput]]),e("button",{class:"rounded-lg bg-red-500 px-4 py-2 text-white transition-colors hover:bg-red-600",type:"button",onClick:U},o[87]||(o[87]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),o[89]||(o[89]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 设置此API Key无法访问的模型,例如:claude-opus-4-20250514 ",-1))])])):h("",!0)]),e("div",null,[e("div",Lo,[T(e("input",{id:"editEnableClientRestriction","onUpdate:modelValue":o[36]||(o[36]=l=>t.enableClientRestriction=l),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700",type:"checkbox"},null,512),[[Le,t.enableClientRestriction]]),o[90]||(o[90]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700 dark:text-gray-300",for:"editEnableClientRestriction"}," 启用客户端限制 ",-1))]),t.enableClientRestriction?(i(),d("div",Do,[e("div",null,[o[91]||(o[91]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600 dark:text-gray-400"},"允许的客户端",-1)),o[92]||(o[92]=e("p",{class:"mb-3 text-xs text-gray-500 dark:text-gray-400"}," 勾选允许使用此API Key的客户端 ",-1)),e("div",So,[(i(!0),d(ae,null,ie(Q.value,l=>(i(),d("div",{key:l.id,class:"flex items-start"},[T(e("input",{id:`edit_client_${l.id}`,"onUpdate:modelValue":o[37]||(o[37]=p=>t.allowedClients=p),class:"mt-0.5 h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox",value:l.id},null,8,To),[[Le,t.allowedClients]]),e("label",{class:"ml-2 flex-1 cursor-pointer",for:`edit_client_${l.id}`},[e("span",Mo,u(l.name),1),e("span",Po,u(l.description),1)],8,_o)]))),128))])])])):h("",!0)]),e("div",Vo,[e("button",{class:"flex-1 rounded-xl bg-gray-100 px-6 py-3 font-semibold text-gray-700 transition-colors hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600",type:"button",onClick:o[38]||(o[38]=l=>f.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:V.value,type:"submit"},[V.value?(i(),d("div",Uo)):(i(),d("i",Oo)),A(" "+u(V.value?"保存中...":"保存修改"),1)],8,Ro)])],32)])])]))}},jo=Ke(Eo,[["__scopeId","data-v-52c5d9eb"]]),Go={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},qo={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-md flex-col p-8"},zo={class:"mb-6 flex items-center justify-between"},Fo={class:"modal-scroll-content custom-scrollbar flex-1 space-y-6"},Bo={class:"rounded-lg border border-blue-200 bg-blue-50 p-4"},Wo={class:"flex items-start gap-3"},No={class:"text-sm text-gray-700"},Ho={class:"mt-1 text-xs text-gray-600"},Yo={key:0,class:"mt-3"},Qo=["min"],Jo={key:1,class:"mt-2 text-xs text-gray-500"},Xo={class:"flex gap-3 pt-4"},Zo=["disabled"],el={key:0,class:"loading-spinner mr-2"},tl={key:1,class:"fas fa-clock mr-2"},sl={__name:"RenewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close","success"],setup(b,{emit:B}){const c=b,R=B,F=M(!1),C=Fe({renewDuration:"30d",customExpireDate:"",newExpiresAt:null}),V=E(()=>{const v=new Date;return c.apiKey.expiresAt&&new Date(c.apiKey.expiresAt)>v?new Date(c.apiKey.expiresAt).toISOString().slice(0,16):(v.setMinutes(v.getMinutes()+1),v.toISOString().slice(0,16))}),q=v=>new Date(v).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),P=()=>{if(!C.renewDuration){C.newExpiresAt=null;return}if(C.renewDuration==="permanent"){C.newExpiresAt=null;return}if(C.renewDuration==="custom")return;const v=c.apiKey.expiresAt&&new Date(c.apiKey.expiresAt)>new Date?new Date(c.apiKey.expiresAt):new Date,m=C.renewDuration.match(/(\d+)([dhmy])/);if(m){const[,t,U]=m,_=parseInt(t);switch(U){case"d":v.setDate(v.getDate()+_);break;case"h":v.setHours(v.getHours()+_);break;case"m":v.setMonth(v.getMonth()+_);break;case"y":v.setFullYear(v.getFullYear()+_);break}C.newExpiresAt=v.toISOString()}},Q=()=>{C.customExpireDate&&(C.newExpiresAt=new Date(C.customExpireDate).toISOString())},H=async()=>{F.value=!0;try{const v={expiresAt:C.renewDuration==="permanent"?null:C.newExpiresAt},D=await G.put(`/admin/api-keys/${c.apiKey.id}`,v);D.success?(O("API Key 续期成功","success"),R("success"),R("close")):O(D.message||"续期失败","error")}catch{O("续期失败","error")}finally{F.value=!1}};return P(),(v,D)=>(i(),me(Te,{to:"body"},[e("div",Go,[e("div",qo,[e("div",zo,[D[5]||(D[5]=e("div",{class:"flex items-center gap-3"},[e("div",{class:"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-green-500 to-green-600"},[e("i",{class:"fas fa-clock text-white"})]),e("h3",{class:"text-xl font-bold text-gray-900"},"续期 API Key")],-1)),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600",onClick:D[0]||(D[0]=m=>v.$emit("close"))},D[4]||(D[4]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",Fo,[e("div",Bo,[e("div",Wo,[D[7]||(D[7]=e("div",{class:"flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-lg bg-blue-500"},[e("i",{class:"fas fa-info text-sm text-white"})],-1)),e("div",null,[D[6]||(D[6]=e("h4",{class:"mb-1 font-semibold text-gray-800"},"API Key 信息",-1)),e("p",No,u(b.apiKey.name),1),e("p",Ho," 当前过期时间:"+u(b.apiKey.expiresAt?q(b.apiKey.expiresAt):"永不过期"),1)])])]),e("div",null,[D[9]||(D[9]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700"},"续期时长",-1)),T(e("select",{"onUpdate:modelValue":D[1]||(D[1]=m=>C.renewDuration=m),class:"form-input w-full",onChange:P},D[8]||(D[8]=[e("option",{value:"7d"},"延长 7 天",-1),e("option",{value:"30d"},"延长 30 天",-1),e("option",{value:"90d"},"延长 90 天",-1),e("option",{value:"180d"},"延长 180 天",-1),e("option",{value:"365d"},"延长 365 天",-1),e("option",{value:"custom"},"自定义日期",-1),e("option",{value:"permanent"},"设为永不过期",-1)]),544),[[Xe,C.renewDuration]]),C.renewDuration==="custom"?(i(),d("div",Yo,[T(e("input",{"onUpdate:modelValue":D[2]||(D[2]=m=>C.customExpireDate=m),class:"form-input w-full",min:V.value,type:"datetime-local",onChange:Q},null,40,Qo),[[se,C.customExpireDate]])])):h("",!0),C.newExpiresAt?(i(),d("p",Jo," 新的过期时间:"+u(q(C.newExpiresAt)),1)):h("",!0)])]),e("div",Xo,[e("button",{class:"flex-1 rounded-xl bg-gray-100 px-6 py-3 font-semibold text-gray-700 transition-colors hover:bg-gray-200",type:"button",onClick:D[3]||(D[3]=m=>v.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:F.value||!C.renewDuration,type:"button",onClick:H},[F.value?(i(),d("div",el)):(i(),d("i",tl)),A(" "+u(F.value?"续期中...":"确认续期"),1)],8,Zo)])])])]))}},al=Ke(sl,[["__scopeId","data-v-2fba52a3"]]),rl={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},ol={class:"modal-content custom-scrollbar mx-auto max-h-[90vh] w-full max-w-lg overflow-y-auto p-8"},ll={class:"mb-6 space-y-4"},nl={class:"rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-600 dark:bg-gray-800"},il={class:"font-medium text-gray-900 dark:text-gray-100"},dl={key:0},ul={class:"rounded-lg border border-gray-200 bg-gray-50 p-3 dark:border-gray-600 dark:bg-gray-800"},cl={class:"text-gray-700 dark:text-gray-300"},gl={class:"relative"},pl={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"},ml={class:"absolute right-3 top-3"},xl=["title"],yl={__name:"NewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close"],setup(b,{emit:B}){const c=b,R=B,F=M(!1),C=()=>{if(typeof window<"u"){const t=window.location.protocol,U=window.location.host;let _=t+"//"+U;const z=window.location.href,$=z.indexOf("/",8);return $!==-1&&(_=z.substring(0,$)),_}return""},V=E(()=>C()+"/api"),q=()=>{F.value=!F.value},P=()=>{const t=c.apiKey.apiKey||c.apiKey.key||"";return t?F.value||t.length<=12?t:t.substring(0,8)+"●".repeat(Math.max(0,t.length-12))+t.substring(t.length-4):""},Q=async(t,U)=>{try{await navigator.clipboard.writeText(t),O(U,"success")}catch{const z=document.createElement("textarea");z.value=t,document.body.appendChild(z),z.select();try{document.execCommand("copy"),O(U,"success")}catch{O("复制失败,请手动复制","error")}finally{document.body.removeChild(z)}}},H=async()=>{const t=c.apiKey.apiKey||c.apiKey.key||"";if(!t){O("API Key 不存在","error");return}const U=`ANTHROPIC_BASE_URL="${V.value}"
|
||
ANTHROPIC_AUTH_TOKEN="${t}"`;await Q(U,"配置信息已复制到剪贴板")},v=async()=>{const t=c.apiKey.apiKey||c.apiKey.key||"";if(!t){O("API Key 不存在","error");return}await Q(t,"API Key 已复制")},D=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","取消")&&R("close"):confirm(`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`)&&R("close")},m=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
建议您先复制API Key再关闭。`,"仍然关闭","返回复制")&&R("close"):confirm(`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&R("close")};return(t,U)=>(i(),me(Te,{to:"body"},[e("div",rl,[e("div",ol,[e("div",{class:"mb-6 flex items-center justify-between"},[U[1]||(U[1]=e("div",{class:"flex items-center gap-3"},[e("div",{class:"flex h-12 w-12 items-center justify-center rounded-xl bg-gradient-to-br from-green-500 to-green-600"},[e("i",{class:"fas fa-check text-lg text-white"})]),e("div",null,[e("h3",{class:"text-xl font-bold text-gray-900 dark:text-gray-100"},"API Key 创建成功"),e("p",{class:"text-sm text-gray-600 dark:text-gray-400"},"请妥善保存您的 API Key")])],-1)),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300",title:"直接关闭(不推荐)",onClick:m},U[0]||(U[0]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),U[9]||(U[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",ll,[e("div",null,[U[2]||(U[2]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"API Key 名称",-1)),e("div",nl,[e("span",il,u(b.apiKey.name),1)])]),b.apiKey.description?(i(),d("div",dl,[U[3]||(U[3]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"备注",-1)),e("div",ul,[e("span",cl,u(b.apiKey.description||"无描述"),1)])])):h("",!0),e("div",null,[U[4]||(U[4]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"API Key",-1)),e("div",gl,[e("div",pl,u(P()),1),e("div",ml,[e("button",{class:"btn-icon-sm bg-gray-700 hover:bg-gray-800 dark:bg-gray-700 dark:hover:bg-gray-600",title:F.value?"隐藏API Key":"显示完整API Key",type:"button",onClick:q},[e("i",{class:j(["fas",F.value?"fa-eye-slash":"fa-eye","text-gray-300"])},null,2)],8,xl)])]),U[5]||(U[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:v},U[6]||(U[6]=[e("i",{class:"fas fa-key"},null,-1),A(" 仅复制密钥 ",-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},U[7]||(U[7]=[e("i",{class:"fas fa-copy"},null,-1),A(" 复制Claude配置 ",-1)]))]),e("button",{class:"flex w-full items-center justify-center gap-2 rounded-xl border border-gray-300 bg-gray-200 px-5 py-3 text-sm font-semibold text-gray-800 transition-colors hover:border-gray-400 hover:bg-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 sm:text-base",onClick:D},U[8]||(U[8]=[e("i",{class:"fas fa-check-circle"},null,-1),A(" 我已保存 ",-1)]))])])])]))}},fl=Ke(yl,[["__scopeId","data-v-d2440499"]]),bl={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},vl={class:"modal-content custom-scrollbar mx-auto max-h-[90vh] w-full max-w-2xl overflow-y-auto p-8"},kl={class:"mb-6 flex items-center justify-between"},wl={class:"flex items-center gap-3"},hl={class:"text-sm text-gray-600"},Al={class:"mb-6 grid grid-cols-2 gap-4 md:grid-cols-4"},$l={class:"rounded-lg border border-blue-200 bg-gradient-to-br from-blue-50 to-blue-100 p-4"},Cl={class:"flex items-center justify-between"},Il={class:"mt-1 text-2xl font-bold text-blue-900"},Kl={class:"rounded-lg border border-green-200 bg-gradient-to-br from-green-50 to-green-100 p-4"},Ll={class:"flex items-center justify-between"},Dl={class:"mt-1 truncate text-lg font-bold text-green-900"},Sl={class:"rounded-lg border border-purple-200 bg-gradient-to-br from-purple-50 to-purple-100 p-4"},Tl={class:"flex items-center justify-between"},_l={class:"mt-1 text-lg font-bold text-purple-900"},Ml={class:"rounded-lg border border-orange-200 bg-gradient-to-br from-orange-50 to-orange-100 p-4"},Pl={class:"flex items-center justify-between"},Vl={class:"mt-1 text-lg font-bold text-orange-900"},Rl={class:"mb-6"},Ul={class:"mb-3 flex items-center justify-between"},Ol={class:"flex items-center gap-2"},El={key:0,class:"custom-scrollbar max-h-48 overflow-y-auto rounded-lg bg-gray-900 p-4"},jl={class:"font-mono text-xs text-gray-300"},Gl={__name:"BatchApiKeyModal",props:{apiKeys:{type:Array,required:!0}},emits:["close"],setup(b,{emit:B}){const c=b,R=B,F=M(!1),C=E(()=>{if(c.apiKeys.length>0){const m=c.apiKeys[0],t=m.name.match(/^(.+)_\d+$/);return t?t[1]:m.name}return""}),V=()=>{if(c.apiKeys.length===0)return"未知";const m=c.apiKeys[0].permissions;return{all:"全部服务",claude:"仅 Claude",gemini:"仅 Gemini"}[m]||m},q=()=>{if(c.apiKeys.length===0)return"未知";const m=c.apiKeys[0].expiresAt;if(!m)return"永不过期";const t=new Date(m),_=Math.ceil((t-new Date)/(1e3*60*60*24));return _<=7?`${_}天`:_<=30?`${Math.ceil(_/7)}周`:_<=365?`${Math.ceil(_/30)}个月`:`${Math.ceil(_/365)}年`},P=()=>{F.value=!F.value},Q=()=>{const t=c.apiKeys.slice(0,10).map(U=>`${U.name}: ${U.apiKey||U.key||""}`);return c.apiKeys.length>10&&t.push(`... 还有 ${c.apiKeys.length-10} 个 API Key`),t.join(`
|
||
`)},H=()=>{const m=c.apiKeys.map($=>`${$.name}: ${$.apiKey||$.key||""}`).join(`
|
||
`),t=new Blob([m],{type:"text/plain;charset=utf-8"}),U=URL.createObjectURL(t),_=document.createElement("a");_.href=U;const z=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5);_.download=`api-keys-${C.value}-${z}.txt`,document.body.appendChild(_),_.click(),document.body.removeChild(_),URL.revokeObjectURL(U),O("API Keys 文件已下载","success")},v=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看这些 API Key,请确保已经下载并妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","返回下载")&&R("close"):confirm(`关闭后将无法再次查看这些 API Key,请确保已经下载并妥善保存。
|
||
|
||
确定要关闭吗?`)&&R("close")},D=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有下载 API Keys,关闭后将无法再次查看。
|
||
|
||
强烈建议您先下载保存。`,"仍然关闭","返回下载")&&R("close"):confirm(`您还没有下载 API Keys,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&R("close")};return(m,t)=>(i(),me(Te,{to:"body"},[e("div",bl,[e("div",vl,[e("div",kl,[e("div",wl,[t[1]||(t[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,[t[0]||(t[0]=e("h3",{class:"text-xl font-bold text-gray-900"},"批量创建成功",-1)),e("p",hl,"成功创建 "+u(b.apiKeys.length)+" 个 API Key",1)])]),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600",title:"直接关闭(不推荐)",onClick:D},t[2]||(t[2]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),t[14]||(t[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",Al,[e("div",$l,[e("div",Cl,[e("div",null,[t[3]||(t[3]=e("p",{class:"text-xs font-medium text-blue-600"},"创建数量",-1)),e("p",Il,u(b.apiKeys.length),1)]),t[4]||(t[4]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-lg bg-blue-500 bg-opacity-20"},[e("i",{class:"fas fa-key text-blue-600"})],-1))])]),e("div",Kl,[e("div",Ll,[e("div",null,[t[5]||(t[5]=e("p",{class:"text-xs font-medium text-green-600"},"基础名称",-1)),e("p",Dl,u(C.value),1)]),t[6]||(t[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",Sl,[e("div",Tl,[e("div",null,[t[7]||(t[7]=e("p",{class:"text-xs font-medium text-purple-600"},"权限范围",-1)),e("p",_l,u(V()),1)]),t[8]||(t[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",Ml,[e("div",Pl,[e("div",null,[t[9]||(t[9]=e("p",{class:"text-xs font-medium text-orange-600"},"过期时间",-1)),e("p",Vl,u(q()),1)]),t[10]||(t[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",Rl,[e("div",Ul,[t[12]||(t[12]=e("label",{class:"text-sm font-semibold text-gray-700"},"API Keys 预览",-1)),e("div",Ol,[e("button",{class:"flex items-center gap-1 text-xs text-blue-600 hover:text-blue-800",type:"button",onClick:P},[e("i",{class:j(["fas",F.value?"fa-eye-slash":"fa-eye"])},null,2),A(" "+u(F.value?"隐藏":"显示")+"预览 ",1)]),t[11]||(t[11]=e("span",{class:"text-xs text-gray-500"},"(最多显示前10个)",-1))])]),F.value?(i(),d("div",El,[e("pre",jl,u(Q()),1)])):h("",!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},t[13]||(t[13]=[e("i",{class:"fas fa-download"},null,-1),A(" 下载所有 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:v}," 我已保存 ")]),t[15]||(t[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))])])]))}},ql=Ke(Gl,[["__scopeId","data-v-b0b904b9"]]),zl={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},Fl={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6 md:p-8"},Bl={class:"mb-4 flex items-center justify-between sm:mb-6"},Wl={class:"flex items-center gap-2 sm:gap-3"},Nl={class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"},Hl={class:"rounded-lg bg-blue-50 p-4 dark:bg-blue-900/20"},Yl={class:"flex items-start gap-3"},Ql={class:"mt-1 text-sm text-blue-700 dark:text-blue-400"},Jl={class:"space-y-4"},Xl={class:"flex flex-wrap gap-4"},Zl={class:"flex cursor-pointer items-center"},en={class:"flex cursor-pointer items-center"},tn={class:"flex cursor-pointer items-center"},sn={class:"flex cursor-pointer items-center"},an={key:0,class:"space-y-3"},rn={key:0},on={class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"},ln={class:"flex flex-wrap gap-2"},nn=["onClick"],dn={key:1},un={class:"flex flex-wrap gap-2"},cn=["onClick"],gn={class:"flex gap-2"},pn=["onKeypress"],mn={class:"rounded-lg border border-blue-200 bg-blue-50 p-3 dark:border-blue-700 dark:bg-blue-900/20"},xn={class:"space-y-2"},yn={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},fn={class:"mb-3 flex items-center gap-4"},bn={class:"flex gap-4"},vn={class:"flex cursor-pointer items-center"},kn={class:"flex cursor-pointer items-center"},wn={class:"flex cursor-pointer items-center"},hn={class:"flex flex-wrap gap-4"},An={class:"flex cursor-pointer items-center"},$n={class:"flex cursor-pointer items-center"},Cn={class:"flex cursor-pointer items-center"},In={class:"flex cursor-pointer items-center"},Kn={class:"flex cursor-pointer items-center"},Ln={class:"flex cursor-pointer items-center"},Dn={class:"mb-3 flex items-center justify-between"},Sn=["disabled"],Tn={class:"grid grid-cols-1 gap-3"},_n={class:"flex gap-3 pt-4"},Mn=["disabled"],Pn={key:0,class:"loading-spinner mr-2"},Vn={key:1,class:"fas fa-save mr-2"},wt="__KEEP_ORIGINAL__",Rn={__name:"BatchEditApiKeyModal",props:{selectedKeys:{type:Array,required:!0},accounts:{type:Object,default:()=>({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]})}},emits:["close","success"],setup(b,{emit:B}){const c=b,R=B,F=At(),C=M(!1),V=M(!1),q=M({claude:[],gemini:[],openai:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),P=M(""),Q=M([]),H=M("none"),v=E(()=>c.selectedKeys.length),D=E(()=>Q.value.filter(o=>!m.tags.includes(o))),m=Fe({rateLimitCost:"",rateLimitWindow:"",rateLimitRequests:"",concurrencyLimit:"",dailyCostLimit:"",totalCostLimit:"",weeklyOpusCostLimit:"",permissions:"",claudeAccountId:"",geminiAccountId:"",openaiAccountId:"",bedrockAccountId:"",droidAccountId:"",tags:[],isActive:null}),t=[{value:wt,label:"不修改"},{value:"SHARED_POOL",label:"使用共享账号池"}],U=o=>E({get:()=>m[o]===""?wt:m[o],set:l=>{!l||l===wt?m[o]="":m[o]=l}}),_=U("claudeAccountId"),z=U("geminiAccountId"),$=U("openaiAccountId"),L=U("bedrockAccountId"),ee=U("droidAccountId"),J=o=>!m.permissions||m.permissions==="all"?!0:m.permissions===o,ge=()=>{if(P.value&&P.value.trim()){const o=P.value.trim();m.tags.includes(o)||m.tags.push(o),P.value=""}},ue=o=>{m.tags.includes(o)||m.tags.push(o)},Y=o=>{m.tags.splice(o,1)},ye=async()=>{var o,l;V.value=!0;try{const[p,I,w,n,x,oe,pe]=await Promise.all([G.get("/admin/claude-accounts"),G.get("/admin/claude-console-accounts"),G.get("/admin/gemini-accounts"),G.get("/admin/openai-accounts"),G.get("/admin/bedrock-accounts"),G.get("/admin/droid-accounts"),G.get("/admin/account-groups")]),X=[];if(p.success&&((o=p.data)==null||o.forEach(te=>{X.push({...te,platform:"claude-oauth",isDedicated:te.accountType==="dedicated"})})),I.success&&((l=I.data)==null||l.forEach(te=>{X.push({...te,platform:"claude-console",isDedicated:te.accountType==="dedicated"})})),q.value.claude=X,w.success&&(q.value.gemini=(w.data||[]).map(te=>({...te,isDedicated:te.accountType==="dedicated"}))),n.success&&(q.value.openai=(n.data||[]).map(te=>({...te,isDedicated:te.accountType==="dedicated"}))),x.success&&(q.value.bedrock=(x.data||[]).map(te=>({...te,isDedicated:te.accountType==="dedicated"}))),oe.success&&(q.value.droid=(oe.data||[]).map(te=>({...te,platform:"droid",isDedicated:te.accountType==="dedicated"}))),pe.success){const te=pe.data||[];q.value.claudeGroups=te.filter(N=>N.platform==="claude"),q.value.geminiGroups=te.filter(N=>N.platform==="gemini"),q.value.openaiGroups=te.filter(N=>N.platform==="openai"),q.value.droidGroups=te.filter(N=>N.platform==="droid")}O("账号列表已刷新","success")}catch{O("刷新账号列表失败","error")}finally{V.value=!1}},f=async()=>{C.value=!0;try{const o={};m.rateLimitCost!==""&&m.rateLimitCost!==null&&(o.rateLimitCost=parseFloat(m.rateLimitCost)),m.rateLimitWindow!==""&&m.rateLimitWindow!==null&&(o.rateLimitWindow=parseInt(m.rateLimitWindow)),m.rateLimitRequests!==""&&m.rateLimitRequests!==null&&(o.rateLimitRequests=parseInt(m.rateLimitRequests)),m.concurrencyLimit!==""&&m.concurrencyLimit!==null&&(o.concurrencyLimit=parseInt(m.concurrencyLimit)),m.dailyCostLimit!==""&&m.dailyCostLimit!==null&&(o.dailyCostLimit=parseFloat(m.dailyCostLimit)),m.totalCostLimit!==""&&m.totalCostLimit!==null&&(o.totalCostLimit=parseFloat(m.totalCostLimit)),m.weeklyOpusCostLimit!==""&&m.weeklyOpusCostLimit!==null&&(o.weeklyOpusCostLimit=parseFloat(m.weeklyOpusCostLimit)),m.permissions!==""&&(o.permissions=m.permissions),m.claudeAccountId!==""&&(m.claudeAccountId==="SHARED_POOL"?(o.claudeAccountId=null,o.claudeConsoleAccountId=null):m.claudeAccountId.startsWith("console:")?(o.claudeConsoleAccountId=m.claudeAccountId.substring(8),o.claudeAccountId=null):(m.claudeAccountId.startsWith("group:"),o.claudeAccountId=m.claudeAccountId,o.claudeConsoleAccountId=null)),m.geminiAccountId!==""&&(m.geminiAccountId==="SHARED_POOL"?o.geminiAccountId=null:o.geminiAccountId=m.geminiAccountId),m.openaiAccountId!==""&&(m.openaiAccountId==="SHARED_POOL"?o.openaiAccountId=null:o.openaiAccountId=m.openaiAccountId),m.bedrockAccountId!==""&&(m.bedrockAccountId==="SHARED_POOL"?o.bedrockAccountId=null:o.bedrockAccountId=m.bedrockAccountId),m.droidAccountId!==""&&(m.droidAccountId==="SHARED_POOL"?o.droidAccountId=null:o.droidAccountId=m.droidAccountId),m.isActive!==null&&(o.isActive=m.isActive),H.value!=="none"&&(o.tags=m.tags,o.tagOperation=H.value);const l=await G.put("/admin/api-keys/batch",{keyIds:c.selectedKeys,updates:o});if(l.success){const{successCount:p,failedCount:I,errors:w}=l.data;if(p>0){if(O(`成功批量编辑 ${p} 个 API Keys`,"success"),I>0){const n=w.map(x=>`${x.keyId}: ${x.error}`).join(`
|
||
`);O(`${I} 个编辑失败:
|
||
${n}`,"warning")}}else O("所有 API Keys 编辑失败","error");R("success"),R("close")}else O(l.message||"批量编辑失败","error")}catch(o){O("批量编辑失败","error"),console.error("批量编辑 API Keys 失败:",o)}finally{C.value=!1}};return Ze(async()=>{Q.value=await F.fetchTags(),c.accounts&&(q.value={claude:c.accounts.claude||[],gemini:c.accounts.gemini||[],openai:c.accounts.openai||[],bedrock:c.accounts.bedrock||[],droid:c.accounts.droid||[],claudeGroups:c.accounts.claudeGroups||[],geminiGroups:c.accounts.geminiGroups||[],openaiGroups:c.accounts.openaiGroups||[],droidGroups:c.accounts.droidGroups||[]})}),(o,l)=>(i(),me(Te,{to:"body"},[e("div",zl,[e("div",Fl,[e("div",Bl,[e("div",Wl,[l[28]||(l[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",Nl," 批量编辑 API Keys ("+u(v.value)+" 个) ",1)]),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600 dark:hover:text-gray-300",onClick:l[0]||(l[0]=p=>o.$emit("close"))},l[29]||(l[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:we(f,["prevent"])},[e("div",Hl,[e("div",Yl,[l[31]||(l[31]=e("i",{class:"fas fa-info-circle mt-1 text-blue-500"},null,-1)),e("div",null,[l[30]||(l[30]=e("p",{class:"text-sm font-medium text-blue-800 dark:text-blue-300"},"批量编辑说明",-1)),e("p",Ql," 以下设置将应用到所选的 "+u(v.value)+" 个 API Key。只有填写或修改的字段才会被更新,空白字段将保持原值不变。 ",1)])])]),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",Jl,[e("div",Xl,[e("label",Zl,[T(e("input",{"onUpdate:modelValue":l[1]||(l[1]=p=>H.value=p),class:"mr-2",type:"radio",value:"replace"},null,512),[[de,H.value]]),l[32]||(l[32]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"替换标签",-1))]),e("label",en,[T(e("input",{"onUpdate:modelValue":l[2]||(l[2]=p=>H.value=p),class:"mr-2",type:"radio",value:"add"},null,512),[[de,H.value]]),l[33]||(l[33]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"添加标签",-1))]),e("label",tn,[T(e("input",{"onUpdate:modelValue":l[3]||(l[3]=p=>H.value=p),class:"mr-2",type:"radio",value:"remove"},null,512),[[de,H.value]]),l[34]||(l[34]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"移除标签",-1))]),e("label",sn,[T(e("input",{"onUpdate:modelValue":l[4]||(l[4]=p=>H.value=p),class:"mr-2",type:"radio",value:"none"},null,512),[[de,H.value]]),l[35]||(l[35]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"不修改标签",-1))])]),H.value!=="none"?(i(),d("div",an,[m.tags.length>0?(i(),d("div",rn,[e("div",on,u(H.value==="replace"?"新标签列表:":H.value==="add"?"要添加的标签:":"要移除的标签:"),1),e("div",ln,[(i(!0),d(ae,null,ie(m.tags,(p,I)=>(i(),d("span",{key:"selected-"+I,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"},[A(u(p)+" ",1),e("button",{class:"ml-1 hover:text-blue-900",type:"button",onClick:w=>Y(I)},l[36]||(l[36]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,nn)]))),128))])])):h("",!0),D.value.length>0?(i(),d("div",dn,[l[38]||(l[38]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 点击选择已有标签: ",-1)),e("div",un,[(i(!0),d(ae,null,ie(D.value,p=>(i(),d("button",{key:"available-"+p,class:"inline-flex items-center gap-1 rounded-full bg-gray-100 px-3 py-1 text-sm text-gray-700 transition-colors hover:bg-blue-100 hover:text-blue-700 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-blue-900/30 dark:hover:text-blue-300",type:"button",onClick:I=>ue(p)},[l[37]||(l[37]=e("i",{class:"fas fa-tag text-xs text-gray-500 dark:text-gray-400"},null,-1)),A(" "+u(p),1)],8,cn))),128))])])):h("",!0),e("div",null,[l[40]||(l[40]=e("div",{class:"mb-2 text-xs font-medium text-gray-600 dark:text-gray-400"}," 创建新标签: ",-1)),e("div",gn,[T(e("input",{"onUpdate:modelValue":l[5]||(l[5]=p=>P.value=p),class:"form-input flex-1 border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",placeholder:"输入新标签名称",type:"text",onKeypress:Je(we(ge,["prevent"]),["enter"])},null,40,pn),[[se,P.value]]),e("button",{class:"rounded-lg bg-green-500 px-4 py-2 text-white transition-colors hover:bg-green-600 dark:bg-green-600 dark:hover:bg-green-700",type:"button",onClick:ge},l[39]||(l[39]=[e("i",{class:"fas fa-plus"},null,-1)]))])])])):h("",!0)])]),e("div",mn,[l[45]||(l[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",xn,[e("div",yn,[e("div",null,[l[42]||(l[42]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"}," 时间窗口 (分钟) ",-1)),T(e("input",{"onUpdate:modelValue":l[6]||(l[6]=p=>m.rateLimitWindow=p),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"1",placeholder:"不修改",type:"number"},null,512),[[se,m.rateLimitWindow]])]),e("div",null,[l[43]||(l[43]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"请求次数限制",-1)),T(e("input",{"onUpdate:modelValue":l[7]||(l[7]=p=>m.rateLimitRequests=p),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"1",placeholder:"不修改",type:"number"},null,512),[[se,m.rateLimitRequests]])]),e("div",null,[l[44]||(l[44]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700 dark:text-gray-300"},"费用限制 (美元)",-1)),T(e("input",{"onUpdate:modelValue":l[8]||(l[8]=p=>m.rateLimitCost=p),class:"form-input w-full border-gray-300 text-sm dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"0",placeholder:"不修改",step:"0.01",type:"number"},null,512),[[se,m.rateLimitCost]])])])])]),e("div",null,[l[46]||(l[46]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," 每日费用限制 (美元) ",-1)),T(e("input",{"onUpdate:modelValue":l[9]||(l[9]=p=>m.dailyCostLimit=p),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"0",placeholder:"不修改 (0 表示无限制)",step:"0.01",type:"number"},null,512),[[se,m.dailyCostLimit]])]),e("div",null,[l[47]||(l[47]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," 总费用限制 (美元) ",-1)),T(e("input",{"onUpdate:modelValue":l[10]||(l[10]=p=>m.totalCostLimit=p),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"0",placeholder:"不修改 (0 表示无限制)",step:"0.01",type:"number"},null,512),[[se,m.totalCostLimit]])]),e("div",null,[l[48]||(l[48]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"}," Opus 模型周费用限制 (美元) ",-1)),T(e("input",{"onUpdate:modelValue":l[11]||(l[11]=p=>m.weeklyOpusCostLimit=p),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"0",placeholder:"不修改 (0 表示无限制)",step:"0.01",type:"number"},null,512),[[se,m.weeklyOpusCostLimit]]),l[49]||(l[49]=e("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 设置 Opus 模型的周费用限制(周一到周日),仅限 Claude 官方账户 ",-1))]),e("div",null,[l[50]||(l[50]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"并发限制",-1)),T(e("input",{"onUpdate:modelValue":l[12]||(l[12]=p=>m.concurrencyLimit=p),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",min:"0",placeholder:"不修改 (0 表示无限制)",type:"number"},null,512),[[se,m.concurrencyLimit]])]),e("div",null,[e("div",fn,[l[54]||(l[54]=e("label",{class:"text-sm font-semibold text-gray-700 dark:text-gray-300"},"激活状态",-1)),e("div",bn,[e("label",vn,[T(e("input",{"onUpdate:modelValue":l[13]||(l[13]=p=>m.isActive=p),class:"mr-2",type:"radio",value:!0},null,512),[[de,m.isActive]]),l[51]||(l[51]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"激活",-1))]),e("label",kn,[T(e("input",{"onUpdate:modelValue":l[14]||(l[14]=p=>m.isActive=p),class:"mr-2",type:"radio",value:!1},null,512),[[de,m.isActive]]),l[52]||(l[52]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"禁用",-1))]),e("label",wn,[T(e("input",{"onUpdate:modelValue":l[15]||(l[15]=p=>m.isActive=p),class:"mr-2",type:"radio",value:null},null,512),[[de,m.isActive]]),l[53]||(l[53]=e("span",{class:"text-sm text-gray-700 dark:text-gray-300"},"不修改",-1))])])])]),e("div",null,[l[61]||(l[61]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"服务权限",-1)),e("div",hn,[e("label",An,[T(e("input",{"onUpdate:modelValue":l[16]||(l[16]=p=>m.permissions=p),class:"mr-2",type:"radio",value:""},null,512),[[de,m.permissions]]),l[55]||(l[55]=e("span",{class:"text-sm text-gray-700"},"不修改",-1))]),e("label",$n,[T(e("input",{"onUpdate:modelValue":l[17]||(l[17]=p=>m.permissions=p),class:"mr-2",type:"radio",value:"all"},null,512),[[de,m.permissions]]),l[56]||(l[56]=e("span",{class:"text-sm text-gray-700"},"全部服务",-1))]),e("label",Cn,[T(e("input",{"onUpdate:modelValue":l[18]||(l[18]=p=>m.permissions=p),class:"mr-2",type:"radio",value:"claude"},null,512),[[de,m.permissions]]),l[57]||(l[57]=e("span",{class:"text-sm text-gray-700"},"仅 Claude",-1))]),e("label",In,[T(e("input",{"onUpdate:modelValue":l[19]||(l[19]=p=>m.permissions=p),class:"mr-2",type:"radio",value:"gemini"},null,512),[[de,m.permissions]]),l[58]||(l[58]=e("span",{class:"text-sm text-gray-700"},"仅 Gemini",-1))]),e("label",Kn,[T(e("input",{"onUpdate:modelValue":l[20]||(l[20]=p=>m.permissions=p),class:"mr-2",type:"radio",value:"openai"},null,512),[[de,m.permissions]]),l[59]||(l[59]=e("span",{class:"text-sm text-gray-700"},"仅 OpenAI",-1))]),e("label",Ln,[T(e("input",{"onUpdate:modelValue":l[21]||(l[21]=p=>m.permissions=p),class:"mr-2",type:"radio",value:"droid"},null,512),[[de,m.permissions]]),l[60]||(l[60]=e("span",{class:"text-sm text-gray-700"},"仅 Droid",-1))])])]),e("div",null,[e("div",Dn,[l[62]||(l[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:V.value,title:"刷新账号列表",type:"button",onClick:ye},[e("i",{class:j(["fas",V.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,u(V.value?"刷新中...":"刷新账号"),1)],8,Sn)]),e("div",Tn,[e("div",null,[l[63]||(l[63]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Claude 专属账号",-1)),ne(ve,{modelValue:Qe(_),"onUpdate:modelValue":l[22]||(l[22]=p=>Ye(_)?_.value=p:null),accounts:q.value.claude,"default-option-text":"请选择Claude账号",disabled:!J("claude"),groups:q.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude","special-options":t},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[l[64]||(l[64]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Gemini 专属账号",-1)),ne(ve,{modelValue:Qe(z),"onUpdate:modelValue":l[23]||(l[23]=p=>Ye(z)?z.value=p:null),accounts:q.value.gemini,"default-option-text":"请选择Gemini账号",disabled:!J("gemini"),groups:q.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini","special-options":t},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[l[65]||(l[65]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"OpenAI 专属账号",-1)),ne(ve,{modelValue:Qe($),"onUpdate:modelValue":l[24]||(l[24]=p=>Ye($)?$.value=p:null),accounts:q.value.openai,"default-option-text":"请选择OpenAI账号",disabled:!J("openai"),groups:q.value.openaiGroups,placeholder:"请选择OpenAI账号",platform:"openai","special-options":t},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[l[66]||(l[66]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Bedrock 专属账号",-1)),ne(ve,{modelValue:Qe(L),"onUpdate:modelValue":l[25]||(l[25]=p=>Ye(L)?L.value=p:null),accounts:q.value.bedrock,"default-option-text":"请选择Bedrock账号",disabled:!J("openai"),groups:[],placeholder:"请选择Bedrock账号",platform:"bedrock","special-options":t},null,8,["modelValue","accounts","disabled"])]),e("div",null,[l[67]||(l[67]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600 dark:text-gray-400"},"Droid 专属账号",-1)),ne(ve,{modelValue:Qe(ee),"onUpdate:modelValue":l[26]||(l[26]=p=>Ye(ee)?ee.value=p:null),accounts:q.value.droid,"default-option-text":"请选择Droid账号",disabled:!J("droid"),groups:q.value.droidGroups,placeholder:"请选择Droid账号",platform:"droid","special-options":t},null,8,["modelValue","accounts","disabled","groups"])])])]),e("div",_n,[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[27]||(l[27]=p=>o.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:C.value,type:"submit"},[C.value?(i(),d("div",Pn)):(i(),d("i",Vn)),A(" "+u(C.value?"保存中...":"批量保存"),1)],8,Mn)])],32)])])]))}},Un=Ke(Rn,[["__scopeId","data-v-f3017136"]]),On={key:0,class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},En={class:"modal-content relative mx-auto w-full max-w-lg p-8"},jn={class:"mb-6 flex items-center justify-between"},Gn={class:"flex items-center gap-3"},qn={class:"text-sm text-gray-600 dark:text-gray-400"},zn={class:"space-y-6"},Fn={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"},Bn={class:"flex items-center justify-between"},Wn={class:"text-sm font-semibold text-gray-800 dark:text-gray-200"},Nn={class:"ml-2 text-xs font-normal text-gray-600"},Hn={class:"flex h-12 w-12 items-center justify-center rounded-lg bg-white shadow-sm dark:bg-gray-700"},Yn={key:0,class:"mb-4"},Qn={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Jn={class:"mb-3 grid grid-cols-3 gap-2"},Xn=["onClick"],Zn={key:1,class:"animate-fadeIn"},ei=["min"],ti={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"},si={class:"flex items-center justify-between"},ai={class:"text-sm font-semibold text-blue-900 dark:text-blue-200"},ri={class:"flex gap-3 pt-2"},oi=["disabled"],li={key:0,class:"loading-spinner mr-2"},ni={key:1,class:"fas fa-save mr-2"},ii={__name:"ExpiryEditModal",props:{show:{type:Boolean,required:!0},apiKey:{type:Object,required:!0}},emits:["close","save"],setup(b,{expose:B,emit:c}){const R=b,F=c,C=M(!1),V=Fe({expireDuration:"",customExpireDate:"",expiresAt:null}),q=[{value:"",label:"永不过期"},{value:"1d",label:"1 天"},{value:"7d",label:"7 天"},{value:"30d",label:"30 天"},{value:"90d",label:"90 天"},{value:"180d",label:"180 天"},{value:"365d",label:"1 年"},{value:"730d",label:"2 年"}],P=E(()=>{const $=new Date;return $.setMinutes($.getMinutes()+1),$.toISOString().slice(0,16)});De(()=>R.show,$=>{$&&Q()}),De(()=>{var $;return($=R.apiKey)==null?void 0:$.id},$=>{$&&R.show&&Q()});const Q=()=>{C.value=!1,R.apiKey.expiresAt?(V.expireDuration="custom",V.customExpireDate=new Date(R.apiKey.expiresAt).toISOString().slice(0,16),V.expiresAt=R.apiKey.expiresAt):(V.expireDuration="",V.customExpireDate="",V.expiresAt=null)},H=$=>{if(V.expireDuration=$,!$){V.expiresAt=null;return}if($==="custom")return;const L=new Date,ee=$.match(/(\d+)([dhmy])/);if(ee){const[,J,ge]=ee,ue=parseInt(J);switch(ge){case"d":L.setDate(L.getDate()+ue);break;case"h":L.setHours(L.getHours()+ue);break;case"m":L.setMonth(L.getMonth()+ue);break;case"y":L.setFullYear(L.getFullYear()+ue);break}V.expiresAt=L.toISOString()}},v=()=>{V.customExpireDate&&(V.expiresAt=new Date(V.customExpireDate).toISOString())},D=$=>$?new Date($).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",m=$=>$?new Date($)<new Date:!1,t=$=>{if(!$)return null;const L=new Date,J=new Date($)-L,ge=Math.ceil(J/(1e3*60*60*24));return J<0?{text:"已过期",class:"text-red-600"}:ge<=7?{text:`${ge} 天后过期`,class:"text-orange-600"}:ge<=30?{text:`${ge} 天后过期`,class:"text-yellow-600"}:{text:`${Math.ceil(ge/30)} 个月后过期`,class:"text-green-600"}},U=()=>{C.value=!0,F("save",{keyId:R.apiKey.id,expiresAt:V.expiresAt})},_=async()=>{let $=!0;window.showConfirm?$=await window.showConfirm("激活 API Key",`确定要立即激活此 API Key 吗?激活后将在 ${R.apiKey.activationDays||(R.apiKey.activationUnit==="hours"?24:30)} ${R.apiKey.activationUnit==="hours"?"小时":"天"}后自动过期。`,"确定激活","取消"):$=confirm(`确定要立即激活此 API Key 吗?激活后将在 ${R.apiKey.activationDays||(R.apiKey.activationUnit==="hours"?24:30)} ${R.apiKey.activationUnit==="hours"?"小时":"天"}后自动过期。`),$&&(C.value=!0,F("save",{keyId:R.apiKey.id,activateNow:!0}))};return B({resetSaving:()=>{C.value=!1}}),($,L)=>(i(),me(Te,{to:"body"},[b.show?(i(),d("div",On,[e("div",{class:"fixed inset-0 bg-gray-900 bg-opacity-50 backdrop-blur-sm",onClick:L[0]||(L[0]=ee=>$.$emit("close"))}),e("div",En,[e("div",jn,[e("div",Gn,[L[6]||(L[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,[L[5]||(L[5]=e("h3",{class:"text-xl font-bold text-gray-900 dark:text-gray-100"},"修改过期时间",-1)),e("p",qn,' 为 "'+u(b.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:L[1]||(L[1]=ee=>$.$emit("close"))},L[7]||(L[7]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",zn,[e("div",Fn,[e("div",Bn,[e("div",null,[L[12]||(L[12]=e("p",{class:"mb-1 text-xs font-medium text-gray-600 dark:text-gray-400"},"当前状态",-1)),e("p",Wn,[b.apiKey.expirationMode==="activation"&&!b.apiKey.isActivated?(i(),d(ae,{key:0},[L[8]||(L[8]=e("i",{class:"fas fa-pause-circle mr-1 text-blue-500"},null,-1)),L[9]||(L[9]=A(" 未激活 ",-1)),e("span",Nn," (激活后 "+u(b.apiKey.activationDays||(b.apiKey.activationUnit==="hours"?24:30))+" "+u(b.apiKey.activationUnit==="hours"?"小时":"天")+"过期) ",1)],64)):b.apiKey.expiresAt?(i(),d(ae,{key:1},[A(u(D(b.apiKey.expiresAt))+" ",1),t(b.apiKey.expiresAt)?(i(),d("span",{key:0,class:j(["ml-2 text-xs font-normal",t(b.apiKey.expiresAt).class])}," ("+u(t(b.apiKey.expiresAt).text)+") ",3)):h("",!0)],64)):(i(),d(ae,{key:2},[L[10]||(L[10]=e("i",{class:"fas fa-infinity mr-1 text-gray-500"},null,-1)),L[11]||(L[11]=A(" 永不过期 ",-1))],64))])]),e("div",Hn,[e("i",{class:j(["fas fa-hourglass-half text-lg",b.apiKey.expiresAt&&m(b.apiKey.expiresAt)?"text-red-500":"text-gray-400"])},null,2)])])]),b.apiKey.expirationMode==="activation"&&!b.apiKey.isActivated?(i(),d("div",Yn,[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:_},[L[13]||(L[13]=e("i",{class:"fas fa-rocket mr-2"},null,-1)),A(" 立即激活 (激活后 "+u(b.apiKey.activationDays||(b.apiKey.activationUnit==="hours"?24:30))+" "+u(b.apiKey.activationUnit==="hours"?"小时":"天")+"过期) ",1)]),e("p",Qn,[L[14]||(L[14]=e("i",{class:"fas fa-info-circle mr-1"},null,-1)),A(" 点击立即激活此 API Key,激活后将在 "+u(b.apiKey.activationDays||(b.apiKey.activationUnit==="hours"?24:30))+" "+u(b.apiKey.activationUnit==="hours"?"小时":"天")+"后过期 ",1)])])):h("",!0),e("div",null,[L[16]||(L[16]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"选择新的期限",-1)),e("div",Jn,[(i(),d(ae,null,ie(q,ee=>e("button",{key:ee.value,class:j(["rounded-lg px-3 py-2 text-sm font-medium transition-all",V.expireDuration===ee.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:J=>H(ee.value)},u(ee.label),11,Xn)),64)),e("button",{class:j(["rounded-lg px-3 py-2 text-sm font-medium transition-all",V.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:L[2]||(L[2]=ee=>H("custom"))},L[15]||(L[15]=[e("i",{class:"fas fa-calendar-alt mr-1"},null,-1),A(" 自定义 ",-1)]),2)])]),V.expireDuration==="custom"?(i(),d("div",Zn,[L[17]||(L[17]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700 dark:text-gray-300"},"选择日期和时间",-1)),T(e("input",{"onUpdate:modelValue":L[3]||(L[3]=ee=>V.customExpireDate=ee),class:"form-input w-full border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-200",min:P.value,type:"datetime-local",onChange:v},null,40,ei),[[se,V.customExpireDate]]),L[18]||(L[18]=e("p",{class:"mt-2 text-xs text-gray-500 dark:text-gray-400"}," 选择一个未来的日期和时间作为过期时间 ",-1))])):h("",!0),V.expiresAt!==b.apiKey.expiresAt?(i(),d("div",ti,[e("div",si,[e("div",null,[L[21]||(L[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"}),A(" 新的过期时间 ")],-1)),e("p",ai,[V.expiresAt?(i(),d(ae,{key:0},[A(u(D(V.expiresAt))+" ",1),t(V.expiresAt)?(i(),d("span",{key:0,class:j(["ml-2 text-xs font-normal",t(V.expiresAt).class])}," ("+u(t(V.expiresAt).text)+") ",3)):h("",!0)],64)):(i(),d(ae,{key:1},[L[19]||(L[19]=e("i",{class:"fas fa-infinity mr-1"},null,-1)),L[20]||(L[20]=A(" 永不过期 ",-1))],64))])]),L[22]||(L[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))])])):h("",!0),e("div",ri,[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:L[4]||(L[4]=ee=>$.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-4 py-2.5 font-semibold",disabled:C.value||V.expiresAt===b.apiKey.expiresAt,onClick:U},[C.value?(i(),d("div",li)):(i(),d("i",ni)),A(" "+u(C.value?"保存中...":"保存更改"),1)],8,oi)])])])])):h("",!0)]))}},di=Ke(ii,[["__scopeId","data-v-fb30c1d3"]]),ui={class:"w-full"},ci={key:0,class:"flex items-center justify-center rounded-lg px-3 py-2 text-xs"},gi={key:1,class:"space-y-1.5"},pi={class:"flex items-center justify-between text-[11px] font-medium"},mi={class:"text-gray-700 dark:text-gray-200"},xi={class:"relative h-1.5 overflow-hidden rounded-full bg-gray-200/85 dark:bg-gray-700/70"},yi={class:"relative z-10 flex h-full items-center justify-between px-3"},fi={class:"flex items-center gap-1.5"},bi={class:"flex items-center gap-1.5"},vi={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"}},ki={__name:"LimitProgressBar",props:{type:{type:String,required:!0,validator:b=>["daily","opus","window","total"].includes(b)},variant:{type:String,default:"full",validator:b=>["full","compact"].includes(b)},label:{type:String,required:!0},current:{type:Number,default:0},limit:{type:Number,required:!0},showShine:{type:Boolean,default:!1}},setup(b){const B=b,c=E(()=>B.variant==="compact"),R=E(()=>{if(!B.limit||B.limit<=0)return 0;const D=B.current/B.limit*100;return Math.min(D,100)}),F=E(()=>{switch(B.type){case"daily":return"border-emerald-200/80 bg-white/80 shadow-[0_10px_24px_rgba(16,185,129,0.18)] group-hover:shadow-[0_14px_30px_rgba(16,185,129,0.22)] dark:border-emerald-500/40 dark:bg-emerald-950/40 dark:shadow-[0_12px_28px_rgba(0,0,0,0.45)]";case"opus":return"border-violet-200/80 bg-white/80 shadow-[0_10px_24px_rgba(139,92,246,0.18)] group-hover:shadow-[0_14px_30px_rgba(139,92,246,0.22)] dark:border-violet-500/40 dark:bg-violet-950/40 dark:shadow-[0_12px_28px_rgba(0,0,0,0.45)]";case"window":return"border-sky-200/80 bg-white/80 shadow-[0_10px_24px_rgba(56,189,248,0.18)] group-hover:shadow-[0_14px_30px_rgba(56,189,248,0.22)] dark:border-sky-500/40 dark:bg-sky-950/40 dark:shadow-[0_12px_28px_rgba(0,0,0,0.45)]";case"total":return"border-blue-200/80 bg-white/80 shadow-[0_10px_24px_rgba(59,130,246,0.18)] group-hover:shadow-[0_14px_30px_rgba(59,130,246,0.22)] dark:border-blue-500/40 dark:bg-blue-950/40 dark:shadow-[0_12px_28px_rgba(0,0,0,0.45)]";default:return"border-gray-200/80 bg-white/80 shadow-[0_10px_24px_rgba(148,163,184,0.18)] group-hover:shadow-[0_14px_30px_rgba(148,163,184,0.22)] dark:border-gray-600/50 dark:bg-gray-900/50 dark:shadow-[0_12px_28px_rgba(0,0,0,0.45)]"}}),C=E(()=>{switch(B.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"}}),V=E(()=>{const D=R.value;return B.type==="daily"?D>=90?"bg-gradient-to-r from-rose-500 via-red-500 to-rose-600 dark:from-rose-500 dark:via-red-500 dark:to-rose-600":D>=70?"bg-gradient-to-r from-amber-400 via-orange-400 to-amber-500 dark:from-amber-400 dark:via-orange-400 dark:to-amber-500":"bg-gradient-to-r from-emerald-400 via-emerald-500 to-teal-500 dark:from-emerald-400 dark:via-emerald-500 dark:to-teal-500":B.type==="opus"?D>=90?"bg-gradient-to-r from-rose-500 via-red-500 to-rose-600 dark:from-rose-500 dark:via-red-500 dark:to-rose-600":D>=70?"bg-gradient-to-r from-amber-400 via-orange-400 to-amber-500 dark:from-amber-400 dark:via-orange-400 dark:to-amber-500":"bg-gradient-to-r from-violet-400 via-purple-500 to-fuchsia-500 dark:from-violet-400 dark:via-purple-500 dark:to-fuchsia-500":B.type==="window"?D>=90?"bg-gradient-to-r from-rose-500 via-red-500 to-rose-600 dark:from-rose-500 dark:via-red-500 dark:to-rose-600":D>=70?"bg-gradient-to-r from-amber-400 via-orange-400 to-amber-500 dark:from-amber-400 dark:via-orange-400 dark:to-amber-500":"bg-gradient-to-r from-sky-400 via-cyan-400 to-blue-500 dark:from-sky-400 dark:via-cyan-400 dark:to-blue-500":B.type==="total"?D>=90?"bg-gradient-to-r from-rose-500 via-red-500 to-rose-600 dark:from-rose-500 dark:via-red-500 dark:to-rose-600":D>=70?"bg-gradient-to-r from-amber-400 via-orange-400 to-amber-500 dark:from-amber-400 dark:via-orange-400 dark:to-amber-500":"bg-gradient-to-r from-sky-500 via-blue-500 to-cyan-500 dark:from-sky-500 dark:via-blue-500 dark:to-cyan-500":"bg-gray-300 dark:bg-gray-400"}),q=E(()=>{const D=R.value;if(D>=95)return"bg-rose-500 dark:bg-rose-400";if(D>=80)return"bg-amber-400 dark:bg-amber-300";switch(B.type){case"daily":return"bg-emerald-500 dark:bg-emerald-400";case"opus":return"bg-violet-500 dark:bg-violet-400";case"window":return"bg-sky-500 dark:bg-sky-400";case"total":return"bg-blue-500 dark:bg-blue-400";default:return"bg-slate-400 dark:bg-slate-500"}}),P=E(()=>{const D=R.value;if(D>=95)return"text-rose-600 dark:text-rose-300";if(D>=80)return"text-amber-600 dark:text-amber-300";switch(B.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=E(()=>{const D=R.value;let m="";if(D>=90)m="text-red-700 dark:text-red-400";else if(D>=70)m="text-orange-700 dark:text-orange-400";else switch(B.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 t="";switch(B.type){case"daily":t="fas fa-calendar-day";break;case"opus":t="fas fa-gem";break;case"window":t="fas fa-clock";break;case"total":t="fas fa-wallet";break;default:t="fas fa-infinity"}return`${t} ${m}`}),H=E(()=>{if(R.value>40)return"text-white drop-shadow-[0_1px_2px_rgba(0,0,0,0.8)]";switch(B.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"}}),v=E(()=>{const D=R.value;if(D>70)return"text-white drop-shadow-[0_2px_4px_rgba(0,0,0,0.9)]";if(D>=90)return"text-red-700 dark:text-red-300";if(D>=70)return"text-orange-700 dark:text-orange-300";switch(B.type){case"daily":return"text-green-800 dark:text-green-200";case"opus":return"text-purple-800 dark:text-purple-200";case"window":return"text-blue-800 dark:text-blue-200";case"total":return"text-blue-800 dark:text-blue-200";default:return"text-gray-900 dark:text-gray-100"}});return(D,m)=>(i(),d("div",ui,[!b.limit||b.limit<=0?(i(),d("div",ci,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)]))):c.value?(i(),d("div",gi,[e("div",pi,[e("div",{class:j(["flex items-center gap-1.5",P.value])},[e("i",{class:j(["text-[11px]",Q.value])},null,2),e("span",null,u(b.label),1)],2),e("span",mi,"$"+u(b.current.toFixed(2))+" / $"+u(b.limit.toFixed(2)),1)]),e("div",xi,[e("div",{class:j(["absolute inset-y-0 rounded-full transition-all duration-500 ease-out",q.value]),style:dt({width:R.value+"%"})},null,6)])])):(i(),d("div",{key:2,class:j(["group relative h-9 w-full overflow-hidden rounded-xl border transition-all duration-300 ease-out",F.value])},[e("div",{class:j(["absolute inset-0",C.value])},null,2),e("div",{class:j(["absolute inset-0 h-full transition-all duration-500 ease-out",V.value]),style:dt({width:R.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",yi,[e("div",fi,[e("i",{class:j(["text-xs",Q.value])},null,2),e("span",{class:j(["text-xs font-semibold",H.value])},u(b.label),3)]),e("div",bi,[e("span",{class:j(["text-xs font-bold tabular-nums",v.value])}," $"+u(b.current.toFixed(2))+" / $"+u(b.limit.toFixed(2)),3)])]),b.showShine&&R.value>0?(i(),d("div",vi)):h("",!0)],2))]))}},Se=Ke(ki,[["__scopeId","data-v-8a01dc56"]]),wi={key:0,class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},hi={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"},Ai={class:"mb-4 flex items-center justify-between sm:mb-6"},$i={class:"flex items-center gap-2 sm:gap-3"},Ci={class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"},Ii={class:"modal-scroll-content custom-scrollbar flex-1 overflow-y-auto"},Ki={class:"mb-6 grid grid-cols-1 gap-4 md:grid-cols-2"},Li={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"},Di={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},Si={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},Ti={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"},_i={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},Mi={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},Pi={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"},Vi={class:"text-2xl font-bold text-gray-900 dark:text-gray-100"},Ri={class:"mt-1 text-xs text-gray-600 dark:text-gray-400"},Ui={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"},Oi={class:"space-y-1 text-sm"},Ei={class:"flex justify-between"},ji={class:"font-semibold text-gray-900 dark:text-gray-100"},Gi={class:"flex justify-between"},qi={class:"font-semibold text-gray-900 dark:text-gray-100"},zi={class:"mb-6"},Fi={class:"space-y-3 rounded-lg bg-gray-50 p-4 dark:bg-gray-700/50"},Bi={class:"flex items-center justify-between"},Wi={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},Ni={class:"flex items-center justify-between"},Hi={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},Yi={key:0,class:"flex items-center justify-between"},Qi={class:"text-sm font-semibold text-purple-600"},Ji={key:1,class:"flex items-center justify-between"},Xi={class:"text-sm font-semibold text-purple-600"},Zi={key:0,class:"mb-6"},ed={class:"space-y-3 rounded-lg bg-gray-50 p-4 dark:bg-gray-700/50"},td={key:0,class:"space-y-1.5"},sd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},ad={key:1,class:"space-y-1.5"},rd={class:"text-right text-xs text-gray-500 dark:text-gray-400"},od={key:2,class:"space-y-1.5"},ld={class:"text-right text-xs text-gray-500 dark:text-gray-400"},nd={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"},id={class:"font-semibold text-purple-600 dark:text-purple-300"},dd={key:4,class:"space-y-2"},ud={__name:"UsageDetailModal",props:{show:{type:Boolean,required:!0},apiKey:{type:Object,required:!0}},emits:["close"],setup(b,{emit:B}){const c=b,R=B,F=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.total)==null?void 0:o.requests)||0}),C=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.daily)==null?void 0:o.requests)||0}),V=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.total)==null?void 0:o.tokens)||0}),q=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.daily)==null?void 0:o.tokens)||0}),P=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.total)==null?void 0:o.cost)||0}),Q=E(()=>c.apiKey.dailyCost||0),H=E(()=>c.apiKey.totalCostLimit||0),v=E(()=>c.apiKey.weeklyOpusCost||0),D=E(()=>c.apiKey.weeklyOpusCostLimit||0),m=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.total)==null?void 0:o.inputTokens)||0}),t=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.total)==null?void 0:o.outputTokens)||0}),U=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.total)==null?void 0:o.cacheCreateTokens)||0}),_=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.total)==null?void 0:o.cacheReadTokens)||0}),z=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.averages)==null?void 0:o.rpm)||0}),$=E(()=>{var f,o;return((o=(f=c.apiKey.usage)==null?void 0:f.averages)==null?void 0:o.tpm)||0}),L=E(()=>c.apiKey.dailyCostLimit>0||c.apiKey.totalCostLimit>0||c.apiKey.concurrencyLimit>0||c.apiKey.weeklyOpusCostLimit>0||c.apiKey.rateLimitWindow>0||c.apiKey.tokenLimit>0),ee=E(()=>!c.apiKey.dailyCostLimit||c.apiKey.dailyCostLimit===0?0:Q.value/c.apiKey.dailyCostLimit*100),J=E(()=>!H.value||H.value===0?0:P.value/H.value*100),ge=E(()=>!D.value||D.value===0?0:v.value/D.value*100),ue=f=>!f&&f!==0?"0":f.toLocaleString("zh-CN"),Y=f=>f>=1e6?(f/1e6).toFixed(1)+"M":f>=1e3?(f/1e3).toFixed(1)+"K":f.toString(),ye=()=>{R("close")};return(f,o)=>(i(),me(Te,{to:"body"},[b.show?(i(),d("div",wi,[e("div",{class:"fixed inset-0 bg-gray-900 bg-opacity-50 backdrop-blur-sm",onClick:ye}),e("div",hi,[e("div",Ai,[e("div",$i,[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",Ci," 使用统计详情 - "+u(b.apiKey.name),1)]),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600",onClick:ye},o[1]||(o[1]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),e("div",Ii,[e("div",Ki,[e("div",Li,[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",Di,u(ue(F.value)),1),e("div",Si," 今日: "+u(ue(C.value))+" 次 ",1)]),e("div",Ti,[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",_i,u(Y(V.value)),1),e("div",Mi," 今日: "+u(Y(q.value)),1)]),e("div",Pi,[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",Vi," $"+u(P.value.toFixed(4)),1),e("div",Ri," 今日: $"+u(Q.value.toFixed(4)),1)]),e("div",Ui,[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",Oi,[e("div",Ei,[o[5]||(o[5]=e("span",{class:"text-gray-600 dark:text-gray-400"},"RPM:",-1)),e("span",ji,u(z.value),1)]),e("div",Gi,[o[6]||(o[6]=e("span",{class:"text-gray-600 dark:text-gray-400"},"TPM:",-1)),e("span",qi,u($.value),1)])])])]),e("div",zi,[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"}),A(" Token 使用分布 ")],-1)),e("div",Fi,[e("div",Bi,[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",Wi,u(Y(m.value)),1)]),e("div",Ni,[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",Hi,u(Y(t.value)),1)]),U.value>0?(i(),d("div",Yi,[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",Qi,u(Y(U.value)),1)])):h("",!0),_.value>0?(i(),d("div",Ji,[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",Xi,u(Y(_.value)),1)])):h("",!0)])]),L.value?(i(),d("div",Zi,[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"}),A(" 限制设置 ")],-1)),e("div",ed,[b.apiKey.dailyCostLimit>0?(i(),d("div",td,[ne(Se,{current:Q.value,label:"每日费用限制",limit:b.apiKey.dailyCostLimit,"show-shine":!0,type:"daily"},null,8,["current","limit"]),e("div",sd," 已使用 "+u(Math.min(ee.value,100).toFixed(1))+"% ",1)])):h("",!0),b.apiKey.weeklyOpusCostLimit>0?(i(),d("div",ad,[ne(Se,{current:v.value,label:"Opus 周费用限制",limit:b.apiKey.weeklyOpusCostLimit,"show-shine":!0,type:"opus"},null,8,["current","limit"]),e("div",rd," 已使用 "+u(Math.min(ge.value,100).toFixed(1))+"% ",1)])):h("",!0),b.apiKey.totalCostLimit>0?(i(),d("div",od,[ne(Se,{current:P.value,label:"总费用限制",limit:b.apiKey.totalCostLimit,"show-shine":!0,type:"total"},null,8,["current","limit"]),e("div",ld," 已使用 "+u(Math.min(J.value,100).toFixed(1))+"% ",1)])):h("",!0),b.apiKey.concurrencyLimit>0?(i(),d("div",nd,[o[13]||(o[13]=e("span",{class:"text-gray-600 dark:text-gray-300"},"并发限制",-1)),e("span",id,u(b.apiKey.currentConcurrency||0)+" / "+u(b.apiKey.concurrencyLimit),1)])):h("",!0),b.apiKey.rateLimitWindow>0?(i(),d("div",dd,[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"}),A(" 时间窗口限制 ")],-1)),ne(Ts,{"cost-limit":b.apiKey.rateLimitCost,"current-cost":b.apiKey.currentWindowCost,"current-requests":b.apiKey.currentWindowRequests,"current-tokens":b.apiKey.currentWindowTokens,label:"窗口状态","rate-limit-window":b.apiKey.rateLimitWindow,"request-limit":b.apiKey.rateLimitRequests,"show-progress":!0,"show-tooltip":!0,"token-limit":b.apiKey.tokenLimit,"window-end-time":b.apiKey.windowEndTime,"window-remaining-seconds":b.apiKey.windowRemainingSeconds,"window-start-time":b.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"])])):h("",!0)])])):h("",!0)]),e("div",{class:"mt-4 flex justify-end gap-2 sm:mt-6 sm:gap-3"},[e("button",{class:"btn btn-secondary px-4 py-2 text-sm",type:"button",onClick:ye}," 关闭 ")])])])):h("",!0)]))}},cd=Ke(ud,[["__scopeId","data-v-da99842f"]]),gd={class:"tab-content"},pd={class:"card p-4 sm:p-6"},md={class:"mb-4 flex flex-col gap-4 sm:mb-6"},xd={class:"border-b border-gray-200 dark:border-gray-700"},yd={"aria-label":"Tabs",class:"-mb-px flex space-x-8"},fd={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"},bd={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"},vd={key:0,class:"tab-panel"},kd={class:"mb-4 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between"},wd={class:"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:gap-3"},hd={class:"group relative min-w-[140px]"},Ad={key:0,class:"flex items-center"},$d={class:"group relative min-w-[140px]"},Cd={class:"relative"},Id={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"},Kd={class:"flex min-w-[240px] flex-col gap-2 sm:flex-row sm:items-center"},Ld={class:"sm:w-44"},Dd={class:"group relative flex-1"},Sd={class:"relative flex items-center"},Td=["placeholder"],_d={class:"flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center sm:gap-3"},Md=["disabled"],Pd={class:"relative"},Vd={class:"relative"},Rd={key:0,class:"py-12 text-center"},Ud={key:1,class:"py-12 text-center"},Od={key:2,class:"table-wrapper hidden md:block"},Ed={class:"table-container"},jd={class:"w-full table-fixed"},Gd={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"},qd={key:0,class:"w-[50px] px-3 py-4 text-left"},zd={class:"flex items-center"},Fd=["indeterminate"],Bd={key:1,class:"fas fa-sort ml-1 text-gray-400"},Wd={key:1,class:"fas fa-sort ml-1 text-gray-400"},Nd={key:1,class:"fas fa-sort ml-1 text-gray-400"},Hd={key:1,class:"fas fa-sort ml-1 text-gray-400"},Yd={key:1,class:"fas fa-sort ml-1 text-gray-400"},Qd={key:1,class:"fas fa-sort ml-1 text-gray-400"},Jd={key:1,class:"fas fa-sort ml-1 text-gray-400"},Xd={key:1,class:"fas fa-sort ml-1 text-gray-400"},Zd={key:0,class:"px-3 py-3"},e0={class:"flex items-center"},t0=["value"],s0={class:"px-3 py-3"},a0={class:"min-w-0"},r0=["title"],o0={key:0,class:"mt-1 text-xs text-red-600"},l0={class:"px-3 py-3"},n0={class:"space-y-1"},i0={key:0,class:"flex items-center gap-1 text-xs"},d0={class:"truncate text-gray-600 dark:text-gray-400"},u0={key:1,class:"flex items-center gap-1 text-xs"},c0={class:"truncate text-gray-600 dark:text-gray-400"},g0={key:2,class:"flex items-center gap-1 text-xs"},p0={class:"truncate text-gray-600 dark:text-gray-400"},m0={key:3,class:"flex items-center gap-1 text-xs"},x0={class:"truncate text-gray-600 dark:text-gray-400"},y0={key:4,class:"flex items-center gap-1 text-xs"},f0={class:"truncate text-gray-600 dark:text-gray-400"},b0={key:5,class:"text-xs text-gray-500 dark:text-gray-400"},v0={class:"px-3 py-3"},k0={class:"flex flex-wrap gap-1"},w0={key:0,class:"text-xs text-gray-400"},h0={class:"whitespace-nowrap px-3 py-3"},A0={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},$0={class:"font-semibold text-blue-600 dark:text-blue-400",style:{"font-size":"14px"}},C0={class:"px-2 py-2",style:{"font-size":"12px"}},I0={class:"flex flex-col gap-2"},K0={key:2,class:"space-y-1.5"},L0={class:"flex items-center justify-between text-[10px]"},D0={class:"flex items-center gap-1 text-sky-600 dark:text-sky-300"},S0={class:"font-medium"},T0={key:3,class:"flex items-center justify-center gap-1.5 py-2 text-gray-500 dark:text-gray-400"},_0={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},M0={class:"flex items-center justify-end gap-1"},P0={class:"font-medium text-purple-600 dark:text-purple-400",style:{"font-size":"13px"}},V0={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},R0={class:"flex items-center justify-end gap-1"},U0={class:"font-medium text-gray-900 dark:text-gray-100",style:{"font-size":"13px"}},O0={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},E0=["title"],j0={key:1,class:"text-gray-400",style:{"font-size":"13px"}},G0={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},q0={class:"whitespace-nowrap px-3 py-3 text-sm text-gray-700 dark:text-gray-300"},z0={class:"inline-flex items-center gap-1.5"},F0={key:0,class:"inline-flex items-center text-blue-600 dark:text-blue-400",style:{"font-size":"13px"}},B0={key:1},W0=["onClick"],N0=["onClick"],H0=["onClick"],Y0=["onClick"],Q0={class:"operations-column operations-cell whitespace-nowrap px-3 py-3",style:{"font-size":"13px"}},J0={class:"flex gap-1"},X0=["onClick"],Z0=["onClick"],eu=["onClick"],tu=["onClick"],su=["title","onClick"],au={class:"ml-1 hidden xl:inline"},ru=["onClick"],ou={key:0},lu={class:"bg-gray-50 px-3 py-3 dark:bg-gray-700",colspan:"13"},nu={key:0,class:"py-4 text-center"},iu={class:"space-y-4"},du={class:"mb-4 flex items-center justify-between"},uu={class:"flex items-center gap-2"},cu={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"},gu={class:"flex items-center gap-1"},pu={class:"flex gap-1 rounded bg-gray-100 p-1 dark:bg-gray-700"},mu=["onClick"],xu={key:0,class:"py-8 text-center"},yu={class:"mb-3 flex items-center justify-center gap-2"},fu=["onClick"],bu={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"},vu={class:"mb-3 flex items-start justify-between"},ku={class:"flex-1"},wu={class:"mb-1 block text-sm font-semibold text-gray-800 dark:text-gray-200"},hu={class:"rounded-full bg-blue-50 px-2 py-1 text-xs text-gray-500 dark:bg-blue-900/30 dark:text-gray-400"},Au={class:"mb-3 space-y-2"},$u={class:"flex items-center justify-between text-sm"},Cu={class:"font-semibold text-gray-900 dark:text-gray-100"},Iu={class:"flex items-center justify-between text-sm"},Ku={class:"font-semibold text-green-600"},Lu={class:"mt-2 border-t border-gray-100 pt-2 dark:border-gray-600"},Du={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},Su={class:"font-medium"},Tu={class:"flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},_u={class:"font-medium"},Mu={key:0,class:"flex items-center justify-between text-xs text-purple-600"},Pu={class:"font-medium"},Vu={key:1,class:"flex items-center justify-between text-xs text-purple-600"},Ru={class:"font-medium"},Uu={class:"mt-3 h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Ou={class:"mt-1 text-right"},Eu={class:"text-xs font-medium text-indigo-600"},ju={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"},Gu={class:"flex items-center justify-between text-sm"},qu={class:"flex gap-4 text-xs"},zu={class:"text-gray-600 dark:text-gray-400"},Fu={class:"font-semibold text-gray-800 dark:text-gray-200"},Bu={class:"text-gray-600 dark:text-gray-400"},Wu={class:"font-semibold text-gray-800 dark:text-gray-200"},Nu={key:3,class:"space-y-3 md:hidden"},Hu={class:"mb-3 flex items-start justify-between"},Yu={class:"flex items-center gap-3"},Qu=["value"],Ju={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},Xu={class:"mt-0.5 text-xs text-gray-500 dark:text-gray-400"},Zu={class:"mb-3 space-y-1.5"},ec={key:0,class:"flex flex-wrap items-center gap-1 text-xs"},tc={class:"text-gray-600 dark:text-gray-400"},sc={key:1,class:"flex flex-wrap items-center gap-1 text-xs"},ac={class:"text-gray-600 dark:text-gray-400"},rc={key:2,class:"flex flex-wrap items-center gap-1 text-xs"},oc={class:"text-gray-600 dark:text-gray-400"},lc={key:3,class:"flex flex-wrap items-center gap-1 text-xs"},nc={class:"text-gray-600 dark:text-gray-400"},ic={key:4,class:"flex flex-wrap items-center gap-1 text-xs"},dc={class:"text-gray-600 dark:text-gray-400"},uc={key:5,class:"text-xs text-gray-500 dark:text-gray-400"},cc={key:6,class:"text-xs text-red-600"},gc={class:"mb-3 space-y-2"},pc={class:"rounded-lg bg-gray-50 p-3 dark:bg-gray-700"},mc={class:"mb-2 flex items-center justify-between"},xc={class:"text-xs text-gray-600 dark:text-gray-400"},yc=["onClick"],fc={class:"grid grid-cols-2 gap-3"},bc={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},vc={class:"text-sm font-semibold text-green-600"},kc={class:"mt-2 flex items-center justify-between"},wc={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},hc={class:"space-y-2"},Ac={key:2,class:"space-y-2"},$c={class:"flex items-center justify-between text-xs"},Cc={class:"flex items-center gap-1.5 text-sky-600 dark:text-sky-300"},Ic={class:"font-medium"},Kc={key:3,class:"flex items-center justify-center gap-1.5 py-2 text-gray-500 dark:text-gray-400"},Lc={class:"mb-3 text-xs text-gray-500 dark:text-gray-400"},Dc={class:"mb-1 flex justify-between"},Sc={class:"flex items-center justify-between"},Tc={class:"flex items-center gap-1"},_c=["onClick"],Mc={key:0,class:"mb-3 flex flex-wrap gap-1"},Pc={class:"mt-3 flex gap-2 border-t border-gray-100 pt-3 dark:border-gray-600"},Vc=["onClick"],Rc=["onClick"],Uc=["onClick"],Oc=["onClick"],Ec=["onClick"],jc={key:4,class:"mt-4 flex flex-col items-center justify-between gap-4 sm:mt-6 sm:flex-row"},Gc={class:"flex w-full flex-col items-center gap-3 sm:w-auto sm:flex-row"},qc={class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},zc={class:"flex items-center gap-2"},Fc=["value"],Bc={class:"flex items-center gap-2"},Wc=["disabled"],Nc={class:"flex items-center gap-1"},Hc={key:1,class:"hidden px-2 text-gray-500 dark:text-gray-400 sm:inline"},Yc=["onClick"],Qc={key:2,class:"hidden px-2 text-gray-500 dark:text-gray-400 sm:inline"},Jc=["disabled"],Xc={key:1,class:"tab-panel"},Zc={key:0,class:"py-12 text-center"},eg={key:1,class:"py-12 text-center"},tg={key:2},sg={class:"mb-4 flex justify-end"},ag={class:"table-wrapper"},rg={class:"table-container"},og={class:"w-full table-fixed"},lg={class:"bg-gray-50/80 backdrop-blur-sm dark:bg-gray-700/80"},ng={key:0,class:"w-[15%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"},ig={class:"divide-y divide-gray-200/50 dark:divide-gray-600/50"},dg={class:"px-3 py-3"},ug={class:"flex items-center"},cg={class:"min-w-0"},gg=["title"],pg={class:"px-3 py-3"},mg={class:"space-y-1"},xg={key:0,class:"flex items-center gap-1 text-xs"},yg={key:1,class:"flex items-center gap-1 text-xs"},fg={key:2,class:"flex items-center gap-1 text-xs"},bg={key:3,class:"text-xs text-gray-500 dark:text-gray-400"},vg={key:0,class:"px-3 py-3"},kg={class:"text-xs"},wg={key:0,class:"text-blue-600"},hg={key:1,class:"text-green-600"},Ag={key:2,class:"text-gray-500 dark:text-gray-400"},$g={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Cg={class:"px-3 py-3"},Ig={class:"text-xs"},Kg={key:0,class:"text-blue-600"},Lg={key:1,class:"text-green-600"},Dg={key:2,class:"text-gray-500 dark:text-gray-400"},Sg={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Tg={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},_g={class:"font-medium text-blue-600 dark:text-blue-400",style:{"font-size":"13px"}},Mg={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Pg={class:"font-medium text-purple-600 dark:text-purple-400",style:{"font-size":"13px"}},Vg={class:"whitespace-nowrap px-3 py-3 text-right",style:{"font-size":"13px"}},Rg={class:"flex items-center justify-end gap-1"},Ug={class:"font-medium text-gray-900 dark:text-gray-100",style:{"font-size":"13px"}},Og={class:"whitespace-nowrap px-3 py-3 text-gray-700 dark:text-gray-300",style:{"font-size":"13px"}},Eg={key:0,style:{"font-size":"13px"}},jg={key:1,class:"text-gray-400",style:{"font-size":"13px"}},Gg={class:"operations-column operations-cell px-3 py-3"},qg={class:"flex items-center gap-2"},zg=["onClick"],Fg=["onClick"],Bg={__name:"ApiKeysView",setup(b){const B=ht(),c=Ss(),R=M([]),F=E(()=>{var a;return((a=c.oemSettings)==null?void 0:a.ldapEnabled)||!1}),C=M([]),V=M(!1),q=M(!1),P=M(!1),Q=M(!1),H=M("today"),v=Fe({type:"preset",preset:"today",customStart:"",customEnd:"",customRange:null}),D=E(()=>P.value),m=()=>{P.value=!P.value,P.value||(C.value=[],V.value=!1,q.value=!1)},t=E(()=>[{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"}]),U=M("active"),_=M([]),z=M(!1),$=M("periodCost"),L=M("desc"),ee=M({}),J=M({}),ge=M({}),ue=M([new Date(2e3,1,1,0,0,0),new Date(2e3,2,1,23,59,59)]),Y=M({claude:[],gemini:[],openai:[],openaiResponses:[],bedrock:[],droid:[],claudeGroups:[],geminiGroups:[],openaiGroups:[],droidGroups:[]}),ye=M(null),f=M(null),o=M(!1),l=M(null),p=M(""),I=M([]),w=M(""),n=M("apiKey"),x=E(()=>[{value:"apiKey",label:"按Key名称",icon:"fa-key"},{value:"bindingAccount",label:"按所属账号",icon:"fa-id-badge"}]),oe=E(()=>{const a=[{value:"",label:"所有标签",icon:"fa-asterisk"}];return I.value.forEach(s=>{a.push({value:s,label:s,icon:"fa-tag"})}),a}),pe=E(()=>p.value?R.value.filter(a=>a.tags&&a.tags.includes(p.value)).length:0),X=M(1),N=M((()=>{const a=localStorage.getItem("apiKeysPageSize");if(a){const s=parseInt(a,10);if([10,20,50,100].includes(s))return s}return 10})()),xe=[10,20,50,100],Ce=M(!1),_e=M(!1),Me=M(!1),le=M(!1),Ie=M(!1),et=M(!1),$t=M(null),Ct=M(null),It=M(null),Kt=M([]),Xt=a=>{const s=new Set,g=(...S)=>{S.forEach(W=>{if(typeof W!="string")return;const K=W.trim();K&&s.add(K)})},r=S=>typeof S!="string"?"":S.replace(/^⚠️\s*/,"").replace(/^🔒\s*/,"").trim(),y=(S,W)=>{const K=r(W);g(S,W,K),K&&g(`${S} ${K}`)};return(a.claudeAccountId||a.claudeConsoleAccountId)&&y("Claude",ct(a)),a.geminiAccountId&&y("Gemini",gt(a)),a.openaiAccountId&&y("OpenAI",pt(a)),a.bedrockAccountId&&y("Bedrock",mt(a)),a.droidAccountId&&y("Droid",xt(a)),!a.claudeAccountId&&!a.claudeConsoleAccountId&&!a.geminiAccountId&&!a.openaiAccountId&&!a.bedrockAccountId&&!a.droidAccountId&&g("共享池"),Array.from(s)},je=E(()=>{let a=R.value;if(p.value&&(a=R.value.filter(g=>g.tags&&g.tags.includes(p.value))),w.value){const g=w.value.toLowerCase().trim();a=a.filter(r=>{if(n.value==="bindingAccount"){const S=Xt(r);return S.length===0?!1:S.some(W=>W.toLowerCase().includes(g))}const y=r.name&&r.name.toLowerCase().includes(g);if(F.value){const S=r.ownerDisplayName&&r.ownerDisplayName.toLowerCase().includes(g);return y||S}return y})}return $.value?[...a].sort((g,r)=>{let y=g[$.value],S=r[$.value];return $.value==="status"?(y=g.isActive?1:0,S=r.isActive?1:0):$.value==="periodRequests"?(y=lt(g),S=lt(r)):$.value==="periodCost"?(y=yt(g),S=yt(r)):$.value==="periodTokens"?(y=nt(g),S=nt(r)):$.value==="dailyCost"?(y=g.dailyCost||0,S=r.dailyCost||0):$.value==="totalCost"?(y=g.totalCost||0,S=r.totalCost||0):($.value==="createdAt"||$.value==="expiresAt"||$.value==="lastUsedAt")&&(y=y?new Date(y).getTime():0,S=S?new Date(S).getTime():0),y<S?L.value==="asc"?-1:1:y>S?L.value==="asc"?1:-1:0}):a}),Oe=E(()=>{const a=je.value.length;return Math.ceil(a/N.value)||0}),Be=E(()=>{const a=[],s=X.value,g=Oe.value;if(g<=7)for(let r=1;r<=g;r++)a.push(r);else{let r=Math.max(1,s-2),y=Math.min(g,s+2);s<=3?y=5:s>=g-2&&(r=g-4);for(let S=r;S<=y;S++)a.push(S)}return a}),Lt=E(()=>{const a=Be.value;return a.length===0?!1:a[0]>1}),Dt=E(()=>{const a=Be.value;return a.length===0?!1:a[a.length-1]<Oe.value}),Zt=E(()=>{const a=Be.value;return a.length===0?!1:Lt.value&&a[0]>2}),es=E(()=>{const a=Be.value;return a.length===0?!1:Dt.value&&a[a.length-1]<Oe.value-1}),Ge=E(()=>{const a=(X.value-1)*N.value,s=a+N.value;return je.value.slice(a,s)}),tt=async()=>{var a,s;try{const[g,r,y,S,W,K,re,fe]=await Promise.all([G.get("/admin/claude-accounts"),G.get("/admin/claude-console-accounts"),G.get("/admin/gemini-accounts"),G.get("/admin/openai-accounts"),G.get("/admin/openai-responses-accounts"),G.get("/admin/bedrock-accounts"),G.get("/admin/droid-accounts"),G.get("/admin/account-groups")]),k=[];if(g.success&&((a=g.data)==null||a.forEach(Z=>{k.push({...Z,platform:"claude-oauth",isDedicated:Z.accountType==="dedicated"})})),r.success&&((s=r.data)==null||s.forEach(Z=>{k.push({...Z,platform:"claude-console",isDedicated:Z.accountType==="dedicated"})})),Y.value.claude=k,y.success&&(Y.value.gemini=(y.data||[]).map(Z=>({...Z,isDedicated:Z.accountType==="dedicated"}))),S.success&&(Y.value.openai=(S.data||[]).map(Z=>({...Z,isDedicated:Z.accountType==="dedicated"}))),W.success&&(Y.value.openaiResponses=(W.data||[]).map(Z=>({...Z,isDedicated:Z.accountType==="dedicated"}))),K.success&&(Y.value.bedrock=(K.data||[]).map(Z=>({...Z,isDedicated:Z.accountType==="dedicated"}))),re.success&&(Y.value.droid=(re.data||[]).map(Z=>({...Z,platform:"droid",isDedicated:Z.accountType==="dedicated"}))),fe.success){const Z=fe.data||[];Y.value.claudeGroups=Z.filter(ce=>ce.platform==="claude"),Y.value.geminiGroups=Z.filter(ce=>ce.platform==="gemini"),Y.value.openaiGroups=Z.filter(ce=>ce.platform==="openai"),Y.value.droidGroups=Z.filter(ce=>ce.platform==="droid")}}catch{}},he=async()=>{Q.value=!0;try{let a={};v.type==="custom"&&v.customStart&&v.customEnd?(a.startDate=v.customStart,a.endDate=v.customEnd,a.timeRange="custom"):v.preset==="all"?a.timeRange="all":a.timeRange=v.preset;const s=new URLSearchParams(a).toString(),g=await G.get(`/admin/api-keys?${s}`);if(g.success){R.value=g.data||[];const r=new Set;R.value.forEach(y=>{y.tags&&Array.isArray(y.tags)&&y.tags.forEach(S=>r.add(S))}),I.value=Array.from(r).sort()}}catch{O("加载 API Keys 失败","error")}finally{Q.value=!1}},st=async()=>{U.value="deleted",z.value=!0;try{const a=await G.get("/admin/api-keys/deleted");a.success&&(_.value=a.apiKeys||[])}catch{O("加载已删除的 API Keys 失败","error")}finally{z.value=!1}},Pe=a=>{$.value===a?L.value=L.value==="asc"?"desc":"asc":($.value=a,L.value="asc")},ut=a=>!a&&a!==0?"0":a.toLocaleString("zh-CN"),ke=a=>!a&&a!==0?"0":a>=1e6?(a/1e6).toFixed(1)+"M":a>=1e3?(a/1e3).toFixed(1)+"K":a.toString(),We=a=>{if(!a)return"未知账户";if(a.startsWith("group:")){const K=a.substring(6),re=Y.value.claudeGroups.find(ce=>ce.id===K);if(re)return`分组-${re.name}`;const fe=Y.value.geminiGroups.find(ce=>ce.id===K);if(fe)return`分组-${fe.name}`;const k=Y.value.openaiGroups.find(ce=>ce.id===K);if(k)return`分组-${k.name}`;const Z=Y.value.droidGroups.find(ce=>ce.id===K);return Z?`分组-${Z.name}`:`分组-${K.substring(0,8)}`}const s=Y.value.claude.find(K=>K.id===a);if(s)return`${s.name}`;const g=Y.value.gemini.find(K=>K.id===a);if(g)return`${g.name}`;if(a.startsWith("responses:")){const K=a.replace("responses:",""),re=Y.value.openaiResponses.find(fe=>fe.id===K);return re?`${re.name}`:`${K.substring(0,8)}`}const r=Y.value.openai.find(K=>K.id===a);if(r)return`${r.name}`;const y=Y.value.openaiResponses.find(K=>K.id===a);if(y)return`${y.name}`;const S=Y.value.bedrock.find(K=>K.id===a);if(S)return`${S.name}`;const W=Y.value.droid.find(K=>K.id===a);return W?`${W.name}`:`${a.substring(0,8)}`},ct=a=>{if(a.claudeAccountId){const s=We(a.claudeAccountId);if(a.claudeAccountId.startsWith("group:"))return s;const g=Y.value.claude.find(r=>r.id===a.claudeAccountId);return g?g.accountType==="dedicated"?`🔒 专属-${s}`:s:`⚠️ ${s} (账户不存在)`}if(a.claudeConsoleAccountId){const s=Y.value.claude.find(g=>g.id===a.claudeConsoleAccountId&&g.platform==="claude-console");return s?`Console-${s.name}`:"⚠️ Console账户不存在"}return""},gt=a=>{if(a.geminiAccountId){const s=We(a.geminiAccountId);if(a.geminiAccountId.startsWith("group:"))return s;const g=Y.value.gemini.find(r=>r.id===a.geminiAccountId);return g?g.accountType==="dedicated"?`🔒 专属-${s}`:s:`⚠️ ${s} (账户不存在)`}return""},pt=a=>{if(a.openaiAccountId){const s=We(a.openaiAccountId);if(a.openaiAccountId.startsWith("group:"))return s;let g=null;if(a.openaiAccountId.startsWith("responses:")){const r=a.openaiAccountId.replace("responses:","");g=Y.value.openaiResponses.find(y=>y.id===r)}else g=Y.value.openai.find(r=>r.id===a.openaiAccountId);return g?g.accountType==="dedicated"?`🔒 专属-${s}`:s:`⚠️ ${s} (账户不存在)`}return""},mt=a=>{if(a.bedrockAccountId){const s=We(a.bedrockAccountId);if(a.bedrockAccountId.startsWith("group:"))return s;const g=Y.value.bedrock.find(r=>r.id===a.bedrockAccountId);return g?g.accountType==="dedicated"?`🔒 专属-${s}`:s:`⚠️ ${s} (账户不存在)`}return""},xt=a=>{if(a.droidAccountId){const s=We(a.droidAccountId);if(a.droidAccountId.startsWith("group:"))return s;const g=Y.value.droid.find(r=>r.id===a.droidAccountId);return g?g.accountType==="dedicated"?`🔒 专属-${s}`:s:`⚠️ ${s} (账户不存在)`}return""},at=a=>a?new Date(a)<new Date:!1,rt=a=>!a||at(a)?!1:(new Date(a)-new Date)/(1e3*60*60*24)<=7,St=a=>a?new Date(a).toLocaleDateString("zh-CN"):"",ts=async a=>{ee.value[a]?ee.value[a]=!1:(ee.value[a]=!0,ge.value[a]||Pt(a),await ot(a,!0))},ot=async(a,s=!1)=>{if(!s&&J.value[a]&&J.value[a].length>0)return;const g=Ve(a);try{let r=`/admin/api-keys/${a}/model-stats`;const y=new URLSearchParams;if(g.customStart&&g.customEnd)y.append("startDate",g.customStart),y.append("endDate",g.customEnd),y.append("period","custom");else{const W=g.preset==="today"||g.preset==="7days"?"daily":"monthly";y.append("period",W)}r+="?"+y.toString();const S=await G.get(r);S.success&&(J.value[a]=S.data||[])}catch{O("加载模型统计失败","error"),J.value[a]=[]}},Tt=(a,s)=>{const g=s.reduce((r,y)=>r+(y.allTokens||0),0);return g===0?0:Math.round(a/g*100)},ss=a=>a.formatted&&a.formatted.total?a.formatted.total:a.cost!==void 0?`$${a.cost.toFixed(6)}`:"$0.000000",lt=a=>{var s,g,r,y,S,W;if(v.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.requests!==void 0)return a.usage.custom.requests;if(a.usage.total&&a.usage.total.requests!==void 0)return a.usage.total.requests}return 0}else{if(v.preset==="today")return((g=(s=a.usage)==null?void 0:s.daily)==null?void 0:g.requests)||0;if(v.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].requests!==void 0?a.usage["7days"].requests:0;if(v.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].requests!==void 0)return a.usage["30days"].requests;if(a.usage.monthly&&a.usage.monthly.requests!==void 0)return a.usage.monthly.requests}return 0}else return v.preset==="all"?a.usage&&a.usage.all&&a.usage.all.requests!==void 0?a.usage.all.requests:((y=(r=a.usage)==null?void 0:r.total)==null?void 0:y.requests)||0:((W=(S=a.usage)==null?void 0:S.total)==null?void 0:W.requests)||0}},_t=a=>{if(v.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.cost!==void 0)return a.usage.custom.cost;if(a.usage.total&&a.usage.total.cost!==void 0)return a.usage.total.cost}return 0}else{if(v.preset==="today")return a.dailyCost||0;if(v.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].cost!==void 0?a.usage["7days"].cost:a.weeklyCost||a.periodCost||0;if(v.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].cost!==void 0)return a.usage["30days"].cost;if(a.usage.monthly&&a.usage.monthly.cost!==void 0)return a.usage.monthly.cost;if(a.usage.total&&a.usage.total.cost!==void 0)return a.usage.total.cost}return a.monthlyCost||a.periodCost||0}else return v.preset==="all"?a.usage&&a.usage.all&&a.usage.all.cost!==void 0?a.usage.all.cost:a.totalCost||0:a.periodCost||a.totalCost||0}},nt=a=>{var s,g,r,y,S,W;if(v.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.tokens!==void 0)return a.usage.custom.tokens;if(a.usage.total&&a.usage.total.tokens!==void 0)return a.usage.total.tokens}return 0}else{if(v.preset==="today")return((g=(s=a.usage)==null?void 0:s.daily)==null?void 0:g.tokens)||0;if(v.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].tokens!==void 0?a.usage["7days"].tokens:0;if(v.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].tokens!==void 0)return a.usage["30days"].tokens;if(a.usage.monthly&&a.usage.monthly.tokens!==void 0)return a.usage.monthly.tokens;if(a.usage.total&&a.usage.total.tokens!==void 0)return a.usage.total.tokens}return 0}else return v.preset==="all"?a.usage&&a.usage.all&&a.usage.all.tokens!==void 0?a.usage.all.tokens:((y=(r=a.usage)==null?void 0:r.total)==null?void 0:y.tokens)||0:((W=(S=a.usage)==null?void 0:S.total)==null?void 0:W.tokens)||0}},as=a=>{var s,g,r,y,S,W;if(v.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.inputTokens!==void 0)return a.usage.custom.inputTokens;if(a.usage.total&&a.usage.total.inputTokens!==void 0)return a.usage.total.inputTokens}return 0}else{if(v.preset==="today")return((g=(s=a.usage)==null?void 0:s.daily)==null?void 0:g.inputTokens)||0;if(v.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].inputTokens!==void 0?a.usage["7days"].inputTokens:0;if(v.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].inputTokens!==void 0)return a.usage["30days"].inputTokens;if(a.usage.monthly&&a.usage.monthly.inputTokens!==void 0)return a.usage.monthly.inputTokens;if(a.usage.total&&a.usage.total.inputTokens!==void 0)return a.usage.total.inputTokens}return 0}else return v.preset==="all"?a.usage&&a.usage.all&&a.usage.all.inputTokens!==void 0?a.usage.all.inputTokens:((y=(r=a.usage)==null?void 0:r.total)==null?void 0:y.inputTokens)||0:((W=(S=a.usage)==null?void 0:S.total)==null?void 0:W.inputTokens)||0}},rs=a=>{var s,g,r,y,S,W;if(v.type==="custom"){if(a.usage){if(a.usage.custom&&a.usage.custom.outputTokens!==void 0)return a.usage.custom.outputTokens;if(a.usage.total&&a.usage.total.outputTokens!==void 0)return a.usage.total.outputTokens}return 0}else{if(v.preset==="today")return((g=(s=a.usage)==null?void 0:s.daily)==null?void 0:g.outputTokens)||0;if(v.preset==="7days")return a.usage&&a.usage["7days"]&&a.usage["7days"].outputTokens!==void 0?a.usage["7days"].outputTokens:0;if(v.preset==="30days"){if(a.usage){if(a.usage["30days"]&&a.usage["30days"].outputTokens!==void 0)return a.usage["30days"].outputTokens;if(a.usage.monthly&&a.usage.monthly.outputTokens!==void 0)return a.usage.monthly.outputTokens;if(a.usage.total&&a.usage.total.outputTokens!==void 0)return a.usage.total.outputTokens}return 0}else return v.preset==="all"?a.usage&&a.usage.all&&a.usage.all.outputTokens!==void 0?a.usage.all.outputTokens:((y=(r=a.usage)==null?void 0:r.total)==null?void 0:y.outputTokens)||0:((W=(S=a.usage)==null?void 0:S.total)==null?void 0:W.outputTokens)||0}},yt=a=>{if(!J.value[a.id])return _t(a);const s=J.value[a.id]||[];let g=0;return s.forEach(r=>{if(r.cost!==void 0)g+=r.cost;else if(r.formatted&&r.formatted.total){const y=r.formatted.total.replace("$","").replace(",",""),S=parseFloat(y);isNaN(S)||(g+=S)}}),g},os=a=>{Mt(a)},Mt=a=>{if(v.preset=a,a==="custom"){if(v.type="custom",!v.customRange){const s=new Date,g=new Date(s);g.setDate(s.getDate()-6);const r=y=>y.getFullYear()+"-"+String(y.getMonth()+1).padStart(2,"0")+"-"+String(y.getDate()).padStart(2,"0")+" 00:00:00";v.customRange=[r(g),r(s)],v.customStart=g.toISOString().split("T")[0],v.customEnd=s.toISOString().split("T")[0]}}else if(a==="all")v.type="preset",v.customStart=null,v.customEnd=null;else{v.type="preset";const s=new Date,g=new Date(s);a==="today"?g.setHours(0,0,0,0):a==="7days"?g.setDate(s.getDate()-6):a==="30days"&&g.setDate(s.getDate()-29),v.customStart=g.toISOString().split("T")[0],v.customEnd=s.toISOString().split("T")[0]}he()},ls=a=>{a&&a.length===2?(v.type="custom",v.preset="custom",v.customRange=a,v.customStart=a[0].split(" ")[0],v.customEnd=a[1].split(" ")[0],he()):a===null&&Mt("today")},Pt=a=>{const s=new Date;new Date(s).setHours(0,0,0,0),ge.value[a]={type:"preset",preset:"today",customStart:s.toISOString().split("T")[0],customEnd:s.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}]}},Ve=a=>(ge.value[a]||Pt(a),ge.value[a]),Vt=(a,s)=>{const g=Ve(s);g.type="preset",g.preset=a;const r=g.presetOptions.find(y=>y.value===a);if(r)if(a==="custom"){if(g.type="custom",!g.customRange){const y=new Date,S=new Date(y);S.setDate(y.getDate()-6);const W=K=>K.getFullYear()+"-"+String(K.getMonth()+1).padStart(2,"0")+"-"+String(K.getDate()).padStart(2,"0")+" 00:00:00";g.customRange=[W(S),W(y)],g.customStart=S.toISOString().split("T")[0],g.customEnd=y.toISOString().split("T")[0]}}else{const y=new Date,S=new Date(y);S.setDate(y.getDate()-(r.days-1)),g.customStart=S.toISOString().split("T")[0],g.customEnd=y.toISOString().split("T")[0];const W=K=>K.getFullYear()+"-"+String(K.getMonth()+1).padStart(2,"0")+"-"+String(K.getDate()).padStart(2,"0")+" 00:00:00";g.customRange=[W(S),W(y)]}ot(s,!0)},ns=(a,s)=>{const g=Ve(a);s&&s.length===2?(g.type="custom",g.preset="custom",g.customRange=s,g.customStart=s[0].split(" ")[0],g.customEnd=s[1].split(" ")[0],ot(a,!0)):s===null&&Vt("7days",a)},Rt=a=>a>new Date,is=a=>{const s=Ve(a);s.type="preset",s.preset="today";const g=new Date;new Date(g).setHours(0,0,0,0),s.customStart=g.toISOString().split("T")[0],s.customEnd=g.toISOString().split("T")[0],s.customRange=null,ot(a,!0),O("已重置筛选条件并刷新数据","info")},ds=async()=>{await tt(),Ce.value=!0},Ut=async a=>{await tt(),$t.value=a,_e.value=!0},Ot=a=>{Ct.value=a,Me.value=!0},us=a=>{Ce.value=!1,It.value=a,le.value=!0,he()},cs=a=>{Ce.value=!1,Kt.value=a,Ie.value=!0,he()},gs=async()=>{if(C.value.length===0){O("请先选择要编辑的 API Keys","warning");return}await tt(),et.value=!0},ps=()=>{et.value=!1,C.value=[],Ae(),he()},ms=()=>{_e.value=!1,O("API Key 更新成功","success"),he()},xs=()=>{Me.value=!1,O("API Key 续期成功","success"),he()},Et=async a=>{let s=!0;if(a.isActive&&(window.showConfirm?s=await window.showConfirm("禁用 API Key",`确定要禁用 API Key "${a.name}" 吗?禁用后所有使用此 Key 的请求将返回 401 错误。`,"确定禁用","取消"):s=confirm(`确定要禁用 API Key "${a.name}" 吗?禁用后所有使用此 Key 的请求将返回 401 错误。`)),!!s)try{const g=await G.put(`/admin/api-keys/${a.id}`,{isActive:!a.isActive});if(g.success){O(`API Key 已${a.isActive?"禁用":"激活"}`,"success");const r=R.value.find(y=>y.id===a.id);r&&(r.isActive=!a.isActive)}else O(g.message||"操作失败","error")}catch{O("操作失败","error")}},jt=async a=>{let s=!1;if(window.showConfirm?s=await window.showConfirm("删除 API Key","确定要删除这个 API Key 吗?此操作不可恢复。","确定删除","取消"):s=confirm("确定要删除这个 API Key 吗?此操作不可恢复。"),!!s)try{const g=await G.delete(`/admin/api-keys/${a}`);if(g.success){O("API Key 已删除","success");const r=C.value.indexOf(a);r>-1&&C.value.splice(r,1),Ae(),he()}else O(g.message||"删除失败","error")}catch{O("删除失败","error")}},ys=async a=>{var g,r;let s=!1;if(window.showConfirm?s=await window.showConfirm("恢复 API Key","确定要恢复这个 API Key 吗?恢复后可以重新使用。","确定恢复","取消"):s=confirm("确定要恢复这个 API Key 吗?恢复后可以重新使用。"),!!s)try{const y=await G.post(`/admin/api-keys/${a}/restore`);y.success?(O("API Key 已成功恢复","success"),await st(),await he()):O(y.error||"恢复失败","error")}catch(y){O(((r=(g=y.response)==null?void 0:g.data)==null?void 0:r.error)||"恢复失败","error")}},fs=async a=>{var g,r;let s=!1;if(window.showConfirm?s=await window.showConfirm("彻底删除 API Key","确定要彻底删除这个 API Key 吗?此操作不可恢复,所有相关数据将被永久删除。","确定彻底删除","取消"):s=confirm("确定要彻底删除这个 API Key 吗?此操作不可恢复,所有相关数据将被永久删除。"),!!s)try{const y=await G.delete(`/admin/api-keys/${a}/permanent`);y.success?(O("API Key 已彻底删除","success"),st()):O(y.error||"彻底删除失败","error")}catch(y){O(((r=(g=y.response)==null?void 0:g.data)==null?void 0:r.error)||"彻底删除失败","error")}},bs=async()=>{var g,r;const a=_.value.length;if(a===0){O("没有需要清空的 API Keys","info");return}let s=!1;if(window.showConfirm?s=await window.showConfirm("清空所有已删除的 API Keys",`确定要彻底删除全部 ${a} 个已删除的 API Keys 吗?此操作不可恢复,所有相关数据将被永久删除。`,"确定清空全部","取消"):s=confirm(`确定要彻底删除全部 ${a} 个已删除的 API Keys 吗?此操作不可恢复。`),!!s)try{const y=await G.delete("/admin/api-keys/deleted/clear-all");y.success?(O(y.message||"已清空所有已删除的 API Keys","success"),y.details&&y.details.failedCount>0&&O(`${y.details.failedCount} 个清空失败`,"warning"),st()):O(y.error||"清空失败","error")}catch(y){O(((r=(g=y.response)==null?void 0:g.data)==null?void 0:r.error)||"清空失败","error")}},vs=async()=>{const a=C.value.length;if(a===0){O("请先选择要删除的 API Keys","warning");return}let s=!1;const g=`确定要删除选中的 ${a} 个 API Key 吗?此操作不可恢复。`;if(window.showConfirm?s=await window.showConfirm("批量删除 API Keys",g,"确定删除","取消"):s=confirm(g),!s)return;const r=[...C.value];try{const y=await G.delete("/admin/api-keys/batch",{data:{keyIds:r}});if(y.success){const{successCount:S,failedCount:W,errors:K}=y.data;if(S>0){if(O(`成功删除 ${S} 个 API Keys`,"success"),W>0){const re=K.map(fe=>`${fe.keyId}: ${fe.error}`).join(`
|
||
`);O(`${W} 个删除失败:
|
||
${re}`,"warning")}}else O("所有 API Keys 删除失败","error");C.value=[],Ae(),he()}else O(y.message||"批量删除失败","error")}catch{O("批量删除失败","error")}},ks=()=>{if(V.value)Ge.value.forEach(a=>{C.value.includes(a.id)||C.value.push(a.id)});else{const a=new Set(Ge.value.map(s=>s.id));C.value=C.value.filter(s=>!a.has(s))}Ae()},Ae=()=>{const a=Ge.value.length,s=Ge.value.filter(g=>C.value.includes(g.id)).length;s===0?(V.value=!1,q.value=!1):s===a?(V.value=!0,q.value=!1):(V.value=!1,q.value=!0)},Ne=a=>{ye.value=a},Gt=()=>{ye.value=null},ws=async({keyId:a,expiresAt:s,activateNow:g})=>{try{const r=await G.patch(`/admin/api-keys/${a}/expiration`,{expiresAt:s||null,activateNow:g||!1});if(r.success){O(g?"API Key已激活":"过期时间已更新","success");const y=R.value.find(S=>S.id===a);y&&(g&&r.updates?(y.isActivated=!0,y.activatedAt=r.updates.activatedAt,y.expiresAt=r.updates.expiresAt):(y.expiresAt=s||null,s&&!y.isActivated&&(y.isActivated=!0))),Gt()}else O(r.message||"更新失败","error"),f.value&&f.value.resetSaving()}catch{O("更新失败","error"),f.value&&f.value.resetSaving()}},Re=a=>a?new Date(a).toLocaleDateString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).replace(/\//g,"-"):"",qt=a=>{if(a==null)return"--:--";const s=Math.floor(a/3600),g=Math.floor(a%3600/60),r=a%60;return s>0?`${s}h${g}m`:g>0?`${g}m${r}s`:`${r}s`},ft=a=>{l.value=a,o.value=!0},bt=a=>{if(!a)return"从未使用";const s=new Date(a),r=new Date-s;return r<6e4?"刚刚":r<36e5?`${Math.floor(r/6e4)} 分钟前`:r<864e5?`${Math.floor(r/36e5)} 小时前`:r<6048e5?`${Math.floor(r/864e5)} 天前`:s.toLocaleDateString("zh-CN")},hs=()=>{w.value="",X.value=1},As=()=>{try{const a=je.value.map(k=>{var zt,Ft,Bt,Wt,Nt,Ht,Yt,Qt;const Z=lt(k),ce=yt(k),$e=nt(k),it=as(k),be=rs(k),$s={ID:k.id||"",名称:k.name||"",描述:k.description||"",状态:k.isActive?"启用":"禁用",API密钥:k.apiKey||"",过期模式:k.expirationMode==="activation"?"首次使用后激活":k.expirationMode==="fixed"?"固定时间":"无",激活期限:k.activationDays||"",激活单位:k.activationUnit==="hours"?"小时":k.activationUnit==="days"?"天":"",已激活:k.isActivated?"是":"否",激活时间:k.activatedAt?Re(k.activatedAt):"",过期时间:k.expiresAt?Re(k.expiresAt):"",服务权限:k.permissions==="all"?"全部服务":k.permissions==="claude"?"仅Claude":k.permissions==="gemini"?"仅Gemini":k.permissions==="openai"?"仅OpenAI":k.permissions==="droid"?"仅Droid":k.permissions||"",令牌限制:k.tokenLimit==="0"||k.tokenLimit===0?"无限制":k.tokenLimit||"",并发限制:k.concurrencyLimit==="0"||k.concurrencyLimit===0?"无限制":k.concurrencyLimit||"","速率窗口(分钟)":k.rateLimitWindow==="0"||k.rateLimitWindow===0?"无限制":k.rateLimitWindow||"",速率请求限制:k.rateLimitRequests==="0"||k.rateLimitRequests===0?"无限制":k.rateLimitRequests||"","日费用限制($)":k.dailyCostLimit==="0"||k.dailyCostLimit===0?"无限制":`$${k.dailyCostLimit}`||"","总费用限制($)":k.totalCostLimit==="0"||k.totalCostLimit===0?"无限制":`$${k.totalCostLimit}`||"",Claude专属账户:k.claudeAccountId||"",Claude控制台账户:k.claudeConsoleAccountId||"",Gemini专属账户:k.geminiAccountId||"",OpenAI专属账户:k.openaiAccountId||"","Azure OpenAI专属账户":k.azureOpenaiAccountId||"",Bedrock专属账户:k.bedrockAccountId||"",Droid专属账户:k.droidAccountId||"",启用模型限制:k.enableModelRestriction?"是":"否",限制的模型:k.restrictedModels&&k.restrictedModels.length>0?k.restrictedModels.join("; "):"",启用客户端限制:k.enableClientRestriction?"是":"否",允许的客户端:k.allowedClients&&k.allowedClients.length>0?k.allowedClients.join("; "):"",创建时间:k.createdAt?Re(k.createdAt):"",创建者:k.createdBy||"",用户ID:k.userId||"",用户名:k.userUsername||"",标签:k.tags&&k.tags.length>0?k.tags.join(", "):"无",请求总数:Z,"总费用($)":ce.toFixed(2),Token数:ke($e),输入Token:ke(it),输出Token:ke(be),最后使用时间:k.lastUsedAt?Re(k.lastUsedAt):"从未使用"},qe={};let ze=null;return v.preset==="today"?ze=(Ft=(zt=k.usage)==null?void 0:zt.daily)==null?void 0:Ft.models:v.preset==="7days"?ze=(Wt=(Bt=k.usage)==null?void 0:Bt.weekly)==null?void 0:Wt.models:v.preset==="30days"?ze=(Ht=(Nt=k.usage)==null?void 0:Nt.monthly)==null?void 0:Ht.models:v.preset==="all"&&(ze=(Qt=(Yt=k.usage)==null?void 0:Yt.total)==null?void 0:Qt.models),ze&&Object.entries(ze).forEach(([vt,He])=>{let Ue=vt;vt.includes(":")&&(Ue=vt.split(":").pop()),Ue=Ue.replace(/[:/]/g,"_"),qe[`${Ue}_请求数`]=He.requests||0,qe[`${Ue}_费用($)`]=(He.cost||0).toFixed(2),qe[`${Ue}_Token`]=ke(He.totalTokens||0),qe[`${Ue}_输入Token`]=ke(He.inputTokens||0),qe[`${Ue}_输出Token`]=ke(He.outputTokens||0)}),{...$s,...qe}}),s=Ee.utils.book_new(),g=Ee.utils.json_to_sheet(a),r=Ee.utils.decode_range(g["!ref"]),y=Object.keys(a[0]||{}),S=y.map(k=>k==="ID"?{wch:40}:k==="名称"?{wch:25}:k==="描述"?{wch:30}:k==="API密钥"?{wch:45}:k==="标签"?{wch:20}:k.includes("时间")?{wch:20}:k.includes("限制")?{wch:15}:k.includes("费用")?{wch:15}:k.includes("Token")?{wch:15}:k.includes("请求")?{wch:12}:k.includes("账户")?{wch:30}:k.includes("权限")||k.includes("模型")||k.includes("客户端")?{wch:20}:k.includes("激活")||k.includes("过期")?{wch:18}:{wch:15});g["!cols"]=S;for(let k=r.s.c;k<=r.e.c;++k){const Z=Ee.utils.encode_cell({r:0,c:k});if(!g[Z])continue;const ce=y[k],$e=ce&&ce.includes("_");g[Z].s={fill:{fgColor:{rgb:$e?"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 k=1;k<=r.e.r;++k)for(let Z=r.s.c;Z<=r.e.c;++Z){const ce=Ee.utils.encode_cell({r:k,c:Z});if(!g[ce])continue;const $e=y[Z],it=g[ce].v,be={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"}}}};k%2===0&&(be.fill={fgColor:{rgb:"F2F2F2"}}),$e==="名称"?be.alignment={horizontal:"left",vertical:"center"}:$e==="标签"?(be.alignment={horizontal:"left",vertical:"center"},it==="无"&&(be.font={...be.font,color:{rgb:"999999"},italic:!0})):$e==="最后使用时间"?(be.alignment={horizontal:"right",vertical:"center"},it==="从未使用"&&(be.font={...be.font,color:{rgb:"999999"},italic:!0})):$e&&$e.includes("费用")?(be.alignment={horizontal:"right",vertical:"center"},be.font={...be.font,color:{rgb:"0066CC"},bold:!0}):$e&&($e.includes("Token")||$e.includes("请求"))&&(be.alignment={horizontal:"right",vertical:"center"}),g[ce].s=be}Ee.utils.book_append_sheet(s,g,"用量统计");const W=new Date,K=W.getFullYear()+String(W.getMonth()+1).padStart(2,"0")+String(W.getDate()).padStart(2,"0")+"_"+String(W.getHours()).padStart(2,"0")+String(W.getMinutes()).padStart(2,"0")+String(W.getSeconds()).padStart(2,"0");let re="";v.type==="preset"?re={today:"今日","7days":"最近7天","30days":"最近30天",all:"全部时间"}[v.preset]||v.preset:re="自定义时间";const fe=`API_Keys_用量统计_${re}_${K}.xlsx`;Ee.writeFile(s,fe),O(`成功导出 ${a.length} 条API Key用量数据`,"success")}catch{O("导出失败,请重试","error")}};return De([p,H],()=>{X.value=1,C.value=[],Ae()}),De(w,()=>{X.value=1,Ae()}),De(n,()=>{X.value=1,Ae()}),De([X,N],()=>{Ae()}),De(N,a=>{localStorage.setItem("apiKeysPageSize",a.toString())}),De(R,()=>{const a=new Set(R.value.map(s=>s.id));C.value=C.value.filter(s=>a.has(s)),Ae()}),Ze(async()=>{await Promise.all([B.loadSupportedClients(),tt(),he()]),Ae()}),(a,s)=>{const g=Cs;return i(),d("div",gd,[e("div",pd,[e("div",md,[s[149]||(s[149]=e("div",null,[e("h3",{class:"mb-1 text-lg font-bold text-gray-900 dark:text-gray-100 sm:mb-2 sm:text-xl"}," API Keys 管理 "),e("p",{class:"text-sm text-gray-600 dark:text-gray-400 sm:text-base"}," 管理和监控您的 API 密钥 ")],-1)),e("div",xd,[e("nav",yd,[e("button",{class:j(["whitespace-nowrap border-b-2 px-1 py-2 text-sm font-medium",U.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:s[0]||(s[0]=r=>U.value="active")},[s[35]||(s[35]=A(" 活跃 API Keys ",-1)),R.value.length>0?(i(),d("span",fd,u(R.value.length),1)):h("",!0)],2),e("button",{class:j(["whitespace-nowrap border-b-2 px-1 py-2 text-sm font-medium",U.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:st},[s[36]||(s[36]=A(" 已删除 API Keys ",-1)),_.value.length>0?(i(),d("span",bd,u(_.value.length),1)):h("",!0)],2)])]),U.value==="active"?(i(),d("div",vd,[e("div",kd,[e("div",wd,[e("div",hd,[s[37]||(s[37]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-blue-500 to-purple-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),ne(kt,{modelValue:v.preset,"onUpdate:modelValue":s[1]||(s[1]=r=>v.preset=r),icon:"fa-calendar-alt","icon-color":"text-blue-500",options:t.value,placeholder:"选择时间范围",onChange:os},null,8,["modelValue","options"])]),v.type==="custom"?(i(),d("div",Ad,[ne(g,{class:"api-key-date-picker custom-date-range-picker",clearable:!0,"default-time":ue.value,"disabled-date":Rt,"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","model-value":v.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":ls},null,8,["default-time","model-value"])])):h("",!0),e("div",$d,[s[38]||(s[38]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-purple-500 to-pink-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),e("div",Cd,[ne(kt,{modelValue:p.value,"onUpdate:modelValue":s[2]||(s[2]=r=>p.value=r),icon:"fa-tags","icon-color":"text-purple-500",options:oe.value,placeholder:"所有标签",onChange:s[3]||(s[3]=r=>X.value=1)},null,8,["modelValue","options"]),p.value?(i(),d("span",Id,u(pe.value),1)):h("",!0)])]),e("div",Kd,[e("div",Ld,[ne(kt,{modelValue:n.value,"onUpdate:modelValue":s[4]||(s[4]=r=>n.value=r),icon:"fa-filter","icon-color":"text-cyan-500",options:x.value,placeholder:"选择搜索类型",onChange:s[5]||(s[5]=r=>X.value=1)},null,8,["modelValue","options"])]),e("div",Dd,[s[41]||(s[41]=e("div",{class:"pointer-events-none absolute -inset-0.5 rounded-lg bg-gradient-to-r from-cyan-500 to-teal-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),e("div",Sd,[T(e("input",{"onUpdate:modelValue":s[6]||(s[6]=r=>w.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:n.value==="bindingAccount"?"搜索所属账号...":F.value?"搜索名称或所有者...":"搜索名称...",type:"text",onInput:s[7]||(s[7]=r=>X.value=1)},null,40,Td),[[se,w.value]]),s[40]||(s[40]=e("i",{class:"fas fa-search absolute left-3 text-sm text-cyan-500"},null,-1)),w.value?(i(),d("button",{key:0,class:"absolute right-2 flex h-5 w-5 items-center justify-center rounded-full text-gray-400 hover:bg-gray-100 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300",onClick:hs},s[39]||(s[39]=[e("i",{class:"fas fa-times text-xs"},null,-1)]))):h("",!0)])])])]),e("div",_d,[e("button",{class:"group relative flex items-center justify-center gap-2 rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition-all duration-200 hover:border-gray-300 hover:shadow-md disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:border-gray-500 sm:w-auto",disabled:Q.value,onClick:s[8]||(s[8]=r=>he())},[s[42]||(s[42]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-green-500 to-teal-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),e("i",{class:j(["fas relative text-green-500",Q.value?"fa-spinner fa-spin":"fa-sync-alt"])},null,2),s[43]||(s[43]=e("span",{class:"relative"},"刷新",-1))],8,Md),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:m},[e("i",{class:j(P.value?"fas fa-times":"fas fa-check-square")},null,2),e("span",null,u(P.value?"取消选择":"选择"),1)]),e("button",{class:"group relative flex items-center justify-center gap-2 rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition-all duration-200 hover:border-gray-300 hover:shadow-md dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:border-gray-500 sm:w-auto",onClick:As},s[44]||(s[44]=[e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-emerald-500 to-green-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1),e("i",{class:"fas fa-file-excel relative text-emerald-500"},null,-1),e("span",{class:"relative"},"导出数据",-1)])),C.value.length>0?(i(),d("button",{key:0,class:"group relative flex items-center justify-center gap-2 rounded-lg border border-blue-200 bg-blue-50 px-4 py-2 text-sm font-medium text-blue-700 shadow-sm transition-all duration-200 hover:border-blue-300 hover:bg-blue-100 hover:shadow-md dark:border-blue-700 dark:bg-blue-900/30 dark:text-blue-300 dark:hover:bg-blue-900/50 sm:w-auto",onClick:s[9]||(s[9]=r=>gs())},[s[45]||(s[45]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-blue-500 to-indigo-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),s[46]||(s[46]=e("i",{class:"fas fa-edit relative text-blue-600 dark:text-blue-400"},null,-1)),e("span",Pd,"编辑选中 ("+u(C.value.length)+")",1)])):h("",!0),C.value.length>0?(i(),d("button",{key:1,class:"group relative flex items-center justify-center gap-2 rounded-lg border border-red-200 bg-red-50 px-4 py-2 text-sm font-medium text-red-700 shadow-sm transition-all duration-200 hover:border-red-300 hover:bg-red-100 hover:shadow-md dark:border-red-700 dark:bg-red-900/30 dark:text-red-300 dark:hover:bg-red-900/50 sm:w-auto",onClick:s[10]||(s[10]=r=>vs())},[s[47]||(s[47]=e("div",{class:"absolute -inset-0.5 rounded-lg bg-gradient-to-r from-red-500 to-pink-500 opacity-0 blur transition duration-300 group-hover:opacity-20"},null,-1)),s[48]||(s[48]=e("i",{class:"fas fa-trash relative text-red-600 dark:text-red-400"},null,-1)),e("span",Vd,"删除选中 ("+u(C.value.length)+")",1)])):h("",!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:we(ds,["stop"])},s[49]||(s[49]=[e("i",{class:"fas fa-plus"},null,-1),e("span",null,"创建新 Key",-1)]))])]),Q.value?(i(),d("div",Rd,s[50]||(s[50]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载 API Keys...",-1)]))):R.value.length===0?(i(),d("div",Ud,s[51]||(s[51]=[e("div",{class:"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-700"},[e("i",{class:"fas fa-key text-xl text-gray-400"})],-1),e("p",{class:"text-lg text-gray-500 dark:text-gray-400"},"暂无 API Keys",-1),e("p",{class:"mt-2 text-sm text-gray-400"},"点击上方按钮创建您的第一个 API Key",-1)]))):(i(),d("div",Od,[e("div",Ed,[e("table",jd,[e("thead",Gd,[e("tr",null,[D.value?(i(),d("th",qd,[e("div",zd,[T(e("input",{"onUpdate:modelValue":s[11]||(s[11]=r=>V.value=r),class:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",indeterminate:q.value,type:"checkbox",onChange:ks},null,40,Fd),[[Le,V.value]])])])):h("",!0),e("th",{class:"w-[14%] min-w-[120px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:s[12]||(s[12]=r=>Pe("name"))},[s[52]||(s[52]=A(" 名称 ",-1)),$.value==="name"?(i(),d("i",{key:0,class:j(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",Bd))]),s[60]||(s[60]=e("th",{class:"w-[15%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 所属账号 ",-1)),s[61]||(s[61]=e("th",{class:"w-[10%] min-w-[80px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 标签 ",-1)),e("th",{class:"w-[6%] min-w-[60px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:s[13]||(s[13]=r=>Pe("status"))},[s[53]||(s[53]=A(" 状态 ",-1)),$.value==="status"?(i(),d("i",{key:0,class:j(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",Wd))]),e("th",{class:"w-[4%] min-w-[40px] cursor-pointer px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:s[14]||(s[14]=r=>Pe("periodCost"))},[s[54]||(s[54]=A(" 费用 ",-1)),$.value==="periodCost"?(i(),d("i",{key:0,class:j(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",Nd))]),s[62]||(s[62]=e("th",{class:"w-[14%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 限制 ",-1)),e("th",{class:"w-[5%] min-w-[45px] cursor-pointer px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:s[15]||(s[15]=r=>Pe("periodTokens"))},[s[55]||(s[55]=A(" Token ",-1)),$.value==="periodTokens"?(i(),d("i",{key:0,class:j(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",Hd))]),e("th",{class:"w-[5%] min-w-[45px] cursor-pointer px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:s[16]||(s[16]=r=>Pe("periodRequests"))},[s[56]||(s[56]=A(" 请求数 ",-1)),$.value==="periodRequests"?(i(),d("i",{key:0,class:j(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",Yd))]),e("th",{class:"w-[8%] min-w-[70px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:s[17]||(s[17]=r=>Pe("lastUsedAt"))},[s[57]||(s[57]=A(" 最后使用 ",-1)),$.value==="lastUsedAt"?(i(),d("i",{key:0,class:j(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",Qd))]),e("th",{class:"w-[8%] min-w-[70px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:s[18]||(s[18]=r=>Pe("createdAt"))},[s[58]||(s[58]=A(" 创建时间 ",-1)),$.value==="createdAt"?(i(),d("i",{key:0,class:j(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",Jd))]),e("th",{class:"w-[8%] min-w-[70px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-600",onClick:s[19]||(s[19]=r=>Pe("expiresAt"))},[s[59]||(s[59]=A(" 过期时间 ",-1)),$.value==="expiresAt"?(i(),d("i",{key:0,class:j(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),d("i",Xd))]),s[63]||(s[63]=e("th",{class:"operations-column sticky right-0 w-[23%] min-w-[200px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 操作 ",-1))])]),e("tbody",null,[(i(!0),d(ae,null,ie(Ge.value,(r,y)=>{var S,W;return i(),d(ae,{key:r.id},[e("tr",{class:j(["table-row transition-all duration-150",y%2===0?"bg-white dark:bg-gray-800/40":"bg-gray-50/70 dark:bg-gray-700/30","border-b-2 border-gray-200/80 dark:border-gray-700/50","hover:bg-blue-50/60 hover:shadow-sm dark:hover:bg-blue-900/20"])},[D.value?(i(),d("td",Zd,[e("div",e0,[T(e("input",{"onUpdate:modelValue":s[20]||(s[20]=K=>C.value=K),class:"h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",type:"checkbox",value:r.id,onChange:Ae},null,40,t0),[[Le,C.value]])])])):h("",!0),e("td",s0,[e("div",a0,[e("div",{class:"truncate text-sm font-semibold text-gray-900 dark:text-gray-100",title:r.name},u(r.name),9,r0),F.value&&r.ownerDisplayName?(i(),d("div",o0,[s[64]||(s[64]=e("i",{class:"fas fa-user mr-1"},null,-1)),A(" "+u(r.ownerDisplayName),1)])):h("",!0)])]),e("td",l0,[e("div",n0,[r.claudeAccountId||r.claudeConsoleAccountId?(i(),d("div",i0,[s[65]||(s[65]=e("span",{class:"inline-flex items-center rounded bg-indigo-100 px-1.5 py-0.5 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300"},[e("i",{class:"fas fa-brain mr-1 text-[10px]"}),A(" Claude ")],-1)),e("span",d0,u(ct(r)),1)])):h("",!0),r.geminiAccountId?(i(),d("div",u0,[s[66]||(s[66]=e("span",{class:"inline-flex items-center rounded bg-yellow-100 px-1.5 py-0.5 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300"},[e("i",{class:"fas fa-robot mr-1 text-[10px]"}),A(" Gemini ")],-1)),e("span",c0,u(gt(r)),1)])):h("",!0),r.openaiAccountId?(i(),d("div",g0,[s[67]||(s[67]=e("span",{class:"inline-flex items-center rounded bg-gray-100 px-1.5 py-0.5 text-gray-700 dark:bg-gray-700 dark:text-gray-300"},[e("i",{class:"fa-openai mr-1 text-[10px]"}),A(" OpenAI ")],-1)),e("span",p0,u(pt(r)),1)])):h("",!0),r.bedrockAccountId?(i(),d("div",m0,[s[68]||(s[68]=e("span",{class:"inline-flex items-center rounded bg-orange-100 px-1.5 py-0.5 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300"},[e("i",{class:"fas fa-cloud mr-1 text-[10px]"}),A(" Bedrock ")],-1)),e("span",x0,u(mt(r)),1)])):h("",!0),r.droidAccountId?(i(),d("div",y0,[s[69]||(s[69]=e("span",{class:"inline-flex items-center rounded bg-cyan-100 px-1.5 py-0.5 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-300"},[e("i",{class:"fas fa-robot mr-1 text-[10px]"}),A(" Droid ")],-1)),e("span",f0,u(xt(r)),1)])):h("",!0),!r.claudeAccountId&&!r.claudeConsoleAccountId&&!r.geminiAccountId&&!r.openaiAccountId&&!r.bedrockAccountId&&!r.droidAccountId?(i(),d("div",b0,s[70]||(s[70]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),A(" 共享池 ",-1)]))):h("",!0)])]),e("td",v0,[e("div",k0,[(i(!0),d(ae,null,ie(r.tags||[],K=>(i(),d("span",{key:K,class:"inline-flex items-center rounded-full bg-blue-100 px-2 py-0.5 text-xs text-blue-800 dark:bg-blue-900/30 dark:text-blue-300"},u(K),1))),128)),!r.tags||r.tags.length===0?(i(),d("span",w0,"无标签")):h("",!0)])]),e("td",h0,[e("span",{class:j(["inline-flex items-center rounded-full px-3 py-1 text-xs font-semibold",r.isActive?"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300":"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300"])},[e("div",{class:j(["mr-2 h-2 w-2 rounded-full",r.isActive?"bg-green-500":"bg-red-500"])},null,2),A(" "+u(r.isActive?"活跃":"禁用"),1)],2)]),e("td",A0,[e("span",$0," $"+u(_t(r).toFixed(2)),1)]),e("td",C0,[e("div",I0,[r.dailyCostLimit>0?(i(),me(Se,{key:0,current:r.dailyCost||0,label:"每日限制",limit:r.dailyCostLimit,type:"daily",variant:"compact"},null,8,["current","limit"])):r.totalCostLimit>0?(i(),me(Se,{key:1,current:((W=(S=r.usage)==null?void 0:S.total)==null?void 0:W.cost)||0,label:"总费用限制",limit:r.totalCostLimit,type:"total",variant:"compact"},null,8,["current","limit"])):r.rateLimitWindow>0&&r.rateLimitCost>0&&(!r.dailyCostLimit||r.dailyCostLimit===0)&&(!r.totalCostLimit||r.totalCostLimit===0)?(i(),d("div",K0,[ne(Se,{current:r.currentWindowCost||0,label:"窗口费用",limit:r.rateLimitCost,type:"window",variant:"compact"},null,8,["current","limit"]),e("div",L0,[e("div",D0,[s[71]||(s[71]=e("i",{class:"fas fa-clock text-[10px]"},null,-1)),e("span",S0,u(r.rateLimitWindow)+"分钟窗口",1)]),e("span",{class:j(["font-bold",r.windowRemainingSeconds>0?"text-sky-700 dark:text-sky-300":"text-gray-400 dark:text-gray-500"])},u(r.windowRemainingSeconds>0?qt(r.windowRemainingSeconds):"未激活"),3)])])):(i(),d("div",T0,s[72]||(s[72]=[e("i",{class:"fas fa-infinity text-base"},null,-1),e("span",{class:"text-xs font-medium"},"无限制",-1)])))])]),e("td",_0,[e("div",M0,[e("span",P0,u(ke(nt(r))),1)])]),e("td",V0,[e("div",R0,[e("span",U0,u(ut(lt(r))),1),s[73]||(s[73]=e("span",{class:"text-xs text-gray-500"},"次",-1))])]),e("td",O0,[r.lastUsedAt?(i(),d("span",{key:0,class:"cursor-help",style:{"font-size":"13px"},title:new Date(r.lastUsedAt).toLocaleString("zh-CN")},u(bt(r.lastUsedAt)),9,E0)):(i(),d("span",j0,"从未使用"))]),e("td",G0,u(new Date(r.createdAt).toLocaleDateString()),1),e("td",q0,[e("div",z0,[r.expirationMode==="activation"&&!r.isActivated?(i(),d("span",F0,[s[74]||(s[74]=e("i",{class:"fas fa-pause-circle mr-1 text-xs"},null,-1)),A(" 未激活 ( "+u(r.activationDays||(r.activationUnit==="hours"?24:30))+u(r.activationUnit==="hours"?"小时":"天")+") ",1)])):r.expiresAt?(i(),d("span",B0,[at(r.expiresAt)?(i(),d("span",{key:0,class:"inline-flex cursor-pointer items-center text-red-600 hover:underline",style:{"font-size":"13px"},onClick:we(K=>Ne(r),["stop"])},s[75]||(s[75]=[e("i",{class:"fas fa-exclamation-circle mr-1 text-xs"},null,-1),A(" 已过期 ",-1)]),8,W0)):rt(r.expiresAt)?(i(),d("span",{key:1,class:"inline-flex cursor-pointer items-center text-orange-600 hover:underline",style:{"font-size":"13px"},onClick:we(K=>Ne(r),["stop"])},[s[76]||(s[76]=e("i",{class:"fas fa-clock mr-1 text-xs"},null,-1)),A(" "+u(St(r.expiresAt)),1)],8,N0)):(i(),d("span",{key:2,class:"cursor-pointer text-gray-600 hover:underline dark:text-gray-400",style:{"font-size":"13px"},onClick:we(K=>Ne(r),["stop"])},u(St(r.expiresAt)),9,H0))])):(i(),d("span",{key:2,class:"inline-flex cursor-pointer items-center text-gray-400 hover:underline dark:text-gray-500",style:{"font-size":"13px"},onClick:we(K=>Ne(r),["stop"])},s[77]||(s[77]=[e("i",{class:"fas fa-infinity mr-1 text-xs"},null,-1),A(" 永不过期 ",-1)]),8,Y0))])]),e("td",Q0,[e("div",J0,[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:K=>ft(r)},s[78]||(s[78]=[e("i",{class:"fas fa-chart-line"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"详情",-1)]),8,X0),r&&r.id?(i(),d("button",{key:0,class:"rounded px-2 py-1 text-xs font-medium text-indigo-600 transition-colors hover:bg-indigo-50 hover:text-indigo-900 dark:hover:bg-indigo-900/20",title:"模型使用分布",onClick:K=>ts(r.id)},[e("i",{class:j(["fas",ee.value[r.id]?"fa-chevron-up":"fa-chevron-down"])},null,2),s[79]||(s[79]=e("span",{class:"ml-1 hidden xl:inline"},"模型",-1))],8,Z0)):h("",!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:K=>Ut(r)},s[80]||(s[80]=[e("i",{class:"fas fa-edit"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"编辑",-1)]),8,eu),r.expiresAt&&(at(r.expiresAt)||rt(r.expiresAt))?(i(),d("button",{key:1,class:"rounded px-2 py-1 text-xs font-medium text-green-600 transition-colors hover:bg-green-50 hover:text-green-900 dark:hover:bg-green-900/20",title:"续期",onClick:K=>Ot(r)},s[81]||(s[81]=[e("i",{class:"fas fa-clock"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"续期",-1)]),8,tu)):h("",!0),e("button",{class:j([r.isActive?"text-orange-600 hover:bg-orange-50 hover:text-orange-900 dark:hover:bg-orange-900/20":"text-green-600 hover:bg-green-50 hover:text-green-900 dark:hover:bg-green-900/20","rounded px-2 py-1 text-xs font-medium transition-colors"]),title:r.isActive?"禁用":"激活",onClick:K=>Et(r)},[e("i",{class:j(["fas",r.isActive?"fa-ban":"fa-check-circle"])},null,2),e("span",au,u(r.isActive?"禁用":"激活"),1)],10,su),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:K=>jt(r.id)},s[82]||(s[82]=[e("i",{class:"fas fa-trash"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"删除",-1)]),8,ru)])])],2),r&&r.id&&ee.value[r.id]?(i(),d("tr",ou,[e("td",lu,[J.value[r.id]?h("",!0):(i(),d("div",nu,s[83]||(s[83]=[e("div",{class:"loading-spinner mx-auto"},null,-1),e("p",{class:"mt-2 text-sm text-gray-500 dark:text-gray-400"}," 加载模型统计... ",-1)]))),e("div",iu,[e("div",du,[s[84]||(s[84]=e("h5",{class:"flex items-center text-sm font-semibold text-gray-700 dark:text-gray-300"},[e("i",{class:"fas fa-chart-pie mr-2 text-indigo-500"}),A(" 模型使用分布 ")],-1)),e("div",uu,[J.value[r.id]&&J.value[r.id].length>0?(i(),d("span",cu,u(J.value[r.id].length)+" 个模型 ",1)):h("",!0),e("div",gu,[e("div",pu,[(i(!0),d(ae,null,ie(Ve(r.id).presetOptions,K=>(i(),d("button",{key:K.value,class:j(["rounded px-2 py-1 text-xs font-medium transition-colors",Ve(r.id).preset===K.value&&Ve(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:re=>Vt(K.value,r.id)},u(K.label),11,mu))),128))]),ne(g,{class:"api-key-date-picker",clearable:!0,"default-time":ue.value,"disabled-date":Rt,"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","model-value":Ve(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":K=>ns(r.id,K)},null,8,["default-time","model-value","onUpdate:modelValue"])])])]),J.value[r.id]&&J.value[r.id].length===0?(i(),d("div",xu,[e("div",yu,[s[86]||(s[86]=e("i",{class:"fas fa-chart-line text-lg text-gray-400"},null,-1)),s[87]||(s[87]=e("p",{class:"text-sm text-gray-500 dark:text-gray-400"}," 暂无模型使用数据 ",-1)),e("button",{class:"ml-2 flex items-center gap-1 text-sm text-blue-500 transition-colors hover:text-blue-700",title:"重置筛选条件并刷新",onClick:K=>is(r.id)},s[85]||(s[85]=[e("i",{class:"fas fa-sync-alt text-xs"},null,-1),e("span",{class:"text-xs"},"刷新",-1)]),8,fu)]),s[88]||(s[88]=e("p",{class:"text-xs text-gray-400"}," 尝试调整时间范围或点击刷新重新加载数据 ",-1))])):J.value[r.id]&&J.value[r.id].length>0?(i(),d("div",bu,[(i(!0),d(ae,null,ie(J.value[r.id],K=>(i(),d("div",{key:K.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",vu,[e("div",ku,[e("span",wu,u(K.model),1),e("span",hu,u(K.requests)+" 次请求",1)])]),e("div",Au,[e("div",$u,[s[89]||(s[89]=e("span",{class:"flex items-center text-gray-600 dark:text-gray-400"},[e("i",{class:"fas fa-coins mr-1 text-xs text-yellow-500"}),A(" 总Token: ")],-1)),e("span",Cu,u(ke(K.allTokens)),1)]),e("div",Iu,[s[90]||(s[90]=e("span",{class:"flex items-center text-gray-600 dark:text-gray-400"},[e("i",{class:"fas fa-dollar-sign mr-1 text-xs text-green-500"}),A(" 费用: ")],-1)),e("span",Ku,u(ss(K)),1)]),e("div",Lu,[e("div",Du,[s[91]||(s[91]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-down mr-1 text-green-500"}),A(" 输入: ")],-1)),e("span",Su,u(ke(K.inputTokens)),1)]),e("div",Tu,[s[92]||(s[92]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-up mr-1 text-blue-500"}),A(" 输出: ")],-1)),e("span",_u,u(ke(K.outputTokens)),1)]),K.cacheCreateTokens>0?(i(),d("div",Mu,[s[93]||(s[93]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-save mr-1"}),A(" 缓存创建: ")],-1)),e("span",Pu,u(ke(K.cacheCreateTokens)),1)])):h("",!0),K.cacheReadTokens>0?(i(),d("div",Vu,[s[94]||(s[94]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-download mr-1"}),A(" 缓存读取: ")],-1)),e("span",Ru,u(ke(K.cacheReadTokens)),1)])):h("",!0)])]),e("div",Uu,[e("div",{class:"h-2 rounded-full bg-gradient-to-r from-indigo-500 to-purple-600 transition-all duration-500",style:dt({width:Tt(K.allTokens,J.value[r.id])+"%"})},null,4)]),e("div",Ou,[e("span",Eu,u(Tt(K.allTokens,J.value[r.id]))+"% ",1)])]))),128))])):h("",!0),J.value[r.id]&&J.value[r.id].length>0?(i(),d("div",ju,[e("div",Gu,[s[97]||(s[97]=e("span",{class:"flex items-center font-semibold text-gray-700 dark:text-gray-300"},[e("i",{class:"fas fa-calculator mr-2 text-indigo-500"}),A(" 总计统计 ")],-1)),e("div",qu,[e("span",zu,[s[95]||(s[95]=A(" 总请求: ",-1)),e("span",Fu,u(J.value[r.id].reduce((K,re)=>K+re.requests,0)),1)]),e("span",Bu,[s[96]||(s[96]=A(" 总Token: ",-1)),e("span",Wu,u(ke(J.value[r.id].reduce((K,re)=>K+re.allTokens,0))),1)])])])])):h("",!0)])])])):h("",!0)],64)}),128))])])])])),!Q.value&&je.value.length>0?(i(),d("div",Nu,[(i(!0),d(ae,null,ie(Ge.value,r=>{var y,S,W,K;return i(),d("div",{key:r.id,class:"card p-4 transition-shadow hover:shadow-lg"},[e("div",Hu,[e("div",Yu,[D.value?T((i(),d("input",{key:0,"onUpdate:modelValue":s[21]||(s[21]=re=>C.value=re),class:"mt-1 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500",type:"checkbox",value:r.id,onChange:Ae},null,40,Qu)),[[Le,C.value]]):h("",!0),e("div",null,[e("h4",Ju,u(r.name),1),e("p",Xu,u(r.id),1)])]),e("span",{class:j(["inline-flex items-center rounded-full px-2 py-1 text-xs font-semibold",r.isActive?"bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300":"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300"])},[e("div",{class:j(["mr-1.5 h-1.5 w-1.5 rounded-full",r.isActive?"bg-green-500":"bg-red-500"])},null,2),A(" "+u(r.isActive?"活跃":"已停用"),1)],2)]),e("div",Zu,[r.claudeAccountId||r.claudeConsoleAccountId?(i(),d("div",ec,[s[98]||(s[98]=e("span",{class:"inline-flex items-center rounded bg-indigo-100 px-2 py-0.5 text-indigo-700 dark:bg-indigo-900/30 dark:text-indigo-300"},[e("i",{class:"fas fa-brain mr-1"}),A(" Claude ")],-1)),e("span",tc,u(ct(r)),1)])):h("",!0),r.geminiAccountId?(i(),d("div",sc,[s[99]||(s[99]=e("span",{class:"inline-flex items-center rounded bg-yellow-100 px-2 py-0.5 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-300"},[e("i",{class:"fas fa-robot mr-1"}),A(" Gemini ")],-1)),e("span",ac,u(gt(r)),1)])):h("",!0),r.openaiAccountId?(i(),d("div",rc,[s[100]||(s[100]=e("span",{class:"inline-flex items-center rounded bg-gray-100 px-2 py-0.5 text-gray-700 dark:bg-gray-700 dark:text-gray-300"},[e("i",{class:"fa-openai mr-1"}),A(" OpenAI ")],-1)),e("span",oc,u(pt(r)),1)])):h("",!0),r.bedrockAccountId?(i(),d("div",lc,[s[101]||(s[101]=e("span",{class:"inline-flex items-center rounded bg-orange-100 px-2 py-0.5 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300"},[e("i",{class:"fas fa-cloud mr-1"}),A(" Bedrock ")],-1)),e("span",nc,u(mt(r)),1)])):h("",!0),r.droidAccountId?(i(),d("div",ic,[s[102]||(s[102]=e("span",{class:"inline-flex items-center rounded bg-cyan-100 px-2 py-0.5 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-300"},[e("i",{class:"fas fa-robot mr-1"}),A(" Droid ")],-1)),e("span",dc,u(xt(r)),1)])):h("",!0),!r.claudeAccountId&&!r.claudeConsoleAccountId&&!r.geminiAccountId&&!r.openaiAccountId&&!r.bedrockAccountId&&!r.droidAccountId?(i(),d("div",uc,s[103]||(s[103]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),A(" 使用共享池 ",-1)]))):h("",!0),F.value&&r.ownerDisplayName?(i(),d("div",cc,[s[104]||(s[104]=e("i",{class:"fas fa-user mr-1"},null,-1)),A(" "+u(r.ownerDisplayName),1)])):h("",!0)]),e("div",gc,[e("div",pc,[e("div",mc,[e("span",xc,u(v.type==="custom"?"累计统计":"今日使用"),1),e("button",{class:"text-xs text-blue-600 hover:text-blue-800",onClick:re=>ft(r)},s[105]||(s[105]=[e("i",{class:"fas fa-chart-line mr-1"},null,-1),A("详情 ",-1)]),8,yc)]),e("div",fc,[e("div",null,[e("p",bc,u(ut(((S=(y=r.usage)==null?void 0:y.daily)==null?void 0:S.requests)||0))+" 次 ",1),s[106]||(s[106]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"请求",-1))]),e("div",null,[e("p",vc," $"+u((r.dailyCost||0).toFixed(2)),1),s[107]||(s[107]=e("p",{class:"text-xs text-gray-500 dark:text-gray-400"},"费用",-1))])]),e("div",kc,[s[108]||(s[108]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400"},"最后使用",-1)),e("span",wc,u(bt(r.lastUsedAt)),1)])]),e("div",hc,[r.dailyCostLimit>0?(i(),me(Se,{key:0,current:r.dailyCost||0,label:"每日限制",limit:r.dailyCostLimit,type:"daily",variant:"compact"},null,8,["current","limit"])):r.totalCostLimit>0?(i(),me(Se,{key:1,current:((K=(W=r.usage)==null?void 0:W.total)==null?void 0:K.cost)||0,label:"总费用限制",limit:r.totalCostLimit,type:"total",variant:"compact"},null,8,["current","limit"])):r.rateLimitWindow>0&&r.rateLimitCost>0&&(!r.dailyCostLimit||r.dailyCostLimit===0)&&(!r.totalCostLimit||r.totalCostLimit===0)?(i(),d("div",Ac,[ne(Se,{current:r.currentWindowCost||0,label:"窗口费用",limit:r.rateLimitCost,type:"window",variant:"compact"},null,8,["current","limit"]),e("div",$c,[e("div",Cc,[s[109]||(s[109]=e("i",{class:"fas fa-clock text-xs"},null,-1)),e("span",Ic,u(r.rateLimitWindow)+"分钟窗口",1)]),e("span",{class:j(["font-bold",r.windowRemainingSeconds>0?"text-sky-700 dark:text-sky-300":"text-gray-400 dark:text-gray-500"])},u(r.windowRemainingSeconds>0?qt(r.windowRemainingSeconds):"未激活"),3)])])):(i(),d("div",Kc,s[110]||(s[110]=[e("i",{class:"fas fa-infinity text-base"},null,-1),e("span",{class:"text-xs font-medium"},"无限制",-1)])))])]),e("div",Lc,[e("div",Dc,[s[111]||(s[111]=e("span",null,"创建时间",-1)),e("span",null,u(Re(r.createdAt)),1)]),e("div",Sc,[s[113]||(s[113]=e("span",null,"过期时间",-1)),e("div",Tc,[e("span",{class:j(rt(r.expiresAt)?"font-semibold text-orange-600":"")},u(r.expiresAt?Re(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:we(re=>Ne(r),["stop"])},s[112]||(s[112]=[e("svg",{class:"h-3 w-3",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e("path",{d:"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"})],-1)]),8,_c)])])]),r.tags&&r.tags.length>0?(i(),d("div",Mc,[(i(!0),d(ae,null,ie(r.tags,re=>(i(),d("span",{key:re,class:"inline-flex items-center rounded-full bg-blue-100 px-2 py-0.5 text-xs text-blue-800 dark:bg-blue-900/30 dark:text-blue-300"},u(re),1))),128))])):h("",!0),e("div",Pc,[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:re=>ft(r)},s[114]||(s[114]=[e("i",{class:"fas fa-chart-line"},null,-1),A(" 查看详情 ",-1)]),8,Vc),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:re=>Ut(r)},s[115]||(s[115]=[e("i",{class:"fas fa-edit mr-1"},null,-1),A(" 编辑 ",-1)]),8,Rc),r.expiresAt&&(at(r.expiresAt)||rt(r.expiresAt))?(i(),d("button",{key:0,class:"flex-1 rounded-lg bg-orange-50 px-3 py-1.5 text-xs text-orange-600 transition-colors hover:bg-orange-100 dark:bg-orange-900/30 dark:hover:bg-orange-900/50",onClick:re=>Ot(r)},s[116]||(s[116]=[e("i",{class:"fas fa-clock mr-1"},null,-1),A(" 续期 ",-1)]),8,Uc)):h("",!0),e("button",{class:j([r.isActive?"bg-orange-50 text-orange-600 hover:bg-orange-100 dark:bg-orange-900/30 dark:hover:bg-orange-900/50":"bg-green-50 text-green-600 hover:bg-green-100 dark:bg-green-900/30 dark:hover:bg-green-900/50","rounded-lg px-3 py-1.5 text-xs transition-colors"]),onClick:re=>Et(r)},[e("i",{class:j(["fas",r.isActive?"fa-ban":"fa-check-circle","mr-1"])},null,2),A(" "+u(r.isActive?"禁用":"激活"),1)],10,Oc),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:re=>jt(r.id)},s[117]||(s[117]=[e("i",{class:"fas fa-trash"},null,-1)]),8,Ec)])])}),128))])):h("",!0),je.value.length>0?(i(),d("div",jc,[e("div",Gc,[e("span",qc," 共 "+u(je.value.length)+" 条记录 ",1),e("div",zc,[s[118]||(s[118]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},"每页显示",-1)),T(e("select",{"onUpdate:modelValue":s[22]||(s[22]=r=>N.value=r),class:"rounded-md border border-gray-200 bg-white px-2 py-1 text-xs text-gray-700 transition-colors hover:border-gray-300 focus:border-transparent focus:outline-none focus:ring-2 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:border-gray-500 sm:text-sm",onChange:s[23]||(s[23]=r=>X.value=1)},[(i(),d(ae,null,ie(xe,r=>e("option",{key:r,value:r},u(r),9,Fc)),64))],544),[[Xe,N.value]]),s[119]||(s[119]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},"条",-1))])]),e("div",Bc,[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:X.value===1,onClick:s[24]||(s[24]=r=>X.value--)},s[120]||(s[120]=[e("i",{class:"fas fa-chevron-left"},null,-1)]),8,Wc),e("div",Nc,[Lt.value?(i(),d("button",{key:0,class:"hidden rounded-md border border-gray-300 bg-white px-3 py-1 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700 sm:block",onClick:s[25]||(s[25]=r=>X.value=1)}," 1 ")):h("",!0),Zt.value?(i(),d("span",Hc,"...")):h("",!0),(i(!0),d(ae,null,ie(Be.value,r=>(i(),d("button",{key:r,class:j(["rounded-md px-2 py-1 text-xs font-medium sm:px-3 sm:text-sm",r===X.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:y=>X.value=r},u(r),11,Yc))),128)),es.value?(i(),d("span",Qc,"...")):h("",!0),Dt.value?(i(),d("button",{key:3,class:"hidden rounded-md border border-gray-300 bg-white px-3 py-1 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700 sm:block",onClick:s[26]||(s[26]=r=>X.value=Oe.value)},u(Oe.value),1)):h("",!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:X.value===Oe.value||Oe.value===0,onClick:s[27]||(s[27]=r=>X.value++)},s[121]||(s[121]=[e("i",{class:"fas fa-chevron-right"},null,-1)]),8,Jc)])])):h("",!0)])):U.value==="deleted"?(i(),d("div",Xc,[z.value?(i(),d("div",Zc,s[122]||(s[122]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500 dark:text-gray-400"},"正在加载已删除的 API Keys...",-1)]))):_.value.length===0?(i(),d("div",eg,s[123]||(s[123]=[e("div",{class:"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-700"},[e("i",{class:"fas fa-trash text-xl text-gray-400"})],-1),e("p",{class:"text-lg text-gray-500 dark:text-gray-400"},"暂无已删除的 API Keys",-1),e("p",{class:"mt-2 text-sm text-gray-400"},"已删除的 API Keys 会出现在这里",-1)]))):(i(),d("div",tg,[e("div",sg,[_.value.length>0?(i(),d("button",{key:0,class:"rounded-lg bg-red-600 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-red-700 dark:bg-red-600 dark:hover:bg-red-700",onClick:bs},[s[124]||(s[124]=e("i",{class:"fas fa-trash-alt mr-2"},null,-1)),A(" 清空所有已删除 ("+u(_.value.length)+") ",1)])):h("",!0)]),e("div",ag,[e("div",rg,[e("table",og,[e("thead",lg,[e("tr",null,[s[125]||(s[125]=e("th",{class:"w-[14%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 名称 ",-1)),s[126]||(s[126]=e("th",{class:"w-[15%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 所属账号 ",-1)),F.value?(i(),d("th",ng," 创建者 ")):h("",!0),s[127]||(s[127]=e("th",{class:"w-[15%] min-w-[120px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 创建时间 ",-1)),s[128]||(s[128]=e("th",{class:"w-[10%] min-w-[90px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 删除者 ",-1)),s[129]||(s[129]=e("th",{class:"w-[10%] min-w-[90px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 删除时间 ",-1)),s[130]||(s[130]=e("th",{class:"w-[8%] min-w-[60px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 费用 ",-1)),s[131]||(s[131]=e("th",{class:"w-[8%] min-w-[60px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," Token ",-1)),s[132]||(s[132]=e("th",{class:"w-[8%] min-w-[60px] px-3 py-4 text-right text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 请求数 ",-1)),s[133]||(s[133]=e("th",{class:"w-[9%] min-w-[80px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 最后使用 ",-1)),s[134]||(s[134]=e("th",{class:"operations-column sticky right-0 w-[15%] min-w-[160px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 dark:text-gray-300"}," 操作 ",-1))])]),e("tbody",ig,[(i(!0),d(ae,null,ie(_.value,r=>{var y,S,W,K,re,fe;return i(),d("tr",{key:r.id,class:"table-row"},[e("td",dg,[e("div",ug,[s[135]||(s[135]=e("div",{class:"mr-2 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-red-500 to-red-600"},[e("i",{class:"fas fa-trash text-[10px] text-white"})],-1)),e("div",cg,[e("div",{class:"truncate text-sm font-semibold text-gray-900 dark:text-gray-100",title:r.name},u(r.name),9,gg)])])]),e("td",pg,[e("div",mg,[r.claudeAccountId?(i(),d("div",xg,s[136]||(s[136]=[e("span",{class:"inline-flex items-center rounded bg-blue-100 px-1.5 py-0.5 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300"},[e("i",{class:"fas fa-robot mr-1 text-[10px]"}),A(" Claude OAuth ")],-1)]))):r.claudeConsoleAccountId?(i(),d("div",yg,s[137]||(s[137]=[e("span",{class:"inline-flex items-center rounded bg-green-100 px-1.5 py-0.5 text-green-700 dark:bg-green-900/30 dark:text-green-300"},[e("i",{class:"fas fa-terminal mr-1 text-[10px]"}),A(" Claude Console ")],-1)]))):r.geminiAccountId?(i(),d("div",fg,s[138]||(s[138]=[e("span",{class:"inline-flex items-center rounded bg-purple-100 px-1.5 py-0.5 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300"},[e("i",{class:"fa-google mr-1 text-[10px]"}),A(" Gemini ")],-1)]))):(i(),d("div",bg,s[139]||(s[139]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),A(" 共享池 ",-1)])))])]),F.value?(i(),d("td",vg,[e("div",kg,[r.createdBy==="admin"?(i(),d("span",wg,s[140]||(s[140]=[e("i",{class:"fas fa-user-shield mr-1 text-xs"},null,-1),A(" 管理员 ",-1)]))):r.userUsername?(i(),d("span",hg,[s[141]||(s[141]=e("i",{class:"fas fa-user mr-1 text-xs"},null,-1)),A(" "+u(r.userUsername),1)])):(i(),d("span",Ag,s[142]||(s[142]=[e("i",{class:"fas fa-question-circle mr-1 text-xs"},null,-1),A(" 未知 ",-1)])))])])):h("",!0),e("td",$g,u(Re(r.createdAt)),1),e("td",Cg,[e("div",Ig,[r.deletedByType==="admin"?(i(),d("span",Kg,[s[143]||(s[143]=e("i",{class:"fas fa-user-shield mr-1 text-xs"},null,-1)),A(" "+u(r.deletedBy),1)])):r.deletedByType==="user"?(i(),d("span",Lg,[s[144]||(s[144]=e("i",{class:"fas fa-user mr-1 text-xs"},null,-1)),A(" "+u(r.deletedBy),1)])):(i(),d("span",Dg,[s[145]||(s[145]=e("i",{class:"fas fa-cog mr-1 text-xs"},null,-1)),A(" "+u(r.deletedBy),1)]))])]),e("td",Sg,u(Re(r.deletedAt)),1),e("td",Tg,[e("span",_g," $"+u((((S=(y=r.usage)==null?void 0:y.total)==null?void 0:S.cost)||0).toFixed(2)),1)]),e("td",Mg,[e("span",Pg,u(ke(((K=(W=r.usage)==null?void 0:W.total)==null?void 0:K.tokens)||0)),1)]),e("td",Vg,[e("div",Rg,[e("span",Ug,u(ut(((fe=(re=r.usage)==null?void 0:re.total)==null?void 0:fe.requests)||0)),1),s[146]||(s[146]=e("span",{class:"text-xs text-gray-500"},"次",-1))])]),e("td",Og,[r.lastUsedAt?(i(),d("span",Eg,u(bt(r.lastUsedAt)),1)):(i(),d("span",jg,"从未使用"))]),e("td",Gg,[e("div",qg,[r.canRestore?(i(),d("button",{key:0,class:"rounded-lg bg-green-50 px-3 py-1.5 text-xs font-medium text-green-600 transition-colors hover:bg-green-100 dark:bg-green-900/30 dark:text-green-400 dark:hover:bg-green-900/50",title:"恢复 API Key",onClick:k=>ys(r.id)},s[147]||(s[147]=[e("i",{class:"fas fa-undo mr-1"},null,-1),A(" 恢复 ",-1)]),8,zg)):h("",!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:k=>fs(r.id)},s[148]||(s[148]=[e("i",{class:"fas fa-times mr-1"},null,-1),A(" 彻底删除 ",-1)]),8,Fg)])])])}),128))])])])])]))])):h("",!0)])]),Ce.value?(i(),me(Rr,{key:0,accounts:Y.value,onBatchSuccess:cs,onClose:s[28]||(s[28]=r=>Ce.value=!1),onSuccess:us},null,8,["accounts"])):h("",!0),_e.value?(i(),me(jo,{key:1,accounts:Y.value,"api-key":$t.value,onClose:s[29]||(s[29]=r=>_e.value=!1),onSuccess:ms},null,8,["accounts","api-key"])):h("",!0),Me.value?(i(),me(al,{key:2,"api-key":Ct.value,onClose:s[30]||(s[30]=r=>Me.value=!1),onSuccess:xs},null,8,["api-key"])):h("",!0),le.value?(i(),me(fl,{key:3,"api-key":It.value,onClose:s[31]||(s[31]=r=>le.value=!1)},null,8,["api-key"])):h("",!0),Ie.value?(i(),me(ql,{key:4,"api-keys":Kt.value,onClose:s[32]||(s[32]=r=>Ie.value=!1)},null,8,["api-keys"])):h("",!0),et.value?(i(),me(Un,{key:5,accounts:Y.value,"selected-keys":C.value,onClose:s[33]||(s[33]=r=>et.value=!1),onSuccess:ps},null,8,["accounts","selected-keys"])):h("",!0),ne(di,{ref_key:"expiryEditModalRef",ref:f,"api-key":ye.value||{id:null,expiresAt:null,name:""},show:!!ye.value,onClose:Gt,onSave:ws},null,8,["api-key","show"]),ne(cd,{"api-key":l.value||{},show:o.value,onClose:s[34]||(s[34]=r=>o.value=!1)},null,8,["api-key","show"])])}}},Xg=Ke(Bg,[["__scopeId","data-v-b49fddcc"]]);export{Xg as default};
|