mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 08:55:23 +00:00
20 lines
118 KiB
JavaScript
20 lines
118 KiB
JavaScript
import{E as it}from"./element-plus-B8Fs_0jW.js";import{aR as Be,r as C,c as P,q as Ce,V as at,o as he,x as d,y as a,z as e,I as le,C as T,P as c,R as pe,J as rt,L as b,B as ie,K as S,aq as Y,Q as G,ac as B,T as dt,a5 as xe,D as ut,_ as Ae,Y as re,an as me,O as $,aa as $e,aX as ye,al as fe}from"./vue-vendor-CKToUHZx.js";import{s as V}from"./toast-BvwA7Mwb.js";import{a as O,_ as de}from"./index-6fdnI-vy.js";import"./vendor-BDiMbLwQ.js";const Me=Be("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 f=await O.get("/admin/supported-clients");return f.success?this.supportedClients=f.data||[]:(this.error=f.message||"加载支持的客户端失败",console.error("Failed to load supported clients:",this.error)),this.supportedClients}catch(f){return this.error=f.message||"加载支持的客户端失败",console.error("Error loading supported clients:",f),[]}finally{this.loading=!1}}}}),He=Be("apiKeys",()=>{const f=C([]),W=C(!1),m=C(null),R=C("all"),I=C(""),g=C("asc"),w=async()=>{W.value=!0,m.value=null;try{const k=await O.get("/admin/api-keys");if(k.success)f.value=k.data||[];else throw new Error(k.message||"获取API Keys失败")}catch(k){throw m.value=k.message,k}finally{W.value=!1}};return{apiKeys:f,loading:W,error:m,statsTimeRange:R,sortBy:I,sortOrder:g,fetchApiKeys:w,createApiKey:async k=>{W.value=!0,m.value=null;try{const y=await O.post("/admin/api-keys",k);if(y.success)return await w(),y.data;throw new Error(y.message||"创建API Key失败")}catch(y){throw m.value=y.message,y}finally{W.value=!1}},updateApiKey:async(k,y)=>{W.value=!0,m.value=null;try{const x=await O.put(`/admin/api-keys/${k}`,y);if(x.success)return await w(),x;throw new Error(x.message||"更新API Key失败")}catch(x){throw m.value=x.message,x}finally{W.value=!1}},toggleApiKey:async k=>{W.value=!0,m.value=null;try{const y=await O.put(`/admin/api-keys/${k}/toggle`);if(y.success)return await w(),y;throw new Error(y.message||"切换状态失败")}catch(y){throw m.value=y.message,y}finally{W.value=!1}},renewApiKey:async(k,y)=>{W.value=!0,m.value=null;try{const x=await O.put(`/admin/api-keys/${k}`,y);if(x.success)return await w(),x;throw new Error(x.message||"续期失败")}catch(x){throw m.value=x.message,x}finally{W.value=!1}},deleteApiKey:async k=>{W.value=!0,m.value=null;try{const y=await O.delete(`/admin/api-keys/${k}`);if(y.success)return await w(),y;throw new Error(y.message||"删除失败")}catch(y){throw m.value=y.message,y}finally{W.value=!1}},fetchApiKeyStats:async(k,y="all")=>{try{const x=await O.get(`/admin/api-keys/${k}/stats`,{params:{timeRange:y}});if(x.success)return x.stats;throw new Error(x.message||"获取统计失败")}catch(x){return console.error("获取API Key统计失败:",x),null}},fetchTags:async()=>{try{const k=await O.get("/admin/api-keys/tags");if(k.success)return k.data||[];throw new Error(k.message||"获取标签失败")}catch(k){return console.error("获取标签失败:",k),[]}},sortApiKeys:k=>{I.value===k?g.value=g.value==="asc"?"desc":"asc":(I.value=k,g.value="asc")},reset:()=>{f.value=[],W.value=!1,m.value=null,R.value="all",I.value="",g.value="asc"}}}),ct={class:"flex-shrink-0 border-b border-gray-200 p-3"},mt={class:"relative"},pt={class:"custom-scrollbar flex-1 overflow-y-auto"},xt={class:"text-gray-700"},ft={key:0},gt=["onClick"],yt={class:"flex items-center justify-between"},bt={class:"text-gray-700"},vt={class:"text-xs text-gray-500"},wt={key:1},ht={class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500"},$t=["onClick"],kt={class:"flex items-center justify-between"},Ct={class:"text-gray-700"},At={class:"text-xs text-gray-400"},Kt={key:2},_t=["onClick"],Dt={class:"flex items-center justify-between"},Lt={class:"text-gray-700"},It={class:"text-xs text-gray-400"},Mt={key:3,class:"px-4 py-8 text-center text-gray-500"},Tt={__name:"AccountSelector",props:{modelValue:{type:String,default:""},platform:{type:String,required:!0,validator:f=>["claude","gemini"].includes(f)},accounts:{type:Array,default:()=>[]},groups:{type:Array,default:()=>[]},disabled:{type:Boolean,default:!1},placeholder:{type:String,default:"请选择账号"},defaultOptionText:{type:String,default:"使用共享账号池"}},emits:["update:modelValue"],setup(f,{emit:W}){const m=f,R=W,I=C(!1),g=C(""),w=C(null),q=C(null),A=C({}),E=C(null),L=C(""),v=P(()=>{if(!m.modelValue)return m.defaultOptionText;if(m.modelValue.startsWith("group:")){const o=m.modelValue.substring(6),l=m.groups.find(p=>p.id===o);return l?`${l.name} (${l.memberCount||0} 个成员)`:""}if(m.modelValue.startsWith("console:")){const o=m.modelValue.substring(8),l=m.accounts.find(p=>p.id===o&&p.platform==="claude-console");return l?`${l.name} (${l.status==="active"?"正常":"异常"})`:""}const s=m.accounts.find(o=>o.id===m.modelValue);return s?`${s.name} (${s.status==="active"?"正常":"异常"})`:""}),K=P(()=>[...m.accounts].sort((s,o)=>{const l=new Date(s.createdAt||0);return new Date(o.createdAt||0)-l})),r=P(()=>{if(!g.value)return m.groups;const s=g.value.toLowerCase();return m.groups.filter(o=>o.name.toLowerCase().includes(s))}),i=P(()=>{let s=K.value.filter(o=>o.accountType==="dedicated"&&(m.platform==="claude"?o.platform==="claude-oauth":o.platform!=="claude-console"));if(g.value){const o=g.value.toLowerCase();s=s.filter(l=>l.name.toLowerCase().includes(o))}return s}),z=P(()=>{if(m.platform!=="claude")return[];let s=K.value.filter(o=>o.accountType==="dedicated"&&o.platform==="claude-console");if(g.value){const o=g.value.toLowerCase();s=s.filter(l=>l.name.toLowerCase().includes(o))}return s}),k=P(()=>r.value.length>0||i.value.length>0||z.value.length>0),y=s=>{if(!s)return"";const o=new Date(s),p=(new Date-o)/(1e3*60*60);return p<24?"今天创建":p<48?"昨天创建":p<168?`${Math.floor(p/24)} 天前`:o.toLocaleDateString("zh-CN",{month:"2-digit",day:"2-digit"})},x=()=>{if(!I.value||!q.value||!E.value)return;const s=E.value;if(!s)return;const o=s.getBoundingClientRect(),l=window.innerHeight,p=window.innerWidth,N=l-o.bottom,ee=o.top,j=8,te=N-j,Z=ee-j;let se=!1,oe=te;L.value==="above"&&Z>=150?(se=!0,oe=Z):L.value==="below"&&te>=150?(se=!1,oe=te):Z>te&&te<200&&(se=!0,oe=Z),L.value=se?"above":"below";let ne=o.left;const ge=o.width;ne+ge>p-j&&(ne=p-ge-j),ne<j&&(ne=j),A.value={position:"fixed",left:`${ne}px`,width:`${o.width}px`,maxHeight:`${Math.min(oe,400)}px`,...se?{bottom:`${l-o.top}px`}:{top:`${o.bottom}px`}}},F=()=>{if(!I.value&&E.value){const s=E.value.getBoundingClientRect(),l=window.innerHeight-s.bottom,p=8;A.value={position:"fixed",left:`${s.left}px`,width:`${s.width}px`,maxHeight:`${Math.min(l-p,400)}px`,top:`${s.bottom}px`}}I.value=!I.value,I.value&&ut(()=>{var s;x(),(s=w.value)==null||s.focus()})},Q=s=>{R("update:modelValue",s||""),I.value=!1,g.value=""},H=()=>{},X=()=>{var s;g.value="",(s=w.value)==null||s.focus()},J=s=>{var o,l;!((o=E.value)!=null&&o.contains(s.target))&&!((l=q.value)!=null&&l.contains(s.target))&&(I.value=!1)},D=()=>{I.value&&x()};return Ce(()=>{document.addEventListener("click",J),window.addEventListener("scroll",D,!0),window.addEventListener("resize",x)}),at(()=>{document.removeEventListener("click",J),window.removeEventListener("scroll",D,!0),window.removeEventListener("resize",x)}),he(I,s=>{s||(g.value="",L.value="")}),(s,o)=>(a(),d("div",{ref_key:"triggerRef",ref:E,class:"relative"},[e("div",{class:T(["form-input flex w-full cursor-pointer items-center justify-between",{"opacity-50":f.disabled}]),onClick:o[0]||(o[0]=l=>!f.disabled&&F())},[e("span",{class:T(f.modelValue?"text-gray-900":"text-gray-500")},c(v.value),3),e("i",{class:T(["fas fa-chevron-down text-gray-400 transition-transform duration-200",{"rotate-180":I.value}])},null,2)],2),(a(),le(xe,{to:"body"},[pe(dt,{"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:rt(()=>[I.value?(a(),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",style:ie(A.value)},[e("div",ct,[e("div",mt,[S(e("input",{ref_key:"searchInput",ref:w,"onUpdate:modelValue":o[1]||(o[1]=l=>g.value=l),class:"form-input w-full text-sm",placeholder:"搜索账号名称...",style:{"padding-left":"40px","padding-right":"36px"},type:"text",onInput:H},null,544),[[Y,g.value]]),o[4]||(o[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"},null,-1)),g.value?(a(),d("button",{key:0,class:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600",type:"button",onClick:X},o[3]||(o[3]=[e("i",{class:"fas fa-times text-sm"},null,-1)]))):b("",!0)])]),e("div",pt,[e("div",{class:T(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50",{"bg-blue-50":!f.modelValue}]),onClick:o[2]||(o[2]=l=>Q(null))},[e("span",xt,c(f.defaultOptionText),1)],2),r.value.length>0?(a(),d("div",ft,[o[5]||(o[5]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500"},"调度分组",-1)),(a(!0),d(G,null,B(r.value,l=>(a(),d("div",{key:`group:${l.id}`,class:T(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50",{"bg-blue-50":f.modelValue===`group:${l.id}`}]),onClick:p=>Q(`group:${l.id}`)},[e("div",yt,[e("span",bt,c(l.name),1),e("span",vt,c(l.memberCount||0)+" 个成员",1)])],10,gt))),128))])):b("",!0),i.value.length>0?(a(),d("div",wt,[e("div",ht,c(f.platform==="claude"?"Claude OAuth 专属账号":"OAuth 专属账号"),1),(a(!0),d(G,null,B(i.value,l=>(a(),d("div",{key:l.id,class:T(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50",{"bg-blue-50":f.modelValue===l.id}]),onClick:p=>Q(l.id)},[e("div",kt,[e("div",null,[e("span",Ct,c(l.name),1),e("span",{class:T(["ml-2 rounded-full px-2 py-0.5 text-xs",l.status==="active"?"bg-green-100 text-green-700":"bg-red-100 text-red-700"])},c(l.status==="active"?"正常":"异常"),3)]),e("span",At,c(y(l.createdAt)),1)])],10,$t))),128))])):b("",!0),f.platform==="claude"&&z.value.length>0?(a(),d("div",Kt,[o[6]||(o[6]=e("div",{class:"bg-gray-50 px-4 py-2 text-xs font-semibold text-gray-500"}," Claude Console 专属账号 ",-1)),(a(!0),d(G,null,B(z.value,l=>(a(),d("div",{key:l.id,class:T(["cursor-pointer px-4 py-2 transition-colors hover:bg-gray-50",{"bg-blue-50":f.modelValue===`console:${l.id}`}]),onClick:p=>Q(`console:${l.id}`)},[e("div",Dt,[e("div",null,[e("span",Lt,c(l.name),1),e("span",{class:T(["ml-2 rounded-full px-2 py-0.5 text-xs",l.status==="active"?"bg-green-100 text-green-700":"bg-red-100 text-red-700"])},c(l.status==="active"?"正常":"异常"),3)]),e("span",It,c(y(l.createdAt)),1)])],10,_t))),128))])):b("",!0),g.value&&!k.value?(a(),d("div",Mt,o[7]||(o[7]=[e("i",{class:"fas fa-search mb-2 text-2xl"},null,-1),e("p",{class:"text-sm"},"没有找到匹配的账号",-1)]))):b("",!0)])],4)):b("",!0)]),_:1})]))],512))}},ke=de(Tt,[["__scopeId","data-v-728f08e0"]]),Rt={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},St={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6"},jt={class:"mb-4 flex items-center justify-between"},Pt={class:"rounded-lg border border-blue-200 bg-gradient-to-r from-blue-50 to-indigo-50 p-3 sm:p-4"},Et={class:"flex items-center gap-3 sm:gap-4"},Vt={class:"flex cursor-pointer items-center"},qt={class:"flex cursor-pointer items-center"},Ut={key:0,class:"mt-3"},Wt={class:"flex items-center gap-4"},Ot={class:"flex-1"},Ft={class:"flex items-center gap-2"},Gt={class:"mt-2 flex items-start text-xs text-amber-600"},zt=["placeholder"],Bt={key:0,class:"mt-1 text-xs text-red-500"},Ht={class:"space-y-4"},Nt={key:0},Yt={class:"flex flex-wrap gap-2"},Qt=["onClick"],Jt={key:1},Xt={class:"flex flex-wrap gap-2"},Zt=["onClick"],es={class:"flex gap-2"},ts=["onKeypress"],ss={class:"rounded-lg border border-blue-200 bg-blue-50 p-3"},ls={class:"space-y-2"},os={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},ns={class:"space-y-2"},is={class:"flex gap-2"},as={key:0,class:"mt-3"},rs=["min"],ds={key:1,class:"mt-2 text-xs text-gray-500"},us={class:"flex gap-4"},cs={class:"flex cursor-pointer items-center"},ms={class:"flex cursor-pointer items-center"},ps={class:"flex cursor-pointer items-center"},xs={class:"mb-2 flex items-center justify-between"},fs=["disabled"],gs={class:"grid grid-cols-1 gap-3"},ys={class:"mb-2 flex items-center"},bs={key:0,class:"space-y-2 rounded-lg border border-red-200 bg-red-50 p-3"},vs={class:"mb-2 flex min-h-[24px] flex-wrap gap-1"},ws=["onClick"],hs={key:0,class:"text-xs text-gray-400"},$s={class:"flex gap-2"},ks=["onKeydown"],Cs={class:"mb-2 flex items-center"},As={key:0,class:"rounded-lg border border-green-200 bg-green-50 p-3"},Ks={class:"space-y-1"},_s=["id","value"],Ds=["for"],Ls={class:"text-sm font-medium text-gray-700"},Is={class:"block text-xs text-gray-500"},Ms={class:"flex gap-3 pt-2"},Ts=["disabled"],Rs={key:0,class:"loading-spinner mr-2"},Ss={key:1,class:"fas fa-plus mr-2"},js={__name:"CreateApiKeyModal",props:{accounts:{type:Object,default:()=>({claude:[],gemini:[]})}},emits:["close","success","batch-success"],setup(f,{emit:W}){const m=f,R=W,I=Me(),g=He(),w=C(!1),q=C(!1),A=C({claude:[],gemini:[],claudeGroups:[],geminiGroups:[]}),E=C({name:""}),L=C(""),v=C([]),K=P(()=>v.value.filter(o=>!i.tags.includes(o))),r=C([]),i=Ae({createType:"single",batchCount:10,name:"",description:"",tokenLimit:"",rateLimitWindow:"",rateLimitRequests:"",concurrencyLimit:"",dailyCostLimit:"",expireDuration:"",customExpireDate:"",expiresAt:null,permissions:"all",claudeAccountId:"",geminiAccountId:"",enableModelRestriction:!1,restrictedModels:[],modelInput:"",enableClientRestriction:!1,allowedClients:[],tags:[]});Ce(async()=>{r.value=await I.loadSupportedClients(),v.value=await g.fetchTags(),m.accounts&&(A.value={claude:m.accounts.claude||[],gemini:m.accounts.gemini||[],claudeGroups:m.accounts.claudeGroups||[],geminiGroups:m.accounts.geminiGroups||[]})});const z=async()=>{var o,l;q.value=!0;try{const[p,N,ee,j]=await Promise.all([O.get("/admin/claude-accounts"),O.get("/admin/claude-console-accounts"),O.get("/admin/gemini-accounts"),O.get("/admin/account-groups")]),te=[];if(p.success&&((o=p.data)==null||o.forEach(Z=>{te.push({...Z,platform:"claude-oauth",isDedicated:Z.accountType==="dedicated"})})),N.success&&((l=N.data)==null||l.forEach(Z=>{te.push({...Z,platform:"claude-console",isDedicated:Z.accountType==="dedicated"})})),A.value.claude=te,ee.success&&(A.value.gemini=(ee.data||[]).map(Z=>({...Z,isDedicated:Z.accountType==="dedicated"}))),j.success){const Z=j.data||[];A.value.claudeGroups=Z.filter(se=>se.platform==="claude"),A.value.geminiGroups=Z.filter(se=>se.platform==="gemini")}V("账号列表已刷新","success")}catch{V("刷新账号列表失败","error")}finally{q.value=!1}},k=P(()=>{const o=new Date;return o.setMinutes(o.getMinutes()+1),o.toISOString().slice(0,16)}),y=()=>{if(!i.expireDuration){i.expiresAt=null;return}if(i.expireDuration==="custom")return;const o=new Date,p=i.expireDuration.match(/(\d+)([dhmy])/);if(p){const[,N,ee]=p,j=parseInt(N);switch(ee){case"d":o.setDate(o.getDate()+j);break;case"h":o.setHours(o.getHours()+j);break;case"m":o.setMonth(o.getMonth()+j);break;case"y":o.setFullYear(o.getFullYear()+j);break}i.expiresAt=o.toISOString()}},x=()=>{i.customExpireDate&&(i.expiresAt=new Date(i.customExpireDate).toISOString())},F=o=>new Date(o).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),Q=()=>{i.modelInput&&!i.restrictedModels.includes(i.modelInput)&&(i.restrictedModels.push(i.modelInput),i.modelInput="")},H=o=>{i.restrictedModels.splice(o,1)},X=()=>{if(L.value&&L.value.trim()){const o=L.value.trim();i.tags.includes(o)||i.tags.push(o),L.value=""}},J=o=>{i.tags.includes(o)||i.tags.push(o)},D=o=>{i.tags.splice(o,1)},s=async()=>{if(E.value.name="",!i.name||!i.name.trim()){E.value.name="请输入API Key名称";return}if(i.createType==="batch"&&(!i.batchCount||i.batchCount<2||i.batchCount>500)){V("批量创建数量必须在 2-500 之间","error");return}w.value=!0;try{const o={description:i.description||void 0,tokenLimit:i.tokenLimit!==""&&i.tokenLimit!==null?parseInt(i.tokenLimit):null,rateLimitWindow:i.rateLimitWindow!==""&&i.rateLimitWindow!==null?parseInt(i.rateLimitWindow):null,rateLimitRequests:i.rateLimitRequests!==""&&i.rateLimitRequests!==null?parseInt(i.rateLimitRequests):null,concurrencyLimit:i.concurrencyLimit!==""&&i.concurrencyLimit!==null?parseInt(i.concurrencyLimit):0,dailyCostLimit:i.dailyCostLimit!==""&&i.dailyCostLimit!==null?parseFloat(i.dailyCostLimit):0,expiresAt:i.expiresAt||void 0,permissions:i.permissions,tags:i.tags.length>0?i.tags:void 0,enableModelRestriction:i.enableModelRestriction,restrictedModels:i.restrictedModels,enableClientRestriction:i.enableClientRestriction,allowedClients:i.allowedClients};if(i.claudeAccountId&&(i.claudeAccountId.startsWith("console:")?(o.claudeConsoleAccountId=i.claudeAccountId.substring(8),delete o.claudeAccountId):(o.claudeAccountId=i.claudeAccountId,delete o.claudeConsoleAccountId)),i.geminiAccountId&&(o.geminiAccountId=i.geminiAccountId),i.createType==="single"){const l={...o,name:i.name},p=await O.post("/admin/api-keys",l);p.success?(V("API Key 创建成功","success"),R("success",p.data),R("close")):V(p.message||"创建失败","error")}else{const l={...o,createType:"batch",baseName:i.name,count:i.batchCount},p=await O.post("/admin/api-keys/batch",l);p.success?(V(`成功创建 ${p.data.length} 个 API Key`,"success"),R("batch-success",p.data),R("close")):V(p.message||"批量创建失败","error")}}catch{V("创建失败","error")}finally{w.value=!1}};return(o,l)=>(a(),le(xe,{to:"body"},[e("div",Rt,[e("div",St,[e("div",jt,[l[30]||(l[30]=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 sm:text-xl"},"创建新的 API Key")],-1)),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600",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",onSubmit:re(s,["prevent"])},[e("div",Pt,[e("div",{class:T(["flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",i.createType==="batch"?"mb-3":""])},[l[33]||(l[33]=e("label",{class:"flex h-full items-center text-xs font-semibold text-gray-700 sm:text-sm"},"创建类型",-1)),e("div",Et,[e("label",Vt,[S(e("input",{"onUpdate:modelValue":l[1]||(l[1]=p=>i.createType=p),class:"mr-1.5 text-blue-600 sm:mr-2",type:"radio",value:"single"},null,512),[[me,i.createType]]),l[31]||(l[31]=e("span",{class:"flex items-center text-xs text-gray-700 sm:text-sm"},[e("i",{class:"fas fa-key mr-1 text-xs"}),$(" 单个创建 ")],-1))]),e("label",qt,[S(e("input",{"onUpdate:modelValue":l[2]||(l[2]=p=>i.createType=p),class:"mr-1.5 text-blue-600 sm:mr-2",type:"radio",value:"batch"},null,512),[[me,i.createType]]),l[32]||(l[32]=e("span",{class:"flex items-center text-xs text-gray-700 sm:text-sm"},[e("i",{class:"fas fa-layer-group mr-1 text-xs"}),$(" 批量创建 ")],-1))])])],2),i.createType==="batch"?(a(),d("div",Ut,[e("div",Wt,[e("div",Ot,[l[35]||(l[35]=e("label",{class:"mb-1 block text-xs font-medium text-gray-600"},"创建数量",-1)),e("div",Ft,[S(e("input",{"onUpdate:modelValue":l[3]||(l[3]=p=>i.batchCount=p),class:"form-input w-full text-sm",max:"500",min:"2",placeholder:"输入数量 (2-500)",required:"",type:"number"},null,512),[[Y,i.batchCount,void 0,{number:!0}]]),l[34]||(l[34]=e("div",{class:"whitespace-nowrap text-xs text-gray-500"},"最大支持 500 个",-1))])])]),e("p",Gt,[l[36]||(l[36]=e("i",{class:"fas fa-info-circle mr-1 mt-0.5 flex-shrink-0"},null,-1)),e("span",null,"批量创建时,每个 Key 的名称会自动添加序号后缀,例如:"+c(i.name||"MyKey")+"_1, "+c(i.name||"MyKey")+"_2 ...",1)])])):b("",!0)]),e("div",null,[l[37]||(l[37]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 sm:mb-2 sm:text-sm"},[$("名称 "),e("span",{class:"text-red-500"},"*")],-1)),S(e("input",{"onUpdate:modelValue":l[4]||(l[4]=p=>i.name=p),class:T(["form-input w-full text-sm",{"border-red-500":E.value.name}]),placeholder:i.createType==="batch"?"输入基础名称(将自动添加序号)":"为您的 API Key 取一个名称",required:"",type:"text",onInput:l[5]||(l[5]=p=>E.value.name="")},null,42,zt),[[Y,i.name]]),E.value.name?(a(),d("p",Bt,c(E.value.name),1)):b("",!0)]),e("div",null,[l[45]||(l[45]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700"},"标签",-1)),e("div",Ht,[i.tags.length>0?(a(),d("div",Nt,[l[39]||(l[39]=e("div",{class:"mb-2 text-xs font-medium text-gray-600"},"已选择的标签:",-1)),e("div",Yt,[(a(!0),d(G,null,B(i.tags,(p,N)=>(a(),d("span",{key:"selected-"+N,class:"inline-flex items-center gap-1 rounded-full bg-blue-100 px-3 py-1 text-sm text-blue-800"},[$(c(p)+" ",1),e("button",{class:"ml-1 hover:text-blue-900",type:"button",onClick:ee=>D(N)},l[38]||(l[38]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,Qt)]))),128))])])):b("",!0),K.value.length>0?(a(),d("div",Jt,[l[41]||(l[41]=e("div",{class:"mb-2 text-xs font-medium text-gray-600"},"点击选择已有标签:",-1)),e("div",Xt,[(a(!0),d(G,null,B(K.value,p=>(a(),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",type:"button",onClick:N=>J(p)},[l[40]||(l[40]=e("i",{class:"fas fa-tag text-xs text-gray-500"},null,-1)),$(" "+c(p),1)],8,Zt))),128))])])):b("",!0),e("div",null,[l[43]||(l[43]=e("div",{class:"mb-2 text-xs font-medium text-gray-600"},"创建新标签:",-1)),e("div",es,[S(e("input",{"onUpdate:modelValue":l[6]||(l[6]=p=>L.value=p),class:"form-input flex-1",placeholder:"输入新标签名称",type:"text",onKeypress:$e(re(X,["prevent"]),["enter"])},null,40,ts),[[Y,L.value]]),e("button",{class:"rounded-lg bg-green-500 px-4 py-2 text-white transition-colors hover:bg-green-600",type:"button",onClick:X},l[42]||(l[42]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),l[44]||(l[44]=e("p",{class:"text-xs text-gray-500"},"用于标记不同团队或用途,方便筛选管理",-1))])]),e("div",ss,[l[53]||(l[53]=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"},"速率限制设置 (可选)")],-1)),e("div",ls,[e("div",os,[e("div",null,[l[46]||(l[46]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700"},"时间窗口 (分钟)",-1)),S(e("input",{"onUpdate:modelValue":l[7]||(l[7]=p=>i.rateLimitWindow=p),class:"form-input w-full text-sm",min:"1",placeholder:"无限制",type:"number"},null,512),[[Y,i.rateLimitWindow]]),l[47]||(l[47]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500"},"时间段单位",-1))]),e("div",null,[l[48]||(l[48]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700"},"请求次数限制",-1)),S(e("input",{"onUpdate:modelValue":l[8]||(l[8]=p=>i.rateLimitRequests=p),class:"form-input w-full text-sm",min:"1",placeholder:"无限制",type:"number"},null,512),[[Y,i.rateLimitRequests]]),l[49]||(l[49]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500"},"窗口内最大请求",-1))]),e("div",null,[l[50]||(l[50]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700"},"Token 限制",-1)),S(e("input",{"onUpdate:modelValue":l[9]||(l[9]=p=>i.tokenLimit=p),class:"form-input w-full text-sm",placeholder:"无限制",type:"number"},null,512),[[Y,i.tokenLimit]]),l[51]||(l[51]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500"},"窗口内最大Token",-1))])]),l[52]||(l[52]=e("div",{class:"rounded-lg bg-blue-100 p-2"},[e("h5",{class:"mb-1 text-xs font-semibold text-blue-800"},"💡 使用示例"),e("div",{class:"space-y-0.5 text-xs text-blue-700"},[e("div",null,[e("strong",null,"示例1:"),$(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求 ")]),e("div",null,[e("strong",null,"示例2:"),$(" 时间窗口=1,Token=10000 → 每分钟最多10,000个Token ")]),e("div",null,[e("strong",null,"示例3:"),$(" 窗口=30,请求=50,Token=100000 → 每30分钟50次请求且不超10万Token ")])])],-1))])]),e("div",null,[l[55]||(l[55]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700"},"每日费用限制 (美元)",-1)),e("div",ns,[e("div",is,[e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200",type:"button",onClick:l[10]||(l[10]=p=>i.dailyCostLimit="50")}," $50 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200",type:"button",onClick:l[11]||(l[11]=p=>i.dailyCostLimit="100")}," $100 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200",type:"button",onClick:l[12]||(l[12]=p=>i.dailyCostLimit="200")}," $200 "),e("button",{class:"rounded bg-gray-100 px-2 py-1 text-xs font-medium hover:bg-gray-200",type:"button",onClick:l[13]||(l[13]=p=>i.dailyCostLimit="")}," 自定义 ")]),S(e("input",{"onUpdate:modelValue":l[14]||(l[14]=p=>i.dailyCostLimit=p),class:"form-input w-full",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[Y,i.dailyCostLimit]]),l[54]||(l[54]=e("p",{class:"text-xs text-gray-500"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[l[56]||(l[56]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700"},"并发限制 (可选)",-1)),S(e("input",{"onUpdate:modelValue":l[15]||(l[15]=p=>i.concurrencyLimit=p),class:"form-input w-full",min:"0",placeholder:"0 表示无限制",type:"number"},null,512),[[Y,i.concurrencyLimit]]),l[57]||(l[57]=e("p",{class:"mt-2 text-xs text-gray-500"}," 设置此 API Key 可同时处理的最大请求数,0 或留空表示无限制 ",-1))]),e("div",null,[l[58]||(l[58]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700"},"备注 (可选)",-1)),S(e("textarea",{"onUpdate:modelValue":l[16]||(l[16]=p=>i.description=p),class:"form-input w-full resize-none text-sm",placeholder:"描述此 API Key 的用途...",rows:"2"},null,512),[[Y,i.description]])]),e("div",null,[l[60]||(l[60]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700"},"有效期限",-1)),S(e("select",{"onUpdate:modelValue":l[17]||(l[17]=p=>i.expireDuration=p),class:"form-input w-full",onChange:y},l[59]||(l[59]=[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),[[ye,i.expireDuration]]),i.expireDuration==="custom"?(a(),d("div",as,[S(e("input",{"onUpdate:modelValue":l[18]||(l[18]=p=>i.customExpireDate=p),class:"form-input w-full",min:k.value,type:"datetime-local",onChange:x},null,40,rs),[[Y,i.customExpireDate]])])):b("",!0),i.expiresAt?(a(),d("p",ds," 将于 "+c(F(i.expiresAt))+" 过期 ",1)):b("",!0)]),e("div",null,[l[64]||(l[64]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700"},"服务权限",-1)),e("div",us,[e("label",cs,[S(e("input",{"onUpdate:modelValue":l[19]||(l[19]=p=>i.permissions=p),class:"mr-2",type:"radio",value:"all"},null,512),[[me,i.permissions]]),l[61]||(l[61]=e("span",{class:"text-sm text-gray-700"},"全部服务",-1))]),e("label",ms,[S(e("input",{"onUpdate:modelValue":l[20]||(l[20]=p=>i.permissions=p),class:"mr-2",type:"radio",value:"claude"},null,512),[[me,i.permissions]]),l[62]||(l[62]=e("span",{class:"text-sm text-gray-700"},"仅 Claude",-1))]),e("label",ps,[S(e("input",{"onUpdate:modelValue":l[21]||(l[21]=p=>i.permissions=p),class:"mr-2",type:"radio",value:"gemini"},null,512),[[me,i.permissions]]),l[63]||(l[63]=e("span",{class:"text-sm text-gray-700"},"仅 Gemini",-1))])]),l[65]||(l[65]=e("p",{class:"mt-2 text-xs text-gray-500"},"控制此 API Key 可以访问哪些服务",-1))]),e("div",null,[e("div",xs,[l[66]||(l[66]=e("label",{class:"text-sm font-semibold text-gray-700"},"专属账号绑定 (可选)",-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",disabled:q.value,title:"刷新账号列表",type:"button",onClick:z},[e("i",{class:T(["fas",q.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,c(q.value?"刷新中...":"刷新账号"),1)],8,fs)]),e("div",gs,[e("div",null,[l[67]||(l[67]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600"},"Claude 专属账号",-1)),pe(ke,{modelValue:i.claudeAccountId,"onUpdate:modelValue":l[22]||(l[22]=p=>i.claudeAccountId=p),accounts:A.value.claude,"default-option-text":"使用共享账号池",disabled:i.permissions==="gemini",groups:A.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[l[68]||(l[68]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600"},"Gemini 专属账号",-1)),pe(ke,{modelValue:i.geminiAccountId,"onUpdate:modelValue":l[23]||(l[23]=p=>i.geminiAccountId=p),accounts:A.value.gemini,"default-option-text":"使用共享账号池",disabled:i.permissions==="claude",groups:A.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini"},null,8,["modelValue","accounts","disabled","groups"])])]),l[69]||(l[69]=e("p",{class:"mt-2 text-xs text-gray-500"}," 选择专属账号后,此API Key将只使用该账号,不选择则使用共享账号池 ",-1))]),e("div",null,[e("div",ys,[S(e("input",{id:"enableModelRestriction","onUpdate:modelValue":l[24]||(l[24]=p=>i.enableModelRestriction=p),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[fe,i.enableModelRestriction]]),l[70]||(l[70]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700",for:"enableModelRestriction"}," 启用模型限制 ",-1))]),i.enableModelRestriction?(a(),d("div",bs,[e("div",null,[l[73]||(l[73]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700"},"限制的模型列表",-1)),e("div",vs,[(a(!0),d(G,null,B(i.restrictedModels,(p,N)=>(a(),d("span",{key:N,class:"inline-flex items-center rounded-full bg-red-100 px-2 py-1 text-xs text-red-800"},[$(c(p)+" ",1),e("button",{class:"ml-1 text-red-600 hover:text-red-800",type:"button",onClick:ee=>H(N)},l[71]||(l[71]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,ws)]))),128)),i.restrictedModels.length===0?(a(),d("span",hs," 暂无限制的模型 ")):b("",!0)]),e("div",$s,[S(e("input",{"onUpdate:modelValue":l[25]||(l[25]=p=>i.modelInput=p),class:"form-input flex-1 text-sm",placeholder:"输入模型名称,按回车添加",type:"text",onKeydown:$e(re(Q,["prevent"]),["enter"])},null,40,ks),[[Y,i.modelInput]]),e("button",{class:"rounded-lg bg-red-500 px-3 py-1.5 text-sm text-white transition-colors hover:bg-red-600",type:"button",onClick:Q},l[72]||(l[72]=[e("i",{class:"fas fa-plus"},null,-1)]))]),l[74]||(l[74]=e("p",{class:"mt-1 text-xs text-gray-500"},"例如:claude-opus-4-20250514",-1))])])):b("",!0)]),e("div",null,[e("div",Cs,[S(e("input",{id:"enableClientRestriction","onUpdate:modelValue":l[26]||(l[26]=p=>i.enableClientRestriction=p),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[fe,i.enableClientRestriction]]),l[75]||(l[75]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700",for:"enableClientRestriction"}," 启用客户端限制 ",-1))]),i.enableClientRestriction?(a(),d("div",As,[e("div",null,[l[76]||(l[76]=e("label",{class:"mb-2 block text-xs font-medium text-gray-700"},"允许的客户端",-1)),e("div",Ks,[(a(!0),d(G,null,B(r.value,p=>(a(),d("div",{key:p.id,class:"flex items-start"},[S(e("input",{id:`client_${p.id}`,"onUpdate:modelValue":l[27]||(l[27]=N=>i.allowedClients=N),class:"mt-0.5 h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox",value:p.id},null,8,_s),[[fe,i.allowedClients]]),e("label",{class:"ml-2 flex-1 cursor-pointer",for:`client_${p.id}`},[e("span",Ls,c(p.name),1),e("span",Is,c(p.description),1)],8,Ds)]))),128))])])])):b("",!0)]),e("div",Ms,[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",type:"button",onClick:l[28]||(l[28]=p=>o.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-4 py-2.5 text-sm font-semibold",disabled:w.value,type:"submit"},[w.value?(a(),d("div",Rs)):(a(),d("i",Ss)),$(" "+c(w.value?"创建中...":"创建"),1)],8,Ts)])],32)])])]))}},Ps=de(js,[["__scopeId","data-v-dd31c005"]]),Es={class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},Vs={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-4xl flex-col p-4 sm:p-6 md:p-8"},qs={class:"mb-4 flex items-center justify-between sm:mb-6"},Us=["value"],Ws={class:"space-y-4"},Os={key:0},Fs={class:"flex flex-wrap gap-2"},Gs=["onClick"],zs={key:1},Bs={class:"flex flex-wrap gap-2"},Hs=["onClick"],Ns={class:"flex gap-2"},Ys=["onKeypress"],Qs={class:"rounded-lg border border-blue-200 bg-blue-50 p-3"},Js={class:"space-y-2"},Xs={class:"grid grid-cols-1 gap-2 lg:grid-cols-3"},Zs={class:"space-y-3"},el={class:"flex gap-2"},tl={class:"flex gap-4"},sl={class:"flex cursor-pointer items-center"},ll={class:"flex cursor-pointer items-center"},ol={class:"flex cursor-pointer items-center"},nl={class:"mb-3 flex items-center justify-between"},il=["disabled"],al={class:"grid grid-cols-1 gap-3"},rl={class:"mb-3 flex items-center"},dl={key:0,class:"space-y-3"},ul={class:"mb-3 flex min-h-[32px] flex-wrap gap-2 rounded-lg border border-gray-200 bg-gray-50 p-2"},cl=["onClick"],ml={key:0,class:"text-sm text-gray-400"},pl={class:"space-y-3"},xl={class:"flex flex-wrap gap-2"},fl=["onClick"],gl={key:0,class:"text-sm italic text-gray-400"},yl={class:"flex gap-2"},bl=["onKeydown"],vl={class:"mb-3 flex items-center"},wl={key:0,class:"space-y-3"},hl={class:"space-y-2"},$l=["id","value"],kl=["for"],Cl={class:"text-sm font-medium text-gray-700"},Al={class:"block text-xs text-gray-500"},Kl={class:"flex gap-3 pt-4"},_l=["disabled"],Dl={key:0,class:"loading-spinner mr-2"},Ll={key:1,class:"fas fa-save mr-2"},Il={__name:"EditApiKeyModal",props:{apiKey:{type:Object,required:!0},accounts:{type:Object,default:()=>({claude:[],gemini:[]})}},emits:["close","success"],setup(f,{emit:W}){const m=f,R=W,I=Me(),g=He(),w=C(!1),q=C(!1),A=C({claude:[],gemini:[],claudeGroups:[],geminiGroups:[]}),E=C([]),L=C(""),v=C([]),K=P(()=>v.value.filter(D=>!r.tags.includes(D))),r=Ae({name:"",tokenLimit:"",rateLimitWindow:"",rateLimitRequests:"",concurrencyLimit:"",dailyCostLimit:"",permissions:"all",claudeAccountId:"",geminiAccountId:"",enableModelRestriction:!1,restrictedModels:[],modelInput:"",enableClientRestriction:!1,allowedClients:[],tags:[]}),i=()=>{r.modelInput&&!r.restrictedModels.includes(r.modelInput)&&(r.restrictedModels.push(r.modelInput),r.modelInput="")},z=D=>{r.restrictedModels.splice(D,1)},k=C(["claude-opus-4-20250514","claude-opus-4-1-20250805"]),y=P(()=>k.value.filter(D=>!r.restrictedModels.includes(D))),x=D=>{r.restrictedModels.includes(D)||r.restrictedModels.push(D)},F=()=>{if(L.value&&L.value.trim()){const D=L.value.trim();r.tags.includes(D)||r.tags.push(D),L.value=""}},Q=D=>{r.tags.includes(D)||r.tags.push(D)},H=D=>{r.tags.splice(D,1)},X=async()=>{w.value=!0;try{const D={tokenLimit:r.tokenLimit!==""&&r.tokenLimit!==null?parseInt(r.tokenLimit):0,rateLimitWindow:r.rateLimitWindow!==""&&r.rateLimitWindow!==null?parseInt(r.rateLimitWindow):0,rateLimitRequests:r.rateLimitRequests!==""&&r.rateLimitRequests!==null?parseInt(r.rateLimitRequests):0,concurrencyLimit:r.concurrencyLimit!==""&&r.concurrencyLimit!==null?parseInt(r.concurrencyLimit):0,dailyCostLimit:r.dailyCostLimit!==""&&r.dailyCostLimit!==null?parseFloat(r.dailyCostLimit):0,permissions:r.permissions,tags:r.tags};r.claudeAccountId?r.claudeAccountId.startsWith("console:")?(D.claudeConsoleAccountId=r.claudeAccountId.substring(8),D.claudeAccountId=null):(r.claudeAccountId.startsWith("group:"),D.claudeAccountId=r.claudeAccountId,D.claudeConsoleAccountId=null):(D.claudeAccountId=null,D.claudeConsoleAccountId=null),r.geminiAccountId?D.geminiAccountId=r.geminiAccountId:D.geminiAccountId=null,D.enableModelRestriction=r.enableModelRestriction,D.restrictedModels=r.restrictedModels,D.enableClientRestriction=r.enableClientRestriction,D.allowedClients=r.allowedClients;const s=await O.put(`/admin/api-keys/${m.apiKey.id}`,D);s.success?(R("success"),R("close")):V(s.message||"更新失败","error")}catch{V("更新失败","error")}finally{w.value=!1}},J=async()=>{var D,s;q.value=!0;try{const[o,l,p,N]=await Promise.all([O.get("/admin/claude-accounts"),O.get("/admin/claude-console-accounts"),O.get("/admin/gemini-accounts"),O.get("/admin/account-groups")]),ee=[];if(o.success&&((D=o.data)==null||D.forEach(j=>{ee.push({...j,platform:"claude-oauth",isDedicated:j.accountType==="dedicated"})})),l.success&&((s=l.data)==null||s.forEach(j=>{ee.push({...j,platform:"claude-console",isDedicated:j.accountType==="dedicated"})})),A.value.claude=ee,p.success&&(A.value.gemini=(p.data||[]).map(j=>({...j,isDedicated:j.accountType==="dedicated"}))),N.success){const j=N.data||[];A.value.claudeGroups=j.filter(te=>te.platform==="claude"),A.value.geminiGroups=j.filter(te=>te.platform==="gemini")}V("账号列表已刷新","success")}catch{V("刷新账号列表失败","error")}finally{q.value=!1}};return Ce(async()=>{E.value=await I.loadSupportedClients(),v.value=await g.fetchTags(),m.accounts&&(A.value={claude:m.accounts.claude||[],gemini:m.accounts.gemini||[],claudeGroups:m.accounts.claudeGroups||[],geminiGroups:m.accounts.geminiGroups||[]}),r.name=m.apiKey.name,r.tokenLimit=m.apiKey.tokenLimit||"",r.rateLimitWindow=m.apiKey.rateLimitWindow||"",r.rateLimitRequests=m.apiKey.rateLimitRequests||"",r.concurrencyLimit=m.apiKey.concurrencyLimit||"",r.dailyCostLimit=m.apiKey.dailyCostLimit||"",r.permissions=m.apiKey.permissions||"all",m.apiKey.claudeConsoleAccountId?r.claudeAccountId=`console:${m.apiKey.claudeConsoleAccountId}`:r.claudeAccountId=m.apiKey.claudeAccountId||"",r.geminiAccountId=m.apiKey.geminiAccountId||"",r.restrictedModels=m.apiKey.restrictedModels||[],r.allowedClients=m.apiKey.allowedClients||[],r.tags=m.apiKey.tags||[],r.enableModelRestriction=m.apiKey.enableModelRestriction||!1,r.enableClientRestriction=m.apiKey.enableClientRestriction||!1}),(D,s)=>(a(),le(xe,{to:"body"},[e("div",Es,[e("div",Vs,[e("div",qs,[s[22]||(s[22]=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 sm:text-xl"},"编辑 API Key")],-1)),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600",onClick:s[0]||(s[0]=o=>D.$emit("close"))},s[21]||(s[21]=[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:re(X,["prevent"])},[e("div",null,[s[23]||(s[23]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 sm:mb-3 sm:text-sm"},"名称",-1)),e("input",{class:"form-input w-full cursor-not-allowed bg-gray-100 text-sm",disabled:"",type:"text",value:r.name},null,8,Us),s[24]||(s[24]=e("p",{class:"mt-1 text-xs text-gray-500 sm:mt-2"},"名称不可修改",-1))]),e("div",null,[s[32]||(s[32]=e("label",{class:"mb-1.5 block text-xs font-semibold text-gray-700 sm:mb-3 sm:text-sm"},"标签",-1)),e("div",Ws,[r.tags.length>0?(a(),d("div",Os,[s[26]||(s[26]=e("div",{class:"mb-2 text-xs font-medium text-gray-600"},"已选择的标签:",-1)),e("div",Fs,[(a(!0),d(G,null,B(r.tags,(o,l)=>(a(),d("span",{key:"selected-"+l,class:"inline-flex items-center gap-1 rounded-full bg-blue-100 px-3 py-1 text-sm text-blue-800"},[$(c(o)+" ",1),e("button",{class:"ml-1 hover:text-blue-900",type:"button",onClick:p=>H(l)},s[25]||(s[25]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,Gs)]))),128))])])):b("",!0),K.value.length>0?(a(),d("div",zs,[s[28]||(s[28]=e("div",{class:"mb-2 text-xs font-medium text-gray-600"},"点击选择已有标签:",-1)),e("div",Bs,[(a(!0),d(G,null,B(K.value,o=>(a(),d("button",{key:"available-"+o,class:"inline-flex items-center gap-1 rounded-full bg-gray-100 px-3 py-1 text-sm text-gray-700 transition-colors hover:bg-blue-100 hover:text-blue-700",type:"button",onClick:l=>Q(o)},[s[27]||(s[27]=e("i",{class:"fas fa-tag text-xs text-gray-500"},null,-1)),$(" "+c(o),1)],8,Hs))),128))])])):b("",!0),e("div",null,[s[30]||(s[30]=e("div",{class:"mb-2 text-xs font-medium text-gray-600"},"创建新标签:",-1)),e("div",Ns,[S(e("input",{"onUpdate:modelValue":s[1]||(s[1]=o=>L.value=o),class:"form-input flex-1",placeholder:"输入新标签名称",type:"text",onKeypress:$e(re(F,["prevent"]),["enter"])},null,40,Ys),[[Y,L.value]]),e("button",{class:"rounded-lg bg-green-500 px-4 py-2 text-white transition-colors hover:bg-green-600",type:"button",onClick:F},s[29]||(s[29]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),s[31]||(s[31]=e("p",{class:"text-xs text-gray-500"},"用于标记不同团队或用途,方便筛选管理",-1))])]),e("div",Qs,[s[40]||(s[40]=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"},"速率限制设置 (可选)")],-1)),e("div",Js,[e("div",Xs,[e("div",null,[s[33]||(s[33]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700"},"时间窗口 (分钟)",-1)),S(e("input",{"onUpdate:modelValue":s[2]||(s[2]=o=>r.rateLimitWindow=o),class:"form-input w-full text-sm",min:"1",placeholder:"无限制",type:"number"},null,512),[[Y,r.rateLimitWindow]]),s[34]||(s[34]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500"},"时间段单位",-1))]),e("div",null,[s[35]||(s[35]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700"},"请求次数限制",-1)),S(e("input",{"onUpdate:modelValue":s[3]||(s[3]=o=>r.rateLimitRequests=o),class:"form-input w-full text-sm",min:"1",placeholder:"无限制",type:"number"},null,512),[[Y,r.rateLimitRequests]]),s[36]||(s[36]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500"},"窗口内最大请求",-1))]),e("div",null,[s[37]||(s[37]=e("label",{class:"mb-1 block text-xs font-medium text-gray-700"},"Token 限制",-1)),S(e("input",{"onUpdate:modelValue":s[4]||(s[4]=o=>r.tokenLimit=o),class:"form-input w-full text-sm",placeholder:"无限制",type:"number"},null,512),[[Y,r.tokenLimit]]),s[38]||(s[38]=e("p",{class:"ml-2 mt-0.5 text-xs text-gray-500"},"窗口内最大Token",-1))])]),s[39]||(s[39]=e("div",{class:"rounded-lg bg-blue-100 p-2"},[e("h5",{class:"mb-1 text-xs font-semibold text-blue-800"},"💡 使用示例"),e("div",{class:"space-y-0.5 text-xs text-blue-700"},[e("div",null,[e("strong",null,"示例1:"),$(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求 ")]),e("div",null,[e("strong",null,"示例2:"),$(" 时间窗口=1,Token=10000 → 每分钟最多10,000个Token ")]),e("div",null,[e("strong",null,"示例3:"),$(" 窗口=30,请求=50,Token=100000 → 每30分钟50次请求且不超10万Token ")])])],-1))])]),e("div",null,[s[42]||(s[42]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700"},"每日费用限制 (美元)",-1)),e("div",Zs,[e("div",el,[e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200",type:"button",onClick:s[5]||(s[5]=o=>r.dailyCostLimit="50")}," $50 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200",type:"button",onClick:s[6]||(s[6]=o=>r.dailyCostLimit="100")}," $100 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200",type:"button",onClick:s[7]||(s[7]=o=>r.dailyCostLimit="200")}," $200 "),e("button",{class:"rounded-lg bg-gray-100 px-3 py-1 text-sm font-medium hover:bg-gray-200",type:"button",onClick:s[8]||(s[8]=o=>r.dailyCostLimit="")}," 自定义 ")]),S(e("input",{"onUpdate:modelValue":s[9]||(s[9]=o=>r.dailyCostLimit=o),class:"form-input w-full",min:"0",placeholder:"0 表示无限制",step:"0.01",type:"number"},null,512),[[Y,r.dailyCostLimit]]),s[41]||(s[41]=e("p",{class:"text-xs text-gray-500"}," 设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制 ",-1))])]),e("div",null,[s[43]||(s[43]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700"},"并发限制",-1)),S(e("input",{"onUpdate:modelValue":s[10]||(s[10]=o=>r.concurrencyLimit=o),class:"form-input w-full",min:"0",placeholder:"0 表示无限制",type:"number"},null,512),[[Y,r.concurrencyLimit]]),s[44]||(s[44]=e("p",{class:"mt-2 text-xs text-gray-500"},"设置此 API Key 可同时处理的最大请求数",-1))]),e("div",null,[s[48]||(s[48]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700"},"服务权限",-1)),e("div",tl,[e("label",sl,[S(e("input",{"onUpdate:modelValue":s[11]||(s[11]=o=>r.permissions=o),class:"mr-2",type:"radio",value:"all"},null,512),[[me,r.permissions]]),s[45]||(s[45]=e("span",{class:"text-sm text-gray-700"},"全部服务",-1))]),e("label",ll,[S(e("input",{"onUpdate:modelValue":s[12]||(s[12]=o=>r.permissions=o),class:"mr-2",type:"radio",value:"claude"},null,512),[[me,r.permissions]]),s[46]||(s[46]=e("span",{class:"text-sm text-gray-700"},"仅 Claude",-1))]),e("label",ol,[S(e("input",{"onUpdate:modelValue":s[13]||(s[13]=o=>r.permissions=o),class:"mr-2",type:"radio",value:"gemini"},null,512),[[me,r.permissions]]),s[47]||(s[47]=e("span",{class:"text-sm text-gray-700"},"仅 Gemini",-1))])]),s[49]||(s[49]=e("p",{class:"mt-2 text-xs text-gray-500"},"控制此 API Key 可以访问哪些服务",-1))]),e("div",null,[e("div",nl,[s[50]||(s[50]=e("label",{class:"text-sm font-semibold text-gray-700"},"专属账号绑定",-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",disabled:q.value,title:"刷新账号列表",type:"button",onClick:J},[e("i",{class:T(["fas",q.value?"fa-spinner fa-spin":"fa-sync-alt","text-xs"])},null,2),e("span",null,c(q.value?"刷新中...":"刷新账号"),1)],8,il)]),e("div",al,[e("div",null,[s[51]||(s[51]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600"},"Claude 专属账号",-1)),pe(ke,{modelValue:r.claudeAccountId,"onUpdate:modelValue":s[14]||(s[14]=o=>r.claudeAccountId=o),accounts:A.value.claude,"default-option-text":"使用共享账号池",disabled:r.permissions==="gemini",groups:A.value.claudeGroups,placeholder:"请选择Claude账号",platform:"claude"},null,8,["modelValue","accounts","disabled","groups"])]),e("div",null,[s[52]||(s[52]=e("label",{class:"mb-1 block text-sm font-medium text-gray-600"},"Gemini 专属账号",-1)),pe(ke,{modelValue:r.geminiAccountId,"onUpdate:modelValue":s[15]||(s[15]=o=>r.geminiAccountId=o),accounts:A.value.gemini,"default-option-text":"使用共享账号池",disabled:r.permissions==="claude",groups:A.value.geminiGroups,placeholder:"请选择Gemini账号",platform:"gemini"},null,8,["modelValue","accounts","disabled","groups"])])]),s[53]||(s[53]=e("p",{class:"mt-2 text-xs text-gray-500"},"修改绑定账号将影响此API Key的请求路由",-1))]),e("div",null,[e("div",rl,[S(e("input",{id:"editEnableModelRestriction","onUpdate:modelValue":s[16]||(s[16]=o=>r.enableModelRestriction=o),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[fe,r.enableModelRestriction]]),s[54]||(s[54]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700",for:"editEnableModelRestriction"}," 启用模型限制 ",-1))]),r.enableModelRestriction?(a(),d("div",dl,[e("div",null,[s[57]||(s[57]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600"},"限制的模型列表",-1)),e("div",ul,[(a(!0),d(G,null,B(r.restrictedModels,(o,l)=>(a(),d("span",{key:l,class:"inline-flex items-center rounded-full bg-red-100 px-3 py-1 text-sm text-red-800"},[$(c(o)+" ",1),e("button",{class:"ml-2 text-red-600 hover:text-red-800",type:"button",onClick:p=>z(l)},s[55]||(s[55]=[e("i",{class:"fas fa-times text-xs"},null,-1)]),8,cl)]))),128)),r.restrictedModels.length===0?(a(),d("span",ml," 暂无限制的模型 ")):b("",!0)]),e("div",pl,[e("div",xl,[(a(!0),d(G,null,B(y.value,o=>(a(),d("button",{key:o,class:"flex-shrink-0 rounded-lg bg-gray-100 px-3 py-1 text-xs text-gray-700 transition-colors hover:bg-gray-200 sm:text-sm",type:"button",onClick:l=>x(o)},c(o),9,fl))),128)),y.value.length===0?(a(),d("span",gl," 所有常用模型已在限制列表中 ")):b("",!0)]),e("div",yl,[S(e("input",{"onUpdate:modelValue":s[17]||(s[17]=o=>r.modelInput=o),class:"form-input flex-1",placeholder:"输入模型名称,按回车添加",type:"text",onKeydown:$e(re(i,["prevent"]),["enter"])},null,40,bl),[[Y,r.modelInput]]),e("button",{class:"rounded-lg bg-red-500 px-4 py-2 text-white transition-colors hover:bg-red-600",type:"button",onClick:i},s[56]||(s[56]=[e("i",{class:"fas fa-plus"},null,-1)]))])]),s[58]||(s[58]=e("p",{class:"mt-2 text-xs text-gray-500"}," 设置此API Key无法访问的模型,例如:claude-opus-4-20250514 ",-1))])])):b("",!0)]),e("div",null,[e("div",vl,[S(e("input",{id:"editEnableClientRestriction","onUpdate:modelValue":s[18]||(s[18]=o=>r.enableClientRestriction=o),class:"h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox"},null,512),[[fe,r.enableClientRestriction]]),s[59]||(s[59]=e("label",{class:"ml-2 cursor-pointer text-sm font-semibold text-gray-700",for:"editEnableClientRestriction"}," 启用客户端限制 ",-1))]),r.enableClientRestriction?(a(),d("div",wl,[e("div",null,[s[60]||(s[60]=e("label",{class:"mb-2 block text-sm font-medium text-gray-600"},"允许的客户端",-1)),s[61]||(s[61]=e("p",{class:"mb-3 text-xs text-gray-500"},"勾选允许使用此API Key的客户端",-1)),e("div",hl,[(a(!0),d(G,null,B(E.value,o=>(a(),d("div",{key:o.id,class:"flex items-start"},[S(e("input",{id:`edit_client_${o.id}`,"onUpdate:modelValue":s[19]||(s[19]=l=>r.allowedClients=l),class:"mt-0.5 h-4 w-4 rounded border-gray-300 bg-gray-100 text-blue-600 focus:ring-blue-500",type:"checkbox",value:o.id},null,8,$l),[[fe,r.allowedClients]]),e("label",{class:"ml-2 flex-1 cursor-pointer",for:`edit_client_${o.id}`},[e("span",Cl,c(o.name),1),e("span",Al,c(o.description),1)],8,kl)]))),128))])])])):b("",!0)]),e("div",Kl,[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:s[20]||(s[20]=o=>D.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:w.value,type:"submit"},[w.value?(a(),d("div",Dl)):(a(),d("i",Ll)),$(" "+c(w.value?"保存中...":"保存修改"),1)],8,_l)])],32)])])]))}},Ml=de(Il,[["__scopeId","data-v-04f8bd5c"]]),Tl={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},Rl={class:"modal-content mx-auto flex max-h-[90vh] w-full max-w-md flex-col p-8"},Sl={class:"mb-6 flex items-center justify-between"},jl={class:"modal-scroll-content custom-scrollbar flex-1 space-y-6"},Pl={class:"rounded-lg border border-blue-200 bg-blue-50 p-4"},El={class:"flex items-start gap-3"},Vl={class:"text-sm text-gray-700"},ql={class:"mt-1 text-xs text-gray-600"},Ul={key:0,class:"mt-3"},Wl=["min"],Ol={key:1,class:"mt-2 text-xs text-gray-500"},Fl={class:"flex gap-3 pt-4"},Gl=["disabled"],zl={key:0,class:"loading-spinner mr-2"},Bl={key:1,class:"fas fa-clock mr-2"},Hl={__name:"RenewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close","success"],setup(f,{emit:W}){const m=f,R=W,I=C(!1),g=Ae({renewDuration:"30d",customExpireDate:"",newExpiresAt:null}),w=P(()=>{const v=new Date;return m.apiKey.expiresAt&&new Date(m.apiKey.expiresAt)>v?new Date(m.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"}),A=()=>{if(!g.renewDuration){g.newExpiresAt=null;return}if(g.renewDuration==="permanent"){g.newExpiresAt=null;return}if(g.renewDuration==="custom")return;const v=m.apiKey.expiresAt&&new Date(m.apiKey.expiresAt)>new Date?new Date(m.apiKey.expiresAt):new Date,r=g.renewDuration.match(/(\d+)([dhmy])/);if(r){const[,i,z]=r,k=parseInt(i);switch(z){case"d":v.setDate(v.getDate()+k);break;case"h":v.setHours(v.getHours()+k);break;case"m":v.setMonth(v.getMonth()+k);break;case"y":v.setFullYear(v.getFullYear()+k);break}g.newExpiresAt=v.toISOString()}},E=()=>{g.customExpireDate&&(g.newExpiresAt=new Date(g.customExpireDate).toISOString())},L=async()=>{I.value=!0;try{const v={expiresAt:g.renewDuration==="permanent"?null:g.newExpiresAt},K=await O.put(`/admin/api-keys/${m.apiKey.id}`,v);K.success?(V("API Key 续期成功","success"),R("success"),R("close")):V(K.message||"续期失败","error")}catch{V("续期失败","error")}finally{I.value=!1}};return A(),(v,K)=>(a(),le(xe,{to:"body"},[e("div",Tl,[e("div",Rl,[e("div",Sl,[K[5]||(K[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:K[0]||(K[0]=r=>v.$emit("close"))},K[4]||(K[4]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",jl,[e("div",Pl,[e("div",El,[K[7]||(K[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,[K[6]||(K[6]=e("h4",{class:"mb-1 font-semibold text-gray-800"},"API Key 信息",-1)),e("p",Vl,c(f.apiKey.name),1),e("p",ql," 当前过期时间:"+c(f.apiKey.expiresAt?q(f.apiKey.expiresAt):"永不过期"),1)])])]),e("div",null,[K[9]||(K[9]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700"},"续期时长",-1)),S(e("select",{"onUpdate:modelValue":K[1]||(K[1]=r=>g.renewDuration=r),class:"form-input w-full",onChange:A},K[8]||(K[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),[[ye,g.renewDuration]]),g.renewDuration==="custom"?(a(),d("div",Ul,[S(e("input",{"onUpdate:modelValue":K[2]||(K[2]=r=>g.customExpireDate=r),class:"form-input w-full",min:w.value,type:"datetime-local",onChange:E},null,40,Wl),[[Y,g.customExpireDate]])])):b("",!0),g.newExpiresAt?(a(),d("p",Ol," 新的过期时间:"+c(q(g.newExpiresAt)),1)):b("",!0)])]),e("div",Fl,[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:K[3]||(K[3]=r=>v.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-6 py-3 font-semibold",disabled:I.value||!g.renewDuration,type:"button",onClick:L},[I.value?(a(),d("div",zl)):(a(),d("i",Bl)),$(" "+c(I.value?"续期中...":"确认续期"),1)],8,Gl)])])])]))}},Nl=de(Hl,[["__scopeId","data-v-2fba52a3"]]),Yl={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},Ql={class:"modal-content custom-scrollbar mx-auto max-h-[90vh] w-full max-w-lg overflow-y-auto p-8"},Jl={class:"mb-6 space-y-4"},Xl={class:"rounded-lg border bg-gray-50 p-3"},Zl={class:"font-medium text-gray-900"},eo={key:0},to={class:"rounded-lg border bg-gray-50 p-3"},so={class:"text-gray-700"},lo={class:"relative"},oo={class:"flex min-h-[60px] items-center break-all rounded-lg border bg-gray-900 p-4 pr-14 font-mono text-sm text-white"},no={class:"absolute right-3 top-3"},io=["title"],ao={__name:"NewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close"],setup(f,{emit:W}){const m=f,R=W,I=C(!1),g=()=>{I.value=!I.value},w=()=>{const L=m.apiKey.apiKey||m.apiKey.key||"";return L?I.value||L.length<=12?L:L.substring(0,8)+"●".repeat(Math.max(0,L.length-12))+L.substring(L.length-4):""},q=async()=>{const L=m.apiKey.apiKey||m.apiKey.key||"";if(!L){V("API Key 不存在","error");return}try{await navigator.clipboard.writeText(L),V("API Key 已复制到剪贴板","success")}catch(v){console.error("Failed to copy:",v);const K=document.createElement("textarea");K.value=L,document.body.appendChild(K),K.select();try{document.execCommand("copy"),V("API Key 已复制到剪贴板","success")}catch{V("复制失败,请手动复制","error")}finally{document.body.removeChild(K)}}},A=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","取消")&&R("close"):confirm(`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。
|
||
|
||
确定要关闭吗?`)&&R("close")},E=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
建议您先复制API Key再关闭。`,"仍然关闭","返回复制")&&R("close"):confirm(`您还没有保存API Key,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&R("close")};return(L,v)=>(a(),le(xe,{to:"body"},[e("div",Yl,[e("div",Ql,[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"},"API Key 创建成功"),e("p",{class:"text-sm text-gray-600"},"请妥善保存您的 API Key")])],-1)),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600",title:"直接关闭(不推荐)",onClick:E},v[0]||(v[0]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),v[7]||(v[7]=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",Jl,[e("div",null,[v[2]||(v[2]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700"},"API Key 名称",-1)),e("div",Xl,[e("span",Zl,c(f.apiKey.name),1)])]),f.apiKey.description?(a(),d("div",eo,[v[3]||(v[3]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700"},"备注",-1)),e("div",to,[e("span",so,c(f.apiKey.description||"无描述"),1)])])):b("",!0),e("div",null,[v[4]||(v[4]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700"},"API Key",-1)),e("div",lo,[e("div",oo,c(w()),1),e("div",no,[e("button",{class:"btn-icon-sm bg-gray-700 hover:bg-gray-800",title:I.value?"隐藏API Key":"显示完整API Key",type:"button",onClick:g},[e("i",{class:T(["fas",I.value?"fa-eye-slash":"fa-eye","text-gray-300"])},null,2)],8,io)])]),v[5]||(v[5]=e("p",{class:"mt-2 text-xs text-gray-500"}," 点击眼睛图标切换显示模式,使用下方按钮复制完整 API Key ",-1))])]),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:q},v[6]||(v[6]=[e("i",{class:"fas fa-copy"},null,-1),$(" 复制 API Key ",-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:A}," 我已保存 ")])])])]))}},ro=de(ao,[["__scopeId","data-v-75e2b028"]]),uo={class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},co={class:"modal-content custom-scrollbar mx-auto max-h-[90vh] w-full max-w-2xl overflow-y-auto p-8"},mo={class:"mb-6 flex items-center justify-between"},po={class:"flex items-center gap-3"},xo={class:"text-sm text-gray-600"},fo={class:"mb-6 grid grid-cols-2 gap-4 md:grid-cols-4"},go={class:"rounded-lg border border-blue-200 bg-gradient-to-br from-blue-50 to-blue-100 p-4"},yo={class:"flex items-center justify-between"},bo={class:"mt-1 text-2xl font-bold text-blue-900"},vo={class:"rounded-lg border border-green-200 bg-gradient-to-br from-green-50 to-green-100 p-4"},wo={class:"flex items-center justify-between"},ho={class:"mt-1 truncate text-lg font-bold text-green-900"},$o={class:"rounded-lg border border-purple-200 bg-gradient-to-br from-purple-50 to-purple-100 p-4"},ko={class:"flex items-center justify-between"},Co={class:"mt-1 text-lg font-bold text-purple-900"},Ao={class:"rounded-lg border border-orange-200 bg-gradient-to-br from-orange-50 to-orange-100 p-4"},Ko={class:"flex items-center justify-between"},_o={class:"mt-1 text-lg font-bold text-orange-900"},Do={class:"mb-6"},Lo={class:"mb-3 flex items-center justify-between"},Io={class:"flex items-center gap-2"},Mo={key:0,class:"custom-scrollbar max-h-48 overflow-y-auto rounded-lg bg-gray-900 p-4"},To={class:"font-mono text-xs text-gray-300"},Ro={__name:"BatchApiKeyModal",props:{apiKeys:{type:Array,required:!0}},emits:["close"],setup(f,{emit:W}){const m=f,R=W,I=C(!1),g=P(()=>{if(m.apiKeys.length>0){const r=m.apiKeys[0],i=r.name.match(/^(.+)_\d+$/);return i?i[1]:r.name}return""}),w=()=>{if(m.apiKeys.length===0)return"未知";const r=m.apiKeys[0].permissions;return{all:"全部服务",claude:"仅 Claude",gemini:"仅 Gemini"}[r]||r},q=()=>{if(m.apiKeys.length===0)return"未知";const r=m.apiKeys[0].expiresAt;if(!r)return"永不过期";const i=new Date(r),k=Math.ceil((i-new Date)/(1e3*60*60*24));return k<=7?`${k}天`:k<=30?`${Math.ceil(k/7)}周`:k<=365?`${Math.ceil(k/30)}个月`:`${Math.ceil(k/365)}年`},A=()=>{I.value=!I.value},E=()=>{const i=m.apiKeys.slice(0,10).map(z=>`${z.name}: ${z.apiKey||z.key||""}`);return m.apiKeys.length>10&&i.push(`... 还有 ${m.apiKeys.length-10} 个 API Key`),i.join(`
|
||
`)},L=()=>{const r=m.apiKeys.map(x=>`${x.name}: ${x.apiKey||x.key||""}`).join(`
|
||
`),i=new Blob([r],{type:"text/plain;charset=utf-8"}),z=URL.createObjectURL(i),k=document.createElement("a");k.href=z;const y=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5);k.download=`api-keys-${g.value}-${y}.txt`,document.body.appendChild(k),k.click(),document.body.removeChild(k),URL.revokeObjectURL(z),V("API Keys 文件已下载","success")},v=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看这些 API Key,请确保已经下载并妥善保存。
|
||
|
||
确定要关闭吗?`,"确定关闭","返回下载")&&R("close"):confirm(`关闭后将无法再次查看这些 API Key,请确保已经下载并妥善保存。
|
||
|
||
确定要关闭吗?`)&&R("close")},K=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有下载 API Keys,关闭后将无法再次查看。
|
||
|
||
强烈建议您先下载保存。`,"仍然关闭","返回下载")&&R("close"):confirm(`您还没有下载 API Keys,关闭后将无法再次查看。
|
||
|
||
确定要关闭吗?`)&&R("close")};return(r,i)=>(a(),le(xe,{to:"body"},[e("div",uo,[e("div",co,[e("div",mo,[e("div",po,[i[1]||(i[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,[i[0]||(i[0]=e("h3",{class:"text-xl font-bold text-gray-900"},"批量创建成功",-1)),e("p",xo,"成功创建 "+c(f.apiKeys.length)+" 个 API Key",1)])]),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600",title:"直接关闭(不推荐)",onClick:K},i[2]||(i[2]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),i[14]||(i[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",fo,[e("div",go,[e("div",yo,[e("div",null,[i[3]||(i[3]=e("p",{class:"text-xs font-medium text-blue-600"},"创建数量",-1)),e("p",bo,c(f.apiKeys.length),1)]),i[4]||(i[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",vo,[e("div",wo,[e("div",null,[i[5]||(i[5]=e("p",{class:"text-xs font-medium text-green-600"},"基础名称",-1)),e("p",ho,c(g.value),1)]),i[6]||(i[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",$o,[e("div",ko,[e("div",null,[i[7]||(i[7]=e("p",{class:"text-xs font-medium text-purple-600"},"权限范围",-1)),e("p",Co,c(w()),1)]),i[8]||(i[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",Ao,[e("div",Ko,[e("div",null,[i[9]||(i[9]=e("p",{class:"text-xs font-medium text-orange-600"},"过期时间",-1)),e("p",_o,c(q()),1)]),i[10]||(i[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",Do,[e("div",Lo,[i[12]||(i[12]=e("label",{class:"text-sm font-semibold text-gray-700"},"API Keys 预览",-1)),e("div",Io,[e("button",{class:"flex items-center gap-1 text-xs text-blue-600 hover:text-blue-800",type:"button",onClick:A},[e("i",{class:T(["fas",I.value?"fa-eye-slash":"fa-eye"])},null,2),$(" "+c(I.value?"隐藏":"显示")+"预览 ",1)]),i[11]||(i[11]=e("span",{class:"text-xs text-gray-500"},"(最多显示前10个)",-1))])]),I.value?(a(),d("div",Mo,[e("pre",To,c(E()),1)])):b("",!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:L},i[13]||(i[13]=[e("i",{class:"fas fa-download"},null,-1),$(" 下载所有 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}," 我已保存 ")]),i[15]||(i[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))])])]))}},So=de(Ro,[["__scopeId","data-v-b0b904b9"]]),jo={key:0,class:"modal fixed inset-0 z-50 flex items-center justify-center p-4"},Po={class:"modal-content mx-auto w-full max-w-lg p-8"},Eo={class:"mb-6 flex items-center justify-between"},Vo={class:"flex items-center gap-3"},qo={class:"text-sm text-gray-600"},Uo={class:"space-y-6"},Wo={class:"rounded-lg border border-gray-200 bg-gradient-to-r from-gray-50 to-gray-100 p-4"},Oo={class:"flex items-center justify-between"},Fo={class:"text-sm font-semibold text-gray-800"},Go={class:"flex h-12 w-12 items-center justify-center rounded-lg bg-white shadow-sm"},zo={class:"mb-3 grid grid-cols-3 gap-2"},Bo=["onClick"],Ho={key:0,class:"animate-fadeIn"},No=["min"],Yo={key:1,class:"rounded-lg border border-blue-200 bg-gradient-to-r from-blue-50 to-indigo-50 p-4"},Qo={class:"flex items-center justify-between"},Jo={class:"text-sm font-semibold text-blue-900"},Xo={class:"flex gap-3 pt-2"},Zo=["disabled"],en={key:0,class:"loading-spinner mr-2"},tn={key:1,class:"fas fa-save mr-2"},sn={__name:"ExpiryEditModal",props:{show:{type:Boolean,required:!0},apiKey:{type:Object,required:!0}},emits:["close","save"],setup(f,{expose:W,emit:m}){const R=f,I=m,g=C(!1),w=Ae({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 年"}],A=P(()=>{const y=new Date;return y.setMinutes(y.getMinutes()+1),y.toISOString().slice(0,16)});he(()=>R.show,y=>{y&&E()}),he(()=>{var y;return(y=R.apiKey)==null?void 0:y.id},y=>{y&&R.show&&E()});const E=()=>{g.value=!1,R.apiKey.expiresAt?(w.expireDuration="custom",w.customExpireDate=new Date(R.apiKey.expiresAt).toISOString().slice(0,16),w.expiresAt=R.apiKey.expiresAt):(w.expireDuration="",w.customExpireDate="",w.expiresAt=null)},L=y=>{if(w.expireDuration=y,!y){w.expiresAt=null;return}if(y==="custom")return;const x=new Date,F=y.match(/(\d+)([dhmy])/);if(F){const[,Q,H]=F,X=parseInt(Q);switch(H){case"d":x.setDate(x.getDate()+X);break;case"h":x.setHours(x.getHours()+X);break;case"m":x.setMonth(x.getMonth()+X);break;case"y":x.setFullYear(x.getFullYear()+X);break}w.expiresAt=x.toISOString()}},v=()=>{w.customExpireDate&&(w.expiresAt=new Date(w.customExpireDate).toISOString())},K=y=>y?new Date(y).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",r=y=>y?new Date(y)<new Date:!1,i=y=>{if(!y)return null;const x=new Date,Q=new Date(y)-x,H=Math.ceil(Q/(1e3*60*60*24));return Q<0?{text:"已过期",class:"text-red-600"}:H<=7?{text:`${H} 天后过期`,class:"text-orange-600"}:H<=30?{text:`${H} 天后过期`,class:"text-yellow-600"}:{text:`${Math.ceil(H/30)} 个月后过期`,class:"text-green-600"}},z=()=>{g.value=!0,I("save",{keyId:R.apiKey.id,expiresAt:w.expiresAt})};return W({resetSaving:()=>{g.value=!1}}),(y,x)=>(a(),le(xe,{to:"body"},[f.show?(a(),d("div",jo,[e("div",Po,[e("div",Eo,[e("div",Vo,[x[5]||(x[5]=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,[x[4]||(x[4]=e("h3",{class:"text-xl font-bold text-gray-900"},"修改过期时间",-1)),e("p",qo,' 为 "'+c(f.apiKey.name||"API Key")+'" 设置新的过期时间 ',1)])]),e("button",{class:"text-gray-400 transition-colors hover:text-gray-600",onClick:x[0]||(x[0]=F=>y.$emit("close"))},x[6]||(x[6]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),e("div",Uo,[e("div",Wo,[e("div",Oo,[e("div",null,[x[9]||(x[9]=e("p",{class:"mb-1 text-xs font-medium text-gray-600"},"当前过期时间",-1)),e("p",Fo,[f.apiKey.expiresAt?(a(),d(G,{key:0},[$(c(K(f.apiKey.expiresAt))+" ",1),i(f.apiKey.expiresAt)?(a(),d("span",{key:0,class:T(["ml-2 text-xs font-normal",i(f.apiKey.expiresAt).class])}," ("+c(i(f.apiKey.expiresAt).text)+") ",3)):b("",!0)],64)):(a(),d(G,{key:1},[x[7]||(x[7]=e("i",{class:"fas fa-infinity mr-1 text-gray-500"},null,-1)),x[8]||(x[8]=$(" 永不过期 ",-1))],64))])]),e("div",Go,[e("i",{class:T(["fas fa-hourglass-half text-lg",f.apiKey.expiresAt&&r(f.apiKey.expiresAt)?"text-red-500":"text-gray-400"])},null,2)])])]),e("div",null,[x[11]||(x[11]=e("label",{class:"mb-3 block text-sm font-semibold text-gray-700"},"选择新的期限",-1)),e("div",zo,[(a(),d(G,null,B(q,F=>e("button",{key:F.value,class:T(["rounded-lg px-3 py-2 text-sm font-medium transition-all",w.expireDuration===F.value?"bg-blue-500 text-white shadow-md":"bg-gray-100 text-gray-700 hover:bg-gray-200"]),onClick:Q=>L(F.value)},c(F.label),11,Bo)),64)),e("button",{class:T(["rounded-lg px-3 py-2 text-sm font-medium transition-all",w.expireDuration==="custom"?"bg-blue-500 text-white shadow-md":"bg-gray-100 text-gray-700 hover:bg-gray-200"]),onClick:x[1]||(x[1]=F=>L("custom"))},x[10]||(x[10]=[e("i",{class:"fas fa-calendar-alt mr-1"},null,-1),$(" 自定义 ",-1)]),2)])]),w.expireDuration==="custom"?(a(),d("div",Ho,[x[12]||(x[12]=e("label",{class:"mb-2 block text-sm font-semibold text-gray-700"},"选择日期和时间",-1)),S(e("input",{"onUpdate:modelValue":x[2]||(x[2]=F=>w.customExpireDate=F),class:"form-input w-full",min:A.value,type:"datetime-local",onChange:v},null,40,No),[[Y,w.customExpireDate]]),x[13]||(x[13]=e("p",{class:"mt-2 text-xs text-gray-500"},"选择一个未来的日期和时间作为过期时间",-1))])):b("",!0),w.expiresAt!==f.apiKey.expiresAt?(a(),d("div",Yo,[e("div",Qo,[e("div",null,[x[16]||(x[16]=e("p",{class:"mb-1 text-xs font-medium text-blue-700"},[e("i",{class:"fas fa-arrow-right mr-1"}),$(" 新的过期时间 ")],-1)),e("p",Jo,[w.expiresAt?(a(),d(G,{key:0},[$(c(K(w.expiresAt))+" ",1),i(w.expiresAt)?(a(),d("span",{key:0,class:T(["ml-2 text-xs font-normal",i(w.expiresAt).class])}," ("+c(i(w.expiresAt).text)+") ",3)):b("",!0)],64)):(a(),d(G,{key:1},[x[14]||(x[14]=e("i",{class:"fas fa-infinity mr-1"},null,-1)),x[15]||(x[15]=$(" 永不过期 ",-1))],64))])]),x[17]||(x[17]=e("div",{class:"flex h-12 w-12 items-center justify-center rounded-lg bg-white shadow-sm"},[e("i",{class:"fas fa-check text-lg text-green-500"})],-1))])])):b("",!0),e("div",Xo,[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",onClick:x[3]||(x[3]=F=>y.$emit("close"))}," 取消 "),e("button",{class:"btn btn-primary flex-1 px-4 py-2.5 font-semibold",disabled:g.value||w.expiresAt===f.apiKey.expiresAt,onClick:z},[g.value?(a(),d("div",en)):(a(),d("i",tn)),$(" "+c(g.value?"保存中...":"保存更改"),1)],8,Zo)])])])])):b("",!0)]))}},ln=de(sn,[["__scopeId","data-v-cfb0d627"]]),on={key:0,class:"modal fixed inset-0 z-50 flex items-center justify-center p-3 sm:p-4"},nn={class:"modal-content relative mx-auto flex max-h-[90vh] w-[95%] max-w-2xl flex-col p-4 sm:w-full sm:max-w-3xl 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"},dn={class:"text-lg font-bold text-gray-900 sm:text-xl"},un={class:"modal-scroll-content custom-scrollbar flex-1 overflow-y-auto"},cn={class:"mb-6 grid grid-cols-1 gap-4 md:grid-cols-2"},mn={class:"rounded-lg border border-blue-200 bg-gradient-to-br from-blue-50 to-blue-100 p-4"},pn={class:"text-2xl font-bold text-gray-900"},xn={class:"mt-1 text-xs text-gray-600"},fn={class:"rounded-lg border border-green-200 bg-gradient-to-br from-green-50 to-green-100 p-4"},gn={class:"text-2xl font-bold text-gray-900"},yn={class:"mt-1 text-xs text-gray-600"},bn={class:"rounded-lg border border-yellow-200 bg-gradient-to-br from-yellow-50 to-yellow-100 p-4"},vn={class:"text-2xl font-bold text-gray-900"},wn={class:"mt-1 text-xs text-gray-600"},hn={class:"rounded-lg border border-purple-200 bg-gradient-to-br from-purple-50 to-purple-100 p-4"},$n={class:"space-y-1 text-sm"},kn={class:"flex justify-between"},Cn={class:"font-semibold"},An={class:"flex justify-between"},Kn={class:"font-semibold"},_n={class:"mb-6"},Dn={class:"space-y-3 rounded-lg bg-gray-50 p-4"},Ln={class:"flex items-center justify-between"},In={class:"text-sm font-semibold text-gray-900"},Mn={class:"flex items-center justify-between"},Tn={class:"text-sm font-semibold text-gray-900"},Rn={key:0,class:"flex items-center justify-between"},Sn={class:"text-sm font-semibold text-purple-600"},jn={key:1,class:"flex items-center justify-between"},Pn={class:"text-sm font-semibold text-purple-600"},En={key:0,class:"mb-6"},Vn={class:"space-y-3 rounded-lg bg-gray-50 p-4"},qn={key:0,class:"space-y-2"},Un={class:"flex items-center justify-between text-sm"},Wn={class:"font-semibold text-gray-900"},On={class:"h-2 w-full rounded-full bg-gray-200"},Fn={class:"text-right text-xs text-gray-500"},Gn={key:1,class:"flex items-center justify-between text-sm"},zn={class:"font-semibold text-purple-600"},Bn={key:2,class:"space-y-2"},Hn={class:"flex items-center justify-between text-sm"},Nn={class:"font-semibold text-indigo-600"},Yn={key:0,class:"space-y-1"},Qn={class:"flex items-center justify-between text-sm"},Jn={class:"font-semibold text-gray-900"},Xn={class:"h-2 w-full rounded-full bg-gray-200"},Zn={key:1,class:"space-y-1"},ei={class:"flex items-center justify-between text-sm"},ti={class:"font-semibold text-gray-900"},si={class:"h-2 w-full rounded-full bg-gray-200"},li={__name:"UsageDetailModal",props:{show:{type:Boolean,required:!0},apiKey:{type:Object,required:!0}},emits:["close"],setup(f,{emit:W}){const m=f,R=W,I=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.total)==null?void 0:o.requests)||0}),g=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.daily)==null?void 0:o.requests)||0}),w=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.total)==null?void 0:o.tokens)||0}),q=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.daily)==null?void 0:o.tokens)||0}),A=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.total)==null?void 0:o.cost)||0}),E=P(()=>m.apiKey.dailyCost||0),L=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.total)==null?void 0:o.inputTokens)||0}),v=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.total)==null?void 0:o.outputTokens)||0}),K=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.total)==null?void 0:o.cacheCreateTokens)||0}),r=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.total)==null?void 0:o.cacheReadTokens)||0}),i=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.averages)==null?void 0:o.rpm)||0}),z=P(()=>{var s,o;return((o=(s=m.apiKey.usage)==null?void 0:s.averages)==null?void 0:o.tpm)||0}),k=P(()=>m.apiKey.dailyCostLimit>0||m.apiKey.concurrencyLimit>0||m.apiKey.rateLimitWindow>0||m.apiKey.tokenLimit>0),y=P(()=>!m.apiKey.dailyCostLimit||m.apiKey.dailyCostLimit===0?0:E.value/m.apiKey.dailyCostLimit*100),x=P(()=>{if(!m.apiKey.rateLimitRequests||m.apiKey.rateLimitRequests===0)return 0;const s=(m.apiKey.currentWindowRequests||0)/m.apiKey.rateLimitRequests*100;return Math.min(s,100)}),F=P(()=>{const s=x.value;return s>=100?"bg-red-500":s>=80?"bg-yellow-500":"bg-blue-500"}),Q=P(()=>{if(!m.apiKey.tokenLimit||m.apiKey.tokenLimit===0)return 0;const s=(m.apiKey.currentWindowTokens||0)/m.apiKey.tokenLimit*100;return Math.min(s,100)}),H=P(()=>{const s=Q.value;return s>=100?"bg-red-500":s>=80?"bg-yellow-500":"bg-purple-500"}),X=s=>!s&&s!==0?"0":s.toLocaleString("zh-CN"),J=s=>s>=1e6?(s/1e6).toFixed(1)+"M":s>=1e3?(s/1e3).toFixed(1)+"K":s.toString(),D=()=>{R("close")};return(s,o)=>(a(),le(xe,{to:"body"},[f.show?(a(),d("div",on,[e("div",{class:"fixed inset-0 bg-gray-900 bg-opacity-50 backdrop-blur-sm",onClick:D}),e("div",nn,[e("div",an,[e("div",rn,[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",dn," 使用统计详情 - "+c(f.apiKey.name),1)]),e("button",{class:"p-1 text-gray-400 transition-colors hover:text-gray-600",onClick:D},o[1]||(o[1]=[e("i",{class:"fas fa-times text-lg sm:text-xl"},null,-1)]))]),e("div",un,[e("div",cn,[e("div",mn,[o[2]||(o[2]=e("div",{class:"mb-3 flex items-center justify-between"},[e("span",{class:"text-sm font-medium text-gray-700"},"总请求数"),e("i",{class:"fas fa-paper-plane text-blue-500"})],-1)),e("div",pn,c(X(I.value)),1),e("div",xn," 今日: "+c(X(g.value))+" 次 ",1)]),e("div",fn,[o[3]||(o[3]=e("div",{class:"mb-3 flex items-center justify-between"},[e("span",{class:"text-sm font-medium text-gray-700"},"总Token数"),e("i",{class:"fas fa-coins text-green-500"})],-1)),e("div",gn,c(J(w.value)),1),e("div",yn," 今日: "+c(J(q.value)),1)]),e("div",bn,[o[4]||(o[4]=e("div",{class:"mb-3 flex items-center justify-between"},[e("span",{class:"text-sm font-medium text-gray-700"},"总费用"),e("i",{class:"fas fa-dollar-sign text-yellow-600"})],-1)),e("div",vn,"$"+c(A.value.toFixed(4)),1),e("div",wn,"今日: $"+c(E.value.toFixed(4)),1)]),e("div",hn,[o[7]||(o[7]=e("div",{class:"mb-3 flex items-center justify-between"},[e("span",{class:"text-sm font-medium text-gray-700"},"平均速率"),e("i",{class:"fas fa-tachometer-alt text-purple-500"})],-1)),e("div",$n,[e("div",kn,[o[5]||(o[5]=e("span",{class:"text-gray-600"},"RPM:",-1)),e("span",Cn,c(i.value),1)]),e("div",An,[o[6]||(o[6]=e("span",{class:"text-gray-600"},"TPM:",-1)),e("span",Kn,c(z.value),1)])])])]),e("div",_n,[o[12]||(o[12]=e("h4",{class:"mb-3 flex items-center text-sm font-semibold text-gray-700"},[e("i",{class:"fas fa-chart-pie mr-2 text-indigo-500"}),$(" Token 使用分布 ")],-1)),e("div",Dn,[e("div",Ln,[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"},"输入 Token")],-1)),e("span",In,c(J(L.value)),1)]),e("div",Mn,[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"},"输出 Token")],-1)),e("span",Tn,c(J(v.value)),1)]),K.value>0?(a(),d("div",Rn,[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"},"缓存创建 Token")],-1)),e("span",Sn,c(J(K.value)),1)])):b("",!0),r.value>0?(a(),d("div",jn,[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"},"缓存读取 Token")],-1)),e("span",Pn,c(J(r.value)),1)])):b("",!0)])]),k.value?(a(),d("div",En,[o[18]||(o[18]=e("h4",{class:"mb-3 flex items-center text-sm font-semibold text-gray-700"},[e("i",{class:"fas fa-shield-alt mr-2 text-red-500"}),$(" 限制设置 ")],-1)),e("div",Vn,[f.apiKey.dailyCostLimit>0?(a(),d("div",qn,[e("div",Un,[o[13]||(o[13]=e("span",{class:"text-gray-600"},"每日费用限制",-1)),e("span",Wn," $"+c(f.apiKey.dailyCostLimit.toFixed(2)),1)]),e("div",On,[e("div",{class:T(["h-2 rounded-full transition-all duration-300",y.value>=100?"bg-red-500":y.value>=80?"bg-yellow-500":"bg-green-500"]),style:ie({width:Math.min(y.value,100)+"%"})},null,6)]),e("div",Fn," 已使用 "+c(y.value.toFixed(1))+"% ",1)])):b("",!0),f.apiKey.concurrencyLimit>0?(a(),d("div",Gn,[o[14]||(o[14]=e("span",{class:"text-gray-600"},"并发限制",-1)),e("span",zn,c(f.apiKey.currentConcurrency||0)+" / "+c(f.apiKey.concurrencyLimit),1)])):b("",!0),f.apiKey.rateLimitWindow>0?(a(),d("div",Bn,[e("div",Hn,[o[15]||(o[15]=e("span",{class:"text-gray-600"},"时间窗口",-1)),e("span",Nn,c(f.apiKey.rateLimitWindow)+" 分钟 ",1)]),f.apiKey.rateLimitRequests>0?(a(),d("div",Yn,[e("div",Qn,[o[16]||(o[16]=e("span",{class:"text-gray-600"},"请求限制",-1)),e("span",Jn,c(f.apiKey.currentWindowRequests||0)+" / "+c(f.apiKey.rateLimitRequests),1)]),e("div",Xn,[e("div",{class:T(["h-2 rounded-full transition-all duration-300",F.value]),style:ie({width:x.value+"%"})},null,6)])])):b("",!0),f.apiKey.tokenLimit>0?(a(),d("div",Zn,[e("div",ei,[o[17]||(o[17]=e("span",{class:"text-gray-600"},"Token限制",-1)),e("span",ti,c(J(f.apiKey.currentWindowTokens||0))+" / "+c(J(f.apiKey.tokenLimit)),1)]),e("div",si,[e("div",{class:T(["h-2 rounded-full transition-all duration-300",H.value]),style:ie({width:Q.value+"%"})},null,6)])])):b("",!0)])):b("",!0)])])):b("",!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:D}," 关闭 ")])])])):b("",!0)]))}},oi=de(li,[["__scopeId","data-v-388cff35"]]),ni={class:"tab-content"},ii={class:"card p-4 sm:p-6"},ai={class:"mb-4 flex flex-col gap-4 sm:mb-6"},ri={class:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"},di={class:"flex flex-wrap items-center gap-2"},ui=["value"],ci={key:0,class:"py-12 text-center"},mi={key:1,class:"py-12 text-center"},pi={key:2,class:"table-container hidden md:block"},xi={class:"w-full table-fixed"},fi={class:"bg-gray-50/80 backdrop-blur-sm"},gi={key:1,class:"fas fa-sort ml-1 text-gray-400"},yi={key:1,class:"fas fa-sort ml-1 text-gray-400"},bi={class:"w-[17%] min-w-[140px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700"},vi={key:1,class:"fas fa-sort ml-1 text-gray-400"},wi={key:1,class:"fas fa-sort ml-1 text-gray-400"},hi={key:1,class:"fas fa-sort ml-1 text-gray-400"},$i={class:"divide-y divide-gray-200/50"},ki={class:"table-row"},Ci={class:"px-3 py-4"},Ai={class:"flex items-center"},Ki={class:"min-w-0"},_i=["title"],Di=["title"],Li={class:"mt-1 truncate text-xs text-gray-500"},Ii=["title"],Mi={key:1},Ti={class:"px-3 py-4"},Ri={class:"flex flex-wrap gap-1"},Si={key:0,class:"text-xs text-gray-400"},ji={class:"whitespace-nowrap px-3 py-4"},Pi={class:"px-3 py-4"},Ei={class:"space-y-2"},Vi={class:"mb-2"},qi={class:"mb-1 flex items-center justify-between text-sm"},Ui={class:"font-semibold text-gray-900"},Wi={class:"flex items-center justify-between text-sm"},Oi={class:"font-semibold text-green-600"},Fi={key:0,class:"space-y-1"},Gi={class:"flex items-center justify-between text-xs"},zi={class:"text-gray-700"},Bi={class:"h-1.5 w-full rounded-full bg-gray-200"},Hi={key:1,class:"space-y-1"},Ni={class:"flex items-center justify-between text-xs"},Yi={class:"text-gray-700"},Qi={key:0,class:"space-y-0.5"},Ji={class:"flex items-center justify-between text-xs"},Xi={class:"text-gray-600"},Zi={class:"h-1 w-full rounded-full bg-gray-200"},ea={key:1,class:"space-y-0.5"},ta={class:"flex items-center justify-between text-xs"},sa={class:"text-gray-600"},la={class:"h-1 w-full rounded-full bg-gray-200"},oa={class:"pt-1"},na=["onClick"],ia={class:"whitespace-nowrap px-3 py-4 text-sm text-gray-500"},aa={class:"whitespace-nowrap px-3 py-4 text-sm"},ra={class:"inline-flex items-center gap-1.5"},da={key:0},ua={key:0,class:"inline-flex items-center text-red-600"},ca={key:1,class:"inline-flex items-center text-orange-600"},ma={key:2,class:"text-gray-600"},pa={key:1,class:"inline-flex items-center text-gray-400"},xa=["onClick"],fa={class:"whitespace-nowrap px-3 py-4 text-sm"},ga={class:"flex gap-1"},ya=["onClick"],ba=["onClick"],va=["onClick"],wa=["onClick"],ha=["onClick"],$a={key:0},ka={class:"bg-gray-50 px-3 py-4",colspan:"7"},Ca={key:0,class:"py-4 text-center"},Aa={class:"space-y-4"},Ka={class:"mb-4 flex items-center justify-between"},_a={class:"flex items-center gap-2"},Da={key:0,class:"rounded-full bg-gray-100 px-2 py-1 text-xs text-gray-500"},La={class:"flex items-center gap-1"},Ia={class:"flex gap-1 rounded bg-gray-100 p-1"},Ma=["onClick"],Ta={key:0,class:"py-8 text-center"},Ra={class:"mb-3 flex items-center justify-center gap-2"},Sa=["onClick"],ja={key:1,class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"},Pa={class:"mb-3 flex items-start justify-between"},Ea={class:"flex-1"},Va={class:"mb-1 block text-sm font-semibold text-gray-800"},qa={class:"rounded-full bg-blue-50 px-2 py-1 text-xs text-gray-500"},Ua={class:"mb-3 space-y-2"},Wa={class:"flex items-center justify-between text-sm"},Oa={class:"font-semibold text-gray-900"},Fa={class:"flex items-center justify-between text-sm"},Ga={class:"font-semibold text-green-600"},za={class:"mt-2 border-t border-gray-100 pt-2"},Ba={class:"flex items-center justify-between text-xs text-gray-500"},Ha={class:"font-medium"},Na={class:"flex items-center justify-between text-xs text-gray-500"},Ya={class:"font-medium"},Qa={key:0,class:"flex items-center justify-between text-xs text-purple-600"},Ja={class:"font-medium"},Xa={key:1,class:"flex items-center justify-between text-xs text-purple-600"},Za={class:"font-medium"},er={class:"mt-3 h-2 w-full rounded-full bg-gray-200"},tr={class:"mt-1 text-right"},sr={class:"text-xs font-medium text-indigo-600"},lr={key:2,class:"mt-4 rounded-lg border border-indigo-100 bg-gradient-to-r from-indigo-50 to-purple-50 p-3"},or={class:"flex items-center justify-between text-sm"},nr={class:"flex gap-4 text-xs"},ir={class:"text-gray-600"},ar={class:"font-semibold text-gray-800"},rr={class:"text-gray-600"},dr={class:"font-semibold text-gray-800"},ur={key:3,class:"space-y-3 md:hidden"},cr={class:"mb-3 flex items-start justify-between"},mr={class:"flex items-center gap-3"},pr={class:"text-sm font-semibold text-gray-900"},xr={class:"mt-0.5 text-xs text-gray-500"},fr={class:"mb-3 text-xs text-gray-600"},gr={key:0},yr={key:1},br={class:"mb-3 space-y-2"},vr={class:"rounded-lg bg-gray-50 p-3"},wr={class:"mb-2 flex items-center justify-between"},hr=["onClick"],$r={class:"grid grid-cols-2 gap-3"},kr={class:"text-sm font-semibold text-gray-900"},Cr={class:"text-sm font-semibold text-green-600"},Ar={key:0,class:"space-y-1"},Kr={class:"flex items-center justify-between text-xs"},_r={class:"text-gray-700"},Dr={class:"h-2 w-full rounded-full bg-gray-200"},Lr={key:1,class:"space-y-1"},Ir={class:"mb-1 text-xs text-gray-500"},Mr={key:0,class:"flex items-center gap-2"},Tr={class:"flex-1"},Rr={class:"h-1.5 w-full rounded-full bg-gray-200"},Sr={class:"w-16 text-right text-xs text-gray-600"},jr={key:1,class:"flex items-center gap-2"},Pr={class:"flex-1"},Er={class:"h-1.5 w-full rounded-full bg-gray-200"},Vr={class:"w-16 text-right text-xs text-gray-600"},qr={class:"mb-3 text-xs text-gray-500"},Ur={class:"mb-1 flex justify-between"},Wr={class:"flex items-center justify-between"},Or={class:"flex items-center gap-1"},Fr=["onClick"],Gr={key:0,class:"mb-3 flex flex-wrap gap-1"},zr={class:"mt-3 flex gap-2 border-t border-gray-100 pt-3"},Br=["onClick"],Hr=["onClick"],Nr=["onClick"],Yr=["onClick"],Qr={key:4,class:"mt-4 flex flex-col items-center justify-between gap-4 sm:mt-6 sm:flex-row"},Jr={class:"flex w-full flex-col items-center gap-3 sm:w-auto sm:flex-row"},Xr={class:"text-xs text-gray-600 sm:text-sm"},Zr={class:"flex items-center gap-2"},ed=["value"],td={class:"flex items-center gap-2"},sd=["disabled"],ld={class:"flex items-center gap-1"},od={key:1,class:"hidden px-2 text-gray-500 sm:inline"},nd=["onClick"],id={key:2,class:"hidden px-2 text-gray-500 sm:inline"},ad=["disabled"],rd={__name:"ApiKeysView",setup(f){const W=Me(),m=C([]),R=C(!1),I=C("today"),g=C(""),w=C("asc"),q=C({}),A=C({}),E=C({}),L=C([new Date(2e3,1,1,0,0,0),new Date(2e3,2,1,23,59,59)]),v=C({claude:[],gemini:[],claudeGroups:[],geminiGroups:[]}),K=C(null),r=C(null),i=C(!1),z=C(null),k=C(""),y=C([]),x=C(1),F=C(10),Q=[10,20,50,100],H=C(!1),X=C(!1),J=C(!1),D=C(!1),s=C(!1),o=C(null),l=C(null),p=C(null),N=C([]),ee=P(()=>{let u=m.value;return k.value&&(u=m.value.filter(h=>h.tags&&h.tags.includes(k.value))),g.value?[...u].sort((h,n)=>{let M=h[g.value],U=n[g.value];return g.value==="status"?(M=h.isActive?1:0,U=n.isActive?1:0):g.value==="cost"?(M=parseFloat(Te(h.usage).replace("$","")),U=parseFloat(Te(n.usage).replace("$",""))):(g.value==="createdAt"||g.value==="expiresAt")&&(M=M?new Date(M).getTime():0,U=U?new Date(U).getTime():0),M<U?w.value==="asc"?-1:1:M>U?w.value==="asc"?1:-1:0}):u}),j=P(()=>{const u=ee.value.length;return Math.ceil(u/F.value)||0}),te=P(()=>{const u=[],t=x.value,h=j.value;if(h<=7)for(let n=1;n<=h;n++)u.push(n);else{let n=Math.max(1,t-2),M=Math.min(h,t+2);t<=3?M=5:t>=h-2&&(n=h-4);for(let U=n;U<=M;U++)u.push(U)}return u}),Z=P(()=>{const u=(x.value-1)*F.value,t=u+F.value;return ee.value.slice(u,t)}),se=async()=>{try{const[u,t,h,n]=await Promise.all([O.get("/admin/claude-accounts"),O.get("/admin/claude-console-accounts"),O.get("/admin/gemini-accounts"),O.get("/admin/account-groups")]);if(u.success&&(v.value.claude=u.data||[]),t.success){const M=(t.data||[]).map(U=>({...U,platform:"claude-console"}));v.value.claude=[...v.value.claude,...M]}if(h.success&&(v.value.gemini=h.data||[]),n.success){const M=n.data||[];v.value.claudeGroups=M.filter(U=>U.platform==="claude"),v.value.geminiGroups=M.filter(U=>U.platform==="gemini")}}catch(u){console.error("加载账户列表失败:",u)}},oe=async()=>{R.value=!0;try{const u=await O.get(`/admin/api-keys?timeRange=${I.value}`);if(u.success){m.value=u.data||[];const t=new Set;m.value.forEach(h=>{h.tags&&Array.isArray(h.tags)&&h.tags.forEach(n=>t.add(n))}),y.value=Array.from(t).sort()}}catch{V("加载 API Keys 失败","error")}finally{R.value=!1}},ne=u=>{g.value===u?w.value=w.value==="asc"?"desc":"asc":(g.value=u,w.value="asc")},ge=u=>!u&&u!==0?"0":u.toLocaleString("zh-CN"),Te=u=>!u||!u.total?"$0.0000":`$${(u.total.cost||0).toFixed(4)}`,Ke=u=>{if(!u)return"未知账户";if(u.startsWith("group:")){const n=u.substring(6),M=v.value.claudeGroups.find(_=>_.id===n);if(M)return`分组-${M.name}`;const U=v.value.geminiGroups.find(_=>_.id===n);return U?`分组-${U.name}`:`分组-${n.substring(0,8)}`}const t=v.value.claude.find(n=>n.id===u);if(t)return`账户-${t.name}`;const h=v.value.gemini.find(n=>n.id===u);return h?`账户-${h.name}`:`账户-${u.substring(0,8)}`},be=u=>u?new Date(u)<new Date:!1,ve=u=>!u||be(u)?!1:(new Date(u)-new Date)/(1e3*60*60*24)<=7,Re=u=>u?new Date(u).toLocaleDateString("zh-CN"):"",Ne=async u=>{q.value[u]?q.value[u]=!1:(q.value[u]=!0,E.value[u]||je(u),await we(u,!0))},we=async(u,t=!1)=>{if(!t&&A.value[u]&&A.value[u].length>0)return;const h=ue(u);try{let n=`/admin/api-keys/${u}/model-stats`;const M=new URLSearchParams;if(h.customStart&&h.customEnd)M.append("startDate",h.customStart),M.append("endDate",h.customEnd),M.append("period","custom");else{const _=h.preset==="today"||h.preset==="7days"?"daily":"monthly";M.append("period",_)}n+="?"+M.toString();const U=await O.get(n);U.success&&(A.value[u]=U.data||[])}catch{V("加载模型统计失败","error"),A.value[u]=[]}},Se=(u,t)=>{const h=t.reduce((n,M)=>n+(M.allTokens||0),0);return h===0?0:Math.round(u/h*100)},Ye=u=>u.formatted&&u.formatted.total?u.formatted.total:u.cost!==void 0?`$${u.cost.toFixed(6)}`:"$0.000000",je=u=>{const t=new Date,h=new Date(t);h.setDate(t.getDate()-6),E.value[u]={type:"preset",preset:"7days",customStart:h.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}]}},ue=u=>(E.value[u]||je(u),E.value[u]),Pe=(u,t)=>{const h=ue(t);h.type="preset",h.preset=u;const n=h.presetOptions.find(M=>M.value===u);if(n){const M=new Date,U=new Date(M);U.setDate(M.getDate()-(n.days-1)),h.customStart=U.toISOString().split("T")[0],h.customEnd=M.toISOString().split("T")[0];const _=ce=>ce.getFullYear()+"-"+String(ce.getMonth()+1).padStart(2,"0")+"-"+String(ce.getDate()).padStart(2,"0")+" 00:00:00";h.customRange=[_(U),_(M)]}we(t,!0)},Qe=(u,t)=>{const h=ue(u);t&&t.length===2?(h.type="custom",h.preset="",h.customRange=t,h.customStart=t[0].split(" ")[0],h.customEnd=t[1].split(" ")[0],we(u,!0)):t===null&&Pe("7days",u)},Je=u=>u>new Date,Xe=u=>{const t=ue(u);t.type="preset",t.preset="7days";const h=new Date,n=new Date(h);n.setDate(h.getDate()-6),t.customStart=n.toISOString().split("T")[0],t.customEnd=h.toISOString().split("T")[0],t.customRange=null,we(u,!0),V("已重置筛选条件并刷新数据","info")},Ze=async()=>{await se(),H.value=!0},Ee=async u=>{await se(),o.value=u,X.value=!0},Ve=u=>{l.value=u,J.value=!0},et=u=>{H.value=!1,p.value=u,D.value=!0,oe()},tt=u=>{H.value=!1,N.value=u,s.value=!0,oe()},st=()=>{X.value=!1,V("API Key 更新成功","success"),oe()},lt=()=>{J.value=!1,V("API Key 续期成功","success"),oe()},qe=async u=>{let t=!1;if(window.showConfirm?t=await window.showConfirm("删除 API Key","确定要删除这个 API Key 吗?此操作不可恢复。","确定删除","取消"):t=confirm("确定要删除这个 API Key 吗?此操作不可恢复。"),!!t)try{const h=await O.delete(`/admin/api-keys/${u}`);h.success?(V("API Key 已删除","success"),oe()):V(h.message||"删除失败","error")}catch{V("删除失败","error")}},ot=u=>{const h=`${window.location.origin}/admin-next/api-stats?apiId=${u.id}`,n=document.createElement("textarea");n.value=h,n.style.position="fixed",n.style.opacity="0",n.style.left="-9999px",document.body.appendChild(n),n.select(),n.setSelectionRange(0,99999);try{document.execCommand("copy")?V("已复制统计页面链接","success"):(V("复制失败,请手动复制","error"),console.log("统计页面链接:",h))}catch(M){V("复制失败,请手动复制","error"),console.error("复制错误:",M),console.log("统计页面链接:",h)}finally{document.body.removeChild(n)}},Ue=u=>{K.value=u},We=()=>{K.value=null},nt=async({keyId:u,expiresAt:t})=>{try{const h=await O.put(`/admin/api-keys/${u}`,{expiresAt:t||null});if(h.success){V("过期时间已更新","success");const n=m.value.find(M=>M.id===u);n&&(n.expiresAt=t||null),We()}else V(h.message||"更新失败","error"),r.value&&r.value.resetSaving()}catch{V("更新失败","error"),r.value&&r.value.resetSaving()}},Oe=u=>u?new Date(u).toLocaleDateString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).replace(/\//g,"-"):"",_e=u=>{if(!u.dailyCostLimit||u.dailyCostLimit===0)return 0;const t=(u.dailyCost||0)/u.dailyCostLimit*100;return Math.min(t,100)},Fe=u=>{const t=_e(u);return t>=100?"bg-red-500":t>=80?"bg-yellow-500":"bg-green-500"},De=u=>{z.value=u,i.value=!0},ae=u=>u>=1e6?(u/1e6).toFixed(1)+"M":u>=1e3?(u/1e3).toFixed(1)+"K":u.toString(),Le=u=>{if(!u.rateLimitRequests||u.rateLimitRequests===0)return 0;const t=(u.currentWindowRequests||0)/u.rateLimitRequests*100;return Math.min(t,100)},Ge=u=>{const t=Le(u);return t>=100?"bg-red-500":t>=80?"bg-yellow-500":"bg-blue-500"},Ie=u=>{if(!u.tokenLimit||u.tokenLimit===0)return 0;const t=(u.currentWindowTokens||0)/u.tokenLimit*100;return Math.min(t,100)},ze=u=>{const t=Ie(u);return t>=100?"bg-red-500":t>=80?"bg-yellow-500":"bg-purple-500"};return he([k,I],()=>{x.value=1}),Ce(async()=>{await Promise.all([W.loadSupportedClients(),se(),oe()])}),(u,t)=>{const h=it;return a(),d("div",ni,[e("div",ii,[e("div",ai,[t[24]||(t[24]=e("div",null,[e("h3",{class:"mb-1 text-lg font-bold text-gray-900 sm:mb-2 sm:text-xl"},"API Keys 管理"),e("p",{class:"text-sm text-gray-600 sm:text-base"},"管理和监控您的 API 密钥")],-1)),e("div",ri,[e("div",di,[S(e("select",{"onUpdate:modelValue":t[0]||(t[0]=n=>I.value=n),class:"rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-700 transition-colors hover:border-gray-300 focus:border-transparent focus:outline-none focus:ring-2 focus:ring-blue-500",onChange:t[1]||(t[1]=n=>oe())},t[21]||(t[21]=[e("option",{value:"today"},"今日",-1),e("option",{value:"7days"},"最近7天",-1),e("option",{value:"monthly"},"本月",-1),e("option",{value:"all"},"全部时间",-1)]),544),[[ye,I.value]]),S(e("select",{"onUpdate:modelValue":t[2]||(t[2]=n=>k.value=n),class:"rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-700 transition-colors hover:border-gray-300 focus:border-transparent focus:outline-none focus:ring-2 focus:ring-blue-500",onChange:t[3]||(t[3]=n=>x.value=1)},[t[22]||(t[22]=e("option",{value:""},"所有标签",-1)),(a(!0),d(G,null,B(y.value,n=>(a(),d("option",{key:n,value:n},c(n),9,ui))),128))],544),[[ye,k.value]])]),e("button",{class:"btn btn-primary flex w-full items-center justify-center gap-2 px-4 py-2 text-sm sm:w-auto",onClick:re(Ze,["stop"])},t[23]||(t[23]=[e("i",{class:"fas fa-plus"},null,-1),$("创建新 Key ",-1)]))])]),R.value?(a(),d("div",ci,t[25]||(t[25]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500"},"正在加载 API Keys...",-1)]))):m.value.length===0?(a(),d("div",mi,t[26]||(t[26]=[e("div",{class:"mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-gray-100"},[e("i",{class:"fas fa-key text-xl text-gray-400"})],-1),e("p",{class:"text-lg text-gray-500"},"暂无 API Keys",-1),e("p",{class:"mt-2 text-sm text-gray-400"},"点击上方按钮创建您的第一个 API Key",-1)]))):(a(),d("div",pi,[e("table",xi,[e("thead",fi,[e("tr",null,[e("th",{class:"w-[25%] min-w-[200px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100",onClick:t[4]||(t[4]=n=>ne("name"))},[t[27]||(t[27]=$(" 名称 ",-1)),g.value==="name"?(a(),d("i",{key:0,class:T(["fas",w.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(a(),d("i",gi))]),t[34]||(t[34]=e("th",{class:"w-[10%] min-w-[80px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700"}," 标签 ",-1)),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",onClick:t[5]||(t[5]=n=>ne("status"))},[t[28]||(t[28]=$(" 状态 ",-1)),g.value==="status"?(a(),d("i",{key:0,class:T(["fas",w.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(a(),d("i",yi))]),e("th",bi,[t[31]||(t[31]=$(" 使用统计 ",-1)),e("span",{class:"cursor-pointer rounded px-2 py-1 hover:bg-gray-100",onClick:t[6]||(t[6]=n=>ne("cost"))},[t[29]||(t[29]=$(" (费用 ",-1)),g.value==="cost"?(a(),d("i",{key:0,class:T(["fas",w.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(a(),d("i",vi)),t[30]||(t[30]=$(") ",-1))])]),e("th",{class:"w-[10%] min-w-[90px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100",onClick:t[7]||(t[7]=n=>ne("createdAt"))},[t[32]||(t[32]=$(" 创建时间 ",-1)),g.value==="createdAt"?(a(),d("i",{key:0,class:T(["fas",w.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(a(),d("i",wi))]),e("th",{class:"w-[10%] min-w-[90px] cursor-pointer px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700 hover:bg-gray-100",onClick:t[8]||(t[8]=n=>ne("expiresAt"))},[t[33]||(t[33]=$(" 过期时间 ",-1)),g.value==="expiresAt"?(a(),d("i",{key:0,class:T(["fas",w.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(a(),d("i",hi))]),t[35]||(t[35]=e("th",{class:"w-[20%] min-w-[180px] px-3 py-4 text-left text-xs font-bold uppercase tracking-wider text-gray-700"}," 操作 ",-1))])]),e("tbody",$i,[(a(!0),d(G,null,B(Z.value,n=>{var M,U;return a(),d(G,{key:n.id},[e("tr",ki,[e("td",Ci,[e("div",Ai,[t[38]||(t[38]=e("div",{class:"mr-2 flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-blue-600"},[e("i",{class:"fas fa-key text-xs text-white"})],-1)),e("div",Ki,[e("div",{class:"truncate text-sm font-semibold text-gray-900",title:n.name},c(n.name),9,_i),e("div",{class:"truncate text-xs text-gray-500",title:n.id},c(n.id),9,Di),e("div",Li,[n.claudeAccountId?(a(),d("span",{key:0,title:`绑定: ${Ke(n.claudeAccountId)}`},[t[36]||(t[36]=e("i",{class:"fas fa-link mr-1"},null,-1)),$(" "+c(Ke(n.claudeAccountId)),1)],8,Ii)):(a(),d("span",Mi,t[37]||(t[37]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),$(" 共享池 ",-1)])))])])])]),e("td",Ti,[e("div",Ri,[(a(!0),d(G,null,B(n.tags||[],_=>(a(),d("span",{key:_,class:"inline-flex items-center rounded-full bg-blue-100 px-2 py-0.5 text-xs text-blue-800"},c(_),1))),128)),!n.tags||n.tags.length===0?(a(),d("span",Si,"无标签")):b("",!0)])]),e("td",ji,[e("span",{class:T(["inline-flex items-center rounded-full px-3 py-1 text-xs font-semibold",n.isActive?"bg-green-100 text-green-800":"bg-red-100 text-red-800"])},[e("div",{class:T(["mr-2 h-2 w-2 rounded-full",n.isActive?"bg-green-500":"bg-red-500"])},null,2),$(" "+c(n.isActive?"活跃":"禁用"),1)],2)]),e("td",Pi,[e("div",Ei,[e("div",Vi,[e("div",qi,[t[39]||(t[39]=e("span",{class:"text-gray-600"},"今日请求",-1)),e("span",Ui,c(ge(((U=(M=n.usage)==null?void 0:M.daily)==null?void 0:U.requests)||0))+"次",1)]),e("div",Wi,[t[40]||(t[40]=e("span",{class:"text-gray-600"},"今日费用",-1)),e("span",Oi,"$"+c((n.dailyCost||0).toFixed(4)),1)])]),n.dailyCostLimit>0?(a(),d("div",Fi,[e("div",Gi,[t[41]||(t[41]=e("span",{class:"text-gray-500"},"费用限额",-1)),e("span",zi," $"+c((n.dailyCost||0).toFixed(2))+" / $"+c(n.dailyCostLimit.toFixed(2)),1)]),e("div",Bi,[e("div",{class:T(["h-1.5 rounded-full transition-all duration-300",Fe(n)]),style:ie({width:_e(n)+"%"})},null,6)])])):b("",!0),n.rateLimitWindow>0?(a(),d("div",Hi,[e("div",Ni,[t[42]||(t[42]=e("span",{class:"text-gray-500"},"窗口限制",-1)),e("span",Yi,c(n.rateLimitWindow)+"分钟 ",1)]),n.rateLimitRequests>0?(a(),d("div",Qi,[e("div",Ji,[t[43]||(t[43]=e("span",{class:"text-gray-400"},"请求",-1)),e("span",Xi,c(n.currentWindowRequests||0)+"/"+c(n.rateLimitRequests),1)]),e("div",Zi,[e("div",{class:T(["h-1 rounded-full transition-all duration-300",Ge(n)]),style:ie({width:Le(n)+"%"})},null,6)])])):b("",!0),n.tokenLimit>0?(a(),d("div",ea,[e("div",ta,[t[44]||(t[44]=e("span",{class:"text-gray-400"},"Token",-1)),e("span",sa,c(ae(n.currentWindowTokens||0))+"/"+c(ae(n.tokenLimit)),1)]),e("div",la,[e("div",{class:T(["h-1 rounded-full transition-all duration-300",ze(n)]),style:ie({width:Ie(n)+"%"})},null,6)])])):b("",!0)])):b("",!0),e("div",oa,[e("button",{class:"flex w-full items-center justify-center gap-1 rounded py-1 text-xs font-medium text-blue-600 transition-colors hover:bg-blue-50 hover:text-blue-800",onClick:_=>De(n)},t[45]||(t[45]=[e("i",{class:"fas fa-chart-line"},null,-1),$(" 查看详细统计 ",-1)]),8,na)])])]),e("td",ia,c(new Date(n.createdAt).toLocaleDateString()),1),e("td",aa,[e("div",ra,[n.expiresAt?(a(),d("span",da,[be(n.expiresAt)?(a(),d("span",ua,t[46]||(t[46]=[e("i",{class:"fas fa-exclamation-circle mr-1"},null,-1),$(" 已过期 ",-1)]))):ve(n.expiresAt)?(a(),d("span",ca,[t[47]||(t[47]=e("i",{class:"fas fa-clock mr-1"},null,-1)),$(" "+c(Re(n.expiresAt)),1)])):(a(),d("span",ma,c(Re(n.expiresAt)),1))])):(a(),d("span",pa,t[48]||(t[48]=[e("i",{class:"fas fa-infinity mr-1"},null,-1),$(" 永不过期 ",-1)]))),e("button",{class:"inline-flex h-6 w-6 items-center justify-center rounded-md text-gray-300 transition-all duration-200 hover:bg-blue-50 hover:text-blue-500",title:"编辑过期时间",onClick:re(_=>Ue(n),["stop"])},t[49]||(t[49]=[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,xa)])]),e("td",fa,[e("div",ga,[n&&n.id?(a(),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",title:"模型使用分布",onClick:_=>Ne(n.id)},[e("i",{class:T(["fas",q.value[n.id]?"fa-chevron-up":"fa-chevron-down"])},null,2),t[50]||(t[50]=e("span",{class:"ml-1 hidden xl:inline"},"模型",-1))],8,ya)):b("",!0),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",title:"复制统计页面链接",onClick:_=>ot(n)},t[51]||(t[51]=[e("i",{class:"fas fa-chart-bar"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"统计",-1)]),8,ba),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",title:"编辑",onClick:_=>Ee(n)},t[52]||(t[52]=[e("i",{class:"fas fa-edit"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"编辑",-1)]),8,va),n.expiresAt&&(be(n.expiresAt)||ve(n.expiresAt))?(a(),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",title:"续期",onClick:_=>Ve(n)},t[53]||(t[53]=[e("i",{class:"fas fa-clock"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"续期",-1)]),8,wa)):b("",!0),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",title:"删除",onClick:_=>qe(n.id)},t[54]||(t[54]=[e("i",{class:"fas fa-trash"},null,-1),e("span",{class:"ml-1 hidden xl:inline"},"删除",-1)]),8,ha)])])]),n&&n.id&&q.value[n.id]?(a(),d("tr",$a,[e("td",ka,[A.value[n.id]?b("",!0):(a(),d("div",Ca,t[55]||(t[55]=[e("div",{class:"loading-spinner mx-auto"},null,-1),e("p",{class:"mt-2 text-sm text-gray-500"},"加载模型统计...",-1)]))),e("div",Aa,[e("div",Ka,[t[56]||(t[56]=e("h5",{class:"flex items-center text-sm font-semibold text-gray-700"},[e("i",{class:"fas fa-chart-pie mr-2 text-indigo-500"}),$(" 模型使用分布 ")],-1)),e("div",_a,[A.value[n.id]&&A.value[n.id].length>0?(a(),d("span",Da,c(A.value[n.id].length)+" 个模型 ",1)):b("",!0),e("div",La,[e("div",Ia,[(a(!0),d(G,null,B(ue(n.id).presetOptions,_=>(a(),d("button",{key:_.value,class:T(["rounded px-2 py-1 text-xs font-medium transition-colors",ue(n.id).preset===_.value&&ue(n.id).type==="preset"?"bg-white text-blue-600 shadow-sm":"text-gray-600 hover:text-gray-900"]),onClick:ce=>Pe(_.value,n.id)},c(_.label),11,Ma))),128))]),pe(h,{class:"api-key-date-picker",clearable:!0,"default-time":L.value,"disabled-date":Je,"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","model-value":ue(n.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":_=>Qe(n.id,_)},null,8,["default-time","model-value","onUpdate:modelValue"])])])]),A.value[n.id]&&A.value[n.id].length===0?(a(),d("div",Ta,[e("div",Ra,[t[58]||(t[58]=e("i",{class:"fas fa-chart-line text-lg text-gray-400"},null,-1)),t[59]||(t[59]=e("p",{class:"text-sm text-gray-500"},"暂无模型使用数据",-1)),e("button",{class:"ml-2 flex items-center gap-1 text-sm text-blue-500 transition-colors hover:text-blue-700",title:"重置筛选条件并刷新",onClick:_=>Xe(n.id)},t[57]||(t[57]=[e("i",{class:"fas fa-sync-alt text-xs"},null,-1),e("span",{class:"text-xs"},"刷新",-1)]),8,Sa)]),t[60]||(t[60]=e("p",{class:"text-xs text-gray-400"},"尝试调整时间范围或点击刷新重新加载数据",-1))])):A.value[n.id]&&A.value[n.id].length>0?(a(),d("div",ja,[(a(!0),d(G,null,B(A.value[n.id],_=>(a(),d("div",{key:_.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"},[e("div",Pa,[e("div",Ea,[e("span",Va,c(_.model),1),e("span",qa,c(_.requests)+" 次请求",1)])]),e("div",Ua,[e("div",Wa,[t[61]||(t[61]=e("span",{class:"flex items-center text-gray-600"},[e("i",{class:"fas fa-coins mr-1 text-xs text-yellow-500"}),$(" 总Token: ")],-1)),e("span",Oa,c(ae(_.allTokens)),1)]),e("div",Fa,[t[62]||(t[62]=e("span",{class:"flex items-center text-gray-600"},[e("i",{class:"fas fa-dollar-sign mr-1 text-xs text-green-500"}),$(" 费用: ")],-1)),e("span",Ga,c(Ye(_)),1)]),e("div",za,[e("div",Ba,[t[63]||(t[63]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-down mr-1 text-green-500"}),$(" 输入: ")],-1)),e("span",Ha,c(ae(_.inputTokens)),1)]),e("div",Na,[t[64]||(t[64]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-arrow-up mr-1 text-blue-500"}),$(" 输出: ")],-1)),e("span",Ya,c(ae(_.outputTokens)),1)]),_.cacheCreateTokens>0?(a(),d("div",Qa,[t[65]||(t[65]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-save mr-1"}),$(" 缓存创建: ")],-1)),e("span",Ja,c(ae(_.cacheCreateTokens)),1)])):b("",!0),_.cacheReadTokens>0?(a(),d("div",Xa,[t[66]||(t[66]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-download mr-1"}),$(" 缓存读取: ")],-1)),e("span",Za,c(ae(_.cacheReadTokens)),1)])):b("",!0)])]),e("div",er,[e("div",{class:"h-2 rounded-full bg-gradient-to-r from-indigo-500 to-purple-600 transition-all duration-500",style:ie({width:Se(_.allTokens,A.value[n.id])+"%"})},null,4)]),e("div",tr,[e("span",sr,c(Se(_.allTokens,A.value[n.id]))+"% ",1)])]))),128))])):b("",!0),A.value[n.id]&&A.value[n.id].length>0?(a(),d("div",lr,[e("div",or,[t[69]||(t[69]=e("span",{class:"flex items-center font-semibold text-gray-700"},[e("i",{class:"fas fa-calculator mr-2 text-indigo-500"}),$(" 总计统计 ")],-1)),e("div",nr,[e("span",ir,[t[67]||(t[67]=$(" 总请求: ",-1)),e("span",ar,c(A.value[n.id].reduce((_,ce)=>_+ce.requests,0)),1)]),e("span",rr,[t[68]||(t[68]=$(" 总Token: ",-1)),e("span",dr,c(ae(A.value[n.id].reduce((_,ce)=>_+ce.allTokens,0))),1)])])])])):b("",!0)])])])):b("",!0)],64)}),128))])])])),!R.value&&ee.value.length>0?(a(),d("div",ur,[(a(!0),d(G,null,B(Z.value,n=>{var M,U;return a(),d("div",{key:n.id,class:"card p-4 transition-shadow hover:shadow-lg"},[e("div",cr,[e("div",mr,[t[70]||(t[70]=e("div",{class:"flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg bg-gradient-to-br from-blue-500 to-blue-600"},[e("i",{class:"fas fa-key text-sm text-white"})],-1)),e("div",null,[e("h4",pr,c(n.name),1),e("p",xr,c(n.id),1)])]),e("span",{class:T(["inline-flex items-center rounded-full px-2 py-1 text-xs font-semibold",n.isActive?"bg-green-100 text-green-800":"bg-red-100 text-red-800"])},[e("div",{class:T(["mr-1.5 h-1.5 w-1.5 rounded-full",n.isActive?"bg-green-500":"bg-red-500"])},null,2),$(" "+c(n.isActive?"活跃":"已停用"),1)],2)]),e("div",fr,[n.claudeAccountId||n.claudeConsoleAccountId?(a(),d("span",gr,[t[71]||(t[71]=e("i",{class:"fas fa-link mr-1"},null,-1)),$(" 绑定: "+c(Ke(n.claudeAccountId,n.claudeConsoleAccountId)),1)])):(a(),d("span",yr,t[72]||(t[72]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),$(" 使用共享池 ",-1)])))]),e("div",br,[e("div",vr,[e("div",wr,[t[74]||(t[74]=e("span",{class:"text-xs text-gray-600"},"今日使用",-1)),e("button",{class:"text-xs text-blue-600 hover:text-blue-800",onClick:_=>De(n)},t[73]||(t[73]=[e("i",{class:"fas fa-chart-line mr-1"},null,-1),$("详情 ",-1)]),8,hr)]),e("div",$r,[e("div",null,[e("p",kr,c(ge(((U=(M=n.usage)==null?void 0:M.daily)==null?void 0:U.requests)||0))+" 次 ",1),t[75]||(t[75]=e("p",{class:"text-xs text-gray-500"},"请求",-1))]),e("div",null,[e("p",Cr," $"+c((n.dailyCost||0).toFixed(4)),1),t[76]||(t[76]=e("p",{class:"text-xs text-gray-500"},"费用",-1))])])]),n.dailyCostLimit>0?(a(),d("div",Ar,[e("div",Kr,[t[77]||(t[77]=e("span",{class:"text-gray-500"},"每日费用限额",-1)),e("span",_r," $"+c((n.dailyCost||0).toFixed(2))+" / $"+c(n.dailyCostLimit.toFixed(2)),1)]),e("div",Dr,[e("div",{class:T(["h-2 rounded-full transition-all duration-300",Fe(n)]),style:ie({width:_e(n)+"%"})},null,6)])])):b("",!0),n.rateLimitWindow>0&&(n.rateLimitRequests>0||n.tokenLimit>0)?(a(),d("div",Lr,[e("div",Ir,"窗口限制 ("+c(n.rateLimitWindow)+"分钟)",1),n.rateLimitRequests>0?(a(),d("div",Mr,[t[78]||(t[78]=e("span",{class:"w-10 text-xs text-gray-500"},"请求",-1)),e("div",Tr,[e("div",Rr,[e("div",{class:T(["h-1.5 rounded-full transition-all duration-300",Ge(n)]),style:ie({width:Le(n)+"%"})},null,6)])]),e("span",Sr,c(n.currentWindowRequests||0)+"/"+c(n.rateLimitRequests),1)])):b("",!0),n.tokenLimit>0?(a(),d("div",jr,[t[79]||(t[79]=e("span",{class:"w-10 text-xs text-gray-500"},"Token",-1)),e("div",Pr,[e("div",Er,[e("div",{class:T(["h-1.5 rounded-full transition-all duration-300",ze(n)]),style:ie({width:Ie(n)+"%"})},null,6)])]),e("span",Vr,c(ae(n.currentWindowTokens||0))+"/"+c(ae(n.tokenLimit)),1)])):b("",!0)])):b("",!0)]),e("div",qr,[e("div",Ur,[t[80]||(t[80]=e("span",null,"创建时间",-1)),e("span",null,c(Oe(n.createdAt)),1)]),e("div",Wr,[t[82]||(t[82]=e("span",null,"过期时间",-1)),e("div",Or,[e("span",{class:T(ve(n.expiresAt)?"font-semibold text-orange-600":"")},c(n.expiresAt?Oe(n.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",title:"编辑过期时间",onClick:re(_=>Ue(n),["stop"])},t[81]||(t[81]=[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,Fr)])])]),n.tags&&n.tags.length>0?(a(),d("div",Gr,[(a(!0),d(G,null,B(n.tags,_=>(a(),d("span",{key:_,class:"inline-flex items-center rounded-full bg-blue-100 px-2 py-0.5 text-xs text-blue-800"},c(_),1))),128))])):b("",!0),e("div",zr,[e("button",{class:"flex flex-1 items-center justify-center gap-1 rounded-lg bg-blue-50 px-3 py-2 text-xs text-blue-600 transition-colors hover:bg-blue-100",onClick:_=>De(n)},t[83]||(t[83]=[e("i",{class:"fas fa-chart-line"},null,-1),$(" 查看详情 ",-1)]),8,Br),e("button",{class:"flex-1 rounded-lg bg-gray-50 px-3 py-2 text-xs text-gray-600 transition-colors hover:bg-gray-100",onClick:_=>Ee(n)},t[84]||(t[84]=[e("i",{class:"fas fa-edit mr-1"},null,-1),$(" 编辑 ",-1)]),8,Hr),n.expiresAt&&(be(n.expiresAt)||ve(n.expiresAt))?(a(),d("button",{key:0,class:"flex-1 rounded-lg bg-orange-50 px-3 py-2 text-xs text-orange-600 transition-colors hover:bg-orange-100",onClick:_=>Ve(n)},t[85]||(t[85]=[e("i",{class:"fas fa-clock mr-1"},null,-1),$(" 续期 ",-1)]),8,Nr)):b("",!0),e("button",{class:"rounded-lg bg-red-50 px-3 py-2 text-xs text-red-600 transition-colors hover:bg-red-100",onClick:_=>qe(n.id)},t[86]||(t[86]=[e("i",{class:"fas fa-trash"},null,-1)]),8,Yr)])])}),128))])):b("",!0),ee.value.length>0?(a(),d("div",Qr,[e("div",Jr,[e("span",Xr," 共 "+c(ee.value.length)+" 条记录 ",1),e("div",Zr,[t[87]||(t[87]=e("span",{class:"text-xs text-gray-600 sm:text-sm"},"每页显示",-1)),S(e("select",{"onUpdate:modelValue":t[9]||(t[9]=n=>F.value=n),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 sm:text-sm",onChange:t[10]||(t[10]=n=>x.value=1)},[(a(),d(G,null,B(Q,n=>e("option",{key:n,value:n},c(n),9,ed)),64))],544),[[ye,F.value]]),t[88]||(t[88]=e("span",{class:"text-xs text-gray-600 sm:text-sm"},"条",-1))])]),e("div",td,[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 sm:py-1 sm:text-sm",disabled:x.value===1,onClick:t[11]||(t[11]=n=>x.value--)},t[89]||(t[89]=[e("i",{class:"fas fa-chevron-left"},null,-1)]),8,sd),e("div",ld,[x.value>3?(a(),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 sm:block",onClick:t[12]||(t[12]=n=>x.value=1)}," 1 ")):b("",!0),x.value>4?(a(),d("span",od,"...")):b("",!0),(a(!0),d(G,null,B(te.value,n=>(a(),d("button",{key:n,class:T(["rounded-md px-2 py-1 text-xs font-medium sm:px-3 sm:text-sm",n===x.value?"bg-blue-600 text-white":"border border-gray-300 bg-white text-gray-700 hover:bg-gray-50"]),onClick:M=>x.value=n},c(n),11,nd))),128)),x.value<j.value-3?(a(),d("span",id,"...")):b("",!0),j.value>1&&x.value<j.value-2?(a(),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 sm:block",onClick:t[13]||(t[13]=n=>x.value=j.value)},c(j.value),1)):b("",!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 sm:py-1 sm:text-sm",disabled:x.value===j.value||j.value===0,onClick:t[14]||(t[14]=n=>x.value++)},t[90]||(t[90]=[e("i",{class:"fas fa-chevron-right"},null,-1)]),8,ad)])])):b("",!0)]),H.value?(a(),le(Ps,{key:0,accounts:v.value,onBatchSuccess:tt,onClose:t[15]||(t[15]=n=>H.value=!1),onSuccess:et},null,8,["accounts"])):b("",!0),X.value?(a(),le(Ml,{key:1,accounts:v.value,"api-key":o.value,onClose:t[16]||(t[16]=n=>X.value=!1),onSuccess:st},null,8,["accounts","api-key"])):b("",!0),J.value?(a(),le(Nl,{key:2,"api-key":l.value,onClose:t[17]||(t[17]=n=>J.value=!1),onSuccess:lt},null,8,["api-key"])):b("",!0),D.value?(a(),le(ro,{key:3,"api-key":p.value,onClose:t[18]||(t[18]=n=>D.value=!1)},null,8,["api-key"])):b("",!0),s.value?(a(),le(So,{key:4,"api-keys":N.value,onClose:t[19]||(t[19]=n=>s.value=!1)},null,8,["api-keys"])):b("",!0),pe(ln,{ref_key:"expiryEditModalRef",ref:r,"api-key":K.value||{id:null,expiresAt:null,name:""},show:!!K.value,onClose:We,onSave:nt},null,8,["api-key","show"]),pe(oi,{"api-key":z.value||{},show:i.value,onClose:t[20]||(t[20]=n=>i.value=!1)},null,8,["api-key","show"])])}}},xd=de(rd,[["__scopeId","data-v-4f201f6f"]]);export{xd as default};
|