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