index.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <template>
  2. <div class="app-container host-analysis">
  3. <div class="top-right-btn">
  4. <el-button type="primary" @click="handleIMap">指标映射</el-button>
  5. </div>
  6. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick" type="border-card" v-if="modelData.length">
  7. <el-tab-pane :label="item.modelName" :name="item.modelName" v-for="item in modelData" :key="item.modelId"/>
  8. <div class="tab-content">
  9. <div class="config-bar">
  10. <div v-for="item in configData" :key="item.hcId" :class="['c-row',{'active':item.metricsId === activeConfig}]"
  11. @click="changeConfig(item)">
  12. <span class="s-span"> > </span>
  13. {{ item.viewName }}
  14. </div>
  15. </div>
  16. <div class="tab-chart">
  17. <div ref="chartSort" :style="{height: !chartEmpty?'400px' : '0px' }"/>
  18. <el-empty description="暂无数据" v-if="chartEmpty"/>
  19. </div>
  20. </div>
  21. </el-tabs>
  22. <el-empty description="暂无数据" v-else/>
  23. </div>
  24. <el-dialog v-model="visible" title="指标映射" width="600">
  25. <index-mapping :configData="configData" @refresh="initConfig"/>
  26. </el-dialog>
  27. </template>
  28. <script setup lang="ts">
  29. import {listConfig, listModel, listNetwork} from "@/api/risk/r5"
  30. import {parseTime} from "@/utils/ruoyi"
  31. import {onMounted} from "vue";
  32. import * as echarts from "echarts";
  33. import indexMapping from "./components/indexMapping.vue"
  34. const modelData = ref([])
  35. const activeName = ref('')
  36. const configData = ref([])
  37. const activeConfig = ref(null)
  38. const chartSort = ref(null)
  39. const visible = ref(false)
  40. const chartEmpty = ref(false)
  41. onMounted(() => {
  42. initConfig()
  43. })
  44. async function initConfig() {
  45. await getConfig()
  46. await getModelList()
  47. }
  48. function handleIMap() {
  49. visible.value = true
  50. }
  51. async function getModelList() {
  52. const res = await listModel()
  53. modelData.value = res.data
  54. activeName.value = modelData.value[0].modelName
  55. activeConfig.value = configData.value[0].metricsId
  56. await getNetwork(modelData.value[0].modelId, configData.value[0].metricsId)
  57. }
  58. async function getConfig() {
  59. const res = await listConfig({configType: 'network', pageNum: 1, pageSize: 100})
  60. configData.value = res.rows
  61. }
  62. function handleClick(tab) {
  63. activeConfig.value = configData.value[0].metricsId
  64. getNetwork(modelData.value[tab.index].modelId, configData.value[0].metricsId)
  65. }
  66. function changeConfig(item) {
  67. activeConfig.value = item.metricsId
  68. const modelId = modelData.value.find(p => p.modelName === activeName.value).modelId
  69. getNetwork(modelId, activeConfig.value)
  70. }
  71. async function getNetwork(modelId, metricsId) {
  72. const res = await listNetwork(modelId, metricsId)
  73. initChart(res.data)
  74. }
  75. function initChart(res) {
  76. const myChart = echarts.init(chartSort.value);
  77. if (res.length) {
  78. chartEmpty.value = false
  79. const option = {
  80. tooltip: {
  81. trigger: 'axis'
  82. },
  83. legend: {
  84. data: res.map(p => p.name),
  85. textStyle: {
  86. color: "#849ac4"
  87. }
  88. },
  89. grid: {
  90. left: '3%',
  91. right: '4%',
  92. bottom: '3%',
  93. top: '15%',
  94. containLabel: true
  95. },
  96. xAxis: {
  97. type: 'category',
  98. boundaryGap: false,
  99. data: res[0].data.map(p => parseTime(p.time, '{y}-{m}-{d}')),
  100. axisLine: {
  101. show: true,
  102. lineStyle: {
  103. color: "#849ac4",
  104. width: 0,
  105. }
  106. },
  107. axisTick: {
  108. show: false,
  109. },
  110. },
  111. yAxis: {
  112. type: 'value',
  113. axisLine: {
  114. show: true,
  115. lineStyle: {
  116. color: "#849ac4",
  117. width: 0,
  118. }
  119. },
  120. splitLine: {
  121. lineStyle: {
  122. color: "#849ac480",
  123. type: 'dashed',
  124. }
  125. },
  126. },
  127. series: res.map(p => {
  128. return {
  129. name: p.name,
  130. type: 'line',
  131. smooth: true,
  132. symbolSize: 0,
  133. data: p.data.map(j => j.value)
  134. }
  135. })
  136. };
  137. myChart.setOption(option)
  138. } else {
  139. chartEmpty.value = true
  140. myChart.clear()
  141. }
  142. }
  143. </script>
  144. <style lang="scss">
  145. @import "../r5/css/style.scss";
  146. </style>