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