ct.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <template>
  2. <div class="ct">
  3. <el-row :gutter="20">
  4. <el-col :lg="6" :md="12" :xs="24">
  5. <div class="block">
  6. <p class="label">负载状态</p>
  7. <el-popover width="100" trigger="hover">
  8. <div class="system-perf-progress-popover">
  9. <ul>
  10. <li>CPU:{{ cpu.perc | fixed2 }} %</li>
  11. <li>内存:{{ mem.perc | fixed2 }} %</li>
  12. </ul>
  13. </div>
  14. <el-progress
  15. slot="reference"
  16. type="circle"
  17. :percentage="lb.perc | fixed2"
  18. :color="lb.perc | status_color"
  19. ></el-progress>
  20. </el-popover>
  21. </div>
  22. </el-col>
  23. <el-col :lg="6" :md="12" :xs="24">
  24. <div class="block">
  25. <p class="label">CPU存使用率</p>
  26. <el-progress
  27. type="circle"
  28. :percentage="cpu.perc | fixed2"
  29. :color="cpu.perc | status_color"
  30. ></el-progress>
  31. </div>
  32. </el-col>
  33. <el-col :lg="6" :md="12" :xs="24">
  34. <div class="block">
  35. <p class="label">内存使用率</p>
  36. <el-popover width="100" trigger="hover">
  37. <div class="system-perf-progress-popover">
  38. <ul>
  39. <li>总数:{{ mem.total | unit_size }}</li>
  40. <li>已使用:{{ mem.used | unit_size }}</li>
  41. </ul>
  42. </div>
  43. <el-progress
  44. slot="reference"
  45. type="circle"
  46. :percentage="mem.perc | fixed2"
  47. :color="mem.perc | status_color"
  48. ></el-progress>
  49. </el-popover>
  50. </div>
  51. </el-col>
  52. <el-col :lg="6" :md="12" :xs="24" v-for="(item, index) in disk.list" :key="index">
  53. <div class="block">
  54. <p class="label">{{ item.mount }}</p>
  55. <el-popover width="100" trigger="hover">
  56. <div class="system-perf-progress-popover">
  57. <ul>
  58. <li>总数:{{ item.size | unit_size }}</li>
  59. <li>已使用:{{ item.used | unit_size }}</li>
  60. </ul>
  61. </div>
  62. <el-progress
  63. slot="reference"
  64. type="circle"
  65. :percentage="item.use | fixed2"
  66. :color="item.use | status_color"
  67. ></el-progress>
  68. </el-popover>
  69. </div>
  70. </el-col>
  71. </el-row>
  72. </div>
  73. </template>
  74. <script>
  75. import Common from "./common";
  76. export default {
  77. filters: {
  78. status_color(v) {
  79. if (v < 50) {
  80. return "#67C23A";
  81. }
  82. if (v < 70) {
  83. return "#E6A23C";
  84. }
  85. if (v < 100) {
  86. return "#F56C6C";
  87. }
  88. }
  89. },
  90. mixins: [Common],
  91. data() {
  92. return {
  93. lb: {
  94. perc: 0
  95. },
  96. redis: {
  97. options: {},
  98. perc: 0
  99. },
  100. mysql: {
  101. options: {},
  102. number: 0,
  103. perc: 0
  104. },
  105. cpu: {
  106. options: {},
  107. perc: 0
  108. },
  109. mem: {
  110. perc: 0,
  111. total: 0,
  112. used: 0
  113. },
  114. disk: {
  115. list: [],
  116. all: 0
  117. }
  118. };
  119. },
  120. methods: {
  121. refresh(res) {
  122. const { data } = res;
  123. const item = data[data.length - 1];
  124. this.toMysql(res, item.mysql);
  125. this.toRedis(res, item.redis);
  126. this.toCPU(res, item.server.cpu);
  127. this.toDisk(item.server.disk.filter((e) => e.size));
  128. this.toMem(item.server.mem);
  129. this.toLB();
  130. },
  131. toLB() {
  132. let mem = this.mem.perc;
  133. let cpu = this.cpu.perc;
  134. if (mem >= 90) {
  135. this.lb.perc = mem;
  136. } else if (cpu >= 80) {
  137. this.lb.perc = cpu;
  138. } else {
  139. this.lb.perc = mem * 0.4 + cpu * 0.6;
  140. }
  141. },
  142. toCPU(undefined, cpu) {
  143. this.cpu.perc = cpu.currentload;
  144. },
  145. toMem(mem) {
  146. this.mem.perc = (mem.buffcache / mem.total) * 100;
  147. this.mem.total = mem.total;
  148. this.mem.used = mem.buffcache;
  149. },
  150. toDisk(disk) {
  151. this.disk.all = disk.reduce((a, b) => a + b.size, 0);
  152. this.disk.list = disk.map((e) => {
  153. e.use = e.use.toFixed(2);
  154. return e;
  155. });
  156. },
  157. toRedis(undefined, item) {
  158. this.redis.perc = parseFloat(item.Memory.used_memory_dataset_perc);
  159. },
  160. toMysql(undefined, item) {
  161. let free = 0;
  162. let used = 0;
  163. item.mysqlSize.forEach((e) => {
  164. free += parseFloat(e.data_free);
  165. used += parseFloat(e.data_size);
  166. });
  167. this.mysql.number = item.mysqlSize.length;
  168. this.mysql.perc = (used / (free + used)).toFixed(2);
  169. }
  170. }
  171. };
  172. </script>
  173. <style lang="scss">
  174. .system-perf-progress-popover {
  175. ul {
  176. li {
  177. list-style: none;
  178. line-height: 30px;
  179. }
  180. }
  181. }
  182. </style>
  183. <style lang="scss" scoped>
  184. .ct {
  185. background-color: #fff;
  186. .block {
  187. background-color: #fff;
  188. width: 100%;
  189. border-radius: 3px;
  190. display: flex;
  191. justify-content: center;
  192. align-items: center;
  193. flex-direction: column;
  194. padding: 20px;
  195. box-sizing: border-box;
  196. position: relative;
  197. height: 220px;
  198. cursor: pointer;
  199. .label {
  200. font-size: 16px;
  201. height: 40px;
  202. }
  203. .perc {
  204. position: absolute;
  205. padding: 5px 10px;
  206. background-color: #fff;
  207. }
  208. .c {
  209. height: 50px;
  210. .echarts {
  211. height: 100%;
  212. width: 100%;
  213. }
  214. }
  215. }
  216. }
  217. </style>