Browse Source

完成设施管理页面

971050642@qq.com 2 years ago
parent
commit
636eda04c2
1 changed files with 1083 additions and 4 deletions
  1. 1083 4
      src/pages/views/home/components/FacilityManagement.vue

+ 1083 - 4
src/pages/views/home/components/FacilityManagement.vue

@@ -1,22 +1,1101 @@
 <template>
   <Layout>
     <template #left>
-      <div>555</div>
+      <div class="left">
+        <Box
+          :width="1340"
+          :height="353"
+          name="线路基本情况"
+        >
+          <div class="title">
+            设备数量
+          </div>
+          <div
+            ref="deviceNumber"
+            class="chart"
+          />
+          <div class="bar">
+            <div class="bar-box">
+              <div
+                ref="deviceValue"
+                class="bar-chart"
+              />
+              <div class="ct">
+                <p>完好度</p>
+                <div>100.00%</div>
+              </div>
+            </div>
+
+            <div class="value">
+              <p>全部 <span>500</span></p>
+              <p>完好 <span>500</span></p>
+            </div>
+          </div>
+        </Box>
+        <Box
+          :width="1340"
+          :height="353"
+          name="车型展示"
+          style="margin-top: 52px;"
+        >
+          <div class="title">
+            数量/辆
+          </div>
+          <div
+            ref="carNumber"
+            class="chart"
+          />
+          <div class="bar">
+            <div class="bar-box">
+              <div
+                ref="carValue"
+                class="bar-chart"
+              />
+              <div class="ct">
+                <p>完好度</p>
+                <div>100.00%</div>
+              </div>
+            </div>
+
+            <div class="value">
+              <p>全部 <span>500</span></p>
+              <p>完好 <span>500</span></p>
+            </div>
+          </div>
+        </Box>
+        <Box
+          :width="1340"
+          :height="353"
+          name="线路基本情况"
+          style="margin-top: 52px;"
+        >
+          <div class="plate">
+            <div
+              ref="plantNumber"
+              class="chart"
+            />
+            <p>数量/座</p>
+          </div>
+          <div class="bar">
+            <div class="bar-box">
+              <div
+                ref="plantValue"
+                class="bar-chart"
+              />
+              <div class="ct">
+                <p>完好度</p>
+                <div>100.00%</div>
+              </div>
+            </div>
+
+            <div class="value">
+              <p>全部 <span>500</span></p>
+              <p>完好 <span>500</span></p>
+            </div>
+          </div>
+        </Box>
+      </div>
     </template>
     <template #center>
       <div>555</div>
     </template>
     <template #right>
-      <div>555</div>
+      <div class="right">
+        <Box
+          :width="1340"
+          :height="353"
+          name="洗车机"
+        >
+          <div class="bar">
+            <div class="bar-box">
+              <div
+                ref="washerBar1"
+                class="bar-chart"
+              />
+              <div class="ct">
+                <p>完好度</p>
+                <div>100.00%</div>
+              </div>
+            </div>
+
+            <div class="value">
+              <p>全部 <span>500</span></p>
+              <p>完好 <span>500</span></p>
+            </div>
+          </div>
+          <div class="content">
+            <div class="value">
+              <p
+                v-for="item in 6"
+                :key="item"
+              >
+                1
+              </p>
+            </div>
+            <div class="name">
+              累计洗车数
+            </div>
+          </div>
+          <div class="bar2">
+            <div class="value">
+              洗车机机年龄分布
+            </div>
+            <div
+              ref="washerBar2"
+              class="chart"
+            />
+          </div>
+        </Box>
+        <Box
+          :width="1340"
+          :height="353"
+          name="充电站"
+          style="margin-top: 52px;"
+        >
+          <div class="bar">
+            <div class="bar-box">
+              <div
+                ref="powerBar1"
+                class="bar-chart"
+              />
+              <div class="ct">
+                <p>完好度</p>
+                <div>100.00%</div>
+              </div>
+            </div>
+
+            <div class="value">
+              <p>全部 <span>500</span></p>
+              <p>完好 <span>500</span></p>
+            </div>
+          </div>
+          <div class="content">
+            <div class="value">
+              <p
+                v-for="item in 6"
+                :key="item"
+              >
+                1
+              </p>
+            </div>
+            <div class="name">
+              累计洗车数
+            </div>
+          </div>
+          <div class="bar2">
+            <div class="value">
+              充电设备分布
+            </div>
+            <div
+              ref="powerBar2"
+              class="chart"
+            />
+          </div>
+        </Box>
+        <Box
+          :width="1340"
+          :height="353"
+          name="充电站"
+          style="margin-top: 52px;"
+        >
+          <div class="bar">
+            <div class="bar-box">
+              <div
+                ref="vehiclePie"
+                class="bar-chart"
+              />
+              <div class="ct">
+                <p>完好度</p>
+                <div>100.00%</div>
+              </div>
+            </div>
+
+            <div class="value">
+              <p>全部 <span>500</span></p>
+              <p>完好 <span>500</span></p>
+            </div>
+          </div>
+          <div class="vehicle">
+            <div class="title">
+              设备数量
+            </div>
+            <div
+              ref="vehicleBar"
+              class="vehicle-chart "
+            />
+          </div>
+        </Box>
+      </div>
     </template>
   </Layout>
 </template>
 
 <script setup lang='ts'>
 import Layout from '@/components/layout.vue'
+import Box from '@/components/box.vue'
+import * as echarts from 'echarts'
+import { ref, nextTick } from 'vue'
+// 设备数量折线图
+const deviceNumber = ref()
+// 设备数量饼图
+const deviceValue = ref()
+// 设备数量饼图和折线图
+function setDevice() {
+  // 折线图
+  const option = {
+    color: [ 'rgb(91,143,249)', 'rgb(90,216,166)', 'rgb(93,112,146)', 'rgb(246,189,22)', 'rgb(111,94,249)' ],
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    grid: {
+      left: '1%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    legend: {
+      show: true,
+      textStyle: {
+        color: '#fff'
+      }
+
+    },
+    xAxis: [
+      {
+        type: 'category',
+        data: [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ],
+        axisLabel: {
+          color: '#fff',
+          fontSize: 16
+        },
+        axisTick: {
+          alignWithLabel: true
+        },
+        splitLine: {
+          show: false
+        }
+      }
+    ],
+    yAxis: [
+      {
+        type: 'value',
+        axisLabel: {
+          color: '#fff'
+        },
+        splitLine: {
+          show: true,
+          lineStyle: {
+            color: 'rgb(34,43,57)'
+          }
+        }
+      }
+    ],
+    series: [
+      {
+        name: '车辆',
+        type: 'bar',
+        barWidth: '40%',
+        stack: 'total',
+        data: [ 10, 52, 200, 334, 390, 330, 220 ]
+      },
+      {
+        name: '电子站牌',
+        type: 'bar',
+        barWidth: '40%',
+        stack: 'total',
+        data: [ 10, 52, 200, 334, 390, 330, 220 ]
+      },
+      {
+        name: '洗车机',
+        type: 'bar',
+        barWidth: '40%',
+        stack: 'total',
+        data: [ 10, 52, 200, 334, 390, 330, 220 ]
+      },
+      {
+        name: '充电桩',
+        type: 'bar',
+        barWidth: '40%',
+        stack: 'total',
+        data: [ 10, 52, 200, 334, 390, 330, 220 ]
+      },
+      {
+        name: '车载部件',
+        type: 'bar',
+        barWidth: '40%',
+        stack: 'total',
+        data: [ 10, 52, 200, 334, 390, 330, 220 ]
+      }
+    ]
+  }
+  const mychart = echarts.init(deviceNumber.value)
+  mychart.setOption(option)
+  // 柱状图
+  const pieOption = {
+    tooltip: {
+      trigger: 'item'
+    },
+    series: [
+      {
+        name: 'Access From',
+        type: 'pie',
+        radius: [ '65%', '85%' ],
+        avoidLabelOverlap: false,
+        label: {
+          show: false,
+          position: 'center'
+        },
+        emphasis: {
+          label: {
+            show: false,
+            fontSize: 40,
+            fontWeight: 'bold'
+          }
+        },
+        labelLine: {
+          show: false
+        },
+        data: [
+          { value: 1048, name: 'Search Engine' },
+          { value: 735, name: 'Direct' }
+
+        ]
+      }
+    ]
+  }
+  const pieChart = echarts.init(deviceValue.value)
+  pieChart.setOption(pieOption)
+}
+// 线路柱状图
+const carNumber = ref()
+// 线路饼图
+const carValue = ref()
+// 设备线路基本情况
+function setLine() {
+  // 折线图
+  const option = {
+
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    grid: {
+      left: '1%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    legend: {
+      show: true,
+      textStyle: {
+        color: '#fff'
+      }
+
+    },
+    xAxis: [
+      {
+        type: 'category',
+        data: [ 'Wed', '12.8银隆双层观光', '12.8银隆中海豚', 'Thu', 'Fri', 'Sat', 'Sun' ],
+        axisLabel: {
+          color: '#fff',
+          rotate: -45,
+          fontSize: 16
+        },
+        axisTick: {
+          alignWithLabel: true
+        },
+        splitLine: {
+          show: false
+        }
+      }
+    ],
+    yAxis: [
+      {
+        type: 'value',
+        axisLabel: {
+          color: '#fff'
+        },
+        splitLine: {
+          show: true,
+          lineStyle: {
+            color: 'rgb(34,43,57)'
+          }
+        }
+      }
+    ],
+    series: [
+      {
+        name: '数量',
+        type: 'bar',
+        barWidth: '40%',
+        itemStyle: {
+          color: {
+            type: 'linear',
+            x: 0,
+            y: 0,
+            x2: 0,
+            y2: 1,
+            colorStops: [ {
+              offset: 0, color: '#00fdff' // 0% 处的颜色
+            }, {
+              offset: 1, color: '#00aaff08' // 100% 处的颜色
+            } ],
+            global: false // 缺省为 false
+          }
+        },
+        data: [ 10, 52, 200, 334, 390, 330, 220 ]
+      }
+
+    ]
+  }
+  const mychart = echarts.init(carNumber.value)
+  mychart.setOption(option)
+  // 柱状图
+  const pieOption = {
+    tooltip: {
+      trigger: 'item'
+    },
+    series: [
+      {
+        name: 'Access From',
+        type: 'pie',
+        radius: [ '65%', '85%' ],
+        avoidLabelOverlap: false,
+        label: {
+          show: false,
+          position: 'center'
+        },
+        emphasis: {
+          label: {
+            show: false,
+            fontSize: 40,
+            fontWeight: 'bold'
+          }
+        },
+        labelLine: {
+          show: false
+        },
+        data: [
+          { value: 1048, name: 'Search Engine' },
+          { value: 735, name: 'Direct' }
+
+        ]
+      }
+    ]
+  }
+  const pieChart = echarts.init(carValue.value)
+  pieChart.setOption(pieOption)
+}
+
+// 线路柱状图
+const plantNumber = ref()
+// 线路饼图
+const plantValue = ref()
+// 设备线路基本情况
+function setPlant() {
+  // 折线图
+  const option = {
+
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    grid: {
+      left: '1%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    legend: {
+      show: true,
+      textStyle: {
+        color: '#fff'
+      }
+
+    },
+    yAxis: [
+      {
+        type: 'category',
+        data: [ '吊挂式', '独立式', '嵌入式' ],
+        axisLabel: {
+          color: '#fff',
+
+          fontSize: 16
+        },
+        axisTick: {
+          alignWithLabel: true
+        },
+        splitLine: {
+          show: false
+        }
+      }
+    ],
+    xAxis: [
+      {
+        type: 'value',
+        axisLabel: {
+          color: '#fff'
+        },
+        splitLine: {
+          show: true,
+          lineStyle: {
+            color: 'rgb(34,43,57)'
+          }
+        }
+      }
+    ],
+    series: [
+      {
+        name: '数量',
+        type: 'bar',
+        barWidth: '50%',
+        itemStyle: {
+          color: {
+            type: 'linear',
+            x: 1,
+            y: 0,
+            x2: 0,
+            y2: 0,
+            colorStops: [ {
+              offset: 0, color: '#6A5BF0' // 0% 处的颜色
+            }, {
+              offset: 1, color: '#00aaff08' // 100% 处的颜色
+            } ],
+            global: false // 缺省为 false
+          }
+        },
+        data: [ 10, 52, 200, 334, 390, 330, 220 ]
+      }
+
+    ]
+  }
+  const mychart = echarts.init(plantNumber.value)
+  mychart.setOption(option)
+  // 柱状图
+  const pieOption = {
+    tooltip: {
+      trigger: 'item'
+    },
+    series: [
+      {
+        name: 'Access From',
+        type: 'pie',
+        radius: [ '65%', '85%' ],
+        avoidLabelOverlap: false,
+        label: {
+          show: false,
+          position: 'center'
+        },
+        emphasis: {
+          label: {
+            show: false,
+            fontSize: 40,
+            fontWeight: 'bold'
+          }
+        },
+        labelLine: {
+          show: false
+        },
+        data: [
+          { value: 1048, name: 'Search Engine' },
+          { value: 735, name: 'Direct' }
+
+        ]
+      }
+    ]
+  }
+  const pieChart = echarts.init(plantValue.value)
+  pieChart.setOption(pieOption)
+}
+
+// 线路柱状图
+const washerBar1 = ref()
+// 线路饼图
+const washerBar2 = ref()
+// 设备线路基本情况
+function setWasher() {
+  // 第一个饼图
+  const pieOption = {
+    tooltip: {
+      trigger: 'item'
+    },
+    series: [
+      {
+        name: 'Access From',
+        type: 'pie',
+        radius: [ '65%', '85%' ],
+        avoidLabelOverlap: false,
+        label: {
+          show: false,
+          position: 'center'
+        },
+        emphasis: {
+          label: {
+            show: false,
+            fontSize: 40,
+            fontWeight: 'bold'
+          }
+        },
+        labelLine: {
+          show: false
+        },
+        data: [
+          { value: 1048, name: 'Search Engine' },
+          { value: 735, name: 'Direct' }
+
+        ]
+      }
+    ]
+  }
+  // 第二个饼图
+  const pieChart = echarts.init(washerBar1.value)
+  pieChart.setOption(pieOption)
+  const pieOption2 = {
+    color: [ 'rgb(86,137,239)', 'rgb(85,206,160)', 'rgb(88,107,141)' ],
+    tooltip: {
+      trigger: 'item'
+    },
+    legend: {
+      orient: 'horizontal',
+      bottom: '0',
+      icon: 'circle',
+      textStyle: {
+        color: '#fff'
+      }
+    },
+    series: [
+      {
+        type: 'pie',
+        radius: '70%',
+        label: {
+          show: true,
+          color: '#fff',
+          formatter: '{b}: {d}个',
+          fontSize: 14
+        },
+        data: [
+          { value: 1048, name: '0-5年' },
+          { value: 735, name: '6-10年' },
+          { value: 580, name: '11-15年' }
+
+        ]
+
+      }
+    ]
+  }
+  const pieChart2 = echarts.init(washerBar2.value)
+  pieChart2.setOption(pieOption2)
+}
+// 线路柱状图
+const powerBar1 = ref()
+// 线路饼图
+const powerBar2 = ref()
+// 充电站
+function setPower() {
+  // 第一个饼图
+  const pieOption = {
+    tooltip: {
+      trigger: 'item'
+    },
+    series: [
+      {
+        name: 'Access From',
+        type: 'pie',
+        radius: [ '65%', '85%' ],
+        avoidLabelOverlap: false,
+        label: {
+          show: false,
+          position: 'center'
+        },
+        emphasis: {
+          label: {
+            show: false,
+            fontSize: 40,
+            fontWeight: 'bold'
+          }
+        },
+        labelLine: {
+          show: false
+        },
+        data: [
+          { value: 1048, name: 'Search Engine' },
+          { value: 735, name: 'Direct' }
+
+        ]
+      }
+    ]
+  }
+  // 第二个饼图
+  const pieChart = echarts.init(powerBar1.value)
+  pieChart.setOption(pieOption)
+  const pieOption2 = {
+    color: [ 'rgb(86,137,239)', 'rgb(85,206,160)', 'rgb(88,107,141)' ],
+    tooltip: {
+      trigger: 'item'
+    },
+    legend: {
+      orient: 'horizontal',
+      bottom: '0',
+      icon: 'circle',
+      textStyle: {
+        color: '#fff'
+      }
+    },
+    series: [
+      {
+        type: 'pie',
+        radius: '70%',
+        label: {
+          show: true,
+          color: '#fff',
+          formatter: '{b}: {d}个',
+          fontSize: 14
+        },
+        data: [
+          { value: 1048, name: '充电站' },
+          { value: 735, name: '充电桩' },
+          { value: 580, name: '充电枪' }
+
+        ]
+
+      }
+    ]
+  }
+  const pieChart2 = echarts.init(powerBar2.value)
+  pieChart2.setOption(pieOption2)
+}
+
+// 线路柱状图
+const vehicleBar = ref()
+// 线路饼图
+const vehiclePie = ref()
+// 车载部件
+function setVehicle() {
+  // 折线图
+  const option = {
+
+    tooltip: {
+      trigger: 'axis',
+      axisPointer: {
+        type: 'shadow'
+      }
+    },
+    grid: {
+      left: '1%',
+      right: '4%',
+      bottom: '3%',
+      containLabel: true
+    },
+    legend: {
+      show: true,
+      textStyle: {
+        color: '#fff'
+      }
+
+    },
+    xAxis: [
+      {
+        type: 'category',
+        data: [ 'Wed', '12.8银隆双层观光', '12.8银隆中海豚', 'Thu', 'Fri', 'Sat', 'Sun' ],
+        axisLabel: {
+          color: '#fff',
+          rotate: -45,
+          fontSize: 16
+        },
+        axisTick: {
+          alignWithLabel: true
+        },
+        splitLine: {
+          show: false
+        }
+      }
+    ],
+    yAxis: [
+      {
+        type: 'value',
+        axisLabel: {
+          color: '#fff'
+        },
+        splitLine: {
+          show: true,
+          lineStyle: {
+            color: 'rgb(34,43,57)'
+          }
+        }
+      }
+    ],
+    series: [
+      {
+        name: '数量',
+        type: 'bar',
+        barWidth: '40%',
+        itemStyle: {
+          color: {
+            type: 'linear',
+            x: 0,
+            y: 0,
+            x2: 0,
+            y2: 1,
+            colorStops: [ {
+              offset: 0, color: '#00fdff' // 0% 处的颜色
+            }, {
+              offset: 1, color: '#00aaff08' // 100% 处的颜色
+            } ],
+            global: false // 缺省为 false
+          }
+        },
+        data: [ 10, 52, 200, 334, 390, 330, 220 ]
+      }
 
+    ]
+  }
+  const mychart = echarts.init(vehicleBar.value)
+  mychart.setOption(option)
+  // 柱状图
+  const pieOption = {
+    tooltip: {
+      trigger: 'item'
+    },
+    series: [
+      {
+        name: 'Access From',
+        type: 'pie',
+        radius: [ '65%', '85%' ],
+        avoidLabelOverlap: false,
+        label: {
+          show: false,
+          position: 'center'
+        },
+        emphasis: {
+          label: {
+            show: false,
+            fontSize: 40,
+            fontWeight: 'bold'
+          }
+        },
+        labelLine: {
+          show: false
+        },
+        data: [
+          { value: 1048, name: 'Search Engine' },
+          { value: 735, name: 'Direct' }
+
+        ]
+      }
+    ]
+  }
+  const pieChart = echarts.init(vehiclePie.value)
+  pieChart.setOption(pieOption)
+}
+nextTick(() => {
+  setDevice()
+  setLine()
+  setPlant()
+  setWasher()
+  setPower()
+  setVehicle()
+})
 </script>
 
-  <style lang="scss" scoped>
+<style lang="scss" scoped>
+.left {
+  color: #fff;
+
+  :deep(.box-content) {
+    display: flex;
+
+    .title {
+      font-size: 14px;
+      writing-mode: vertical-lr;
+      /* 从上到下排列,默认为从左到右 */
+      text-orientation: sideways;
+      transform: rotate(180deg);
+      text-align: center;
+      height: 100%;
+    }
+
+    .chart {
+      width: 1040px;
+      // height: 100%;
+    }
+
+    .bar {
+      flex: 1;
+
+      &-box {
+        width: 100%;
+        height: 214px;
+        position: relative;
+      }
+
+      &-chart {
+        width: 100%;
+        height: 214px;
+      }
+
+      .ct {
+        position: absolute;
+        left: 50%;
+        top: 50%;
+        transform: translate(-50%, -50%);
+        text-align: center;
+        font-size: 26px;
+
+        p {
+          font-size: 20px;
+        }
+
+      }
+
+      .value {
+        width: 100%;
+
+        p {
+          text-align: center;
+
+          span {
+            color: #80FFFF;
+            margin-left: 5px;
+            font-size: 20px;
+            line-height: 30px;
+          }
+        }
+      }
+    }
+
+    .plate {
+      width: 1059px;
+      height: 100%;
+      display: flex;
+      flex-direction: column;
+
+      .chart {
+        width: 100%;
+        flex: 1;
+      }
+
+      p {
+        text-align: center;
+      }
+    }
+  }
+
+}
+
+.right {
+  color: #fff;
+
+  :deep(.box-content) {
+    display: flex;
+  }
+
+  .bar {
+    width: 281px;
+
+    &-box {
+      width: 100%;
+      height: 214px;
+      position: relative;
+    }
+
+    &-chart {
+      width: 100%;
+      height: 214px;
+    }
+
+    .ct {
+      position: absolute;
+      left: 50%;
+      top: 50%;
+      transform: translate(-50%, -50%);
+      text-align: center;
+      font-size: 26px;
+
+      p {
+        font-size: 20px;
+      }
+
+    }
+
+    .value {
+      width: 100%;
+
+      p {
+        text-align: center;
+
+        span {
+          color: #80FFFF;
+          margin-left: 5px;
+          font-size: 20px;
+          line-height: 30px;
+        }
+      }
+    }
+  }
+
+  .content {
+    width: 556px;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+
+    .value {
+      display: flex;
+      width: 90%;
+      justify-content: space-between;
+      p {
+        background: #15305D;
+        width: 67px;
+        height: 89px;
+        border-radius: 10px;
+        line-height: 89px;
+        text-align: center;
+        font-size: 60px;
+      }
+    }
 
-  </style>
+    .name {
+      font-size: 24px;
+      color: #80FFFF;
+      margin-top: 10px;
+    }
+  }
+  .bar2{
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    .value{
+      text-align: center;
+      color: #80FFFF;
+      margin-top: 32px;
+    }
+    .chart{
+      flex: 1;
+    }
+  }
+  .vehicle{
+    flex: 1;
+    display: flex;
+    .title{
+      font-size: 14px;
+      writing-mode: vertical-lr;
+      /* 从上到下排列,默认为从左到右 */
+      text-orientation: sideways;
+      transform: rotate(180deg);
+      text-align: center;
+      height: 100%;
+    }
+    .vehicle-chart{
+     flex: 1;
+    }
+  }
+}
+</style>