Browse Source

报警看板

wyh 1 year ago
parent
commit
e64b1d18c0
1 changed files with 888 additions and 0 deletions
  1. 888 0
      src/views/module_tpm/alarmScreen/index.vue

+ 888 - 0
src/views/module_tpm/alarmScreen/index.vue

@@ -0,0 +1,888 @@
+<template>
+  <a-card :bordered="false">
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="submit">
+        <a-row :gutter="24">
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <a-form-item label="年月">
+              <a-month-picker v-model="queryParams.date1" placeholder="选择年月" style="width:100%;" value-format="yyyy-MM"></a-month-picker>
+            </a-form-item>
+          </a-col>
+          <a-col :xl="6" :lg="7" :md="8" :sm="24">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="submit" icon="search">查询</a-button>
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- <a-form :inline="true" class="demo-form-inline">
+      <a-form-item label="年月">
+        <j-date
+          v-model="queryParams.date1"
+          placeholder="选择年月">
+        </j-date>
+      </a-form-item>
+      <a-form-item>
+        <a-button type="primary" @click="submit">查询</a-button>
+      </a-form-item>
+    </a-form> -->
+    <!-- 报警对比图 -->
+    <div class="area-comp">
+      <!-- 上 -->
+      <div class="left-contianer">
+        <div class="common-container top">
+          <div class="common-title">报警统计</div>
+          <div class="common-box box">
+            <div class="num-box">
+              <div class="num">{{alarmStatistics.month}}</div>
+              <div class="text">当月报警数</div>
+            </div>
+            <div class="num-box">
+              <div class="num">{{alarmStatistics.year}}</div>
+              <div class="text">当年报警数</div>
+            </div>
+          </div>
+        </div>
+        <div class="common-container center">
+          <div class="common-title">信息统计</div>
+          <div class="common-box box">
+            <div class="num-box" v-for="(item, index) in chartinfo.levelStatistics" :key="index">
+              <div class="num">{{item.howManyTimes}}</div>
+              <div class="text">{{item.equipmentname}}</div>
+            </div>
+          </div>
+        </div>
+        <div class="common-container ranking">
+          <div class="common-title">报警排名</div>
+          <div class="common-box2" ref="rankingChart" />
+        </div>
+      </div>
+      <div class="right-container">
+        <div class="top">
+          <div class="common-container top-zhe">
+            <div class="common-title">近两年报警对比图</div>
+            <div class="common-box" ref="duibiChart" />
+          </div>
+          <div class="common-container top-bing">
+            <div class="common-title">报警类型占比</div>
+            <div class="common-box" ref="bingChart" />
+          </div>
+        </div>
+        <div class="common-container bottom">
+          <div class="common-title">报警趋势散点图</div>
+          <div class="common-box" ref="qushiChart" />
+        </div>
+      </div>
+    </div>
+  </a-card>
+</template>
+
+<script>
+import * as echarts from 'echarts';
+import { comp } from '@/api/api'
+import { postAction, getAction } from '@/api/manage'
+
+export default {
+  name: 'alarmScreen',
+  data () {
+    return {
+      // 选择器参数接收
+      options: [],
+      // 返回的图表数据
+      chartinfo: [],
+      year: '',
+      month: '',
+      props: { multiple: true, value: "id", label: "label" },
+      // 查询参数
+      queryParams: {
+        date1: '',
+        list:[]
+      },
+      alarmType: [],
+      alarmTypeNum: [],
+      alarmStatistics: {
+        month: 0,
+        year: 0,
+      },
+    }
+  },
+  created () {
+    this.getYearMonth();
+  },
+  mounted () {
+    // echarts自适应
+    window.addEventListener("resize", () =>{
+      this.myChart1.resize();
+      this.myChart2.resize();
+      this.myChart3.resize();
+      this.myChart4.resize();
+    });
+    this.$nextTick(() => {
+    })
+  },
+  methods: {
+    formatYearMonth(year, month){
+      return `${year.toString().padStart(4, '0')}-${month.toString().padStart(2, '0')}`;
+    },
+    getYearMonth() {
+      const currentYear = new Date().getFullYear();
+      const currentMonth = new Date().getMonth() + 1;
+      const yearMonth = this.formatYearMonth(currentYear, currentMonth);
+      this.queryParams.date1 = yearMonth
+      this.getList();
+      // 第一版
+      // yeamonth().then(response => {
+      //   this.queryParams.date1 = response.msg;
+      //   this.getList();
+      // });
+      // 第二版
+      // getAction(`/alarm/statistics/yeamonth`).then(response=>{
+      //   this.queryParams.date1 = response.msg;
+      //   // this.getList();
+      // })
+    },
+    // 查询
+    submit() {
+      if (this.queryParams.date1.length == 0) {
+        this.$message({
+          message: "请先选择年月",
+          type: "warning",
+        });
+        this.option;
+        return false;
+      }
+      console.log(this.queryParams)
+      this.isShow = false;
+      this.getList();
+    },
+    // 获得数据
+    getList(){
+      this.listLoading = true;
+      const newArr = [1,2];
+      let param = {
+        ids: newArr,
+        yearmonth: this.queryParams.date1
+      };
+      postAction(`/tpmMessageAlarm/tpmMessageAlarm/getalarminfo`,param).then(response=>{
+        console.log(66,response)
+        this.chartinfo = response.result;
+
+        // 报警类型
+        this.alarmType = [];
+        this.alarmTypeNum = [];
+        for (let i in this.chartinfo.alarmType){
+          this.alarmType.push(this.chartinfo.alarmType[i].equipmentname);
+          this.alarmTypeNum.push(0);
+        }
+
+        // 报警统计
+        for (let i in this.chartinfo.alarmStatistics) {
+          if (this.chartinfo.alarmStatistics[i].type == "year") {
+            this.alarmStatistics.year = this.chartinfo.alarmStatistics[i].howManyTimes;
+          }
+          else {
+            this.alarmStatistics.month = this.chartinfo.alarmStatistics[i].howManyTimes;
+          }
+        }
+
+        // 图表展示
+        this.initRankingChart()
+        this.initDuibiChartChart()
+        this.initBingChart()
+        this.intiQushiChart()
+      })
+    },
+    // 报警排名
+    initRankingChart(){
+      this.myChart1 = echarts.init(this.$refs.rankingChart)
+      var option;
+      for (let j in this.alarmType) {
+        for (let i in this.chartinfo.alarmRank) {
+          if (this.alarmType[j] == this.chartinfo.alarmRank[i].equipmentname){
+            this.alarmTypeNum[j] = this.chartinfo.alarmRank[i].howManyTimes;
+          }
+        }
+      }
+      option = {
+        grid: {
+          left: "2%",
+          right: "2%",
+          bottom: "0",
+          top: "2%",
+          containLabel: true,
+        },
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "none",
+          },
+          formatter: function (params) {
+            return (
+              params[0].name +
+              "<br/>" +
+              "<span style='display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:rgba(36,207,233,0.9)'></span>" +
+              params[0].seriesName +
+              " : " + params[0].value +
+              " 次<br/>"
+            );
+          },
+        },
+        xAxis: {
+          show: false,
+          type: "value",
+        },
+        yAxis: [
+          {
+            type: "category",
+            inverse: true,
+            axisLabel: {
+              show: true,
+              textStyle: {
+                color: "#333",
+              },
+            },
+            splitLine: {
+              show: false,
+            },
+            axisTick: {
+              show: false,
+            },
+            axisLine: {
+              show: false,
+            },
+            data: this.alarmType,
+          },
+          {
+            type: "category",
+            inverse: true,
+            axisTick: "none",
+            axisLine: "none",
+            show: true,
+            axisLabel: {
+              textStyle: {
+                color: "#333",
+                fontSize: "12",
+              },
+              formatter: function (value) {
+                  return (value).toLocaleString() + "次";
+              },
+            },
+            data: this.alarmTypeNum,
+          },
+        ],
+        series: [
+          {
+            name: "报警",
+            type: "bar",
+            zlevel: 1,
+            itemStyle: {
+              normal: {
+                barBorderRadius: 30,
+                color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
+                  {
+                    offset: 0,
+                    color: "rgb(92,141,253,1)",
+                    // color: "rgb(57,89,255,1)",
+                  },
+                  {
+                    offset: 1,
+                    color: "rgb(50,189,209,1)",
+                    // color: "rgb(46,200,207,1)",
+                  },
+                ]),
+              },
+            },
+            barWidth: 20,
+            data: this.alarmTypeNum,
+          },
+          {
+            name: "背景",
+            type: "bar",
+            barWidth: 20,
+            barGap: "-100%",
+            // data: [50, 50, 50, 50, 50, 50, 50, 50, 50, 50],
+            itemStyle: {
+              normal: {
+                color: "#eee",
+                barBorderRadius: 30,
+              },
+            },
+          },
+        ],
+      };
+      option && this.myChart1.setOption(option);
+    },
+    // 近两年报警对比图
+    initDuibiChartChart(){
+      this.myChart2 = echarts.init(this.$refs.duibiChart)
+      var option;
+
+      // Generate data
+      var lastData =[];
+      var nowData = [];
+      var allData = [];
+      for (let j in this.alarmType) {
+        lastData.push(0)
+        nowData.push(0)
+        allData.push(0)
+        for (let i in this.chartinfo.alarmTwoYear) {
+          if (this.chartinfo.alarmTwoYear[i].type == "lastyear" &&
+            this.chartinfo.alarmTwoYear[i].equipmentname == this.alarmType[j]) {
+            lastData[j] = this.chartinfo.alarmTwoYear[i].howManyTimes;
+          }
+          else if (this.chartinfo.alarmTwoYear[i].type == "thisyear" &&
+            this.chartinfo.alarmTwoYear[i].equipmentname == this.alarmType[j]) {
+            nowData[j] = this.chartinfo.alarmTwoYear[i].howManyTimes;
+          }
+          else if (this.chartinfo.alarmTwoYear[i].type == "all" &&
+            this.chartinfo.alarmTwoYear[i].equipmentname == this.alarmType[j]) {
+            allData[j] = this.chartinfo.alarmTwoYear[i].howManyTimes;
+          }
+        }
+      }
+      // option
+      option = {
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "shadow",
+            textStyle: {
+              color: "#fff",
+            },
+          },
+        },
+        grid: {
+          left: "6%",
+          right: "6%",
+          bottom: "2%",
+          top: "25%",
+          containLabel: true,
+        },
+        legend: {
+          data: ["去年", "今年", "总量"],
+          textStyle: {
+            color: "#B4B4B4",
+          },
+          top: "7%",
+        },
+        xAxis: {
+          data: this.alarmType,
+          axisLine: {
+            lineStyle: {
+              color: "#B4B4B4",
+            },
+          },
+          axisTick: {
+            show: false,
+          },
+        },
+        yAxis: [
+          {
+            splitLine: { show: false },
+            axisLine: {
+              lineStyle: {
+                color: "#B4B4B4",
+              },
+            },
+            axisLabel: {
+              formatter: "{value} ",
+            },
+          }
+        ],
+
+        series: [
+          {
+            name: "总量",
+            type: "line",
+            smooth: true,
+            // showAllSymbol: true,
+            // symbol: "emptyCircle",
+            symbolSize: 8,
+            // itemStyle: {
+            //   normal: {
+            //     color: "#2EC6D0",
+            //   },
+            // },
+
+            // showAllSymbol: true,
+            symbol: "emptyCircle",
+            symbolSize: 6,
+            lineStyle: {
+              normal: {
+                color: "#8FB3F3", // 线条颜色
+              },
+              borderColor: "#f0f",
+            },
+            label: {
+              show: true,
+              position: "top",
+              textStyle: {
+                color: "#fff",
+              },
+            },
+            itemStyle: {
+              normal: {
+                color: "#8FB3F3",
+              },
+            },
+            tooltip: {
+              show: false,
+            },
+            areaStyle: {
+              //区域填充样式
+              normal: {
+                //线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。
+                color: new echarts.graphic.LinearGradient(
+                  0,
+                  0,
+                  0,
+                  1,
+                  [
+                    {
+                      offset: 0,
+                      color: "rgba(192,208,248,0.3)",
+                    },
+                    {
+                      offset: 1,
+                      color: "rgba(163,186,229, .1)",
+                    },
+                  ],
+                  false
+                ),
+                shadowColor: "rgba(220,226,255,.9)", //阴影颜色
+                shadowBlur: 20, //shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。
+              },
+            },
+
+            data: allData,
+          },
+
+          {
+            name: "今年",
+            type: "bar",
+            barWidth: 20,
+            itemStyle: {
+              normal: {
+                // barBorderRadius: 10,
+                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                  { offset: 0, color: "rgb(97,114,237)" },
+                  { offset: 1, color: "rgb(143,210,252)" },
+                ]),
+              },
+            },
+            data: nowData,
+          },
+
+          {
+            name: "去年",
+            type: "bar",
+            barGap: "-100%",
+            barWidth: 20,
+            itemStyle: {
+              normal: {
+                // barBorderRadius: 10,
+                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                  { offset: 0, color: "rgba(199,207,253,0.7)" },
+                  { offset: 0.2, color: "rgba(199,207,253,0.5)" },
+                  { offset: 1, color: "rgba(199,207,253,0.2)" },
+                ]),
+              },
+            },
+            z: -12,
+
+            data: lastData,
+          },
+        ],
+      };
+
+
+      option && this.myChart2.setOption(option);
+    },
+    // 报警类型占比
+    initBingChart(){
+      this.myChart3 = echarts.init(this.$refs.bingChart)
+      var option;
+
+      var m2R2Data = [];
+      var allnum = 0;
+      for (let i in this.chartinfo.typeRatio) {
+        allnum += this.chartinfo.typeRatio[i].howManyTimes;
+        m2R2Data.push({
+          value: this.chartinfo.typeRatio[i].howManyTimes,
+          legendname: this.chartinfo.typeRatio[i].equipmentname,
+          name: this.chartinfo.typeRatio[i].equipmentname,
+          // itemStyle: { color: "#8d7fec" },
+        });
+      }
+
+      option = {
+        title: [
+          {
+            text: "合计",
+            subtext: allnum + "个",
+            textStyle: {
+              fontSize: 16,
+              color: "#bbb",
+            },
+            subtextStyle: {
+              fontSize: 12,
+              color: "#333",
+            },
+            textAlign: "center",
+            x: "34.5%",
+            y: "44%",
+          },
+        ],
+        tooltip: {
+          trigger: "item",
+          formatter: function (parms) {
+            var str =
+              parms.seriesName +
+              "</br>" +
+              parms.marker +
+              "" +
+              parms.data.legendname +
+              "</br>" +
+              "数量:" +
+              parms.data.value +
+              "</br>" +
+              "占比:" +
+              parms.percent +
+              "%";
+            return str;
+          },
+        },
+        legend: {
+          type: "scroll",
+          orient: "vertical",
+          left: "70%",
+          align: "left",
+          top: "middle",
+          textStyle: {
+            color: "#8C8C8C",
+          },
+          height: 150,
+        },
+        series: [
+          {
+            name: "标题",
+            type: "pie",
+            center: ["35%", "50%"],
+            radius: ["40%", "65%"],
+            clockwise: false, //饼图的扇区是否是顺时针排布
+            avoidLabelOverlap: false,
+            label: {
+              normal: {
+                show: true,
+                position: "outter",
+                formatter: function (parms) {
+                  return parms.data.legendname;
+                },
+              },
+            },
+            labelLine: {
+              normal: {
+                length: 10,
+                length2: 30,
+                smooth: true,
+              },
+            },
+            data: m2R2Data,
+          },
+        ],
+      };
+
+
+      option && this.myChart3.setOption(option);
+    },
+    // 获取最后一天
+    getLastDay(year,month){
+      var new_year = year;
+      var new_month = month++;//取下一个月的第一天,方便计算(最后一天不固定)
+      if(month>12){//如果当前大于12月,则年份转到下一年
+          new_month -=12;//月份减
+          new_year++;//年份增
+      }
+      // 取当年当月对应的下个月的前一天,即当前月的最后一天
+      var last_date = new Date(new_year,new_month,0).getDate();
+      return last_date;
+    },
+    // 日期加/减几天
+    getNewDayAdd(dateTemp, day) {
+      dateTemp=new Date(dateTemp);
+      dateTemp=+dateTemp +1000*60*60*24*day;
+      dateTemp=new Date(dateTemp);
+      return dateTemp.getFullYear()+"-"+(dateTemp.getMonth()+1)+"-"+dateTemp.getDate();
+    },
+    // 获取起止日期之间的所有日期
+    getdifflist(){
+      var resultTime = [];     // dateArray 起止日期中间的所有日期列表
+      // 必须减几天啊,不然第一天的显示不出来
+      var start = new Date(this.getNewDayAdd(this.queryParams.date1 + "-01", -1));    //起止日期
+      var year = parseInt(this.queryParams.date1.substring(0, 4));
+      var month = parseInt(this.queryParams.date1.substring(5,7));
+      var endday = this.getLastDay(year, month);
+      // 必须加几天啊,不然最后一天的显示不出来
+      var end = new Date(this.getNewDayAdd(this.queryParams.date1 + "-" + endday, 1));       //截止日期
+      //开始日期小于等于结束日期,并循环
+      // 当 开始时间小于结束时间的时候进入循环
+      while (start <= end) {
+        let getDay = start.getDate()
+        // 月份需要加 1
+        let getMonth = start.getMonth() + 1
+        let getYear = start.getFullYear()
+        /**
+         * 拼接时间格式
+         * (getMonth >= 10 ? `${getMonth}` : `0${getMonth}`) 自动给 小于10的时间前面补0
+         */
+        let setTime =
+            `${getYear}-` +
+            (getMonth >= 10 ? `${getMonth}` : `0${getMonth}`) +
+            '-' +
+            (getDay >= 10 ? `${getDay}` : `0${getDay}`)
+
+        resultTime.push(setTime)
+        /**
+         * 重新设置开始时间
+         * 使用 setFullYear() 方法会自动将时间累加,返回的是时间戳格式
+         * 使用 new Date() 将时间重新设置为标准时间
+         * getMonth - 1 将月份时间重新还原
+         */
+        start = new Date(start.setFullYear(getYear, getMonth - 1, getDay + 1))
+      }
+      return resultTime;
+    },
+    // 报警趋势散点图
+    intiQushiChart(){
+      this.myChart4 = echarts.init(this.$refs.qushiChart)
+      var option;
+
+      const schema = [
+        { name: 'date', index: 2, text: '日' },
+        { name: 'num', index: 1, text: '报警数量' }
+      ];
+      const itemStyle = {
+        opacity: 0.8,
+        shadowBlur: 10,
+        shadowOffsetX: 0,
+        shadowOffsetY: 0,
+        shadowColor: 'rgba(0,0,0,0.3)'
+      };
+
+      var dates = this.getdifflist();
+      var series1 = []
+      for (let i in this.alarmType) {
+        var data1 = [];
+        var cycle1 = 0;
+        for (let t in dates) {
+          data1.push([cycle1 + 1, 0, dates[t]]);
+
+          for (let v in this.chartinfo.alarmScatter) {
+            if (this.chartinfo.alarmScatter[v].equipmentname == this.alarmType[i] &&
+              this.chartinfo.alarmScatter[v].day == dates[t]) {
+              data1[cycle1] = [cycle1 + 1, this.chartinfo.alarmScatter[v].howManyTimes, dates[t]];
+            }
+          }
+          cycle1++;
+        }
+        series1.push({
+          name: this.alarmType[i],
+          type: 'scatter',
+          symbolSize: function (val) { // 原来根据数据来确定气泡大小,改成除了数量为0气泡大小为0,其它都是30的大小
+            return val[1] == 0 ? 0 :20;
+          },
+          itemStyle: itemStyle,
+          // symbolSize: function(value) {
+          //   return value / 10;
+          // },
+          data: data1
+        });
+      }
+      option = {
+        // color: ['#638FF5', '#3FAEDF', '#DBE0FE'],
+        legend: {
+          top: 10,
+          data: this.alarmType,
+          textStyle: {
+            fontSize: 16
+          }
+        },
+        grid: {
+          left: '10%',
+          right: 150,
+          top: '20%',
+          bottom: '10%'
+        },
+        tooltip: {
+          formatter: function (param) {
+            var value = param.value;
+            // prettier-ignore
+            return '<div style="border-bottom: 1px solid rgba(255,255,255,.3); font-size: 18px;padding-bottom: 7px;margin-bottom: 7px">'
+                      + param.seriesName + ' ' + value[2]
+                      + '</div>'
+                      + schema[1].text + ':' + value[1] + '<br>';
+          }
+        },
+        dataZoom: [
+          {
+            type: 'inside',
+            start: 0,
+            end: 100
+          }
+        ],
+        xAxis: {
+          type: 'category',
+          boundaryGap: false,
+          data: dates
+        },
+        yAxis: {
+          type: 'value',
+          name: '报警数量',
+          nameLocation: 'end',
+          nameGap: 20,
+          nameTextStyle: {
+            fontSize: 16
+          },
+          splitLine: {
+            show: false
+          }
+        },
+        // visualMap: [
+        //   {
+        //     left: 'right',
+        //     top: '10%',
+        //     dimension: 2,
+        //     min: 0,
+        //     max: 500,
+        //     itemWidth: 30,
+        //     itemHeight: 120,
+        //     calculable: true,
+        //     precision: 0.1,
+        //     text: ['报警数量'],
+        //     textGap: 30,
+        //     inRange: {
+        //       // symbolSize: [5, 50]
+        //     },
+        //     outOfRange: {
+        //       // symbolSize: [5, 50],
+        //       color: ['rgba(255,255,255,0.4)']
+        //     },
+        //     controller: {
+        //       inRange: {
+        //         color: ['#5085F2']
+        //       },
+        //       outOfRange: {
+        //         color: ['#999']
+        //       }
+        //     }
+        //   },
+        // ],
+        series: series1
+      };
+
+      option && this.myChart4.setOption(option,true);
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.common-container{
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: 0 4px 12px rgba(62, 90, 119, 0.2);
+  padding: 13px 20px;
+  .common-title{
+    border-bottom: 1px solid #ccc;
+    padding: 10px;
+  }
+  .common-box{
+    width: 100%;
+    height: calc(100% - 40px);
+  }
+  .common-box2{
+    width: 100%;
+    height: calc(100% - 129.5px);
+  }
+}
+.area-comp{
+  height: calc(100vh - 84px);
+  background-color: #F0F7FD;
+  // overflow: auto;
+  padding: 14px 20px;
+  display: flex;
+  justify-content: space-between;
+  .left-contianer{
+    // height: 500px;
+    width: 320px;
+    // flex: 2.2;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    .top{
+      background-image: linear-gradient(150deg, #5EB3F7, #6680F4);
+      color: #fff;
+    }
+    .box{
+      display: flex;
+      justify-content: space-around;
+    }
+    .num-box{
+      padding: 10px 8px;
+      text-align: center;
+      .num{
+        font-weight: bolder;
+        font-size: 24px;
+
+      }
+      .text{
+        margin-top: 12px;
+        font-size: 14px;
+      }
+    }
+    .center{
+      margin-top: 12px;
+      .num-box{
+        padding: 10px 0 10px 0;
+      }
+      .num{
+        background-image: linear-gradient(150deg, #5EB3F7, #6680F4);
+        background-clip:text;
+        -webkit-background-clip:text;
+        color: transparent;
+      }
+    }
+    .ranking{
+      flex: 1;
+      width: 100%;
+      // height: 500px;
+      margin-top: 10px;
+      box-sizing: border-box;
+    }
+  }
+  .right-container{
+    flex: 1;
+    margin-left: 12px;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    .top{
+      flex: 1;
+      display: flex;
+      justify-content: space-between;
+      .top-bing{
+        flex: 1;
+        margin-left: 12px;
+      }
+      .top-zhe{
+        flex: 2;
+      }
+    }
+    .bottom{
+      flex: 1.6;
+      margin-top: 12px;
+    }
+  }
+}
+</style>