字段配置类型名修改
笑笑 编写于 2023-04-26 22:42:15
NewLife.CubeVue
<template>
  <div class="list-container">
    <el-row type="flex" class="search" justify="end">
      <el-col
        :span="4"
        class="left-search"
        v-if="hasPermission(permissionFlags.insert)"
      >
        <el-button type="primary" @click="add">新增</el-button>
      </el-col>
      <el-col :span="20" class="right-search"></el-col>
    </el-row>
    <div class="table-container">
      <el-table
        v-loading="listLoading"
        :data="tableData"
        stripe
        border
        @sort-change="sortChange"
        @row-dblclick="rowDblclick"
        :tree-props="{
          children: 'children',
          hasChildren: 'hasChildren',
        }"
        row-key="id"
        default-expand-all
      >
        <el-table-column prop="name" label="节点名" width="180" />
        <el-table-column prop="displayName" label="显示名" width="180" />
        <el-table-column prop="url" label="链接" width="250" />
        <el-table-column prop="sort" label="排序" width="50" />
        <el-table-column align="center" prop="visible" label="可见" width="80">
          <template v-slot="scope">
            <el-switch
              v-model="scope.row.visible"
              active-color="#13ce66"
              inactive-color="#ff4949"
              disabled
            />
          </template>
        </el-table-column>
        <el-table-column
          align="center"
          prop="necessary"
          label="必要"
          width="80"
        >
          <template v-slot="scope">
            <el-switch
              :value="scope.row.necessary"
              active-color="#13ce66"
              inactive-color="#ff4949"
            />
          </template>
        </el-table-column>
        <el-table-column prop="permission" label="权限子项" width="250" />

        <el-table-column
          label="操作"
          align="center"
          width="140"
          class-name="small-padding fixed-width"
        >
          <template v-slot="scope">
            <el-button
              v-if="
                !hasPermission(permissionFlags.update) &&
                hasPermission(permissionFlags.detail)
              "
              type="primary"
              size="small"
              @click="detail(scope.row)"
            >
              查看
            </el-button>
            <el-button
              v-if="hasPermission(permissionFlags.update)"
              type="primary"
              size="small"
              @click="editData(scope.row)"
            >
              编辑
            </el-button>
            <el-button
              v-if="hasPermission(permissionFlags.delete)"
              size="small"
              type="danger"
              @click="deleteData(scope.row)"
            >
              删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
  name: 'MenuList',
  data() {
    return {
      tableData: [] as any,
      tableHeight: '300px',
      queryParams: {
        Q: null,
        dateRange: null,
      } as any,
      page: {
        pageIndex: 1,
        pageSize: 20,
        totalCount: 0,
      } as any,
      listLoading: false,
      permissionFlags: {
        none: 0,
        detail: 1,
        insert: 2,
        update: 4,
        delete: 8,
      },
    };
  },
  computed: {
    currentPath() {
      return this.$route.path;
    },
    queryData() {
      const vm = this;
      const dateRange = vm.queryParams.dateRange;
      if (dateRange) {
        vm.queryParams.dtStart = dateRange[0];
        vm.queryParams.dtEnd = dateRange[1];
      } else {
        vm.queryParams.dtStart = null;
        vm.queryParams.dtEnd = null;
      }

      const temp = {} as any;
      // 查询参数也添加上
      Object.assign(temp, vm.page, vm.queryParams);
      temp.dateRange = undefined;
      return temp;
    },
  },
  // watch: {
  //   $route: {
  //     handler: function () {
  //       this.init()
  //     },
  //     immediate: true
  //   }
  // },
  created() {
    this.init();
  },
  activated() {
    this.init();
  },
  methods: {
    init() {
      this.setQueryParams();
      this.query();
    },
    setQueryParams() {
      // 设置查询参数
      const vm = this;
      for (const key in vm.$route.query) {
        if (Object.hasOwnProperty.call(vm.$route.query, key)) {
          const element = vm.$route.query[key];
          vm.queryParams[key] = element;
        }
      }
    },
    getUrl(column: any, entity: any) {
      // 针对指定实体对象计算url,替换其中变量
      const reg = /{(\w+)}/g;
      return column.cellUrl.replace(reg, (a: any, b: any) => entity[b]);
    },
    add() {
      const vm = this;
      vm.$router.push(vm.currentPath + '/Add');
    },
    detail(row: any) {
      const vm = this;
      vm.$router.push(vm.currentPath + '/Detail/' + row.id);
    },
    editData(row: any) {
      const vm = this;
      vm.$router.push(vm.currentPath + '/Edit/' + row.id);
    },
    deleteData(row: any) {
      const vm = this;
      vm.$api.base.deleteById(vm.currentPath, row.id).then(() => {
        vm.getTableData();
      });
    },
    query() {
      this.page.pageIndex = 1;
      this.getTableData();
    },
    getTableData() {
      const vm = this;
      vm.listLoading = true;

      vm.$api.base.getDataList(vm.currentPath, vm.queryData).then((res) => {
        vm.listLoading = false;
        const tableData = vm.getTreeData(res.data);
        // console.log(tableData)
        vm.tableData = tableData;
        vm.page = (res as any).page;
        vm.page.totalCount = parseInt(vm.page.totalCount);
        vm.setTableHeight(vm.tableData.length);
      });
    },
    getTreeData(dataList: any, pId = 0) {
      // 将列表数据构造成树状结构数据

      const vm = this;

      if (!dataList || dataList.length < 1) {
        return [];
      }

      const len = dataList.length;
      // 父级列表
      const pList = [];
      for (let idx = 0; idx < len; idx++) {
        const e = dataList[idx];

        if (e.parentID === pId) {
          const m = {
            id: e.id,
            name: e.name,
            displayName: e.displayName,
            parentID: e.parentID,
          };
          pList.push(e);
          const children = vm.getTreeData(dataList, e.id);
          if (children.length > 0) {
            e.children = children;
          }
        }
      }

      return pList;
    },
    currentChange(val: any) {
      this.page.pageIndex = val;
      this.getTableData();
    },
    handleSizeChange(val: any) {
      this.page.pageSize = val;
      this.getTableData();
    },
    sortChange({ column, prop, order }: any) {
      if (order === 'ascending') {
        this.page.desc = false;
        this.page.sort = prop;
      } else if (order === 'descending') {
        this.page.desc = true;
        this.page.sort = prop;
      } else {
        this.page.desc = true;
        this.page.sort = undefined;
      }
      this.getTableData();
    },
    rowDblclick(row: any) {
      this.editData(row);
    },
    hasPermission(actionId: any) {
      const vm = this as any;
      const menuId = vm.$route.meta.menuId;
      const permissions = vm.$route.meta.permissions;
      const has = vm.$store.state.user.hasPermission(vm.$store, {
        menuId,
        actionId,
        permissions,
      });
      return has;
    },
    setTableHeight(count: any) {
      // 根据数据条数设置表格高度,最高设置708px,一页最多显示20条
      const vm = this;
      // console.log(count)
      if (count && count > 0) {
        if (count > 20) {
          count = 20;
        } else if (count < 8) {
          count = 9;
        }
        setTimeout(() => {
          vm.tableHeight = count * 35.9 + 'px';
        }, 500);
      }
    },
  },
});
</script>
<style scoped>
.list-container {
  height: -moz-calc(100vh - 61px);
  height: -webkit-calc(100vh - 61px);
  height: calc(100vh - 61px);
  overflow-x: hidden;
  overflow-y: auto;
}

.search {
  /* height: 60px; */
  /* overflow: hidden; */
  /* position: relative; */
  display: -moz-flex;
  display: -webkit-flex;
  display: flex;
}

.search .left-search {
  line-height: 58px;
  /* height: 60px; */
  /* float: left; */
  padding: 0 10px;
}
.search .right-search {
  line-height: 58px;
  /* height: 65px; */
  /* float: right; */
  /* max-height: 110px; */
  padding: 0 10px;
  /* overflow-y: auto; */
}
.table-container {
  /* max-height: calc(100vh - 177px); */
  /* overflow-y: auto; */
  height: auto;
  margin-bottom: 2px;
  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);
}

.search .el-input,
.el-button,
.el-date-editor {
  margin-right: 2px;
}

.search .el-date-editor {
  width: 250px;
}

/** 操作按钮 */
.el-table .el-button + .el-button {
  margin-left: 3px;
}
</style>