Files
Nexus/web/app/assets/DashboardPage-DiJXMZug.js
T

1 line
8.4 KiB
JavaScript
Raw Normal View History

import{Er as e,Lr as t,N as n,Nt as r,R as i,Sr as a,Ut as o,Vr as s,Y as c,Zn as l,ar as u,er as d,gr as f,jr as p,k as m,mr as ee,nr as h,or as g,rr as _,sr as v,t as te,tr as y,vr as b,wr as x,z as S,zr as C,zt as w}from"./index-BihgjXCy.js";import{o as ne,t as re}from"./VContainer-V_R05OUP.js";import{t as T}from"./VChip-FKNgTWw3.js";import{t as ie}from"./VDataTableServer-Pl72x6lf.js";import{n as E,t as D}from"./VRow-D6NnUZV_.js";import{i as ae,t as oe}from"./auditNormalize-bmSA0RyN.js";import{a as se,i as ce,n as O,r as le,t as ue}from"./StatCardsRow-DqxmtXuB.js";import{t as k}from"./_plugin-vue_export-helper-BDNMzG2s.js";var A={class:`font-weight-medium`},j={class:`text-medium-emphasis`},M={class:`text-medium-emphasis`},N={class:`text-medium-emphasis`},P={class:`text-caption text-medium-emphasis`},F={class:`d-flex ga-1`},I={key:0,class:`text-center text-medium-emphasis py-4`},L={class:`text-body-large font-weight-regular`},R={class:`d-flex justify-space-between align-center text-medium-emphasis`},z={class:`py-1`},B={key:0,class:`text-center text-medium-emphasis py-4`},V={class:`text-caption`},H={class:`d-flex justify-space-between align-center`},U={class:`text-medium-emphasis`},de={class:`text-body-2 font-weight-medium`},fe={key:0,class:`text-center text-medium-emphasis py-4`},W=k(v({__name:`DashboardPage`,setup(v){let k=ne(),W=o(),G=p([{subtitle:`服务器总数`,title:`0`,icon:`mdi-server-network`,color:`blue`},{subtitle:`在线`,title:`0`,icon:`mdi-check-circle-outline`,color:`green`},{subtitle:`离线`,title:`0`,icon:`mdi-alert-circle-outline`,color:`orange`},{subtitle:`告警中`,title:`0`,icon:`mdi-bell-alert-outline`,color:`red`}]),{servers:pe,loading:me,page:he,itemsPerPage:ge,total:_e,search:K,loadServers:ve,onSearch:ye,onPageChange:be,onItemsPerPageChange:xe}=se();async function Se(){try{await ve()}catch{k(`加载服务器列表失败`,`error`)}}let Ce=[{title:`状态`,key:`status`,width:100},{title:`名称`,key:`name`},{title:`地址`,key:`domain`},{title:`分类`,key:`category`,width:100},{title:`Agent`,key:`agent_version`,width:100},{title:`心跳`,key:`last_heartbeat`,width:140},{title:`操作`,key:`actions`,width:140,align:`end`}],q=p([]),J=p([{title:`在线率`,progress:0,text:`在`,value:`0%`},{title:`Agent 覆盖`,progress:0,text:`A`,value:`0%`},{title:`CPU 平均`,progress:0,text:`C`,value:`0%`},{title:`内存平均`,progress:0,text:`M`,value:`0%`}]),Y=p({}),X=p(0),Z=p([]);async function Q(){try{let e=await w.get(`/servers/stats`);G.value[0].title=String(e.total),G.value[1].title=String(e.online),G.value[2].title=String(e.offline),G.value[3].title=String(e.alerts??0),Y.value=e.categories||{},X.value=e.total;let t=e.total?Math.round(e.online/e.total*100):0;J.value[0].progress=t,J.value[0].value=`${t}%`}catch{k(`加载统计数据失败`,`error`)}}async function $(){try{q.value=((await w.get(`/alert-history/`,{limit:5})).items||[]).map(e=>({title:e.server_name,subtitle:`${e.alert_type} ${e.is_recovery?`(已恢复)`:``} · ${O(e.created_at)}`,value:e.value,color:e.is_recovery?`green`:`red`,icon:e.is_recovery?`mdi-check-circle`:`mdi-alert-circle`}))}catch{q.value=[],k(`加载告警记录失败`,`error`)}}async function we(){try{Z.value=oe((await w.get(`/audit/`,{limit:10})).items||[]).slice(0,10)}catch{Z.value=[],k(`加载审计记录失败`,`error`)}}async function Te(){try{let e=await w.get(`/servers/`,{per_page:200}),t=e.items||[],n=e.total||t.length;if(n===0)return;let r=t.filter(e=>e.agent_version).length,i=Math.round(r/n*100);J.value[1].progress=i,J.value[1].value=`${i}%`;let a=t.filter(e=>e.system_info?.cpu_usage!=null),o=t.filter(e=>e.system_info?.mem_usage!=null);if(a.length>0){let e=Math.round(a.reduce((e,t)=>e+(t.system_info.cpu_usage||0),0)/a.length);J.value[2].progress=e,J.value[2].value=`${e}%`}if(o.length>0){let e=Math.round(o.reduce((e,t)=>e+(t.system_info.mem_usage||0),0)/o.length);J.value[3].progress=e,J.value[3].value=`${e}%`}}catch{}}function Ee(e){W.push({path:`/terminal`,query:{server_id:String(e.id)}})}function De(e){W.push({path:`/files`,query:{server_id:String(e.id)}})}return