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