Files
claude-relay-service/web/admin-spa/dist/assets/ApiKeysView-egPRbmZr.js
2025-08-10 05:25:44 +00:00

20 lines
125 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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