Spaces:
Sleeping
Sleeping
Upload 37 files
Browse files- static/assets/Accounts-BPJBl--e.js +1 -0
- static/assets/Accounts-vAjoJgTZ.js +1 -0
- static/assets/AppShell-BbGZjE35.js +1 -0
- static/assets/AppShell-Cu5Okzxz.js +1 -0
- static/assets/Checkbox.vue_vue_type_script_setup_true_lang-B0-MthIO.js +1 -0
- static/assets/Checkbox.vue_vue_type_script_setup_true_lang-B6QFZaQQ.js +1 -0
- static/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-Bkr0tSJw.js +1 -0
- static/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-QhDFiT60.js +1 -0
- static/assets/Dashboard-C7wgWPRX.js +1 -0
- static/assets/Dashboard-CRtziR8g.js +1 -0
- static/assets/Docs-DMaxRdFo.js +101 -0
- static/assets/Docs-mpFHVt06.js +101 -0
- static/assets/HelpTip.vue_vue_type_script_setup_true_lang-B7Lr9VZz.js +1 -0
- static/assets/HelpTip.vue_vue_type_script_setup_true_lang-BwK5Fa3C.js +1 -0
- static/assets/Login-BYJmqkJn.js +1 -0
- static/assets/Login-hY94o6Vs.js +1 -0
- static/assets/Logs-CEP1TB7c.js +2 -0
- static/assets/Logs-Cag1gpYh.js +2 -0
- static/assets/Monitor-BemJ9-ii.js +1 -0
- static/assets/Monitor-zt-Todu7.js +1 -0
- static/assets/PublicLogs-BpmmHE3p.js +1 -0
- static/assets/PublicLogs-bUB_irTf.js +1 -0
- static/assets/PublicUptime-BHpUIBOr.js +1 -0
- static/assets/PublicUptime-D8jwML38.js +1 -0
- static/assets/SelectMenu.vue_vue_type_script_setup_true_lang-Bb3w9pba.js +1 -0
- static/assets/SelectMenu.vue_vue_type_script_setup_true_lang-DRqaa_R-.js +1 -0
- static/assets/Settings-BTOz14ly.js +1 -0
- static/assets/Settings-oiGSFiLo.js +1 -0
- static/assets/index-B0A0-QFY.js +0 -0
- static/assets/index-Bld7Uski.js +0 -0
- static/assets/index-CWOdPlPE.css +1 -0
- static/assets/settings-H-RYxUda.js +1 -0
- static/assets/settings-MHx3aXRd.js +1 -0
- static/assets/useConfirmDialog-BS9rDomX.js +1 -0
- static/assets/useConfirmDialog-XZs7petQ.js +1 -0
- static/assets/useUptimeStatus-BbQ1ylnm.js +1 -0
- static/assets/useUptimeStatus-D_PU76s5.js +1 -0
static/assets/Accounts-BPJBl--e.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{g as j,C as $e,h as c,d as Ae,D as Se,i as R,o as De,c as d,a as t,x as D,y as ue,m as V,v as $,b as h,A as Ee,t as a,n as m,u as v,F as q,r as ce,f as xe,T as pe,w as g,e as r}from"./index-B0A0-QFY.js";import{_ as Ue}from"./SelectMenu.vue_vue_type_script_setup_true_lang-Bb3w9pba.js";import{_ as F}from"./Checkbox.vue_vue_type_script_setup_true_lang-B6QFZaQQ.js";import{_ as je}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-Bkr0tSJw.js";import{u as ze}from"./useConfirmDialog-BS9rDomX.js";import{_ as Me}from"./HelpTip.vue_vue_type_script_setup_true_lang-BwK5Fa3C.js";const y={list:()=>j.get("/admin/accounts"),getConfig:()=>j.get("/admin/accounts-config"),updateConfig:f=>j.put("/admin/accounts-config",f),delete:f=>j.delete(`/admin/accounts/${f}`),disable:f=>j.put(`/admin/accounts/${f}/disable`),enable:f=>j.put(`/admin/accounts/${f}/enable`)},Ne=$e("accounts",()=>{const f=c([]),x=c(!1);async function b(){x.value=!0;try{const l=await y.list();f.value=Array.isArray(l)?l:l.accounts||[]}finally{x.value=!1}}async function z(l){await y.delete(l),await b()}async function p(l){await y.disable(l),await b()}async function M(l){await y.enable(l),await b()}async function E(l){await Promise.all(l.map(_=>y.enable(_))),await b()}async function u(l){await Promise.all(l.map(_=>y.disable(_))),await b()}async function A(l){await Promise.all(l.map(_=>y.delete(_))),await b()}async function N(l){await y.updateConfig(l),await b()}return{accounts:f,isLoading:x,loadAccounts:b,deleteAccount:z,disableAccount:p,enableAccount:M,bulkEnable:E,bulkDisable:u,bulkDelete:A,updateConfig:N}}),Te={class:"space-y-8"},Be={class:"rounded-3xl border border-border bg-card p-6"},Oe={class:"flex flex-wrap items-center justify-between gap-4"},Je={class:"grid w-full grid-cols-2 gap-3 sm:flex sm:w-auto sm:items-center"},Le={class:"flex w-full flex-wrap items-center gap-3 text-xs text-muted-foreground sm:w-auto sm:flex-nowrap"},Fe={key:0},Ie={class:"ml-auto flex items-center gap-2 sm:ml-0"},Pe={class:"mt-4 flex flex-wrap items-center gap-3"},He=["disabled"],Qe=["disabled"],Re=["disabled"],qe=["disabled"],Ge={key:0,class:"mt-6 grid grid-cols-1 gap-3 md:grid-cols-2 xl:grid-cols-3"},Ke=["onClick"],We={class:"flex items-start justify-between gap-3"},Xe={class:"mt-1 font-mono text-xs text-foreground"},Ye={class:"flex items-center gap-2"},Ze={class:"mt-4 grid grid-cols-2 gap-3 text-xs text-muted-foreground"},et={key:0,class:"mt-1 text-[11px]"},tt={key:0},ot={key:1},st={class:"mt-1 text-sm font-semibold text-foreground"},rt={class:"mt-1 text-sm font-semibold text-foreground"},lt={class:"mt-4 flex flex-wrap items-center gap-2"},nt=["onClick"],dt=["onClick"],at=["onClick"],it=["onClick"],ut={key:0,class:"rounded-2xl border border-border bg-background p-4 text-center text-xs text-muted-foreground"},ct={key:1,class:"relative mt-6 overflow-x-auto overflow-y-visible"},xt={class:"min-w-full text-left text-sm"},pt={class:"text-xs uppercase tracking-[0.2em] text-muted-foreground"},ft={class:"py-3 pr-4"},mt={class:"py-3 pr-6"},bt={class:"inline-flex items-center gap-2"},vt={class:"text-sm text-foreground"},gt={key:0},yt=["onClick"],_t={class:"py-4 pr-6 font-mono text-xs text-foreground"},wt={class:"py-4 pr-6"},ht={class:"py-4 pr-6"},kt={key:0,class:"block text-[11px] text-muted-foreground"},Ct={class:"py-4 pr-6 text-xs"},Vt={class:"py-4 pr-6 text-xs text-muted-foreground"},$t={class:"py-4 pr-6 text-xs text-muted-foreground"},At={class:"py-4 text-right"},St={class:"flex flex-wrap justify-end gap-2"},Dt=["onClick"],Et=["onClick"],Ut=["onClick"],jt=["onClick"],zt={key:0,class:"fixed inset-0 z-[100] flex items-center justify-center bg-black/30 px-4"},Mt={class:"w-full max-w-lg rounded-3xl border border-border bg-card p-6 shadow-xl"},Nt={key:0,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},Tt={class:"mt-4 space-y-3 text-sm"},Bt={key:0,class:"fixed inset-0 z-[100] flex items-center justify-center bg-black/30 px-4"},Ot={class:"w-full max-w-3xl rounded-3xl border border-border bg-card p-6 shadow-xl"},Jt={class:"flex items-center justify-between"},Lt={class:"flex items-center gap-2"},Ft={key:0,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},It={class:"mt-4"},Pt=["readonly"],Ht={class:"mt-6 flex items-center justify-end gap-2"},Qt=["disabled"],Yt=Ae({__name:"Accounts",setup(f){const x=Ne(),{accounts:b,isLoading:z}=Se(x),p=ze(),M=c(""),E=c("all"),u=c(new Set),A=c("table"),N=c(!1),l=c(""),_=c(!1),w=c(""),U=c(""),k=c(!1),T=c([]),i=c({id:"",secure_c_ses:"",csesidx:"",config_id:"",host_c_oses:"",expires_at:""}),J=c(null),G=c([]),fe=[{label:"全部状态",value:"all"},{label:"正常",value:"正常"},{label:"即将过期",value:"即将过期"},{label:"已过期",value:"已过期"},{label:"手动禁用",value:"手动禁用"},{label:"错误禁用",value:"错误禁用"},{label:"429限流",value:"429限流"}],C=R(()=>{const o=M.value.trim().toLowerCase();return b.value.filter(e=>{const s=!o||e.id.toLowerCase().includes(o),n=E.value==="all"||O(e)===E.value;return s&&n})}),B=R(()=>u.value.size),I=R(()=>C.value.length>0&&C.value.every(o=>u.value.has(o.id))),K=async()=>{await x.loadAccounts(),u.value=new Set};De(async()=>{await K()});const O=o=>o.cooldown_reason?.includes("429")&&o.cooldown_seconds>0?"429限流":o.cooldown_reason==="错误禁用"?"错误禁用":o.disabled?"手动禁用":o.status==="已过期"?"已过期":o.status==="即将过期"?"即将过期":"正常",W=o=>{const e=O(o);return e==="429限流"||e==="即将过期"?"bg-amber-200 text-amber-900":e==="错误禁用"||e==="已过期"?"bg-destructive/10 text-destructive":e==="手动禁用"?"bg-muted text-muted-foreground":"bg-emerald-500 text-white"},X=o=>o.cooldown_reason?.includes("429")&&o.cooldown_seconds>0?!0:o.disabled||o.cooldown_reason==="错误禁用",Y=o=>o==="已过期"?"过期":o==="未设置"?"未设置":o,Z=o=>o.status==="已过期"?"text-rose-600":o.status==="即将过期"?"text-amber-700":o.status==="未设置"?"text-muted-foreground":"text-emerald-600",ee=o=>o<60?`${o} 秒`:o<3600?`${Math.ceil(o/60)} 分钟`:`${(o/3600).toFixed(1)} 小时`,P=o=>o.cooldown_seconds>0?"text-amber-700":o.cooldown_reason==="错误禁用"?"text-rose-600":"text-muted-foreground",te=o=>{const e=O(o);return e==="手动禁用"||e==="已过期"?"bg-muted/70":""},L=o=>{const e=new Set(u.value);e.has(o)?e.delete(o):e.add(o),u.value=e},oe=()=>{if(I.value){u.value=new Set;return}u.value=new Set(C.value.map(o=>o.id))},me=(o,e)=>o.id||`account_${e+1}`,be=async()=>(await y.getConfig()).accounts.map((e,s)=>({...e,id:me(e,s)})),ve=(o,e)=>{let s=-1;for(let S=0;S<o.length;S+=1)if(o[S].id===e){s=S;break}if(s===-1)return l.value="未找到对应账号配置。",!1;const n=o[s];return i.value={id:n.id,secure_c_ses:n.secure_c_ses,csesidx:n.csesidx,config_id:n.config_id,host_c_oses:n.host_c_oses,expires_at:n.expires_at},G.value=o,J.value=s,N.value=!0,!0},se=async o=>{l.value="";try{const e=await be();ve(e,o)}catch(e){l.value=e.message||"加载账号配置失败"}},ge=async()=>{w.value="";try{const o=await y.getConfig();T.value=Array.isArray(o.accounts)?o.accounts:[],U.value=JSON.stringify(le(T.value),null,2),k.value=!0,_.value=!0}catch(o){w.value=o.message||"加载账号配置失败"}},H=()=>{_.value=!1,w.value="",k.value=!1},re=()=>{const o=JSON.parse(U.value);if(!Array.isArray(o))throw new Error("配置格式必须是数组。");return o},ye=o=>typeof o!="string"||!o?o:o.length<=6?`${o.slice(0,2)}****`:`${o.slice(0,3)}****`,le=o=>{const e=new Set(["secure_c_ses","csesidx","config_id","host_c_oses"]);return o.map(s=>{const n={...s};return e.forEach(S=>{const ie=n[S];ie&&(n[S]=ye(ie))}),n})},_e=()=>{if(w.value="",!k.value){try{T.value=re()}catch(o){w.value=o.message||"JSON 格式错误";return}U.value=JSON.stringify(le(T.value),null,2),k.value=!0;return}U.value=JSON.stringify(T.value,null,2),k.value=!1},we=async()=>{w.value="";try{const o=re();await x.updateConfig(o),H()}catch(o){w.value=o.message||"保存失败"}},Q=()=>{N.value=!1,l.value=""},he=async()=>{if(J.value===null)return;const o=[...G.value];o[J.value]={...o[J.value],id:i.value.id,secure_c_ses:i.value.secure_c_ses,csesidx:i.value.csesidx,config_id:i.value.config_id,host_c_oses:i.value.host_c_oses||void 0,expires_at:i.value.expires_at||void 0};try{await x.updateConfig(o),Q()}catch(e){l.value=e.message||"保存失败"}},ke=async()=>{await x.bulkEnable(Array.from(u.value)),u.value=new Set},Ce=async()=>{await p.ask({title:"批量禁用",message:"确定要批量禁用选中的账号吗?"})&&(await x.bulkDisable(Array.from(u.value)),u.value=new Set)},Ve=async()=>{await p.ask({title:"批量删除",message:"确定要批量删除选中的账号吗?",confirmText:"删除"})&&(await x.bulkDelete(Array.from(u.value)),u.value=new Set)},ne=async o=>{await x.enableAccount(o)},de=async o=>{await p.ask({title:"禁用账号",message:"确定要禁用该账号吗?"})&&await x.disableAccount(o)},ae=async o=>{await p.ask({title:"删除账号",message:"确定要删除该账号吗?",confirmText:"删除"})&&await x.deleteAccount(o)};return(o,e)=>(r(),d(q,null,[t("div",Te,[t("section",Be,[t("div",Oe,[t("div",Je,[V(t("input",{"onUpdate:modelValue":e[0]||(e[0]=s=>M.value=s),type:"text",placeholder:"搜索账号 ID",class:"w-full rounded-full border border-input bg-background px-4 py-2 text-sm sm:w-48"},null,512),[[$,M.value]]),D(Ue,{modelValue:E.value,"onUpdate:modelValue":e[1]||(e[1]=s=>E.value=s),options:fe},null,8,["modelValue"])]),t("div",Le,[D(F,{modelValue:I.value,"onUpdate:modelValue":oe},{default:Ee(()=>[...e[16]||(e[16]=[xe(" 全选 ",-1)])]),_:1},8,["modelValue"]),t("span",null,"共 "+a(C.value.length)+" 个账号",1),B.value?(r(),d("span",Fe,"已选 "+a(B.value)+" 个",1)):h("",!0),t("div",Ie,[t("button",{type:"button",class:m(["inline-flex h-8 w-8 items-center justify-center rounded-full border border-border text-muted-foreground transition-colors hover:border-primary hover:text-primary",A.value==="table"?"bg-accent text-accent-foreground":""]),onClick:e[2]||(e[2]=s=>A.value="table"),"aria-label":"列表视图"},[...e[17]||(e[17]=[t("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4",fill:"currentColor"},[t("path",{d:"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h16v2H4v-2z"})],-1)])],2),t("button",{type:"button",class:m(["inline-flex h-8 w-8 items-center justify-center rounded-full border border-border text-muted-foreground transition-colors hover:border-primary hover:text-primary",A.value==="card"?"bg-accent text-accent-foreground":""]),onClick:e[3]||(e[3]=s=>A.value="card"),"aria-label":"卡片视图"},[...e[18]||(e[18]=[t("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4",fill:"currentColor"},[t("path",{d:"M4 6h7v6H4V6zm9 0h7v6h-7V6zM4 14h7v4H4v-4zm9 0h7v4h-7v-4z"})],-1)])],2)])])]),t("div",Pe,[t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:ge}," 账户配置 "),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",disabled:v(z),onClick:K}," 刷新列表 ",8,He),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",disabled:!B.value,onClick:ke}," 批量启用 ",8,Qe),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",disabled:!B.value,onClick:Ce}," 批量禁用 ",8,Re),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-destructive transition-colors hover:border-destructive hover:text-destructive",disabled:!B.value,onClick:Ve}," 批量删除 ",8,qe)]),A.value==="card"?(r(),d("div",Ge,[(r(!0),d(q,null,ce(C.value,s=>(r(),d("div",{key:s.id,class:m(["rounded-2xl border border-border bg-card p-4",te(s)]),onClick:n=>L(s.id)},[t("div",We,[t("div",null,[e[19]||(e[19]=t("p",{class:"text-xs text-muted-foreground"},"账号 ID",-1)),t("p",Xe,a(s.id),1)]),t("div",Ye,[D(F,{modelValue:u.value.has(s.id),"onUpdate:modelValue":n=>L(s.id),onClick:e[4]||(e[4]=g(()=>{},["stop"]))},null,8,["modelValue","onUpdate:modelValue"]),t("span",{class:m(["inline-flex items-center rounded-full border border-border px-3 py-1 text-xs",W(s)])},a(O(s)),3)])]),t("div",Ze,[t("div",null,[e[20]||(e[20]=t("p",null,"剩余时间",-1)),t("p",{class:m(["mt-1 text-sm font-semibold",Z(s)])},a(Y(s.remaining_display)),3),s.expires_at?(r(),d("p",et,a(s.expires_at),1)):h("",!0)]),t("div",null,[e[21]||(e[21]=t("p",null,"冷却",-1)),t("p",{class:m(["mt-1",P(s)])},[s.cooldown_seconds>0?(r(),d("span",tt,a(ee(s.cooldown_seconds))+" · "+a(s.cooldown_reason),1)):(r(),d("span",ot,a(s.cooldown_reason||"无冷却"),1))],2)]),t("div",null,[e[22]||(e[22]=t("p",null,"失败数",-1)),t("p",st,a(s.error_count),1)]),t("div",null,[e[23]||(e[23]=t("p",null,"会话数",-1)),t("p",rt,a(s.conversation_count),1)])]),t("div",lt,[t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>se(s.id),["stop"])}," 编辑 ",8,nt),X(s)?(r(),d("button",{key:0,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:[e[5]||(e[5]=g(()=>{},["stop"])),n=>ne(s.id)]}," 启用 ",8,dt)):(r(),d("button",{key:1,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:[e[6]||(e[6]=g(()=>{},["stop"])),n=>de(s.id)]}," 禁用 ",8,at)),t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-destructive transition-colors hover:border-destructive hover:text-destructive",onClick:[e[7]||(e[7]=g(()=>{},["stop"])),n=>ae(s.id)]}," 删除 ",8,it)])],10,Ke))),128)),!C.value.length&&!v(z)?(r(),d("div",ut," 暂无账号数据,请检查后台配置。 ")):h("",!0)])):(r(),d("div",ct,[t("table",xt,[t("thead",pt,[t("tr",null,[t("th",ft,[D(F,{modelValue:I.value,"onUpdate:modelValue":oe},null,8,["modelValue"])]),e[25]||(e[25]=t("th",{class:"py-3 pr-6"},"账号 ID",-1)),e[26]||(e[26]=t("th",{class:"py-3 pr-6"},"状态",-1)),t("th",mt,[t("span",bt,[e[24]||(e[24]=xe(" 剩余/过期 ",-1)),D(Me,{text:"过期时间为 12 小时,账户过期以北京时间为准。"})])]),e[27]||(e[27]=t("th",{class:"py-3 pr-6"},"冷却",-1)),e[28]||(e[28]=t("th",{class:"py-3 pr-6"},"失败数",-1)),e[29]||(e[29]=t("th",{class:"py-3 pr-6"},"会话数",-1)),e[30]||(e[30]=t("th",{class:"py-3 text-right"},"操作",-1))])]),t("tbody",vt,[!C.value.length&&!v(z)?(r(),d("tr",gt,[...e[31]||(e[31]=[t("td",{colspan:"8",class:"py-8 text-center text-muted-foreground"}," 暂无账号数据,请检查后台配置。 ",-1)])])):h("",!0),(r(!0),d(q,null,ce(C.value,s=>(r(),d("tr",{key:s.id,class:m(["border-t border-border",te(s)]),onClick:n=>L(s.id)},[t("td",{class:"py-4 pr-4",onClick:e[8]||(e[8]=g(()=>{},["stop"]))},[D(F,{modelValue:u.value.has(s.id),"onUpdate:modelValue":n=>L(s.id)},null,8,["modelValue","onUpdate:modelValue"])]),t("td",_t,a(s.id),1),t("td",wt,[t("span",{class:m(["inline-flex items-center rounded-full border border-border px-3 py-1 text-xs",W(s)])},a(O(s)),3)]),t("td",ht,[t("div",{class:m(["text-sm font-semibold",Z(s)])},a(Y(s.remaining_display)),3),s.expires_at?(r(),d("span",kt,a(s.expires_at),1)):h("",!0)]),t("td",Ct,[s.cooldown_seconds>0?(r(),d("span",{key:0,class:m(P(s))},a(ee(s.cooldown_seconds))+" · "+a(s.cooldown_reason),3)):(r(),d("span",{key:1,class:m(P(s))},a(s.cooldown_reason||"无冷却"),3))]),t("td",Vt,a(s.error_count),1),t("td",$t,a(s.conversation_count),1),t("td",At,[t("div",St,[t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>se(s.id),["stop"])}," 编辑 ",8,Dt),X(s)?(r(),d("button",{key:0,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>ne(s.id),["stop"])}," 启用 ",8,Et)):(r(),d("button",{key:1,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>de(s.id),["stop"])}," 禁用 ",8,Ut)),t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-destructive transition-colors hover:border-destructive hover:text-destructive",onClick:g(n=>ae(s.id),["stop"])}," 删除 ",8,jt)])])],10,yt))),128))])])]))])]),D(je,{open:v(p).open.value,title:v(p).title.value,message:v(p).message.value,"confirm-text":v(p).confirmText.value,"cancel-text":v(p).cancelText.value,onConfirm:v(p).confirm,onCancel:v(p).cancel},null,8,["open","title","message","confirm-text","cancel-text","onConfirm","onCancel"]),(r(),ue(pe,{to:"body"},[N.value?(r(),d("div",zt,[t("div",Mt,[t("div",{class:"flex items-center justify-between"},[e[32]||(e[32]=t("p",{class:"text-sm font-medium text-foreground"},"编辑账号",-1)),t("button",{class:"text-xs text-muted-foreground transition-colors hover:text-foreground",onClick:Q}," 关闭 ")]),l.value?(r(),d("div",Nt,a(l.value),1)):h("",!0),t("div",Tt,[e[33]||(e[33]=t("label",{class:"block text-xs text-muted-foreground"},"账号 ID",-1)),V(t("input",{"onUpdate:modelValue":e[9]||(e[9]=s=>i.value.id=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",disabled:""},null,512),[[$,i.value.id]]),e[34]||(e[34]=t("label",{class:"block text-xs text-muted-foreground"},"secure_c_ses",-1)),V(t("textarea",{"onUpdate:modelValue":e[10]||(e[10]=s=>i.value.secure_c_ses=s),class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",rows:"3"},null,512),[[$,i.value.secure_c_ses]]),e[35]||(e[35]=t("label",{class:"block text-xs text-muted-foreground"},"csesidx",-1)),V(t("input",{"onUpdate:modelValue":e[11]||(e[11]=s=>i.value.csesidx=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[$,i.value.csesidx]]),e[36]||(e[36]=t("label",{class:"block text-xs text-muted-foreground"},"config_id",-1)),V(t("input",{"onUpdate:modelValue":e[12]||(e[12]=s=>i.value.config_id=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[$,i.value.config_id]]),e[37]||(e[37]=t("label",{class:"block text-xs text-muted-foreground"},"host_c_oses",-1)),V(t("input",{"onUpdate:modelValue":e[13]||(e[13]=s=>i.value.host_c_oses=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[$,i.value.host_c_oses]]),e[38]||(e[38]=t("label",{class:"block text-xs text-muted-foreground"},"expires_at",-1)),V(t("input",{"onUpdate:modelValue":e[14]||(e[14]=s=>i.value.expires_at=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"2025-12-23 10:59:21"},null,512),[[$,i.value.expires_at]])]),t("div",{class:"mt-6 flex items-center justify-end gap-2"},[t("button",{class:"rounded-full border border-border px-4 py-2 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:Q}," 取消 "),t("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",onClick:he}," 保存 ")])])])):h("",!0)])),(r(),ue(pe,{to:"body"},[_.value?(r(),d("div",Bt,[t("div",Ot,[t("div",Jt,[e[39]||(e[39]=t("p",{class:"text-sm font-medium text-foreground"},"账户配置(JSON)",-1)),t("div",Lt,[t("button",{class:"rounded-full bg-foreground px-3 py-1 text-xs text-background transition-opacity hover:opacity-90",onClick:_e},a(k.value?"显示原文":"脱敏显示"),1),t("button",{class:"text-xs text-muted-foreground transition-colors hover:text-foreground",onClick:H}," 关闭 ")])]),w.value?(r(),d("div",Ft,a(w.value),1)):h("",!0),t("div",It,[V(t("textarea",{"onUpdate:modelValue":e[15]||(e[15]=s=>U.value=s),class:"h-96 w-full rounded-2xl border border-input bg-background px-4 py-3 font-mono text-xs text-foreground",spellcheck:"false",readonly:k.value},null,8,Pt),[[$,U.value]])]),t("div",Ht,[t("button",{class:"rounded-full border border-border px-4 py-2 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:H}," 取消 "),t("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",onClick:we,disabled:k.value}," 保存 ",8,Qt)])])])):h("",!0)]))],64))}});export{Yt as default};
|
static/assets/Accounts-vAjoJgTZ.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{g as j,C as $e,h as c,d as Ae,D as Se,i as R,o as De,c as d,a as t,x as D,y as ue,m as V,v as $,b as h,A as Ee,t as a,n as m,u as v,F as q,r as ce,f as xe,T as pe,w as g,e as r}from"./index-Bld7Uski.js";import{_ as Ue}from"./SelectMenu.vue_vue_type_script_setup_true_lang-DRqaa_R-.js";import{_ as F}from"./Checkbox.vue_vue_type_script_setup_true_lang-B0-MthIO.js";import{_ as je}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-QhDFiT60.js";import{u as ze}from"./useConfirmDialog-XZs7petQ.js";import{_ as Me}from"./HelpTip.vue_vue_type_script_setup_true_lang-B7Lr9VZz.js";const y={list:()=>j.get("/admin/accounts"),getConfig:()=>j.get("/admin/accounts-config"),updateConfig:f=>j.put("/admin/accounts-config",f),delete:f=>j.delete(`/admin/accounts/${f}`),disable:f=>j.put(`/admin/accounts/${f}/disable`),enable:f=>j.put(`/admin/accounts/${f}/enable`)},Ne=$e("accounts",()=>{const f=c([]),x=c(!1);async function b(){x.value=!0;try{const l=await y.list();f.value=Array.isArray(l)?l:l.accounts||[]}finally{x.value=!1}}async function z(l){await y.delete(l),await b()}async function p(l){await y.disable(l),await b()}async function M(l){await y.enable(l),await b()}async function E(l){await Promise.all(l.map(_=>y.enable(_))),await b()}async function u(l){await Promise.all(l.map(_=>y.disable(_))),await b()}async function A(l){await Promise.all(l.map(_=>y.delete(_))),await b()}async function N(l){await y.updateConfig(l),await b()}return{accounts:f,isLoading:x,loadAccounts:b,deleteAccount:z,disableAccount:p,enableAccount:M,bulkEnable:E,bulkDisable:u,bulkDelete:A,updateConfig:N}}),Te={class:"space-y-8"},Be={class:"rounded-3xl border border-border bg-card p-6"},Oe={class:"flex flex-wrap items-center justify-between gap-4"},Je={class:"grid w-full grid-cols-2 gap-3 sm:flex sm:w-auto sm:items-center"},Le={class:"flex w-full flex-wrap items-center gap-3 text-xs text-muted-foreground sm:w-auto sm:flex-nowrap"},Fe={key:0},Ie={class:"ml-auto flex items-center gap-2 sm:ml-0"},Pe={class:"mt-4 flex flex-wrap items-center gap-3"},He=["disabled"],Qe=["disabled"],Re=["disabled"],qe=["disabled"],Ge={key:0,class:"mt-6 grid grid-cols-1 gap-3 md:grid-cols-2 xl:grid-cols-3"},Ke=["onClick"],We={class:"flex items-start justify-between gap-3"},Xe={class:"mt-1 font-mono text-xs text-foreground"},Ye={class:"flex items-center gap-2"},Ze={class:"mt-4 grid grid-cols-2 gap-3 text-xs text-muted-foreground"},et={key:0,class:"mt-1 text-[11px]"},tt={key:0},ot={key:1},st={class:"mt-1 text-sm font-semibold text-foreground"},rt={class:"mt-1 text-sm font-semibold text-foreground"},lt={class:"mt-4 flex flex-wrap items-center gap-2"},nt=["onClick"],dt=["onClick"],at=["onClick"],it=["onClick"],ut={key:0,class:"rounded-2xl border border-border bg-background p-4 text-center text-xs text-muted-foreground"},ct={key:1,class:"relative mt-6 overflow-x-auto overflow-y-visible"},xt={class:"min-w-full text-left text-sm"},pt={class:"text-xs uppercase tracking-[0.2em] text-muted-foreground"},ft={class:"py-3 pr-4"},mt={class:"py-3 pr-6"},bt={class:"inline-flex items-center gap-2"},vt={class:"text-sm text-foreground"},gt={key:0},yt=["onClick"],_t={class:"py-4 pr-6 font-mono text-xs text-foreground"},wt={class:"py-4 pr-6"},ht={class:"py-4 pr-6"},kt={key:0,class:"block text-[11px] text-muted-foreground"},Ct={class:"py-4 pr-6 text-xs"},Vt={class:"py-4 pr-6 text-xs text-muted-foreground"},$t={class:"py-4 pr-6 text-xs text-muted-foreground"},At={class:"py-4 text-right"},St={class:"flex flex-wrap justify-end gap-2"},Dt=["onClick"],Et=["onClick"],Ut=["onClick"],jt=["onClick"],zt={key:0,class:"fixed inset-0 z-[100] flex items-center justify-center bg-black/30 px-4"},Mt={class:"w-full max-w-lg rounded-3xl border border-border bg-card p-6 shadow-xl"},Nt={key:0,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},Tt={class:"mt-4 space-y-3 text-sm"},Bt={key:0,class:"fixed inset-0 z-[100] flex items-center justify-center bg-black/30 px-4"},Ot={class:"w-full max-w-3xl rounded-3xl border border-border bg-card p-6 shadow-xl"},Jt={class:"flex items-center justify-between"},Lt={class:"flex items-center gap-2"},Ft={key:0,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},It={class:"mt-4"},Pt=["readonly"],Ht={class:"mt-6 flex items-center justify-end gap-2"},Qt=["disabled"],Yt=Ae({__name:"Accounts",setup(f){const x=Ne(),{accounts:b,isLoading:z}=Se(x),p=ze(),M=c(""),E=c("all"),u=c(new Set),A=c("table"),N=c(!1),l=c(""),_=c(!1),w=c(""),U=c(""),k=c(!1),T=c([]),i=c({id:"",secure_c_ses:"",csesidx:"",config_id:"",host_c_oses:"",expires_at:""}),J=c(null),G=c([]),fe=[{label:"全部状态",value:"all"},{label:"正常",value:"正常"},{label:"即将过期",value:"即将过期"},{label:"已过期",value:"已过期"},{label:"手动禁用",value:"手动禁用"},{label:"错误禁用",value:"错误禁用"},{label:"429限流",value:"429限流"}],C=R(()=>{const o=M.value.trim().toLowerCase();return b.value.filter(e=>{const s=!o||e.id.toLowerCase().includes(o),n=E.value==="all"||O(e)===E.value;return s&&n})}),B=R(()=>u.value.size),I=R(()=>C.value.length>0&&C.value.every(o=>u.value.has(o.id))),K=async()=>{await x.loadAccounts(),u.value=new Set};De(async()=>{await K()});const O=o=>o.cooldown_reason?.includes("429")&&o.cooldown_seconds>0?"429限流":o.cooldown_reason==="错误禁用"?"错误禁用":o.disabled?"手动禁用":o.status==="已过期"?"已过期":o.status==="即将过期"?"即将过期":"正常",W=o=>{const e=O(o);return e==="429限流"||e==="即将过期"?"bg-amber-200 text-amber-900":e==="错误禁用"||e==="已过期"?"bg-destructive/10 text-destructive":e==="手动禁用"?"bg-muted text-muted-foreground":"bg-emerald-500 text-white"},X=o=>o.cooldown_reason?.includes("429")&&o.cooldown_seconds>0?!0:o.disabled||o.cooldown_reason==="错误禁用",Y=o=>o==="已过期"?"过期":o==="未设置"?"未设置":o,Z=o=>o.status==="已过期"?"text-rose-600":o.status==="即将过期"?"text-amber-700":o.status==="未设置"?"text-muted-foreground":"text-emerald-600",ee=o=>o<60?`${o} 秒`:o<3600?`${Math.ceil(o/60)} 分钟`:`${(o/3600).toFixed(1)} 小时`,P=o=>o.cooldown_seconds>0?"text-amber-700":o.cooldown_reason==="错误禁用"?"text-rose-600":"text-muted-foreground",te=o=>{const e=O(o);return e==="手动禁用"||e==="已过期"?"bg-muted/70":""},L=o=>{const e=new Set(u.value);e.has(o)?e.delete(o):e.add(o),u.value=e},oe=()=>{if(I.value){u.value=new Set;return}u.value=new Set(C.value.map(o=>o.id))},me=(o,e)=>o.id||`account_${e+1}`,be=async()=>(await y.getConfig()).accounts.map((e,s)=>({...e,id:me(e,s)})),ve=(o,e)=>{let s=-1;for(let S=0;S<o.length;S+=1)if(o[S].id===e){s=S;break}if(s===-1)return l.value="未找到对应账号配置。",!1;const n=o[s];return i.value={id:n.id,secure_c_ses:n.secure_c_ses,csesidx:n.csesidx,config_id:n.config_id,host_c_oses:n.host_c_oses,expires_at:n.expires_at},G.value=o,J.value=s,N.value=!0,!0},se=async o=>{l.value="";try{const e=await be();ve(e,o)}catch(e){l.value=e.message||"加载账号配置失败"}},ge=async()=>{w.value="";try{const o=await y.getConfig();T.value=Array.isArray(o.accounts)?o.accounts:[],U.value=JSON.stringify(le(T.value),null,2),k.value=!0,_.value=!0}catch(o){w.value=o.message||"加载账号配置失败"}},H=()=>{_.value=!1,w.value="",k.value=!1},re=()=>{const o=JSON.parse(U.value);if(!Array.isArray(o))throw new Error("配置格式必须是数组。");return o},ye=o=>typeof o!="string"||!o?o:o.length<=6?`${o.slice(0,2)}****`:`${o.slice(0,3)}****`,le=o=>{const e=new Set(["secure_c_ses","csesidx","config_id","host_c_oses"]);return o.map(s=>{const n={...s};return e.forEach(S=>{const ie=n[S];ie&&(n[S]=ye(ie))}),n})},_e=()=>{if(w.value="",!k.value){try{T.value=re()}catch(o){w.value=o.message||"JSON 格式错误";return}U.value=JSON.stringify(le(T.value),null,2),k.value=!0;return}U.value=JSON.stringify(T.value,null,2),k.value=!1},we=async()=>{w.value="";try{const o=re();await x.updateConfig(o),H()}catch(o){w.value=o.message||"保存失败"}},Q=()=>{N.value=!1,l.value=""},he=async()=>{if(J.value===null)return;const o=[...G.value];o[J.value]={...o[J.value],id:i.value.id,secure_c_ses:i.value.secure_c_ses,csesidx:i.value.csesidx,config_id:i.value.config_id,host_c_oses:i.value.host_c_oses||void 0,expires_at:i.value.expires_at||void 0};try{await x.updateConfig(o),Q()}catch(e){l.value=e.message||"保存失败"}},ke=async()=>{await x.bulkEnable(Array.from(u.value)),u.value=new Set},Ce=async()=>{await p.ask({title:"批量禁用",message:"确定要批量禁用选中的账号吗?"})&&(await x.bulkDisable(Array.from(u.value)),u.value=new Set)},Ve=async()=>{await p.ask({title:"批量删除",message:"确定要批量删除选中的账号吗?",confirmText:"删除"})&&(await x.bulkDelete(Array.from(u.value)),u.value=new Set)},ne=async o=>{await x.enableAccount(o)},de=async o=>{await p.ask({title:"禁用账号",message:"确定要禁用该账号吗?"})&&await x.disableAccount(o)},ae=async o=>{await p.ask({title:"删除账号",message:"确定要删除该账号吗?",confirmText:"删除"})&&await x.deleteAccount(o)};return(o,e)=>(r(),d(q,null,[t("div",Te,[t("section",Be,[t("div",Oe,[t("div",Je,[V(t("input",{"onUpdate:modelValue":e[0]||(e[0]=s=>M.value=s),type:"text",placeholder:"搜索账号 ID",class:"w-full rounded-full border border-input bg-background px-4 py-2 text-sm sm:w-48"},null,512),[[$,M.value]]),D(Ue,{modelValue:E.value,"onUpdate:modelValue":e[1]||(e[1]=s=>E.value=s),options:fe},null,8,["modelValue"])]),t("div",Le,[D(F,{modelValue:I.value,"onUpdate:modelValue":oe},{default:Ee(()=>[...e[16]||(e[16]=[xe(" 全选 ",-1)])]),_:1},8,["modelValue"]),t("span",null,"共 "+a(C.value.length)+" 个账号",1),B.value?(r(),d("span",Fe,"已选 "+a(B.value)+" 个",1)):h("",!0),t("div",Ie,[t("button",{type:"button",class:m(["inline-flex h-8 w-8 items-center justify-center rounded-full border border-border text-muted-foreground transition-colors hover:border-primary hover:text-primary",A.value==="table"?"bg-accent text-accent-foreground":""]),onClick:e[2]||(e[2]=s=>A.value="table"),"aria-label":"列表视图"},[...e[17]||(e[17]=[t("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4",fill:"currentColor"},[t("path",{d:"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h16v2H4v-2z"})],-1)])],2),t("button",{type:"button",class:m(["inline-flex h-8 w-8 items-center justify-center rounded-full border border-border text-muted-foreground transition-colors hover:border-primary hover:text-primary",A.value==="card"?"bg-accent text-accent-foreground":""]),onClick:e[3]||(e[3]=s=>A.value="card"),"aria-label":"卡片视图"},[...e[18]||(e[18]=[t("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4",fill:"currentColor"},[t("path",{d:"M4 6h7v6H4V6zm9 0h7v6h-7V6zM4 14h7v4H4v-4zm9 0h7v4h-7v-4z"})],-1)])],2)])])]),t("div",Pe,[t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:ge}," 账户配置 "),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",disabled:v(z),onClick:K}," 刷新列表 ",8,He),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",disabled:!B.value,onClick:ke}," 批量启用 ",8,Qe),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",disabled:!B.value,onClick:Ce}," 批量禁用 ",8,Re),t("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-destructive transition-colors hover:border-destructive hover:text-destructive",disabled:!B.value,onClick:Ve}," 批量删除 ",8,qe)]),A.value==="card"?(r(),d("div",Ge,[(r(!0),d(q,null,ce(C.value,s=>(r(),d("div",{key:s.id,class:m(["rounded-2xl border border-border bg-card p-4",te(s)]),onClick:n=>L(s.id)},[t("div",We,[t("div",null,[e[19]||(e[19]=t("p",{class:"text-xs text-muted-foreground"},"账号 ID",-1)),t("p",Xe,a(s.id),1)]),t("div",Ye,[D(F,{modelValue:u.value.has(s.id),"onUpdate:modelValue":n=>L(s.id),onClick:e[4]||(e[4]=g(()=>{},["stop"]))},null,8,["modelValue","onUpdate:modelValue"]),t("span",{class:m(["inline-flex items-center rounded-full border border-border px-3 py-1 text-xs",W(s)])},a(O(s)),3)])]),t("div",Ze,[t("div",null,[e[20]||(e[20]=t("p",null,"剩余时间",-1)),t("p",{class:m(["mt-1 text-sm font-semibold",Z(s)])},a(Y(s.remaining_display)),3),s.expires_at?(r(),d("p",et,a(s.expires_at),1)):h("",!0)]),t("div",null,[e[21]||(e[21]=t("p",null,"冷却",-1)),t("p",{class:m(["mt-1",P(s)])},[s.cooldown_seconds>0?(r(),d("span",tt,a(ee(s.cooldown_seconds))+" · "+a(s.cooldown_reason),1)):(r(),d("span",ot,a(s.cooldown_reason||"无冷却"),1))],2)]),t("div",null,[e[22]||(e[22]=t("p",null,"失败数",-1)),t("p",st,a(s.error_count),1)]),t("div",null,[e[23]||(e[23]=t("p",null,"会话数",-1)),t("p",rt,a(s.conversation_count),1)])]),t("div",lt,[t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>se(s.id),["stop"])}," 编辑 ",8,nt),X(s)?(r(),d("button",{key:0,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:[e[5]||(e[5]=g(()=>{},["stop"])),n=>ne(s.id)]}," 启用 ",8,dt)):(r(),d("button",{key:1,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:[e[6]||(e[6]=g(()=>{},["stop"])),n=>de(s.id)]}," 禁用 ",8,at)),t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-destructive transition-colors hover:border-destructive hover:text-destructive",onClick:[e[7]||(e[7]=g(()=>{},["stop"])),n=>ae(s.id)]}," 删除 ",8,it)])],10,Ke))),128)),!C.value.length&&!v(z)?(r(),d("div",ut," 暂无账号数据,请检查后台配置。 ")):h("",!0)])):(r(),d("div",ct,[t("table",xt,[t("thead",pt,[t("tr",null,[t("th",ft,[D(F,{modelValue:I.value,"onUpdate:modelValue":oe},null,8,["modelValue"])]),e[25]||(e[25]=t("th",{class:"py-3 pr-6"},"账号 ID",-1)),e[26]||(e[26]=t("th",{class:"py-3 pr-6"},"状态",-1)),t("th",mt,[t("span",bt,[e[24]||(e[24]=xe(" 剩余/过期 ",-1)),D(Me,{text:"过期时间为 12 小时,账户过期以北京时间为准。"})])]),e[27]||(e[27]=t("th",{class:"py-3 pr-6"},"冷却",-1)),e[28]||(e[28]=t("th",{class:"py-3 pr-6"},"失败数",-1)),e[29]||(e[29]=t("th",{class:"py-3 pr-6"},"会话数",-1)),e[30]||(e[30]=t("th",{class:"py-3 text-right"},"操作",-1))])]),t("tbody",vt,[!C.value.length&&!v(z)?(r(),d("tr",gt,[...e[31]||(e[31]=[t("td",{colspan:"8",class:"py-8 text-center text-muted-foreground"}," 暂无账号数据,请检查后台配置。 ",-1)])])):h("",!0),(r(!0),d(q,null,ce(C.value,s=>(r(),d("tr",{key:s.id,class:m(["border-t border-border",te(s)]),onClick:n=>L(s.id)},[t("td",{class:"py-4 pr-4",onClick:e[8]||(e[8]=g(()=>{},["stop"]))},[D(F,{modelValue:u.value.has(s.id),"onUpdate:modelValue":n=>L(s.id)},null,8,["modelValue","onUpdate:modelValue"])]),t("td",_t,a(s.id),1),t("td",wt,[t("span",{class:m(["inline-flex items-center rounded-full border border-border px-3 py-1 text-xs",W(s)])},a(O(s)),3)]),t("td",ht,[t("div",{class:m(["text-sm font-semibold",Z(s)])},a(Y(s.remaining_display)),3),s.expires_at?(r(),d("span",kt,a(s.expires_at),1)):h("",!0)]),t("td",Ct,[s.cooldown_seconds>0?(r(),d("span",{key:0,class:m(P(s))},a(ee(s.cooldown_seconds))+" · "+a(s.cooldown_reason),3)):(r(),d("span",{key:1,class:m(P(s))},a(s.cooldown_reason||"无冷却"),3))]),t("td",Vt,a(s.error_count),1),t("td",$t,a(s.conversation_count),1),t("td",At,[t("div",St,[t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>se(s.id),["stop"])}," 编辑 ",8,Dt),X(s)?(r(),d("button",{key:0,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>ne(s.id),["stop"])}," 启用 ",8,Et)):(r(),d("button",{key:1,class:"rounded-full border border-border px-3 py-1 text-xs text-foreground transition-colors hover:border-primary hover:text-primary",onClick:g(n=>de(s.id),["stop"])}," 禁用 ",8,Ut)),t("button",{class:"rounded-full border border-border px-3 py-1 text-xs text-destructive transition-colors hover:border-destructive hover:text-destructive",onClick:g(n=>ae(s.id),["stop"])}," 删除 ",8,jt)])])],10,yt))),128))])])]))])]),D(je,{open:v(p).open.value,title:v(p).title.value,message:v(p).message.value,"confirm-text":v(p).confirmText.value,"cancel-text":v(p).cancelText.value,onConfirm:v(p).confirm,onCancel:v(p).cancel},null,8,["open","title","message","confirm-text","cancel-text","onConfirm","onCancel"]),(r(),ue(pe,{to:"body"},[N.value?(r(),d("div",zt,[t("div",Mt,[t("div",{class:"flex items-center justify-between"},[e[32]||(e[32]=t("p",{class:"text-sm font-medium text-foreground"},"编辑账号",-1)),t("button",{class:"text-xs text-muted-foreground transition-colors hover:text-foreground",onClick:Q}," 关闭 ")]),l.value?(r(),d("div",Nt,a(l.value),1)):h("",!0),t("div",Tt,[e[33]||(e[33]=t("label",{class:"block text-xs text-muted-foreground"},"账号 ID",-1)),V(t("input",{"onUpdate:modelValue":e[9]||(e[9]=s=>i.value.id=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",disabled:""},null,512),[[$,i.value.id]]),e[34]||(e[34]=t("label",{class:"block text-xs text-muted-foreground"},"secure_c_ses",-1)),V(t("textarea",{"onUpdate:modelValue":e[10]||(e[10]=s=>i.value.secure_c_ses=s),class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",rows:"3"},null,512),[[$,i.value.secure_c_ses]]),e[35]||(e[35]=t("label",{class:"block text-xs text-muted-foreground"},"csesidx",-1)),V(t("input",{"onUpdate:modelValue":e[11]||(e[11]=s=>i.value.csesidx=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[$,i.value.csesidx]]),e[36]||(e[36]=t("label",{class:"block text-xs text-muted-foreground"},"config_id",-1)),V(t("input",{"onUpdate:modelValue":e[12]||(e[12]=s=>i.value.config_id=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[$,i.value.config_id]]),e[37]||(e[37]=t("label",{class:"block text-xs text-muted-foreground"},"host_c_oses",-1)),V(t("input",{"onUpdate:modelValue":e[13]||(e[13]=s=>i.value.host_c_oses=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[$,i.value.host_c_oses]]),e[38]||(e[38]=t("label",{class:"block text-xs text-muted-foreground"},"expires_at",-1)),V(t("input",{"onUpdate:modelValue":e[14]||(e[14]=s=>i.value.expires_at=s),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"2025-12-23 10:59:21"},null,512),[[$,i.value.expires_at]])]),t("div",{class:"mt-6 flex items-center justify-end gap-2"},[t("button",{class:"rounded-full border border-border px-4 py-2 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:Q}," 取消 "),t("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",onClick:he}," 保存 ")])])])):h("",!0)])),(r(),ue(pe,{to:"body"},[_.value?(r(),d("div",Bt,[t("div",Ot,[t("div",Jt,[e[39]||(e[39]=t("p",{class:"text-sm font-medium text-foreground"},"账户配置(JSON)",-1)),t("div",Lt,[t("button",{class:"rounded-full bg-foreground px-3 py-1 text-xs text-background transition-opacity hover:opacity-90",onClick:_e},a(k.value?"显示原文":"脱敏显示"),1),t("button",{class:"text-xs text-muted-foreground transition-colors hover:text-foreground",onClick:H}," 关闭 ")])]),w.value?(r(),d("div",Ft,a(w.value),1)):h("",!0),t("div",It,[V(t("textarea",{"onUpdate:modelValue":e[15]||(e[15]=s=>U.value=s),class:"h-96 w-full rounded-2xl border border-input bg-background px-4 py-3 font-mono text-xs text-foreground",spellcheck:"false",readonly:k.value},null,8,Pt),[[$,U.value]])]),t("div",Ht,[t("button",{class:"rounded-full border border-border px-4 py-2 text-sm text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:H}," 取消 "),t("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",onClick:we,disabled:k.value}," 保存 ",8,Qt)])])])):h("",!0)]))],64))}});export{Yt as default};
|
static/assets/AppShell-BbGZjE35.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as F,l as U,h as y,i as f,q as Z,s as S,c as l,a as e,x as m,y as G,b as d,n as u,F as V,r as $,z as K,t as p,A as w,u as a,R as k,B as O,T as q,p as E,f as A,e as s}from"./index-B0A0-QFY.js";import{u as J}from"./settings-MHx3aXRd.js";import{_ as Q}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-Bkr0tSJw.js";import{u as W}from"./useConfirmDialog-BS9rDomX.js";const X={class:"min-h-screen"},Y={class:"flex min-h-screen flex-col lg:flex-row"},ee={key:0,class:"text-base font-semibold text-foreground"},te={key:0,class:"px-3 pb-2 text-xs uppercase tracking-[0.28em] text-muted-foreground"},re={class:"space-y-1"},oe={"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-5 w-5",fill:"currentColor"},se=["d"],ne={key:0,class:"flex-1 min-w-0 truncate"},le={key:1,class:"ml-auto text-xs opacity-0 transition-opacity group-hover:opacity-100"},ae={class:"mt-auto border-t border-border px-6 py-3 lg:py-4"},ie={key:0,class:"rounded-2xl bg-secondary/60 p-3"},de=["title"],ue={class:"min-w-0 flex-1 overflow-hidden lg:ml-0"},pe={class:"min-w-0 flex flex-col gap-4 border-b border-border bg-card/70 px-6 py-5 backdrop-blur lg:flex-row lg:items-center lg:justify-between lg:px-10"},ce={class:"flex items-center gap-3"},xe={class:"text-xl font-semibold text-foreground lg:text-2xl"},fe={class:"flex flex-wrap items-center gap-3"},me={class:"h-full overflow-y-auto overflow-x-hidden bg-card/70 px-4 pb-10 pt-6 backdrop-blur lg:px-10 lg:pt-10"},be={key:0,class:"fixed inset-0 z-[100] flex items-center justify-center bg-black/30 px-4"},ge={class:"w-full max-w-lg rounded-3xl border border-border bg-card p-6 shadow-xl"},ve={class:"flex items-center justify-between"},he={class:"mt-4 space-y-3 text-sm"},ye={class:"mt-1 flex items-start gap-2"},we={class:"min-w-0 flex-1 break-all rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},ke={class:"mt-1 flex items-start gap-2"},_e={class:"min-w-0 flex-1 break-all rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},ze={class:"mt-1 flex items-start gap-2"},Ce={class:"min-w-0 flex-1 break-all rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},He={class:"mt-1 rounded-2xl border border-border bg-background px-3 py-2 text-xs text-muted-foreground"},Me={class:"flex flex-wrap gap-2 text-foreground"},Se={class:"mt-1 flex items-start gap-2"},Ve={class:"min-w-0 flex-1 rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},$e={class:"mt-6 flex items-center justify-end"},Ie=F({__name:"AppShell",setup(Ae){const L=E(),b=Z(),j=U(),c=J(),x=y(!1),o=y(!1),i=W(),g=y(!1),_=[{path:"/",label:"概览",icon:"M4 4h7v7H4V4zm9 0h7v4h-7V4zm0 6h7v10h-7V10zM4 13h7v7H4v-7z"},{path:"/accounts",label:"账号管理",icon:"M12 12a3.5 3.5 0 1 0-3.5-3.5A3.5 3.5 0 0 0 12 12zm0 2c-4.1 0-7.5 2.2-7.5 5v1h15v-1c0-2.8-3.4-5-7.5-5z"},{path:"/settings",label:"系统设置",icon:"M4 6h10v2H4V6zm12 0h4v2h-4V6zM4 11h6v2H4v-2zm8 0h8v2h-8v-2zM4 16h10v2H4v-2zm12 0h4v2h-4v-2z"},{path:"/monitor",label:"监控状态",icon:"M3 12h4l2-4 4 8 3-6h5v2h-4l-4 8-4-8-2 4H3v-2z"},{path:"/logs",label:"运行日志",icon:"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h10v2H4v-2z"},{path:"/docs",label:"文档中心",icon:"M6 3h9l4 4v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zm8 1.5V8h3.5L14 4.5zM8 11h8v2H8v-2zm0 4h8v2H8v-2z"}],B=f(()=>_.find(t=>t.path===b.path)?.label||"概览"),D=n=>{const r=`transition-colors ${o.value?"px-2 justify-center gap-0":"px-3 gap-3"}`;return b.path===n?`${r} bg-primary text-primary-foreground`:`${r} text-muted-foreground hover:bg-accent hover:text-accent-foreground`},I=n=>b.path===n?"bg-primary-foreground/15 text-primary-foreground border-primary-foreground/40":"bg-secondary text-muted-foreground group-hover:text-accent-foreground",v=f(()=>(c.settings?.basic?.base_url||""||window.location.origin).replace(/\/$/,"")),z=f(()=>`${v.value}/v1`),C=f(()=>`${v.value}/v1/chat/completions`),H=f(()=>c.settings?.basic?.api_key||"未设置"),T=["gemini-auto","gemini-2.5-flash","gemini-2.5-pro","gemini-3-flash-preview","gemini-3-pro-preview"];S(()=>b.path,()=>{x.value=!1});const M=localStorage.getItem("sidebar-collapsed");M&&(o.value=M==="true"),S(o,n=>{localStorage.setItem("sidebar-collapsed",n?"true":"false")});async function N(){await i.ask({title:"退出登录",message:"确定退出管理控制台吗?"})&&(await j.logout(),L.push({name:"login"}))}function P(){window.location.reload()}async function R(){g.value=!0,!c.settings&&!c.isLoading&&await c.loadSettings()}async function h(n){if(n)try{await navigator.clipboard.writeText(n)}catch(t){console.error("Copy failed",t)}}return(n,t)=>(s(),l("div",X,[e("div",Y,[x.value?(s(),l("div",{key:0,class:"fixed inset-0 z-30 bg-black/20 backdrop-blur-sm lg:hidden",onClick:t[0]||(t[0]=r=>x.value=!1)})):d("",!0),e("aside",{class:u(["fixed inset-y-0 left-0 z-40 w-72 -translate-x-full bg-card/90 backdrop-blur-sm lg:backdrop-blur-none border-r border-border transition-transform duration-200 ease-out will-change-[transform] transform-gpu flex flex-col lg:static lg:translate-x-0 lg:bg-card/80 lg:border-b-0 lg:border-r lg:sticky lg:top-0 lg:h-screen",[{"translate-x-0":x.value,"w-20 lg:w-20":o.value}]])},[e("div",{class:u(["flex h-16 items-center justify-between px-6 pt-4 lg:h-20 lg:pt-5",o.value?"justify-center px-0":""])},[e("div",{class:u(["flex items-center gap-2",o.value?"gap-0 justify-center w-full":""])},[t[9]||(t[9]=e("a",{href:"https://github.com/Dreamy-rain/gemini-business2api",target:"_blank",rel:"noopener noreferrer",class:"text-foreground transition-colors hover:text-primary","aria-label":"GitHub"},[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-6 w-6",fill:"currentColor"},[e("path",{d:"M12 2C6.477 2 2 6.477 2 12c0 4.419 2.865 8.166 6.839 9.489.5.09.682-.217.682-.483 0-.237-.009-.868-.014-1.703-2.782.604-3.369-1.341-3.369-1.341-.454-1.154-1.11-1.462-1.11-1.462-.908-.62.069-.608.069-.608 1.004.071 1.532 1.031 1.532 1.031.892 1.529 2.341 1.087 2.91.832.091-.647.349-1.087.636-1.337-2.22-.253-4.555-1.11-4.555-4.944 0-1.092.39-1.987 1.029-2.687-.103-.253-.446-1.272.098-2.65 0 0 .84-.269 2.75 1.026A9.564 9.564 0 0 1 12 6.844c.85.004 1.705.115 2.504.337 1.909-1.295 2.748-1.026 2.748-1.026.546 1.378.202 2.397.1 2.65.64.7 1.028 1.595 1.028 2.687 0 3.842-2.338 4.687-4.566 4.936.359.309.678.919.678 1.852 0 1.337-.012 2.418-.012 2.747 0 .268.18.577.688.479A10.002 10.002 0 0 0 22 12c0-5.523-4.477-10-10-10z"})])],-1)),o.value?d("",!0):(s(),l("span",ee,"Gemini Business2API"))],2)],2),e("nav",{class:u(["pb-4 pt-4 lg:pt-6 flex-1 overflow-y-auto",o.value?"px-2":"px-3"])},[o.value?d("",!0):(s(),l("p",te," 导航 ")),e("div",re,[(s(),l(V,null,$(_,r=>m(a(k),{key:r.path,to:r.path,class:u(["group flex items-center rounded-2xl py-2 text-sm font-medium transition-colors overflow-hidden",D(r.path)]),title:o.value?r.label:void 0},{default:w(()=>[e("span",{class:u(["inline-flex h-9 w-9 items-center justify-center rounded-2xl border border-border",I(r.path)])},[(s(),l("svg",oe,[e("path",{d:r.icon},null,8,se)]))],2),o.value?d("",!0):(s(),l("span",ne,p(r.label),1)),o.value?d("",!0):(s(),l("span",le," 进入 "))]),_:2},1032,["to","class","title"])),64))])],2),e("div",ae,[o.value?d("",!0):(s(),l("div",ie,[...t[10]||(t[10]=[e("p",{class:"text-xs tracking-[0.12em] text-muted-foreground"},[e("a",{href:"https://github.com/Dreamy-rain/gemini-business2api",target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-1 transition-colors hover:text-foreground"}," gemini-business2api "),e("span",null," · 声明")],-1),e("p",{class:"mt-2 text-xs text-muted-foreground"}," 本项目仅限学习与研究用途,禁止用于商业用途。请保留本声明、原作者信息与开源来源。 ",-1)])])),e("div",{class:u(["mt-4 flex items-center gap-3",o.value?"justify-center":""])},[o.value?d("",!0):(s(),l("button",{key:0,onClick:N,class:"flex-1 rounded-2xl border border-border bg-background px-4 py-3 text-sm font-medium text-muted-foreground transition-colors hover:border-destructive/40 hover:text-destructive"}," 退出登录 ")),e("button",{class:"h-10 w-10 shrink-0 items-center justify-center rounded-2xl border border-border text-muted-foreground transition-all hover:border-primary hover:text-primary flex",onClick:t[1]||(t[1]=r=>o.value=!o.value),title:o.value?"展开侧边栏":"收起侧边栏"},[...t[11]||(t[11]=[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4 shrink-0",fill:"currentColor"},[e("path",{d:"M6 4h2v16H6V4zm4 4h8v2h-8V8zm0 6h8v2h-8v-2z"})],-1)])],8,de)],2)])],2),e("main",ue,[e("header",pe,[e("div",ce,[e("button",{class:"inline-flex h-10 w-10 items-center justify-center rounded-full border border-border text-foreground transition-colors hover:border-primary hover:text-primary lg:hidden",onClick:t[2]||(t[2]=r=>x.value=!0),"aria-label":"打开导航"},[...t[12]||(t[12]=[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-5 w-5",fill:"currentColor"},[e("path",{d:"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h16v2H4v-2z"})],-1)])]),t[13]||(t[13]=K('<svg aria-hidden="true" viewBox="0 0 130 150" class="logo-mark h-9 w-9 shrink-0 text-foreground"><defs><filter id="head-shadow" x="-50%" y="-50%" width="200%" height="200%"><feDropShadow dx="0" dy="10" stdDeviation="12" flood-color="rgba(0, 188, 212, 0.2)"></feDropShadow></filter></defs><g class="logo-cat-wrapper" transform="translate(0, 12)"><g transform="translate(16, 20) rotate(-10, 9, 12)"><path d="M14 0 L18 24 L0 24 Z" fill="#2c3e50"></path></g><g transform="translate(96, 20) rotate(10, 9, 12)"><path d="M4 0 L18 24 L0 24 Z" fill="#2c3e50"></path></g><g filter="url(#head-shadow)"><path d="M 32 40 L 98 40 A 12 12 0 0 1 110 52 L 110 90 A 30 30 0 0 1 80 120 L 50 120 A 30 30 0 0 1 20 90 L 20 52 A 12 12 0 0 1 32 40 Z" fill="rgba(255, 255, 255, 0.9)" stroke="#2c3e50" stroke-width="3"></path></g><rect class="logo-eye" x="35" y="68" width="14" height="4" rx="1"></rect><rect class="logo-eye" x="81" y="68" width="14" height="4" rx="1"></rect></g></svg>',1)),e("h2",xe,p(B.value),1)]),e("div",fe,[e("button",{onClick:P,class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",title:"刷新"}," 刷新 "),e("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:R}," 接口信息 "),m(a(k),{to:"/public/uptime",target:"_blank",class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary"},{default:w(()=>[...t[14]||(t[14]=[A(" 状态监控 ",-1)])]),_:1}),m(a(k),{to:"/public/logs",target:"_blank",class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary"},{default:w(()=>[...t[15]||(t[15]=[A(" 公开日志 ",-1)])]),_:1})])]),e("div",me,[m(a(O))])])]),m(Q,{open:a(i).open.value,title:a(i).title.value,message:a(i).message.value,"confirm-text":a(i).confirmText.value,"cancel-text":a(i).cancelText.value,onConfirm:a(i).confirm,onCancel:a(i).cancel},null,8,["open","title","message","confirm-text","cancel-text","onConfirm","onCancel"]),(s(),G(q,{to:"body"},[g.value?(s(),l("div",be,[e("div",ge,[e("div",ve,[t[16]||(t[16]=e("p",{class:"text-sm font-medium text-foreground"},"API 接口",-1)),e("button",{class:"text-xs text-muted-foreground transition-colors hover:text-foreground",onClick:t[3]||(t[3]=r=>g.value=!1)}," 关闭 ")]),t[22]||(t[22]=e("p",{class:"mt-2 text-xs text-muted-foreground"},"根据客户端选择对应接口",-1)),e("div",he,[e("div",null,[t[17]||(t[17]=e("p",{class:"text-xs text-muted-foreground"},"基础端点",-1)),e("div",ye,[e("p",we,p(v.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[4]||(t[4]=r=>h(v.value))}," 复制 ")])]),e("div",null,[t[18]||(t[18]=e("p",{class:"text-xs text-muted-foreground"},"SDK 接口",-1)),e("div",ke,[e("p",_e,p(z.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[5]||(t[5]=r=>h(z.value))}," 复制 ")])]),e("div",null,[t[19]||(t[19]=e("p",{class:"text-xs text-muted-foreground"},"完整接口",-1)),e("div",ze,[e("p",Ce,p(C.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[6]||(t[6]=r=>h(C.value))}," 复制 ")])]),e("div",null,[t[20]||(t[20]=e("p",{class:"text-xs text-muted-foreground"},"支持模型",-1)),e("div",He,[e("div",Me,[(s(),l(V,null,$(T,r=>e("span",{key:r,class:"rounded-full border border-border px-2 py-0.5 text-[11px]"},p(r),1)),64))])])]),e("div",null,[t[21]||(t[21]=e("p",{class:"text-xs text-muted-foreground"},"API 密钥",-1)),e("div",Se,[e("p",Ve,p(H.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[7]||(t[7]=r=>h(H.value))}," 复制 ")])])]),e("div",$e,[e("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",onClick:t[8]||(t[8]=r=>g.value=!1)}," 知道了 ")])])])):d("",!0)]))]))}});export{Ie as default};
|
static/assets/AppShell-Cu5Okzxz.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as F,l as U,h as y,i as f,q as Z,s as S,c as l,a as e,x as m,y as G,b as d,n as u,F as V,r as $,z as K,t as p,A as w,u as a,R as k,B as O,T as q,p as E,f as A,e as s}from"./index-Bld7Uski.js";import{u as J}from"./settings-H-RYxUda.js";import{_ as Q}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-QhDFiT60.js";import{u as W}from"./useConfirmDialog-XZs7petQ.js";const X={class:"min-h-screen"},Y={class:"flex min-h-screen flex-col lg:flex-row"},ee={key:0,class:"text-base font-semibold text-foreground"},te={key:0,class:"px-3 pb-2 text-xs uppercase tracking-[0.28em] text-muted-foreground"},re={class:"space-y-1"},oe={"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-5 w-5",fill:"currentColor"},se=["d"],ne={key:0,class:"flex-1 min-w-0 truncate"},le={key:1,class:"ml-auto text-xs opacity-0 transition-opacity group-hover:opacity-100"},ae={class:"mt-auto border-t border-border px-6 py-3 lg:py-4"},ie={key:0,class:"rounded-2xl bg-secondary/60 p-3"},de=["title"],ue={class:"min-w-0 flex-1 overflow-hidden lg:ml-0"},pe={class:"min-w-0 flex flex-col gap-4 border-b border-border bg-card/70 px-6 py-5 backdrop-blur lg:flex-row lg:items-center lg:justify-between lg:px-10"},ce={class:"flex items-center gap-3"},xe={class:"text-xl font-semibold text-foreground lg:text-2xl"},fe={class:"flex flex-wrap items-center gap-3"},me={class:"h-full overflow-y-auto overflow-x-hidden bg-card/70 px-4 pb-10 pt-6 backdrop-blur lg:px-10 lg:pt-10"},be={key:0,class:"fixed inset-0 z-[100] flex items-center justify-center bg-black/30 px-4"},ge={class:"w-full max-w-lg rounded-3xl border border-border bg-card p-6 shadow-xl"},ve={class:"flex items-center justify-between"},he={class:"mt-4 space-y-3 text-sm"},ye={class:"mt-1 flex items-start gap-2"},we={class:"min-w-0 flex-1 break-all rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},ke={class:"mt-1 flex items-start gap-2"},_e={class:"min-w-0 flex-1 break-all rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},ze={class:"mt-1 flex items-start gap-2"},Ce={class:"min-w-0 flex-1 break-all rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},He={class:"mt-1 rounded-2xl border border-border bg-background px-3 py-2 text-xs text-muted-foreground"},Me={class:"flex flex-wrap gap-2 text-foreground"},Se={class:"mt-1 flex items-start gap-2"},Ve={class:"min-w-0 flex-1 rounded-2xl border border-border bg-background px-3 py-2 font-mono text-xs"},$e={class:"mt-6 flex items-center justify-end"},Ie=F({__name:"AppShell",setup(Ae){const L=E(),b=Z(),j=U(),c=J(),x=y(!1),o=y(!1),i=W(),g=y(!1),_=[{path:"/",label:"概览",icon:"M4 4h7v7H4V4zm9 0h7v4h-7V4zm0 6h7v10h-7V10zM4 13h7v7H4v-7z"},{path:"/accounts",label:"账号管理",icon:"M12 12a3.5 3.5 0 1 0-3.5-3.5A3.5 3.5 0 0 0 12 12zm0 2c-4.1 0-7.5 2.2-7.5 5v1h15v-1c0-2.8-3.4-5-7.5-5z"},{path:"/settings",label:"系统设置",icon:"M4 6h10v2H4V6zm12 0h4v2h-4V6zM4 11h6v2H4v-2zm8 0h8v2h-8v-2zM4 16h10v2H4v-2zm12 0h4v2h-4v-2z"},{path:"/monitor",label:"监控状态",icon:"M3 12h4l2-4 4 8 3-6h5v2h-4l-4 8-4-8-2 4H3v-2z"},{path:"/logs",label:"运行日志",icon:"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h10v2H4v-2z"},{path:"/docs",label:"文档中心",icon:"M6 3h9l4 4v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2zm8 1.5V8h3.5L14 4.5zM8 11h8v2H8v-2zm0 4h8v2H8v-2z"}],B=f(()=>_.find(t=>t.path===b.path)?.label||"概览"),D=n=>{const r=`transition-colors ${o.value?"px-2 justify-center gap-0":"px-3 gap-3"}`;return b.path===n?`${r} bg-primary text-primary-foreground`:`${r} text-muted-foreground hover:bg-accent hover:text-accent-foreground`},I=n=>b.path===n?"bg-primary-foreground/15 text-primary-foreground border-primary-foreground/40":"bg-secondary text-muted-foreground group-hover:text-accent-foreground",v=f(()=>(c.settings?.basic?.base_url||""||window.location.origin).replace(/\/$/,"")),z=f(()=>`${v.value}/v1`),C=f(()=>`${v.value}/v1/chat/completions`),H=f(()=>c.settings?.basic?.api_key||"未设置"),T=["gemini-auto","gemini-2.5-flash","gemini-2.5-pro","gemini-3-flash-preview","gemini-3-pro-preview"];S(()=>b.path,()=>{x.value=!1});const M=localStorage.getItem("sidebar-collapsed");M&&(o.value=M==="true"),S(o,n=>{localStorage.setItem("sidebar-collapsed",n?"true":"false")});async function N(){await i.ask({title:"退出登录",message:"确定退出管理控制台吗?"})&&(await j.logout(),L.push({name:"login"}))}function P(){window.location.reload()}async function R(){g.value=!0,!c.settings&&!c.isLoading&&await c.loadSettings()}async function h(n){if(n)try{await navigator.clipboard.writeText(n)}catch(t){console.error("Copy failed",t)}}return(n,t)=>(s(),l("div",X,[e("div",Y,[x.value?(s(),l("div",{key:0,class:"fixed inset-0 z-30 bg-black/20 backdrop-blur-sm lg:hidden",onClick:t[0]||(t[0]=r=>x.value=!1)})):d("",!0),e("aside",{class:u(["fixed inset-y-0 left-0 z-40 w-72 -translate-x-full bg-card/90 backdrop-blur-sm lg:backdrop-blur-none border-r border-border transition-transform duration-200 ease-out will-change-[transform] transform-gpu flex flex-col lg:static lg:translate-x-0 lg:bg-card/80 lg:border-b-0 lg:border-r lg:sticky lg:top-0 lg:h-screen",[{"translate-x-0":x.value,"w-20 lg:w-20":o.value}]])},[e("div",{class:u(["flex h-16 items-center justify-between px-6 pt-4 lg:h-20 lg:pt-5",o.value?"justify-center px-0":""])},[e("div",{class:u(["flex items-center gap-2",o.value?"gap-0 justify-center w-full":""])},[t[9]||(t[9]=e("a",{href:"https://github.com/Dreamy-rain/gemini-business2api",target:"_blank",rel:"noopener noreferrer",class:"text-foreground transition-colors hover:text-primary","aria-label":"GitHub"},[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-6 w-6",fill:"currentColor"},[e("path",{d:"M12 2C6.477 2 2 6.477 2 12c0 4.419 2.865 8.166 6.839 9.489.5.09.682-.217.682-.483 0-.237-.009-.868-.014-1.703-2.782.604-3.369-1.341-3.369-1.341-.454-1.154-1.11-1.462-1.11-1.462-.908-.62.069-.608.069-.608 1.004.071 1.532 1.031 1.532 1.031.892 1.529 2.341 1.087 2.91.832.091-.647.349-1.087.636-1.337-2.22-.253-4.555-1.11-4.555-4.944 0-1.092.39-1.987 1.029-2.687-.103-.253-.446-1.272.098-2.65 0 0 .84-.269 2.75 1.026A9.564 9.564 0 0 1 12 6.844c.85.004 1.705.115 2.504.337 1.909-1.295 2.748-1.026 2.748-1.026.546 1.378.202 2.397.1 2.65.64.7 1.028 1.595 1.028 2.687 0 3.842-2.338 4.687-4.566 4.936.359.309.678.919.678 1.852 0 1.337-.012 2.418-.012 2.747 0 .268.18.577.688.479A10.002 10.002 0 0 0 22 12c0-5.523-4.477-10-10-10z"})])],-1)),o.value?d("",!0):(s(),l("span",ee,"Gemini Business2API"))],2)],2),e("nav",{class:u(["pb-4 pt-4 lg:pt-6 flex-1 overflow-y-auto",o.value?"px-2":"px-3"])},[o.value?d("",!0):(s(),l("p",te," 导航 ")),e("div",re,[(s(),l(V,null,$(_,r=>m(a(k),{key:r.path,to:r.path,class:u(["group flex items-center rounded-2xl py-2 text-sm font-medium transition-colors overflow-hidden",D(r.path)]),title:o.value?r.label:void 0},{default:w(()=>[e("span",{class:u(["inline-flex h-9 w-9 items-center justify-center rounded-2xl border border-border",I(r.path)])},[(s(),l("svg",oe,[e("path",{d:r.icon},null,8,se)]))],2),o.value?d("",!0):(s(),l("span",ne,p(r.label),1)),o.value?d("",!0):(s(),l("span",le," 进入 "))]),_:2},1032,["to","class","title"])),64))])],2),e("div",ae,[o.value?d("",!0):(s(),l("div",ie,[...t[10]||(t[10]=[e("p",{class:"text-xs tracking-[0.12em] text-muted-foreground"},[e("a",{href:"https://github.com/Dreamy-rain/gemini-business2api",target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-1 transition-colors hover:text-foreground"}," gemini-business2api "),e("span",null," · 声明")],-1),e("p",{class:"mt-2 text-xs text-muted-foreground"}," 本项目仅限学习与研究用途,禁止用于商业用途。请保留本声明、原作者信息与开源来源。 ",-1)])])),e("div",{class:u(["mt-4 flex items-center gap-3",o.value?"justify-center":""])},[o.value?d("",!0):(s(),l("button",{key:0,onClick:N,class:"flex-1 rounded-2xl border border-border bg-background px-4 py-3 text-sm font-medium text-muted-foreground transition-colors hover:border-destructive/40 hover:text-destructive"}," 退出登录 ")),e("button",{class:"h-10 w-10 shrink-0 items-center justify-center rounded-2xl border border-border text-muted-foreground transition-all hover:border-primary hover:text-primary flex",onClick:t[1]||(t[1]=r=>o.value=!o.value),title:o.value?"展开侧边栏":"收起侧边栏"},[...t[11]||(t[11]=[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4 shrink-0",fill:"currentColor"},[e("path",{d:"M6 4h2v16H6V4zm4 4h8v2h-8V8zm0 6h8v2h-8v-2z"})],-1)])],8,de)],2)])],2),e("main",ue,[e("header",pe,[e("div",ce,[e("button",{class:"inline-flex h-10 w-10 items-center justify-center rounded-full border border-border text-foreground transition-colors hover:border-primary hover:text-primary lg:hidden",onClick:t[2]||(t[2]=r=>x.value=!0),"aria-label":"打开导航"},[...t[12]||(t[12]=[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-5 w-5",fill:"currentColor"},[e("path",{d:"M4 6h16v2H4V6zm0 5h16v2H4v-2zm0 5h16v2H4v-2z"})],-1)])]),t[13]||(t[13]=K('<svg aria-hidden="true" viewBox="0 0 130 150" class="logo-mark h-9 w-9 shrink-0 text-foreground"><defs><filter id="head-shadow" x="-50%" y="-50%" width="200%" height="200%"><feDropShadow dx="0" dy="10" stdDeviation="12" flood-color="rgba(0, 188, 212, 0.2)"></feDropShadow></filter></defs><g class="logo-cat-wrapper" transform="translate(0, 12)"><g transform="translate(16, 20) rotate(-10, 9, 12)"><path d="M14 0 L18 24 L0 24 Z" fill="#2c3e50"></path></g><g transform="translate(96, 20) rotate(10, 9, 12)"><path d="M4 0 L18 24 L0 24 Z" fill="#2c3e50"></path></g><g filter="url(#head-shadow)"><path d="M 32 40 L 98 40 A 12 12 0 0 1 110 52 L 110 90 A 30 30 0 0 1 80 120 L 50 120 A 30 30 0 0 1 20 90 L 20 52 A 12 12 0 0 1 32 40 Z" fill="rgba(255, 255, 255, 0.9)" stroke="#2c3e50" stroke-width="3"></path></g><rect class="logo-eye" x="35" y="68" width="14" height="4" rx="1"></rect><rect class="logo-eye" x="81" y="68" width="14" height="4" rx="1"></rect></g></svg>',1)),e("h2",xe,p(B.value),1)]),e("div",fe,[e("button",{onClick:P,class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",title:"刷新"}," 刷新 "),e("button",{class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:R}," 接口信息 "),m(a(k),{to:"/public/uptime",target:"_blank",class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary"},{default:w(()=>[...t[14]||(t[14]=[A(" 状态监控 ",-1)])]),_:1}),m(a(k),{to:"/public/logs",target:"_blank",class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary"},{default:w(()=>[...t[15]||(t[15]=[A(" 公开日志 ",-1)])]),_:1})])]),e("div",me,[m(a(O))])])]),m(Q,{open:a(i).open.value,title:a(i).title.value,message:a(i).message.value,"confirm-text":a(i).confirmText.value,"cancel-text":a(i).cancelText.value,onConfirm:a(i).confirm,onCancel:a(i).cancel},null,8,["open","title","message","confirm-text","cancel-text","onConfirm","onCancel"]),(s(),G(q,{to:"body"},[g.value?(s(),l("div",be,[e("div",ge,[e("div",ve,[t[16]||(t[16]=e("p",{class:"text-sm font-medium text-foreground"},"API 接口",-1)),e("button",{class:"text-xs text-muted-foreground transition-colors hover:text-foreground",onClick:t[3]||(t[3]=r=>g.value=!1)}," 关闭 ")]),t[22]||(t[22]=e("p",{class:"mt-2 text-xs text-muted-foreground"},"根据客户端选择对应接口",-1)),e("div",he,[e("div",null,[t[17]||(t[17]=e("p",{class:"text-xs text-muted-foreground"},"基础端点",-1)),e("div",ye,[e("p",we,p(v.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[4]||(t[4]=r=>h(v.value))}," 复制 ")])]),e("div",null,[t[18]||(t[18]=e("p",{class:"text-xs text-muted-foreground"},"SDK 接口",-1)),e("div",ke,[e("p",_e,p(z.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[5]||(t[5]=r=>h(z.value))}," 复制 ")])]),e("div",null,[t[19]||(t[19]=e("p",{class:"text-xs text-muted-foreground"},"完整接口",-1)),e("div",ze,[e("p",Ce,p(C.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[6]||(t[6]=r=>h(C.value))}," 复制 ")])]),e("div",null,[t[20]||(t[20]=e("p",{class:"text-xs text-muted-foreground"},"支持模型",-1)),e("div",He,[e("div",Me,[(s(),l(V,null,$(T,r=>e("span",{key:r,class:"rounded-full border border-border px-2 py-0.5 text-[11px]"},p(r),1)),64))])])]),e("div",null,[t[21]||(t[21]=e("p",{class:"text-xs text-muted-foreground"},"API 密钥",-1)),e("div",Se,[e("p",Ve,p(H.value),1),e("button",{class:"shrink-0 rounded-full border border-border px-3 py-1 text-[11px] text-muted-foreground transition-colors hover:border-primary hover:text-primary",onClick:t[7]||(t[7]=r=>h(H.value))}," 复制 ")])])]),e("div",$e,[e("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",onClick:t[8]||(t[8]=r=>g.value=!1)}," 知道了 ")])])])):d("",!0)]))]))}});export{Ie as default};
|
static/assets/Checkbox.vue_vue_type_script_setup_true_lang-B0-MthIO.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as c,c as r,a as o,b as i,E as u,e as a}from"./index-Bld7Uski.js";const p={class:"inline-flex items-center gap-2"},m=["checked","disabled"],b={key:0,class:"text-xs text-muted-foreground"},f=c({__name:"Checkbox",props:{modelValue:{type:Boolean},disabled:{type:Boolean}},emits:["update:modelValue"],setup(s,{emit:d}){const n=d,l=e=>{const t=e.target;n("update:modelValue",t.checked)};return(e,t)=>(a(),r("label",p,[o("input",{type:"checkbox",class:"sr-only peer",checked:s.modelValue,disabled:s.disabled,onChange:l},null,40,m),t[0]||(t[0]=o("span",{class:"flex h-4 w-4 items-center justify-center rounded border border-border bg-background text-transparent transition-colors peer-checked:border-foreground peer-checked:bg-foreground peer-checked:text-white peer-disabled:opacity-50","aria-hidden":"true"},[o("svg",{viewBox:"0 0 20 20",class:"h-3.5 w-3.5",fill:"currentColor"},[o("path",{d:"M7.6 13.2 4.4 10l1.2-1.2 2 2 6-6 1.2 1.2-7.2 7.2z"})])],-1)),e.$slots.default?(a(),r("span",b,[u(e.$slots,"default")])):i("",!0)]))}});export{f as _};
|
static/assets/Checkbox.vue_vue_type_script_setup_true_lang-B6QFZaQQ.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as c,c as r,a as o,b as i,E as u,e as a}from"./index-B0A0-QFY.js";const p={class:"inline-flex items-center gap-2"},m=["checked","disabled"],b={key:0,class:"text-xs text-muted-foreground"},f=c({__name:"Checkbox",props:{modelValue:{type:Boolean},disabled:{type:Boolean}},emits:["update:modelValue"],setup(s,{emit:d}){const n=d,l=e=>{const t=e.target;n("update:modelValue",t.checked)};return(e,t)=>(a(),r("label",p,[o("input",{type:"checkbox",class:"sr-only peer",checked:s.modelValue,disabled:s.disabled,onChange:l},null,40,m),t[0]||(t[0]=o("span",{class:"flex h-4 w-4 items-center justify-center rounded border border-border bg-background text-transparent transition-colors peer-checked:border-foreground peer-checked:bg-foreground peer-checked:text-white peer-disabled:opacity-50","aria-hidden":"true"},[o("svg",{viewBox:"0 0 20 20",class:"h-3.5 w-3.5",fill:"currentColor"},[o("path",{d:"M7.6 13.2 4.4 10l1.2-1.2 2 2 6-6 1.2 1.2-7.2 7.2z"})])],-1)),e.$slots.default?(a(),r("span",b,[u(e.$slots,"default")])):i("",!0)]))}});export{f as _};
|
static/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-Bkr0tSJw.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as a,y as d,c as l,b as c,w as m,a as t,t as r,T as f,e as i}from"./index-B0A0-QFY.js";const u={class:"w-full max-w-sm rounded-3xl border border-border bg-card p-6 shadow-2xl"},x={class:"text-sm font-semibold text-foreground"},p={class:"mt-2 text-sm text-muted-foreground"},b={class:"mt-6 flex items-center justify-end gap-2"},g=a({__name:"ConfirmDialog",props:{open:{type:Boolean},title:{},message:{},confirmText:{},cancelText:{}},emits:["confirm","cancel"],setup(o){return(n,e)=>(i(),d(f,{to:"body"},[o.open?(i(),l("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/30 px-4",onClick:e[2]||(e[2]=m(s=>n.$emit("cancel"),["self"]))},[t("div",u,[t("p",x,r(o.title),1),t("p",p,r(o.message),1),t("div",b,[t("button",{type:"button",class:"rounded-full border border-border px-4 py-2 text-sm text-muted-foreground transition-colors hover:border-foreground hover:text-foreground",onClick:e[0]||(e[0]=s=>n.$emit("cancel"))},r(o.cancelText),1),t("button",{type:"button",class:"rounded-full bg-primary px-4 py-2 text-sm text-primary-foreground transition-opacity hover:opacity-90",onClick:e[1]||(e[1]=s=>n.$emit("confirm"))},r(o.confirmText),1)])])])):c("",!0)]))}});export{g as _};
|
static/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-QhDFiT60.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as a,y as d,c as l,b as c,w as m,a as t,t as r,T as f,e as i}from"./index-Bld7Uski.js";const u={class:"w-full max-w-sm rounded-3xl border border-border bg-card p-6 shadow-2xl"},x={class:"text-sm font-semibold text-foreground"},p={class:"mt-2 text-sm text-muted-foreground"},b={class:"mt-6 flex items-center justify-end gap-2"},g=a({__name:"ConfirmDialog",props:{open:{type:Boolean},title:{},message:{},confirmText:{},cancelText:{}},emits:["confirm","cancel"],setup(o){return(n,e)=>(i(),d(f,{to:"body"},[o.open?(i(),l("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/30 px-4",onClick:e[2]||(e[2]=m(s=>n.$emit("cancel"),["self"]))},[t("div",u,[t("p",x,r(o.title),1),t("p",p,r(o.message),1),t("div",b,[t("button",{type:"button",class:"rounded-full border border-border px-4 py-2 text-sm text-muted-foreground transition-colors hover:border-foreground hover:text-foreground",onClick:e[0]||(e[0]=s=>n.$emit("cancel"))},r(o.cancelText),1),t("button",{type:"button",class:"rounded-full bg-primary px-4 py-2 text-sm text-primary-foreground transition-opacity hover:opacity-90",onClick:e[1]||(e[1]=s=>n.$emit("confirm"))},r(o.confirmText),1)])])])):c("",!0)]))}});export{g as _};
|
static/assets/Dashboard-C7wgWPRX.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{g as B,d as E,h as i,i as F,o as j,j as $,c as m,a,F as M,r as k,t as b,f as U,y as V,b as W,k as G,n as H,e as c}from"./index-B0A0-QFY.js";import{_ as I}from"./HelpTip.vue_vue_type_script_setup_true_lang-BwK5Fa3C.js";const J={overview(){return B.get("/admin/stats")}},K={class:"space-y-8"},P={class:"grid grid-cols-2 gap-4 md:grid-cols-2 xl:grid-cols-4"},Q={class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},X={class:"mt-4 text-3xl font-semibold text-foreground"},Y={class:"mt-2 text-xs text-muted-foreground"},Z={class:"dashboard-split flex w-full flex-col gap-6"},ee={class:"dashboard-main w-full min-w-0 rounded-3xl border border-border bg-card p-6 overflow-hidden"},te={class:"mt-4 border-t border-border pt-4"},ae={class:"dashboard-side w-full min-w-0 rounded-3xl border border-border bg-card p-6"},oe={class:"mt-6 space-y-4"},le={class:"flex items-center justify-between text-sm"},re={class:"flex items-center gap-2 text-muted-foreground"},se={class:"font-medium text-foreground"},ne={class:"h-2 w-full rounded-full bg-secondary"},ce=E({__name:"Dashboard",setup(ie){const s=i([{label:"账号总数",value:"0",caption:"账号池中已加载的总数量。"},{label:"活跃账号",value:"0",caption:"未过期、未禁用、未限流且可用。"},{label:"失败账号",value:"0",caption:"自动禁用或已过期,需要处理。"},{label:"限流账号",value:"0",caption:"触发 429 限流,冷却中。"}]),p=i([]),x=i([]),_=i([]),y=i([]),w=i({}),v=i(null),h=i(null);let r=null,n=null;const R=F(()=>{const e=Math.max(Number(s.value[0].value),1),t=Number(s.value[1].value),o=Number(s.value[2].value),d=Number(s.value[3].value),u=Math.max(e-t-o-d,0);return[{label:"活跃",value:t,percent:Math.round(t/e*100),barClass:"bg-emerald-500"},{label:"失败",value:o,percent:Math.round(o/e*100),barClass:"bg-destructive"},{label:"限流",value:d,percent:Math.round(d/e*100),barClass:"bg-amber-300"},{label:"空闲",tooltip:"未限流、未失败、未激活使用中的账号(主要是手动禁用)。",value:u,percent:Math.round(u/e*100),barClass:"bg-slate-300"}]});j(async()=>{await T(),q(),O(),window.addEventListener("resize",S)}),$(()=>{window.removeEventListener("resize",S),r&&(r.dispose(),r=null),n&&(n.dispose(),n=null)});function q(){const e=window.echarts;!e||!v.value||(r=e.init(v.value),C(),z())}function O(){const e=window.echarts;!e||!h.value||(n=e.init(h.value),g(),L())}function C(){if(!r)return;r.setOption({tooltip:{trigger:"axis"},legend:{data:["成功(总请求)","失败/限流"],right:0,top:0,textStyle:{color:"#6b6b6b",fontSize:11}},grid:{left:24,right:16,top:44,bottom:24,containLabel:!0},xAxis:{type:"category",data:y.value,boundaryGap:!1,axisLine:{lineStyle:{color:"#d4d4d4"}},axisTick:{show:!1},axisLabel:{color:"#6b6b6b",fontSize:10}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:"#6b6b6b",fontSize:10},splitLine:{lineStyle:{color:"#e5e5e5"}}},series:[{name:"成功(总请求)",type:"line",data:_.value,smooth:!0,showSymbol:!1,lineStyle:{width:2},areaStyle:{opacity:.25},itemStyle:{color:"#0ea5e9"},emphasis:{disabled:!0},z:1},{name:"失败/限流",type:"line",data:x.value,smooth:!0,showSymbol:!1,lineStyle:{width:2},areaStyle:{opacity:.4},itemStyle:{color:"#ef4444"},emphasis:{disabled:!0},z:2}]}),z()}function g(){if(!n)return;const e=Object.entries(w.value).map(([l,f])=>({name:l,value:f.reduce((N,A)=>N+A,0),itemStyle:{color:D(l),borderRadius:8}})).filter(l=>l.value>0),t=window.innerWidth<768,o=t?{data:e.map(l=>l.name),left:"center",bottom:0,orient:"horizontal",textStyle:{color:"#6b6b6b",fontSize:11}}:{data:e.map(l=>l.name),left:0,top:"center",orient:"vertical",textStyle:{color:"#6b6b6b",fontSize:11}},d=t?["50%","38%"]:["66%","50%"],u=t?["40%","62%"]:["52%","78%"];n.setOption({animation:!0,animationDuration:600,animationEasing:"cubicOut",animationDurationUpdate:300,animationEasingUpdate:"cubicOut",tooltip:{trigger:"item",formatter:l=>`${l.name}: ${l.value} 次 (${l.percent}%)`},legend:o,series:[{type:"pie",radius:u,center:d,startAngle:90,animationType:"scale",animationEasing:"cubicOut",avoidLabelOverlap:!0,label:{show:!0,formatter:"{b}",fontSize:11,color:"#6b6b6b"},labelLine:{length:12,length2:10},itemStyle:{borderWidth:2,borderColor:"#fff",borderRadius:10},data:e}]}),L()}function S(){r&&r.resize(),n&&g()}async function T(){try{const e=await J.overview();s.value[0].value=(e.total_accounts??0).toString(),s.value[1].value=(e.active_accounts??0).toString(),s.value[2].value=(e.failed_accounts??0).toString(),s.value[3].value=(e.rate_limited_accounts??0).toString();const t=e.trend||{labels:[],total_requests:[],failed_requests:[],rate_limited_requests:[]};y.value=t.labels||[],p.value=t.total_requests||[];const o=t.failed_requests||[],d=t.rate_limited_requests||[],u=p.value.map((l,f)=>(o[f]||0)+(d[f]||0));x.value=u,_.value=p.value.map(l=>Math.max(l,0)),w.value=t.model_requests||{},C(),g()}catch(e){console.error("Failed to load overview:",e)}}function z(){r&&requestAnimationFrame(()=>{r?.resize()})}function L(){n&&requestAnimationFrame(()=>{n?.resize()})}function D(e){return{"gemini-3-pro-preview":"#0ea5e9","gemini-2.5-pro":"#22c55e","gemini-2.5-flash":"#f59e0b","gemini-3-flash-preview":"#ec4899","gemini-auto":"#64748b"}[e]||"#94a3b8"}return(e,t)=>(c(),m("div",K,[a("section",P,[(c(!0),m(M,null,k(s.value,o=>(c(),m("div",{key:o.label,class:"rounded-3xl border border-border bg-card p-6"},[a("p",Q,b(o.label),1),a("p",X,b(o.value),1),a("p",Y,b(o.caption),1)]))),128))]),a("section",Z,[a("div",ee,[t[1]||(t[1]=a("div",{class:"flex items-center justify-between"},[a("p",{class:"text-sm font-medium text-foreground"},"调用趋势(近12小时)")],-1)),a("div",{ref_key:"trendChartRef",ref:v,class:"mt-6 h-64 w-full max-w-full lg:h-72"},null,512),a("div",te,[t[0]||(t[0]=a("p",{class:"text-sm font-medium text-foreground"},"模型调用分布(近12小时)",-1)),a("div",{ref_key:"modelChartRef",ref:h,class:"mt-4 h-80 w-full max-w-full lg:h-64"},null,512)])]),a("div",ae,[t[2]||(t[2]=a("p",{class:"text-sm font-medium text-foreground"},"账号健康",-1)),a("div",oe,[(c(!0),m(M,null,k(R.value,o=>(c(),m("div",{key:o.label,class:"space-y-2"},[a("div",le,[a("span",re,[U(b(o.label)+" ",1),o.tooltip?(c(),V(I,{key:0,text:o.tooltip},null,8,["text"])):W("",!0)]),a("span",se,b(o.value),1)]),a("div",ne,[a("div",{class:H(["h-2 rounded-full",o.barClass]),style:G({width:o.percent+"%"})},null,6)])]))),128))]),t[3]||(t[3]=a("div",{class:"mt-6 rounded-2xl border border-border bg-secondary/50 p-4 text-xs text-muted-foreground"}," 建议及时处理失败或过期账号,避免影响轮询效率。 ",-1))])])]))}});export{ce as default};
|
static/assets/Dashboard-CRtziR8g.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{g as B,d as E,h as i,i as F,o as j,j as $,c as m,a,F as M,r as k,t as b,f as U,y as V,b as W,k as G,n as H,e as c}from"./index-Bld7Uski.js";import{_ as I}from"./HelpTip.vue_vue_type_script_setup_true_lang-B7Lr9VZz.js";const J={overview(){return B.get("/admin/stats")}},K={class:"space-y-8"},P={class:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4"},Q={class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},X={class:"mt-4 text-3xl font-semibold text-foreground"},Y={class:"mt-2 text-xs text-muted-foreground"},Z={class:"dashboard-split flex w-full flex-col gap-6"},ee={class:"dashboard-main w-full min-w-0 rounded-3xl border border-border bg-card p-6 overflow-hidden"},te={class:"mt-4 border-t border-border pt-4"},ae={class:"dashboard-side w-full min-w-0 rounded-3xl border border-border bg-card p-6"},oe={class:"mt-6 space-y-4"},le={class:"flex items-center justify-between text-sm"},re={class:"flex items-center gap-2 text-muted-foreground"},se={class:"font-medium text-foreground"},ne={class:"h-2 w-full rounded-full bg-secondary"},ce=E({__name:"Dashboard",setup(ie){const s=i([{label:"账号总数",value:"0",caption:"账号池中已加载的总数量。"},{label:"活跃账号",value:"0",caption:"未过期、未禁用、未限流且可用。"},{label:"失败账号",value:"0",caption:"自动禁用或已过期,需要处理。"},{label:"限流账号",value:"0",caption:"触发 429 限流,冷却中。"}]),p=i([]),x=i([]),_=i([]),y=i([]),w=i({}),v=i(null),h=i(null);let r=null,n=null;const R=F(()=>{const e=Math.max(Number(s.value[0].value),1),t=Number(s.value[1].value),o=Number(s.value[2].value),d=Number(s.value[3].value),u=Math.max(e-t-o-d,0);return[{label:"活跃",value:t,percent:Math.round(t/e*100),barClass:"bg-emerald-500"},{label:"失败",value:o,percent:Math.round(o/e*100),barClass:"bg-destructive"},{label:"限流",value:d,percent:Math.round(d/e*100),barClass:"bg-amber-300"},{label:"空闲",tooltip:"未限流、未失败、未激活使用中的账号(主要是手动禁用)。",value:u,percent:Math.round(u/e*100),barClass:"bg-slate-300"}]});j(async()=>{await T(),q(),O(),window.addEventListener("resize",S)}),$(()=>{window.removeEventListener("resize",S),r&&(r.dispose(),r=null),n&&(n.dispose(),n=null)});function q(){const e=window.echarts;!e||!v.value||(r=e.init(v.value),C(),z())}function O(){const e=window.echarts;!e||!h.value||(n=e.init(h.value),g(),L())}function C(){if(!r)return;r.setOption({tooltip:{trigger:"axis"},legend:{data:["成功(总请求)","失败/限流"],right:0,top:0,textStyle:{color:"#6b6b6b",fontSize:11}},grid:{left:24,right:16,top:44,bottom:24,containLabel:!0},xAxis:{type:"category",data:y.value,boundaryGap:!1,axisLine:{lineStyle:{color:"#d4d4d4"}},axisTick:{show:!1},axisLabel:{color:"#6b6b6b",fontSize:10}},yAxis:{type:"value",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:"#6b6b6b",fontSize:10},splitLine:{lineStyle:{color:"#e5e5e5"}}},series:[{name:"成功(总请求)",type:"line",data:_.value,smooth:!0,showSymbol:!1,lineStyle:{width:2},areaStyle:{opacity:.25},itemStyle:{color:"#0ea5e9"},emphasis:{disabled:!0},z:1},{name:"失败/限流",type:"line",data:x.value,smooth:!0,showSymbol:!1,lineStyle:{width:2},areaStyle:{opacity:.4},itemStyle:{color:"#ef4444"},emphasis:{disabled:!0},z:2}]}),z()}function g(){if(!n)return;const e=Object.entries(w.value).map(([l,f])=>({name:l,value:f.reduce((N,A)=>N+A,0),itemStyle:{color:D(l),borderRadius:8}})).filter(l=>l.value>0),t=window.innerWidth<768,o=t?{data:e.map(l=>l.name),left:"center",bottom:0,orient:"horizontal",textStyle:{color:"#6b6b6b",fontSize:11}}:{data:e.map(l=>l.name),left:0,top:"center",orient:"vertical",textStyle:{color:"#6b6b6b",fontSize:11}},d=t?["50%","38%"]:["66%","50%"],u=t?["40%","62%"]:["52%","78%"];n.setOption({animation:!0,animationDuration:600,animationEasing:"cubicOut",animationDurationUpdate:300,animationEasingUpdate:"cubicOut",tooltip:{trigger:"item",formatter:l=>`${l.name}: ${l.value} 次 (${l.percent}%)`},legend:o,series:[{type:"pie",radius:u,center:d,startAngle:90,animationType:"scale",animationEasing:"cubicOut",avoidLabelOverlap:!0,label:{show:!0,formatter:"{b}",fontSize:11,color:"#6b6b6b"},labelLine:{length:12,length2:10},itemStyle:{borderWidth:2,borderColor:"#fff",borderRadius:10},data:e}]}),L()}function S(){r&&r.resize(),n&&g()}async function T(){try{const e=await J.overview();s.value[0].value=(e.total_accounts??0).toString(),s.value[1].value=(e.active_accounts??0).toString(),s.value[2].value=(e.failed_accounts??0).toString(),s.value[3].value=(e.rate_limited_accounts??0).toString();const t=e.trend||{labels:[],total_requests:[],failed_requests:[],rate_limited_requests:[]};y.value=t.labels||[],p.value=t.total_requests||[];const o=t.failed_requests||[],d=t.rate_limited_requests||[],u=p.value.map((l,f)=>(o[f]||0)+(d[f]||0));x.value=u,_.value=p.value.map(l=>Math.max(l,0)),w.value=t.model_requests||{},C(),g()}catch(e){console.error("Failed to load overview:",e)}}function z(){r&&requestAnimationFrame(()=>{r?.resize()})}function L(){n&&requestAnimationFrame(()=>{n?.resize()})}function D(e){return{"gemini-3-pro-preview":"#0ea5e9","gemini-2.5-pro":"#22c55e","gemini-2.5-flash":"#f59e0b","gemini-3-flash-preview":"#ec4899","gemini-auto":"#64748b"}[e]||"#94a3b8"}return(e,t)=>(c(),m("div",K,[a("section",P,[(c(!0),m(M,null,k(s.value,o=>(c(),m("div",{key:o.label,class:"rounded-3xl border border-border bg-card p-6"},[a("p",Q,b(o.label),1),a("p",X,b(o.value),1),a("p",Y,b(o.caption),1)]))),128))]),a("section",Z,[a("div",ee,[t[1]||(t[1]=a("div",{class:"flex items-center justify-between"},[a("p",{class:"text-sm font-medium text-foreground"},"调用趋势(近12小时)")],-1)),a("div",{ref_key:"trendChartRef",ref:v,class:"mt-6 h-64 w-full max-w-full lg:h-72"},null,512),a("div",te,[t[0]||(t[0]=a("p",{class:"text-sm font-medium text-foreground"},"模型调用分布(近12小时)",-1)),a("div",{ref_key:"modelChartRef",ref:h,class:"mt-4 h-80 w-full max-w-full lg:h-64"},null,512)])]),a("div",ae,[t[2]||(t[2]=a("p",{class:"text-sm font-medium text-foreground"},"账号健康",-1)),a("div",oe,[(c(!0),m(M,null,k(R.value,o=>(c(),m("div",{key:o.label,class:"space-y-2"},[a("div",le,[a("span",re,[U(b(o.label)+" ",1),o.tooltip?(c(),V(I,{key:0,text:o.tooltip},null,8,["text"])):W("",!0)]),a("span",se,b(o.value),1)]),a("div",ne,[a("div",{class:H(["h-2 rounded-full",o.barClass]),style:G({width:o.percent+"%"})},null,6)])]))),128))]),t[3]||(t[3]=a("div",{class:"mt-6 rounded-2xl border border-border bg-secondary/50 p-4 text-xs text-muted-foreground"}," 建议及时处理失败或过期账号,避免影响轮询效率。 ",-1))])])]))}});export{ce as default};
|
static/assets/Docs-DMaxRdFo.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import{c as r,z as s,e as n}from"./index-Bld7Uski.js";const a=(o,t)=>{const u=o.__vccOpts||o;for(const[e,q]of t)u[e]=q;return u},p={},l={class:"space-y-6"};function c(o,t){return n(),r("div",l,[...t[0]||(t[0]=[s(`<section class="rounded-3xl border border-border bg-card p-6"><div class="flex flex-wrap items-center justify-between gap-3"><div><p class="text-base font-semibold text-foreground">文档中心</p><p class="mt-1 text-xs text-muted-foreground"> 常用格式说明与示例,复制即可使用 </p></div></div><div class="mt-6 space-y-6 text-sm text-foreground"><div class="space-y-2"><p class="text-sm font-semibold">账户配置格式</p><p class="mt-1 text-xs text-muted-foreground"> accounts.json 或环境变量 ACCOUNTS_CONFIG 使用的 JSON 数组 </p><pre class="mt-3 overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">[
|
| 2 |
+
{
|
| 3 |
+
"id": "account_1",
|
| 4 |
+
"secure_c_ses": "CSE.Ad...",
|
| 5 |
+
"csesidx": "498...",
|
| 6 |
+
"config_id": "0cd...",
|
| 7 |
+
"host_c_oses": "",
|
| 8 |
+
"expires_at": "2026-12-31 23:59:59"
|
| 9 |
+
}
|
| 10 |
+
]</pre><p class="mt-2 text-xs text-muted-foreground"> 必填:secure_c_ses / csesidx / config_id。id、host_c_oses、expires_at 可选。 </p></div><div class="space-y-2"><p class="text-sm font-semibold">API 对话 curl 格式</p><p class="mt-1 text-xs text-muted-foreground"> 标准的 OpenAI 兼容格式,支持流式和非流式输出。 </p><div class="mt-3 grid gap-3 md:grid-cols-2"><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 11 |
+
-H "Content-Type: application/json" \\
|
| 12 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 13 |
+
-d '{
|
| 14 |
+
"model": "gemini-2.5-flash",
|
| 15 |
+
"stream": false,
|
| 16 |
+
"temperature": 0.7,
|
| 17 |
+
"top_p": 1,
|
| 18 |
+
"messages": [
|
| 19 |
+
{ "role": "system", "content": "你是一个简洁的助手" },
|
| 20 |
+
{ "role": "user", "content": "你好,介绍一下这个项目" }
|
| 21 |
+
]
|
| 22 |
+
}'</pre></div><p class="mt-2 text-xs text-muted-foreground"> 如果未设置 API Key,可省略 Authorization。 </p></div><div class="space-y-2"><p class="text-sm font-semibold">文生图格式(Base64 / URL 输出)</p><p class="mt-1 text-xs text-muted-foreground"> 使用支持文生图的模型,直接给文本提示即可;输出格式由系统设置决定(base64 或 url)。 </p><pre class="mt-3 overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 23 |
+
-H "Content-Type: application/json" \\
|
| 24 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 25 |
+
-d '{
|
| 26 |
+
"model": "gemini-3-pro-preview",
|
| 27 |
+
"stream": true,
|
| 28 |
+
"temperature": 0.7,
|
| 29 |
+
"top_p": 1,
|
| 30 |
+
"messages": [
|
| 31 |
+
{ "role": "user", "content": "生成一只戴着头盔的猫,赛博风格" }
|
| 32 |
+
]
|
| 33 |
+
}'</pre></div><div class="space-y-2"><p class="text-sm font-semibold">图生图格式(Base64 / URL 输入)</p><p class="mt-1 text-xs text-muted-foreground"> content 使用多模态数组,image_url 可填 URL 或 data:base64。 </p><div class="mt-3 grid gap-3 md:grid-cols-2"><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 34 |
+
-H "Content-Type: application/json" \\
|
| 35 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 36 |
+
-d '{
|
| 37 |
+
"model": "gemini-3-flash-preview",
|
| 38 |
+
"stream": false,
|
| 39 |
+
"temperature": 0.7,
|
| 40 |
+
"top_p": 1,
|
| 41 |
+
"messages": [
|
| 42 |
+
{
|
| 43 |
+
"role": "user",
|
| 44 |
+
"content": [
|
| 45 |
+
{ "type": "text", "text": "把图片改成插画风格" },
|
| 46 |
+
{ "type": "image_url", "image_url": { "url": "https://example.com/cat.png" } }
|
| 47 |
+
]
|
| 48 |
+
}
|
| 49 |
+
]
|
| 50 |
+
}'</pre><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 51 |
+
-H "Content-Type: application/json" \\
|
| 52 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 53 |
+
-d '{
|
| 54 |
+
"model": "gemini-3-flash-preview",
|
| 55 |
+
"stream": false,
|
| 56 |
+
"temperature": 0.7,
|
| 57 |
+
"top_p": 1,
|
| 58 |
+
"messages": [
|
| 59 |
+
{
|
| 60 |
+
"role": "user",
|
| 61 |
+
"content": [
|
| 62 |
+
{ "type": "text", "text": "增强画面细节" },
|
| 63 |
+
{ "type": "image_url", "image_url": { "url": "data:image/png;base64,AAA..." } }
|
| 64 |
+
]
|
| 65 |
+
}
|
| 66 |
+
]
|
| 67 |
+
}'</pre></div></div><div class="space-y-2"><p class="text-sm font-semibold">读文件格式(URL / Base64)</p><p class="mt-1 text-xs text-muted-foreground"> 适用于 PDF/图片/文本等可读文件,Word/PPT 等可能不支持会被提示转换。大部分文件都可能支持,建议自行测试。 </p><div class="mt-3 grid gap-3 md:grid-cols-2"><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 68 |
+
-H "Content-Type: application/json" \\
|
| 69 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 70 |
+
-d '{
|
| 71 |
+
"model": "gemini-2.5-pro",
|
| 72 |
+
"stream": false,
|
| 73 |
+
"temperature": 0.7,
|
| 74 |
+
"top_p": 1,
|
| 75 |
+
"messages": [
|
| 76 |
+
{
|
| 77 |
+
"role": "user",
|
| 78 |
+
"content": [
|
| 79 |
+
{ "type": "text", "text": "读取并总结这个文件" },
|
| 80 |
+
{ "type": "image_url", "image_url": { "url": "https://example.com/doc.pdf" } }
|
| 81 |
+
]
|
| 82 |
+
}
|
| 83 |
+
]
|
| 84 |
+
}'</pre><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 85 |
+
-H "Content-Type: application/json" \\
|
| 86 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 87 |
+
-d '{
|
| 88 |
+
"model": "gemini-2.5-pro",
|
| 89 |
+
"stream": false,
|
| 90 |
+
"temperature": 0.7,
|
| 91 |
+
"top_p": 1,
|
| 92 |
+
"messages": [
|
| 93 |
+
{
|
| 94 |
+
"role": "user",
|
| 95 |
+
"content": [
|
| 96 |
+
{ "type": "text", "text": "读取并摘要" },
|
| 97 |
+
{ "type": "image_url", "image_url": { "url": "data:application/pdf;base64,AAA..." } }
|
| 98 |
+
]
|
| 99 |
+
}
|
| 100 |
+
]
|
| 101 |
+
}'</pre></div></div></div></section>`,1)])])}const i=a(p,[["render",c]]);export{i as default};
|
static/assets/Docs-mpFHVt06.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import{c as r,z as s,e as n}from"./index-B0A0-QFY.js";const a=(o,t)=>{const u=o.__vccOpts||o;for(const[e,q]of t)u[e]=q;return u},p={},l={class:"space-y-6"};function c(o,t){return n(),r("div",l,[...t[0]||(t[0]=[s(`<section class="rounded-3xl border border-border bg-card p-6"><div class="flex flex-wrap items-center justify-between gap-3"><div><p class="text-base font-semibold text-foreground">文档中心</p><p class="mt-1 text-xs text-muted-foreground"> 常用格式说明与示例,复制即可使用 </p></div></div><div class="mt-6 space-y-6 text-sm text-foreground"><div class="space-y-2"><p class="text-sm font-semibold">账户配置格式</p><p class="mt-1 text-xs text-muted-foreground"> accounts.json 或环境变量 ACCOUNTS_CONFIG 使用的 JSON 数组 </p><pre class="mt-3 overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">[
|
| 2 |
+
{
|
| 3 |
+
"id": "account_1",
|
| 4 |
+
"secure_c_ses": "CSE.Ad...",
|
| 5 |
+
"csesidx": "498...",
|
| 6 |
+
"config_id": "0cd...",
|
| 7 |
+
"host_c_oses": "",
|
| 8 |
+
"expires_at": "2026-12-31 23:59:59"
|
| 9 |
+
}
|
| 10 |
+
]</pre><p class="mt-2 text-xs text-muted-foreground"> 必填:secure_c_ses / csesidx / config_id。id、host_c_oses、expires_at 可选。 </p></div><div class="space-y-2"><p class="text-sm font-semibold">API 对话 curl 格式</p><p class="mt-1 text-xs text-muted-foreground"> 标准的 OpenAI 兼容格式,支持流式和非流式输出。 </p><div class="mt-3 grid gap-3 md:grid-cols-2"><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 11 |
+
-H "Content-Type: application/json" \\
|
| 12 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 13 |
+
-d '{
|
| 14 |
+
"model": "gemini-2.5-flash",
|
| 15 |
+
"stream": false,
|
| 16 |
+
"temperature": 0.7,
|
| 17 |
+
"top_p": 1,
|
| 18 |
+
"messages": [
|
| 19 |
+
{ "role": "system", "content": "你是一个简洁的助手" },
|
| 20 |
+
{ "role": "user", "content": "你好,介绍一下这个项目" }
|
| 21 |
+
]
|
| 22 |
+
}'</pre></div><p class="mt-2 text-xs text-muted-foreground"> 如果未设置 API Key,可省略 Authorization。 </p></div><div class="space-y-2"><p class="text-sm font-semibold">文生图格式(Base64 / URL 输出)</p><p class="mt-1 text-xs text-muted-foreground"> 使用支持文生图的模型,直接给文本提示即可;输出格式由系统设置决定(base64 或 url)。 </p><pre class="mt-3 overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 23 |
+
-H "Content-Type: application/json" \\
|
| 24 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 25 |
+
-d '{
|
| 26 |
+
"model": "gemini-3-pro-preview",
|
| 27 |
+
"stream": true,
|
| 28 |
+
"temperature": 0.7,
|
| 29 |
+
"top_p": 1,
|
| 30 |
+
"messages": [
|
| 31 |
+
{ "role": "user", "content": "生成一只戴着头盔的猫,赛博风格" }
|
| 32 |
+
]
|
| 33 |
+
}'</pre></div><div class="space-y-2"><p class="text-sm font-semibold">图生图格式(Base64 / URL 输入)</p><p class="mt-1 text-xs text-muted-foreground"> content 使用多模态数组,image_url 可填 URL 或 data:base64。 </p><div class="mt-3 grid gap-3 md:grid-cols-2"><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 34 |
+
-H "Content-Type: application/json" \\
|
| 35 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 36 |
+
-d '{
|
| 37 |
+
"model": "gemini-3-flash-preview",
|
| 38 |
+
"stream": false,
|
| 39 |
+
"temperature": 0.7,
|
| 40 |
+
"top_p": 1,
|
| 41 |
+
"messages": [
|
| 42 |
+
{
|
| 43 |
+
"role": "user",
|
| 44 |
+
"content": [
|
| 45 |
+
{ "type": "text", "text": "把图片改成插画风格" },
|
| 46 |
+
{ "type": "image_url", "image_url": { "url": "https://example.com/cat.png" } }
|
| 47 |
+
]
|
| 48 |
+
}
|
| 49 |
+
]
|
| 50 |
+
}'</pre><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 51 |
+
-H "Content-Type: application/json" \\
|
| 52 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 53 |
+
-d '{
|
| 54 |
+
"model": "gemini-3-flash-preview",
|
| 55 |
+
"stream": false,
|
| 56 |
+
"temperature": 0.7,
|
| 57 |
+
"top_p": 1,
|
| 58 |
+
"messages": [
|
| 59 |
+
{
|
| 60 |
+
"role": "user",
|
| 61 |
+
"content": [
|
| 62 |
+
{ "type": "text", "text": "增强画面细节" },
|
| 63 |
+
{ "type": "image_url", "image_url": { "url": "data:image/png;base64,AAA..." } }
|
| 64 |
+
]
|
| 65 |
+
}
|
| 66 |
+
]
|
| 67 |
+
}'</pre></div></div><div class="space-y-2"><p class="text-sm font-semibold">读文件格式(URL / Base64)</p><p class="mt-1 text-xs text-muted-foreground"> 适用于 PDF/图片/文本等可读文件,Word/PPT 等可能不支持会被提示转换。大部分文件都可能支持,建议自行测试。 </p><div class="mt-3 grid gap-3 md:grid-cols-2"><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 68 |
+
-H "Content-Type: application/json" \\
|
| 69 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 70 |
+
-d '{
|
| 71 |
+
"model": "gemini-2.5-pro",
|
| 72 |
+
"stream": false,
|
| 73 |
+
"temperature": 0.7,
|
| 74 |
+
"top_p": 1,
|
| 75 |
+
"messages": [
|
| 76 |
+
{
|
| 77 |
+
"role": "user",
|
| 78 |
+
"content": [
|
| 79 |
+
{ "type": "text", "text": "读取并总结这个文件" },
|
| 80 |
+
{ "type": "image_url", "image_url": { "url": "https://example.com/doc.pdf" } }
|
| 81 |
+
]
|
| 82 |
+
}
|
| 83 |
+
]
|
| 84 |
+
}'</pre><pre class="overflow-x-auto whitespace-pre-wrap rounded-2xl border border-border bg-card px-4 py-3 text-xs font-mono scrollbar-slim">curl -X POST "http://localhost:7860/v1/chat/completions" \\
|
| 85 |
+
-H "Content-Type: application/json" \\
|
| 86 |
+
-H "Authorization: Bearer YOUR_API_KEY" \\
|
| 87 |
+
-d '{
|
| 88 |
+
"model": "gemini-2.5-pro",
|
| 89 |
+
"stream": false,
|
| 90 |
+
"temperature": 0.7,
|
| 91 |
+
"top_p": 1,
|
| 92 |
+
"messages": [
|
| 93 |
+
{
|
| 94 |
+
"role": "user",
|
| 95 |
+
"content": [
|
| 96 |
+
{ "type": "text", "text": "读取并摘要" },
|
| 97 |
+
{ "type": "image_url", "image_url": { "url": "data:application/pdf;base64,AAA..." } }
|
| 98 |
+
]
|
| 99 |
+
}
|
| 100 |
+
]
|
| 101 |
+
}'</pre></div></div></div></section>`,1)])])}const i=a(p,[["render",c]]);export{i as default};
|
static/assets/HelpTip.vue_vue_type_script_setup_true_lang-B7Lr9VZz.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d,h as n,c as i,F as g,a as r,y as x,E as m,T as b,b as v,k as y,f as k,t as T,G as _,e as a,A as h}from"./index-Bld7Uski.js";const w=d({__name:"Tooltip",props:{text:{},offset:{}},setup(o){const u=o,e=n(null),l=n(!1),p=n({}),f=()=>{l.value=!0,_(()=>{if(!e.value)return;const t=e.value.getBoundingClientRect(),s=u.offset??8;p.value={left:`${t.left+t.width/2}px`,top:`${t.top-s}px`}})},c=()=>{l.value=!1};return(t,s)=>(a(),i(g,null,[r("span",{ref_key:"triggerRef",ref:e,class:"inline-flex",onMouseenter:f,onMouseleave:c,onFocusin:f,onFocusout:c},[m(t.$slots,"default")],544),(a(),x(b,{to:"body"},[l.value?(a(),i("div",{key:0,class:"fixed z-[9999] -translate-x-1/2 -translate-y-full rounded-md bg-foreground px-2 py-1 text-[10px] text-background shadow-lg",style:y(p.value)},[k(T(o.text)+" ",1),s[0]||(s[0]=r("span",{class:"absolute left-1/2 top-full h-0 w-0 -translate-x-1/2 border-x-4 border-t-4 border-x-transparent border-t-foreground"},null,-1))],4)):v("",!0)]))],64))}}),C=d({__name:"HelpTip",props:{text:{}},setup(o){return(u,e)=>(a(),x(w,{text:o.text},{default:h(()=>[...e[0]||(e[0]=[r("span",{class:"help-dot"},"?",-1)])]),_:1},8,["text"]))}});export{C as _};
|
static/assets/HelpTip.vue_vue_type_script_setup_true_lang-BwK5Fa3C.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d,h as n,c as i,F as g,a as r,y as x,E as m,T as b,b as v,k as y,f as k,t as T,G as _,e as a,A as h}from"./index-B0A0-QFY.js";const w=d({__name:"Tooltip",props:{text:{},offset:{}},setup(o){const u=o,e=n(null),l=n(!1),p=n({}),f=()=>{l.value=!0,_(()=>{if(!e.value)return;const t=e.value.getBoundingClientRect(),s=u.offset??8;p.value={left:`${t.left+t.width/2}px`,top:`${t.top-s}px`}})},c=()=>{l.value=!1};return(t,s)=>(a(),i(g,null,[r("span",{ref_key:"triggerRef",ref:e,class:"inline-flex",onMouseenter:f,onMouseleave:c,onFocusin:f,onFocusout:c},[m(t.$slots,"default")],544),(a(),x(b,{to:"body"},[l.value?(a(),i("div",{key:0,class:"fixed z-[9999] -translate-x-1/2 -translate-y-full rounded-md bg-foreground px-2 py-1 text-[10px] text-background shadow-lg",style:y(p.value)},[k(T(o.text)+" ",1),s[0]||(s[0]=r("span",{class:"absolute left-1/2 top-full h-0 w-0 -translate-x-1/2 border-x-4 border-t-4 border-x-transparent border-t-foreground"},null,-1))],4)):v("",!0)]))],64))}}),C=d({__name:"HelpTip",props:{text:{}},setup(o){return(u,e)=>(a(),x(w,{text:o.text},{default:h(()=>[...e[0]||(e[0]=[r("span",{class:"help-dot"},"?",-1)])]),_:1},8,["text"]))}});export{C as _};
|
static/assets/Login-BYJmqkJn.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as f,l as x,h as a,c as i,a as e,w as b,b as v,m as g,v as h,t as l,f as y,p as w,e as d}from"./index-Bld7Uski.js";const _={class:"min-h-screen px-4"},k={class:"flex min-h-screen items-center justify-center"},B={class:"w-full max-w-md rounded-[2.5rem] border border-border bg-card p-10 shadow-2xl shadow-black/10"},A={class:"space-y-2"},C=["disabled"],M={key:0,class:"rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},S=["disabled"],G=f({__name:"Login",setup(V){const u=w(),c=x(),t=a(""),o=a(""),r=a(!1);async function m(){if(t.value){o.value="",r.value=!0;try{await c.login(t.value),u.push({name:"dashboard"})}catch(n){o.value=n.message||"登录失败,请检查密钥。"}finally{r.value=!1}}}return(n,s)=>(d(),i("div",_,[e("div",k,[e("div",B,[s[2]||(s[2]=e("div",{class:"text-center"},[e("h1",{class:"text-3xl font-semibold text-foreground"},"Gemini Business 2API"),e("p",{class:"mt-2 text-sm text-muted-foreground"},"管理员登录")],-1)),e("form",{onSubmit:b(m,["prevent"]),class:"mt-8 space-y-6"},[e("div",A,[s[1]||(s[1]=e("label",{for:"password",class:"block text-sm font-medium text-foreground"}," 管理员密钥 ",-1)),g(e("input",{id:"password","onUpdate:modelValue":s[0]||(s[0]=p=>t.value=p),type:"password",required:"",class:"w-full rounded-2xl border border-input bg-background px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent transition-all",placeholder:"请输入管理员密钥",disabled:r.value},null,8,C),[[h,t.value]])]),o.value?(d(),i("div",M,l(o.value),1)):v("",!0),e("button",{type:"submit",disabled:r.value||!t.value,class:"w-full rounded-2xl bg-primary py-3 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50"},l(r.value?"登录中...":"登录"),9,S)],32),s[3]||(s[3]=e("div",{class:"mt-8 flex items-center justify-center gap-4 text-xs text-muted-foreground"},[e("a",{href:"https://github.com/Dreamy-rain/gemini-business2api",target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-2 transition-colors hover:text-foreground"},[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4",fill:"currentColor"},[e("path",{d:"M12 2C6.477 2 2 6.477 2 12c0 4.419 2.865 8.166 6.839 9.489.5.09.682-.217.682-.483 0-.237-.009-.868-.014-1.703-2.782.604-3.369-1.341-3.369-1.341-.454-1.154-1.11-1.462-1.11-1.462-.908-.62.069-.608.069-.608 1.004.071 1.532 1.031 1.532 1.031.892 1.529 2.341 1.087 2.91.832.091-.647.349-1.087.636-1.337-2.22-.253-4.555-1.11-4.555-4.944 0-1.092.39-1.987 1.029-2.687-.103-.253-.446-1.272.098-2.65 0 0 .84-.269 2.75 1.026A9.564 9.564 0 0 1 12 6.844c.85.004 1.705.115 2.504.337 1.909-1.295 2.748-1.026 2.748-1.026.546 1.378.202 2.397.1 2.65.64.7 1.028 1.595 1.028 2.687 0 3.842-2.338 4.687-4.566 4.936.359.309.678.919.678 1.852 0 1.337-.012 2.418-.012 2.747 0 .268.18.577.688.479A10.002 10.002 0 0 0 22 12c0-5.523-4.477-10-10-10z"})]),y(" GitHub ")]),e("span",null,"Powered by Gemini Business API")],-1))])])]))}});export{G as default};
|
static/assets/Login-hY94o6Vs.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as f,l as x,h as a,c as i,a as e,w as b,b as v,m as g,v as h,t as l,f as y,p as w,e as d}from"./index-B0A0-QFY.js";const _={class:"min-h-screen px-4"},k={class:"flex min-h-screen items-center justify-center"},B={class:"w-full max-w-md rounded-[2.5rem] border border-border bg-card p-10 shadow-2xl shadow-black/10"},A={class:"space-y-2"},C=["disabled"],M={key:0,class:"rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},S=["disabled"],G=f({__name:"Login",setup(V){const u=w(),c=x(),t=a(""),o=a(""),r=a(!1);async function m(){if(t.value){o.value="",r.value=!0;try{await c.login(t.value),u.push({name:"dashboard"})}catch(n){o.value=n.message||"登录失败,请检查密钥。"}finally{r.value=!1}}}return(n,s)=>(d(),i("div",_,[e("div",k,[e("div",B,[s[2]||(s[2]=e("div",{class:"text-center"},[e("h1",{class:"text-3xl font-semibold text-foreground"},"Gemini Business 2API"),e("p",{class:"mt-2 text-sm text-muted-foreground"},"管理员登录")],-1)),e("form",{onSubmit:b(m,["prevent"]),class:"mt-8 space-y-6"},[e("div",A,[s[1]||(s[1]=e("label",{for:"password",class:"block text-sm font-medium text-foreground"}," 管理员密钥 ",-1)),g(e("input",{id:"password","onUpdate:modelValue":s[0]||(s[0]=p=>t.value=p),type:"password",required:"",class:"w-full rounded-2xl border border-input bg-background px-4 py-3 text-sm focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent transition-all",placeholder:"请输入管理员密钥",disabled:r.value},null,8,C),[[h,t.value]])]),o.value?(d(),i("div",M,l(o.value),1)):v("",!0),e("button",{type:"submit",disabled:r.value||!t.value,class:"w-full rounded-2xl bg-primary py-3 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50"},l(r.value?"登录中...":"登录"),9,S)],32),s[3]||(s[3]=e("div",{class:"mt-8 flex items-center justify-center gap-4 text-xs text-muted-foreground"},[e("a",{href:"https://github.com/Dreamy-rain/gemini-business2api",target:"_blank",rel:"noopener noreferrer",class:"inline-flex items-center gap-2 transition-colors hover:text-foreground"},[e("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",class:"h-4 w-4",fill:"currentColor"},[e("path",{d:"M12 2C6.477 2 2 6.477 2 12c0 4.419 2.865 8.166 6.839 9.489.5.09.682-.217.682-.483 0-.237-.009-.868-.014-1.703-2.782.604-3.369-1.341-3.369-1.341-.454-1.154-1.11-1.462-1.11-1.462-.908-.62.069-.608.069-.608 1.004.071 1.532 1.031 1.532 1.031.892 1.529 2.341 1.087 2.91.832.091-.647.349-1.087.636-1.337-2.22-.253-4.555-1.11-4.555-4.944 0-1.092.39-1.987 1.029-2.687-.103-.253-.446-1.272.098-2.65 0 0 .84-.269 2.75 1.026A9.564 9.564 0 0 1 12 6.844c.85.004 1.705.115 2.504.337 1.909-1.295 2.748-1.026 2.748-1.026.546 1.378.202 2.397.1 2.65.64.7 1.028 1.595 1.028 2.687 0 3.842-2.338 4.687-4.566 4.936.359.309.678.919.678 1.852 0 1.337-.012 2.418-.012 2.747 0 .268.18.577.688.479A10.002 10.002 0 0 0 22 12c0-5.523-4.477-10-10-10z"})]),y(" GitHub ")]),e("span",null,"Powered by Gemini Business API")],-1))])])]))}});export{G as default};
|
static/assets/Logs-CEP1TB7c.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import{g as K,d as Re,h as c,H as Ce,i as D,o as Ie,j as Le,c as a,a as s,x as Q,b as m,t as n,n as v,m as X,v as ee,F as h,r as w,k as R,e as d}from"./index-B0A0-QFY.js";import{_ as ke}from"./SelectMenu.vue_vue_type_script_setup_true_lang-Bb3w9pba.js";import{_ as Oe}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-Bkr0tSJw.js";const B={list:j=>K.get("/admin/log",{params:j}),clear:()=>K.delete("/admin/log?confirm=yes")},Ne={class:"rounded-3xl border border-border bg-card p-6"},Te={class:"flex flex-wrap items-center justify-between gap-3"},Ae={class:"text-xs text-muted-foreground"},Se={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-3 xl:grid-cols-6"},$e={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Ee={class:"mt-1 text-lg font-semibold text-foreground"},Me={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Ge={class:"mt-1 text-lg font-semibold text-foreground"},Ue={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Ve={class:"mt-1 text-lg font-semibold text-foreground"},qe={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Fe={class:"mt-1 text-lg font-semibold text-foreground"},De={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Be={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},je={class:"mt-1 text-lg font-semibold text-foreground"},He={class:"mt-4 flex flex-wrap items-center gap-2 sm:flex-nowrap"},We={class:"w-44 shrink-0"},ze={key:1,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},Je={class:"whitespace-pre font-mono leading-relaxed"},Ye={key:0,class:"text-xs text-muted-foreground"},Pe={class:"cv-auto flex flex-wrap items-center gap-2 rounded-xl border border-border bg-card px-3 py-2 text-xs"},Ze={class:"flex flex-wrap items-center gap-2"},Ke={class:"text-muted-foreground"},Qe={class:"w-full text-foreground md:w-auto md:flex-1"},Xe=["onClick"],et={class:"text-muted-foreground"},tt={key:1,class:"text-muted-foreground"},ot={key:2,class:"text-[10px] text-muted-foreground"},st={class:"text-muted-foreground"},rt={key:0,class:"space-y-2 px-4 py-3"},nt={class:"flex flex-wrap items-center gap-2"},lt={class:"text-muted-foreground"},at={class:"w-full text-foreground md:w-auto md:flex-1"},E=1e3,te=1e3,M=200,dt=3e3,mt=Re({__name:"Logs",setup(j){const oe=c([]),C=c([]),G=c({ungrouped:[],groups:[]}),x=c(null),I=c(""),p=c(""),y=c("success"),L=c(!1),f=c(!0),_=c({}),b=c(!0),k=c(null),O=c(null);let N,U=!1;const i=Ce({level:"",search:"",limit:300}),se=[{label:"全部",value:""},{label:"INFO",value:"INFO"},{label:"WARNING",value:"WARNING"},{label:"ERROR",value:"ERROR"}],re={SYSTEM:"#9e9e9e",CONFIG:"#607d8b",LOG:"#9e9e9e",AUTH:"#4caf50",SESSION:"#00bcd4",FILE:"#ff9800",CHAT:"#2196f3",API:"#8bc34a",CACHE:"#9c27b0",ACCOUNT:"#f44336",MULTI:"#673ab7"},ne={account_1:"#9c27b0",account_2:"#e91e63",account_3:"#00bcd4",account_4:"#4caf50",account_5:"#ff9800"},le=D(()=>y.value==="error"?"text-destructive":"text-muted-foreground"),H=e=>re[e]||"#757575",V=e=>ne[e]||"#757575",W=e=>{const t="rounded px-2 py-0.5 text-[10px] font-semibold";return e==="INFO"?`${t} bg-blue-100 text-blue-700`:e==="WARNING"?`${t} bg-amber-100 text-amber-700`:e==="ERROR"||e==="CRITICAL"?`${t} bg-rose-100 text-rose-700`:`${t} bg-violet-100 text-violet-700`},ae=e=>{const t="rounded-md px-2 py-0.5 text-[11px] font-semibold";return e==="success"?`${t} bg-emerald-100 text-emerald-700`:e==="error"?`${t} bg-rose-100 text-rose-700`:e==="timeout"?`${t} bg-amber-100 text-amber-700`:`${t} bg-amber-100 text-amber-700`},de=e=>e==="success"?"成功":e==="error"?"失败":e==="timeout"?"超时":"进行中",ie=e=>{let t=e;const o=[];let r="";const u=/^\[([A-Za-z0-9_]+)\]/;for(;;){const l=t.match(u);if(!l)break;const g=l[1];if(t=t.slice(l[0].length).trim(),!g.startsWith("req_")){if(g.startsWith("account_")){r=g;continue}o.push(g)}}return{tags:o,accountId:r,text:t}},ue=e=>{const t=ie(e.message),o=e.message.match(/\[req_([a-z0-9]+)\]/i);return{...e,...t,reqId:o?o[1]:""}},ce=e=>{if(/^\d{4}-\d{2}-\d{2}T/.test(e))return new Date(e);if(/^\d{4}-\d{2}-\d{2}/.test(e))return new Date(e.replace(" ","T"));if(/^\d{2}:\d{2}:\d{2}$/.test(e)){const t=new Date,[o,r,u]=e.split(":").map(Number),l=new Date(t);return l.setHours(o,r,u,0),l}return null},me=e=>{const t=e[e.length-1],o=t.message;if(o.includes("响应完成")||o.includes("非流式响应完成"))return"success";if(t.level==="ERROR"||o.includes("失败"))return"error";const r=ce(t.time);return r&&(Date.now()-r.getTime())/1e3/60>5?"timeout":"in_progress"},xe=e=>{const t=new Map,o=[],r=[];e.forEach(l=>{l.reqId?(t.has(l.reqId)||(t.set(l.reqId,[]),o.push(l.reqId)),t.get(l.reqId)?.push(l)):r.push(l)});const u=o.map(l=>{const g=t.get(l)||[],$=g[0],P=$?.message.match(/\[(account_[^\]]+)\]/i),Z=$?.message.match(/收到请求: ([^ |]+)/)||$?.message.match(/Received request: ([^ |]+)/);return{id:l,logs:g,status:me(g),accountId:$?.accountId||(P?P[1]:""),model:Z?Z[1]:""}});return{ungrouped:r,groups:u}},T=D(()=>{const e=G.value.ungrouped,t=G.value.groups,o=e.length>E?e.slice(-E):e,r=t.length>E?t.slice(-E):t;return{ungrouped:o,groups:r,limited:e.length>o.length||t.length>r.length,ungroupedTotal:e.length,groupsTotal:t.length,ungroupedShowing:o.length,groupsShowing:r.length}}),pe=D(()=>{const e=C.value.length,t=e>te?e-te:0,o=C.value.slice(t),r=o.map(l=>`${l.time} | ${l.level} | ${l.message}`).join(`
|
| 2 |
+
`),u=o.length;return{text:r,total:e,showing:u,limited:e>u}}),q=e=>_.value[e]===!0,ge=e=>{_.value[e]=!q(e),localStorage.setItem("log-fold-state",JSON.stringify(_.value))},fe=e=>e.logs.length>M,ve=e=>e.logs.length<=M?e.logs:e.logs.slice(-M),be=()=>{(!i.limit||Number.isNaN(i.limit))&&(i.limit=300),i.limit=Math.min(Math.max(i.limit,10),1e3)},A=async()=>{if(!U){U=!0,I.value="",p.value="",be();try{const e=await B.list({limit:i.limit,level:i.level||void 0,search:i.search||void 0});oe.value=e.logs,C.value=e.logs.map(ue),G.value=xe(C.value),x.value=e.stats}catch(e){I.value=e.message||"日志加载失败"}finally{U=!1,requestAnimationFrame(J)}}},he=async()=>{p.value="",y.value="success";try{const e=await B.list({limit:1e3,level:i.level||void 0,search:i.search||void 0}),t=new Blob([JSON.stringify({exported_at:new Date().toISOString(),logs:e.logs},null,2)],{type:"application/json"}),o=URL.createObjectURL(t),r=document.createElement("a");r.href=o,r.download=`logs_${new Date().toISOString().slice(0,19).replace(/:/g,"-")}.json`,r.click(),URL.revokeObjectURL(o),p.value="导出成功"}catch(e){y.value="error",p.value=e.message||"导出失败"}},ye=async()=>{L.value=!1;try{await B.clear(),y.value="success",p.value="已清空日志",await A()}catch(e){y.value="error",p.value=e.message||"清空失败"}},S=()=>{N&&(window.clearTimeout(N),N=void 0)},z=()=>{!f.value||document.hidden||(N=window.setTimeout(async()=>{await A(),z()},dt))},F=()=>{S(),z()},_e=()=>{f.value=!f.value,f.value?F():S()},we=()=>{b.value=!b.value,requestAnimationFrame(J)},J=()=>{b.value&&k.value&&(k.value.scrollTop=k.value.scrollHeight),!b.value&&O.value&&(O.value.scrollTop=O.value.scrollHeight)},Y=()=>{document.hidden?S():f.value&&F()};return Ie(()=>{const e=localStorage.getItem("log-fold-state");if(e)try{_.value=JSON.parse(e)}catch{_.value={}}A(),F(),document.addEventListener("visibilitychange",Y)}),Le(()=>{S(),document.removeEventListener("visibilitychange",Y)}),(e,t)=>(d(),a(h,null,[s("div",Ne,[s("div",Te,[t[5]||(t[5]=s("p",{class:"text-base font-semibold text-foreground"},"管理日志",-1)),s("div",Ae," 自动刷新:"+n(f.value?"开启":"关闭"),1)]),s("div",Se,[s("div",$e,[t[6]||(t[6]=s("div",{class:"text-[11px] text-muted-foreground"},"总数",-1)),s("div",Ee,n(x.value?.memory.total??0),1)]),s("div",Me,[t[7]||(t[7]=s("div",{class:"text-[11px] text-muted-foreground"},"对话",-1)),s("div",Ge,n(x.value?.chat_count??0),1)]),s("div",Ue,[t[8]||(t[8]=s("div",{class:"text-[11px] text-muted-foreground"},"INFO",-1)),s("div",Ve,n(x.value?.memory.by_level.INFO??0),1)]),s("div",qe,[t[9]||(t[9]=s("div",{class:"text-[11px] text-muted-foreground"},"WARNING",-1)),s("div",Fe,n(x.value?.memory.by_level.WARNING??0),1)]),s("div",De,[t[10]||(t[10]=s("div",{class:"text-[11px] text-muted-foreground"},"ERROR",-1)),s("div",{class:v(["mt-1 text-lg font-semibold",x.value?.memory.by_level.ERROR?"text-rose-600":"text-foreground"])},n(x.value?.memory.by_level.ERROR??0),3)]),s("div",Be,[t[11]||(t[11]=s("div",{class:"text-[11px] text-muted-foreground"},"缓存上限",-1)),s("div",je,n(x.value?.memory.capacity??0),1)])]),s("div",He,[s("div",We,[Q(ke,{modelValue:i.level,"onUpdate:modelValue":t[0]||(t[0]=o=>i.level=o),options:se},null,8,["modelValue"])]),X(s("input",{"onUpdate:modelValue":t[1]||(t[1]=o=>i.search=o),type:"text",placeholder:"搜索...",class:"min-w-[200px] flex-1 rounded-2xl border border-border bg-background px-3 py-2 text-xs text-foreground sm:min-w-0"},null,512),[[ee,i.search,void 0,{trim:!0}]]),X(s("input",{"onUpdate:modelValue":t[2]||(t[2]=o=>i.limit=o),type:"number",min:"10",max:"1000",step:"100",class:"w-24 rounded-2xl border border-border bg-background px-3 py-2 text-xs text-foreground"},null,512),[[ee,i.limit,void 0,{number:!0}]]),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:A}," 查询 "),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:he}," 导出 "),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:we},n(b.value?"结构化视图":"原始视图"),1),s("button",{class:v(["rounded-full px-4 py-2 text-xs font-medium transition-colors",f.value?"bg-primary text-primary-foreground":"border border-border text-muted-foreground hover:text-foreground"]),onClick:_e}," 自动刷新 ",2),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-destructive transition-colors hover:border-destructive/60",onClick:t[3]||(t[3]=o=>L.value=!0)}," 清空 ")]),p.value?(d(),a("div",{key:0,class:v(["mt-3 text-xs",le.value])},n(p.value),3)):m("",!0),I.value?(d(),a("div",ze,n(I.value),1)):m("",!0),b.value?(d(),a("div",{key:2,ref_key:"rawLogContainer",ref:k,class:"scrollbar-slim mt-4 max-h-[60vh] overflow-x-auto overflow-y-auto rounded-2xl border border-border bg-black px-4 py-3 text-xs text-green-200"},[s("pre",Je,n(pe.value.text),1)],512)):(d(),a("div",{key:3,ref_key:"structuredLogContainer",ref:O,class:"scrollbar-slim mt-4 max-h-[60vh] space-y-3 overflow-y-auto rounded-2xl border border-border bg-card px-4 py-3"},[T.value.ungrouped.length===0&&T.value.groups.length===0?(d(),a("div",Ye," 暂无日志 ")):m("",!0),(d(!0),a(h,null,w(T.value.ungrouped,(o,r)=>(d(),a("div",{key:`u-${r}`},[s("div",Pe,[s("div",Ze,[s("span",Ke,n(o.time),1),s("span",{class:v(W(o.level))},n(o.level),3),(d(!0),a(h,null,w(o.tags,u=>(d(),a("span",{key:u,class:"rounded px-2 py-0.5 text-[10px] font-semibold text-white",style:R({backgroundColor:H(u)})},n(u),5))),128)),o.accountId?(d(),a("span",{key:0,class:"text-[11px] font-semibold",style:R({color:V(o.accountId)})},n(o.accountId),5)):m("",!0)]),s("div",Qe,n(o.text),1)])]))),128)),(d(!0),a(h,null,w(T.value.groups,o=>(d(),a("div",{key:o.id,class:"rounded-2xl border border-border bg-card"},[s("button",{type:"button",class:"flex w-full flex-wrap items-center gap-2 rounded-2xl bg-secondary/40 px-4 py-3 text-left text-xs transition hover:bg-secondary/60",onClick:r=>ge(o.id)},[s("span",{class:v(ae(o.status))},n(de(o.status)),3),s("span",et,"req_"+n(o.id),1),o.accountId?(d(),a("span",{key:0,class:"text-xs font-semibold",style:R({color:V(o.accountId)})},n(o.accountId),5)):m("",!0),o.model?(d(),a("span",tt,n(o.model),1)):m("",!0),fe(o)?(d(),a("span",ot," 仅显示最近 "+n(M)+" 条 ")):m("",!0),s("span",st,n(o.logs.length)+" 条日志",1),s("span",{class:v(["ml-auto text-muted-foreground transition-transform",{"rotate-90":!q(o.id)}])}," ▸ ",2)],8,Xe),q(o.id)?m("",!0):(d(),a("div",rt,[(d(!0),a(h,null,w(ve(o),(r,u)=>(d(),a("div",{key:`${o.id}-${u}`,class:"cv-auto flex flex-wrap items-center gap-2 rounded-xl border border-border bg-card px-3 py-2 text-xs"},[s("div",nt,[s("span",lt,n(r.time),1),s("span",{class:v(W(r.level))},n(r.level),3),(d(!0),a(h,null,w(r.tags,l=>(d(),a("span",{key:l,class:"rounded px-2 py-0.5 text-[10px] font-semibold text-white",style:R({backgroundColor:H(l)})},n(l),5))),128)),r.accountId?(d(),a("span",{key:0,class:"text-[11px] font-semibold",style:R({color:V(r.accountId)})},n(r.accountId),5)):m("",!0)]),s("div",at,n(r.text),1)]))),128))]))]))),128))],512))]),Q(Oe,{open:L.value,title:"确认操作",message:"确定要清空所有运行日志吗?","confirm-text":"确认","cancel-text":"取消",onConfirm:ye,onCancel:t[4]||(t[4]=o=>L.value=!1)},null,8,["open"])],64))}});export{mt as default};
|
static/assets/Logs-Cag1gpYh.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import{g as K,d as Re,h as c,H as Ce,i as D,o as Ie,j as Le,c as a,a as s,x as Q,b as m,t as n,n as v,m as X,v as ee,F as h,r as w,k as R,e as d}from"./index-Bld7Uski.js";import{_ as ke}from"./SelectMenu.vue_vue_type_script_setup_true_lang-DRqaa_R-.js";import{_ as Oe}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-QhDFiT60.js";const B={list:j=>K.get("/admin/log",{params:j}),clear:()=>K.delete("/admin/log?confirm=yes")},Ne={class:"rounded-3xl border border-border bg-card p-6"},Te={class:"flex flex-wrap items-center justify-between gap-3"},Ae={class:"text-xs text-muted-foreground"},Se={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-3 xl:grid-cols-6"},$e={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Ee={class:"mt-1 text-lg font-semibold text-foreground"},Me={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Ge={class:"mt-1 text-lg font-semibold text-foreground"},Ue={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Ve={class:"mt-1 text-lg font-semibold text-foreground"},qe={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Fe={class:"mt-1 text-lg font-semibold text-foreground"},De={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},Be={class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},je={class:"mt-1 text-lg font-semibold text-foreground"},He={class:"mt-4 flex flex-wrap items-center gap-2 sm:flex-nowrap"},We={class:"w-44 shrink-0"},ze={key:1,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},Je={class:"whitespace-pre font-mono leading-relaxed"},Ye={key:0,class:"text-xs text-muted-foreground"},Pe={class:"cv-auto flex flex-wrap items-center gap-2 rounded-xl border border-border bg-card px-3 py-2 text-xs"},Ze={class:"flex flex-wrap items-center gap-2"},Ke={class:"text-muted-foreground"},Qe={class:"w-full text-foreground md:w-auto md:flex-1"},Xe=["onClick"],et={class:"text-muted-foreground"},tt={key:1,class:"text-muted-foreground"},ot={key:2,class:"text-[10px] text-muted-foreground"},st={class:"text-muted-foreground"},rt={key:0,class:"space-y-2 px-4 py-3"},nt={class:"flex flex-wrap items-center gap-2"},lt={class:"text-muted-foreground"},at={class:"w-full text-foreground md:w-auto md:flex-1"},E=1e3,te=1e3,M=200,dt=3e3,mt=Re({__name:"Logs",setup(j){const oe=c([]),C=c([]),G=c({ungrouped:[],groups:[]}),x=c(null),I=c(""),p=c(""),y=c("success"),L=c(!1),f=c(!0),_=c({}),b=c(!0),k=c(null),O=c(null);let N,U=!1;const i=Ce({level:"",search:"",limit:300}),se=[{label:"全部",value:""},{label:"INFO",value:"INFO"},{label:"WARNING",value:"WARNING"},{label:"ERROR",value:"ERROR"}],re={SYSTEM:"#9e9e9e",CONFIG:"#607d8b",LOG:"#9e9e9e",AUTH:"#4caf50",SESSION:"#00bcd4",FILE:"#ff9800",CHAT:"#2196f3",API:"#8bc34a",CACHE:"#9c27b0",ACCOUNT:"#f44336",MULTI:"#673ab7"},ne={account_1:"#9c27b0",account_2:"#e91e63",account_3:"#00bcd4",account_4:"#4caf50",account_5:"#ff9800"},le=D(()=>y.value==="error"?"text-destructive":"text-muted-foreground"),H=e=>re[e]||"#757575",V=e=>ne[e]||"#757575",W=e=>{const t="rounded px-2 py-0.5 text-[10px] font-semibold";return e==="INFO"?`${t} bg-blue-100 text-blue-700`:e==="WARNING"?`${t} bg-amber-100 text-amber-700`:e==="ERROR"||e==="CRITICAL"?`${t} bg-rose-100 text-rose-700`:`${t} bg-violet-100 text-violet-700`},ae=e=>{const t="rounded-md px-2 py-0.5 text-[11px] font-semibold";return e==="success"?`${t} bg-emerald-100 text-emerald-700`:e==="error"?`${t} bg-rose-100 text-rose-700`:e==="timeout"?`${t} bg-amber-100 text-amber-700`:`${t} bg-amber-100 text-amber-700`},de=e=>e==="success"?"成功":e==="error"?"失败":e==="timeout"?"超时":"进行中",ie=e=>{let t=e;const o=[];let r="";const u=/^\[([A-Za-z0-9_]+)\]/;for(;;){const l=t.match(u);if(!l)break;const g=l[1];if(t=t.slice(l[0].length).trim(),!g.startsWith("req_")){if(g.startsWith("account_")){r=g;continue}o.push(g)}}return{tags:o,accountId:r,text:t}},ue=e=>{const t=ie(e.message),o=e.message.match(/\[req_([a-z0-9]+)\]/i);return{...e,...t,reqId:o?o[1]:""}},ce=e=>{if(/^\d{4}-\d{2}-\d{2}T/.test(e))return new Date(e);if(/^\d{4}-\d{2}-\d{2}/.test(e))return new Date(e.replace(" ","T"));if(/^\d{2}:\d{2}:\d{2}$/.test(e)){const t=new Date,[o,r,u]=e.split(":").map(Number),l=new Date(t);return l.setHours(o,r,u,0),l}return null},me=e=>{const t=e[e.length-1],o=t.message;if(o.includes("响应完成")||o.includes("非流式响应完成"))return"success";if(t.level==="ERROR"||o.includes("失败"))return"error";const r=ce(t.time);return r&&(Date.now()-r.getTime())/1e3/60>5?"timeout":"in_progress"},xe=e=>{const t=new Map,o=[],r=[];e.forEach(l=>{l.reqId?(t.has(l.reqId)||(t.set(l.reqId,[]),o.push(l.reqId)),t.get(l.reqId)?.push(l)):r.push(l)});const u=o.map(l=>{const g=t.get(l)||[],$=g[0],P=$?.message.match(/\[(account_[^\]]+)\]/i),Z=$?.message.match(/收到请求: ([^ |]+)/)||$?.message.match(/Received request: ([^ |]+)/);return{id:l,logs:g,status:me(g),accountId:$?.accountId||(P?P[1]:""),model:Z?Z[1]:""}});return{ungrouped:r,groups:u}},T=D(()=>{const e=G.value.ungrouped,t=G.value.groups,o=e.length>E?e.slice(-E):e,r=t.length>E?t.slice(-E):t;return{ungrouped:o,groups:r,limited:e.length>o.length||t.length>r.length,ungroupedTotal:e.length,groupsTotal:t.length,ungroupedShowing:o.length,groupsShowing:r.length}}),pe=D(()=>{const e=C.value.length,t=e>te?e-te:0,o=C.value.slice(t),r=o.map(l=>`${l.time} | ${l.level} | ${l.message}`).join(`
|
| 2 |
+
`),u=o.length;return{text:r,total:e,showing:u,limited:e>u}}),q=e=>_.value[e]===!0,ge=e=>{_.value[e]=!q(e),localStorage.setItem("log-fold-state",JSON.stringify(_.value))},fe=e=>e.logs.length>M,ve=e=>e.logs.length<=M?e.logs:e.logs.slice(-M),be=()=>{(!i.limit||Number.isNaN(i.limit))&&(i.limit=300),i.limit=Math.min(Math.max(i.limit,10),1e3)},A=async()=>{if(!U){U=!0,I.value="",p.value="",be();try{const e=await B.list({limit:i.limit,level:i.level||void 0,search:i.search||void 0});oe.value=e.logs,C.value=e.logs.map(ue),G.value=xe(C.value),x.value=e.stats}catch(e){I.value=e.message||"日志加载失败"}finally{U=!1,requestAnimationFrame(J)}}},he=async()=>{p.value="",y.value="success";try{const e=await B.list({limit:1e3,level:i.level||void 0,search:i.search||void 0}),t=new Blob([JSON.stringify({exported_at:new Date().toISOString(),logs:e.logs},null,2)],{type:"application/json"}),o=URL.createObjectURL(t),r=document.createElement("a");r.href=o,r.download=`logs_${new Date().toISOString().slice(0,19).replace(/:/g,"-")}.json`,r.click(),URL.revokeObjectURL(o),p.value="导出成功"}catch(e){y.value="error",p.value=e.message||"导出失败"}},ye=async()=>{L.value=!1;try{await B.clear(),y.value="success",p.value="已清空日志",await A()}catch(e){y.value="error",p.value=e.message||"清空失败"}},S=()=>{N&&(window.clearTimeout(N),N=void 0)},z=()=>{!f.value||document.hidden||(N=window.setTimeout(async()=>{await A(),z()},dt))},F=()=>{S(),z()},_e=()=>{f.value=!f.value,f.value?F():S()},we=()=>{b.value=!b.value,requestAnimationFrame(J)},J=()=>{b.value&&k.value&&(k.value.scrollTop=k.value.scrollHeight),!b.value&&O.value&&(O.value.scrollTop=O.value.scrollHeight)},Y=()=>{document.hidden?S():f.value&&F()};return Ie(()=>{const e=localStorage.getItem("log-fold-state");if(e)try{_.value=JSON.parse(e)}catch{_.value={}}A(),F(),document.addEventListener("visibilitychange",Y)}),Le(()=>{S(),document.removeEventListener("visibilitychange",Y)}),(e,t)=>(d(),a(h,null,[s("div",Ne,[s("div",Te,[t[5]||(t[5]=s("p",{class:"text-base font-semibold text-foreground"},"管理日志",-1)),s("div",Ae," 自动刷新:"+n(f.value?"开启":"关闭"),1)]),s("div",Se,[s("div",$e,[t[6]||(t[6]=s("div",{class:"text-[11px] text-muted-foreground"},"总数",-1)),s("div",Ee,n(x.value?.memory.total??0),1)]),s("div",Me,[t[7]||(t[7]=s("div",{class:"text-[11px] text-muted-foreground"},"对话",-1)),s("div",Ge,n(x.value?.chat_count??0),1)]),s("div",Ue,[t[8]||(t[8]=s("div",{class:"text-[11px] text-muted-foreground"},"INFO",-1)),s("div",Ve,n(x.value?.memory.by_level.INFO??0),1)]),s("div",qe,[t[9]||(t[9]=s("div",{class:"text-[11px] text-muted-foreground"},"WARNING",-1)),s("div",Fe,n(x.value?.memory.by_level.WARNING??0),1)]),s("div",De,[t[10]||(t[10]=s("div",{class:"text-[11px] text-muted-foreground"},"ERROR",-1)),s("div",{class:v(["mt-1 text-lg font-semibold",x.value?.memory.by_level.ERROR?"text-rose-600":"text-foreground"])},n(x.value?.memory.by_level.ERROR??0),3)]),s("div",Be,[t[11]||(t[11]=s("div",{class:"text-[11px] text-muted-foreground"},"缓存上限",-1)),s("div",je,n(x.value?.memory.capacity??0),1)])]),s("div",He,[s("div",We,[Q(ke,{modelValue:i.level,"onUpdate:modelValue":t[0]||(t[0]=o=>i.level=o),options:se},null,8,["modelValue"])]),X(s("input",{"onUpdate:modelValue":t[1]||(t[1]=o=>i.search=o),type:"text",placeholder:"搜索...",class:"min-w-[200px] flex-1 rounded-2xl border border-border bg-background px-3 py-2 text-xs text-foreground sm:min-w-0"},null,512),[[ee,i.search,void 0,{trim:!0}]]),X(s("input",{"onUpdate:modelValue":t[2]||(t[2]=o=>i.limit=o),type:"number",min:"10",max:"1000",step:"100",class:"w-24 rounded-2xl border border-border bg-background px-3 py-2 text-xs text-foreground"},null,512),[[ee,i.limit,void 0,{number:!0}]]),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:A}," 查询 "),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:he}," 导出 "),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary",onClick:we},n(b.value?"结构化视图":"原始视图"),1),s("button",{class:v(["rounded-full px-4 py-2 text-xs font-medium transition-colors",f.value?"bg-primary text-primary-foreground":"border border-border text-muted-foreground hover:text-foreground"]),onClick:_e}," 自动刷新 ",2),s("button",{class:"rounded-full border border-border px-4 py-2 text-xs font-medium text-destructive transition-colors hover:border-destructive/60",onClick:t[3]||(t[3]=o=>L.value=!0)}," 清空 ")]),p.value?(d(),a("div",{key:0,class:v(["mt-3 text-xs",le.value])},n(p.value),3)):m("",!0),I.value?(d(),a("div",ze,n(I.value),1)):m("",!0),b.value?(d(),a("div",{key:2,ref_key:"rawLogContainer",ref:k,class:"scrollbar-slim mt-4 max-h-[60vh] overflow-x-auto overflow-y-auto rounded-2xl border border-border bg-black px-4 py-3 text-xs text-green-200"},[s("pre",Je,n(pe.value.text),1)],512)):(d(),a("div",{key:3,ref_key:"structuredLogContainer",ref:O,class:"scrollbar-slim mt-4 max-h-[60vh] space-y-3 overflow-y-auto rounded-2xl border border-border bg-card px-4 py-3"},[T.value.ungrouped.length===0&&T.value.groups.length===0?(d(),a("div",Ye," 暂无日志 ")):m("",!0),(d(!0),a(h,null,w(T.value.ungrouped,(o,r)=>(d(),a("div",{key:`u-${r}`},[s("div",Pe,[s("div",Ze,[s("span",Ke,n(o.time),1),s("span",{class:v(W(o.level))},n(o.level),3),(d(!0),a(h,null,w(o.tags,u=>(d(),a("span",{key:u,class:"rounded px-2 py-0.5 text-[10px] font-semibold text-white",style:R({backgroundColor:H(u)})},n(u),5))),128)),o.accountId?(d(),a("span",{key:0,class:"text-[11px] font-semibold",style:R({color:V(o.accountId)})},n(o.accountId),5)):m("",!0)]),s("div",Qe,n(o.text),1)])]))),128)),(d(!0),a(h,null,w(T.value.groups,o=>(d(),a("div",{key:o.id,class:"rounded-2xl border border-border bg-card"},[s("button",{type:"button",class:"flex w-full flex-wrap items-center gap-2 rounded-2xl bg-secondary/40 px-4 py-3 text-left text-xs transition hover:bg-secondary/60",onClick:r=>ge(o.id)},[s("span",{class:v(ae(o.status))},n(de(o.status)),3),s("span",et,"req_"+n(o.id),1),o.accountId?(d(),a("span",{key:0,class:"text-xs font-semibold",style:R({color:V(o.accountId)})},n(o.accountId),5)):m("",!0),o.model?(d(),a("span",tt,n(o.model),1)):m("",!0),fe(o)?(d(),a("span",ot," 仅显示最近 "+n(M)+" 条 ")):m("",!0),s("span",st,n(o.logs.length)+" 条日志",1),s("span",{class:v(["ml-auto text-muted-foreground transition-transform",{"rotate-90":!q(o.id)}])}," ▸ ",2)],8,Xe),q(o.id)?m("",!0):(d(),a("div",rt,[(d(!0),a(h,null,w(ve(o),(r,u)=>(d(),a("div",{key:`${o.id}-${u}`,class:"cv-auto flex flex-wrap items-center gap-2 rounded-xl border border-border bg-card px-3 py-2 text-xs"},[s("div",nt,[s("span",lt,n(r.time),1),s("span",{class:v(W(r.level))},n(r.level),3),(d(!0),a(h,null,w(r.tags,l=>(d(),a("span",{key:l,class:"rounded px-2 py-0.5 text-[10px] font-semibold text-white",style:R({backgroundColor:H(l)})},n(l),5))),128)),r.accountId?(d(),a("span",{key:0,class:"text-[11px] font-semibold",style:R({color:V(r.accountId)})},n(r.accountId),5)):m("",!0)]),s("div",at,n(r.text),1)]))),128))]))]))),128))],512))]),Q(Oe,{open:L.value,title:"确认操作",message:"确定要清空所有运行日志吗?","confirm-text":"确认","cancel-text":"取消",onConfirm:ye,onCancel:t[4]||(t[4]=o=>L.value=!1)},null,8,["open"])],64))}});export{mt as default};
|
static/assets/Monitor-BemJ9-ii.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{u as g}from"./useUptimeStatus-D_PU76s5.js";import{d as v,o as y,c as r,a as t,b as u,t as o,u as n,F as _,r as c,n as m,f as l,e as a}from"./index-B0A0-QFY.js";const h={class:"space-y-6"},k={class:"rounded-3xl border border-border bg-card p-6"},C={class:"flex flex-wrap items-center justify-between gap-3"},N={class:"mt-1 text-xs text-muted-foreground"},B={key:0,class:"mt-4 rounded-2xl border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive"},M={class:"mt-6 grid gap-8 md:grid-cols-2"},S={class:"monitor-card__header"},V={class:"monitor-card__name"},w={class:"monitor-card__stats"},F={class:"monitor-card__value"},L={class:"monitor-card__value"},$={class:"monitor-card__value"},j={class:"monitor-card__beats"},z={key:0,class:"monitor-beat__tooltip"},U=v({__name:"Monitor",setup(A){const{services:p,updatedAt:b,errorMessage:i,refreshStatus:f}=g();return y(()=>{f()}),(D,s)=>(a(),r("div",h,[t("section",k,[t("div",C,[t("div",null,[s[0]||(s[0]=t("p",{class:"text-base font-semibold text-foreground"},"服务状态",-1)),t("p",N," 最近更新:"+o(n(b)||"未获取"),1)]),s[1]||(s[1]=t("div",{class:"flex items-center gap-2"},[t("a",{href:"/#/public/uptime",target:"_blank",class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary"}," 打开监控页 ")],-1))]),n(i)?(a(),r("div",B,o(n(i)),1)):u("",!0),t("div",M,[(a(!0),r(_,null,c(n(p),e=>(a(),r("div",{key:e.key,class:"monitor-card"},[t("div",S,[t("span",V,o(e.name),1),t("span",{class:m(["monitor-card__badge",e.statusClass])},o(e.statusLabel),3)]),t("div",w,[t("span",null,[s[2]||(s[2]=l("可用率 ",-1)),t("span",F,o(e.uptime)+"%",1)]),t("span",null,[s[3]||(s[3]=l("请求 ",-1)),t("span",L,o(e.total),1)]),t("span",null,[s[4]||(s[4]=l("成功 ",-1)),t("span",$,o(e.success),1)])]),t("div",j,[(a(!0),r(_,null,c(e.beats,(d,x)=>(a(),r("div",{key:`${e.key}-${x}`,class:m(["monitor-beat",d.className])},[d.tooltip?(a(),r("span",z,o(d.tooltip),1)):u("",!0)],2))),128))])]))),128))])])]))}});export{U as default};
|
static/assets/Monitor-zt-Todu7.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{u as g}from"./useUptimeStatus-BbQ1ylnm.js";import{d as v,o as y,c as r,a as t,b as u,t as o,u as n,F as _,r as c,n as m,f as l,e as a}from"./index-Bld7Uski.js";const h={class:"space-y-6"},k={class:"rounded-3xl border border-border bg-card p-6"},C={class:"flex flex-wrap items-center justify-between gap-3"},N={class:"mt-1 text-xs text-muted-foreground"},B={key:0,class:"mt-4 rounded-2xl border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive"},M={class:"mt-6 grid gap-8 md:grid-cols-2"},S={class:"monitor-card__header"},V={class:"monitor-card__name"},w={class:"monitor-card__stats"},F={class:"monitor-card__value"},L={class:"monitor-card__value"},$={class:"monitor-card__value"},j={class:"monitor-card__beats"},z={key:0,class:"monitor-beat__tooltip"},U=v({__name:"Monitor",setup(A){const{services:p,updatedAt:b,errorMessage:i,refreshStatus:f}=g();return y(()=>{f()}),(D,s)=>(a(),r("div",h,[t("section",k,[t("div",C,[t("div",null,[s[0]||(s[0]=t("p",{class:"text-base font-semibold text-foreground"},"服务状态",-1)),t("p",N," 最近更新:"+o(n(b)||"未获取"),1)]),s[1]||(s[1]=t("div",{class:"flex items-center gap-2"},[t("a",{href:"/#/public/uptime",target:"_blank",class:"rounded-full border border-border px-4 py-2 text-sm font-medium text-foreground transition-colors hover:border-primary hover:text-primary"}," 打开监控页 ")],-1))]),n(i)?(a(),r("div",B,o(n(i)),1)):u("",!0),t("div",M,[(a(!0),r(_,null,c(n(p),e=>(a(),r("div",{key:e.key,class:"monitor-card"},[t("div",S,[t("span",V,o(e.name),1),t("span",{class:m(["monitor-card__badge",e.statusClass])},o(e.statusLabel),3)]),t("div",w,[t("span",null,[s[2]||(s[2]=l("可用率 ",-1)),t("span",F,o(e.uptime)+"%",1)]),t("span",null,[s[3]||(s[3]=l("请求 ",-1)),t("span",L,o(e.total),1)]),t("span",null,[s[4]||(s[4]=l("成功 ",-1)),t("span",$,o(e.success),1)])]),t("div",j,[(a(!0),r(_,null,c(e.beats,(d,x)=>(a(),r("div",{key:`${e.key}-${x}`,class:m(["monitor-beat",d.className])},[d.tooltip?(a(),r("span",z,o(d.tooltip),1)):u("",!0)],2))),128))])]))),128))])])]))}});export{U as default};
|
static/assets/PublicLogs-BpmmHE3p.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{g as k,d as X,h as c,i,o as Y,j as Z,c as o,a as s,b as h,f as E,t as u,F as _,r as w,k as ee,n as $,e as l}from"./index-B0A0-QFY.js";const te={list:C=>k.get("/public/log",{params:C})},se={overview(){return k.get("/public/stats")}},re={overview(){return k.get("/public/display")}},oe={class:"min-h-screen overflow-x-hidden bg-card/70 text-foreground backdrop-blur"},le={class:"mx-auto w-full max-w-6xl min-w-0 px-4 py-8"},ae={class:"rounded-3xl border border-border bg-card p-6"},ne={class:"flex flex-wrap items-start justify-between gap-4"},ue={class:"flex items-center gap-3"},ie=["src"],ce={class:"mt-4 flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-border bg-secondary/40 px-4 py-3"},de=["href"],me={key:1,class:"text-xs text-muted-foreground"},pe={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-4"},be={class:"text-[11px] text-muted-foreground"},fe={key:0,class:"mt-4 rounded-2xl border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive"},ve={key:1,class:"mt-4 rounded-2xl border border-border bg-secondary/30 px-4 py-6 text-center text-sm text-muted-foreground"},xe={key:2,class:"mt-4 max-h-[60vh] space-y-3 overflow-y-auto pr-1 scrollbar-slim"},ge=["onClick"],ye={class:"text-muted-foreground"},he={class:"text-muted-foreground"},_e={key:0,class:"space-y-2 px-4 py-3"},we={class:"text-muted-foreground"},$e={class:"flex-1 text-foreground"},F=1e3,T=1e3,ke=3e3,Le=X({__name:"PublicLogs",setup(C){const a=c([]),p=c(null),b=c(null),d=c(""),L=c("--:--"),m=c({});let f,v=!1;const j=i(()=>b.value?.logo_url?.trim()||"/logo.svg"),S=i(()=>b.value?.chat_url?.trim()||""),U=i(()=>a.value.length),x=i(()=>a.value.filter(e=>e.status==="success").length),q=i(()=>a.value.filter(e=>e.status==="error").length),V=i(()=>a.value.length>T?a.value.slice(-T):a.value),z=i(()=>{let e=0,t=0;return a.value.forEach(r=>{r.status==="success"&&r.events.forEach(n=>{if(n.type!=="complete")return;const D=n.content.match(/([0-9]+(?:\.[0-9]+)?)\s*s/);D&&(e+=Number(D[1]),t+=1)})}),t===0?"-":`${(e/t).toFixed(1)}s`}),I=i(()=>{const e=x.value+q.value;return e===0?"-":`${(x.value/e*100).toFixed(1)}%`}),M=i(()=>[{label:"总访客",value:p.value?.total_visitors??0},{label:"每分钟请求",value:p.value?.requests_per_minute??0,color:p.value?.load_color},{label:"平均响应",value:z.value},{label:"成功率",value:I.value,color:"#10b981"},{label:"对话次数",value:U.value},{label:"成功",value:x.value,color:"#10b981"},{label:"失败",value:q.value,color:"#ef4444"},{label:"更新时间",value:L.value,color:"#6b7280"}]),P=e=>e==="success"?"成功":e==="error"?"失败":e==="timeout"?"超时":"进行中",G=e=>{const t="rounded-md px-2 py-0.5 text-[11px] font-semibold";return e==="success"?`${t} bg-emerald-100 text-emerald-700`:e==="error"?`${t} bg-rose-100 text-rose-700`:e==="timeout"?`${t} bg-amber-100 text-amber-700`:`${t} bg-amber-100 text-amber-700`},J=e=>e.type==="start"?"开始对话":e.type==="select"?"选择":e.type==="retry"?"重试":e.type==="switch"?"切换":e.type==="complete"?e.status==="success"?"完成":e.status==="error"?"失败":e.status==="timeout"?"超时":"完成":"事件",O=e=>{const t="rounded-md px-2 py-0.5 text-[11px] font-semibold";if(e.type==="start")return`${t} bg-blue-100 text-blue-700`;if(e.type==="select")return`${t} bg-violet-100 text-violet-700`;if(e.type==="retry")return`${t} bg-amber-100 text-amber-700`;if(e.type==="switch")return`${t} bg-cyan-100 text-cyan-700`;if(e.type==="complete"){if(e.status==="success")return`${t} bg-emerald-100 text-emerald-700`;if(e.status==="error")return`${t} bg-rose-100 text-rose-700`;if(e.status==="timeout")return`${t} bg-amber-100 text-amber-700`}return`${t} bg-slate-100 text-slate-600`},H=()=>{try{const e=localStorage.getItem("public-log-fold-state");e&&(m.value=JSON.parse(e))}catch{m.value={}}},K=()=>{localStorage.setItem("public-log-fold-state",JSON.stringify(m.value))},g=e=>m.value[e]===!0,Q=e=>{m.value[e]=!g(e),K()},A=async()=>{if(!v){v=!0,d.value="";try{const[e,t]=await Promise.all([te.list({limit:F}),se.overview()]);a.value=e.logs,p.value=t,L.value=new Date().toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch(e){d.value=e.message||"日志加载失败"}finally{v=!1}}},W=async()=>{try{b.value=await re.overview()}catch{b.value=null}},y=()=>{f&&(window.clearTimeout(f),f=void 0)},B=()=>{document.hidden||(f=window.setTimeout(async()=>{await A(),B()},ke))},N=()=>{y(),B()},R=()=>{document.hidden?y():N()};return Y(()=>{H(),W(),A(),N(),document.addEventListener("visibilitychange",R)}),Z(()=>{y(),document.removeEventListener("visibilitychange",R)}),(e,t)=>(l(),o("div",oe,[s("div",le,[s("section",ae,[s("div",ne,[s("div",ue,[s("img",{src:j.value,alt:"Gemini Business2API",class:"h-8 w-8 object-contain"},null,8,ie),t[0]||(t[0]=s("div",null,[s("p",{class:"text-base font-semibold text-foreground"},"公开日志")],-1))]),t[1]||(t[1]=s("div",{class:"flex items-center gap-2 text-xs text-muted-foreground"},[s("span",null,"自动刷新:3s")],-1))]),s("div",ce,[s("div",{class:"text-xs text-muted-foreground"},[t[2]||(t[2]=E(" 展示最近 ",-1)),s("span",{class:"font-semibold text-foreground"},u(F)),t[3]||(t[3]=E(" 条会话日志 ",-1))]),S.value?(l(),o("a",{key:0,href:S.value,target:"_blank",class:"text-xs font-medium text-emerald-600 transition hover:text-emerald-500"}," 开始对话 ",8,de)):(l(),o("span",me,"开始对话"))]),s("div",pe,[(l(!0),o(_,null,w(M.value,r=>(l(),o("div",{key:r.label,class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},[s("div",be,u(r.label),1),s("div",{class:"mt-1 text-lg font-semibold",style:ee({color:r.color||void 0})},u(r.value),5)]))),128))]),d.value?(l(),o("div",fe,u(d.value),1)):h("",!0),a.value.length===0&&!d.value?(l(),o("div",ve," 暂无日志 ")):a.value.length>0?(l(),o("div",xe,[(l(!0),o(_,null,w(V.value,r=>(l(),o("div",{key:r.request_id,class:"rounded-2xl border border-border bg-card"},[s("button",{type:"button",class:"flex w-full flex-wrap items-center gap-2 rounded-2xl bg-secondary/40 px-4 py-3 text-left text-xs transition hover:bg-secondary/60",onClick:n=>Q(r.request_id)},[s("span",{class:$(G(r.status))},u(P(r.status)),3),s("span",ye,"req_"+u(r.request_id),1),s("span",he,u(r.events.length)+" 条事件",1),s("span",{class:$(["ml-auto text-muted-foreground transition-transform",{"rotate-90":!g(r.request_id)}])}," ▸ ",2)],8,ge),g(r.request_id)?h("",!0):(l(),o("div",_e,[(l(!0),o(_,null,w(r.events,n=>(l(),o("div",{key:`${r.request_id}-${n.time}-${n.type}`,class:"cv-auto flex flex-wrap items-center gap-3 rounded-xl border border-border bg-card px-3 py-2 text-xs"},[s("div",we,u(n.time),1),s("span",{class:$(O(n))},u(J(n)),3),s("div",$e,u(n.content),1)]))),128))]))]))),128))])):h("",!0)])])]))}});export{Le as default};
|
static/assets/PublicLogs-bUB_irTf.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{g as k,d as X,h as c,i,o as Y,j as Z,c as o,a as s,b as h,f as E,t as u,F as _,r as w,k as ee,n as $,e as l}from"./index-Bld7Uski.js";const te={list:C=>k.get("/public/log",{params:C})},se={overview(){return k.get("/public/stats")}},re={overview(){return k.get("/public/display")}},oe={class:"min-h-screen overflow-x-hidden bg-card/70 text-foreground backdrop-blur"},le={class:"mx-auto w-full max-w-6xl min-w-0 px-4 py-8"},ae={class:"rounded-3xl border border-border bg-card p-6"},ne={class:"flex flex-wrap items-start justify-between gap-4"},ue={class:"flex items-center gap-3"},ie=["src"],ce={class:"mt-4 flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-border bg-secondary/40 px-4 py-3"},de=["href"],me={key:1,class:"text-xs text-muted-foreground"},pe={class:"mt-4 grid grid-cols-2 gap-3 md:grid-cols-4"},be={class:"text-[11px] text-muted-foreground"},fe={key:0,class:"mt-4 rounded-2xl border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive"},ve={key:1,class:"mt-4 rounded-2xl border border-border bg-secondary/30 px-4 py-6 text-center text-sm text-muted-foreground"},xe={key:2,class:"mt-4 max-h-[60vh] space-y-3 overflow-y-auto pr-1 scrollbar-slim"},ge=["onClick"],ye={class:"text-muted-foreground"},he={class:"text-muted-foreground"},_e={key:0,class:"space-y-2 px-4 py-3"},we={class:"text-muted-foreground"},$e={class:"flex-1 text-foreground"},F=1e3,T=1e3,ke=3e3,Le=X({__name:"PublicLogs",setup(C){const a=c([]),p=c(null),b=c(null),d=c(""),L=c("--:--"),m=c({});let f,v=!1;const j=i(()=>b.value?.logo_url?.trim()||"/logo.svg"),S=i(()=>b.value?.chat_url?.trim()||""),U=i(()=>a.value.length),x=i(()=>a.value.filter(e=>e.status==="success").length),q=i(()=>a.value.filter(e=>e.status==="error").length),V=i(()=>a.value.length>T?a.value.slice(-T):a.value),z=i(()=>{let e=0,t=0;return a.value.forEach(r=>{r.status==="success"&&r.events.forEach(n=>{if(n.type!=="complete")return;const D=n.content.match(/([0-9]+(?:\.[0-9]+)?)\s*s/);D&&(e+=Number(D[1]),t+=1)})}),t===0?"-":`${(e/t).toFixed(1)}s`}),I=i(()=>{const e=x.value+q.value;return e===0?"-":`${(x.value/e*100).toFixed(1)}%`}),M=i(()=>[{label:"总访客",value:p.value?.total_visitors??0},{label:"每分钟请求",value:p.value?.requests_per_minute??0,color:p.value?.load_color},{label:"平均响应",value:z.value},{label:"成功率",value:I.value,color:"#10b981"},{label:"对话次数",value:U.value},{label:"成功",value:x.value,color:"#10b981"},{label:"失败",value:q.value,color:"#ef4444"},{label:"更新时间",value:L.value,color:"#6b7280"}]),P=e=>e==="success"?"成功":e==="error"?"失败":e==="timeout"?"超时":"进行中",G=e=>{const t="rounded-md px-2 py-0.5 text-[11px] font-semibold";return e==="success"?`${t} bg-emerald-100 text-emerald-700`:e==="error"?`${t} bg-rose-100 text-rose-700`:e==="timeout"?`${t} bg-amber-100 text-amber-700`:`${t} bg-amber-100 text-amber-700`},J=e=>e.type==="start"?"开始对话":e.type==="select"?"选择":e.type==="retry"?"重试":e.type==="switch"?"切换":e.type==="complete"?e.status==="success"?"完成":e.status==="error"?"失败":e.status==="timeout"?"超时":"完成":"事件",O=e=>{const t="rounded-md px-2 py-0.5 text-[11px] font-semibold";if(e.type==="start")return`${t} bg-blue-100 text-blue-700`;if(e.type==="select")return`${t} bg-violet-100 text-violet-700`;if(e.type==="retry")return`${t} bg-amber-100 text-amber-700`;if(e.type==="switch")return`${t} bg-cyan-100 text-cyan-700`;if(e.type==="complete"){if(e.status==="success")return`${t} bg-emerald-100 text-emerald-700`;if(e.status==="error")return`${t} bg-rose-100 text-rose-700`;if(e.status==="timeout")return`${t} bg-amber-100 text-amber-700`}return`${t} bg-slate-100 text-slate-600`},H=()=>{try{const e=localStorage.getItem("public-log-fold-state");e&&(m.value=JSON.parse(e))}catch{m.value={}}},K=()=>{localStorage.setItem("public-log-fold-state",JSON.stringify(m.value))},g=e=>m.value[e]===!0,Q=e=>{m.value[e]=!g(e),K()},A=async()=>{if(!v){v=!0,d.value="";try{const[e,t]=await Promise.all([te.list({limit:F}),se.overview()]);a.value=e.logs,p.value=t,L.value=new Date().toLocaleTimeString("zh-CN",{hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch(e){d.value=e.message||"日志加载失败"}finally{v=!1}}},W=async()=>{try{b.value=await re.overview()}catch{b.value=null}},y=()=>{f&&(window.clearTimeout(f),f=void 0)},B=()=>{document.hidden||(f=window.setTimeout(async()=>{await A(),B()},ke))},N=()=>{y(),B()},R=()=>{document.hidden?y():N()};return Y(()=>{H(),W(),A(),N(),document.addEventListener("visibilitychange",R)}),Z(()=>{y(),document.removeEventListener("visibilitychange",R)}),(e,t)=>(l(),o("div",oe,[s("div",le,[s("section",ae,[s("div",ne,[s("div",ue,[s("img",{src:j.value,alt:"Gemini Business2API",class:"h-8 w-8 object-contain"},null,8,ie),t[0]||(t[0]=s("div",null,[s("p",{class:"text-base font-semibold text-foreground"},"公开日志")],-1))]),t[1]||(t[1]=s("div",{class:"flex items-center gap-2 text-xs text-muted-foreground"},[s("span",null,"自动刷新:3s")],-1))]),s("div",ce,[s("div",{class:"text-xs text-muted-foreground"},[t[2]||(t[2]=E(" 展示最近 ",-1)),s("span",{class:"font-semibold text-foreground"},u(F)),t[3]||(t[3]=E(" 条会话日志 ",-1))]),S.value?(l(),o("a",{key:0,href:S.value,target:"_blank",class:"text-xs font-medium text-emerald-600 transition hover:text-emerald-500"}," 开始对话 ",8,de)):(l(),o("span",me,"开始对话"))]),s("div",pe,[(l(!0),o(_,null,w(M.value,r=>(l(),o("div",{key:r.label,class:"rounded-2xl border border-border bg-card px-4 py-3 text-center"},[s("div",be,u(r.label),1),s("div",{class:"mt-1 text-lg font-semibold",style:ee({color:r.color||void 0})},u(r.value),5)]))),128))]),d.value?(l(),o("div",fe,u(d.value),1)):h("",!0),a.value.length===0&&!d.value?(l(),o("div",ve," 暂无日志 ")):a.value.length>0?(l(),o("div",xe,[(l(!0),o(_,null,w(V.value,r=>(l(),o("div",{key:r.request_id,class:"rounded-2xl border border-border bg-card"},[s("button",{type:"button",class:"flex w-full flex-wrap items-center gap-2 rounded-2xl bg-secondary/40 px-4 py-3 text-left text-xs transition hover:bg-secondary/60",onClick:n=>Q(r.request_id)},[s("span",{class:$(G(r.status))},u(P(r.status)),3),s("span",ye,"req_"+u(r.request_id),1),s("span",he,u(r.events.length)+" 条事件",1),s("span",{class:$(["ml-auto text-muted-foreground transition-transform",{"rotate-90":!g(r.request_id)}])}," ▸ ",2)],8,ge),g(r.request_id)?h("",!0):(l(),o("div",_e,[(l(!0),o(_,null,w(r.events,n=>(l(),o("div",{key:`${r.request_id}-${n.time}-${n.type}`,class:"cv-auto flex flex-wrap items-center gap-3 rounded-xl border border-border bg-card px-3 py-2 text-xs"},[s("div",we,u(n.time),1),s("span",{class:$(O(n))},u(J(n)),3),s("div",$e,u(n.content),1)]))),128))]))]))),128))])):h("",!0)])])]))}});export{Le as default};
|
static/assets/PublicUptime-BHpUIBOr.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{u as g}from"./useUptimeStatus-D_PU76s5.js";import{d as h,o as v,c as o,a as t,b as i,t as r,u as n,F as _,r as m,e as a,n as p,f as c}from"./index-B0A0-QFY.js";const y={class:"min-h-screen overflow-x-hidden bg-card/70 text-foreground backdrop-blur"},k={class:"mx-auto flex min-h-screen w-full max-w-5xl min-w-0 items-center justify-center px-4 py-8"},w={class:"w-full rounded-3xl border border-border bg-card p-6"},C={class:"mb-6 flex flex-wrap items-center justify-between gap-3"},N={class:"text-xs text-muted-foreground"},B={key:0,class:"mb-4 rounded-2xl border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive"},S={class:"grid gap-8 md:grid-cols-2"},V={class:"monitor-card__header"},j={class:"monitor-card__name"},F={class:"monitor-card__stats"},L={class:"monitor-card__value"},M={class:"monitor-card__value"},U={class:"monitor-card__value"},$={class:"monitor-card__beats"},z={key:0,class:"monitor-beat__tooltip"},A={key:0,class:"rounded-2xl border border-border bg-card p-4 text-xs text-muted-foreground"},q=h({__name:"PublicUptime",setup(D){const{services:u,updatedAt:x,errorMessage:d,refreshStatus:b}=g();return v(()=>{b()}),(E,e)=>(a(),o("div",y,[t("div",k,[t("section",w,[t("div",C,[e[0]||(e[0]=t("div",null,[t("p",{class:"text-sm font-medium text-foreground"},"服务状态")],-1)),t("p",N,"最近更新:"+r(n(x)||"未获取"),1)]),n(d)?(a(),o("div",B,r(n(d)),1)):i("",!0),t("div",S,[(a(!0),o(_,null,m(n(u),s=>(a(),o("div",{key:s.key,class:"monitor-card"},[t("div",V,[t("span",j,r(s.name),1),t("span",{class:p(["monitor-card__badge",s.statusClass])},r(s.statusLabel),3)]),t("div",F,[t("span",null,[e[1]||(e[1]=c("可用率 ",-1)),t("span",L,r(s.uptime)+"%",1)]),t("span",null,[e[2]||(e[2]=c("请求 ",-1)),t("span",M,r(s.total),1)]),t("span",null,[e[3]||(e[3]=c("成功 ",-1)),t("span",U,r(s.success),1)])]),t("div",$,[(a(!0),o(_,null,m(s.beats,(l,f)=>(a(),o("div",{key:`${s.key}-${f}`,class:p(["monitor-beat",l.className])},[l.tooltip?(a(),o("span",z,r(l.tooltip),1)):i("",!0)],2))),128))])]))),128)),!n(u).length&&!n(d)?(a(),o("div",A," 暂无监控数据。 ")):i("",!0)])])])]))}});export{q as default};
|
static/assets/PublicUptime-D8jwML38.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{u as g}from"./useUptimeStatus-BbQ1ylnm.js";import{d as h,o as v,c as o,a as t,b as i,t as r,u as n,F as _,r as m,e as a,n as p,f as c}from"./index-Bld7Uski.js";const y={class:"min-h-screen overflow-x-hidden bg-card/70 text-foreground backdrop-blur"},k={class:"mx-auto flex min-h-screen w-full max-w-5xl min-w-0 items-center justify-center px-4 py-8"},w={class:"w-full rounded-3xl border border-border bg-card p-6"},C={class:"mb-6 flex flex-wrap items-center justify-between gap-3"},N={class:"text-xs text-muted-foreground"},B={key:0,class:"mb-4 rounded-2xl border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive"},S={class:"grid gap-8 md:grid-cols-2"},V={class:"monitor-card__header"},j={class:"monitor-card__name"},F={class:"monitor-card__stats"},L={class:"monitor-card__value"},M={class:"monitor-card__value"},U={class:"monitor-card__value"},$={class:"monitor-card__beats"},z={key:0,class:"monitor-beat__tooltip"},A={key:0,class:"rounded-2xl border border-border bg-card p-4 text-xs text-muted-foreground"},q=h({__name:"PublicUptime",setup(D){const{services:u,updatedAt:x,errorMessage:d,refreshStatus:b}=g();return v(()=>{b()}),(E,e)=>(a(),o("div",y,[t("div",k,[t("section",w,[t("div",C,[e[0]||(e[0]=t("div",null,[t("p",{class:"text-sm font-medium text-foreground"},"服务状态")],-1)),t("p",N,"最近更新:"+r(n(x)||"未获取"),1)]),n(d)?(a(),o("div",B,r(n(d)),1)):i("",!0),t("div",S,[(a(!0),o(_,null,m(n(u),s=>(a(),o("div",{key:s.key,class:"monitor-card"},[t("div",V,[t("span",j,r(s.name),1),t("span",{class:p(["monitor-card__badge",s.statusClass])},r(s.statusLabel),3)]),t("div",F,[t("span",null,[e[1]||(e[1]=c("可用率 ",-1)),t("span",L,r(s.uptime)+"%",1)]),t("span",null,[e[2]||(e[2]=c("请求 ",-1)),t("span",M,r(s.total),1)]),t("span",null,[e[3]||(e[3]=c("成功 ",-1)),t("span",U,r(s.success),1)])]),t("div",$,[(a(!0),o(_,null,m(s.beats,(l,f)=>(a(),o("div",{key:`${s.key}-${f}`,class:p(["monitor-beat",l.className])},[l.tooltip?(a(),o("span",z,r(l.tooltip),1)):i("",!0)],2))),128))])]))),128)),!n(u).length&&!n(d)?(a(),o("div",A," 暂无监控数据。 ")):i("",!0)])])])]))}});export{q as default};
|
static/assets/SelectMenu.vue_vue_type_script_setup_true_lang-Bb3w9pba.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as A,h as v,i as d,o as B,j as z,c as n,a as s,b,t as g,n as y,F as L,r as S,e as o}from"./index-B0A0-QFY.js";const j={class:"truncate"},E=["onClick"],M={key:0,class:"text-xs"},F=A({__name:"SelectMenu",props:{modelValue:{},options:{},multiple:{type:Boolean},placeholder:{},placement:{}},emits:["update:modelValue"],setup(h,{emit:x}){const t=h,m=x,a=v(!1),c=v(null),i=d(()=>t.options.map(e=>typeof e=="string"?{label:e,value:e}:e)),V=d(()=>{if(t.multiple){const l=Array.isArray(t.modelValue)?t.modelValue:[];return l.length?l.length===1?i.value.find(u=>u.value===l[0])?.label||l[0]:`已选 ${l.length} 项`:t.placeholder||"请选择"}return i.value.find(l=>l.value===t.modelValue)?.label||String(t.modelValue??"")}),k=d(()=>t.placement==="up"?"bottom-full mb-2":"mt-2"),_=()=>{a.value=!a.value},p=e=>t.multiple?Array.isArray(t.modelValue)&&t.modelValue.includes(e):t.modelValue===e,w=e=>{if(t.multiple){const l=Array.isArray(t.modelValue)?t.modelValue:[],u=l.includes(e)?l.filter(C=>C!==e):[...l,e];m("update:modelValue",u);return}m("update:modelValue",e),a.value=!1},f=e=>{c.value&&(c.value.contains(e.target)||(a.value=!1))};return B(()=>{document.addEventListener("click",f)}),z(()=>{document.removeEventListener("click",f)}),(e,l)=>(o(),n("div",{ref_key:"root",ref:c,class:"relative w-full sm:w-44"},[s("button",{type:"button",class:"flex w-full items-center justify-between gap-2 rounded-full border border-input bg-background px-4 py-2 text-sm text-foreground transition-colors hover:border-primary",onClick:_},[s("span",j,g(V.value),1),l[0]||(l[0]=s("svg",{"aria-hidden":"true",viewBox:"0 0 20 20",class:"h-4 w-4",fill:"currentColor"},[s("path",{d:"M5 7l5 6 5-6H5z"})],-1))]),a.value?(o(),n("div",{key:0,class:y(["absolute right-0 z-30 w-full space-y-1 rounded-2xl border border-border bg-card p-2 shadow-lg",k.value])},[(o(!0),n(L,null,S(i.value,r=>(o(),n("button",{key:r.value,type:"button",class:y(["flex w-full items-center justify-between rounded-xl px-3 py-2.5 text-left text-sm transition-colors hover:bg-accent",p(r.value)?"bg-accent text-accent-foreground":"text-muted-foreground"]),onClick:u=>w(r.value)},[s("span",null,g(r.label),1),p(r.value)?(o(),n("span",M,"OK")):b("",!0)],10,E))),128))],2)):b("",!0)],512))}});export{F as _};
|
static/assets/SelectMenu.vue_vue_type_script_setup_true_lang-DRqaa_R-.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as A,h as v,i as d,o as B,j as z,c as n,a as s,b,t as g,n as y,F as L,r as S,e as o}from"./index-Bld7Uski.js";const j={class:"truncate"},E=["onClick"],M={key:0,class:"text-xs"},F=A({__name:"SelectMenu",props:{modelValue:{},options:{},multiple:{type:Boolean},placeholder:{},placement:{}},emits:["update:modelValue"],setup(h,{emit:x}){const t=h,m=x,a=v(!1),c=v(null),i=d(()=>t.options.map(e=>typeof e=="string"?{label:e,value:e}:e)),V=d(()=>{if(t.multiple){const l=Array.isArray(t.modelValue)?t.modelValue:[];return l.length?l.length===1?i.value.find(u=>u.value===l[0])?.label||l[0]:`已选 ${l.length} 项`:t.placeholder||"请选择"}return i.value.find(l=>l.value===t.modelValue)?.label||String(t.modelValue??"")}),k=d(()=>t.placement==="up"?"bottom-full mb-2":"mt-2"),_=()=>{a.value=!a.value},p=e=>t.multiple?Array.isArray(t.modelValue)&&t.modelValue.includes(e):t.modelValue===e,w=e=>{if(t.multiple){const l=Array.isArray(t.modelValue)?t.modelValue:[],u=l.includes(e)?l.filter(C=>C!==e):[...l,e];m("update:modelValue",u);return}m("update:modelValue",e),a.value=!1},f=e=>{c.value&&(c.value.contains(e.target)||(a.value=!1))};return B(()=>{document.addEventListener("click",f)}),z(()=>{document.removeEventListener("click",f)}),(e,l)=>(o(),n("div",{ref_key:"root",ref:c,class:"relative w-full sm:w-44"},[s("button",{type:"button",class:"flex w-full items-center justify-between gap-2 rounded-full border border-input bg-background px-4 py-2 text-sm text-foreground transition-colors hover:border-primary",onClick:_},[s("span",j,g(V.value),1),l[0]||(l[0]=s("svg",{"aria-hidden":"true",viewBox:"0 0 20 20",class:"h-4 w-4",fill:"currentColor"},[s("path",{d:"M5 7l5 6 5-6H5z"})],-1))]),a.value?(o(),n("div",{key:0,class:y(["absolute right-0 z-30 w-full space-y-1 rounded-2xl border border-border bg-card p-2 shadow-lg",k.value])},[(o(!0),n(L,null,S(i.value,r=>(o(),n("button",{key:r.value,type:"button",class:y(["flex w-full items-center justify-between rounded-xl px-3 py-2.5 text-left text-sm transition-colors hover:bg-accent",p(r.value)?"bg-accent text-accent-foreground":"text-muted-foreground"]),onClick:u=>w(r.value)},[s("span",null,g(r.label),1),p(r.value)?(o(),n("span",M,"OK")):b("",!0)],10,E))),128))],2)):b("",!0)],512))}});export{F as _};
|
static/assets/Settings-BTOz14ly.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as V,D as w,h as m,i as U,s as S,o as N,c as a,u as O,a as t,b as x,t as G,m as s,v as r,x as b,A as P,f as B,e as d}from"./index-Bld7Uski.js";import{u as C}from"./settings-H-RYxUda.js";import{_ as g}from"./SelectMenu.vue_vue_type_script_setup_true_lang-DRqaa_R-.js";import{_ as M}from"./Checkbox.vue_vue_type_script_setup_true_lang-B0-MthIO.js";const A={class:"space-y-8"},D={key:0,class:"rounded-3xl border border-border bg-card p-6 text-sm text-muted-foreground"},L={key:1,class:"rounded-3xl border border-border bg-card p-6"},T={class:"flex items-center justify-between"},q=["disabled"],F={key:0,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},J={key:1,class:"mt-6 space-y-8"},R={class:"grid gap-4 lg:grid-cols-3"},$={class:"space-y-4"},j={class:"rounded-2xl border border-border bg-card p-4"},E={class:"mt-4 space-y-3"},I={class:"rounded-2xl border border-border bg-card p-4"},z={class:"mt-4 space-y-3"},H={class:"rounded-2xl border border-border bg-card p-4"},K={class:"mt-4 grid grid-cols-2 gap-3 text-sm"},Q={class:"space-y-4"},W={class:"rounded-2xl border border-border bg-card p-4"},X={class:"mt-4 space-y-3"},oe=V({__name:"Settings",setup(Y){const i=C(),{settings:v,isLoading:c}=w(i),o=m(null),p=m(!1),n=m(""),y=[{label:"Base64 编码",value:"base64"},{label:"URL 链接",value:"url"}],f=U(()=>{const u=[{label:"Gemini 3 Pro Preview",value:"gemini-3-pro-preview"},{label:"Gemini 3 Flash Preview",value:"gemini-3-flash-preview"},{label:"Gemini 2.5 Pro",value:"gemini-2.5-pro"},{label:"Gemini 2.5 Flash",value:"gemini-2.5-flash"},{label:"Gemini Auto",value:"gemini-auto"}],e=o.value?.image_generation.supported_models||[];for(const l of e)u.some(k=>k.value===l)||u.push({label:l,value:l});return u});S(v,u=>{if(!u)return;const e=JSON.parse(JSON.stringify(u));e.image_generation=e.image_generation||{enabled:!1,supported_models:[],output_format:"base64"},e.image_generation.output_format||="base64",o.value=e}),N(async()=>{await i.loadSettings()});const _=async()=>{if(o.value){n.value="",p.value=!0;try{await i.updateSettings(o.value)}catch(u){n.value=u.message||"保存失败"}finally{p.value=!1}}};return(u,e)=>(d(),a("div",A,[O(c)?(d(),a("section",D," 正在加载设置... ")):(d(),a("section",L,[t("div",T,[e[15]||(e[15]=t("p",{class:"text-base font-semibold text-foreground"},"配置面板",-1)),t("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",disabled:p.value||!o.value,onClick:_}," 保存设置 ",8,q)]),n.value?(d(),a("div",F,G(n.value),1)):x("",!0),o.value?(d(),a("div",J,[t("div",R,[t("div",$,[t("div",j,[e[19]||(e[19]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"基础",-1)),t("div",E,[e[16]||(e[16]=t("label",{class:"block text-xs text-muted-foreground"},"API 密钥",-1)),s(t("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>o.value.basic.api_key=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"可选"},null,512),[[r,o.value.basic.api_key]]),e[17]||(e[17]=t("label",{class:"block text-xs text-muted-foreground"},"基础地址",-1)),s(t("input",{"onUpdate:modelValue":e[1]||(e[1]=l=>o.value.basic.base_url=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"自动检测或手动填写"},null,512),[[r,o.value.basic.base_url]]),e[18]||(e[18]=t("label",{class:"block text-xs text-muted-foreground"},"代理地址",-1)),s(t("input",{"onUpdate:modelValue":e[2]||(e[2]=l=>o.value.basic.proxy=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"http://127.0.0.1:7890"},null,512),[[r,o.value.basic.proxy]])])]),t("div",I,[e[23]||(e[23]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"图像生成",-1)),t("div",z,[b(M,{modelValue:o.value.image_generation.enabled,"onUpdate:modelValue":e[3]||(e[3]=l=>o.value.image_generation.enabled=l)},{default:P(()=>[...e[20]||(e[20]=[B(" 启用图像生成 ",-1)])]),_:1},8,["modelValue"]),e[21]||(e[21]=t("label",{class:"block text-xs text-muted-foreground"},"输出格式",-1)),b(g,{modelValue:o.value.image_generation.output_format,"onUpdate:modelValue":e[4]||(e[4]=l=>o.value.image_generation.output_format=l),options:y,placement:"up"},null,8,["modelValue"]),e[22]||(e[22]=t("label",{class:"block text-xs text-muted-foreground"},"支持模型",-1)),b(g,{modelValue:o.value.image_generation.supported_models,"onUpdate:modelValue":e[5]||(e[5]=l=>o.value.image_generation.supported_models=l),options:f.value,placeholder:"选择模型",placement:"up",multiple:""},null,8,["modelValue","options"])])])]),t("div",H,[e[30]||(e[30]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"重试",-1)),t("div",K,[e[24]||(e[24]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"新会话尝试次数",-1)),s(t("input",{"onUpdate:modelValue":e[6]||(e[6]=l=>o.value.retry.max_new_session_tries=l),type:"number",min:"1",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.max_new_session_tries,void 0,{number:!0}]]),e[25]||(e[25]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"请求重试次数",-1)),s(t("input",{"onUpdate:modelValue":e[7]||(e[7]=l=>o.value.retry.max_request_retries=l),type:"number",min:"0",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.max_request_retries,void 0,{number:!0}]]),e[26]||(e[26]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"账号切换次数",-1)),s(t("input",{"onUpdate:modelValue":e[8]||(e[8]=l=>o.value.retry.max_account_switch_tries=l),type:"number",min:"1",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.max_account_switch_tries,void 0,{number:!0}]]),e[27]||(e[27]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"失败阈值",-1)),s(t("input",{"onUpdate:modelValue":e[9]||(e[9]=l=>o.value.retry.account_failure_threshold=l),type:"number",min:"1",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.account_failure_threshold,void 0,{number:!0}]]),e[28]||(e[28]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"限流冷却秒数",-1)),s(t("input",{"onUpdate:modelValue":e[10]||(e[10]=l=>o.value.retry.rate_limit_cooldown_seconds=l),type:"number",min:"0",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.rate_limit_cooldown_seconds,void 0,{number:!0}]]),e[29]||(e[29]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"会话缓存秒数",-1)),s(t("input",{"onUpdate:modelValue":e[11]||(e[11]=l=>o.value.retry.session_cache_ttl_seconds=l),type:"number",min:"0",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.session_cache_ttl_seconds,void 0,{number:!0}]])])]),t("div",Q,[t("div",W,[e[34]||(e[34]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"公开展示",-1)),t("div",X,[e[31]||(e[31]=t("label",{class:"block text-xs text-muted-foreground"},"Logo 地址",-1)),s(t("input",{"onUpdate:modelValue":e[12]||(e[12]=l=>o.value.public_display.logo_url=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"logo 地址"},null,512),[[r,o.value.public_display.logo_url]]),e[32]||(e[32]=t("label",{class:"block text-xs text-muted-foreground"},"聊天入口",-1)),s(t("input",{"onUpdate:modelValue":e[13]||(e[13]=l=>o.value.public_display.chat_url=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"聊天入口地址"},null,512),[[r,o.value.public_display.chat_url]]),e[33]||(e[33]=t("label",{class:"block text-xs text-muted-foreground"},"会话有效时长",-1)),s(t("input",{"onUpdate:modelValue":e[14]||(e[14]=l=>o.value.session.expire_hours=l),type:"number",min:"1",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[r,o.value.session.expire_hours,void 0,{number:!0}]])])]),e[35]||(e[35]=t("div",{class:"rounded-2xl border border-border bg-card p-4"},[t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"说明"),t("p",{class:"mt-4 text-sm text-muted-foreground"}," 保存后会直接写入配置文件并热更新。修改后请关注日志面板确认是否生效。 ")],-1))])])])):x("",!0)]))]))}});export{oe as default};
|
static/assets/Settings-oiGSFiLo.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{d as V,D as w,h as m,i as U,s as S,o as N,c as a,u as O,a as t,b as x,t as G,m as s,v as r,x as b,A as P,f as B,e as d}from"./index-B0A0-QFY.js";import{u as C}from"./settings-MHx3aXRd.js";import{_ as g}from"./SelectMenu.vue_vue_type_script_setup_true_lang-Bb3w9pba.js";import{_ as M}from"./Checkbox.vue_vue_type_script_setup_true_lang-B6QFZaQQ.js";const A={class:"space-y-8"},D={key:0,class:"rounded-3xl border border-border bg-card p-6 text-sm text-muted-foreground"},L={key:1,class:"rounded-3xl border border-border bg-card p-6"},T={class:"flex items-center justify-between"},q=["disabled"],F={key:0,class:"mt-4 rounded-2xl bg-destructive/10 px-4 py-3 text-sm text-destructive"},J={key:1,class:"mt-6 space-y-8"},R={class:"grid gap-4 lg:grid-cols-3"},$={class:"space-y-4"},j={class:"rounded-2xl border border-border bg-card p-4"},E={class:"mt-4 space-y-3"},I={class:"rounded-2xl border border-border bg-card p-4"},z={class:"mt-4 space-y-3"},H={class:"rounded-2xl border border-border bg-card p-4"},K={class:"mt-4 grid grid-cols-2 gap-3 text-sm"},Q={class:"space-y-4"},W={class:"rounded-2xl border border-border bg-card p-4"},X={class:"mt-4 space-y-3"},oe=V({__name:"Settings",setup(Y){const i=C(),{settings:v,isLoading:c}=w(i),o=m(null),p=m(!1),n=m(""),y=[{label:"Base64 编码",value:"base64"},{label:"URL 链接",value:"url"}],f=U(()=>{const u=[{label:"Gemini 3 Pro Preview",value:"gemini-3-pro-preview"},{label:"Gemini 3 Flash Preview",value:"gemini-3-flash-preview"},{label:"Gemini 2.5 Pro",value:"gemini-2.5-pro"},{label:"Gemini 2.5 Flash",value:"gemini-2.5-flash"},{label:"Gemini Auto",value:"gemini-auto"}],e=o.value?.image_generation.supported_models||[];for(const l of e)u.some(k=>k.value===l)||u.push({label:l,value:l});return u});S(v,u=>{if(!u)return;const e=JSON.parse(JSON.stringify(u));e.image_generation=e.image_generation||{enabled:!1,supported_models:[],output_format:"base64"},e.image_generation.output_format||="base64",o.value=e}),N(async()=>{await i.loadSettings()});const _=async()=>{if(o.value){n.value="",p.value=!0;try{await i.updateSettings(o.value)}catch(u){n.value=u.message||"保存失败"}finally{p.value=!1}}};return(u,e)=>(d(),a("div",A,[O(c)?(d(),a("section",D," 正在加载设置... ")):(d(),a("section",L,[t("div",T,[e[15]||(e[15]=t("p",{class:"text-base font-semibold text-foreground"},"配置面板",-1)),t("button",{class:"rounded-full bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90",disabled:p.value||!o.value,onClick:_}," 保存设置 ",8,q)]),n.value?(d(),a("div",F,G(n.value),1)):x("",!0),o.value?(d(),a("div",J,[t("div",R,[t("div",$,[t("div",j,[e[19]||(e[19]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"基础",-1)),t("div",E,[e[16]||(e[16]=t("label",{class:"block text-xs text-muted-foreground"},"API 密钥",-1)),s(t("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>o.value.basic.api_key=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"可选"},null,512),[[r,o.value.basic.api_key]]),e[17]||(e[17]=t("label",{class:"block text-xs text-muted-foreground"},"基础地址",-1)),s(t("input",{"onUpdate:modelValue":e[1]||(e[1]=l=>o.value.basic.base_url=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"自动检测或手动填写"},null,512),[[r,o.value.basic.base_url]]),e[18]||(e[18]=t("label",{class:"block text-xs text-muted-foreground"},"代理地址",-1)),s(t("input",{"onUpdate:modelValue":e[2]||(e[2]=l=>o.value.basic.proxy=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"http://127.0.0.1:7890"},null,512),[[r,o.value.basic.proxy]])])]),t("div",I,[e[23]||(e[23]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"图像生成",-1)),t("div",z,[b(M,{modelValue:o.value.image_generation.enabled,"onUpdate:modelValue":e[3]||(e[3]=l=>o.value.image_generation.enabled=l)},{default:P(()=>[...e[20]||(e[20]=[B(" 启用图像生成 ",-1)])]),_:1},8,["modelValue"]),e[21]||(e[21]=t("label",{class:"block text-xs text-muted-foreground"},"输出格式",-1)),b(g,{modelValue:o.value.image_generation.output_format,"onUpdate:modelValue":e[4]||(e[4]=l=>o.value.image_generation.output_format=l),options:y,placement:"up"},null,8,["modelValue"]),e[22]||(e[22]=t("label",{class:"block text-xs text-muted-foreground"},"支持模型",-1)),b(g,{modelValue:o.value.image_generation.supported_models,"onUpdate:modelValue":e[5]||(e[5]=l=>o.value.image_generation.supported_models=l),options:f.value,placeholder:"选择模型",placement:"up",multiple:""},null,8,["modelValue","options"])])])]),t("div",H,[e[30]||(e[30]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"重试",-1)),t("div",K,[e[24]||(e[24]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"新会话尝试次数",-1)),s(t("input",{"onUpdate:modelValue":e[6]||(e[6]=l=>o.value.retry.max_new_session_tries=l),type:"number",min:"1",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.max_new_session_tries,void 0,{number:!0}]]),e[25]||(e[25]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"请求重试次数",-1)),s(t("input",{"onUpdate:modelValue":e[7]||(e[7]=l=>o.value.retry.max_request_retries=l),type:"number",min:"0",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.max_request_retries,void 0,{number:!0}]]),e[26]||(e[26]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"账号切换次数",-1)),s(t("input",{"onUpdate:modelValue":e[8]||(e[8]=l=>o.value.retry.max_account_switch_tries=l),type:"number",min:"1",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.max_account_switch_tries,void 0,{number:!0}]]),e[27]||(e[27]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"失败阈值",-1)),s(t("input",{"onUpdate:modelValue":e[9]||(e[9]=l=>o.value.retry.account_failure_threshold=l),type:"number",min:"1",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.account_failure_threshold,void 0,{number:!0}]]),e[28]||(e[28]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"限流冷却秒数",-1)),s(t("input",{"onUpdate:modelValue":e[10]||(e[10]=l=>o.value.retry.rate_limit_cooldown_seconds=l),type:"number",min:"0",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.rate_limit_cooldown_seconds,void 0,{number:!0}]]),e[29]||(e[29]=t("label",{class:"col-span-2 text-xs text-muted-foreground"},"会话缓存秒数",-1)),s(t("input",{"onUpdate:modelValue":e[11]||(e[11]=l=>o.value.retry.session_cache_ttl_seconds=l),type:"number",min:"0",class:"col-span-2 rounded-2xl border border-input bg-background px-3 py-2"},null,512),[[r,o.value.retry.session_cache_ttl_seconds,void 0,{number:!0}]])])]),t("div",Q,[t("div",W,[e[34]||(e[34]=t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"公开展示",-1)),t("div",X,[e[31]||(e[31]=t("label",{class:"block text-xs text-muted-foreground"},"Logo 地址",-1)),s(t("input",{"onUpdate:modelValue":e[12]||(e[12]=l=>o.value.public_display.logo_url=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"logo 地址"},null,512),[[r,o.value.public_display.logo_url]]),e[32]||(e[32]=t("label",{class:"block text-xs text-muted-foreground"},"聊天入口",-1)),s(t("input",{"onUpdate:modelValue":e[13]||(e[13]=l=>o.value.public_display.chat_url=l),type:"text",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm",placeholder:"聊天入口地址"},null,512),[[r,o.value.public_display.chat_url]]),e[33]||(e[33]=t("label",{class:"block text-xs text-muted-foreground"},"会话有效时长",-1)),s(t("input",{"onUpdate:modelValue":e[14]||(e[14]=l=>o.value.session.expire_hours=l),type:"number",min:"1",class:"w-full rounded-2xl border border-input bg-background px-3 py-2 text-sm"},null,512),[[r,o.value.session.expire_hours,void 0,{number:!0}]])])]),e[35]||(e[35]=t("div",{class:"rounded-2xl border border-border bg-card p-4"},[t("p",{class:"text-xs uppercase tracking-[0.3em] text-muted-foreground"},"说明"),t("p",{class:"mt-4 text-sm text-muted-foreground"}," 保存后会直接写入配置文件并热更新。修改后请关注日志面板确认是否生效。 ")],-1))])])])):x("",!0)]))]))}});export{oe as default};
|
static/assets/index-B0A0-QFY.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
static/assets/index-Bld7Uski.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
static/assets/index-CWOdPlPE.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
@import"https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;600;700&family=Noto+Serif+SC:wght@600;700&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 97%;--foreground: 0 0% 10%;--card: 0 0% 100%;--card-foreground: 0 0% 10%;--primary: 0 0% 10%;--primary-foreground: 0 0% 100%;--secondary: 0 0% 92%;--secondary-foreground: 0 0% 10%;--muted: 0 0% 92%;--muted-foreground: 0 0% 40%;--accent: 0 0% 90%;--accent-foreground: 0 0% 10%;--destructive: 0 70% 45%;--destructive-foreground: 0 0% 100%;--border: 0 0% 86%;--input: 0 0% 86%;--ring: 0 0% 10%;--radius: 1rem}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:Noto Sans SC,Helvetica Neue,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0;padding:0;overflow-x:hidden;background-image:radial-gradient(900px circle at 10% -20%,rgba(0,0,0,.04),transparent 45%),radial-gradient(700px circle at 90% 0%,rgba(0,0,0,.05),transparent 40%),linear-gradient(180deg,hsl(var(--background)) 0% 100%)}body:before{content:"";position:fixed;inset:0;background-image:linear-gradient(120deg,#ffffff8c,#fff0);opacity:.5;pointer-events:none;z-index:-1}h1,h2,h3{font-family:"Noto Serif SC",Georgia,serif;letter-spacing:-.01em}#app{min-height:100vh}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.top-full{top:100%}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2 / span 2}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0{height:0px}.h-10{height:2.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-8{height:2rem}.h-80{height:20rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-full{height:100%}.max-h-\[60vh\]{max-height:60vh}.min-h-screen{min-height:100vh}.w-0{width:0px}.w-10{width:2.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-44{width:11rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.min-w-full{min-width:100%}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-full{--tw-translate-y: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform-gpu{transform:translate3d(var(--tw-translate-x),var(--tw-translate-y),0) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-visible{overflow-y:visible}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-\[2\.5rem\]{border-radius:2.5rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-x-4{border-left-width:4px;border-right-width:4px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-4{border-top-width:4px}.border-border{border-color:hsl(var(--border))}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-input{border-color:hsl(var(--input))}.border-primary-foreground\/40{border-color:hsl(var(--primary-foreground) / .4)}.border-x-transparent{border-left-color:transparent;border-right-color:transparent}.border-t-foreground{border-top-color:hsl(var(--foreground))}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-200{--tw-bg-opacity: 1;background-color:rgb(253 230 138 / var(--tw-bg-opacity, 1))}.bg-amber-300{--tw-bg-opacity: 1;background-color:rgb(252 211 77 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-card{background-color:hsl(var(--card))}.bg-card\/70{background-color:hsl(var(--card) / .7)}.bg-card\/90{background-color:hsl(var(--card) / .9)}.bg-cyan-100{--tw-bg-opacity: 1;background-color:rgb(207 250 254 / var(--tw-bg-opacity, 1))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-foreground{background-color:hsl(var(--foreground))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/70{background-color:hsl(var(--muted) / .7)}.bg-primary{background-color:hsl(var(--primary))}.bg-primary-foreground\/15{background-color:hsl(var(--primary-foreground) / .15)}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-secondary\/30{background-color:hsl(var(--secondary) / .3)}.bg-secondary\/40{background-color:hsl(var(--secondary) / .4)}.bg-secondary\/50{background-color:hsl(var(--secondary) / .5)}.bg-secondary\/60{background-color:hsl(var(--secondary) / .6)}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-300{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.bg-violet-100{--tw-bg-opacity: 1;background-color:rgb(237 233 254 / var(--tw-bg-opacity, 1))}.object-contain{-o-object-fit:contain;object-fit:contain}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-10{padding-bottom:2.5rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pr-1{padding-right:.25rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-relaxed{line-height:1.625}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.28em\]{letter-spacing:.28em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-\[0\.3em\]{letter-spacing:.3em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-900{--tw-text-opacity: 1;color:rgb(120 53 15 / var(--tw-text-opacity, 1))}.text-background{color:hsl(var(--background))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-cyan-700{--tw-text-opacity: 1;color:rgb(14 116 144 / var(--tw-text-opacity, 1))}.text-destructive{color:hsl(var(--destructive))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--foreground))}.text-green-200{--tw-text-opacity: 1;color:rgb(187 247 208 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-rose-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-transparent{color:transparent}.text-violet-700{--tw-text-opacity: 1;color:rgb(109 40 217 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/10{--tw-shadow-color: rgb(0 0 0 / .1);--tw-shadow: var(--tw-shadow-colored)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.will-change-\[transform\]{will-change:transform}html{scrollbar-gutter:stable}*{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:content-box}.scrollbar-slim::-webkit-scrollbar{width:6px;height:6px}.scrollbar-slim::-webkit-scrollbar-thumb{background-color:#0006}.cv-auto{content-visibility:auto;contain-intrinsic-size:0 44px}.monitor-badge--up{background:#d1fae5;color:#065f46}.monitor-badge--warn{background:#fef3c7;color:#b45309}.monitor-badge--down{background:#fee2e2;color:#991b1b}.monitor-badge--unknown{background:#f3f4f6;color:#6b7280}.monitor-card{border-radius:16px;padding:0;background:hsl(var(--card));box-shadow:none}.monitor-card__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.monitor-card__name{font-size:14px;font-weight:600;color:hsl(var(--foreground))}.monitor-card__badge{padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600}.monitor-card__stats{display:flex;flex-wrap:wrap;gap:16px;font-size:12px;color:hsl(var(--muted-foreground));margin-bottom:12px}.monitor-card__value{margin-left:4px;color:hsl(var(--foreground));font-weight:600}.monitor-card__beats{display:flex;gap:2px;height:24px;align-items:flex-end}.monitor-beat{flex:1;min-width:4px;max-width:8px;border-radius:2px;transition:all .2s;position:relative}.monitor-beat:hover{opacity:.8;transform:scaleY(1.1)}.monitor-beat--up{background:#34c759;height:100%}.monitor-beat--warn,.monitor-beat--slow{background:#f5c15b;height:100%}.monitor-beat--down{background:#ff3b30;height:100%}.monitor-beat--empty{background:#e5e5ea;height:40%}.monitor-beat__tooltip{position:absolute;bottom:100%;left:50%;transform:translate(-50%);background:#1d1d1f;color:#fff;padding:6px 10px;border-radius:6px;font-size:11px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s;margin-bottom:6px;z-index:10}.monitor-beat__tooltip:after{content:"";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#1d1d1f}.monitor-beat:hover .monitor-beat__tooltip{opacity:1}.help-dot{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:999px;border:1px solid hsl(var(--border));font-size:10px;line-height:1;color:hsl(var(--muted-foreground));cursor:default}@media(max-width:768px){.monitor-beat{min-width:3px;max-width:6px}}@media(min-width:1024px){.dashboard-split{flex-direction:row;flex-wrap:nowrap}.dashboard-split .dashboard-main{flex:0 0 66.6667%;max-width:66.6667%}.dashboard-split .dashboard-side{flex:0 0 33.3333%;max-width:33.3333%}}@keyframes logo-float{0%{transform:translateY(0)}25%{transform:translateY(6px)}50%{transform:translateY(0)}75%{transform:translateY(-6px)}to{transform:translateY(0)}}@keyframes logo-blink{0%,45%,55%,to{transform:scaleY(1);opacity:1}50%{transform:scaleY(.1);opacity:.6}}.logo-mark .logo-cat-wrapper{animation:logo-float 4s ease-in-out infinite;transform-origin:center}.logo-mark{transform:translateY(2px)}.logo-mark .logo-eye{fill:#00bcd4;filter:drop-shadow(0 0 2px #00bcd4);animation:logo-blink 5s infinite;transform-box:fill-box;transform-origin:center}.hover\:border-destructive:hover{border-color:hsl(var(--destructive))}.hover\:border-destructive\/40:hover{border-color:hsl(var(--destructive) / .4)}.hover\:border-destructive\/60:hover{border-color:hsl(var(--destructive) / .6)}.hover\:border-foreground:hover{border-color:hsl(var(--foreground))}.hover\:border-primary:hover{border-color:hsl(var(--primary))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-secondary\/60:hover{background-color:hsl(var(--secondary) / .6)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-emerald-500:hover{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-primary:hover{color:hsl(var(--primary))}.hover\:opacity-90:hover{opacity:.9}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-accent-foreground{color:hsl(var(--accent-foreground))}.group:hover .group-hover\:opacity-100{opacity:1}.peer:checked~.peer-checked\:border-foreground{border-color:hsl(var(--foreground))}.peer:checked~.peer-checked\:bg-foreground{background-color:hsl(var(--foreground))}.peer:checked~.peer-checked\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.peer:disabled~.peer-disabled\:opacity-50{opacity:.5}@media(min-width:640px){.sm\:ml-0{margin-left:0}.sm\:flex{display:flex}.sm\:w-44{width:11rem}.sm\:w-48{width:12rem}.sm\:w-auto{width:auto}.sm\:min-w-0{min-width:0px}.sm\:flex-nowrap{flex-wrap:nowrap}.sm\:items-center{align-items:center}}@media(min-width:768px){.md\:w-auto{width:auto}.md\:flex-1{flex:1 1 0%}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:static{position:static}.lg\:sticky{position:sticky}.lg\:top-0{top:0}.lg\:ml-0{margin-left:0}.lg\:hidden{display:none}.lg\:h-20{height:5rem}.lg\:h-64{height:16rem}.lg\:h-72{height:18rem}.lg\:h-screen{height:100vh}.lg\:w-20{width:5rem}.lg\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}.lg\:border-b-0{border-bottom-width:0px}.lg\:border-r{border-right-width:1px}.lg\:bg-card\/80{background-color:hsl(var(--card) / .8)}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:py-4{padding-top:1rem;padding-bottom:1rem}.lg\:pt-10{padding-top:2.5rem}.lg\:pt-5{padding-top:1.25rem}.lg\:pt-6{padding-top:1.5rem}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}.lg\:backdrop-blur-none{--tw-backdrop-blur: ;-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}}@media(min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}
|
static/assets/settings-H-RYxUda.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{g as a,C as g,h as n}from"./index-Bld7Uski.js";const i={get:()=>a.get("/admin/settings"),update:t=>a.put("/admin/settings",t)},r=g("settings",()=>{const t=n(null),e=n(!1);async function u(){e.value=!0;try{t.value=await i.get()}finally{e.value=!1}}async function o(s){await i.update(s),t.value=s}return{settings:t,isLoading:e,loadSettings:u,updateSettings:o}});export{r as u};
|
static/assets/settings-MHx3aXRd.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{g as a,C as g,h as n}from"./index-B0A0-QFY.js";const i={get:()=>a.get("/admin/settings"),update:t=>a.put("/admin/settings",t)},r=g("settings",()=>{const t=n(null),e=n(!1);async function u(){e.value=!0;try{t.value=await i.get()}finally{e.value=!1}}async function o(s){await i.update(s),t.value=s}return{settings:t,isLoading:e,loadSettings:u,updateSettings:o}});export{r as u};
|
static/assets/useConfirmDialog-BS9rDomX.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{h as l}from"./index-B0A0-QFY.js";function v(){const a=l(!1),c=l("确认操作"),s=l(""),t=l("确定"),r=l("取消");let e=null;return{open:a,title:c,message:s,confirmText:t,cancelText:r,ask:n=>new Promise(u=>{c.value=n.title||"确认操作",s.value=n.message,t.value=n.confirmText||"确定",r.value=n.cancelText||"取消",a.value=!0,e=u}),confirm:()=>{a.value=!1,e?.(!0),e=null},cancel:()=>{a.value=!1,e?.(!1),e=null}}}export{v as u};
|
static/assets/useConfirmDialog-XZs7petQ.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{h as l}from"./index-Bld7Uski.js";function v(){const a=l(!1),c=l("确认操作"),s=l(""),t=l("确定"),r=l("取消");let e=null;return{open:a,title:c,message:s,confirmText:t,cancelText:r,ask:n=>new Promise(u=>{c.value=n.title||"确认操作",s.value=n.message,t.value=n.confirmText||"确定",r.value=n.cancelText||"取消",a.value=!0,e=u}),confirm:()=>{a.value=!1,e?.(!0),e=null},cancel:()=>{a.value=!1,e?.(!1),e=null}}}export{v as u};
|
static/assets/useUptimeStatus-BbQ1ylnm.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{g as d,h as r,i as c}from"./index-Bld7Uski.js";const f={uptime(t=90){return d.get("/public/uptime",{params:{days:t}})}},b=4e4,w=60,g=t=>t==="up"?"正常":t==="warn"?"注意":t==="down"?"异常":"未知",h=t=>t==="up"?"monitor-badge--up":t==="warn"?"monitor-badge--warn":t==="down"?"monitor-badge--down":"monitor-badge--unknown",v=(t=[])=>{const a=[];for(let s=0;s<w;s+=1)if(s<t.length){const e=t[s],u=e.latency_ms??null,l=e.success&&u!==null&&u>b,o=e.level??(l?"warn":e.success?"up":"down"),n=o==="warn"?"monitor-beat--warn":o==="up"?"monitor-beat--up":"monitor-beat--down",i=u!==null?` · 首响 ${(Math.max(u,0)/1e3).toFixed(1)}s`:"",m=e.status_code?` · HTTP ${e.status_code}`:"",p=o==="warn"?"警告":e.success?"成功":"失败";a.push({className:n,tooltip:`${e.time} · ${p}${m}${i}`})}else a.push({className:"monitor-beat--empty",tooltip:null});return a};function y(){const t=r(null),a=r(""),s=r(!1),e=c(()=>t.value?.updated_at??"");return{services:c(()=>t.value?Object.entries(t.value.services).map(([o,n])=>({key:o,name:n.name,statusLabel:g(n.status),statusClass:h(n.status),uptime:n.uptime,total:n.total,success:n.success,beats:v(n.heartbeats)})):[]),updatedAt:e,errorMessage:a,isLoading:s,refreshStatus:async()=>{if(!s.value){s.value=!0,a.value="";try{t.value=await f.uptime()}catch(o){a.value=o.message||"监控数据获取失败"}finally{s.value=!1}}}}}export{y as u};
|
static/assets/useUptimeStatus-D_PU76s5.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
import{g as d,h as r,i as c}from"./index-B0A0-QFY.js";const f={uptime(t=90){return d.get("/public/uptime",{params:{days:t}})}},b=4e4,w=60,g=t=>t==="up"?"正常":t==="warn"?"注意":t==="down"?"异常":"未知",h=t=>t==="up"?"monitor-badge--up":t==="warn"?"monitor-badge--warn":t==="down"?"monitor-badge--down":"monitor-badge--unknown",v=(t=[])=>{const a=[];for(let s=0;s<w;s+=1)if(s<t.length){const e=t[s],u=e.latency_ms??null,l=e.success&&u!==null&&u>b,o=e.level??(l?"warn":e.success?"up":"down"),n=o==="warn"?"monitor-beat--warn":o==="up"?"monitor-beat--up":"monitor-beat--down",i=u!==null?` · 首响 ${(Math.max(u,0)/1e3).toFixed(1)}s`:"",m=e.status_code?` · HTTP ${e.status_code}`:"",p=o==="warn"?"警告":e.success?"成功":"失败";a.push({className:n,tooltip:`${e.time} · ${p}${m}${i}`})}else a.push({className:"monitor-beat--empty",tooltip:null});return a};function y(){const t=r(null),a=r(""),s=r(!1),e=c(()=>t.value?.updated_at??"");return{services:c(()=>t.value?Object.entries(t.value.services).map(([o,n])=>({key:o,name:n.name,statusLabel:g(n.status),statusClass:h(n.status),uptime:n.uptime,total:n.total,success:n.success,beats:v(n.heartbeats)})):[]),updatedAt:e,errorMessage:a,isLoading:s,refreshStatus:async()=>{if(!s.value){s.value=!0,a.value="";try{t.value=await f.uptime()}catch(o){a.value=o.message||"监控数据获取失败"}finally{s.value=!1}}}}}export{y as u};
|