2 lines
16 KiB
JavaScript
2 lines
16 KiB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/FleetTrendEChart-lgdTP3R-.js","assets/_plugin-vue_export-helper-BDNMzG2s.js","assets/index-CDcgx9V8.js","assets/chunk-DK3Fl9T5.js","assets/index-BNJe_ogF.css","assets/dist-DCycUQQT.js","assets/install-BY4V-NK4.js","assets/StatCardsRow-CdfBB9tI.js","assets/VCard-pmpQR9O7.js","assets/VCard-BCYbpv-w.css","assets/VRow-rmSa_q-C.js","assets/VRow-DIr3-SqU.css","assets/VSkeletonLoader-gL4kF19X.js","assets/VSkeletonLoader-CkAIsbz1.css","assets/StatCardsRow-snFLCRnD.css","assets/FleetTrendEChart-DbHCuhg7.css"])))=>i.map(i=>d[i]);
|
||
import{t as e}from"./VDataTable-ClfE0-sD.js";import{_ as t}from"./VSelect-BvR-yyLS.js";import{n,t as r}from"./VRow-rmSa_q-C.js";import{$ as i,Ar as a,C as o,Dr as s,Er as c,F as l,L as u,Mr as d,Nr as f,Or as p,Pt as m,Qt as h,T as g,Tr as _,Wr as ee,Xt as te,Yr as v,_i as y,b,h as x,in as S,jr as C,ln as w,nt as T,q as E,qr as D,ri as O,t as k,ti as A,ui as j,v as M,wr as N,xi as P,xr as F,y as I,yi as L}from"./index-CDcgx9V8.js";import{a as R,d as z,f as ne,i as B,l as V,n as H,o as U,r as W,s as re,t as G,u as K}from"./StatCardsRow-CdfBB9tI.js";import{t as q}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as J}from"./usePageActivateRefresh-CqHSpagO.js";import{t as ie}from"./useSnackbar-u_XK4ZNm.js";import{n as ae,r as oe,t as Y}from"./VCard-pmpQR9O7.js";import{i as se,t as X}from"./auditNormalize-xrm2MK_4.js";import{t as ce}from"./status-BrGQYcd-.js";import{t as le}from"./VSkeletonLoader-gL4kF19X.js";import{t as ue}from"./VDialog-nKJcjfNL.js";var Z={class:`d-flex align-center justify-space-between mb-1`},de={class:`text-caption text-medium-emphasis text-uppercase`},Q={class:`d-flex align-end ga-2 mb-2`},fe={key:0,class:`text-caption text-medium-emphasis pb-1`},pe={class:`text-caption text-medium-emphasis mt-2`},me=q(f({__name:`FleetTrendKpiStrip`,props:{items:{}},setup(e){function t(e,t){return e==null?`—`:t===`%`?`${e}%`:`${e} 台`}function i(e){return e.min==null||e.max==null?`—`:e.unit===`%`?`${e.min}–${e.max}%`:`${e.min}–${e.max} 台`}function o(e){return e>0?`warning`:e<0?`success`:`default`}function l(e){return e.unit!==`%`||e.current==null||e.threshold==null?``:e.current>=e.threshold?`text-error`:e.current>=e.threshold-10?`text-warning`:`text-success`}function u(e){return e.current==null||e.threshold==null?`primary`:e.current>=e.threshold?`error`:e.current>=e.threshold-10?`warning`:`primary`}return(d,f)=>(D(),c(r,{dense:``,class:`fleet-kpi-strip`},{default:O(()=>[(D(!0),p(F,null,v(e.items,e=>(D(),c(n,{key:e.key,cols:`6`,sm:`3`},{default:O(()=>[C(k,{rounded:`lg`,border:``,class:L([`pa-3 fleet-kpi-card`,`fleet-kpi-card--${e.key}`])},{default:O(()=>[_(`div`,Z,[_(`span`,de,P(e.label),1),e.delta==null?s(``,!0):(D(),c(b,{key:0,size:`x-small`,color:o(e.delta),variant:`tonal`,label:``},{default:O(()=>[a(P(y(V)(e.delta,e.unit)),1)]),_:2},1032,[`color`]))]),_(`div`,Q,[_(`span`,{class:L([`text-h5 font-weight-bold`,l(e)])},P(t(e.current,e.unit)),3),e.threshold==null?s(``,!0):(D(),p(`span`,fe,` 阈值 `+P(e.threshold)+`% `,1))]),e.unit===`%`&&e.current!=null?(D(),c(E,{key:0,"model-value":e.current,color:u(e),height:`6`,rounded:``,"bg-opacity":`0.15`},null,8,[`model-value`,`color`])):e.max!=null&&e.current!=null&&e.max>0?(D(),c(E,{key:1,"model-value":e.current/e.max*100,color:`success`,height:`6`,rounded:``,"bg-opacity":`0.15`},null,8,[`model-value`])):s(``,!0),_(`div`,pe,` 区间 `+P(i(e))+` · 均 `+P(t(e.avg,e.unit)),1)]),_:2},1032,[`class`])]),_:2},1024))),128))]),_:1}))}}),[[`__scopeId`,`data-v-abbdd903`]]),he={class:`text-medium-emphasis`},ge={key:0},_e={class:`d-flex align-center flex-wrap ga-2`},ve={key:0,class:`py-2`},ye={key:1,class:`text-center py-12`},be={class:`text-caption text-medium-emphasis mt-1`},xe={key:2},Se={class:`d-flex align-center flex-wrap ga-2 mb-3`},Ce={class:`text-subtitle-2 mb-2`},we={key:1,class:`text-medium-emphasis`},Te=q(f({__name:`DashboardFleetTrends`,setup(t,{expose:n}){let r=d(()=>h(()=>import(`./FleetTrendEChart-lgdTP3R-.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]))),o=j(24),f=j(!0),m=j([]),v=j(10),x=j(``),w=j(!1),E=j(0),k=j({cpu:80,mem:80,disk:80}),A=j(void 0),R=j(void 0),B=j(0),V=j(100),H=N(()=>m.value.length>=2),U=N(()=>B.value>.5||V.value<99.5),W=N(()=>z(m.value.length,B.value,V.value)),G=N(()=>re(m.value,W.value.startIdx,W.value.endIdx)),q=N(()=>{let{startIdx:e,endIdx:t}=W.value,n=t-e+1;return U.value?`视图 ${K(m.value[e]?.recorded_at??``).slice(5,16)} — ${K(m.value[t]?.recorded_at??``).slice(5,16)} · ${n} 条`:o.value>=168?`全周期 ${n} 条采样`:`近 24 小时 · ${n} 条`}),J=N(()=>[{key:`cpu`,label:`CPU`,unit:`%`,current:G.value.cpu.current,delta:G.value.cpu.delta,min:G.value.cpu.min,max:G.value.cpu.max,avg:G.value.cpu.avg,threshold:k.value.cpu},{key:`mem`,label:`内存`,unit:`%`,current:G.value.mem.current,delta:G.value.mem.delta,min:G.value.mem.min,max:G.value.mem.max,avg:G.value.mem.avg,threshold:k.value.mem},{key:`disk`,label:`磁盘`,unit:`%`,current:G.value.disk.current,delta:G.value.disk.delta,min:G.value.disk.min,max:G.value.disk.max,avg:G.value.disk.avg,threshold:k.value.disk},{key:`online`,label:`在线`,unit:`台`,current:G.value.online.current,delta:G.value.online.delta,min:G.value.online.min,max:G.value.online.max,avg:G.value.online.avg}]),ie=[{title:`采样时间`,key:`recorded_at`,sortable:!1},{title:`CPU`,key:`cpu_avg`,align:`end`,width:72},{title:`内存`,key:`mem_avg`,align:`end`,width:72},{title:`磁盘`,key:`disk_avg`,align:`end`,width:72},{title:`在线`,key:`online_count`,align:`end`,width:64},{title:`采样数`,key:`sample_count`,align:`end`,width:72},{title:`覆盖率`,key:`coverage`,align:`end`,width:72,sortable:!1},{title:`告警`,key:`alert_count`,align:`end`,width:56}],se=N(()=>[...m.value].reverse());function X(e){return e==null?`—`:`${e}%`}function ce(e){return e.sample_count==null||e.online_count<=0?`—`:`${Math.round(e.sample_count/e.online_count*100)}%`}function Z(e,t){return e==null?``:e>=t?`text-error font-weight-medium`:e>=t-10?`text-warning`:``}function de(e){B.value=e.startPercent,V.value=e.endPercent}function Q(){A.value=o.value>=168?65:0,R.value=100,B.value=A.value,V.value=100,E.value+=1}function fe(){Q(),Te()}async function pe(){try{let e=await S.get(`/settings/`);k.value=ne(Array.isArray(e)?e:[])}catch{}}async function Te(){f.value=!0;try{let e=await S.get(`/servers/fleet-metrics`,{hours:o.value});m.value=e.points||[],v.value=e.interval_minutes||10,x.value=te(new Date().toISOString()).slice(11,19)}catch{m.value=[]}finally{f.value=!1}}async function $(){await Promise.all([Te(),pe()])}return ee(()=>{Q(),$()}),n({reload:$}),(t,n)=>(D(),p(F,null,[C(Y,{elevation:`0`,rounded:`lg`,border:``,class:`fleet-trends-card`},{default:O(()=>[C(oe,null,{title:O(()=>[...n[5]||=[_(`span`,{class:`text-h6`},`舰队资源趋势`,-1)]]),subtitle:O(()=>[_(`span`,he,[a(` 全库 Agent 均值 · 每 `+P(v.value)+` 分钟采样 · 北京时间 `,1),x.value?(D(),p(`span`,ge,` · 更新于 `+P(x.value),1)):s(``,!0)])]),append:O(()=>[_(`div`,_e,[C(T,{modelValue:o.value,"onUpdate:modelValue":[n[0]||=e=>o.value=e,fe],density:`compact`,variant:`outlined`,divided:``,mandatory:``},{default:O(()=>[C(u,{value:24,size:`small`},{default:O(()=>[...n[6]||=[a(`24 小时`,-1)]]),_:1}),C(u,{value:168,size:`small`},{default:O(()=>[...n[7]||=[a(`7 天`,-1)]]),_:1})]),_:1},8,[`modelValue`]),C(u,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-fullscreen`,disabled:!H.value,onClick:n[1]||=e=>w.value=!0},{default:O(()=>[...n[8]||=[a(` 全屏 `,-1)]]),_:1},8,[`disabled`]),C(u,{icon:`mdi-refresh`,size:`small`,variant:`text`,loading:f.value,title:`刷新`,onClick:n[2]||=e=>$()},null,8,[`loading`])])]),_:1}),C(ae,{class:`pt-0`},{default:O(()=>[f.value?(D(),p(`div`,ve,[C(le,{type:`heading`,class:`mb-3`}),C(le,{type:`image`,height:`360`})])):H.value?(D(),p(`div`,xe,[_(`div`,Se,[C(b,{size:`small`,variant:`outlined`,label:``},{default:O(()=>[a(P(q.value),1)]),_:1}),U.value?(D(),c(b,{key:0,size:`small`,color:`primary`,variant:`tonal`,label:``,closable:``,"onClick:close":Q},{default:O(()=>[...n[10]||=[a(` 已缩放视图 · 点击关闭恢复全览 `,-1)]]),_:1})):s(``,!0)]),C(me,{items:J.value,class:`mb-4`},null,8,[`items`]),(D(),c(y(r),{key:E.value,points:m.value,hours:o.value,thresholds:k.value,"zoom-start":A.value,"zoom-end":R.value,onRangeChange:de},null,8,[`points`,`hours`,`thresholds`,`zoom-start`,`zoom-end`]))])):(D(),p(`div`,ye,[C(i,{icon:`mdi-chart-timeline-variant`,size:`48`,color:`disabled`,class:`mb-3`}),n[9]||=_(`div`,{class:`text-body-1 text-medium-emphasis`},`暂无历史采样数据`,-1),_(`div`,be,` 心跳落库后约 `+P(v.value)+` 分钟出现首条;满 24 小时后曲线更完整 `,1)]))]),_:1})]),_:1}),C(ue,{modelValue:w.value,"onUpdate:modelValue":n[4]||=e=>w.value=e,fullscreen:``,transition:`dialog-bottom-transition`},{default:O(()=>[C(Y,null,{default:O(()=>[C(g,{density:`comfortable`,border:``},{default:O(()=>[C(l,null,{default:O(()=>[a(`舰队资源趋势 · `+P(o.value>=168?`7 天`:`24 小时`),1)]),_:1}),C(M),C(u,{icon:`mdi-close`,onClick:n[3]||=e=>w.value=!1})]),_:1}),C(ae,{class:`pa-4 pa-md-6`},{default:O(()=>[C(me,{items:J.value,class:`mb-4`},null,8,[`items`]),C(y(r),{points:m.value,hours:o.value,thresholds:k.value,height:420,"zoom-start":A.value,"zoom-end":R.value,onRangeChange:de},null,8,[`points`,`hours`,`thresholds`,`zoom-start`,`zoom-end`]),C(I,{class:`my-4`}),_(`div`,Ce,`采样明细(`+P(m.value.length)+` 条)`,1),C(e,{headers:ie,items:se.value,"items-per-page":15,density:`compact`,height:`320`,"fixed-header":``,class:`fleet-trend-table`},{"item.recorded_at":O(({item:e})=>[a(P(y(K)(e.recorded_at)),1)]),"item.cpu_avg":O(({item:e})=>[_(`span`,{class:L(Z(e.cpu_avg,k.value.cpu))},P(X(e.cpu_avg)),3)]),"item.mem_avg":O(({item:e})=>[_(`span`,{class:L(Z(e.mem_avg,k.value.mem))},P(X(e.mem_avg)),3)]),"item.disk_avg":O(({item:e})=>[_(`span`,{class:L(Z(e.disk_avg,k.value.disk))},P(X(e.disk_avg)),3)]),"item.coverage":O(({item:e})=>[a(P(ce(e)),1)]),"item.alert_count":O(({item:e})=>[(e.alert_count??0)>0?(D(),c(b,{key:0,size:`x-small`,color:`error`,variant:`tonal`,label:``},{default:O(()=>[a(P(e.alert_count),1)]),_:2},1024)):(D(),p(`span`,we,`0`))]),_:1},8,[`items`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-3da01bdd`]]),$={key:0,class:`text-center text-medium-emphasis py-4`},Ee={class:`text-body-large font-weight-regular`},De={class:`d-flex justify-space-between align-center text-medium-emphasis`},Oe={class:`py-1`},ke={key:0,class:`text-center text-medium-emphasis py-4`},Ae={class:`text-caption`},je={class:`d-flex justify-space-between align-center`},Me={class:`text-medium-emphasis`},Ne={class:`text-body-2 font-weight-medium`},Pe={key:0,class:`text-center text-medium-emphasis py-4`},Fe=q(f({name:`DashboardPage`,__name:`DashboardPage`,setup(e){let i=ie(),l=w(),d=j(null),f=j(!0),h=j(!1),{statItems:g}=U(),ee=N(()=>g.value.map((e,t)=>{let n=H[t];return{...e,key:n,clickable:n!==`total`}}));function te(e){if(e===`alerts`){l.push({path:`/alerts`});return}if(e===`online`){l.push({path:`/servers`});return}if(e===`offline`){l.push({path:`/servers`,query:{status:`offline`}});return}if(e===`unset-path-offline`){l.push({path:`/servers`,query:{unset_path:`1`,status:`offline`}});return}e===`unset-path`&&l.push({path:`/servers`,query:{unset_path:`1`}})}let T=j([]),k=j([{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%`}]),M=j({}),I=j(0),z=j([]);async function ne(e=!1){e||(f.value=!0);try{let e=await B();W(g,e),V(e)}catch{e||i(`加载统计数据失败`,`error`)}finally{e||(f.value=!1)}}function V(e){M.value=e.categories||{},I.value=e.total;let t=e.total?Math.round(e.online/e.total*100):0;k.value[0].progress=t,k.value[0].value=`${t}%`}async function re(){h.value=!0;try{V(await R(g))}catch{i(`刷新统计数据失败`,`error`)}finally{h.value=!1}}async function K(){try{T.value=((await S.get(`/alert-history/`,{limit:5})).items||[]).map(e=>({title:e.server_name,subtitle:`${e.alert_type} ${e.is_recovery?`(已恢复)`:``} · ${ce(e.created_at)}`,value:e.value,color:e.is_recovery?`green`:`red`,icon:e.is_recovery?`mdi-check-circle`:`mdi-alert-circle`}))}catch{T.value=[],i(`加载告警记录失败`,`error`)}}async function q(){try{z.value=X((await S.get(`/audit/`,{limit:10})).items||[]).slice(0,10)}catch{z.value=[],i(`加载审计记录失败`,`error`)}}async function ae(){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);k.value[1].progress=i,k.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);k.value[2].progress=e,k.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);k.value[3].progress=e,k.value[3].value=`${e}%`}}catch{}}async function oe(e=!1){await Promise.all([ne(e),K(),ae(),q(),d.value?.reload?.()]),e||S.post(`/settings/bing-wallpapers/sync`).catch(()=>{})}return A(m().alerts,()=>{ne(!0),K()}),J(e=>oe(e)),(e,i)=>(D(),c(t,{fluid:``,class:`pa-4 pa-md-6 dashboard-root`},{default:O(()=>[C(G,{items:ee.value,loading:f.value,refreshing:h.value,onClick:te,onRefresh:re},null,8,[`items`,`loading`,`refreshing`]),C(r,{class:`mt-5`},{default:O(()=>[C(n,{cols:`12`},{default:O(()=>[C(Te,{ref_key:`fleetTrendsRef`,ref:d},null,512)]),_:1})]),_:1}),C(r,{class:`mt-5`},{default:O(()=>[C(n,{cols:`12`,md:`6`},{default:O(()=>[C(Y,{elevation:`0`,rounded:`lg`,title:`告警历史`,border:``},{append:O(()=>[...i[0]||=[_(`div`,{class:`my-5`},null,-1)]]),text:O(()=>[T.value.length===0?(D(),p(`div`,$,` 暂无告警 `)):s(``,!0),(D(!0),p(F,null,v(T.value,(e,t)=>(D(),c(x,{key:t,class:L([t!==0&&`mt-4`,`px-0`]),subtitle:e.subtitle,title:e.title,lines:`one`},{prepend:O(()=>[C(o,{color:e.color,icon:e.icon,variant:`tonal`,rounded:``},null,8,[`color`,`icon`])]),append:O(()=>[_(`span`,Ee,P(e.value),1)]),_:2},1032,[`class`,`subtitle`,`title`]))),128))]),_:1})]),_:1}),C(n,{cols:`12`,md:`6`},{default:O(()=>[C(Y,{elevation:`0`,rounded:`lg`,title:`资源概览`,border:``},{append:O(()=>[...i[1]||=[_(`div`,{class:`my-5`},null,-1)]]),text:O(()=>[(D(!0),p(F,null,v(k.value,(e,t)=>(D(),c(x,{key:t,class:L([t!==0&&`mt-4`,`px-0`])},{prepend:O(()=>[C(o,{text:e.text,color:`primary`,size:`large`,variant:`tonal`},null,8,[`text`])]),title:O(()=>[_(`div`,De,[_(`span`,null,P(e.title),1),_(`span`,null,P(e.value),1)])]),subtitle:O(()=>[_(`div`,Oe,[C(E,{"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:O(()=>[C(n,{cols:`12`,md:`6`},{default:O(()=>[C(Y,{elevation:`0`,rounded:`lg`,title:`分类分布`,border:``},{text:O(()=>[Object.keys(M.value).length===0?(D(),p(`div`,ke,` 暂无分类数据 `)):s(``,!0),(D(!0),p(F,null,v(M.value,(e,t)=>(D(),c(x,{key:t,class:`px-0`},{prepend:O(()=>[C(o,{color:`primary`,variant:`tonal`,size:`small`},{default:O(()=>[_(`span`,Ae,P(t[0]?.toUpperCase()),1)]),_:2},1024)]),title:O(()=>[_(`div`,je,[_(`span`,Me,P(t===`uncategorized`?`未分类`:t),1),_(`span`,Ne,P(e)+` 台`,1)])]),subtitle:O(()=>[C(E,{"model-value":I.value>0?e/I.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:O(()=>[C(Y,{elevation:`0`,rounded:`lg`,title:`最近操作`,border:``},{append:O(()=>[C(u,{size:`small`,variant:`text`,to:`/audit`},{default:O(()=>[...i[2]||=[a(`查看全部`,-1)]]),_:1})]),text:O(()=>[z.value.length===0?(D(),p(`div`,Pe,` 暂无操作记录 `)):s(``,!0),(D(!0),p(F,null,v(z.value,e=>(D(),c(x,{key:e.id,title:y(se)(e),subtitle:`${e.admin_username} · ${y(ce)(e.created_at)}`,class:`px-0`,lines:`two`},{append:O(()=>[C(b,{size:`x-small`,variant:`tonal`,label:``},{default:O(()=>[a(P(e.ip_address||`—`),1)]),_:2},1024)]),_:2},1032,[`title`,`subtitle`]))),128))]),_:1})]),_:1})]),_:1})]),_:1}))}}),[[`__scopeId`,`data-v-d7edfa9b`]]);export{Fe as default}; |