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