index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  1. <template>
  2. <div v-loading="loading">
  3. <el-row :gutter="15">
  4. <el-col :xs="24" :sm="12" :md="8" class="mb-4">
  5. <el-card shadow="nover" class="box-card-meter">
  6. <el-row :gutter="20">
  7. <el-col :xs="24" :sm="24" :md="12">
  8. <table cellspacing="0" style="width: 100%">
  9. <tbody>
  10. <tr>
  11. <td>
  12. <div class="cell-card">CPU数: </div>
  13. </td>
  14. <td>
  15. <div class="cell-card">{{ sysInfo.cpuNum }}</div>
  16. </td>
  17. </tr>
  18. <tr>
  19. <td>
  20. <div class="cell-card">核心数: </div>
  21. </td>
  22. <td>
  23. <div class="cell-card">{{ sysInfo.cpuCores }}</div>
  24. </td>
  25. </tr>
  26. <tr>
  27. <td>
  28. <div class="cell-card">使用率:</div>
  29. </td>
  30. <td>
  31. <div class="cell-card">{{ sysInfo.cpuUsed }}%</div>
  32. </td>
  33. </tr>
  34. <tr>
  35. <td>
  36. <div class="cell-card">LA5:</div>
  37. </td>
  38. <td>
  39. <div class="cell-card">{{ sysInfo.cpuAvg5 }}%</div>
  40. </td>
  41. </tr>
  42. <tr>
  43. <td>
  44. <div class="cell-card">LA15:</div>
  45. </td>
  46. <td>
  47. <div class="cell-card">{{ sysInfo.cpuAvg15 }}%</div>
  48. </td>
  49. </tr>
  50. </tbody>
  51. </table>
  52. </el-col>
  53. <el-col :xs="24" :sm="24" :md="12">
  54. <div style="min-height: 180px" ref="chartsWarningRef1"></div>
  55. </el-col>
  56. </el-row>
  57. </el-card>
  58. </el-col>
  59. <el-col :xs="24" :sm="12" :md="8" class="mb-4">
  60. <el-card shadow="nover" class="box-card-meter">
  61. <el-row :gutter="20">
  62. <el-col :xs="24" :sm="24" :md="12">
  63. <table cellspacing="0" style="width: 100%">
  64. <tbody>
  65. <tr>
  66. <td>
  67. <div class="cell-card">内存总数:</div>
  68. </td>
  69. <td>
  70. <div class="cell-card">{{ memorySizeFormat(sysInfo.memTotal) }}</div>
  71. </td>
  72. </tr>
  73. <tr>
  74. <td>
  75. <div class="cell-card">已使用:</div>
  76. </td>
  77. <td>
  78. <div class="cell-card">{{ memorySizeFormat(sysInfo.memUsed) }}</div>
  79. </td>
  80. </tr>
  81. <tr>
  82. <td>
  83. <div class="cell-card">剩余:</div>
  84. </td>
  85. <td>
  86. <div class="cell-card">{{ memorySizeFormat(sysInfo.available) }}</div>
  87. </td>
  88. </tr>
  89. <tr>
  90. <td>
  91. <div class="cell-card">系统使用:</div>
  92. </td>
  93. <td>
  94. <div class="cell-card">{{ memorySizeFormat(sysInfo.goUsed) }}</div>
  95. </td>
  96. </tr>
  97. <tr>
  98. <td>
  99. <div class="cell-card">使用率:</div>
  100. </td>
  101. <td>
  102. <div class="cell-card">{{ sysInfo.memUsage }}%</div>
  103. </td>
  104. </tr>
  105. </tbody>
  106. </table>
  107. </el-col>
  108. <el-col :xs="24" :sm="24" :md="12">
  109. <div style="min-height: 180px" ref="chartsWarningRef2"></div>
  110. </el-col>
  111. </el-row>
  112. </el-card>
  113. </el-col>
  114. <el-col :xs="24" :sm="12" :md="8" class="mb-4">
  115. <el-card shadow="nover" class="box-card-meter">
  116. <el-row :gutter="20">
  117. <el-col :xs="24" :sm="24" :md="12">
  118. <table cellspacing="0" style="width: 100%">
  119. <tbody>
  120. <tr>
  121. <td>
  122. <div class="cell-card">磁盘容量:</div>
  123. </td>
  124. <td>
  125. <div class="cell-card">{{ memorySizeFormat(sysInfo.diskTotal) }}</div>
  126. </td>
  127. </tr>
  128. <tr>
  129. <td>
  130. <div class="cell-card">已使用:</div>
  131. </td>
  132. <td>
  133. <div class="cell-card">{{ memorySizeFormat(sysInfo.diskUsed) }}</div>
  134. </td>
  135. </tr>
  136. <tr>
  137. <td>
  138. <div class="cell-card">使用率:</div>
  139. </td>
  140. <td>
  141. <div class="cell-card">{{ sysInfo.diskUsedPercent }}%</div>
  142. </td>
  143. </tr>
  144. </tbody>
  145. </table>
  146. </el-col>
  147. <el-col :xs="24" :sm="24" :md="12">
  148. <div style="min-height: 180px" ref="chartsWarningRef3"></div>
  149. </el-col>
  150. </el-row>
  151. </el-card>
  152. </el-col>
  153. </el-row>
  154. <el-row :gutter="15">
  155. <el-col :xs="24" :sm="12" :md="8" class="mb-4">
  156. <el-card shadow="nover" class="box-card-height" style="height:auto">
  157. <template #header>
  158. <div class="card-header">
  159. <span>CPU运行情况</span>
  160. </div>
  161. </template>
  162. <div style="height: 250px" ref="chartsWarningRef4"></div>
  163. </el-card>
  164. </el-col>
  165. <el-col :xs="24" :sm="12" :md="8" class="mb-4">
  166. <el-card shadow="nover" class="box-card-height" style="height:auto">
  167. <template #header>
  168. <div class="card-header">
  169. <span>内存运行情况</span>
  170. </div>
  171. </template>
  172. <div style="height: 250px" ref="chartsWarningRef5"></div>
  173. </el-card>
  174. </el-col>
  175. <el-col :xs="24" :sm="12" :md="8" class="mb-4">
  176. <el-card shadow="nover" class="box-card-height" style="height:auto">
  177. <template #header>
  178. <div class="card-header">
  179. <span>磁盘使用情况</span>
  180. </div>
  181. </template>
  182. <div style="height: 250px" ref="chartsWarningRef6"></div>
  183. </el-card>
  184. </el-col>
  185. </el-row>
  186. <div class="flex-row gap-2">
  187. <el-col :xs="24" :sm="24" :md="24">
  188. <el-card shadow="nover" class="box-card-height" style="height:auto">
  189. <template #header>
  190. <div class="card-header">
  191. <span>运行环境信息</span>
  192. </div>
  193. </template>
  194. <div class="flex-row">
  195. <el-form label-position="right" label-width="100px" class="flex1" style="max-width: 460px">
  196. <el-form-item label="操作系统">{{ hostData.os }}</el-form-item>
  197. <el-form-item label="启动时间">{{ goInfoData.startTime }}</el-form-item>
  198. <el-form-item label="运行时长">{{ timeFormat(goInfoData.runTime) }}</el-form-item>
  199. <el-form-item label="运行内存">{{ goInfoData.goMem }}</el-form-item>
  200. </el-form>
  201. <el-form label-position="right" label-width="100px" class="flex1" style="max-width: 460px">
  202. <el-form-item label="系统架构">{{ goInfoData.arch }}</el-form-item>
  203. <el-form-item label="语言环境">{{ goInfoData.goName }}</el-form-item>
  204. <el-form-item label="磁盘占用">{{ goInfoData.goSize }}</el-form-item>
  205. <el-form-item label="项目地址">{{ goInfoData.pwd }}</el-form-item>
  206. </el-form>
  207. <el-form label-position="right" label-width="100px" class="flex1" style="max-width: 460px">
  208. <el-form-item label="架构版本">{{ hostData.kernelArch }}</el-form-item>
  209. <el-form-item label="GO 版本">{{ goInfoData.goVersion }}</el-form-item>
  210. <el-form-item label="协程数量">{{ goInfoData.goroutine }}</el-form-item>
  211. <el-form-item label="服务器IP">{{ hostData.intranet_ip }} (内) &nbsp;&nbsp;&nbsp; {{ hostData.public_ip }} (公) </el-form-item>
  212. </el-form>
  213. </div>
  214. </el-card>
  215. </el-col>
  216. </div>
  217. </div>
  218. </template>
  219. <script lang="ts">
  220. import { ref, toRefs, reactive, onMounted, getCurrentInstance, defineComponent } from 'vue';
  221. import * as echarts from 'echarts';
  222. import 'echarts-wordcloud';
  223. import dayjs from 'dayjs';
  224. import getOrigin from '/@/utils/origin'
  225. let interval: any = null;
  226. let es: any = null;
  227. export default defineComponent({
  228. name: 'monitor',
  229. components: {},
  230. setup() {
  231. const { proxy } = getCurrentInstance() as any;
  232. const state: any = reactive({
  233. sysInfo: {},
  234. });
  235. const loading = ref(true)
  236. let myChart1: any;
  237. let myChart2: any;
  238. let myChart3: any;
  239. let myChart4: any;
  240. let myChart5: any;
  241. let myChart6: any;
  242. const hostData = reactive({
  243. "bootTime": "2022-11-24T11:12:13+08:00",
  244. "hostId": "8be74718-1a53-4208-be22-9c126d891ddd",
  245. "hostname": "iZ2zee04uvnkmhvglw9oghZ",
  246. "intranet_ip": "172.17.47.62",
  247. "kernelArch": "x86_64",
  248. "kernelVersion": "3.10.0-1127.19.1.el7.x86_64",
  249. "os": "linux",
  250. "platform": "centos",
  251. "platformFamily": "rhel",
  252. "platformVersion": "7.7.1908",
  253. "procs": 138,
  254. "public_ip": "101.200.198.249",
  255. "uptime": 6393278,
  256. "virtualizationRole": "guest",
  257. "virtualizationSystem": ""
  258. });
  259. const goInfoData = reactive({
  260. "goOs": "-", "arch": "-", "goVersion": "-", "goMem": "-", "goName": "-", "goSize": "-", "goroutine": '-', "pwd": "-", "rootPath": "-",
  261. "runTime": '', "startTime": "-", "intranet_ip": "-"
  262. });
  263. function goInfo(event: { data: any; }) {
  264. const data = JSON.parse(event.data);
  265. Object.assign(goInfoData, data);
  266. loading.value = false
  267. }
  268. function hostInfo(event: { data: any; }) {
  269. const data = JSON.parse(event.data);
  270. Object.assign(hostData, data);
  271. loading.value = false
  272. }
  273. const myChart4Data: any = {
  274. name: [],
  275. value: [],
  276. }
  277. const myChart5Data: any = {
  278. name: [],
  279. value: [],
  280. }
  281. const myChart6Data: any = {
  282. name: [],
  283. value: [],
  284. }
  285. const moveOption = {
  286. tooltip: {
  287. trigger: 'axis',
  288. },
  289. grid: {
  290. top: 5,
  291. bottom: 5,
  292. left: 5,
  293. right: 30,
  294. containLabel: true
  295. },
  296. xAxis: {
  297. type: 'category',
  298. boundaryGap: false,
  299. splitLine: {
  300. show: false
  301. }
  302. },
  303. yAxis: {
  304. type: 'value',
  305. boundaryGap: [0, '100%'],
  306. axisLabel: {
  307. formatter: '{value}%'
  308. },
  309. splitLine: {
  310. show: false
  311. }
  312. },
  313. series: [
  314. {
  315. name: '使用率',
  316. type: 'line',
  317. showSymbol: false,
  318. data: [],
  319. smooth: true,
  320. lineStyle: {
  321. width: 0
  322. },
  323. areaStyle: {}
  324. }
  325. ]
  326. };
  327. function setOptChart1(value: number) {
  328. myChart1.setOption({
  329. series: [
  330. {
  331. data: [
  332. {
  333. value: value,
  334. name: '',//cpu
  335. },
  336. ],
  337. },
  338. ],
  339. });
  340. }
  341. function setOptChart2(value: number) {
  342. myChart2.setOption({
  343. series: [
  344. {
  345. data: [
  346. {
  347. value: value,
  348. name: '',//内存
  349. },
  350. ],
  351. },
  352. ],
  353. });
  354. }
  355. function setOptChart3(value: number) {
  356. myChart3.setOption({
  357. series: [
  358. {
  359. data: [
  360. {
  361. value: value,
  362. name: '',//磁盘
  363. },
  364. ],
  365. },
  366. ],
  367. });
  368. }
  369. function setOptChart(myChart: any, myChartData: any, value: number) {
  370. myChartData.name.push(dayjs().format('HH:mm:ss'));
  371. myChartData.value.push(value);
  372. if (myChartData.name.length > 20) {
  373. myChartData.name.shift()
  374. myChartData.value.shift()
  375. }
  376. myChart.setOption({
  377. xAxis: {
  378. data: myChartData.name
  379. },
  380. series: [
  381. {
  382. data: myChartData.value
  383. },
  384. ],
  385. });
  386. }
  387. //CPU
  388. const initChartCPU = () => {
  389. myChart1 = echarts.init(proxy.$refs.chartsWarningRef1);
  390. const option = {
  391. tooltip: {
  392. formatter: '{a} <br/>{b} : {c}%',
  393. },
  394. series: [
  395. {
  396. type: 'gauge',
  397. name: 'CPU',
  398. radius: '90%', //修改表盘大小
  399. title: {
  400. show: true, //控制表盘title(今日预计用电量)字体是否显示
  401. fontSize: 12, //控制表盘title(今日预计用电量)字体大小
  402. 'color': 'green', //控制表盘title(今日预计用电量)字体颜色
  403. offsetCenter: [-2, '30%'], //设置表盘title(今日预计用电量)位置
  404. },
  405. axisLine: {
  406. lineStyle: {
  407. show: true,
  408. with: 25,
  409. // 属性lineStyle控制线条样式
  410. color: [
  411. [0.3, '#4dabf7'],
  412. [0.6, '#69db7c'],
  413. [0.8, '#ffa94d'],
  414. [1, '#ff6b6b'],
  415. ],
  416. },
  417. },
  418. axisTick: {
  419. distance: 0,
  420. length: 4,
  421. lineStyle: {
  422. color: 'auto',
  423. width: 1
  424. }
  425. },
  426. axisLabel: {
  427. distance: 12,
  428. color: '#888',
  429. fontSize: 12
  430. },
  431. splitLine: { // 分割线
  432. length: 5,
  433. distance: 2,
  434. lineStyle: {
  435. width: 1,
  436. color: 'auto'
  437. }
  438. },
  439. splitNumber: 5, //分割线之间的刻度
  440. detail: {
  441. valueAnimation: true,
  442. formatter: '{value}%',
  443. textStyle: {
  444. fontSize: 20,
  445. color: 'red',
  446. },
  447. offsetCenter: ['0', '80%'], //表盘数据(30%)位置
  448. },
  449. // data: [
  450. // {
  451. // value: 15,
  452. // name: 'CPU使用率',
  453. // },
  454. // ],
  455. },
  456. ],
  457. };
  458. myChart1.setOption(option);
  459. };
  460. //内存
  461. const initChartRAM = () => {
  462. myChart2 = echarts.init(proxy.$refs.chartsWarningRef2);
  463. const option = {
  464. tooltip: {
  465. formatter: '{a} <br/>{b} : {c}%',
  466. },
  467. series: [
  468. {
  469. type: 'gauge',
  470. name: '内存',
  471. radius: '90%', //修改表盘大小
  472. title: {
  473. show: true, //控制表盘title(今日预计用电量)字体是否显示
  474. fontSize: 12, //控制表盘title(今日预计用电量)字体大小
  475. 'color': 'green', //控制表盘title(今日预计用电量)字体颜色
  476. offsetCenter: [-2, '30%'], //设置表盘title(今日预计用电量)位置
  477. },
  478. axisLine: {
  479. lineStyle: {
  480. show: true,
  481. with: 25,
  482. // 属性lineStyle控制线条样式
  483. color: [
  484. [0.3, '#4dabf7'],
  485. [0.6, '#69db7c'],
  486. [0.8, '#ffa94d'],
  487. [1, '#ff6b6b'],
  488. ],
  489. },
  490. },
  491. axisTick: {
  492. distance: 0,
  493. length: 4,
  494. lineStyle: {
  495. color: 'auto',
  496. width: 1
  497. }
  498. },
  499. axisLabel: {
  500. distance: 12,
  501. color: '#888',
  502. fontSize: 12
  503. },
  504. splitLine: { // 分割线
  505. length: 5,
  506. distance: 2,
  507. lineStyle: {
  508. width: 1,
  509. color: 'auto'
  510. }
  511. },
  512. splitNumber: 5, //分割线之间的刻度
  513. detail: {
  514. valueAnimation: true,
  515. formatter: '{value}%',
  516. textStyle: {
  517. fontSize: 20,
  518. color: 'red',
  519. },
  520. offsetCenter: ['0', '80%'], //表盘数据(30%)位置
  521. },
  522. // data: [
  523. // {
  524. // value: 30,
  525. // name: '内存使用率',
  526. // },
  527. // ],
  528. },
  529. ],
  530. };
  531. myChart2.setOption(option);
  532. };
  533. //磁盘
  534. const initChartDISK = () => {
  535. myChart3 = echarts.init(proxy.$refs.chartsWarningRef3);
  536. const option = {
  537. tooltip: {
  538. formatter: '{a} <br/>{b} : {c}%',
  539. },
  540. series: [
  541. {
  542. type: 'gauge',
  543. name: '磁盘',
  544. radius: '90%', //修改表盘大小
  545. title: {
  546. show: true, //控制表盘title(今日预计用电量)字体是否显示
  547. fontSize: 12, //控制表盘title(今日预计用电量)字体大小
  548. 'color': 'green', //控制表盘title(今日预计用电量)字体颜色
  549. offsetCenter: [-2, '30%'], //设置表盘title(今日预计用电量)位置
  550. },
  551. axisLine: {
  552. lineStyle: {
  553. show: true,
  554. with: 25,
  555. // 属性lineStyle控制线条样式
  556. color: [
  557. [0.3, '#4dabf7'],
  558. [0.6, '#69db7c'],
  559. [0.8, '#ffa94d'],
  560. [1, '#ff6b6b'],
  561. ],
  562. },
  563. },
  564. axisTick: {
  565. distance: 0,
  566. length: 4,
  567. lineStyle: {
  568. color: 'auto',
  569. width: 1
  570. }
  571. },
  572. axisLabel: {
  573. distance: 12,
  574. color: '#888',
  575. fontSize: 12
  576. },
  577. splitLine: { // 分割线
  578. length: 5,
  579. distance: 2,
  580. lineStyle: {
  581. width: 1,
  582. color: 'auto'
  583. }
  584. },
  585. splitNumber: 5, //分割线之间的刻度
  586. detail: {
  587. valueAnimation: true,
  588. formatter: '{value}%',
  589. textStyle: {
  590. fontSize: 20,
  591. color: 'red',
  592. },
  593. offsetCenter: ['0', '80%'], //表盘数据(30%)位置
  594. },
  595. // data: [
  596. // {
  597. // value: 30,
  598. // name: '内存使用率',
  599. // },
  600. // ],
  601. },
  602. ],
  603. };
  604. myChart3.setOption(option);
  605. };
  606. //cpu运行状态
  607. const initChartCPURun = () => {
  608. myChart4 = echarts.init(proxy.$refs.chartsWarningRef4);
  609. moveOption.series[0].areaStyle = {
  610. opacity: 0.8,
  611. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  612. {
  613. offset: 0,
  614. color: 'rgb(128, 255, 165)'
  615. },
  616. {
  617. offset: 1,
  618. color: 'rgb(1, 191, 236)'
  619. }
  620. ])
  621. }
  622. myChart4.setOption(moveOption);
  623. };
  624. //内存运行状态
  625. const initChartRAMRun = () => {
  626. myChart5 = echarts.init(proxy.$refs.chartsWarningRef5);
  627. moveOption.series[0].areaStyle = {
  628. opacity: 0.8,
  629. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  630. {
  631. offset: 0,
  632. color: 'rgb(0, 221, 255)'
  633. },
  634. {
  635. offset: 1,
  636. color: 'rgb(77, 119, 255)'
  637. }
  638. ])
  639. }
  640. myChart5.setOption(moveOption);
  641. };
  642. //磁盘运行状态
  643. const initChartDISKRun = () => {
  644. myChart6 = echarts.init(proxy.$refs.chartsWarningRef6);
  645. moveOption.series[0].areaStyle = {
  646. opacity: 0.8,
  647. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  648. {
  649. offset: 0,
  650. color: 'rgb(55, 162, 255)'
  651. },
  652. {
  653. offset: 1,
  654. color: 'rgb(116, 21, 219)'
  655. }
  656. ])
  657. }
  658. myChart6.setOption(moveOption);
  659. };
  660. // 页面加载时
  661. onMounted(() => {
  662. initChartCPU();
  663. initChartRAM();
  664. initChartDISK();
  665. initChartCPURun();
  666. initChartRAMRun();
  667. initChartDISKRun();
  668. });
  669. function startWs() {
  670. es = new EventSource(getOrigin(import.meta.env.VITE_SERVER_URL + "/subscribe/sysenv"));
  671. es.addEventListener("host", displayHost);
  672. es.addEventListener("mem", displayMem);
  673. es.addEventListener("cpu", displayCpu);
  674. es.addEventListener("sysLoad", displaySysLoad);
  675. es.addEventListener("disk", displayDisk);
  676. es.addEventListener("go", goInfo);
  677. es.addEventListener("host", hostInfo);
  678. }
  679. startWs();
  680. function displayHost(event: { data: any; }) {
  681. const data = JSON.parse(event.data);
  682. state.sysInfo.os = data.os
  683. state.sysInfo.kernelArch = data.kernelArch
  684. state.sysInfo.sysComputerName = data.hostname
  685. state.sysInfo.goStartTime = data.bootTime
  686. state.sysInfo.goRunTime = data.uptime
  687. loading.value = false
  688. }
  689. function displayMem(event: { data: any; }) {
  690. const data = JSON.parse(event.data);
  691. setOptChart2(data.usedPercent.toFixed(2));
  692. state.sysInfo.memTotal = data.total
  693. state.sysInfo.memUsed = data.used
  694. state.sysInfo.available = data.available
  695. state.sysInfo.goUsed = data.goUsed
  696. state.sysInfo.memUsage = data.usedPercent.toFixed(2)
  697. setOptChart(myChart5, myChart5Data, state.sysInfo.memUsage);
  698. loading.value = false
  699. }
  700. function displayCpu(event: { data: any; }) {
  701. const data = JSON.parse(event.data);
  702. // console.log(dayjs().format('HH:mm:ss'))
  703. // console.log(data)
  704. state.sysInfo.cpuNum = data.Number
  705. state.sysInfo.cpuCores = data.Cores
  706. state.sysInfo.cpuUsed = data.UsedPercent[0].toFixed(2)
  707. setOptChart1(data.UsedPercent[0].toFixed(2));
  708. setOptChart(myChart4, myChart4Data, state.sysInfo.cpuUsed);
  709. loading.value = false
  710. }
  711. function displaySysLoad(event: { data: any; }) {
  712. const data = JSON.parse(event.data)
  713. state.sysInfo.cpuAvg5 = data.load5.toFixed(2)
  714. state.sysInfo.cpuAvg15 = data.load15.toFixed(2)
  715. loading.value = false
  716. }
  717. function displayDisk(event: { data: any; }) {
  718. const data = JSON.parse(event.data)
  719. state.sysInfo.diskTotal = data.total
  720. state.sysInfo.diskUsed = data.used
  721. state.sysInfo.diskUsedPercent = data.usedPercent.toFixed(2)
  722. setOptChart3(data.usedPercent.toFixed(2));
  723. setOptChart(myChart6, myChart6Data, state.sysInfo.diskUsedPercent);
  724. loading.value = false
  725. }
  726. // function getSystemInfo() {
  727. // api.getSysInfo().then((res: any) => {
  728. // state.sysInfo = res;
  729. // setOptChart1(res.cpuUsed);
  730. // setOptChart2(res.memUsage);
  731. // setOptChart3(res.diskUsedPercent);
  732. //
  733. // });
  734. // }
  735. return {
  736. ...toRefs(state),
  737. goInfoData,
  738. hostData,
  739. loading,
  740. setOptChart1,
  741. setOptChart2,
  742. setOptChart3,
  743. // ws,
  744. };
  745. },
  746. created() {
  747. // this.getSystemInfo();
  748. // if (interval === null) {
  749. // interval = setInterval(() => {
  750. // this.getSystemInfo();
  751. // }, 5000);
  752. // }
  753. },
  754. unmounted() {
  755. // if (this.ws) {
  756. // (this.ws as WebSocket).close();
  757. // }
  758. if (interval) {
  759. clearInterval(interval);
  760. interval = null;
  761. }
  762. if (es) {
  763. es.close()
  764. }
  765. },
  766. data() {
  767. return {};
  768. },
  769. methods: {
  770. memorySizeFormat(size: any) {
  771. if (size === null || size === undefined) return ''
  772. size = parseFloat(size);
  773. let rank = 0;
  774. let rankchar = 'Bytes';
  775. while (size > 1024 && rankchar != 'TB') {
  776. size = size / 1024;
  777. rank++;
  778. if (rank == 1) {
  779. rankchar = 'KB';
  780. } else if (rank == 2) {
  781. rankchar = 'MB';
  782. } else if (rank == 3) {
  783. rankchar = 'GB';
  784. } else if (rank == 4) {
  785. rankchar = 'TB';
  786. }
  787. }
  788. return size.toFixed(2) + ' ' + rankchar;
  789. },
  790. timeFormat(second: any) {
  791. if (!second) return '-'
  792. second = parseFloat(second);
  793. let rank = 0;
  794. let rankchar = '秒';
  795. while ((second > 60 && rankchar != '小时' && rankchar != '天') || (second > 24 && rankchar == '小时')) {
  796. if (rankchar == '小时') {
  797. second = second / 24;
  798. } else {
  799. second = second / 60;
  800. }
  801. rank++;
  802. if (rank == 1) {
  803. rankchar = '分';
  804. } else if (rank == 2) {
  805. rankchar = '小时';
  806. } else if (rank == 3) {
  807. rankchar = '天';
  808. }
  809. }
  810. return second.toFixed(2) + ' ' + rankchar;
  811. },
  812. },
  813. });
  814. </script>
  815. <style scoped lang="scss">
  816. .el-card {
  817. height: 300px;
  818. overflow-y: auto;
  819. }
  820. .mb-4 {
  821. margin-bottom: 15px;
  822. }
  823. .cell {
  824. box-sizing: border-box;
  825. overflow: hidden;
  826. text-overflow: ellipsis;
  827. white-space: normal;
  828. word-break: break-all;
  829. line-height: 36px;
  830. padding-left: 10px;
  831. padding-right: 10px;
  832. }
  833. .cell-card {
  834. box-sizing: border-box;
  835. overflow: hidden;
  836. text-overflow: ellipsis;
  837. white-space: normal;
  838. word-break: break-all;
  839. line-height: 36px;
  840. }
  841. .box-card {
  842. min-height: 380px;
  843. }
  844. .box-card-meter {
  845. height: 230px;
  846. min-height: 180px;
  847. }
  848. </style>