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