Files
Nexus/web/app/assets/DashboardPage-CUPD9pH7.js
T
Nexus Deploy 49f88a2cd8 fix(install): Docker .env 持久化与 entrypoint 覆盖 Compose 占位符
向导 init-db 后立即同步 nexus-state 卷;entrypoint 跳过不完整 env 并在启动前 source /app/.env,避免缺 DATABASE_URL 与无密码 REDIS_URL 导致容器崩溃。

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

1 line
8.4 KiB
JavaScript

import{$n as e,Ar as t,Br as n,Cr as r,Ht as i,Ir as a,J as o,L as s,Mt as ee,N as c,R as l,Rr as u,Rt as d,Tr as te,Xn as f,_r as p,ar as m,er as h,hr as g,ir as _,k as v,nr as y,or as b,pr as ne,t as re,tr as x,xr as ie}from"./index-C_dP75wD.js";import{o as ae,t as oe}from"./VContainer-DGQjsCTw.js";import{t as S}from"./VChip-oig-b64O.js";import{t as se}from"./VDataTableServer-BMEL-4WM.js";import{n as C,t as w}from"./VRow-MZyk7N4E.js";import{i as ce,t as le}from"./auditNormalize-BHJPJFP9.js";import{a as ue,i as de,n as T,r as E,t as D}from"./StatCardsRow-C1WUuCdM.js";import{t as O}from"./_plugin-vue_export-helper-BDNMzG2s.js";var k={class:`font-weight-medium`},A={class:`text-medium-emphasis`},j={class:`text-medium-emphasis`},M={class:`text-medium-emphasis`},N={class:`text-caption text-medium-emphasis`},P={class:`d-flex ga-1`},F={key:0,class:`text-center text-medium-emphasis py-4`},I={class:`text-body-large font-weight-regular`},L={class:`d-flex justify-space-between align-center text-medium-emphasis`},R={class:`py-1`},z={key:0,class:`text-center text-medium-emphasis py-4`},B={class:`text-caption`},V={class:`d-flex justify-space-between align-center`},H={class:`text-medium-emphasis`},fe={class:`text-body-2 font-weight-medium`},U={key:0,class:`text-center text-medium-emphasis py-4`},W=O(b({__name:`DashboardPage`,setup(b){let O=ae(),W=i(),G=t([{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}=ue();async function Se(){try{await ve()}catch{O(`加载服务器列表失败`,`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=t([]),J=t([{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=t({}),X=t(0),Z=t([]);async function Q(){try{let e=await d.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{O(`加载统计数据失败`,`error`)}}async function $(){try{q.value=((await d.get(`/alert-history/`,{limit:5})).items||[]).map(e=>({title:e.server_name,subtitle:`${e.alert_type} ${e.is_recovery?`(已恢复)`:``} · ${T(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=[],O(`加载告警记录失败`,`error`)}}async function we(){try{Z.value=le((await d.get(`/audit/`,{limit:10})).items||[]).slice(0,10)}catch{Z.value=[],O(`加载审计记录失败`,`error`)}}async function Te(){try{let e=await d.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 ie(ee().alerts,()=>{Q(),$()}),ne(()=>{Q(),Se(),$(),Te(),we(),d.post(`/settings/bing-wallpapers/sync`).catch(()=>{})}),(t,i)=>(g(),h(oe,{fluid:``,class:`pa-4 pa-md-6 dashboard-root`},{default:r(()=>[m(D,{items:G.value},null,8,[`items`]),m(c,{class:`my-5`,elevation:`0`,rounded:`lg`,title:`服务器列表`,border:``},{text:r(()=>[m(re,{modelValue:a(K),"onUpdate:modelValue":i[0]||=e=>te(K)?K.value=e:null,autocomplete:`off`,placeholder:`搜索...`,"prepend-inner-icon":`mdi-magnify`,variant:`outlined`,"hide-details":``,rounded:``,class:`mb-4`},null,8,[`modelValue`]),m(se,{items:a(pe),headers:Ce,"items-length":a(_e),loading:a(me),page:a(he),"items-per-page":a(ge),hover:``,"item-value":`id`,"onUpdate:page":a(be),"onUpdate:itemsPerPage":a(xe)},{"item.status":r(({item:e})=>[m(S,{color:a(E)(e.status),text:a(de)(e.status),border:`sm`,size:`x-small`,label:``},null,8,[`color`,`text`])]),"item.name":r(({item:t})=>[e(`span`,k,n(t.name),1)]),"item.domain":r(({item:t})=>[e(`span`,A,n(t.domain),1)]),"item.category":r(({item:t})=>[e(`span`,j,n(t.category||`—`),1)]),"item.agent_version":r(({item:t})=>[e(`span`,M,n(t.agent_version||`—`),1)]),"item.last_heartbeat":r(({item:t})=>[e(`span`,N,n(a(T)(t.last_heartbeat)),1)]),"item.actions":r(({item:t})=>[e(`div`,P,[m(l,{variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:e=>Ee(t)},{default:r(()=>[...i[1]||=[_(`终端`,-1)]]),_:1},8,[`onClick`]),m(l,{variant:`text`,size:`x-small`,density:`compact`,onClick:e=>De(t)},{default:r(()=>[...i[2]||=[_(`文件`,-1)]]),_:1},8,[`onClick`])])]),"no-data":r(()=>[...i[3]||=[e(`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}),m(w,null,{default:r(()=>[m(C,{cols:`12`,md:`6`},{default:r(()=>[m(c,{elevation:`0`,rounded:`lg`,title:`告警历史`,border:``},{append:r(()=>[...i[4]||=[e(`div`,{class:`my-5`},null,-1)]]),text:r(()=>[q.value.length===0?(g(),y(`div`,F,` 暂无告警 `)):x(``,!0),(g(!0),y(f,null,p(q.value,(t,i)=>(g(),h(v,{key:i,class:u([i!==0&&`mt-4`,`px-0`]),subtitle:t.subtitle,title:t.title,lines:`one`},{prepend:r(()=>[m(s,{color:t.color,icon:t.icon,variant:`tonal`,rounded:``},null,8,[`color`,`icon`])]),append:r(()=>[e(`span`,I,n(t.value),1)]),_:2},1032,[`class`,`subtitle`,`title`]))),128))]),_:1})]),_:1}),m(C,{cols:`12`,md:`6`},{default:r(()=>[m(c,{elevation:`0`,rounded:`lg`,title:`资源概览`,border:``},{append:r(()=>[...i[5]||=[e(`div`,{class:`my-5`},null,-1)]]),text:r(()=>[(g(!0),y(f,null,p(J.value,(t,i)=>(g(),h(v,{key:i,class:u([i!==0&&`mt-4`,`px-0`])},{prepend:r(()=>[m(s,{text:t.text,color:`primary`,size:`large`,variant:`tonal`},null,8,[`text`])]),title:r(()=>[e(`div`,L,[e(`span`,null,n(t.title),1),e(`span`,null,n(t.value),1)])]),subtitle:r(()=>[e(`div`,R,[m(o,{"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}),m(w,null,{default:r(()=>[m(C,{cols:`12`,md:`6`},{default:r(()=>[m(c,{elevation:`0`,rounded:`lg`,title:`分类分布`,border:``},{text:r(()=>[Object.keys(Y.value).length===0?(g(),y(`div`,z,` 暂无分类数据 `)):x(``,!0),(g(!0),y(f,null,p(Y.value,(t,i)=>(g(),h(v,{key:i,class:`px-0`},{prepend:r(()=>[m(s,{color:`primary`,variant:`tonal`,size:`small`},{default:r(()=>[e(`span`,B,n(i[0]?.toUpperCase()),1)]),_:2},1024)]),title:r(()=>[e(`div`,V,[e(`span`,H,n(i===`uncategorized`?`未分类`:i),1),e(`span`,fe,n(t)+` 台`,1)])]),subtitle:r(()=>[m(o,{"model-value":X.value>0?t/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}),m(C,{cols:`12`,md:`6`},{default:r(()=>[m(c,{elevation:`0`,rounded:`lg`,title:`最近操作`,border:``},{append:r(()=>[m(l,{size:`small`,variant:`text`,to:`/audit`},{default:r(()=>[...i[6]||=[_(`查看全部`,-1)]]),_:1})]),text:r(()=>[Z.value.length===0?(g(),y(`div`,U,` 暂无操作记录 `)):x(``,!0),(g(!0),y(f,null,p(Z.value,e=>(g(),h(v,{key:e.id,title:a(ce)(e),subtitle:`${e.admin_username} · ${a(T)(e.created_at)}`,class:`px-0`,lines:`two`},{append:r(()=>[m(S,{size:`x-small`,variant:`tonal`,label:``},{default:r(()=>[_(n(e.ip_address||`—`),1)]),_:2},1024)]),_:2},1032,[`title`,`subtitle`]))),128))]),_:1})]),_:1})]),_:1})]),_:1}))}}),[[`__scopeId`,`data-v-1a05ebac`]]);export{W as default};