Files
Nexus/web/app/assets/DashboardPage-C4XvFsLM.js
T
Your Name 51948469c2 build(frontend): track Vite output in Git for Gitea deploy
- Stop ignoring web/app/index.html and web/app/assets/
- Bundle index-DBKIQT7H.js from current vite build (~101MB assets)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 00:52:44 +08:00

1 line
9.0 KiB
JavaScript

import{Ar as e,Er as t,I as n,It as r,Jn as i,Kn as a,L as o,M as s,N as ee,O as c,Or as l,Qn as u,Rt as d,Un as f,Y as te,Yn as p,Zn as m,br as h,dr as g,er as ne,gr as _,jt as re,lr as v,mr as ie,q as y,qn as b,sr as ae,t as oe,vr as x}from"./index-BCQTIDw4.js";import{a as se}from"./VSelectionControl-68hkvpet.js";import{n as S,t as C}from"./VRow-C8w9Wz5w.js";import{t as w}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as ce}from"./useSnackbar-D7YOfKok.js";import{t as T}from"./VChip-B452RkaL.js";import{t as le}from"./VDataTableServer-B_4ecUrQ.js";import{i as ue,t as de}from"./auditNormalize-BHJPJFP9.js";import{i as E,n as D,r as O,t as k}from"./status-doZE__rb.js";var A={class:`text-caption text-medium-emphasis mb-1`,style:{"font-size":`14px`,"letter-spacing":`0.5px`,"text-transform":`uppercase`}},j={class:`font-weight-medium`},M={class:`text-medium-emphasis`},N={class:`text-medium-emphasis`},P={class:`text-medium-emphasis`},F={class:`text-caption text-medium-emphasis`},I={class:`d-flex ga-1`},L={key:0,class:`text-center text-medium-emphasis py-4`},R={class:`text-body-large font-weight-regular`},z={class:`d-flex justify-space-between align-center text-medium-emphasis`},B={class:`py-1`},V={key:0,class:`text-center text-medium-emphasis py-4`},H={class:`text-caption`},fe={class:`d-flex justify-space-between align-center`},pe={class:`text-medium-emphasis`},me={class:`text-body-2 font-weight-medium`},he={key:0,class:`text-center text-medium-emphasis py-4`},U=w(ne({__name:`DashboardPage`,setup(ne){let w=ce(),U=d(),W=h([{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:ge,loading:_e,page:ve,itemsPerPage:ye,total:be,search:G,loadServers:xe,onSearch:Se,onPageChange:Ce,onItemsPerPageChange:we}=E();async function Te(){try{await xe()}catch{w(`加载服务器列表失败`,`error`)}}let Ee=[{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`}],K=h([]),q=h([{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%`}]),J=h({}),Y=h(0),X=h([]);async function Z(){try{let e=await r.get(`/servers/stats`);W.value[0].title=String(e.total),W.value[1].title=String(e.online),W.value[2].title=String(e.offline),W.value[3].title=String(e.alerts??0),J.value=e.categories||{},Y.value=e.total;let t=e.total?Math.round(e.online/e.total*100):0;q.value[0].progress=t,q.value[0].value=`${t}%`}catch{w(`加载统计数据失败`,`error`)}}async function Q(){try{K.value=((await r.get(`/alert-history/`,{limit:5})).items||[]).map(e=>({title:e.server_name,subtitle:`${e.alert_type} ${e.is_recovery?`(已恢复)`:``} · ${k(e.created_at)}`,value:e.value,color:e.is_recovery?`green`:`red`,icon:e.is_recovery?`mdi-check-circle`:`mdi-alert-circle`}))}catch{K.value=[]}}async function De(){try{X.value=de((await r.get(`/audit/`,{limit:10})).items||[]).slice(0,10)}catch{X.value=[]}}async function Oe(){try{let e=await r.get(`/servers/`,{per_page:200}),t=e.items||[],n=e.total||t.length;if(n===0)return;let i=t.filter(e=>e.agent_version).length,a=Math.round(i/n*100);q.value[1].progress=a,q.value[1].value=`${a}%`;let o=t.filter(e=>e.system_info?.cpu_usage!=null),s=t.filter(e=>e.system_info?.mem_usage!=null);if(o.length>0){let e=Math.round(o.reduce((e,t)=>e+(t.system_info.cpu_usage||0),0)/o.length);q.value[2].progress=e,q.value[2].value=`${e}%`}if(s.length>0){let e=Math.round(s.reduce((e,t)=>e+(t.system_info.mem_usage||0),0)/s.length);q.value[3].progress=e,q.value[3].value=`${e}%`}}catch{}}function ke(e){U.push({path:`/terminal`,query:{server_id:String(e.id)}})}function $(e){U.push({path:`/files`,query:{server_id:String(e.id)}})}return ie(re().alerts,()=>{Z(),Q()}),ae(()=>{Z(),Te(),Q(),Oe(),De()}),(r,d)=>(v(),b(se,{fluid:``,class:`pa-4 pa-md-6 dashboard-root`},{default:_(()=>[u(C,null,{default:_(()=>[(v(!0),p(f,null,g(W.value,(t,r)=>(v(),b(S,{key:r,cols:`6`,sm:`3`},{default:_(()=>[u(s,{elevation:`0`,rounded:`xl`,border:``,class:`stat-card`},{default:_(()=>[u(ee,{class:`pa-4 d-flex align-center justify-space-between`},{default:_(()=>[a(`div`,null,[a(`div`,A,e(t.subtitle),1),a(`div`,{class:l([`font-weight-bold`,`text-`+t.color]),style:{"font-size":`36px`,"line-height":`1.1`}},e(t.title),3)]),u(n,{color:t.color,size:`48`,rounded:`lg`,class:`stat-icon`},{default:_(()=>[u(te,{icon:t.icon,size:`24`,color:`white`},null,8,[`icon`])]),_:2},1032,[`color`])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1}),u(s,{class:`my-5`,elevation:`0`,rounded:`lg`,title:`服务器列表`,border:``},{text:_(()=>[u(oe,{modelValue:t(G),"onUpdate:modelValue":d[0]||=e=>x(G)?G.value=e:null,autocomplete:`off`,placeholder:`搜索...`,"prepend-inner-icon":`mdi-magnify`,variant:`outlined`,"hide-details":``,rounded:``,class:`mb-4`},null,8,[`modelValue`]),u(le,{items:t(ge),headers:Ee,"items-length":t(be),loading:t(_e),page:t(ve),"items-per-page":t(ye),hover:``,"item-value":`id`,"onUpdate:page":t(Ce),"onUpdate:itemsPerPage":t(we)},{"item.status":_(({item:e})=>[u(T,{color:t(D)(e.status),text:t(O)(e.status),border:`sm`,size:`x-small`,label:``},null,8,[`color`,`text`])]),"item.name":_(({item:t})=>[a(`span`,j,e(t.name),1)]),"item.domain":_(({item:t})=>[a(`span`,M,e(t.domain),1)]),"item.category":_(({item:t})=>[a(`span`,N,e(t.category||`—`),1)]),"item.agent_version":_(({item:t})=>[a(`span`,P,e(t.agent_version||`—`),1)]),"item.last_heartbeat":_(({item:n})=>[a(`span`,F,e(t(k)(n.last_heartbeat)),1)]),"item.actions":_(({item:e})=>[a(`div`,I,[u(o,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:t=>ke(e)},{default:_(()=>[...d[1]||=[m(`终端`,-1)]]),_:1},8,[`onClick`]),u(o,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>$(e)},{default:_(()=>[...d[2]||=[m(`文件`,-1)]]),_:1},8,[`onClick`])])]),"no-data":_(()=>[...d[3]||=[a(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无服务器数据`,-1)]]),_:1},8,[`items`,`items-length`,`loading`,`page`,`items-per-page`,`onUpdate:page`,`onUpdate:itemsPerPage`])]),_:1}),u(C,null,{default:_(()=>[u(S,{cols:`12`,md:`6`},{default:_(()=>[u(s,{elevation:`0`,rounded:`lg`,title:`告警历史`,border:``},{append:_(()=>[...d[4]||=[a(`div`,{class:`my-5`},null,-1)]]),text:_(()=>[K.value.length===0?(v(),p(`div`,L,` 暂无告警 `)):i(``,!0),(v(!0),p(f,null,g(K.value,(t,r)=>(v(),b(c,{key:r,class:l([r!==0&&`mt-4`,`px-0`]),subtitle:t.subtitle,title:t.title,lines:`one`},{prepend:_(()=>[u(n,{color:t.color,icon:t.icon,variant:`tonal`,rounded:``},null,8,[`color`,`icon`])]),append:_(()=>[a(`span`,R,e(t.value),1)]),_:2},1032,[`class`,`subtitle`,`title`]))),128))]),_:1})]),_:1}),u(S,{cols:`12`,md:`6`},{default:_(()=>[u(s,{elevation:`0`,rounded:`lg`,title:`资源概览`,border:``},{append:_(()=>[...d[5]||=[a(`div`,{class:`my-5`},null,-1)]]),text:_(()=>[(v(!0),p(f,null,g(q.value,(t,r)=>(v(),b(c,{key:r,class:l([r!==0&&`mt-4`,`px-0`])},{prepend:_(()=>[u(n,{text:t.text,color:`primary`,size:`large`,variant:`tonal`},null,8,[`text`])]),title:_(()=>[a(`div`,z,[a(`span`,null,e(t.title),1),a(`span`,null,e(t.value),1)])]),subtitle:_(()=>[a(`div`,B,[u(y,{"model-value":t.progress,"bg-color":`surface-light`,"bg-opacity":`1`,color:`primary`,height:`8`,rounded:``},null,8,[`model-value`])])]),_:2},1032,[`class`]))),128))]),_:1})]),_:1})]),_:1}),u(C,null,{default:_(()=>[u(S,{cols:`12`,md:`6`},{default:_(()=>[u(s,{elevation:`0`,rounded:`lg`,title:`分类分布`,border:``},{text:_(()=>[Object.keys(J.value).length===0?(v(),p(`div`,V,` 暂无分类数据 `)):i(``,!0),(v(!0),p(f,null,g(J.value,(t,r)=>(v(),b(c,{key:r,class:`px-0`},{prepend:_(()=>[u(n,{color:`primary`,variant:`tonal`,size:`small`},{default:_(()=>[a(`span`,H,e(r[0]?.toUpperCase()),1)]),_:2},1024)]),title:_(()=>[a(`div`,fe,[a(`span`,pe,e(r===`uncategorized`?`未分类`:r),1),a(`span`,me,e(t)+` 台`,1)])]),subtitle:_(()=>[u(y,{"model-value":Y.value>0?t/Y.value*100:0,"bg-color":`surface-light`,"bg-opacity":`1`,color:`primary`,height:`6`,rounded:``},null,8,[`model-value`])]),_:2},1024))),128))]),_:1})]),_:1}),u(S,{cols:`12`,md:`6`},{default:_(()=>[u(s,{elevation:`0`,rounded:`lg`,title:`最近操作`,border:``},{append:_(()=>[u(o,{size:`small`,variant:`text`,to:`/audit`},{default:_(()=>[...d[6]||=[m(`查看全部`,-1)]]),_:1})]),text:_(()=>[X.value.length===0?(v(),p(`div`,he,` 暂无操作记录 `)):i(``,!0),(v(!0),p(f,null,g(X.value,n=>(v(),b(c,{key:n.id,title:t(ue)(n),subtitle:`${n.admin_username} · ${t(k)(n.created_at)}`,class:`px-0`,lines:`two`},{append:_(()=>[u(T,{size:`x-small`,variant:`tonal`,label:``},{default:_(()=>[m(e(n.ip_address||`—`),1)]),_:2},1024)]),_:2},1032,[`title`,`subtitle`]))),128))]),_:1})]),_:1})]),_:1})]),_:1}))}}),[[`__scopeId`,`data-v-8c80bc6e`]]);export{U as default};