Files
Nexus/web/app/assets/DashboardPage-CgjVYGkw.js
T
Nexus Agent 27da842a20 fix: Telegram 开关多 worker 同步与服务器行内详情展开
关闭 notify_* 后通过 Redis 广播同步各 worker 内存设置;修复 expanded id 类型不匹配导致点击名称无法展开详情。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 13:05:22 +08:00

1 line
9.0 KiB
JavaScript

import{_ as e,v as t}from"./VSelect-Cx2P_6TS.js";import{n,t as r}from"./VRow-CvD6deCf.js";import{$r as i,Br as a,Hr as o,Jt as s,Nr as c,P as l,Qt as ee,Rr as te,S as u,W as d,_r as f,cr as p,fr as m,hr as h,jr as g,kt as ne,m as _,mr as v,pr as y,qr as b,ri as x,ti as S,vr as C,vt as re,y as w,yr as ie,yt as ae}from"./index-DBlT8p9k.js";import{t as oe}from"./usePageActivateRefresh-CMCuCG89.js";import{t as se}from"./dataTable-esDY4cOk.js";import{_ as T,t as ce}from"./VTextField-BK-1eNm9.js";import{t as le}from"./VDataTableServer-CuUcLbob.js";import{i as ue,t as de}from"./auditNormalize-DWYIxo0q.js";import{a as fe,i as pe,n as me,o as he,r as E,t as D}from"./VSkeletonLoader-DmSxw3UQ.js";import{t as O}from"./_plugin-vue_export-helper-BDNMzG2s.js";var ge={class:`font-weight-medium`},k={class:`text-medium-emphasis`},A={class:`text-medium-emphasis`},j={class:`text-medium-emphasis`},M={class:`text-caption text-medium-emphasis`},N={class:`d-flex ga-1`},P={key:0,class:`text-center text-medium-emphasis py-4`},F={class:`text-body-large font-weight-regular`},I={class:`d-flex justify-space-between align-center text-medium-emphasis`},L={class:`py-1`},_e={key:0,class:`text-center text-medium-emphasis py-4`},ve={class:`text-caption`},ye={class:`d-flex justify-space-between align-center`},be={class:`text-medium-emphasis`},R={class:`text-body-2 font-weight-medium`},xe={key:0,class:`text-center text-medium-emphasis py-4`},z=O(ie({name:`DashboardPage`,__name:`DashboardPage`,setup(ie){let O=[...se],z=e(),B=ee(),V=b(!0),H=b([{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:U,loading:W,page:Se,itemsPerPage:Ce,total:we,search:G,sortBy:K,loadServers:Te,onSearch:Ee,onPageChange:De,onItemsPerPageChange:Oe}=he();async function ke(e=!1){try{await Te({silent:e})}catch{e||z(`加载服务器列表失败`,`error`)}}let Ae=[{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`,sortable:!1}],q=b([]),J=b([{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=b({}),X=b(0),Z=b([]);async function Q(e=!1){e||(V.value=!0);try{let{data:e}=await ae(re.serverStats,()=>s.get(`/servers/stats`));H.value[0].title=String(e.total),H.value[1].title=String(e.online),H.value[2].title=String(e.offline),H.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{e||z(`加载统计数据失败`,`error`)}finally{e||(V.value=!1)}}async function $(){try{q.value=((await s.get(`/alert-history/`,{limit:5})).items||[]).map(e=>({title:e.server_name,subtitle:`${e.alert_type} ${e.is_recovery?`(已恢复)`:``} · ${E(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=[],z(`加载告警记录失败`,`error`)}}async function je(){try{Z.value=de((await s.get(`/audit/`,{limit:10})).items||[]).slice(0,10)}catch{Z.value=[],z(`加载审计记录失败`,`error`)}}async function Me(){try{let e=await s.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 Ne(e){B.push({path:`/terminal`,query:{server_id:String(e.id)}})}function Pe(e){B.push({path:`/files`,query:{server_id:String(e.id)}})}async function Fe(e=!1){await Promise.all([Q(e),ke(e),$(),Me(),je()]),e||s.post(`/settings/bing-wallpapers/sync`).catch(()=>{})}return te(ne().alerts,()=>{Q(),$()}),oe(e=>Fe(e)),(e,s)=>(g(),y(t,{fluid:``,class:`pa-4 pa-md-6 dashboard-root`},{default:a(()=>[V.value?(g(),y(D,{key:0,type:`heading, text`,class:`mb-4`})):(g(),y(me,{key:1,items:H.value},null,8,[`items`])),C(T,{class:`my-5`,elevation:`0`,rounded:`lg`,title:`服务器列表`,border:``},{text:a(()=>[C(ce,{modelValue:i(G),"onUpdate:modelValue":s[0]||=e=>o(G)?G.value=e:null,autocomplete:`off`,placeholder:`搜索...`,"prepend-inner-icon":`mdi-magnify`,variant:`outlined`,"hide-details":``,rounded:``,class:`mb-4`},null,8,[`modelValue`]),i(W)&&!i(U).length?(g(),y(D,{key:0,type:`table-heading, table-row-divider@6`,class:`mb-4`})):(g(),y(le,{key:1,items:i(U),headers:Ae,"items-length":i(we),loading:i(W),page:i(Se),"items-per-page":i(Ce),"items-per-page-options":O,"sort-by":i(K),"onUpdate:sortBy":s[1]||=e=>o(K)?K.value=e:null,hover:``,"item-value":`id`,"onUpdate:page":i(De),"onUpdate:itemsPerPage":i(Oe)},{"item.status":a(({item:e})=>[C(w,{color:i(pe)(e.status),text:i(fe)(e.status),border:`sm`,size:`x-small`,label:``},null,8,[`color`,`text`])]),"item.name":a(({item:e})=>[m(`span`,ge,x(e.name),1)]),"item.domain":a(({item:e})=>[m(`span`,k,x(e.domain),1)]),"item.category":a(({item:e})=>[m(`span`,A,x(e.category||`—`),1)]),"item.agent_version":a(({item:e})=>[m(`span`,j,x(e.agent_version||`—`),1)]),"item.last_heartbeat":a(({item:e})=>[m(`span`,M,x(i(E)(e.last_heartbeat)),1)]),"item.actions":a(({item:e})=>[m(`div`,N,[C(l,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:t=>Ne(e)},{default:a(()=>[...s[2]||=[f(`终端`,-1)]]),_:1},8,[`onClick`]),C(l,{variant:`text`,size:`x-small`,density:`compact`,onClick:t=>Pe(e)},{default:a(()=>[...s[3]||=[f(`文件`,-1)]]),_:1},8,[`onClick`])])]),"no-data":a(()=>[...s[4]||=[m(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无服务器数据`,-1)]]),_:1},8,[`items`,`items-length`,`loading`,`page`,`items-per-page`,`sort-by`,`onUpdate:page`,`onUpdate:itemsPerPage`]))]),_:1}),C(r,null,{default:a(()=>[C(n,{cols:`12`,md:`6`},{default:a(()=>[C(T,{elevation:`0`,rounded:`lg`,title:`告警历史`,border:``},{append:a(()=>[...s[5]||=[m(`div`,{class:`my-5`},null,-1)]]),text:a(()=>[q.value.length===0?(g(),h(`div`,P,` 暂无告警 `)):v(``,!0),(g(!0),h(p,null,c(q.value,(e,t)=>(g(),y(_,{key:t,class:S([t!==0&&`mt-4`,`px-0`]),subtitle:e.subtitle,title:e.title,lines:`one`},{prepend:a(()=>[C(u,{color:e.color,icon:e.icon,variant:`tonal`,rounded:``},null,8,[`color`,`icon`])]),append:a(()=>[m(`span`,F,x(e.value),1)]),_:2},1032,[`class`,`subtitle`,`title`]))),128))]),_:1})]),_:1}),C(n,{cols:`12`,md:`6`},{default:a(()=>[C(T,{elevation:`0`,rounded:`lg`,title:`资源概览`,border:``},{append:a(()=>[...s[6]||=[m(`div`,{class:`my-5`},null,-1)]]),text:a(()=>[(g(!0),h(p,null,c(J.value,(e,t)=>(g(),y(_,{key:t,class:S([t!==0&&`mt-4`,`px-0`])},{prepend:a(()=>[C(u,{text:e.text,color:`primary`,size:`large`,variant:`tonal`},null,8,[`text`])]),title:a(()=>[m(`div`,I,[m(`span`,null,x(e.title),1),m(`span`,null,x(e.value),1)])]),subtitle:a(()=>[m(`div`,L,[C(d,{"model-value":e.progress,"bg-color":`surface-light`,"bg-opacity":`1`,color:`primary`,height:`8`,rounded:``},null,8,[`model-value`])])]),_:2},1032,[`class`]))),128))]),_:1})]),_:1})]),_:1}),C(r,null,{default:a(()=>[C(n,{cols:`12`,md:`6`},{default:a(()=>[C(T,{elevation:`0`,rounded:`lg`,title:`分类分布`,border:``},{text:a(()=>[Object.keys(Y.value).length===0?(g(),h(`div`,_e,` 暂无分类数据 `)):v(``,!0),(g(!0),h(p,null,c(Y.value,(e,t)=>(g(),y(_,{key:t,class:`px-0`},{prepend:a(()=>[C(u,{color:`primary`,variant:`tonal`,size:`small`},{default:a(()=>[m(`span`,ve,x(t[0]?.toUpperCase()),1)]),_:2},1024)]),title:a(()=>[m(`div`,ye,[m(`span`,be,x(t===`uncategorized`?`未分类`:t),1),m(`span`,R,x(e)+` 台`,1)])]),subtitle:a(()=>[C(d,{"model-value":X.value>0?e/X.value*100:0,"bg-color":`surface-light`,"bg-opacity":`1`,color:`primary`,height:`6`,rounded:``},null,8,[`model-value`])]),_:2},1024))),128))]),_:1})]),_:1}),C(n,{cols:`12`,md:`6`},{default:a(()=>[C(T,{elevation:`0`,rounded:`lg`,title:`最近操作`,border:``},{append:a(()=>[C(l,{size:`small`,variant:`text`,to:`/audit`},{default:a(()=>[...s[7]||=[f(`查看全部`,-1)]]),_:1})]),text:a(()=>[Z.value.length===0?(g(),h(`div`,xe,` 暂无操作记录 `)):v(``,!0),(g(!0),h(p,null,c(Z.value,e=>(g(),y(_,{key:e.id,title:i(ue)(e),subtitle:`${e.admin_username} · ${i(E)(e.created_at)}`,class:`px-0`,lines:`two`},{append:a(()=>[C(w,{size:`x-small`,variant:`tonal`,label:``},{default:a(()=>[f(x(e.ip_address||`—`),1)]),_:2},1024)]),_:2},1032,[`title`,`subtitle`]))),128))]),_:1})]),_:1})]),_:1})]),_:1}))}}),[[`__scopeId`,`data-v-1d349b89`]]);export{z as default};