mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 09:38:02 +00:00
10 lines
74 KiB
JavaScript
10 lines
74 KiB
JavaScript
import{E as je}from"./element-plus-B8Fs_0jW.js";import{aR as we,r as C,c as Q,_ as me,q as pe,I as X,y as i,z as e,Y as J,K as A,x as a,L as w,O as b,aq as U,C as W,P as c,Q as T,ac as _,aa as ae,aX as H,an as te,al as se,a5 as re,R as Ue,B as qe}from"./vue-vendor-CKToUHZx.js";import{s as R}from"./toast-BvwA7Mwb.js";import{a as q,_ as ne,u as $e}from"./index-BplQFSFl.js";import"./vendor-BDiMbLwQ.js";const xe=we("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 h=await q.get("/admin/supported-clients");return h.success?this.supportedClients=h.data||[]:(this.error=h.message||"加载支持的客户端失败",console.error("Failed to load supported clients:",this.error)),this.supportedClients}catch(h){return this.error=h.message||"加载支持的客户端失败",console.error("Error loading supported clients:",h),[]}finally{this.loading=!1}}}}),Ae=we("apiKeys",()=>{const h=C([]),L=C(!1),g=C(null),V=C("all"),M=C(""),f=C("asc"),I=async()=>{L.value=!0,g.value=null;try{const $=await q.get("/admin/api-keys");if($.success)h.value=$.data||[];else throw new Error($.message||"获取API Keys失败")}catch($){throw g.value=$.message,$}finally{L.value=!1}};return{apiKeys:h,loading:L,error:g,statsTimeRange:V,sortBy:M,sortOrder:f,fetchApiKeys:I,createApiKey:async $=>{L.value=!0,g.value=null;try{const K=await q.post("/admin/api-keys",$);if(K.success)return await I(),K.data;throw new Error(K.message||"创建API Key失败")}catch(K){throw g.value=K.message,K}finally{L.value=!1}},updateApiKey:async($,K)=>{L.value=!0,g.value=null;try{const x=await q.put(`/admin/api-keys/${$}`,K);if(x.success)return await I(),x;throw new Error(x.message||"更新API Key失败")}catch(x){throw g.value=x.message,x}finally{L.value=!1}},toggleApiKey:async $=>{L.value=!0,g.value=null;try{const K=await q.put(`/admin/api-keys/${$}/toggle`);if(K.success)return await I(),K;throw new Error(K.message||"切换状态失败")}catch(K){throw g.value=K.message,K}finally{L.value=!1}},renewApiKey:async($,K)=>{L.value=!0,g.value=null;try{const x=await q.put(`/admin/api-keys/${$}/renew`,K);if(x.success)return await I(),x;throw new Error(x.message||"续期失败")}catch(x){throw g.value=x.message,x}finally{L.value=!1}},deleteApiKey:async $=>{L.value=!0,g.value=null;try{const K=await q.delete(`/admin/api-keys/${$}`);if(K.success)return await I(),K;throw new Error(K.message||"删除失败")}catch(K){throw g.value=K.message,K}finally{L.value=!1}},fetchApiKeyStats:async($,K="all")=>{try{const x=await q.get(`/admin/api-keys/${$}/stats`,{params:{timeRange:K}});if(x.success)return x.stats;throw new Error(x.message||"获取统计失败")}catch(x){return console.error("获取API Key统计失败:",x),null}},fetchTags:async()=>{try{const $=await q.get("/admin/api-keys/tags");if($.success)return $.data||[];throw new Error($.message||"获取标签失败")}catch($){return console.error("获取标签失败:",$),[]}},sortApiKeys:$=>{M.value===$?f.value=f.value==="asc"?"desc":"asc":(M.value=$,f.value="asc")},reset:()=>{h.value=[],L.value=!1,g.value=null,V.value="all",M.value="",f.value="asc"}}}),Oe={class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},Fe={class:"modal-content w-full max-w-4xl p-6 mx-auto max-h-[90vh] flex flex-col"},We={class:"flex items-center justify-between mb-4"},Ne={key:0,class:"text-red-500 text-xs mt-1"},Ye={class:"space-y-4"},ze={key:0},Be={class:"flex flex-wrap gap-2"},He=["onClick"],Ge={key:1},Qe={class:"flex flex-wrap gap-2"},Xe=["onClick"],Je={class:"flex gap-2"},Ze=["onKeypress"],et={class:"bg-blue-50 border border-blue-200 rounded-lg p-3"},tt={class:"space-y-2"},st={class:"grid grid-cols-1 lg:grid-cols-3 gap-2"},lt={class:"space-y-2"},ot={class:"flex gap-2"},nt={key:0,class:"mt-3"},it=["min"],at={key:1,class:"text-xs text-gray-500 mt-2"},rt={class:"flex gap-4"},dt={class:"flex items-center cursor-pointer"},ut={class:"flex items-center cursor-pointer"},ct={class:"flex items-center cursor-pointer"},mt={class:"grid grid-cols-1 gap-3"},pt=["disabled"],xt={key:0,label:"Claude OAuth 账号"},gt=["value"],yt={key:1,label:"Claude Console 账号"},ft=["value"],bt=["disabled"],vt=["value"],wt={class:"flex items-center mb-2"},$t={key:0,class:"space-y-2 bg-red-50 border border-red-200 rounded-lg p-3"},At={class:"flex flex-wrap gap-1 mb-2 min-h-[24px]"},Ct=["onClick"],kt={key:0,class:"text-gray-400 text-xs"},Kt={class:"flex gap-2"},ht=["onKeydown"],It={class:"flex items-center mb-2"},Dt={key:0,class:"bg-green-50 border border-green-200 rounded-lg p-3"},Lt={class:"space-y-1"},Mt=["id","value"],St=["for"],Rt={class:"text-sm font-medium text-gray-700"},Tt={class:"text-xs text-gray-500 block"},Pt={class:"flex gap-3 pt-2"},_t=["disabled"],Et={key:0,class:"loading-spinner mr-2"},Vt={key:1,class:"fas fa-plus mr-2"},jt={__name:"CreateApiKeyModal",props:{accounts:{type:Object,default:()=>({claude:[],gemini:[]})}},emits:["close","success"],setup(h,{emit:L}){const g=L;$e();const V=xe(),M=Ae(),f=C(!1),I=C({name:""}),P=C(""),k=C([]),O=Q(()=>k.value.filter(v=>!t.tags.includes(v))),D=C([]),t=me({name:"",description:"",tokenLimit:"",rateLimitWindow:"",rateLimitRequests:"",concurrencyLimit:"",dailyCostLimit:"",expireDuration:"",customExpireDate:"",expiresAt:null,permissions:"all",claudeAccountId:"",geminiAccountId:"",enableModelRestriction:!1,restrictedModels:[],modelInput:"",enableClientRestriction:!1,allowedClients:[],tags:[]});pe(async()=>{D.value=await V.loadSupportedClients(),k.value=await M.fetchTags()});const y=Q(()=>{const v=new Date;return v.setMinutes(v.getMinutes()+1),v.toISOString().slice(0,16)}),E=()=>{if(!t.expireDuration){t.expiresAt=null;return}if(t.expireDuration==="custom")return;const v=new Date,r=t.expireDuration.match(/(\d+)([dhmy])/);if(r){const[,j,le]=r,Z=parseInt(j);switch(le){case"d":v.setDate(v.getDate()+Z);break;case"h":v.setHours(v.getHours()+Z);break;case"m":v.setMonth(v.getMonth()+Z);break;case"y":v.setFullYear(v.getFullYear()+Z);break}t.expiresAt=v.toISOString()}},B=()=>{t.customExpireDate&&(t.expiresAt=new Date(t.customExpireDate).toISOString())},z=v=>new Date(v).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),$=()=>{t.modelInput&&!t.restrictedModels.includes(t.modelInput)&&(t.restrictedModels.push(t.modelInput),t.modelInput="")},K=v=>{t.restrictedModels.splice(v,1)},x=()=>{if(P.value&&P.value.trim()){const v=P.value.trim();t.tags.includes(v)||t.tags.push(v),P.value=""}},n=v=>{t.tags.includes(v)||t.tags.push(v)},u=v=>{t.tags.splice(v,1)},N=async()=>{if(I.value.name="",!t.name||!t.name.trim()){I.value.name="请输入API Key名称";return}f.value=!0;try{const v={name:t.name,description:t.description||void 0,tokenLimit:t.tokenLimit!==""&&t.tokenLimit!==null?parseInt(t.tokenLimit):null,rateLimitWindow:t.rateLimitWindow!==""&&t.rateLimitWindow!==null?parseInt(t.rateLimitWindow):null,rateLimitRequests:t.rateLimitRequests!==""&&t.rateLimitRequests!==null?parseInt(t.rateLimitRequests):null,concurrencyLimit:t.concurrencyLimit!==""&&t.concurrencyLimit!==null?parseInt(t.concurrencyLimit):0,dailyCostLimit:t.dailyCostLimit!==""&&t.dailyCostLimit!==null?parseFloat(t.dailyCostLimit):0,expiresAt:t.expiresAt||void 0,permissions:t.permissions,tags:t.tags.length>0?t.tags:void 0};t.claudeAccountId&&(t.claudeAccountId.startsWith("console:")?v.claudeConsoleAccountId=t.claudeAccountId.substring(8):v.claudeAccountId=t.claudeAccountId),t.geminiAccountId&&(v.geminiAccountId=t.geminiAccountId),v.enableModelRestriction=t.enableModelRestriction,v.restrictedModels=t.restrictedModels,v.enableClientRestriction=t.enableClientRestriction,v.allowedClients=t.allowedClients;const o=await q.post("/admin/api-keys",v);o.success?(R("API Key 创建成功","success"),g("success",o.data),g("close")):R(o.message||"创建失败","error")}catch{R("创建失败","error")}finally{f.value=!1}};return(v,o)=>(i(),X(re,{to:"body"},[e("div",Oe,[e("div",Fe,[e("div",We,[o[27]||(o[27]=e("div",{class:"flex items-center gap-3"},[e("div",{class:"w-10 h-10 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl flex items-center justify-center"},[e("i",{class:"fas fa-key text-white"})]),e("h3",{class:"text-xl font-bold text-gray-900"}," 创建新的 API Key ")],-1)),e("button",{class:"text-gray-400 hover:text-gray-600 transition-colors",onClick:o[0]||(o[0]=r=>v.$emit("close"))},o[26]||(o[26]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("form",{class:"space-y-4 modal-scroll-content custom-scrollbar flex-1",onSubmit:J(N,["prevent"])},[e("div",null,[o[28]||(o[28]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},[b("名称 "),e("span",{class:"text-red-500"},"*")],-1)),A(e("input",{"onUpdate:modelValue":o[1]||(o[1]=r=>t.name=r),type:"text",required:"",class:W(["form-input w-full",{"border-red-500":I.value.name}]),placeholder:"为您的 API Key 取一个名称",onInput:o[2]||(o[2]=r=>I.value.name="")},null,34),[[U,t.name]]),I.value.name?(i(),a("p",Ne,c(I.value.name),1)):w("",!0)]),e("div",null,[o[36]||(o[36]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"标签",-1)),e("div",Ye,[t.tags.length>0?(i(),a("div",ze,[o[30]||(o[30]=e("div",{class:"text-xs font-medium text-gray-600 mb-2"}," 已选择的标签: ",-1)),e("div",Be,[(i(!0),a(T,null,_(t.tags,(r,j)=>(i(),a("span",{key:"selected-"+j,class:"inline-flex items-center gap-1 px-3 py-1 bg-blue-100 text-blue-800 text-sm rounded-full"},[b(c(r)+" ",1),e("button",{type:"button",class:"ml-1 hover:text-blue-900",onClick:le=>u(j)},o[29]||(o[29]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,He)]))),128))])])):w("",!0),O.value.length>0?(i(),a("div",Ge,[o[32]||(o[32]=e("div",{class:"text-xs font-medium text-gray-600 mb-2"}," 点击选择已有标签: ",-1)),e("div",Qe,[(i(!0),a(T,null,_(O.value,r=>(i(),a("button",{key:"available-"+r,type:"button",class:"inline-flex items-center gap-1 px-3 py-1 bg-gray-100 text-gray-700 text-sm rounded-full hover:bg-blue-100 hover:text-blue-700 transition-colors",onClick:j=>n(r)},[o[31]||(o[31]=e("i",{class:"fas fa-tag text-gray-500 text-xs"},null,-1)),b(" "+c(r),1)],8,Xe))),128))])])):w("",!0),e("div",null,[o[34]||(o[34]=e("div",{class:"text-xs font-medium text-gray-600 mb-2"}," 创建新标签: ",-1)),e("div",Je,[A(e("input",{"onUpdate:modelValue":o[3]||(o[3]=r=>P.value=r),type:"text",class:"form-input flex-1",placeholder:"输入新标签名称",onKeypress:ae(J(x,["prevent"]),["enter"])},null,40,Ze),[[U,P.value]]),e("button",{type:"button",class:"px-4 py-2 bg-green-500 text-white rounded-lg hover:bg-green-600 transition-colors",onClick:x},o[33]||(o[33]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),o[35]||(o[35]=e("p",{class:"text-xs text-gray-500"}," 用于标记不同团队或用途,方便筛选管理 ",-1))])]),e("div",et,[o[44]||(o[44]=e("div",{class:"flex items-center gap-2 mb-2"},[e("div",{class:"w-6 h-6 bg-blue-500 rounded flex items-center justify-center flex-shrink-0"},[e("i",{class:"fas fa-tachometer-alt text-white text-xs"})]),e("h4",{class:"font-semibold text-gray-800 text-sm"}," 速率限制设置 (可选) ")],-1)),e("div",tt,[e("div",st,[e("div",null,[o[37]||(o[37]=e("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"时间窗口 (分钟)",-1)),A(e("input",{"onUpdate:modelValue":o[4]||(o[4]=r=>t.rateLimitWindow=r),type:"number",min:"1",placeholder:"无限制",class:"form-input w-full text-sm"},null,512),[[U,t.rateLimitWindow]]),o[38]||(o[38]=e("p",{class:"text-xs text-gray-500 mt-0.5 ml-2"}," 时间段单位 ",-1))]),e("div",null,[o[39]||(o[39]=e("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"请求次数限制",-1)),A(e("input",{"onUpdate:modelValue":o[5]||(o[5]=r=>t.rateLimitRequests=r),type:"number",min:"1",placeholder:"无限制",class:"form-input w-full text-sm"},null,512),[[U,t.rateLimitRequests]]),o[40]||(o[40]=e("p",{class:"text-xs text-gray-500 mt-0.5 ml-2"}," 窗口内最大请求 ",-1))]),e("div",null,[o[41]||(o[41]=e("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"Token 限制",-1)),A(e("input",{"onUpdate:modelValue":o[6]||(o[6]=r=>t.tokenLimit=r),type:"number",placeholder:"无限制",class:"form-input w-full text-sm"},null,512),[[U,t.tokenLimit]]),o[42]||(o[42]=e("p",{class:"text-xs text-gray-500 mt-0.5 ml-2"}," 窗口内最大Token ",-1))])]),o[43]||(o[43]=e("div",{class:"bg-blue-100 rounded-lg p-2"},[e("h5",{class:"text-xs font-semibold text-blue-800 mb-1"}," 💡 使用示例 "),e("div",{class:"text-xs text-blue-700 space-y-0.5"},[e("div",null,[e("strong",null,"示例1:"),b(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求")]),e("div",null,[e("strong",null,"示例2:"),b(" 时间窗口=1,Token=10000 → 每分钟最多10,000个Token")]),e("div",null,[e("strong",null,"示例3:"),b(" 窗口=30,请求=50,Token=100000 → 每30分钟50次请求且不超10万Token")])])],-1))])]),e("div",null,[o[46]||(o[46]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"每日费用限制 (美元)",-1)),e("div",lt,[e("div",ot,[e("button",{type:"button",class:"px-2 py-1 bg-gray-100 hover:bg-gray-200 rounded text-xs font-medium",onClick:o[7]||(o[7]=r=>t.dailyCostLimit="50")}," $50 "),e("button",{type:"button",class:"px-2 py-1 bg-gray-100 hover:bg-gray-200 rounded text-xs font-medium",onClick:o[8]||(o[8]=r=>t.dailyCostLimit="100")}," $100 "),e("button",{type:"button",class:"px-2 py-1 bg-gray-100 hover:bg-gray-200 rounded text-xs font-medium",onClick:o[9]||(o[9]=r=>t.dailyCostLimit="200")}," $200 "),e("button",{type:"button",class:"px-2 py-1 bg-gray-100 hover:bg-gray-200 rounded text-xs font-medium",onClick:o[10]||(o[10]=r=>t.dailyCostLimit="")}," 自定义 ")]),A(e("input",{"onUpdate:modelValue":o[11]||(o[11]=r=>t.dailyCostLimit=r),type:"number",min:"0",step:"0.01",placeholder:"0 表示无限制",class:"form-input w-full"},null,512),[[U,t.dailyCostLimit]]),o[45]||(o[45]=e("p",{class:"text-xs text-gray-500"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[o[47]||(o[47]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"并发限制 (可选)",-1)),A(e("input",{"onUpdate:modelValue":o[12]||(o[12]=r=>t.concurrencyLimit=r),type:"number",min:"0",placeholder:"0 表示无限制",class:"form-input w-full"},null,512),[[U,t.concurrencyLimit]]),o[48]||(o[48]=e("p",{class:"text-xs text-gray-500 mt-2"}," 设置此 API Key 可同时处理的最大请求数,0 或留空表示无限制 ",-1))]),e("div",null,[o[49]||(o[49]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"备注 (可选)",-1)),A(e("textarea",{"onUpdate:modelValue":o[13]||(o[13]=r=>t.description=r),rows:"2",class:"form-input w-full resize-none text-sm",placeholder:"描述此 API Key 的用途..."},null,512),[[U,t.description]])]),e("div",null,[o[51]||(o[51]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"有效期限",-1)),A(e("select",{"onUpdate:modelValue":o[14]||(o[14]=r=>t.expireDuration=r),class:"form-input w-full",onChange:E},o[50]||(o[50]=[e("option",{value:""}," 永不过期 ",-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),[[H,t.expireDuration]]),t.expireDuration==="custom"?(i(),a("div",nt,[A(e("input",{"onUpdate:modelValue":o[15]||(o[15]=r=>t.customExpireDate=r),type:"datetime-local",class:"form-input w-full",min:y.value,onChange:B},null,40,it),[[U,t.customExpireDate]])])):w("",!0),t.expiresAt?(i(),a("p",at," 将于 "+c(z(t.expiresAt))+" 过期 ",1)):w("",!0)]),e("div",null,[o[55]||(o[55]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"服务权限",-1)),e("div",rt,[e("label",dt,[A(e("input",{"onUpdate:modelValue":o[16]||(o[16]=r=>t.permissions=r),type:"radio",value:"all",class:"mr-2"},null,512),[[te,t.permissions]]),o[52]||(o[52]=e("span",{class:"text-sm text-gray-700"},"全部服务",-1))]),e("label",ut,[A(e("input",{"onUpdate:modelValue":o[17]||(o[17]=r=>t.permissions=r),type:"radio",value:"claude",class:"mr-2"},null,512),[[te,t.permissions]]),o[53]||(o[53]=e("span",{class:"text-sm text-gray-700"},"仅 Claude",-1))]),e("label",ct,[A(e("input",{"onUpdate:modelValue":o[18]||(o[18]=r=>t.permissions=r),type:"radio",value:"gemini",class:"mr-2"},null,512),[[te,t.permissions]]),o[54]||(o[54]=e("span",{class:"text-sm text-gray-700"},"仅 Gemini",-1))])]),o[56]||(o[56]=e("p",{class:"text-xs text-gray-500 mt-2"}," 控制此 API Key 可以访问哪些服务 ",-1))]),e("div",null,[o[61]||(o[61]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"专属账号绑定 (可选)",-1)),e("div",mt,[e("div",null,[o[58]||(o[58]=e("label",{class:"block text-sm font-medium text-gray-600 mb-1"},"Claude 专属账号",-1)),A(e("select",{"onUpdate:modelValue":o[19]||(o[19]=r=>t.claudeAccountId=r),class:"form-input w-full",disabled:t.permissions==="gemini"},[o[57]||(o[57]=e("option",{value:""}," 使用共享账号池 ",-1)),h.accounts.claude.filter(r=>r.isDedicated&&r.platform==="claude-oauth").length>0?(i(),a("optgroup",xt,[(i(!0),a(T,null,_(h.accounts.claude.filter(r=>r.isDedicated&&r.platform==="claude-oauth"),r=>(i(),a("option",{key:r.id,value:r.id},c(r.name)+" ("+c(r.status==="active"?"正常":"异常")+") ",9,gt))),128))])):w("",!0),h.accounts.claude.filter(r=>r.isDedicated&&r.platform==="claude-console").length>0?(i(),a("optgroup",yt,[(i(!0),a(T,null,_(h.accounts.claude.filter(r=>r.isDedicated&&r.platform==="claude-console"),r=>(i(),a("option",{key:r.id,value:`console:${r.id}`},c(r.name)+" ("+c(r.status==="active"?"正常":"异常")+") ",9,ft))),128))])):w("",!0)],8,pt),[[H,t.claudeAccountId]])]),e("div",null,[o[60]||(o[60]=e("label",{class:"block text-sm font-medium text-gray-600 mb-1"},"Gemini 专属账号",-1)),A(e("select",{"onUpdate:modelValue":o[20]||(o[20]=r=>t.geminiAccountId=r),class:"form-input w-full",disabled:t.permissions==="claude"},[o[59]||(o[59]=e("option",{value:""}," 使用共享账号池 ",-1)),(i(!0),a(T,null,_(h.accounts.gemini.filter(r=>r.isDedicated),r=>(i(),a("option",{key:r.id,value:r.id},c(r.name)+" ("+c(r.status==="active"?"正常":"异常")+") ",9,vt))),128))],8,bt),[[H,t.geminiAccountId]])])]),o[62]||(o[62]=e("p",{class:"text-xs text-gray-500 mt-2"}," 选择专属账号后,此API Key将只使用该账号,不选择则使用共享账号池 ",-1))]),e("div",null,[e("div",wt,[A(e("input",{id:"enableModelRestriction","onUpdate:modelValue":o[21]||(o[21]=r=>t.enableModelRestriction=r),type:"checkbox",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[se,t.enableModelRestriction]]),o[63]||(o[63]=e("label",{for:"enableModelRestriction",class:"ml-2 text-sm font-semibold text-gray-700 cursor-pointer"}," 启用模型限制 ",-1))]),t.enableModelRestriction?(i(),a("div",$t,[e("div",null,[o[66]||(o[66]=e("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"限制的模型列表",-1)),e("div",At,[(i(!0),a(T,null,_(t.restrictedModels,(r,j)=>(i(),a("span",{key:j,class:"inline-flex items-center px-2 py-1 rounded-full text-xs bg-red-100 text-red-800"},[b(c(r)+" ",1),e("button",{type:"button",class:"ml-1 text-red-600 hover:text-red-800",onClick:le=>K(j)},o[64]||(o[64]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,Ct)]))),128)),t.restrictedModels.length===0?(i(),a("span",kt," 暂无限制的模型 ")):w("",!0)]),e("div",Kt,[A(e("input",{"onUpdate:modelValue":o[22]||(o[22]=r=>t.modelInput=r),type:"text",placeholder:"输入模型名称,按回车添加",class:"form-input flex-1 text-sm",onKeydown:ae(J($,["prevent"]),["enter"])},null,40,ht),[[U,t.modelInput]]),e("button",{type:"button",class:"px-3 py-1.5 bg-red-500 text-white rounded-lg hover:bg-red-600 transition-colors text-sm",onClick:$},o[65]||(o[65]=[e("i",{class:"fas fa-plus"},null,-1)]))]),o[67]||(o[67]=e("p",{class:"text-xs text-gray-500 mt-1"}," 例如:claude-opus-4-20250514 ",-1))])])):w("",!0)]),e("div",null,[e("div",It,[A(e("input",{id:"enableClientRestriction","onUpdate:modelValue":o[23]||(o[23]=r=>t.enableClientRestriction=r),type:"checkbox",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[se,t.enableClientRestriction]]),o[68]||(o[68]=e("label",{for:"enableClientRestriction",class:"ml-2 text-sm font-semibold text-gray-700 cursor-pointer"}," 启用客户端限制 ",-1))]),t.enableClientRestriction?(i(),a("div",Dt,[e("div",null,[o[69]||(o[69]=e("label",{class:"block text-xs font-medium text-gray-700 mb-2"},"允许的客户端",-1)),e("div",Lt,[(i(!0),a(T,null,_(D.value,r=>(i(),a("div",{key:r.id,class:"flex items-start"},[A(e("input",{id:`client_${r.id}`,"onUpdate:modelValue":o[24]||(o[24]=j=>t.allowedClients=j),type:"checkbox",value:r.id,class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 mt-0.5"},null,8,Mt),[[se,t.allowedClients]]),e("label",{for:`client_${r.id}`,class:"ml-2 flex-1 cursor-pointer"},[e("span",Rt,c(r.name),1),e("span",Tt,c(r.description),1)],8,St)]))),128))])])])):w("",!0)]),e("div",Pt,[e("button",{type:"button",class:"flex-1 px-4 py-2.5 bg-gray-100 text-gray-700 rounded-lg font-semibold hover:bg-gray-200 transition-colors text-sm",onClick:o[25]||(o[25]=r=>v.$emit("close"))}," 取消 "),e("button",{type:"submit",disabled:f.value,class:"btn btn-primary flex-1 py-2.5 px-4 font-semibold text-sm"},[f.value?(i(),a("div",Et)):(i(),a("i",Vt)),b(" "+c(f.value?"创建中...":"创建"),1)],8,_t)])],32)])])]))}},Ut=ne(jt,[["__scopeId","data-v-6f63995d"]]),qt={class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},Ot={class:"modal-content w-full max-w-4xl p-8 mx-auto max-h-[90vh] flex flex-col"},Ft={class:"flex items-center justify-between mb-6"},Wt=["value"],Nt={class:"space-y-4"},Yt={key:0},zt={class:"flex flex-wrap gap-2"},Bt=["onClick"],Ht={key:1},Gt={class:"flex flex-wrap gap-2"},Qt=["onClick"],Xt={class:"flex gap-2"},Jt=["onKeypress"],Zt={class:"bg-blue-50 border border-blue-200 rounded-lg p-3"},es={class:"space-y-2"},ts={class:"grid grid-cols-1 lg:grid-cols-3 gap-2"},ss={class:"space-y-3"},ls={class:"flex gap-2"},os={class:"flex gap-4"},ns={class:"flex items-center cursor-pointer"},is={class:"flex items-center cursor-pointer"},as={class:"flex items-center cursor-pointer"},rs={class:"grid grid-cols-1 gap-3"},ds=["disabled"],us={key:0,label:"Claude OAuth 账号"},cs=["value"],ms={key:1,label:"Claude Console 账号"},ps=["value"],xs=["disabled"],gs=["value"],ys={class:"flex items-center mb-3"},fs={key:0,class:"space-y-3"},bs={class:"flex flex-wrap gap-2 mb-3 min-h-[32px] p-2 bg-gray-50 rounded-lg border border-gray-200"},vs=["onClick"],ws={key:0,class:"text-gray-400 text-sm"},$s={class:"flex gap-2"},As=["onKeydown"],Cs={class:"flex items-center mb-3"},ks={key:0,class:"space-y-3"},Ks={class:"space-y-2"},hs=["id","value"],Is=["for"],Ds={class:"text-sm font-medium text-gray-700"},Ls={class:"text-xs text-gray-500 block"},Ms={class:"flex gap-3 pt-4"},Ss=["disabled"],Rs={key:0,class:"loading-spinner mr-2"},Ts={key:1,class:"fas fa-save mr-2"},Ps={__name:"EditApiKeyModal",props:{apiKey:{type:Object,required:!0},accounts:{type:Object,default:()=>({claude:[],gemini:[]})}},emits:["close","success"],setup(h,{emit:L}){const g=h,V=L,M=xe(),f=Ae(),I=C(!1),P=C([]),k=C(""),O=C([]),D=Q(()=>O.value.filter(x=>!t.tags.includes(x))),t=me({name:"",tokenLimit:"",rateLimitWindow:"",rateLimitRequests:"",concurrencyLimit:"",dailyCostLimit:"",permissions:"all",claudeAccountId:"",geminiAccountId:"",enableModelRestriction:!1,restrictedModels:[],modelInput:"",enableClientRestriction:!1,allowedClients:[],tags:[]}),y=()=>{t.modelInput&&!t.restrictedModels.includes(t.modelInput)&&(t.restrictedModels.push(t.modelInput),t.modelInput="")},E=x=>{t.restrictedModels.splice(x,1)},B=()=>{if(k.value&&k.value.trim()){const x=k.value.trim();t.tags.includes(x)||t.tags.push(x),k.value=""}},z=x=>{t.tags.includes(x)||t.tags.push(x)},$=x=>{t.tags.splice(x,1)},K=async()=>{I.value=!0;try{const x={tokenLimit:t.tokenLimit!==""&&t.tokenLimit!==null?parseInt(t.tokenLimit):0,rateLimitWindow:t.rateLimitWindow!==""&&t.rateLimitWindow!==null?parseInt(t.rateLimitWindow):0,rateLimitRequests:t.rateLimitRequests!==""&&t.rateLimitRequests!==null?parseInt(t.rateLimitRequests):0,concurrencyLimit:t.concurrencyLimit!==""&&t.concurrencyLimit!==null?parseInt(t.concurrencyLimit):0,dailyCostLimit:t.dailyCostLimit!==""&&t.dailyCostLimit!==null?parseFloat(t.dailyCostLimit):0,permissions:t.permissions,tags:t.tags};x.enableModelRestriction=t.enableModelRestriction,x.restrictedModels=t.restrictedModels,x.enableClientRestriction=t.enableClientRestriction,x.allowedClients=t.allowedClients,t.claudeAccountId?t.claudeAccountId.startsWith("console:")?(x.claudeConsoleAccountId=t.claudeAccountId.substring(8),x.claudeAccountId=null):(x.claudeAccountId=t.claudeAccountId,x.claudeConsoleAccountId=null):(x.claudeAccountId=null,x.claudeConsoleAccountId=null),x.geminiAccountId=t.geminiAccountId||null;const n=await q.put(`/admin/api-keys/${g.apiKey.id}`,x);n.success?(V("success"),V("close")):R(n.message||"更新失败","error")}catch{R("更新失败","error")}finally{I.value=!1}};return pe(async()=>{P.value=await M.loadSupportedClients(),O.value=await f.fetchTags(),t.name=g.apiKey.name,t.tokenLimit=g.apiKey.tokenLimit||"",t.rateLimitWindow=g.apiKey.rateLimitWindow||"",t.rateLimitRequests=g.apiKey.rateLimitRequests||"",t.concurrencyLimit=g.apiKey.concurrencyLimit||"",t.dailyCostLimit=g.apiKey.dailyCostLimit||"",t.permissions=g.apiKey.permissions||"all",g.apiKey.claudeAccountId?t.claudeAccountId=g.apiKey.claudeAccountId:g.apiKey.claudeConsoleAccountId?t.claudeAccountId=`console:${g.apiKey.claudeConsoleAccountId}`:t.claudeAccountId="",t.geminiAccountId=g.apiKey.geminiAccountId||"",t.restrictedModels=g.apiKey.restrictedModels||[],t.allowedClients=g.apiKey.allowedClients||[],t.tags=g.apiKey.tags||[],t.enableModelRestriction=g.apiKey.enableModelRestriction||!1,t.enableClientRestriction=g.apiKey.enableClientRestriction||!1}),(x,n)=>(i(),X(re,{to:"body"},[e("div",qt,[e("div",Ot,[e("div",Ft,[n[22]||(n[22]=e("div",{class:"flex items-center gap-3"},[e("div",{class:"w-10 h-10 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl flex items-center justify-center"},[e("i",{class:"fas fa-edit text-white"})]),e("h3",{class:"text-xl font-bold text-gray-900"}," 编辑 API Key ")],-1)),e("button",{class:"text-gray-400 hover:text-gray-600 transition-colors",onClick:n[0]||(n[0]=u=>x.$emit("close"))},n[21]||(n[21]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("form",{class:"space-y-6 modal-scroll-content custom-scrollbar flex-1",onSubmit:J(K,["prevent"])},[e("div",null,[n[23]||(n[23]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"名称",-1)),e("input",{value:t.name,type:"text",disabled:"",class:"form-input w-full bg-gray-100 cursor-not-allowed"},null,8,Wt),n[24]||(n[24]=e("p",{class:"text-xs text-gray-500 mt-2"}," 名称不可修改 ",-1))]),e("div",null,[n[32]||(n[32]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"标签",-1)),e("div",Nt,[t.tags.length>0?(i(),a("div",Yt,[n[26]||(n[26]=e("div",{class:"text-xs font-medium text-gray-600 mb-2"}," 已选择的标签: ",-1)),e("div",zt,[(i(!0),a(T,null,_(t.tags,(u,N)=>(i(),a("span",{key:"selected-"+N,class:"inline-flex items-center gap-1 px-3 py-1 bg-blue-100 text-blue-800 text-sm rounded-full"},[b(c(u)+" ",1),e("button",{type:"button",class:"ml-1 hover:text-blue-900",onClick:v=>$(N)},n[25]||(n[25]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,Bt)]))),128))])])):w("",!0),D.value.length>0?(i(),a("div",Ht,[n[28]||(n[28]=e("div",{class:"text-xs font-medium text-gray-600 mb-2"}," 点击选择已有标签: ",-1)),e("div",Gt,[(i(!0),a(T,null,_(D.value,u=>(i(),a("button",{key:"available-"+u,type:"button",class:"inline-flex items-center gap-1 px-3 py-1 bg-gray-100 text-gray-700 text-sm rounded-full hover:bg-blue-100 hover:text-blue-700 transition-colors",onClick:N=>z(u)},[n[27]||(n[27]=e("i",{class:"fas fa-tag text-gray-500 text-xs"},null,-1)),b(" "+c(u),1)],8,Qt))),128))])])):w("",!0),e("div",null,[n[30]||(n[30]=e("div",{class:"text-xs font-medium text-gray-600 mb-2"}," 创建新标签: ",-1)),e("div",Xt,[A(e("input",{"onUpdate:modelValue":n[1]||(n[1]=u=>k.value=u),type:"text",class:"form-input flex-1",placeholder:"输入新标签名称",onKeypress:ae(J(B,["prevent"]),["enter"])},null,40,Jt),[[U,k.value]]),e("button",{type:"button",class:"px-4 py-2 bg-green-500 text-white rounded-lg hover:bg-green-600 transition-colors",onClick:B},n[29]||(n[29]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),n[31]||(n[31]=e("p",{class:"text-xs text-gray-500"}," 用于标记不同团队或用途,方便筛选管理 ",-1))])]),e("div",Zt,[n[40]||(n[40]=e("div",{class:"flex items-center gap-2 mb-2"},[e("div",{class:"w-6 h-6 bg-blue-500 rounded flex items-center justify-center flex-shrink-0"},[e("i",{class:"fas fa-tachometer-alt text-white text-xs"})]),e("h4",{class:"font-semibold text-gray-800 text-sm"}," 速率限制设置 (可选) ")],-1)),e("div",es,[e("div",ts,[e("div",null,[n[33]||(n[33]=e("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"时间窗口 (分钟)",-1)),A(e("input",{"onUpdate:modelValue":n[2]||(n[2]=u=>t.rateLimitWindow=u),type:"number",min:"1",placeholder:"无限制",class:"form-input w-full text-sm"},null,512),[[U,t.rateLimitWindow]]),n[34]||(n[34]=e("p",{class:"text-xs text-gray-500 mt-0.5 ml-2"}," 时间段单位 ",-1))]),e("div",null,[n[35]||(n[35]=e("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"请求次数限制",-1)),A(e("input",{"onUpdate:modelValue":n[3]||(n[3]=u=>t.rateLimitRequests=u),type:"number",min:"1",placeholder:"无限制",class:"form-input w-full text-sm"},null,512),[[U,t.rateLimitRequests]]),n[36]||(n[36]=e("p",{class:"text-xs text-gray-500 mt-0.5 ml-2"}," 窗口内最大请求 ",-1))]),e("div",null,[n[37]||(n[37]=e("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"Token 限制",-1)),A(e("input",{"onUpdate:modelValue":n[4]||(n[4]=u=>t.tokenLimit=u),type:"number",placeholder:"无限制",class:"form-input w-full text-sm"},null,512),[[U,t.tokenLimit]]),n[38]||(n[38]=e("p",{class:"text-xs text-gray-500 mt-0.5 ml-2"}," 窗口内最大Token ",-1))])]),n[39]||(n[39]=e("div",{class:"bg-blue-100 rounded-lg p-2"},[e("h5",{class:"text-xs font-semibold text-blue-800 mb-1"}," 💡 使用示例 "),e("div",{class:"text-xs text-blue-700 space-y-0.5"},[e("div",null,[e("strong",null,"示例1:"),b(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求")]),e("div",null,[e("strong",null,"示例2:"),b(" 时间窗口=1,Token=10000 → 每分钟最多10,000个Token")]),e("div",null,[e("strong",null,"示例3:"),b(" 窗口=30,请求=50,Token=100000 → 每30分钟50次请求且不超10万Token")])])],-1))])]),e("div",null,[n[42]||(n[42]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"每日费用限制 (美元)",-1)),e("div",ss,[e("div",ls,[e("button",{type:"button",class:"px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium",onClick:n[5]||(n[5]=u=>t.dailyCostLimit="50")}," $50 "),e("button",{type:"button",class:"px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium",onClick:n[6]||(n[6]=u=>t.dailyCostLimit="100")}," $100 "),e("button",{type:"button",class:"px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium",onClick:n[7]||(n[7]=u=>t.dailyCostLimit="200")}," $200 "),e("button",{type:"button",class:"px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium",onClick:n[8]||(n[8]=u=>t.dailyCostLimit="")}," 自定义 ")]),A(e("input",{"onUpdate:modelValue":n[9]||(n[9]=u=>t.dailyCostLimit=u),type:"number",min:"0",step:"0.01",placeholder:"0 表示无限制",class:"form-input w-full"},null,512),[[U,t.dailyCostLimit]]),n[41]||(n[41]=e("p",{class:"text-xs text-gray-500"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[n[43]||(n[43]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"并发限制",-1)),A(e("input",{"onUpdate:modelValue":n[10]||(n[10]=u=>t.concurrencyLimit=u),type:"number",min:"0",placeholder:"0 表示无限制",class:"form-input w-full"},null,512),[[U,t.concurrencyLimit]]),n[44]||(n[44]=e("p",{class:"text-xs text-gray-500 mt-2"}," 设置此 API Key 可同时处理的最大请求数 ",-1))]),e("div",null,[n[48]||(n[48]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"服务权限",-1)),e("div",os,[e("label",ns,[A(e("input",{"onUpdate:modelValue":n[11]||(n[11]=u=>t.permissions=u),type:"radio",value:"all",class:"mr-2"},null,512),[[te,t.permissions]]),n[45]||(n[45]=e("span",{class:"text-sm text-gray-700"},"全部服务",-1))]),e("label",is,[A(e("input",{"onUpdate:modelValue":n[12]||(n[12]=u=>t.permissions=u),type:"radio",value:"claude",class:"mr-2"},null,512),[[te,t.permissions]]),n[46]||(n[46]=e("span",{class:"text-sm text-gray-700"},"仅 Claude",-1))]),e("label",as,[A(e("input",{"onUpdate:modelValue":n[13]||(n[13]=u=>t.permissions=u),type:"radio",value:"gemini",class:"mr-2"},null,512),[[te,t.permissions]]),n[47]||(n[47]=e("span",{class:"text-sm text-gray-700"},"仅 Gemini",-1))])]),n[49]||(n[49]=e("p",{class:"text-xs text-gray-500 mt-2"}," 控制此 API Key 可以访问哪些服务 ",-1))]),e("div",null,[n[54]||(n[54]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"专属账号绑定",-1)),e("div",rs,[e("div",null,[n[51]||(n[51]=e("label",{class:"block text-sm font-medium text-gray-600 mb-1"},"Claude 专属账号",-1)),A(e("select",{"onUpdate:modelValue":n[14]||(n[14]=u=>t.claudeAccountId=u),class:"form-input w-full",disabled:t.permissions==="gemini"},[n[50]||(n[50]=e("option",{value:""}," 使用共享账号池 ",-1)),h.accounts.claude.filter(u=>u.isDedicated&&u.platform==="claude-oauth").length>0?(i(),a("optgroup",us,[(i(!0),a(T,null,_(h.accounts.claude.filter(u=>u.isDedicated&&u.platform==="claude-oauth"),u=>(i(),a("option",{key:u.id,value:u.id},c(u.name)+" ("+c(u.status==="active"?"正常":"异常")+") ",9,cs))),128))])):w("",!0),h.accounts.claude.filter(u=>u.isDedicated&&u.platform==="claude-console").length>0?(i(),a("optgroup",ms,[(i(!0),a(T,null,_(h.accounts.claude.filter(u=>u.isDedicated&&u.platform==="claude-console"),u=>(i(),a("option",{key:u.id,value:`console:${u.id}`},c(u.name)+" ("+c(u.status==="active"?"正常":"异常")+") ",9,ps))),128))])):w("",!0)],8,ds),[[H,t.claudeAccountId]])]),e("div",null,[n[53]||(n[53]=e("label",{class:"block text-sm font-medium text-gray-600 mb-1"},"Gemini 专属账号",-1)),A(e("select",{"onUpdate:modelValue":n[15]||(n[15]=u=>t.geminiAccountId=u),class:"form-input w-full",disabled:t.permissions==="claude"},[n[52]||(n[52]=e("option",{value:""}," 使用共享账号池 ",-1)),(i(!0),a(T,null,_(h.accounts.gemini,u=>(i(),a("option",{key:u.id,value:u.id},c(u.name)+" ("+c(u.status==="active"?"正常":"异常")+") ",9,gs))),128))],8,xs),[[H,t.geminiAccountId]])])]),n[55]||(n[55]=e("p",{class:"text-xs text-gray-500 mt-2"}," 修改绑定账号将影响此API Key的请求路由 ",-1))]),e("div",null,[e("div",ys,[A(e("input",{id:"editEnableModelRestriction","onUpdate:modelValue":n[16]||(n[16]=u=>t.enableModelRestriction=u),type:"checkbox",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[se,t.enableModelRestriction]]),n[56]||(n[56]=e("label",{for:"editEnableModelRestriction",class:"ml-2 text-sm font-semibold text-gray-700 cursor-pointer"}," 启用模型限制 ",-1))]),t.enableModelRestriction?(i(),a("div",fs,[e("div",null,[n[59]||(n[59]=e("label",{class:"block text-sm font-medium text-gray-600 mb-2"},"限制的模型列表",-1)),e("div",bs,[(i(!0),a(T,null,_(t.restrictedModels,(u,N)=>(i(),a("span",{key:N,class:"inline-flex items-center px-3 py-1 rounded-full text-sm bg-red-100 text-red-800"},[b(c(u)+" ",1),e("button",{type:"button",class:"ml-2 text-red-600 hover:text-red-800",onClick:v=>E(N)},n[57]||(n[57]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,vs)]))),128)),t.restrictedModels.length===0?(i(),a("span",ws," 暂无限制的模型 ")):w("",!0)]),e("div",$s,[A(e("input",{"onUpdate:modelValue":n[17]||(n[17]=u=>t.modelInput=u),type:"text",placeholder:"输入模型名称,按回车添加",class:"form-input flex-1",onKeydown:ae(J(y,["prevent"]),["enter"])},null,40,As),[[U,t.modelInput]]),e("button",{type:"button",class:"px-4 py-2 bg-red-500 text-white rounded-lg hover:bg-red-600 transition-colors",onClick:y},n[58]||(n[58]=[e("i",{class:"fas fa-plus"},null,-1)]))]),n[60]||(n[60]=e("p",{class:"text-xs text-gray-500 mt-2"}," 设置此API Key无法访问的模型,例如:claude-opus-4-20250514 ",-1))])])):w("",!0)]),e("div",null,[e("div",Cs,[A(e("input",{id:"editEnableClientRestriction","onUpdate:modelValue":n[18]||(n[18]=u=>t.enableClientRestriction=u),type:"checkbox",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[se,t.enableClientRestriction]]),n[61]||(n[61]=e("label",{for:"editEnableClientRestriction",class:"ml-2 text-sm font-semibold text-gray-700 cursor-pointer"}," 启用客户端限制 ",-1))]),t.enableClientRestriction?(i(),a("div",ks,[e("div",null,[n[62]||(n[62]=e("label",{class:"block text-sm font-medium text-gray-600 mb-2"},"允许的客户端",-1)),n[63]||(n[63]=e("p",{class:"text-xs text-gray-500 mb-3"}," 勾选允许使用此API Key的客户端 ",-1)),e("div",Ks,[(i(!0),a(T,null,_(P.value,u=>(i(),a("div",{key:u.id,class:"flex items-start"},[A(e("input",{id:`edit_client_${u.id}`,"onUpdate:modelValue":n[19]||(n[19]=N=>t.allowedClients=N),type:"checkbox",value:u.id,class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 mt-0.5"},null,8,hs),[[se,t.allowedClients]]),e("label",{for:`edit_client_${u.id}`,class:"ml-2 flex-1 cursor-pointer"},[e("span",Ds,c(u.name),1),e("span",Ls,c(u.description),1)],8,Is)]))),128))])])])):w("",!0)]),e("div",Ms,[e("button",{type:"button",class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors",onClick:n[20]||(n[20]=u=>x.$emit("close"))}," 取消 "),e("button",{type:"submit",disabled:I.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[I.value?(i(),a("div",Rs)):(i(),a("i",Ts)),b(" "+c(I.value?"保存中...":"保存修改"),1)],8,Ss)])],32)])])]))}},_s=ne(Ps,[["__scopeId","data-v-dd9249b5"]]),Es={class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},Vs={class:"modal-content w-full max-w-md p-8 mx-auto max-h-[90vh] flex flex-col"},js={class:"flex items-center justify-between mb-6"},Us={class:"space-y-6 modal-scroll-content custom-scrollbar flex-1"},qs={class:"bg-blue-50 border border-blue-200 rounded-lg p-4"},Os={class:"flex items-start gap-3"},Fs={class:"text-sm text-gray-700"},Ws={class:"text-xs text-gray-600 mt-1"},Ns={key:0,class:"mt-3"},Ys=["min"],zs={key:1,class:"text-xs text-gray-500 mt-2"},Bs={class:"flex gap-3 pt-4"},Hs=["disabled"],Gs={key:0,class:"loading-spinner mr-2"},Qs={key:1,class:"fas fa-clock mr-2"},Xs={__name:"RenewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close","success"],setup(h,{emit:L}){const g=h,V=L;$e();const M=C(!1),f=me({renewDuration:"30d",customExpireDate:"",newExpiresAt:null}),I=Q(()=>{const t=new Date;return g.apiKey.expiresAt&&new Date(g.apiKey.expiresAt)>t?new Date(g.apiKey.expiresAt).toISOString().slice(0,16):(t.setMinutes(t.getMinutes()+1),t.toISOString().slice(0,16))}),P=t=>new Date(t).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),k=()=>{if(!f.renewDuration){f.newExpiresAt=null;return}if(f.renewDuration==="permanent"){f.newExpiresAt=null;return}if(f.renewDuration==="custom")return;const t=g.apiKey.expiresAt&&new Date(g.apiKey.expiresAt)>new Date?new Date(g.apiKey.expiresAt):new Date,E=f.renewDuration.match(/(\d+)([dhmy])/);if(E){const[,B,z]=E,$=parseInt(B);switch(z){case"d":t.setDate(t.getDate()+$);break;case"h":t.setHours(t.getHours()+$);break;case"m":t.setMonth(t.getMonth()+$);break;case"y":t.setFullYear(t.getFullYear()+$);break}f.newExpiresAt=t.toISOString()}},O=()=>{f.customExpireDate&&(f.newExpiresAt=new Date(f.customExpireDate).toISOString())},D=async()=>{M.value=!0;try{const t={expiresAt:f.renewDuration==="permanent"?null:f.newExpiresAt},y=await q.put(`/admin/api-keys/${g.apiKey.id}/renew`,t);y.success?(R("API Key 续期成功","success"),V("success"),V("close")):R(y.message||"续期失败","error")}catch{R("续期失败","error")}finally{M.value=!1}};return k(),(t,y)=>(i(),X(re,{to:"body"},[e("div",Es,[e("div",Vs,[e("div",js,[y[5]||(y[5]=e("div",{class:"flex items-center gap-3"},[e("div",{class:"w-10 h-10 bg-gradient-to-br from-green-500 to-green-600 rounded-xl flex items-center justify-center"},[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 hover:text-gray-600 transition-colors",onClick:y[0]||(y[0]=E=>t.$emit("close"))},y[4]||(y[4]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",Us,[e("div",qs,[e("div",Os,[y[7]||(y[7]=e("div",{class:"w-8 h-8 bg-blue-500 rounded-lg flex items-center justify-center flex-shrink-0"},[e("i",{class:"fas fa-info text-white text-sm"})],-1)),e("div",null,[y[6]||(y[6]=e("h4",{class:"font-semibold text-gray-800 mb-1"}," API Key 信息 ",-1)),e("p",Fs,c(h.apiKey.name),1),e("p",Ws," 当前过期时间:"+c(h.apiKey.expiresAt?P(h.apiKey.expiresAt):"永不过期"),1)])])]),e("div",null,[y[9]||(y[9]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"续期时长",-1)),A(e("select",{"onUpdate:modelValue":y[1]||(y[1]=E=>f.renewDuration=E),class:"form-input w-full",onChange:k},y[8]||(y[8]=[e("option",{value:"7d"}," 延长 7 天 ",-1),e("option",{value:"30d"}," 延长 30 天 ",-1),e("option",{value:"90d"}," 延长 90 天 ",-1),e("option",{value:"180d"}," 延长 180 天 ",-1),e("option",{value:"365d"}," 延长 365 天 ",-1),e("option",{value:"custom"}," 自定义日期 ",-1),e("option",{value:"permanent"}," 设为永不过期 ",-1)]),544),[[H,f.renewDuration]]),f.renewDuration==="custom"?(i(),a("div",Ns,[A(e("input",{"onUpdate:modelValue":y[2]||(y[2]=E=>f.customExpireDate=E),type:"datetime-local",class:"form-input w-full",min:I.value,onChange:O},null,40,Ys),[[U,f.customExpireDate]])])):w("",!0),f.newExpiresAt?(i(),a("p",zs," 新的过期时间:"+c(P(f.newExpiresAt)),1)):w("",!0)])]),e("div",Bs,[e("button",{type:"button",class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors",onClick:y[3]||(y[3]=E=>t.$emit("close"))}," 取消 "),e("button",{type:"button",disabled:M.value||!f.renewDuration,class:"btn btn-primary flex-1 py-3 px-6 font-semibold",onClick:D},[M.value?(i(),a("div",Gs)):(i(),a("i",Qs)),b(" "+c(M.value?"续期中...":"确认续期"),1)],8,Hs)])])])]))}},Js=ne(Xs,[["__scopeId","data-v-0c3b1b3f"]]),Zs={class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},el={class:"modal-content w-full max-w-lg p-8 mx-auto max-h-[90vh] overflow-y-auto custom-scrollbar"},tl={class:"space-y-4 mb-6"},sl={class:"p-3 bg-gray-50 rounded-lg border"},ll={class:"text-gray-900 font-medium"},ol={key:0},nl={class:"p-3 bg-gray-50 rounded-lg border"},il={class:"text-gray-700"},al={class:"relative"},rl={class:"p-4 pr-14 bg-gray-900 rounded-lg border font-mono text-sm text-white break-all min-h-[60px] flex items-center"},dl={class:"absolute top-3 right-3"},ul=["title"],cl={__name:"NewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close"],setup(h,{emit:L}){const g=h,V=L,M=C(!1),f=()=>{M.value=!M.value},I=()=>{const D=g.apiKey.apiKey||g.apiKey.key||"";return D?M.value||D.length<=12?D:D.substring(0,8)+"●".repeat(Math.max(0,D.length-12))+D.substring(D.length-4):""},P=async()=>{const D=g.apiKey.apiKey||g.apiKey.key||"";if(!D){R("API Key 不存在","error");return}try{await navigator.clipboard.writeText(D),R("API Key 已复制到剪贴板","success")}catch(t){console.error("Failed to copy:",t);const y=document.createElement("textarea");y.value=D,document.body.appendChild(y),y.select();try{document.execCommand("copy"),R("API Key 已复制到剪贴板","success")}catch{R("复制失败,请手动复制","error")}finally{document.body.removeChild(y)}}},k=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","取消")&&V("close"):confirm(`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`)&&V("close")},O=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
建议您先复制API Key再关闭。`,"仍然关闭","返回复制")&&V("close"):confirm(`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&V("close")};return(D,t)=>(i(),X(re,{to:"body"},[e("div",Zs,[e("div",el,[e("div",{class:"flex items-center justify-between mb-6"},[t[1]||(t[1]=e("div",{class:"flex items-center gap-3"},[e("div",{class:"w-12 h-12 bg-gradient-to-br from-green-500 to-green-600 rounded-xl flex items-center justify-center"},[e("i",{class:"fas fa-check text-white text-lg"})]),e("div",null,[e("h3",{class:"text-xl font-bold text-gray-900"}," API Key 创建成功 "),e("p",{class:"text-sm text-gray-600"}," 请妥善保存您的 API Key ")])],-1)),e("button",{class:"text-gray-400 hover:text-gray-600 transition-colors",title:"直接关闭(不推荐)",onClick:O},t[0]||(t[0]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),t[7]||(t[7]=e("div",{class:"bg-amber-50 border-l-4 border-amber-400 p-4 mb-6"},[e("div",{class:"flex items-start"},[e("div",{class:"w-6 h-6 bg-amber-400 rounded-lg flex items-center justify-center flex-shrink-0 mt-0.5"},[e("i",{class:"fas fa-exclamation-triangle text-white text-sm"})]),e("div",{class:"ml-3"},[e("h5",{class:"font-semibold text-amber-900 mb-1"}," 重要提醒 "),e("p",{class:"text-sm text-amber-800"}," 这是您唯一能看到完整 API Key 的机会。关闭此窗口后,系统将不再显示完整的 API Key。请立即复制并妥善保存。 ")])])],-1)),e("div",tl,[e("div",null,[t[2]||(t[2]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"API Key 名称",-1)),e("div",sl,[e("span",ll,c(h.apiKey.name),1)])]),h.apiKey.description?(i(),a("div",ol,[t[3]||(t[3]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"备注",-1)),e("div",nl,[e("span",il,c(h.apiKey.description||"无描述"),1)])])):w("",!0),e("div",null,[t[4]||(t[4]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"API Key",-1)),e("div",al,[e("div",rl,c(I()),1),e("div",dl,[e("button",{type:"button",class:"btn-icon-sm hover:bg-gray-800 bg-gray-700",title:M.value?"隐藏API Key":"显示完整API Key",onClick:f},[e("i",{class:W(["fas",M.value?"fa-eye-slash":"fa-eye","text-gray-300"])},null,2)],8,ul)])]),t[5]||(t[5]=e("p",{class:"text-xs text-gray-500 mt-2"}," 点击眼睛图标切换显示模式,使用下方按钮复制完整 API Key ",-1))])]),e("div",{class:"flex gap-3"},[e("button",{class:"flex-1 btn btn-primary py-3 px-6 font-semibold flex items-center justify-center gap-2",onClick:P},t[6]||(t[6]=[e("i",{class:"fas fa-copy"},null,-1),b(" 复制 API Key ",-1)])),e("button",{class:"px-6 py-3 bg-gray-200 text-gray-800 rounded-xl font-semibold hover:bg-gray-300 transition-colors border border-gray-300",onClick:k}," 我已保存 ")])])])]))}},ml=ne(cl,[["__scopeId","data-v-2c02f1f7"]]),pl={class:"tab-content"},xl={class:"card p-6"},gl={class:"flex flex-col md:flex-row justify-between items-center gap-4 mb-6"},yl={class:"flex items-center gap-3"},fl=["value"],bl={key:0,class:"text-center py-12"},vl={key:1,class:"text-center py-12"},wl={key:2,class:"table-container"},$l={class:"min-w-full"},Al={class:"bg-gray-50/80 backdrop-blur-sm"},Cl={key:1,class:"fas fa-sort ml-1 text-gray-400"},kl={key:1,class:"fas fa-sort ml-1 text-gray-400"},Kl={class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},hl={key:1,class:"fas fa-sort ml-1 text-gray-400"},Il={key:1,class:"fas fa-sort ml-1 text-gray-400"},Dl={key:1,class:"fas fa-sort ml-1 text-gray-400"},Ll={class:"divide-y divide-gray-200/50"},Ml={class:"table-row"},Sl={class:"px-6 py-4 whitespace-nowrap"},Rl={class:"flex items-center"},Tl={class:"text-sm font-semibold text-gray-900"},Pl={class:"text-xs text-gray-500"},_l={class:"text-xs text-gray-500 mt-1"},El={key:0},Vl={key:1},jl={class:"px-6 py-4"},Ul={class:"flex flex-wrap gap-1"},ql={key:0,class:"text-xs text-gray-400"},Ol={class:"px-6 py-4 whitespace-nowrap"},Fl={class:"text-sm font-mono text-gray-600 bg-gray-50 px-3 py-1 rounded-lg"},Wl={class:"px-6 py-4 whitespace-nowrap"},Nl={class:"px-6 py-4"},Yl={class:"space-y-1"},zl={class:"flex justify-between text-sm"},Bl={class:"font-medium text-gray-900"},Hl={class:"flex justify-between text-sm"},Gl={class:"font-medium text-gray-900"},Ql={class:"flex justify-between text-sm"},Xl={class:"font-medium text-green-600"},Jl={key:0,class:"flex justify-between text-sm"},Zl={class:"flex justify-between text-sm"},eo={class:"font-medium text-purple-600"},to={class:"flex justify-between text-sm"},so={key:0,class:"text-xs text-gray-500"},lo={key:1,class:"flex justify-between text-sm"},oo={class:"font-medium text-indigo-600"},no={key:2,class:"flex justify-between text-sm"},io={class:"font-medium text-indigo-600"},ao={class:"flex justify-between text-xs text-gray-500"},ro={key:3,class:"flex justify-between text-xs text-orange-500"},uo={class:"flex justify-between text-xs text-blue-600"},co={class:"pt-1 border-t border-gray-100"},mo={class:"flex justify-between text-xs text-green-600"},po={class:"pt-2"},xo=["onClick"],go={class:"px-6 py-4 whitespace-nowrap text-sm text-gray-500"},yo={class:"px-6 py-4 whitespace-nowrap text-sm"},fo={key:0},bo={key:0,class:"text-red-600"},vo={key:1,class:"text-orange-600"},wo={key:2,class:"text-gray-600"},$o={key:1,class:"text-gray-400"},Ao={class:"px-6 py-4 whitespace-nowrap text-sm"},Co={class:"flex gap-2"},ko=["onClick"],Ko=["onClick"],ho=["onClick"],Io=["onClick"],Do={key:0},Lo={colspan:"7",class:"px-6 py-4 bg-gray-50"},Mo={key:0,class:"text-center py-4"},So={class:"space-y-4"},Ro={class:"flex items-center justify-between mb-4"},To={class:"flex items-center gap-2"},Po={key:0,class:"text-xs text-gray-500 bg-gray-100 px-2 py-1 rounded-full"},_o={class:"flex gap-1 items-center"},Eo={class:"flex gap-1 bg-gray-100 rounded p-1"},Vo=["onClick"],jo={key:0,class:"text-center py-8"},Uo={class:"flex items-center justify-center gap-2 mb-3"},qo=["onClick"],Oo={key:1,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},Fo={class:"flex justify-between items-start mb-3"},Wo={class:"flex-1"},No={class:"text-sm font-semibold text-gray-800 block mb-1"},Yo={class:"text-xs text-gray-500 bg-blue-50 px-2 py-1 rounded-full"},zo={class:"space-y-2 mb-3"},Bo={class:"flex justify-between items-center text-sm"},Ho={class:"font-semibold text-gray-900"},Go={class:"flex justify-between items-center text-sm"},Qo={class:"font-semibold text-green-600"},Xo={class:"pt-2 mt-2 border-t border-gray-100"},Jo={class:"flex justify-between items-center text-xs text-gray-500"},Zo={class:"font-medium"},en={class:"flex justify-between items-center text-xs text-gray-500"},tn={class:"font-medium"},sn={key:0,class:"flex justify-between items-center text-xs text-purple-600"},ln={class:"font-medium"},on={key:1,class:"flex justify-between items-center text-xs text-purple-600"},nn={class:"font-medium"},an={class:"w-full bg-gray-200 rounded-full h-2 mt-3"},rn={class:"text-right mt-1"},dn={class:"text-xs font-medium text-indigo-600"},un={key:2,class:"mt-4 p-3 bg-gradient-to-r from-indigo-50 to-purple-50 rounded-lg border border-indigo-100"},cn={class:"flex items-center justify-between text-sm"},mn={class:"flex gap-4 text-xs"},pn={class:"text-gray-600"},xn={class:"font-semibold text-gray-800"},gn={class:"text-gray-600"},yn={class:"font-semibold text-gray-800"},fn={key:3,class:"mt-6 flex flex-col sm:flex-row justify-between items-center gap-4"},bn={class:"flex items-center gap-3"},vn={class:"text-sm text-gray-600"},wn={class:"flex items-center gap-2"},$n=["value"],An={class:"flex items-center gap-2"},Cn=["disabled"],kn={class:"flex items-center gap-1"},Kn={key:1,class:"px-2 text-gray-500"},hn=["onClick"],In={key:2,class:"px-2 text-gray-500"},Dn=["disabled"],Ln={__name:"ApiKeysView",setup(h){const L=xe(),g=C([]),V=C(!1),M=C("today"),f=C(""),I=C("asc"),P=C({}),k=C({}),O=C({}),D=C([new Date(2e3,1,1,0,0,0),new Date(2e3,2,1,23,59,59)]),t=C({claude:[],gemini:[]}),y=C(1),E=C(10),B=[5,10,20,50,100],z=C(""),$=C([]),K=C(!1),x=C(!1),n=C(!1),u=C(!1),N=C(null),v=C(null),o=C(null),r=Q(()=>{let d=g.value;return z.value&&(d=g.value.filter(p=>p.tags&&p.tags.includes(z.value))),f.value?[...d].sort((p,l)=>{let m=p[f.value],S=l[f.value];return f.value==="status"?(m=p.isActive?1:0,S=l.isActive?1:0):f.value==="cost"?(m=parseFloat(de(p.usage).replace("$","")),S=parseFloat(de(l.usage).replace("$",""))):(f.value==="createdAt"||f.value==="expiresAt")&&(m=m?new Date(m).getTime():0,S=S?new Date(S).getTime():0),m<S?I.value==="asc"?-1:1:m>S?I.value==="asc"?1:-1:0}):d}),j=Q(()=>Math.ceil(r.value.length/E.value)),le=Q(()=>{const d=(y.value-1)*E.value,s=d+E.value;return r.value.slice(d,s)}),Z=Q(()=>{const d=[];let p=Math.max(1,y.value-Math.floor(2.5)),l=Math.min(j.value,p+5-1);l-p<4&&(p=Math.max(1,l-5+1));for(let m=p;m<=l;m++)d.push(m);return d}),Ce=async()=>{var d,s;try{const[p,l,m]=await Promise.all([q.get("/admin/claude-accounts"),q.get("/admin/claude-console-accounts"),q.get("/admin/gemini-accounts")]),S=[];p.success&&((d=p.data)==null||d.forEach(Y=>{S.push({...Y,platform:"claude-oauth",isDedicated:Y.accountType==="dedicated"})})),l.success&&((s=l.data)==null||s.forEach(Y=>{S.push({...Y,platform:"claude-console",isDedicated:Y.accountType==="dedicated"})})),t.value.claude=S,m.success&&(t.value.gemini=(m.data||[]).map(Y=>({...Y,isDedicated:Y.accountType==="dedicated"})))}catch(p){console.error("加载账户列表失败:",p)}},ee=async()=>{V.value=!0;try{const d=await q.get(`/admin/api-keys?timeRange=${M.value}`);if(d.success){g.value=d.data||[];const s=new Set;g.value.forEach(p=>{p.tags&&Array.isArray(p.tags)&&p.tags.forEach(l=>s.add(l))}),$.value=Array.from(s).sort(),y.value=1}}catch{R("加载 API Keys 失败","error")}finally{V.value=!1}},oe=d=>{f.value===d?I.value=I.value==="asc"?"desc":"asc":(f.value=d,I.value="asc"),y.value=1},F=d=>!d&&d!==0?"0":d.toLocaleString("zh-CN"),de=d=>!d||!d.total?"$0.0000":`$${(d.total.cost||0).toFixed(4)}`,ke=(d,s)=>{if(d){const p=t.value.claude.find(l=>l.id===d);return p?p.name:`账户-${d.substring(0,8)}`}if(s){const p=t.value.claude.find(l=>l.id===s);return p?`${p.name} (Console)`:`Console-${s.substring(0,8)}`}return"未知账户"},ue=d=>d?new Date(d)<new Date:!1,ge=d=>!d||ue(d)?!1:(new Date(d)-new Date)/(1e3*60*60*24)<=7,ye=d=>d?new Date(d).toLocaleDateString("zh-CN"):"",Ke=async d=>{P.value[d]?P.value[d]=!1:(P.value[d]=!0,O.value[d]||be(d),await ie(d,!0))},ie=async(d,s=!1)=>{if(!s&&k.value[d]&&k.value[d].length>0)return;const p=G(d);try{let l=`/admin/api-keys/${d}/model-stats`;const m=new URLSearchParams;if(p.customStart&&p.customEnd)m.append("startDate",p.customStart),m.append("endDate",p.customEnd),m.append("period","custom");else{const Y=p.preset==="today"?"daily":"monthly";m.append("period",Y)}l+="?"+m.toString();const S=await q.get(l);S.success&&(k.value[d]=S.data||[])}catch{R("加载模型统计失败","error"),k.value[d]=[]}},fe=(d,s)=>{const p=s.reduce((l,m)=>l+(m.allTokens||0),0);return p===0?0:Math.round(d/p*100)},he=d=>d.formatted&&d.formatted.total?d.formatted.total:d.cost!==void 0?`$${d.cost.toFixed(6)}`:"$0.000000",be=d=>{const s=new Date,p=new Date(s);p.setDate(s.getDate()-6),O.value[d]={type:"preset",preset:"7days",customStart:p.toISOString().split("T")[0],customEnd:s.toISOString().split("T")[0],customRange:null,presetOptions:[{value:"today",label:"今日",days:1},{value:"7days",label:"7天",days:7},{value:"30days",label:"30天",days:30}]}},G=d=>(O.value[d]||be(d),O.value[d]),ve=(d,s)=>{const p=G(s);p.type="preset",p.preset=d;const l=p.presetOptions.find(m=>m.value===d);if(l){const m=new Date,S=new Date(m);S.setDate(m.getDate()-(l.days-1)),p.customStart=S.toISOString().split("T")[0],p.customEnd=m.toISOString().split("T")[0];const Y=ce=>ce.getFullYear()+"-"+String(ce.getMonth()+1).padStart(2,"0")+"-"+String(ce.getDate()).padStart(2,"0")+" 00:00:00";p.customRange=[Y(S),Y(m)]}ie(s,!0)},Ie=(d,s)=>{const p=G(d);s&&s.length===2?(p.type="custom",p.preset="",p.customRange=s,p.customStart=s[0].split(" ")[0],p.customEnd=s[1].split(" ")[0],ie(d,!0)):s===null&&ve("7days",d)},De=d=>d>new Date,Le=d=>{const s=G(d);s.type="preset",s.preset="7days";const p=new Date,l=new Date(p);l.setDate(p.getDate()-6),s.customStart=l.toISOString().split("T")[0],s.customEnd=p.toISOString().split("T")[0],s.customRange=null,ie(d,!0),R("已重置筛选条件并刷新数据","info")},Me=()=>{K.value=!0},Se=d=>{N.value=d,x.value=!0},Re=d=>{v.value=d,n.value=!0},Te=d=>{K.value=!1,o.value=d,u.value=!0,ee()},Pe=()=>{x.value=!1,R("API Key 更新成功","success"),ee()},_e=()=>{n.value=!1,R("API Key 续期成功","success"),ee()},Ee=async d=>{let s=!1;if(window.showConfirm?s=await window.showConfirm("删除 API Key","确定要删除这个 API Key 吗?此操作不可恢复。","确定删除","取消"):s=confirm("确定要删除这个 API Key 吗?此操作不可恢复。"),!!s)try{const p=await q.delete(`/admin/api-keys/${d}`);p.success?(R("API Key 已删除","success"),ee()):R(p.message||"删除失败","error")}catch{R("删除失败","error")}},Ve=d=>{const p=`${window.location.origin}/admin/api-stats?apiId=${d.id}`,l=document.createElement("textarea");l.value=p,l.style.position="fixed",l.style.opacity="0",l.style.left="-9999px",document.body.appendChild(l),l.select(),l.setSelectionRange(0,99999);try{document.execCommand("copy")?R("已复制统计页面链接","success"):(R("复制失败,请手动复制","error"),console.log("统计页面链接:",p))}catch(m){R("复制失败,请手动复制","error"),console.error("复制错误:",m),console.log("统计页面链接:",p)}finally{document.body.removeChild(l)}};return pe(async()=>{await Promise.all([L.loadSupportedClients(),Ce(),ee()])}),(d,s)=>{const p=je;return i(),a("div",pl,[e("div",xl,[e("div",gl,[s[22]||(s[22]=e("div",null,[e("h3",{class:"text-xl font-bold text-gray-900 mb-2"}," API Keys 管理 "),e("p",{class:"text-gray-600"}," 管理和监控您的 API 密钥 ")],-1)),e("div",yl,[A(e("select",{"onUpdate:modelValue":s[0]||(s[0]=l=>M.value=l),class:"px-2 py-1 text-sm text-gray-700 bg-white border border-gray-200 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent hover:border-gray-300 transition-colors",onChange:s[1]||(s[1]=l=>ee())},s[19]||(s[19]=[e("option",{value:"today"}," 今日 ",-1),e("option",{value:"7days"}," 最近7天 ",-1),e("option",{value:"monthly"}," 本月 ",-1),e("option",{value:"all"}," 全部时间 ",-1)]),544),[[H,M.value]]),A(e("select",{"onUpdate:modelValue":s[2]||(s[2]=l=>z.value=l),class:"px-2 py-1 text-sm text-gray-700 bg-white border border-gray-200 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent hover:border-gray-300 transition-colors",onChange:s[3]||(s[3]=l=>y.value=1)},[s[20]||(s[20]=e("option",{value:""}," 所有标签 ",-1)),(i(!0),a(T,null,_($.value,l=>(i(),a("option",{key:l,value:l},c(l),9,fl))),128))],544),[[H,z.value]]),e("button",{class:"btn btn-primary px-4 py-1.5 text-sm flex items-center gap-2",onClick:J(Me,["stop"])},s[21]||(s[21]=[e("i",{class:"fas fa-plus"},null,-1),b("创建新 Key ",-1)]))])]),V.value?(i(),a("div",bl,s[23]||(s[23]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500"}," 正在加载 API Keys... ",-1)]))):g.value.length===0?(i(),a("div",vl,s[24]||(s[24]=[e("div",{class:"w-16 h-16 mx-auto mb-4 bg-gray-100 rounded-full flex items-center justify-center"},[e("i",{class:"fas fa-key text-gray-400 text-xl"})],-1),e("p",{class:"text-gray-500 text-lg"}," 暂无 API Keys ",-1),e("p",{class:"text-gray-400 text-sm mt-2"}," 点击上方按钮创建您的第一个 API Key ",-1)]))):(i(),a("div",wl,[e("table",$l,[e("thead",Al,[e("tr",null,[e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:s[4]||(s[4]=l=>oe("name"))},[s[25]||(s[25]=b(" 名称 ",-1)),f.value==="name"?(i(),a("i",{key:0,class:W(["fas",I.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),a("i",Cl))]),s[32]||(s[32]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"}," 标签 ",-1)),s[33]||(s[33]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"}," API Key ",-1)),e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:s[5]||(s[5]=l=>oe("status"))},[s[26]||(s[26]=b(" 状态 ",-1)),f.value==="status"?(i(),a("i",{key:0,class:W(["fas",I.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),a("i",kl))]),e("th",Kl,[s[29]||(s[29]=b(" 使用统计 ",-1)),e("span",{class:"cursor-pointer hover:bg-gray-100 px-2 py-1 rounded",onClick:s[6]||(s[6]=l=>oe("cost"))},[s[27]||(s[27]=b(" (费用 ",-1)),f.value==="cost"?(i(),a("i",{key:0,class:W(["fas",I.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),a("i",hl)),s[28]||(s[28]=b(") ",-1))])]),e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:s[7]||(s[7]=l=>oe("createdAt"))},[s[30]||(s[30]=b(" 创建时间 ",-1)),f.value==="createdAt"?(i(),a("i",{key:0,class:W(["fas",I.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),a("i",Il))]),e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:s[8]||(s[8]=l=>oe("expiresAt"))},[s[31]||(s[31]=b(" 过期时间 ",-1)),f.value==="expiresAt"?(i(),a("i",{key:0,class:W(["fas",I.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),a("i",Dl))]),s[34]||(s[34]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"}," 操作 ",-1))])]),e("tbody",Ll,[(i(!0),a(T,null,_(le.value,l=>(i(),a(T,{key:l.id},[e("tr",Ml,[e("td",Sl,[e("div",Rl,[s[37]||(s[37]=e("div",{class:"w-8 h-8 bg-gradient-to-br from-blue-500 to-blue-600 rounded-lg flex items-center justify-center mr-3"},[e("i",{class:"fas fa-key text-white text-xs"})],-1)),e("div",null,[e("div",Tl,c(l.name),1),e("div",Pl,c(l.id),1),e("div",_l,[l.claudeAccountId||l.claudeConsoleAccountId?(i(),a("span",El,[s[35]||(s[35]=e("i",{class:"fas fa-link mr-1"},null,-1)),b(" 绑定: "+c(ke(l.claudeAccountId,l.claudeConsoleAccountId)),1)])):(i(),a("span",Vl,s[36]||(s[36]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),b(" 使用共享池 ",-1)])))])])])]),e("td",jl,[e("div",Ul,[(i(!0),a(T,null,_(l.tags||[],m=>(i(),a("span",{key:m,class:"inline-flex items-center px-2 py-0.5 bg-blue-100 text-blue-800 text-xs rounded-full"},c(m),1))),128)),!l.tags||l.tags.length===0?(i(),a("span",ql,"无标签")):w("",!0)])]),e("td",Ol,[e("div",Fl,c((l.apiKey||"").substring(0,20))+"... ",1)]),e("td",Wl,[e("span",{class:W(["inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold",l.isActive?"bg-green-100 text-green-800":"bg-red-100 text-red-800"])},[e("div",{class:W(["w-2 h-2 rounded-full mr-2",l.isActive?"bg-green-500":"bg-red-500"])},null,2),b(" "+c(l.isActive?"活跃":"禁用"),1)],2)]),e("td",Nl,[e("div",Yl,[e("div",zl,[s[38]||(s[38]=e("span",{class:"text-gray-600"},"请求数:",-1)),e("span",Bl,c(F(l.usage&&l.usage.total&&l.usage.total.requests||0)),1)]),e("div",Hl,[s[39]||(s[39]=e("span",{class:"text-gray-600"},"Token:",-1)),e("span",Gl,c(F(l.usage&&l.usage.total&&l.usage.total.tokens||0)),1)]),e("div",Ql,[s[40]||(s[40]=e("span",{class:"text-gray-600"},"费用:",-1)),e("span",Xl,c(de(l.usage)),1)]),l.dailyCostLimit>0?(i(),a("div",Jl,[s[41]||(s[41]=e("span",{class:"text-gray-600"},"今日费用:",-1)),e("span",{class:W(["font-medium",(l.dailyCost||0)>=l.dailyCostLimit?"text-red-600":"text-blue-600"])}," $"+c((l.dailyCost||0).toFixed(2))+" / $"+c(l.dailyCostLimit.toFixed(2)),3)])):w("",!0),e("div",Zl,[s[42]||(s[42]=e("span",{class:"text-gray-600"},"并发限制:",-1)),e("span",eo,c(l.concurrencyLimit>0?l.concurrencyLimit:"无限制"),1)]),e("div",to,[s[43]||(s[43]=e("span",{class:"text-gray-600"},"当前并发:",-1)),e("span",{class:W(["font-medium",l.currentConcurrency>0?"text-orange-600":"text-gray-600"])},[b(c(l.currentConcurrency||0)+" ",1),l.concurrencyLimit>0?(i(),a("span",so,"/ "+c(l.concurrencyLimit),1)):w("",!0)],2)]),l.rateLimitWindow>0?(i(),a("div",lo,[s[44]||(s[44]=e("span",{class:"text-gray-600"},"时间窗口:",-1)),e("span",oo,c(l.rateLimitWindow)+" 分钟",1)])):w("",!0),l.rateLimitRequests>0?(i(),a("div",no,[s[45]||(s[45]=e("span",{class:"text-gray-600"},"请求限制:",-1)),e("span",io,c(l.rateLimitRequests)+" 次/窗口",1)])):w("",!0),e("div",ao,[e("span",null,"输入: "+c(F(l.usage&&l.usage.total&&l.usage.total.inputTokens||0)),1),e("span",null,"输出: "+c(F(l.usage&&l.usage.total&&l.usage.total.outputTokens||0)),1)]),(l.usage&&l.usage.total&&l.usage.total.cacheCreateTokens||0)>0||(l.usage&&l.usage.total&&l.usage.total.cacheReadTokens||0)>0?(i(),a("div",ro,[e("span",null,"缓存创建: "+c(F(l.usage&&l.usage.total&&l.usage.total.cacheCreateTokens||0)),1),e("span",null,"缓存读取: "+c(F(l.usage&&l.usage.total&&l.usage.total.cacheReadTokens||0)),1)])):w("",!0),e("div",uo,[e("span",null,"RPM: "+c(l.usage&&l.usage.averages&&l.usage.averages.rpm||0),1),e("span",null,"TPM: "+c(l.usage&&l.usage.averages&&l.usage.averages.tpm||0),1)]),e("div",co,[e("div",mo,[e("span",null,"今日: "+c(F(l.usage&&l.usage.daily&&l.usage.daily.requests||0))+"次",1),e("span",null,c(F(l.usage&&l.usage.daily&&l.usage.daily.tokens||0))+"T",1)])]),e("div",po,[l&&l.id?(i(),a("button",{key:0,class:"text-xs text-indigo-600 hover:text-indigo-800 font-medium",onClick:m=>Ke(l.id)},[e("i",{class:W(["fas",P.value[l.id]?"fa-chevron-up":"fa-chevron-down","mr-1"])},null,2),s[46]||(s[46]=b(" 模型使用分布 ",-1))],8,xo)):w("",!0)])])]),e("td",go,c(new Date(l.createdAt).toLocaleDateString()),1),e("td",yo,[l.expiresAt?(i(),a("div",fo,[ue(l.expiresAt)?(i(),a("div",bo,s[47]||(s[47]=[e("i",{class:"fas fa-exclamation-circle mr-1"},null,-1),b(" 已过期 ",-1)]))):ge(l.expiresAt)?(i(),a("div",vo,[s[48]||(s[48]=e("i",{class:"fas fa-clock mr-1"},null,-1)),b(" "+c(ye(l.expiresAt)),1)])):(i(),a("div",wo,c(ye(l.expiresAt)),1))])):(i(),a("div",$o,s[49]||(s[49]=[e("i",{class:"fas fa-infinity mr-1"},null,-1),b(" 永不过期 ",-1)])))]),e("td",Ao,[e("div",Co,[e("button",{class:"text-purple-600 hover:text-purple-900 font-medium hover:bg-purple-50 px-3 py-1 rounded-lg transition-colors",title:"复制统计页面链接",onClick:m=>Ve(l)},s[50]||(s[50]=[e("i",{class:"fas fa-chart-bar mr-1"},null,-1),b("统计 ",-1)]),8,ko),e("button",{class:"text-blue-600 hover:text-blue-900 font-medium hover:bg-blue-50 px-3 py-1 rounded-lg transition-colors",onClick:m=>Se(l)},s[51]||(s[51]=[e("i",{class:"fas fa-edit mr-1"},null,-1),b("编辑 ",-1)]),8,Ko),l.expiresAt&&(ue(l.expiresAt)||ge(l.expiresAt))?(i(),a("button",{key:0,class:"text-green-600 hover:text-green-900 font-medium hover:bg-green-50 px-3 py-1 rounded-lg transition-colors",onClick:m=>Re(l)},s[52]||(s[52]=[e("i",{class:"fas fa-clock mr-1"},null,-1),b("续期 ",-1)]),8,ho)):w("",!0),e("button",{class:"text-red-600 hover:text-red-900 font-medium hover:bg-red-50 px-3 py-1 rounded-lg transition-colors",onClick:m=>Ee(l.id)},s[53]||(s[53]=[e("i",{class:"fas fa-trash mr-1"},null,-1),b("删除 ",-1)]),8,Io)])])]),l&&l.id&&P.value[l.id]?(i(),a("tr",Do,[e("td",Lo,[k.value[l.id]?w("",!0):(i(),a("div",Mo,s[54]||(s[54]=[e("div",{class:"loading-spinner mx-auto"},null,-1),e("p",{class:"text-sm text-gray-500 mt-2"}," 加载模型统计... ",-1)]))),e("div",So,[e("div",Ro,[s[55]||(s[55]=e("h5",{class:"text-sm font-semibold text-gray-700 flex items-center"},[e("i",{class:"fas fa-chart-pie text-indigo-500 mr-2"}),b(" 模型使用分布 ")],-1)),e("div",To,[k.value[l.id]&&k.value[l.id].length>0?(i(),a("span",Po,c(k.value[l.id].length)+" 个模型 ",1)):w("",!0),e("div",_o,[e("div",Eo,[(i(!0),a(T,null,_(G(l.id).presetOptions,m=>(i(),a("button",{key:m.value,class:W(["px-2 py-1 rounded text-xs font-medium transition-colors",G(l.id).preset===m.value&&G(l.id).type==="preset"?"bg-white text-blue-600 shadow-sm":"text-gray-600 hover:text-gray-900"]),onClick:S=>ve(m.value,l.id)},c(m.label),11,Vo))),128))]),Ue(p,{"model-value":G(l.id).customRange,type:"datetimerange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","value-format":"YYYY-MM-DD HH:mm:ss","disabled-date":De,"default-time":D.value,size:"small",style:{width:"280px"},class:"api-key-date-picker",clearable:!0,"unlink-panels":!1,"onUpdate:modelValue":m=>Ie(l.id,m)},null,8,["model-value","default-time","onUpdate:modelValue"])])])]),k.value[l.id]&&k.value[l.id].length===0?(i(),a("div",jo,[e("div",Uo,[s[57]||(s[57]=e("i",{class:"fas fa-chart-line text-gray-400 text-lg"},null,-1)),s[58]||(s[58]=e("p",{class:"text-sm text-gray-500"}," 暂无模型使用数据 ",-1)),e("button",{class:"text-blue-500 hover:text-blue-700 text-sm ml-2 flex items-center gap-1 transition-colors",title:"重置筛选条件并刷新",onClick:m=>Le(l.id)},s[56]||(s[56]=[e("i",{class:"fas fa-sync-alt text-xs"},null,-1),e("span",{class:"text-xs"},"刷新",-1)]),8,qo)]),s[59]||(s[59]=e("p",{class:"text-xs text-gray-400"}," 尝试调整时间范围或点击刷新重新加载数据 ",-1))])):k.value[l.id]&&k.value[l.id].length>0?(i(),a("div",Oo,[(i(!0),a(T,null,_(k.value[l.id],m=>(i(),a("div",{key:m.model,class:"bg-gradient-to-br from-white to-gray-50 rounded-xl p-4 border border-gray-200 hover:border-indigo-300 hover:shadow-lg transition-all duration-200"},[e("div",Fo,[e("div",Wo,[e("span",No,c(m.model),1),e("span",Yo,c(m.requests)+" 次请求",1)])]),e("div",zo,[e("div",Bo,[s[60]||(s[60]=e("span",{class:"text-gray-600 flex items-center"},[e("i",{class:"fas fa-coins text-yellow-500 mr-1 text-xs"}),b(" 总Token: ")],-1)),e("span",Ho,c(F(m.allTokens)),1)]),e("div",Go,[s[61]||(s[61]=e("span",{class:"text-gray-600 flex items-center"},[e("i",{class:"fas fa-dollar-sign text-green-500 mr-1 text-xs"}),b(" 费用: ")],-1)),e("span",Qo,c(he(m)),1)]),e("div",Xo,[e("div",Jo,[s[62]||(s[62]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-down text-green-500 mr-1"}),b(" 输入: ")],-1)),e("span",Zo,c(F(m.inputTokens)),1)]),e("div",en,[s[63]||(s[63]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-up text-blue-500 mr-1"}),b(" 输出: ")],-1)),e("span",tn,c(F(m.outputTokens)),1)]),m.cacheCreateTokens>0?(i(),a("div",sn,[s[64]||(s[64]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-save mr-1"}),b(" 缓存创建: ")],-1)),e("span",ln,c(F(m.cacheCreateTokens)),1)])):w("",!0),m.cacheReadTokens>0?(i(),a("div",on,[s[65]||(s[65]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-download mr-1"}),b(" 缓存读取: ")],-1)),e("span",nn,c(F(m.cacheReadTokens)),1)])):w("",!0)])]),e("div",an,[e("div",{class:"bg-gradient-to-r from-indigo-500 to-purple-600 h-2 rounded-full transition-all duration-500",style:qe({width:fe(m.allTokens,k.value[l.id])+"%"})},null,4)]),e("div",rn,[e("span",dn,c(fe(m.allTokens,k.value[l.id]))+"% ",1)])]))),128))])):w("",!0),k.value[l.id]&&k.value[l.id].length>0?(i(),a("div",un,[e("div",cn,[s[68]||(s[68]=e("span",{class:"font-semibold text-gray-700 flex items-center"},[e("i",{class:"fas fa-calculator text-indigo-500 mr-2"}),b(" 总计统计 ")],-1)),e("div",mn,[e("span",pn,[s[66]||(s[66]=b(" 总请求: ",-1)),e("span",xn,c(k.value[l.id].reduce((m,S)=>m+S.requests,0)),1)]),e("span",gn,[s[67]||(s[67]=b(" 总Token: ",-1)),e("span",yn,c(F(k.value[l.id].reduce((m,S)=>m+S.allTokens,0))),1)])])])])):w("",!0)])])])):w("",!0)],64))),128))])])])),r.value.length>0?(i(),a("div",fn,[e("div",bn,[e("span",vn," 共 "+c(r.value.length)+" 条记录 ",1),e("div",wn,[s[69]||(s[69]=e("span",{class:"text-sm text-gray-600"},"每页显示",-1)),A(e("select",{"onUpdate:modelValue":s[9]||(s[9]=l=>E.value=l),class:"px-2 py-1 text-sm text-gray-700 bg-white border border-gray-200 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent hover:border-gray-300 transition-colors",onChange:s[10]||(s[10]=l=>y.value=1)},[(i(),a(T,null,_(B,l=>e("option",{key:l,value:l},c(l),9,$n)),64))],544),[[H,E.value]]),s[70]||(s[70]=e("span",{class:"text-sm text-gray-600"},"条",-1))])]),e("div",An,[e("button",{class:"px-3 py-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed",disabled:y.value===1,onClick:s[11]||(s[11]=l=>y.value--)},s[71]||(s[71]=[e("i",{class:"fas fa-chevron-left"},null,-1)]),8,Cn),e("div",kn,[y.value>3?(i(),a("button",{key:0,class:"px-3 py-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50",onClick:s[12]||(s[12]=l=>y.value=1)}," 1 ")):w("",!0),y.value>4?(i(),a("span",Kn,"...")):w("",!0),(i(!0),a(T,null,_(Z.value,l=>(i(),a("button",{key:l,class:W(["px-3 py-1 text-sm font-medium rounded-md",l===y.value?"bg-blue-600 text-white":"text-gray-700 bg-white border border-gray-300 hover:bg-gray-50"]),onClick:m=>y.value=l},c(l),11,hn))),128)),y.value<j.value-3?(i(),a("span",In,"...")):w("",!0),j.value>1&&y.value<j.value-2?(i(),a("button",{key:3,class:"px-3 py-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50",onClick:s[13]||(s[13]=l=>y.value=j.value)},c(j.value),1)):w("",!0)]),e("button",{class:"px-3 py-1 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 disabled:opacity-50 disabled:cursor-not-allowed",disabled:y.value===j.value||j.value===0,onClick:s[14]||(s[14]=l=>y.value++)},s[72]||(s[72]=[e("i",{class:"fas fa-chevron-right"},null,-1)]),8,Dn)])])):w("",!0)]),K.value?(i(),X(Ut,{key:0,accounts:t.value,onClose:s[15]||(s[15]=l=>K.value=!1),onSuccess:Te},null,8,["accounts"])):w("",!0),x.value?(i(),X(_s,{key:1,"api-key":N.value,accounts:t.value,onClose:s[16]||(s[16]=l=>x.value=!1),onSuccess:Pe},null,8,["api-key","accounts"])):w("",!0),n.value?(i(),X(Js,{key:2,"api-key":v.value,onClose:s[17]||(s[17]=l=>n.value=!1),onSuccess:_e},null,8,["api-key"])):w("",!0),u.value?(i(),X(ml,{key:3,"api-key":o.value,onClose:s[18]||(s[18]=l=>u.value=!1)},null,8,["api-key"])):w("",!0)])}}},_n=ne(Ln,[["__scopeId","data-v-cc09a0d1"]]);export{_n as default};
|