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