<template>
  <div class='dashboard'>
    <el-row>
      <el-col :xs='24' :sm='12' :md='6'>
        <el-card class='dashboard-card'>
          <div class='dashboard-card-header'>总设备数</div>
          <div class='dashboard-card-content'>
            <div class='dashboard-card-number'>{{ totalDevices }}</div>
          </div>
        </el-card>
      </el-col>
      <el-col :xs='24' :sm='12' :md='6'>
        <el-card class='dashboard-card'>
          <div class='dashboard-card-header'>可用设备数</div>
          <div class='dashboard-card-content'>
            <div class='dashboard-card-number'>{{ availableDevices }}</div>
          </div>
        </el-card>
      </el-col>
      <el-col :xs='24' :sm='12' :md='6'>
        <el-card class='dashboard-card'>
          <div class='dashboard-card-header'>借出设备数</div>
          <div class='dashboard-card-content'>
            <div class='dashboard-card-number'>{{ borrowedDevices }}</div>
          </div>
        </el-card>
      </el-col>
      <el-col :xs='24' :sm='12' :md='6'>
        <el-card class='dashboard-card'>
          <div class='dashboard-card-header'>损坏设备数</div>
          <div class='dashboard-card-content'>
            <div class='dashboard-card-number'>{{ damagedDevices }}</div>
          </div>
        </el-card>
      </el-col>
    </el-row>
    <el-row>
      <el-col :xs='24' :sm='24' :md='12'>
        <el-card class='dashboard-card'>
          <div class='dashboard-card-header'>设备借出情况</div>
          <div class='dashboard-card-content'>
            <el-chart :data='borrowData' type='pie' />
          </div>
        </el-card>
      </el-col>
      <el-col :xs='24' :sm='24' :md='12'>
        <el-card class='dashboard-card'>
          <div class='dashboard-card-header'>设备损坏情况</div>
          <div class='dashboard-card-content'>
            <el-chart :data='damageData' type='bar' />
          </div>
        </el-card>
      </el-col>
    </el-row>
  </div>
</template>
<script>
import { mapState } from 'vuex';
import { ElChart } from 'element-plus';

export default {
  components: {
    ElChart,
  },
  computed: {
    ...mapState({
      totalDevices: (state) => state.devices.length,
      availableDevices: (state) =>
        state.devices.filter((device) => device.status === 'available').length,
      borrowedDevices: (state) =>
        state.devices.filter((device) => device.status === 'borrowed').length,
      damagedDevices: (state) =>
        state.devices.filter((device) => device.status === 'damaged').length,
      borrowData: (state) => {
        const borrowCounts = {};
        state.devices.forEach((device) => {
          if (device.borrower) {
            if (borrowCounts[device.borrower]) {
              borrowCounts[device.borrower]++;
            } else {
              borrowCounts[device.borrower] = 1;
            }
          }
        });
        return Object.keys(borrowCounts).map((borrower) => {
          return {
            name: borrower,
            value: borrowCounts[borrower],
          };
        });
      },
      damageData: (state) => {
        const damageCounts = {
          0: 0,
          1: 0,
          2: 0,
          3: 0,
          4: 0,
        };
        state.devices.forEach((device) => {
          damageCounts[device.damageLevel]++;
        });
        return {
          labels: ['无损坏', '轻微损坏', '中度损坏', '严重损坏', '不可修复'],
          datasets: [
            {
              label: '设备损坏情况',
              backgroundColor: [
                '#41B883',
                '#E46651',
                '#00D8FF',
                '#DD1B16',
                '#2F4050',
              ],
              data: Object.values(damageCounts),
            },
          ],
        };
      },
    }),
  },
};
</script>
<style scoped>
.dashboard {
  padding: 24px;
}

.dashboard-card {
  text-align: center;
  height: 200px;
  margin-bottom: 24px;
}

.dashboard-card-header {
  font-size: 18px;
  font-weight: bold;
  margin-bottom: 12px;
}

.dashboard-card-number {
  font-size: 48px;
  font-weight: bold;
}

.dashboard-card-content {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}

@media screen and (min-width: 768px) {
  .dashboard-card {
    height: 150px;
  }

  .dashboard-card-number {
    font-size: 36px;
  }
}
</style>
<p>本系统首页使用 Element UI 框架构建科技感十足的仪表板,直观展示仪器设备的整体情况。首页包含四个仪表板卡片,分别显示总设备数、可用设备数、借出设备数和损坏设备数。此外,饼图展示设备借出情况,柱状图展示设备损坏情况,方便用户快速了解设备的整体状况。</p>
<p>首页采用简洁明了的布局和科技感的颜色搭配,提升用户体验。同时,页面响应式设计,适应不同尺寸屏幕,方便用户在各种设备上访问。</p>
Element UI 仪器设备管理系统首页 - 科技感十足的仪表板

原文地址: https://www.cveoy.top/t/topic/muQG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录