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