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