From 012c84b59018018cd75f0b8c70f7492fcb3e3e6f Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期五, 05 八月 2022 16:18:29 +0800
Subject: [PATCH] 添加整改

---
 src/views/manageCenter/index.vue | 1047 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,043 insertions(+), 4 deletions(-)

diff --git a/src/views/manageCenter/index.vue b/src/views/manageCenter/index.vue
index 892093a..61c89a1 100644
--- a/src/views/manageCenter/index.vue
+++ b/src/views/manageCenter/index.vue
@@ -1,10 +1,1049 @@
 <template>
-  <div class="manageCenter">绠$悊涓績</div>
+  <div class="manageCenter">
+    <!-- 椤靛ご -->
+    <IndexHeader :opacity="false"></IndexHeader>
+
+    <div class="centerTitle">
+      <div class="heart">
+        <div class="welcome">{{ userName }}, 娆㈣繋鎮ㄥ洖鍒扮鐞嗕腑蹇冦��</div>
+        <div class="time">{{ timeMsg }}</div>
+      </div>
+    </div>
+
+    <!-- 鐗堝績 -->
+    <div class="heart">
+      <div class="products">
+        <div class="title">鍏ㄩ儴浜у搧</div>
+        <div class="productList">
+          <div class="productItem" v-for="(item, index) in productList" :key="index" @click="jump(item)">
+            <img :src="item.icon" alt="" />
+            <div class="name">{{ item.name }}</div>
+          </div>
+        </div>
+      </div>
+
+      <div class="heart">
+        <div class="products">
+          <div class="title">缁熻鍒嗘瀽</div>
+          <div class="productList">
+            <p class="p-statis" style=" vertical-align: top">
+              <span>鏃堕棿锛�</span>
+              <el-date-picker
+                size="mini"
+                v-model="searchTime"
+                @change="searchHandler"
+                type="datetimerange"
+                start-placeholder="寮�濮嬫棩鏈�"
+                end-placeholder="缁撴潫鏃ユ湡"
+                :default-time="['00:00:00', '23:59:59']"
+              ></el-date-picker>
+            </p>
+            <!-- <p class="p-statis" style="margin-left: 10px">
+              <b style="width: 60px">鍦烘櫙锛�</b>
+              <el-select
+                v-model="taskValues"
+                multiple
+                @change="searchingBtn"
+                :disabled="typeDisable"
+                collapse-tags
+                size="mini"
+                placeholder="璇烽�夋嫨"
+              >
+                <el-option
+                  v-for="item in VideoPhotoData.tasks"
+                  style="font-size: 12px"
+                  :key="item.id + 'x'"
+                  :value="item.id"
+                  :label="item.isDelete ? item.name + '锛堝凡鍒犻櫎锛�' : item.name"
+                  :title="item.isDelete ? item.name + '锛堝凡鍒犻櫎锛�' : item.name"
+                ></el-option>
+              </el-select>
+            </p> -->
+
+            <p class="p-statis" style="margin-left: 20px">
+              <span>閮ㄩ棬锛�</span>
+              <el-cascader
+                size="mini"
+                style="width:400px"
+                v-model="searchTree"
+                :options="menuTree"
+                :props="{ value: 'id', label: 'name', checkStrictly: true }"
+                collapse-tags
+                clearable
+                @change="handleTreeChange"
+              ></el-cascader>
+            </p>
+            <p class="p-statis" style="margin-left: 20px">
+              <span>绛夌骇锛�</span>
+              <el-select
+                v-model="alarmValues"
+                clearable
+                collapse-tags
+                size="mini"
+                style="width:140px"
+                placeholder="璇烽�夋嫨"
+              >
+                <el-option
+                  v-for="item in levelOptions"
+                  :key="item.id"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </p>
+            <p class="p-statis" style="">
+              <el-button type="primary" size="mini" @click="searchHandler">鎼滅储</el-button>
+            </p>
+          </div>
+        </div>
+      </div>
+
+      <div class="equipmentInfo">
+        <div class="equipmentCard">
+          <div class="label">棰勮鎬婚噺</div>
+          <div class="number">
+            {{ warningTotal }}
+            <div class="upIcon iconfont">&#xe62e;</div>
+          </div>
+
+          <img src="/images/manageCenter/total2.png" alt="" />
+        </div>
+
+        <div class="equipmentCard">
+          <div class="label">鎺掓煡鏁伴噺</div>
+          <div class="number">
+            {{ warningChecked }}
+            <div class="upIcon iconfont">&#xe62e;</div>
+          </div>
+
+          <img src="/images/manageCenter/total3.png" alt="" />
+        </div>
+
+        <div class="equipmentCard">
+          <div class="label">鏁存敼鏁伴噺</div>
+          <div class="number">
+            {{ warningSolved }}
+            <div class="downIcon iconfont">&#xe651;</div>
+          </div>
+
+          <img src="/images/manageCenter/total4.png" alt="" />
+        </div>
+
+        <div class="equipmentCard">
+          <div class="label">澶勭悊鐜�</div>
+          <div class="number">
+            {{ warningManage }}
+            <div class="downIcon iconfont">&#xe651;</div>
+          </div>
+
+          <img src="/images/manageCenter/total1.png" alt="" />
+        </div>
+      </div>
+
+      <div class="equipmentStatus">
+        <div class="bar-chart">
+          <div class="title">棰勮鏁伴噺瓒嬪娍</div>
+          <!-- <div class="control">
+            <div class="label" @click="select('day', 'selectBar')" :class="{ active: selectBar === 'day' }">
+              浠婃棩
+            </div>
+            <div class="label" @click="select('week', 'selectBar')" :class="{ active: selectBar === 'week' }">
+              鏈懆
+            </div>
+            <div class="label" @click="select('month', 'selectBar')" :class="{ active: selectBar === 'month' }">
+              鏈湀
+            </div>
+          </div> -->
+          <div id="bar"></div>
+        </div>
+      </div>
+
+      <div class="hashRate">
+        <div class="left">
+          <div class="title">棰勮鏁版嵁鍗犳瘮:</div>
+          <div class="info">
+            <div class="equipmentInfo" style="margin-top:25px">
+              <div class="equipmentCard">
+                <div class="label">鏁存敼鎬婚噺</div>
+                <div class="number">
+                  {{ solvedTotal }}
+                  <!-- <div class="upIcon iconfont">&#xe62e; 2</div> -->
+                </div>
+
+                <!-- <img src="/images/manageCenter/total2.png" alt="" /> -->
+              </div>
+              <div class="equipmentCard">
+                <div class="label">鏃ュ潎娆℃暟</div>
+                <div class="number">
+                  {{ solvedPre }}
+                  <!-- <div class="upIcon iconfont">&#xe62e; 2</div> -->
+                </div>
+
+                <!-- <img src="/images/manageCenter/total2.png" alt="" /> -->
+              </div>
+            </div>
+
+            <div class="table-area">
+              <el-table
+                id="table"
+                ref="table"
+                tooltip-effect="dark"
+                :data="tableDataList"
+                :fit="true"
+                :stripe="true"
+                :max-height="350"
+                class="gutter"
+              >
+                <el-table-column prop="date" label="鏃ユ湡" show-overflow-tooltip></el-table-column>
+
+                <el-table-column prop="count" align="center" label="鏁存敼鏁伴噺" show-overflow-tooltip></el-table-column>
+              </el-table>
+              <el-pagination
+                @current-change="refrash"
+                @size-change="handleSizeChange"
+                :current-page="page"
+                :page-size="size"
+                layout="total, sizes, prev, pager, next, jumper"
+                :page-sizes="[5, 10, 15, 20, 25]"
+                :total="solvedTotal"
+                background
+              ></el-pagination>
+            </div>
+          </div>
+        </div>
+        <div class="right">
+          <div class="title">绠楁硶棰勮鏁版嵁鍗犳瘮</div>
+          <div id="pieChart"></div>
+        </div>
+      </div>
+    </div>
+
+    <!-- 椤靛熬 -->
+    <Footer :isBlack="true"></Footer>
+  </div>
 </template>
 
 <script>
-export default {};
+import IndexHeader from "@/components/IndexHeader"
+import Footer from "@/components/Footer"
+import * as echarts from "echarts"
+import "echarts/map/js/china.js"
+import * as Base64 from "js-base64"
+
+import { analysisReport } from "@/api/es"
+import { getLocalCameraTree } from "@/api/area"
+import { getClusterDevList } from "@/api/clusterManage"
+
+export default {
+  components: {
+    IndexHeader,
+    Footer
+  },
+  computed: {
+    solvedPre() {
+      if (this.solvedTotal == 0 || this.tableDataList.length == 0) {
+        return 0
+      }
+      return parseInt(this.solvedTotal / this.tableDataList.length)
+    },
+    warningManage() {
+      if (this.warningChecked == 0 || this.warningTotal == 0) {
+        return 0
+      }
+      return parseInt(this.warningChecked / this.warningTotal) * 100 + "%"
+    }
+  },
+  data() {
+    return {
+      lineChart: {},
+      pieChart: {},
+      searchTree: "",
+      selectedOrg: "",
+      selectNodes: [],
+      searchTime: [
+        this.$moment()
+          .subtract(6, "days")
+          .format("YYYY-MM-DD 00:00:00"),
+        this.$moment().format("YYYY-MM-DD HH:mm:ss")
+      ],
+      alarmValues: "",
+      userName: "",
+      timeMsg: "",
+      selectBar: "day",
+      selectForm: "day",
+      productList: [
+        {
+          name: "璁惧绠$悊",
+          icon: "/images/manageCenter/manage.png",
+          openPath: "/equipmentManagement",
+          path: "/equipmentList",
+          permission: "deviceMng"
+        },
+
+        {
+          name: "绠楀姏绠$悊",
+          icon: "/images/manageCenter/manage2.png",
+          openPath: "/hashrate",
+          path: "/hashrateDetail",
+          permission: "analysisMng"
+        },
+
+        {
+          name: "缁熻鏌ヨ",
+          icon: "/images/manageCenter/search.png",
+          openPath: "/searchOpen",
+          path: "/search",
+          permission: "statisticMng"
+        },
+
+        {
+          name: "鎺ㄩ�佺鐞�",
+          icon: "/images/manageCenter/manage2.png",
+          openPath: "/report",
+          path: "/report",
+          permission: "statisticMng"
+        }
+      ],
+      cameraTree: [],
+      menuTree: [],
+      levelOptions: [
+        { id: 0, value: "", label: "鍏ㄩ儴" },
+        { id: 1, value: "涓�绾�", label: "涓�绾�" },
+        { id: 2, value: "浜岀骇", label: "浜岀骇" },
+        { id: 3, value: "涓夌骇", label: "涓夌骇" },
+        { id: 4, value: "鍥涚骇", label: "鍥涚骇" },
+        { id: 5, value: "浜旂骇", label: "浜旂骇" }
+      ],
+      barOption: {
+        grid: {
+          left: "3%",
+          right: "3%",
+          bottom: "10%",
+          containLabel: true
+        },
+        legend: {
+          x: "right",
+          y: "top",
+          itemHeight: 2,
+          itemWidth: 2,
+          icon: "circle"
+        },
+        tooltip: {},
+        xAxis: {
+          type: "category",
+          boundaryGap: false,
+          axisTick: {
+            show: false
+          },
+          axisLabel: {
+            color: "#666"
+          },
+          data: []
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          },
+          axisLine: {
+            //y杞�
+            show: false
+          },
+          axisLabel: {
+            color: "#666"
+          },
+          splitLine: {
+            //缃戞牸绾�
+            lineStyle: {
+              color: "rgb(230, 230, 230)",
+              type: "dashed" //璁剧疆缃戞牸绾跨被鍨� dotted锛氳櫄绾�   solid:瀹炵嚎
+            },
+            show: true //闅愯棌鎴栨樉绀�
+          }
+        },
+        // Declare several bar series, each will be mapped
+        // to a column of dataset.source by default.
+        series: [
+          {
+            type: "line",
+            data: [],
+            areaStyle: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                {
+                  offset: 0,
+                  color: "#0066FF"
+                },
+                {
+                  offset: 1,
+                  color: "rgba(0, 102, 255, 0.25)"
+                }
+              ])
+            },
+            color: {
+              type: "linear",
+              x: 0.02,
+              y: 0.02,
+              x2: 1,
+              y2: 1,
+              colorStops: [
+                {
+                  offset: 0,
+                  color: "#0066FF" // 0% 澶勭殑棰滆壊
+                  // radius: ["50%", "80%"]
+                },
+                {
+                  offset: 1,
+                  color: "rgba(0, 102, 255, 0.25)" // 100% 澶勭殑棰滆壊
+                }
+              ],
+              global: false // 缂虹渷涓� false
+            },
+            itemStyle: {
+              //鏌卞舰鍥惧渾瑙掞紝榧犳爣绉讳笂鍘绘晥鏋滐紝濡傛灉鍙槸涓�涓暟瀛楀垯璇存槑鍥涗釜鍙傛暟鍏ㄩ儴璁剧疆涓洪偅涔堝
+              normal: {
+                //鏌卞舰鍥惧渾瑙掞紝鍒濆鍖栨晥鏋�
+                barBorderRadius: [15, 15, 0, 0]
+              }
+            }
+          }
+        ]
+      },
+      pieOption: {
+        legend: {
+          top: "bottom"
+        },
+        color: [
+          "rgb(54, 60, 231)",
+          "rgb(54, 178, 74)",
+          "rgb(255, 178, 36)",
+          "rgb(240, 190, 231)",
+          "rgb(255, 124, 31)",
+          "rgb(165, 96, 255)"
+        ],
+        series: [
+          {
+            name: "Nightingale Chart",
+            type: "pie",
+            radius: [20, 160],
+            center: ["50%", "50%"],
+            roseType: "area",
+            itemStyle: {
+              borderRadius: 8
+            },
+            label: {
+              show: false
+            },
+            data: []
+          }
+        ]
+      },
+      tableDataList: [],
+      page: 1,
+      size: 5,
+      solvedTotal: 0,
+      warningTotal: 0,
+      warningChecked: 0,
+      warningSolved: 0
+    }
+  },
+  created() {
+    this.getInfo()
+  },
+  mounted() {
+    this.searchHandler()
+    this.initBar()
+    this.initPie()
+    this.getCameras()
+  },
+  methods: {
+    async getCameras() {
+      let clusterId = ""
+      let clusterReq = await getClusterDevList()
+      if (clusterReq && clusterReq.success) {
+        if (clusterReq.data.clusterList.length > 0) {
+          clusterId = clusterReq.data.clusterList[0].cluster_id
+        }
+      }
+      let camereReq = await getLocalCameraTree({ clusterId: clusterId })
+      if (camereReq && camereReq.success) {
+        this.cameraTree = camereReq.data.treeMenu
+        let tmpTree = JSON.parse(JSON.stringify(camereReq.data.treeMenu))
+        for (let i = 0; i < tmpTree.length; i++) this.clearNode(tmpTree[i])
+        this.menuTree = tmpTree
+      }
+    },
+    clearNode(tree) {
+      if (tree.children) {
+        tree.children = tree.children.filter((item) => {
+          return item.type == "MENU"
+        })
+      }
+      if (tree.children && tree.children.length > 0) {
+        for (let i = 0; i < tree.children.length; i++) this.clearNode(tree.children[i])
+      } else {
+        delete tree.children
+      }
+    },
+    collSelectedNodes() {
+      let selectedNodeId = this.selectedOrg
+      let selectedNode = {}
+      let orgNodeIds = []
+
+      if (this.selectedOrg == "") {
+        return orgNodeIds
+      }
+
+      function findNode(node) {
+        if (node.id == selectedNodeId) {
+          selectedNode = node
+
+          return
+        }
+
+        if (node.children) {
+          node.children.forEach((n) => {
+            findNode(n)
+          })
+        }
+      }
+
+      function collNode(node) {
+        if (node.type != "MENU") {
+          orgNodeIds.push(node.id)
+          return
+        }
+
+        if (node.children) {
+          node.children.forEach((n) => {
+            collNode(n)
+          })
+        }
+      }
+
+      this.cameraTree.forEach((n) => {
+        findNode(n)
+      })
+
+      collNode(selectedNode)
+
+      return orgNodeIds
+    },
+    searchHandler() {
+      let query = {
+        treeNodes: this.collSelectedNodes(),
+        searchTime: this.format(this.searchTime),
+        alarmLevel: this.alarmValues
+      }
+
+      analysisReport(query).then((rsp) => {
+        if (rsp && rsp.success) {
+          this.decodeWarningRate(rsp.data.warningRate)
+          this.decodeWarningChartRate(rsp.data.warningChartRate)
+          this.decodeWarningStatics(rsp.data.warningTable)
+          this.decodeWarningTable(rsp.data.warningStatics)
+        }
+      })
+    },
+    decodeWarningTable(b64data) {
+      this.solvedTotal = 0
+      this.tableDataList = []
+      if (b64data) {
+        let decodeString = Base64.decode(b64data)
+        if (decodeString != "") {
+          let decodeResult = JSON.parse(decodeString)
+          decodeResult = []
+          if (decodeResult) {
+            decodeResult.forEach((element) => {
+              this.solvedTotal = this.solvedTotal + element.doc_count
+              this.tableDataList.push({ date: element.key_as_string, count: element.doc_count })
+            })
+          }
+        }
+      }
+    },
+    // 鎶樼嚎鍥�
+    decodeWarningStatics(b64data) {
+      this.lineChart.clear()
+      this.barOption.xAxis.data = []
+      this.barOption.series[0].data = []
+      if (b64data) {
+        let decodeString = Base64.decode(b64data)
+        if (decodeString != "") {
+          let decodeResult = JSON.parse(decodeString)
+          if (decodeResult) {
+            decodeResult.forEach((element) => {
+              this.barOption.xAxis.data.push(element.key_as_string)
+              this.barOption.series[0].data.push(element.doc_count)
+            })
+          }
+        }
+      }
+
+      this.lineChart.setOption(this.barOption)
+    },
+    // 楗煎浘
+    decodeWarningChartRate(b64data) {
+      this.pieChart.clear()
+      this.pieOption.series[0].data = []
+      if (b64data) {
+        let decodeString = Base64.decode(b64data)
+        if (decodeString != "") {
+          let decodeResult = JSON.parse(decodeString)
+          if (decodeResult) {
+            decodeResult.forEach((element) => {
+              this.pieOption.series[0].data.push({ value: element.doc_count, name: element.key })
+            })
+          }
+        }
+      }
+      this.pieChart.setOption(this.pieOption)
+    },
+    // "warningRate": {"buckets":[{"doc_count":4,"key":3},{"doc_count":3,"key":2},{"doc_count":1,"key":1}],"total":3257}
+    //key 1=璇姤鏁版嵁,2=宸叉暣鏀�,3=鏈暣鏀�,4=宸叉帓鏌� doc_count=鏁伴噺 total=鎬婚噺
+    decodeWarningRate(b64data) {
+      if (b64data) {
+        this.warningTotal = 0
+        this.warningSolved = 0
+        this.warningChecked = 0
+
+        let decodeString = Base64.decode(b64data)
+        if (decodeString != "") {
+          let decodeResult = JSON.parse(decodeString)
+          if (decodeResult && decodeResult.total > 0) {
+            this.warningTotal = decodeResult.total
+            decodeResult.buckets.forEach((element) => {
+              switch (element.key) {
+                case 2:
+                  this.warningSolved += element.doc_count
+                  break
+                case 4:
+                  this.warningChecked += element.doc_count
+                  break
+                default:
+                  break
+              }
+            })
+          }
+          // console.log("WarningRate:", decodeResult)
+        }
+      }
+    },
+    handleTreeChange(value) {
+      this.selectedOrg = value[value.length - 1]
+    },
+    getInfo() {
+      if (sessionStorage.getItem("userInfo")) {
+        this.userName = JSON.parse(sessionStorage.getItem("userInfo")).username
+      }
+
+      let date = new Date()
+      let year = date.getFullYear() //鑾峰彇瀹屾暣鐨勫勾浠�(4浣�)
+      let month = date.getMonth() + 1 //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�)
+      let day = date.getDate() //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�)
+      let weekDay = ""
+      switch (date.getDay()) {
+        case 0:
+          weekDay = "鏄熸湡鏃�"
+          break
+
+        case 1:
+          weekDay = "鏄熸湡涓�"
+          break
+
+        case 2:
+          weekDay = "鏄熸湡浜�"
+          break
+
+        case 3:
+          weekDay = "鏄熸湡涓�"
+          break
+
+        case 4:
+          weekDay = "鏄熸湡鍥�"
+          break
+
+        case 5:
+          weekDay = "鏄熸湡浜�"
+          break
+
+        case 6:
+          weekDay = "鏄熸湡鍏�"
+          break
+      }
+      this.timeMsg = "浠婃棩, " + year + "骞�" + month + "鏈�" + day + "鏃�" + weekDay
+    },
+    select(value, type) {
+      this[type] = value
+    },
+    initBar() {
+      let bartDom = document.getElementById("bar")
+      this.lineChart = echarts.init(bartDom)
+      this.lineChart.setOption(this.barOption)
+    },
+
+    initPie() {
+      let pieDom = document.getElementById("pieChart")
+      this.pieChart = echarts.init(pieDom)
+      this.pieChart.setOption(this.pieOption)
+    },
+    jump(route) {
+      const userInfo = JSON.parse(sessionStorage.getItem("userInfo"))
+
+      const val = userInfo.permissions.find((item) => {
+        return item == route.permission
+      })
+      if (val) {
+        if (route.path === "/search") {
+          const { href } = this.$router.resolve({
+            path: "/search"
+          })
+          window.open(href, "_blank")
+          return
+        }
+        this.$router.push(route.path)
+      } else if (!userInfo.parentId) {
+        this.$router.push(route.openPath)
+      }
+    },
+    refrash() {},
+    handleSizeChange() {},
+    format(array) {
+      if (!array || array.length === 0) {
+        return []
+      }
+      return [
+        this.$moment(array[0]).format("YYYY-MM-DD HH:mm:ss"),
+        this.$moment(array[1]).format("YYYY-MM-DD HH:mm:ss")
+      ]
+    }
+  }
+}
 </script>
 
-<style>
-</style>
\ No newline at end of file
+<style lang="scss" scoped>
+.manageCenter {
+  box-sizing: border-box;
+  min-width: 1346px;
+  background-color: rgb(243, 245, 248);
+
+  .p-statis {
+    display: flex;
+    padding-right: 10px;
+    box-sizing: border-box;
+    margin-top: 20px;
+    b:hover {
+      color: #2249b4;
+    }
+  }
+  .title {
+    margin-bottom: 20px;
+    box-sizing: border-box;
+    padding-left: 10px;
+    border-left: 4px solid #0064ff;
+    font-size: 16px;
+    font-weight: 700;
+  }
+
+  .control {
+    position: absolute;
+    display: flex;
+    top: 20px;
+    right: 20px;
+
+    .label {
+      margin-left: 10px;
+      width: 44px;
+      height: 24px;
+      line-height: 24px;
+      font-size: 14px;
+      text-align: center;
+      color: #666;
+      cursor: pointer;
+
+      &.active {
+        background: #0064ff;
+        border-radius: 12px;
+        color: #fff;
+      }
+    }
+  }
+
+  .centerTitle {
+    box-sizing: border-box;
+    padding-top: 47px;
+    height: 150px;
+    background-image: url("/images/manageCenter/Rectangle 2180.png");
+
+    .welcome {
+      font-size: 14px;
+      font-weight: 700;
+    }
+
+    .time {
+      margin-top: 5px;
+      font-size: 12px;
+      color: #999;
+    }
+  }
+
+  .products {
+    box-sizing: border-box;
+    margin: 24px 0;
+    padding: 20px;
+    max-height: 282px;
+    background-color: #fff;
+
+    .productList {
+      display: flex;
+
+      .productItem {
+        margin-right: 20px;
+        width: 190px;
+        height: 90px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        border-radius: 5px;
+        border: 1px solid #e9ebee;
+        cursor: pointer;
+
+        img {
+          width: 60px;
+          height: 60px;
+        }
+
+        .name {
+          font-size: 14px;
+          color: #666;
+        }
+
+        &:hover {
+          box-shadow: 0px 2px 16px 0px rgba(0, 43, 106, 0.25);
+        }
+
+        &:nth-child(6n) {
+          margin-right: 0px;
+        }
+      }
+    }
+  }
+
+  .equipmentInfo {
+    display: flex;
+    justify-content: space-between;
+
+    .equipmentCard {
+      position: relative;
+      overflow: hidden;
+      box-sizing: border-box;
+      padding: 20px 0 20px 40px;
+      width: 302px;
+      height: 100px;
+      border-radius: 5px;
+      font-size: 14px;
+      color: #fff;
+
+      .number {
+        display: flex;
+        font-size: 32px;
+        font-weight: 700;
+        align-items: end;
+      }
+
+      .iconfont {
+        padding: 0 5px 0 2px;
+        margin-left: 10px;
+        font-size: 12px;
+        font-weight: normal;
+        margin-bottom: 6px;
+        background-color: #fff;
+        border-radius: 7px;
+
+        &.upIcon {
+          color: #ff6a00;
+        }
+
+        &.downIcon {
+          color: #3fb54a;
+        }
+      }
+
+      img {
+        position: absolute;
+        width: 96px;
+        height: 96px;
+        top: 10px;
+        right: -10px;
+        opacity: 0.2;
+      }
+
+      &:nth-child(1) {
+        background: linear-gradient(108deg, #0065ff -8%, #0065ff -8%, #99cfff 100%, #99cfff 100%);
+      }
+
+      &:nth-child(2) {
+        background: linear-gradient(108deg, #ff6a00 0%, #ff6a00 0%, #ffb599 100%, #ffb599 100%);
+      }
+
+      &:nth-child(3) {
+        background: linear-gradient(108deg, #6d44e5 1%, #6d44e5 1%, #b299ff 100%, #b299ff 100%);
+      }
+
+      &:nth-child(4) {
+        background: linear-gradient(108deg, #40b63a 0%, #40b63a 0%, #89e5bc 100%, #89e5bc 100%);
+      }
+    }
+  }
+
+  .equipmentStatus {
+    display: flex;
+    justify-content: space-between;
+    margin: 24px 0;
+    height: 466px;
+
+    .bar-chart {
+      box-sizing: border-box;
+      position: relative;
+      padding: 20px;
+      background-color: #fff;
+      width: 100%;
+      height: 466px;
+
+      #bar {
+        height: 440px;
+      }
+    }
+
+    .right {
+      box-sizing: border-box;
+      padding: 20px;
+      width: 411px;
+      height: 466px;
+      background: #ffffff;
+    }
+  }
+
+  .performence {
+    box-sizing: border-box;
+    position: relative;
+    padding: 20px;
+    background-color: #fff;
+    width: 1280px;
+    height: 570px;
+
+    .el-pagination ::v-deep {
+      margin-left: 650px;
+      margin-top: 30px;
+      text-align: center;
+      height: 24px;
+      .el-pagination__sizes {
+        margin-right: 0;
+      }
+
+      button {
+        margin: 0;
+        background-color: #fff;
+        border: 1px solid #c0c5cc;
+        border-radius: 2px;
+      }
+
+      .number {
+        background-color: #fff;
+
+        &:not(.disabled):hover {
+          color: #0065ff;
+        }
+
+        &:not(.disabled).active {
+          background-color: #0065ff;
+          color: #fff;
+        }
+      }
+
+      .el-input .el-input__inner {
+        padding-left: 0;
+
+        &:hover,
+        &:focus {
+          border-color: #0065ff;
+        }
+      }
+    }
+  }
+
+  .map {
+    overflow: hidden;
+    box-sizing: border-box;
+    padding: 20px;
+    margin: 24px 0;
+    background-color: #fff;
+    height: 598px;
+
+    #mapChart {
+      margin-top: -100px;
+      width: 1100px;
+      height: 600px;
+    }
+  }
+
+  .hashRate {
+    margin-bottom: 20px;
+    display: flex;
+    height: 540px;
+
+    .left {
+      position: relative;
+      box-sizing: border-box;
+      padding: 20px;
+      margin-right: 24px;
+      width: 737px;
+      background-color: #fff;
+
+      #scatterChart {
+        height: 500px;
+      }
+
+      .table-area {
+        margin-top: 10px;
+        margin-bottom: 5px;
+        width: 700px;
+      }
+    }
+
+    .right {
+      box-sizing: border-box;
+      padding: 20px;
+      width: 519px;
+      height: 540px;
+      background: #ffffff;
+
+      #pieChart {
+        margin-top: -40px;
+        height: 500px;
+      }
+    }
+
+    .info {
+      position: absolute;
+      top: 20px;
+      right: 20px;
+
+      .item {
+        display: flex;
+        justify-content: flex-end;
+        align-items: center;
+
+        .label {
+          margin-right: 8px;
+          font-size: 14px;
+          color: #666;
+        }
+
+        .data {
+          font-size: 18px;
+          font-weight: 700;
+        }
+      }
+    }
+  }
+}
+</style>

--
Gitblit v1.8.0