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