MrShi
2024-02-28 3a7cbae4f79e0043b9a75c9e419a841fc220c35a
admin/src/views/index.vue
@@ -1,33 +1,268 @@
<template>
  <div class="home">
    <div class="wrap">
      <h2>欢迎使用伊娃极速开发框架</h2>
      <p>您使用的此套开源框架没有任何版权问题,可学习可商用,请放心使用!</p>
      <p>伊娃致力于打造简洁、合理、高效的开发体验,为此我们将不断升级,感谢您的支持!</p>
      <p style="margin-top: 12px;">
        <a href="https://gitee.com/coderd-repos/eva" target="_blank">GITEE</a>
        <a href="https://github.com/coderd-repos/eva" target="_blank">GITHUB</a>
      </p>
      <div class="guide">
        <a href="http://eva.adjustrd.com" target="_blank">前往官网</a>
        <a href="http://coderd.adjustrd.com/template/308/default" target="_blank">前往CodeRd</a>
    <div class="home_total">
      <div class="home_total_head">在厂人员总览</div>
      <div class="home_total_list">
        <div class="home_total_list_item a">
          <span>{{head && head.workerCount ? head.workerCount : 0}}</span>
          <span>内部员工</span>
        </div>
        <div class="home_total_list_item b">
          <span>{{head && head.visitorCount ? head.visitorCount : 0}}</span>
          <span>访客</span>
        </div>
        <div class="home_total_list_item c">
          <span>{{head && head.lwCount ? head.lwCount : 0}}</span>
          <span>劳务人员</span>
        </div>
        <div class="home_total_list_item d">
          <span>{{head && head.presenceCarCount ? head.presenceCarCount : 0}}</span>
          <span>在场车辆</span>
        </div>
        <div class="home_total_list_item e">
          <span>{{head && head.longCarCount ? head.longCarCount : 0}}</span>
          <span>长期车辆</span>
        </div>
        <div class="home_total_list_item f">
          <span>{{head && head.visitorCarCount ? head.visitorCarCount : 0}}</span>
          <span>预约车辆</span>
        </div>
        <div class="home_total_list_item g">
          <span>{{head && head.supplierCount ? head.supplierCount : 0}}</span>
          <span>供应商</span>
        </div>
      </div>
      <img src="@/assets/images/qq.png">
      <p>你可以扫码加入群聊以获得技术支持</p>
      <div class="award">
        <h4>激励作者做得更好</h4>
        <img src="@/assets/images/alipay.jpeg">
        <img src="@/assets/images/wxpay.jpeg">
    </div>
    <div class="home_charts">
      <div class="home_charts_item">
        <div class="home_charts_item_label">在厂人员占比</div>
        <div class="home_charts_item_charts" id="chart1"></div>
      </div>
      <div class="home_charts_item">
        <div class="home_charts_item_label">劳务人员分布总览</div>
        <div class="home_charts_item_charts" id="chart2"></div>
      </div>
    </div>
    <div class="home_table">
      <div class="home_table_head">超时预警人员({{total}})</div>
      <div class="home_table_box">
        <el-table
          :data="list"
          :header-cell-style="{background: '#dcdde2', color: 'rgb(51, 51, 51)'}"
          border
          style="width: 100%">
          <el-table-column
            prop="name"
            label="访客姓名">
          </el-table-column>
          <el-table-column
            prop="phone"
            label="访客电话">
          </el-table-column>
          <el-table-column
            prop="companyName"
            label="访客公司">
          </el-table-column>
          <el-table-column
            label="人员类型">
            <template slot-scope="{row}">
              <span v-if="row.type === 0">劳务访客</span>
              <span v-if="row.type === 1">普通访客</span>
              <span v-if="row.type === 2">内部人员</span>
            </template>
          </el-table-column>
          <el-table-column
            prop="outDate"
            label="授权到期时间">
          </el-table-column>
          <el-table-column
            label="状态">
            <template slot-scope="{row}">
              <span v-if="row.outStatus === 0">未超时</span>
              <span style="color: red;" v-if="row.outStatus === 1">已超时</span>
              <span v-if="row.outStatus === 2">即将超时</span>
            </template>
          </el-table-column>
          <el-table-column
            prop="address"
            label="处理"
            width="80">
            <template slot-scope="scope">
              <el-button type="text" @click="departure(scope.row.id)">离场</el-button>
            </template>
          </el-table-column>
        </el-table>
        <el-pagination
          style="margin-top: 20px;"
          @current-change="handleCurrentChange"
          :current-page="page"
          :page-size="10"
          layout="total, prev, pager, next, jumper"
          :total="total">
        </el-pagination>
      </div>
    </div>
  </div>
</template>
<script>
import * as echarts from 'echarts'
import { body, head, timeoutPage, level } from '@/api/business/staging'
export default {
  name: 'Index',
  data () {
    return {}
    return {
      head: null,
      list: [],
      total: 0,
      data1: [],
      data2: [[],[]],
      page: 1
    }
  },
  created () {
    this.getHeader()
    this.getData()
  },
  mounted () {
    // this.getcharts2()
  },
  methods: {
    departure(id) {
      this.$confirm('确定离场吗, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        level(id)
          .then(res => {
            this.page = 1
            this.getData()
          })
      }).catch(() => {
      });
    },
    getData() {
      timeoutPage({
        capacity: 10,
        page: this.page,
        model: {}
      }).then(res => {
        this.list = res.records
        this.total = res.total
      })
    },
    getHeader() {
      head().then(res => {
        this.head = res
      })
      body().then(res => {
        this.data1 = res.retentionUsers.map(item => {
          let name = ''
          if (item.memberType === 0) {
            name = '劳务访客'
          } else if (item.memberType === 1) {
            name = '普通访客'
          } else if (item.memberType === 2) {
            name = '内部员工'
          }
          return {
            value: item.memberCount,
            name
          }
        })
        let arr1 = res.companyUsers.map(item => item.companyName)
        let arr2 = res.companyUsers.map(item => item.memberCount)
        if (arr1.length > 0) {
          this.data2 = [arr1, arr2]
          this.getcharts2()
        }
        this.getcharts1()
      })
    },
    handleCurrentChange (page) {
      this.page = page
      this.getData()
    },
    getcharts1 () {
      const myChart = echarts.init(document.getElementById('chart1'))
      // 绘制图表
      myChart.setOption({
        tooltip: {
          trigger: 'item'
        },
        grid: {
          bottom: '5%',
          top: '5%'
        },
        legend: {
          bottom: '0%',
          left: 'center',
          icon: 'circle'
        },
        series: [
          {
            type: 'pie',
            radius: ['40%', '70%'],
            label: {
              formatter: '{b} {d}%'
            },
            data: this.data1,
            itemStyle: {
              normal: {
                color: function (colors) {
                  var colorList = [
                    '#fc8251',
                    '#5470c6',
                    '#91cd77'
                  ]
                  return colorList[colors.dataIndex]
                }
              }
            },
            emphasis: {
              itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              }
            }
          }
        ]
      })
    },
    getcharts2 () {
      const myChart = echarts.init(document.getElementById('chart2'))
      myChart.setOption({
        tooltip: {
          trigger: 'item'
        },
        grid: {
          bottom: '5%',
          top: '5%'
        },
        xAxis: {
          max: 'dataMax'
        },
        yAxis: {
          type: 'category',
          data: this.data2[0]
        },
        series: [
          {
            realtimeSort: true,
            type: 'bar',
            data: this.data2[1],
            itemStyle: {
              normal: {
                color: '#fc8251'
              }
            }
          }
        ]
      })
    }
  }
}
</script>
@@ -35,63 +270,118 @@
<style scoped lang="scss">
@import "@/assets/style/variables.scss";
.home {
  text-align: center;
  color: #777;
  .wrap {
    margin-top: 80px;
    img {
      width: 240px;
  width: 100%;
  .home_table {
    width: 100%;
    padding: 20px;
    box-sizing: border-box;
    background: #ffffff;
    margin-top: 20px;
    .home_table_head {
      font-size: 16px;
      font-weight: 600;
      color: black;
    }
    .home_table_box {
      width: 100%;
      margin-top: 15px;
    }
  }
  h2 {
    font-size: 32px;
    color: #555;
    margin-bottom: 20px;
  }
  p {
    line-height: 24px;
    margin: 0;
  }
  .start-up {
    margin-top: 8px;
  }
  .guide {
    margin: 30px 0 40px 0;
  .home_charts {
    width: 100%;
    margin-top: 20px;
    display: flex;
    justify-content: center;
    a {
      margin-right: 12px;
      padding: 12px 40px;
      border-radius: 30px;
      background: $primary-color;
      color: #fff;
      text-decoration: none;
    align-items: center;
    justify-content: space-between;
    .home_charts_item {
      padding: 20px;
      box-sizing: border-box;
      flex: 1;
      display: flex;
      flex-direction: column;
      margin-right: 20px;
      background: #ffffff;
      .home_charts_item_label {
        font-size: 16px;
        font-weight: 600;
        color: black;
      }
      .home_charts_item_charts {
        width: 100%;
        height: 300px;
      }
      &:last-child {
        margin: 0 !important;
      }
    }
  }
  em,a {
    font-style: normal;
    font-weight: bold;
    margin: 0 3px;
    color: $primary-color;
  }
  .award {
    position: absolute;
    right: 20px;
    bottom: 60px;
    display: flex;
    flex-direction: column;
    text-align: left;
    padding: 12px;
    border: 1px solid #eee;
    box-shadow: -1px 1px 10px #ccc;
    h4 {
      font-weight: bold;
      margin-bottom: 8px;
  .home_total {
    width: 100%;
    background: #ffffff;
    margin-top: 20px;
    .home_total_head {
      width: 100%;
      font-size: 16px;
      font-weight: 600;
      color: black;
      padding: 10px 20px;
      box-sizing: border-box;
      border-bottom: 1px solid #ececec;
    }
    img {
      width: 160px;
      margin-bottom: 20px;
      transition: opacity ease .3s;
    .home_total_list {
      width: 100%;
      padding: 20px;
      box-sizing: border-box;
      display: flex;
      align-items: center;
      .a {
        border-left: 5px solid rgba(129, 211, 248, 1) !important;
      }
      .b {
        border-left: 5px solid rgba(236, 128, 141, 1) !important;
      }
      .c {
        border-left: 5px solid rgba(250, 205, 145, 1) !important;
      }
      .d {
        border-left: 5px solid rgba(245, 154, 35, 1) !important;
      }
      .e {
        border-left: 5px solid rgba(128, 128, 255, 1) !important;
      }
      .f {
        border-left: 5px solid rgba(202, 249, 130, 1) !important;
      }
      .g {
        border-left: 5px solid rgba(194, 128, 255, 1) !important;
      }
      .home_total_list_item {
        flex: 1;
        display: flex;
        align-items: center;
        flex-direction: column;
        justify-content: center;
        height: 80px;
        border-radius: 5px;
        border: 1px solid #ececec;
        margin-right: 15px;
        &:last-child {
          margin: 0 !important;
        }
        span {
          &:first-child {
            font-weight: 500;
            font-size: 24px;
            color: black;
          }
          &:last-child {
            font-weight: 400;
            font-size: 14px;
            color: #666666;
            margin-top: 2px;
          }
        }
      }
    }
  }
}