347 lines
12 KiB
Vue
347 lines
12 KiB
Vue
<script>
|
|
// DCIM 带宽监控根据时间范围查询入/出站曲线,图表组件按需加载。
|
|
import "~/assets/styles/DcimMonitor.CiStTCbZ.css";
|
|
import { toDisplayString } from "vue";
|
|
import { onMounted } from "vue";
|
|
import { normalizeClass } from "vue";
|
|
import { onBeforeUnmount } from "vue";
|
|
import { watch } from "vue";
|
|
import { defineAsyncComponent } from "vue";
|
|
import { createBlock } from "vue";
|
|
import { ref } from "vue";
|
|
import { createCommentVNode } from "vue";
|
|
import { computed } from "vue";
|
|
import { isRef } from "vue";
|
|
import { createElementBlock } from "vue";
|
|
import { createElementVNode } from "vue";
|
|
import { createTextVNode } from "vue";
|
|
import { unref } from "vue";
|
|
import { defineComponent } from "vue";
|
|
import { createVNode } from "vue";
|
|
import { openBlock } from "vue";
|
|
import { normalizeStyle } from "vue";
|
|
import { loadModule } from "~/utils/load-module.js";
|
|
import { useApi } from "~/lib/auth.js";
|
|
import button from "primevue/button";
|
|
import { t as _plugin_vue_export_helper_t } from "~/lib/_plugin-vue_export-helper.js";
|
|
import skeleton from "primevue/skeleton";
|
|
import selectbutton from "primevue/selectbutton";
|
|
var T = defineAsyncComponent(() =>
|
|
loadModule(
|
|
() => import("~/components/ChartBox.vue").then((e) => e.default || e),
|
|
[],
|
|
import.meta.url,
|
|
),
|
|
),
|
|
E = {
|
|
class: `monitor-panel`,
|
|
},
|
|
D = {
|
|
key: 0,
|
|
class: `monitor-head`,
|
|
},
|
|
O = {
|
|
class: `legend`,
|
|
},
|
|
k = [`aria-busy`],
|
|
A = {
|
|
key: 1,
|
|
role: `alert`,
|
|
class: `monitor-error`,
|
|
},
|
|
j = {
|
|
key: 3,
|
|
class: `empty`,
|
|
},
|
|
M = Object.assign(
|
|
_plugin_vue_export_helper_t(
|
|
defineComponent({
|
|
__name: `DcimMonitor`,
|
|
props: {
|
|
hostId: {},
|
|
module: {},
|
|
compact: {
|
|
type: Boolean,
|
|
default: !1,
|
|
},
|
|
},
|
|
setup(a) {
|
|
let h = a,
|
|
y = useApi(),
|
|
S = ref(3600),
|
|
M = [
|
|
{
|
|
label: `1 小时`,
|
|
value: 3600,
|
|
},
|
|
{
|
|
label: `24 小时`,
|
|
value: 86400,
|
|
},
|
|
{
|
|
label: `7 天`,
|
|
value: 604800,
|
|
},
|
|
{
|
|
label: `1 个月`,
|
|
value: 2592e3,
|
|
},
|
|
{
|
|
label: `1 年`,
|
|
value: 31536e3,
|
|
},
|
|
],
|
|
N = ref(!1),
|
|
P = ref(``),
|
|
F = ref([]),
|
|
I = ref(``),
|
|
L = 0,
|
|
R = !1,
|
|
z = ``;
|
|
// 时间以秒提交;实例、模块或范围变化时清空旧曲线,并用代次阻止旧请求覆盖。
|
|
async function B() {
|
|
let e = ++L,
|
|
t = h.hostId,
|
|
n = h.module,
|
|
r = `${n}:${t}:${S.value}`;
|
|
(r !== z && ((F.value = []), (I.value = ``)),
|
|
(z = r),
|
|
(N.value = !0),
|
|
(P.value = ``));
|
|
try {
|
|
let r = await y.get(`/${n}/${t}/chart`, {
|
|
start_time: Math.floor(Date.now() / 1e3) - S.value,
|
|
});
|
|
if (R || e !== L || t !== h.hostId || n !== h.module) return;
|
|
((F.value = (Array.isArray(r.list) ? r.list : []).filter((e) =>
|
|
Number.isFinite(Number(e.time)),
|
|
)),
|
|
(I.value = typeof r.unit == `string` ? r.unit : ``));
|
|
} catch (t) {
|
|
!R &&
|
|
e === L &&
|
|
(P.value = t instanceof Error ? t.message : `带宽监控加载失败`);
|
|
} finally {
|
|
!R && e === L && (N.value = !1);
|
|
}
|
|
}
|
|
// 缺失采样转为 null 而不是 0,配合 connectNulls:false 保留采集中断的空隙。
|
|
function V(e) {
|
|
return e != null && e !== `` && Number.isFinite(Number(e))
|
|
? Number(e)
|
|
: null;
|
|
}
|
|
let H = computed(() =>
|
|
F.value.some((e) => V(e.in_bw) !== null || V(e.out_bw) !== null),
|
|
),
|
|
U = computed(() => ({
|
|
color: [`#1687d9`, `#29b6d8`],
|
|
tooltip: {
|
|
trigger: `axis`,
|
|
},
|
|
grid: {
|
|
left: 8,
|
|
right: 8,
|
|
top: h.compact ? 10 : 30,
|
|
bottom: 8,
|
|
outerBoundsMode: `same`,
|
|
outerBoundsContain: `axisLabel`,
|
|
},
|
|
xAxis: {
|
|
type: `category`,
|
|
boundaryGap: !1,
|
|
data: F.value.map((e) =>
|
|
new Date(Number(e.time) * 1e3).toLocaleTimeString(`zh-CN`, {
|
|
hour: `2-digit`,
|
|
minute: `2-digit`,
|
|
}),
|
|
),
|
|
},
|
|
yAxis: {
|
|
type: `value`,
|
|
name: I.value,
|
|
min: 0,
|
|
splitNumber: h.compact ? 2 : 5,
|
|
},
|
|
series: [`in_bw`, `out_bw`].map((e, t) => ({
|
|
name: t ? `出站` : `入站`,
|
|
type: `line`,
|
|
showSymbol: !0,
|
|
symbol: `circle`,
|
|
symbolSize: h.compact ? 3 : 4,
|
|
smooth: 0.25,
|
|
lineStyle: {
|
|
width: 1.5,
|
|
},
|
|
areaStyle: {
|
|
opacity: 0.14,
|
|
},
|
|
connectNulls: !1,
|
|
data: F.value.map((t) => V(t[e])),
|
|
})),
|
|
}));
|
|
return (
|
|
watch([() => h.hostId, () => h.module, S], B),
|
|
onMounted(B),
|
|
onBeforeUnmount(() => {
|
|
((R = !0), L++);
|
|
}),
|
|
(t, r) => {
|
|
let i = selectbutton,
|
|
s = skeleton,
|
|
l = button,
|
|
h = T;
|
|
return (
|
|
openBlock(),
|
|
createElementBlock(
|
|
`section`,
|
|
{
|
|
class: normalizeClass([
|
|
`monitor`,
|
|
{
|
|
compact: a.compact,
|
|
},
|
|
]),
|
|
},
|
|
[
|
|
a.compact
|
|
? createCommentVNode(``, !0)
|
|
: (openBlock(),
|
|
createBlock(
|
|
i,
|
|
{
|
|
key: 0,
|
|
modelValue: unref(S),
|
|
"onUpdate:modelValue": (r[0] ||= (e) =>
|
|
isRef(S) ? (S.value = e) : null),
|
|
class: `range`,
|
|
options: M,
|
|
"option-label": `label`,
|
|
"option-value": `value`,
|
|
"allow-empty": !1,
|
|
"aria-label": `监控时间范围`,
|
|
},
|
|
null,
|
|
8,
|
|
[`modelValue`],
|
|
)),
|
|
createElementVNode(`div`, E, [
|
|
a.compact
|
|
? createCommentVNode(``, !0)
|
|
: (openBlock(),
|
|
createElementBlock(`div`, D, [
|
|
...(r[1] ||= [
|
|
createElementVNode(`h3`, null, `网络带宽`, -1),
|
|
]),
|
|
])),
|
|
createElementVNode(`div`, O, [
|
|
(r[2] ||= createElementVNode(
|
|
`span`,
|
|
null,
|
|
[
|
|
createElementVNode(`i`, {
|
|
class: `incoming`,
|
|
}),
|
|
createTextVNode(`入站`),
|
|
],
|
|
-1,
|
|
)),
|
|
(r[3] ||= createElementVNode(
|
|
`span`,
|
|
null,
|
|
[
|
|
createElementVNode(`i`, {
|
|
class: `outgoing`,
|
|
}),
|
|
createTextVNode(`出站`),
|
|
],
|
|
-1,
|
|
)),
|
|
createElementVNode(
|
|
`small`,
|
|
null,
|
|
toDisplayString(unref(I) || `单位未返回`),
|
|
1,
|
|
),
|
|
]),
|
|
createElementVNode(
|
|
`div`,
|
|
{
|
|
class: `chart-viewport`,
|
|
style: normalizeStyle({
|
|
"--chart-height": a.compact ? `126px` : `320px`,
|
|
}),
|
|
"aria-busy": unref(N),
|
|
},
|
|
[
|
|
unref(N) && !unref(H)
|
|
? (openBlock(),
|
|
createBlock(
|
|
s,
|
|
{
|
|
key: 0,
|
|
height: a.compact ? `126px` : `320px`,
|
|
},
|
|
null,
|
|
8,
|
|
[`height`],
|
|
))
|
|
: unref(P)
|
|
? (openBlock(),
|
|
createElementBlock(`div`, A, [
|
|
createElementVNode(
|
|
`span`,
|
|
null,
|
|
toDisplayString(unref(P)),
|
|
1,
|
|
),
|
|
createVNode(l, {
|
|
label: `重试`,
|
|
text: ``,
|
|
size: `small`,
|
|
onClick: B,
|
|
}),
|
|
]))
|
|
: unref(H)
|
|
? (openBlock(),
|
|
createBlock(
|
|
h,
|
|
{
|
|
key: 2,
|
|
option: unref(U),
|
|
height: a.compact ? 126 : 320,
|
|
loading: unref(N),
|
|
},
|
|
null,
|
|
8,
|
|
[`option`, `height`, `loading`],
|
|
))
|
|
: (openBlock(),
|
|
createElementBlock(
|
|
`p`,
|
|
j,
|
|
`所选时段暂无带宽采样`,
|
|
)),
|
|
],
|
|
12,
|
|
k,
|
|
),
|
|
]),
|
|
],
|
|
2,
|
|
)
|
|
);
|
|
}
|
|
);
|
|
},
|
|
}),
|
|
[[`__scopeId`, `data-v-eb47944f`]],
|
|
),
|
|
{
|
|
__name: `DcimMonitor`,
|
|
},
|
|
);
|
|
export {};
|
|
export default M;
|
|
</script>
|