Newer
Older
baseResourceFront / src / views / dataCockpit / trendPanel.vue
yangqianqian on 23 Mar 2021 10 KB 修改UI
<template>
  <div class="sub-trend-block">
    <div>
      <div class="subTitle">数据统计</div>

      <div class="sub-trend-radio">
        <el-radio v-model="analysisType" label="today">今日</el-radio>
        <el-radio v-model="analysisType" label="week">最近7日</el-radio>
        <el-radio v-model="analysisType" label="month">最近30日</el-radio>
      </div>

      <div class="sub-trend-timepicker">
        <el-date-picker
          v-model="dateRange"
          :picker-options="{'firstDayOfWeek': 1}"
          popper-class="test_class"
          size="small"
          type="daterange"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          @change="changeDatePicker"/>
      </div>
    </div>

    <div class="chart-container">
      <div ref="chart" class="chart-body" />
    </div>
  </div>

<!--  <el-row :gutter="20" style="padding: 20px;">-->
<!--    <el-col :span="24">-->
<!--      <div class="subTitle">数据统计</div>-->
<!--    </el-col>-->

<!--    <el-col :span="24">-->
<!--      <div class="panelCorners">-->
<!--        <div style="padding: 15px; text-align: left; display: inline-block;">-->
<!--          <el-radio-group v-model="analysisType" size="small" @change="changeTimeTerm()">-->
<!--            <el-radio-button label="today">今日</el-radio-button>-->
<!--            <el-radio-button label="week">最近7日</el-radio-button>-->
<!--            <el-radio-button label="month">最近30日</el-radio-button>-->
<!--          </el-radio-group>-->

<!--          <el-date-picker-->
<!--            v-model="dateRange"-->
<!--            :picker-options="{'firstDayOfWeek': 1}"-->
<!--            size="small"-->
<!--            type="daterange"-->
<!--            range-separator="至"-->
<!--            start-placeholder="开始日期"-->
<!--            end-placeholder="结束日期"-->
<!--            @change="changeDatePicker"/>-->
<!--        </div>-->

<!--        <div class="chart-container">-->
<!--          <div ref="chart" class="chart-body" />-->
<!--        </div>-->
<!--      </div>-->
<!--    </el-col>-->
<!--  </el-row>-->
</template>
<script>
import echarts from 'echarts'
import request from '@/utils/request'
import { formatToString, getDate } from '@/utils/calendarUtil'
export default {
  name: 'TrendPanel',
  data() {
    return {
      dateShortcuts: {
        today: '', // 今日日期字符串
        lastWeek: '', // 7日前日期字符串
        lastMonth: '' // 30日前日期字符串
      },
      analysisType: 'today', // 数据统计区间快捷键
      dayDiff: '0', // 日期差,用于显示图表的tooltip;7天以内
      dateRange: '', // 时间范围
      xDatas: [], // 横轴
      collectDatas: [], // 采集统计数据
      checkDatas: [] // 识别统计数据
    }
  },
  watch: {
    analysisType() {
      this.changeTimeTerm()
    }
  },
  mounted() {
    this.initDateShortcuts()
  },
  methods: {
    initDateShortcuts() {
      const now = new Date()
      this.dateShortcuts.today = formatToString(now, 'DATE')
      this.dateShortcuts.lastWeek = getDate(-6, 'DATE')
      this.dateShortcuts.lastMonth = getDate(-29, 'DATE')

      this.changeTimeTerm()
    },
    initChart() {
      this.chart = echarts.init(this.$refs.chart)
      this.chart.setOption({
        grid: { // 画布属性
          left: '50px',
          top: '10px'
        },
        legend: { // 图例属性
          bottom: 0, // 右上方显示
          icon: 'rect', // 方块样式
          textStyle: { // 字体大小和颜色
            color: '#FFFFFF',
            fontSize: 18,
            fontFamily: 'Microsoft YaHei'
          },
          data: ['识别人数', '采集人数']
        },
        tooltip: { // 提示框属性
          trigger: 'axis', // 坐标轴触发
          backgroundColor: '#0094FF', // 提示框背景色
          axisPointer: {
            type: 'line',
            lineStyle: {
              color: '#FFFF00',
              width: 2
            }
          }
        },
        xAxis: [
          {
            type: 'category',
            data: this.xDatas,
            axisLine: {
              lineStyle: {
                color: '#fff'
              }
            },
            axisLabel: {
              // rotate: 90,
              fontSize: 10,
              color: '#fff'
            }
          }
        ],
        yAxis: [
          {
            type: 'value',
            axisLine: {
              lineStyle: {
                color: '#fff'
              }
            },
            axisLabel: {
              fontSize: 10,
              color: '#fff'
            },
            splitLine: {
              show: false
            }
          }
        ],
        color: [
          '#016FE2', '#02FEFF',
          '#0067a6', '#c4b4e4',
          '#d87a80', '#9cbbff', '#d9d0c7',
          '#87a997', '#d49ea2', '#5b4947',
          '#7ba3a8', '#19d4ae', '#ffb980'
        ],
        series: [
          {
            name: '识别人数',
            type: 'line',
            data: this.checkDatas,
            animationDelay: function(idx) {
              return idx * 10
            }
          },
          {
            name: '采集人数',
            type: 'line',
            data: this.collectDatas,
            animationDelay: function(idx) {
              return idx * 10
            }
          }
        ],
        animationEasing: 'elasticOut',
        animationDelayUpdate: function(idx) {
          return idx * 5
        }
      })
      this.chart.resize()
    },
    // 切换时间快捷键
    changeTimeTerm() {
      if (this.analysisType === 'today') {
        this.dateRange = [this.dateShortcuts.today, this.dateShortcuts.today]
      } else if (this.analysisType === 'week') {
        this.dateRange = [this.dateShortcuts.lastWeek, this.dateShortcuts.today]
      } else if (this.analysisType === 'month') {
        this.dateRange = [this.dateShortcuts.lastMonth, this.dateShortcuts.today]
      }

      this.queryDataAnalysis()
    },
    // 自定义选择时间段
    changeDatePicker() {
      const start = formatToString(this.dateRange[0].valueOf(), 'DATE')
      const end = formatToString(this.dateRange[1].valueOf(), 'DATE')
      if (end !== this.dateShortcuts.today) {
        this.analysisType = 'other'
      } else {
        if (start === this.dateShortcuts.today) {
          this.analysisType = 'today'
        } else if (start === this.dateShortcuts.lastWeek) {
          this.analysisType = 'week'
        } else if (start === this.dateShortcuts.lastMonth) {
          this.analysisType = 'month'
        } else {
          this.analysisType = 'other'
        }
      }

      this.queryDataAnalysis()
    },
    // 向后台查询数据统计结果
    queryDataAnalysis() {
      request({
        url: '/bigScreen/getDataAnalysis',
        method: 'post',
        params: {
          analysisType: this.analysisType,
          startDate: formatToString(this.dateRange[0].valueOf(), 'DATE'),
          endDate: formatToString(this.dateRange[1].valueOf(), 'DATE')
        }
      }).then(response => {
        console.log(response)
        if (response.code === 200) {
          // 查询有新结果时清除原有的列表
          this.xDatas = []
          this.collectDatas = []
          this.checkDatas = []
          if (response.data.length > 0) {
            response.data.forEach(item => {
              this.xDatas.push(item.analysisDate)
              this.collectDatas.push(item.colNum)
              this.checkDatas.push(item.recNum)
            })
          }
          this.initChart()
        }
      })
    }
  }
}
</script>

<style scoped>
  .sub-trend-block {
    border: 2px solid #3370E3;
    background-color: rgba(41, 85, 252, 0.2);
    margin: 20px 20px 0px 20px;
    width: calc(100vw - 40px);
    height: 320px;
  }

  .subTitle {
    font-weight: bold;
    font-family: '微软雅黑',serif;
    color: #fff;
    font-size: 24px;
    padding: 10px 10px 10px 30px;
    background: url("images/sub-title-background.png") no-repeat;
    float: left;
    width: 400px;
  }

  .sub-trend-radio {
    padding: 10px 0 5px 0;
    text-align: left;
    float: left;
  }

  .sub-trend-radio >>> .el-radio__label {
    color: #FFFFFF;
  }

  .sub-trend-timepicker {
    padding: 5px;
    margin-left: 50px;
    text-align: left;
    float: left;
  }
  .sub-trend-timepicker >>> .el-input__inner {
    background: none;
    border-radius: 0px;
    border: 1px solid #3370E3;
  }
  .sub-trend-timepicker >>> .el-date-editor .el-range-input {
    background: none;
    color: #FFFFFF;
    font-size: 18px;
  }
  .sub-trend-timepicker >>> .el-range-separator {
    color: #FFFFFF;
    font-size: 18px;
  }

  .chart-container{
    text-align: center;
    display: block;
    margin-top: 60px;
  }
  .chart-body {
    min-height: 240px;
    width: calc(100vw - 40px);
    /*margin-right: auto;*/
    /*margin-left: auto;*/
  }

  @media(max-width: 1440px) {
    .sub-trend-block {
      margin: 15px 18px 0px 18px;
      width: calc(100vw - 36px);
      height: 285px;
    }

    .subTitle {
      font-size: 20px;
      padding: 9px 9px 9px 24px;
    }

    .chart-container{
      text-align: center;
      display: block;
      margin-top: 42px;
    }
    .chart-body {
      min-height: 235px;
      width: calc(100vw - 36px);
    }
  }

  @media(max-width: 1366px) {
    .sub-trend-block {
      margin: 12px 16px 0px 16px;
      width: calc(100vw - 32px);
      height: 240px;
    }

    .subTitle {
      font-size: 16px;
      padding: 8px 8px 8px 20px;
    }

    .sub-trend-timepicker {
      padding: 2px;
      margin-left: 30px;
    }
    .sub-trend-timepicker >>> .el-date-editor .el-range-input {
      background: none;
      color: #FFFFFF;
      font-size: 14px;
    }
    .sub-trend-timepicker >>> .el-range-separator {
      color: #FFFFFF;
      font-size: 14px;
    }

    .chart-container{
      text-align: center;
      display: block;
      margin-top: 36px;
    }
    .chart-body {
      min-height: 180px;
      width: calc(100vw - 32px);
    }
  }
</style>

<style rel="stylesheet/scss" lang="scss" >
  .test_class{
    border: 0px;
    border-radius: 0px;
    .el-picker-panel__body-wrapper{
      .el-picker-panel__body{
        color: #FFFFFF;
        background-color: #016FE2; /* 整体背景色 */
        border-radius: 0px;
        .el-date-table th {
          color: #FFFFFF;
        }
        .el-picker-panel__icon-btn {
          color: #FFFFFF;
        }
        .el-date-table td.start-date span, .el-date-table td.end-date span {
          background-color: #02FEFF;
          color: #333333;
        }
        .el-date-table td.in-range div {
          /*background-color: #016FE2; !* 选中背景色 *!*/
          background-color: #3695FF; /* 选中背景色 */
        }
        .el-date-table td div {
          padding: 0px;
        }
        .el-date-table td span {
          width: 30px;
          height: 30px;
          line-height: 30px;
        }
        .el-date-table td.today span {
          color: #333333;
          font-size: 1.2em;
        }
      }
    }
  }
</style>