index.vue 3.61 KB
<template>
  <div class="eContainer-home">
    <c-row
      :gutter="10"
      v-for="cRow in cellRows"
      :key="cRow"
    >
      <c-col
        :span="24 / cellCols"
        v-for="cCol in cellCols"
        :key="cCol"
      >
        <component
          v-if="getComponentName([cRow - 1], [cCol - 1])"
          v-bind:is="getComponentName([cRow - 1], [cCol - 1])"
          :cellContentHeight="cellContentHeight"
        ></component>
      </c-col>
    </c-row>
  </div>
</template>

<script>
import { createNamespacedHelpers } from "vuex";
const { mapState } = createNamespacedHelpers("UserContext");

import QuickVisit from "./cells/QuickVisit.vue";
import TaskStatistics from "./cells/TaskStatistics.vue";
import NoticeAnnouncement from "./cells/NoticeAnnouncement.vue";
import Hall from "./cells/Hall.vue";
import CustomerAnalyse from "./cells/CustomerAnalyse.vue";
import QuickSearch from "./cells/QuickSearch.vue";

import { cellDataDefinition } from "./config";

export default {
  name: "Home",
  components: {
    QuickVisit,
    TaskStatistics,
    NoticeAnnouncement,
    Hall,
    CustomerAnalyse,
    QuickSearch,
  },
  data() {
    return {
      cellContentHeight: 0,
    };
  },
  created() {
    this.loadCellData();
  },
  mounted() {
    this.calcCellContentHeight();
    this.calcCellContentHeightBind = this.calcCellContentHeight.bind(this);
    window.addEventListener("resize", this.calcCellContentHeightBind);
  },
  computed: {
    ...mapState({
      cellRows: (state) => state.homeCellsSetting.cellRows,
      cellCols: (state) => state.homeCellsSetting.cellCols,
      cellNames: (state) => state.homeCellsSetting.cellNames,
    }),
  },
  watch: {
    cellRows(newVal, oldVal) {
      this.calcCellContentHeight()
    },
  },
  methods: {
    loadCellData() {
      this.$store.commit(
        "UserContext/setHomeDefaultCells",
        cellDataDefinition
      );
      let cellsSettingDefault = localStorage.getItem("cells-setting-default");
      if (!cellsSettingDefault) {
        const rows = 2;
        const cols = 3;
        localStorage.setItem(
          "cells-setting-default",
          JSON.stringify({
            cellRows: rows,
            cellCols: cols,
            cellNames: this.generateRowColNames(
              rows,
              cols,
              cellDataDefinition.map((definition) => definition.name)
            ),
          })
        );
      }
      let userCellsSetting = localStorage.getItem(
        `cells-setting-${this.$store.state.UserContext.userId}`
      );
      if (!userCellsSetting) {
        userCellsSetting = localStorage.getItem("cells-setting-default");
      }
      this.$store.commit(
        "UserContext/setHomeCellsSetting",
        JSON.parse(userCellsSetting)
      );
    },
    generateRowColNames(rows, cols, cells) {
      const rArr = [];
      for (let i = 0; i < rows; i++) {
        const cArr = [];
        for (let j = 0; j < cols; j++) {
          cArr.push(cells[i * cols + j]);
        }
        rArr.push(cArr);
      }
      return rArr;
    },
    getComponentName(rowIdx, colIdx) {
      return this.cellNames[rowIdx] ? this.cellNames[rowIdx][colIdx] : null;
    },
    calcCellContentHeight() {
      this.cellContentHeight = this.$el.clientHeight * this.getRowHeightPercent() - 52 - 10
    },
    getRowHeightPercent() {
      // 每行预留 0.4% 的间距
      return 1 / this.cellRows - 0.004 * this.cellRows;
    },
  },
  destroyed() {
    window.removeEventListener("resize", this.calcCellContentHeightBind);
  },
};
</script>

<style scoped>
.eContainer-home {
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: space-around;
}
</style>