Administrator
2021-09-02 5d20b93a29a1817ed26e8ca30ebba530d79fb64e
Merge branch 'master' of http://192.168.0.105:10010/r/zhba_enterprises
4 files modified
2 files added
884 ■■■■ changed files
src/api/system/dept.js 16 ●●●●● patch | view | raw | blame | history
src/api/zc/zc.js 57 ●●●●● patch | view | raw | blame | history
src/lang/zh.js 209 ●●●● patch | view | raw | blame | history
src/page/login/codelogin.vue 280 ●●●● patch | view | raw | blame | history
src/page/login/index.vue 47 ●●●● patch | view | raw | blame | history
src/views/zc/zc.vue 275 ●●●●● patch | view | raw | blame | history
src/api/system/dept.js
@@ -88,4 +88,18 @@
            parentId
        }
    })
}
}
export const ss = () => {
  return request({
    url: '/api/blade-system/dept/selectInfo',
    method: 'get',
  })
}
export const rs = () => {
  return request({
    url: '/api/blade-system/role/selectRole',
    method: 'get',
  })
}
src/api/zc/zc.js
New file
@@ -0,0 +1,57 @@
import request from '@/router/axios';
export const getList = (current, size, params) => {
  return request({
    url: '/api/zc/page',
    method: 'get',
    params: {
      ...params,
      current,
      size,
    }
  })
}
export const getDetail = (id) => {
  return request({
    url: '/api/zc/detail',
    method: 'get',
    params: {
      id
    }
  })
}
export const remove = (ids) => {
  return request({
    url: '/api/zc/remove',
    method: 'post',
    params: {
      ids,
    }
  })
}
export const add = (row) => {
  return request({
    url: '/api/zc/submit',
    method: 'post',
    data: row
  })
}
export const update = (row) => {
  return request({
    url: '/api/zc/update',
    method: 'post',
    data: row
  })
}
export const inster = (row) => {
  return request({
    url: '/api/zc/inster',
    method: 'post',
    data: row
  })
}
src/lang/zh.js
@@ -1,108 +1,113 @@
export default {
    tip: '提示',
    title: '保安服务企业管理',
    logoutTip: '退出系统, 是否继续?',
    submitText: '确定',
    cancelText: '取消',
    search: '请输入搜索内容',
    menuTip: '没有发现菜单',
    wel: {
        info: '早安,Smallwei,Avuex一款超乎你想象的框架!',
        dept: '我是avue团队下的一个部门-哈皮部门-哈皮职位',
        team: '团队内排名',
        project: '项目访问',
        count: '项目数',
        data: {
            subtitle: '实时',
            column1: '分类统计',
            column2: '附件统计',
            column3: '文章统计',
            key1: '分',
            key2: '附',
            key3: '评',
            text1: '当前分类总记录数',
            text2: '当前上传的附件数',
            text3: '评论次数'
        },
        data2: {
            column1: '今日注册',
            column2: '今日登录',
            column3: '今日订阅',
            column4: '今日评论'
        },
        data3: {
            column1: '转化率(日同比 28%)',
            column2: '签到率(日同比 11%)',
            column3: '签到率(日同比 11%)'
        },
        data4: {
            column1: '错误日志',
            column2: '数据展示',
            column3: '权限管理',
            column4: '用户管理'
        },
        table: {
            rw: '工作任务',
            nr: '工作内容',
            sj: '工作时间'
        }
  tip: '提示',
  title: '保安服务企业管理',
  logoutTip: '退出系统, 是否继续?',
  submitText: '确定',
  cancelText: '取消',
  search: '请输入搜索内容',
  menuTip: '没有发现菜单',
  wel: {
    info: '早安,Smallwei,Avuex一款超乎你想象的框架!',
    dept: '我是avue团队下的一个部门-哈皮部门-哈皮职位',
    team: '团队内排名',
    project: '项目访问',
    count: '项目数',
    data: {
      subtitle: '实时',
      column1: '分类统计',
      column2: '附件统计',
      column3: '文章统计',
      key1: '分',
      key2: '附',
      key3: '评',
      text1: '当前分类总记录数',
      text2: '当前上传的附件数',
      text3: '评论次数'
    },
    route: {
        info: '个人信息',
        website: 'bladex官网',
        avuexwebsite: 'avuex官网',
        dashboard: '首页',
        more: '更多',
        tags: '标签',
        store: '本地存储',
        api: '全局函数',
        logs: '日志监控',
        table: '表格',
        form: '表单',
        top: '返回顶部',
        data: '数据展示',
        permission: '权限',
        error: '异常页面',
        test: '测试页面'
    data2: {
      column1: '今日注册',
      column2: '今日登录',
      column3: '今日订阅',
      column4: '今日评论'
    },
    login: {
        title: '登录 ',
        info: '保安服务企业管理',
        tenantId: '请输入保安单位ID',
        username: '请输入账号',
        password: '请输入密码',
        wechat: '微信',
        qq: 'QQ',
        github: 'github',
        gitee: '码云',
        phone: '请输入手机号',
        code: '请输入验证码',
        submit: '登录',
        userLogin: '账号密码登录',
        phoneLogin: '手机号登录',
        thirdLogin: '第三方系统登录',
        msgText: '发送验证码',
        msgSuccess: '秒后重发',
    data3: {
      column1: '转化率(日同比 28%)',
      column2: '签到率(日同比 11%)',
      column3: '签到率(日同比 11%)'
    },
    navbar: {
        logOut: '退出登录',
        userinfo: '个人信息',
        dashboard: '首页',
        lock: '锁屏',
        bug: '没有错误日志',
        bugs: '条错误日志',
        screenfullF: '退出全屏',
        screenfull: '全屏',
        language: '中英文',
        notice: '消息通知',
        theme: '主题',
        color: '换色'
    data4: {
      column1: '错误日志',
      column2: '数据展示',
      column3: '权限管理',
      column4: '用户管理'
    },
    tagsView: {
        search: '搜索',
        menu: '更多',
        clearCache: '清除缓存',
        closeOthers: '关闭其它',
        closeAll: '关闭所有'
    table: {
      rw: '工作任务',
      nr: '工作内容',
      sj: '工作时间'
    }
}
  },
  route: {
    info: '个人信息',
    website: 'bladex官网',
    avuexwebsite: 'avuex官网',
    dashboard: '首页',
    more: '更多',
    tags: '标签',
    store: '本地存储',
    api: '全局函数',
    logs: '日志监控',
    table: '表格',
    form: '表单',
    top: '返回顶部',
    data: '数据展示',
    permission: '权限',
    error: '异常页面',
    test: '测试页面'
  },
  login: {
    title: '登录 ',
    info: '保安服务企业管理',
    tenantId: '请输入保安单位ID',
    username: '请输入账号',
    password: '请输入密码',
    password2: '请再次输入密码',
    name: '请输入姓名',
    wechat: '微信',
    cardid: '请输入身份证号',
    qq: 'QQ',
    zc: '注册',
    gb: '关闭',
    github: 'github',
    gitee: '码云',
    phone: '请输入手机号',
    code: '请输入验证码',
    submit: '登录',
    userLogin: '账号密码登录',
    phoneLogin: '账号注册',
    thirdLogin: '第三方系统登录',
    msgText: '发送验证码',
    msgSuccess: '秒后重发',
  },
  navbar: {
    logOut: '退出登录',
    userinfo: '个人信息',
    dashboard: '首页',
    lock: '锁屏',
    bug: '没有错误日志',
    bugs: '条错误日志',
    screenfullF: '退出全屏',
    screenfull: '全屏',
    language: '中英文',
    notice: '消息通知',
    theme: '主题',
    color: '换色'
  },
  tagsView: {
    search: '搜索',
    menu: '更多',
    clearCache: '清除缓存',
    closeOthers: '关闭其它',
    closeAll: '关闭所有'
  }
}
src/page/login/codelogin.vue
@@ -5,80 +5,146 @@
           ref="loginForm"
           :model="loginForm"
           label-width="0">
    <el-form-item prop="phone">
    <el-form-item prop="username">
      <el-input size="small"
                @keyup.enter.native="handleLogin"
                v-model="loginForm.phone"
                v-model="loginForm.username"
                auto-complete="off"
                :placeholder="$t('login.phone')">
        <i slot="prefix"
           class="icon-shouji"/>
                :placeholder="$t('login.username')">
        <i slot="prefix" class="icon-yonghu"/>
      </el-input>
    </el-form-item>
    <el-form-item prop="code">
    <el-form-item prop="password">
      <el-input size="small"
                @keyup.enter.native="handleLogin"
                v-model="loginForm.code"
                v-model="loginForm.password"
                auto-complete="off"
                :placeholder="$t('login.code')">
        <i slot="prefix"
           class="icon-yanzhengma"
           style="margin-top:6px;"/>
        <template slot="append">
          <span @click="handleSend"
                class="msg-text"
                :class="[{display:msgKey}]">{{msgText}}</span>
        </template>
                show-password
                :placeholder="$t('login.password')">
        <i slot="prefix" class="icon-mima"/>
      </el-input>
    </el-form-item>
    <el-form-item>
    <el-form-item prop="password2">
      <el-input size="small"
                @keyup.enter.native="handleLogin"
                v-model="loginForm.password2"
                auto-complete="off"
                show-password
                :placeholder="$t('login.password2')">
        <i slot="prefix" class="icon-mima"/>
      </el-input>
    </el-form-item>
    <el-form-item prop="sname">
      <el-input size="small"
                @keyup.enter.native="handleLogin"
                v-model="loginForm.sname"
                auto-complete="off"
                :placeholder="$t('login.name')">
        <i slot="prefix" class="icon-yonghu"/>
      </el-input>
    </el-form-item>
    <el-form-item prop="cardid">
      <el-input size="small"
                v-model="loginForm.cardid"
                auto-complete="off"
                :placeholder="$t('login.cardid')">
        <i slot="prefix" class="icon-shouji"/>
      </el-input>
    </el-form-item>
    <avue-input-tree style="width:580px !important" :defaultExpandAll="loginForm.defaultFlag" v-model="loginForm.deptid" placeholder="请选择部门"
                     type="tree"
                     :dic="dic"></avue-input-tree>
    <el-form-item class="z-login-submit-prv">
      <el-button size="small"
                 type="primary"
                 @click.native.prevent="handleLogin"
                 class="login-submit">{{$t('login.submit')}}</el-button>
                 class="z-login-submit">{{ $t('login.zc') }}
      </el-button>
      <el-button size="small"
                 @click.native.prevent="gbs"
                 class="z-login-submit">{{ $t('login.gb') }}
      </el-button>
    </el-form-item>
  </el-form>
</template>
<script>
import { isvalidatemobile } from "@/util/validate";
import { mapGetters } from "vuex";
import {isvalidatemobile} from "@/util/validate";
import {inster} from "@/api/zc/zc";
import {ss, rs} from "@/api/system/dept";
import {mapGetters} from "vuex";
export default {
  name: "codelogin",
  data() {
    const validatePhone = (rule, value, callback) => {
      if (isvalidatemobile(value)[0]) {
        callback(new Error(isvalidatemobile(value)[1]));
    const validatePass = (rule, value, callback) => {
      if (value === '') {
        callback(new Error('请输入密码'));
      } else {
        callback();
      }
    };
    const validateCode = (rule, value, callback) => {
      if (value.length !== 4) {
        callback(new Error("请输入4位数的验证码"));
    const validatePass2 = (rule, value, callback) => {
      if (value === '') {
        callback(new Error('请再次输入密码'));
      } else if (value !== this.loginForm.password) {
        callback(new Error('两次输入密码不一致!'));
      } else {
        callback();
      }
    };
    const validateIdNo = (rule, value, callback) => {
      let id18 = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
      let id15 = /^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$/;
      if (!id18.test(this.loginForm.cardid) && !id15.test(this.loginForm.cardid)) {
        callback(new Error("请输入正确的身份证号格式"));
      } else {
        callback();
      }
    };
    return {
      msgText: "",
      msgTime: "",
      dic: [],
      dicr: [],
      msgKey: false,
      loginForm: {
        phone: "",
        code: ""
        defaultFlag: false,
        cardid: "",
        username: "",
        sname: "",
        password: "",
        deptid: '',
        roleid: '',
        password2: ""
      },
      value: '',
      options: [],
      loginRules: {
        phone: [{ required: true, trigger: "blur", validator: validatePhone }],
        code: [{ required: true, trigger: "blur", validator: validateCode }]
      }
        cardid: [{required: true, trigger: "blur", validator: validateIdNo}],
        password: [{required: true, validator: validatePass, trigger: 'blur'}],
        password2: [{required: true, validator: validatePass2, trigger: 'blur'}],
        username: [
          {required: true, message: "请输入用户名", trigger: "blur"}
        ],
      },
      passwordType: "password",
      passwordTypes: "password2"
    };
  },
  created() {
    this.msgText = this.config.MSGINIT;
    this.msgTime = this.config.MSGTIME;
    defaultFlag
  },
  mounted() {},
  mounted() {
    var that = this;
    ss().then(res => {
      console.log(that.ergodicData(res.data.data), 898989)
      that.dic = that.ergodicData(res.data.data)
    });
  },
  computed: {
    ...mapGetters(["tagWel"]),
    config() {
@@ -91,6 +157,109 @@
  },
  props: [],
  methods: {
    ergodicData(val) {
      var arr = []
      val.forEach((item, index) => {
        arr.push({label: item.title, value: item.value, id: item.id, parent_id: item.parent_id})
        if (item.hasChildren == true) {
          var arrOne = []
          if (item.children && item.children.length > 0) {
            item.children.forEach((childItem, childIndex) => {
              arrOne.push({
                label: childItem.title,
                value: childItem.value,
                id: childItem.id,
                parent_id: childItem.parent_id
              })
              if (childItem.hasChildren == true) {
                var arrTwo = []
                if (childItem.children && childItem.children.length > 0) {
                  childItem.children.forEach((findItem, findIndex) => {
                    arrTwo.push({
                      label: findItem.title,
                      value: findItem.value,
                      id: findItem.id,
                      parent_id: findItem.parent_id
                    })
                  })
                }
                arrOne[childIndex].children = arrTwo
              }
            })
          }
          arr[index].children = arrOne
        }
      })
      return arr;
    },
    clearValidate(formName) {
      this.$refs[formName].clearValidate();
    },
    async allmedia() {
      ss().then(res => {
        console.log(res, 1323)
        res.data.data.forEach(element => {
          this.options.push({deptname: element.dept_name, deptid: element.deptid});
        })
      });
    },
    refreshCode(row) {
      inster(row).then(res => {
        this.loginForm.cardid = ""
        this.loginForm.username = ""
        this.loginForm.sname = ""
        this.loginForm.password = ""
        this.loginForm.password2 = ""
        this.loginForm.deptid = ""
        this.loginForm.defaultFlag = false
        this.$notify({
          title: '注册成功,待审核',
          type: 'warning'
        });
      })
      var z = document.querySelector('.z');
      z.style.display = 'none';
      this.clearValidate('loginForm')
      this.clearValidate('loginForm')
    },
    gb() {
      this.loginForm.cardid = ""
      this.loginForm.username = ""
      this.loginForm.sname = ""
      this.loginForm.password = ""
      this.loginForm.password2 = ""
      this.loginForm.deptid = ""
      this.loginForm.defaultFlag = false
      var zs = document.querySelector('.z');
      zs.style.display = 'none';
      this.clearValidate('loginForm')
    },
    handleSend() {
      if (this.msgKey) return;
      this.msgText = this.msgTime + this.config.MSGSCUCCESS;
@@ -106,16 +275,30 @@
        }
      }, 1000);
    },
    showPassword() {
      this.passwordType === ""
        ? (this.passwordType = "password")
        : (this.passwordType = "");
    },
    showPasswords() {
      this.passwordType === ""
        ? (this.passwordType = "password2")
        : (this.passwordType = "");
    },
    handleLogin() {
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          this.$store.dispatch("LoginByPhone", this.loginForm).then(() => {
            this.$router.push({ path: this.tagWel.value });
          });
          this.refreshCode(this.loginForm);
          this.message('dahsiofhiusa');
          return Promise.reject(new Error("注册成功,待审核"));
        }
      });
    },
    gbs() {
      this.gb();
    }
  }
};
</script>
@@ -127,7 +310,34 @@
  text-align: center;
  cursor: pointer;
}
.msg-text.display {
  color: #ccc;
}
.z-login-submit-prv {
  margin-top: 25px;
  padding: 0 10%;
  box-sizing: border-box;
}
.z-login-submit-prv > div {
  width: 80%;
  display: flex;
}
.z-login-submit {
  flex: 1;
  height: 45px;
  border: 1px solid #409EFF;
  background: none;
  font-size: 18px;
  letter-spacing: 2px;
  font-weight: 300;
  color: #409EFF;
  cursor: pointer;
  font-family: "neo";
  -webkit-transition: 0.25s;
  transition: 0.25s;
}
</style>
src/page/login/index.vue
@@ -15,19 +15,23 @@
        <div class="login-main">
          <h4 class="login-title">
            {{ $t('login.title') }}
<!--            <top-lang></top-lang>-->
            <!--            <top-lang></top-lang>-->
          </h4>
          <userLogin v-if="activeName==='user'"></userLogin>
          <codeLogin v-else-if="activeName==='code'"></codeLogin>
          <thirdLogin v-else-if="activeName==='third'"></thirdLogin>
          <h4 class="login-title-child">IoT security cloud service platform</h4>
          <userLogin></userLogin>
          <!-- <codeLogin v-else-if="activeName==='code'"></codeLogin>-->
          <!--    <thirdLogin v-else-if="activeName==='third'"></thirdLogin>-->
          <div class="login-menu">
            <a href="#" @click.stop="activeName='user'">{{ $t('login.userLogin') }}</a>
            <!--<a href="#" @click.stop="activeName='code'">{{ $t('login.phoneLogin') }}</a>-->
<!--            <a href="#" @click.stop="activeName='third'">{{ $t('login.thirdLogin') }}</a>-->
            <!--    <a href="#" @click.stop="activeName='user'">{{ $t('login.userLogin') }}</a>-->
            <a href="#" @click.stop="zShow">{{ $t('login.phoneLogin') }}</a>
            <!--   <a href="#" @click.stop="activeName='third'">{{ $t('login.thirdLogin') }}</a>-->
          </div>
        </div>
      </div>
    </div>
    <div class="z" v-show="activeName == 'code'">
      <codeLogin></codeLogin>
    </div>
  </div>
</template>
@@ -109,11 +113,40 @@
            loading.close();
          });
        }
      },
      zShow() {
        document.querySelector('.z').style.display = 'block';
      }
    }
  };
</script>
<style lang="scss">
.z {
  position: fixed;
  margin: auto;
  padding: 10px;
  top: 0;
  left: 0;
  right: 0;
  bottom: 80px;
  width: 600px;
  height: 500px;
  background-color: #fff;
  box-sizing: border-box;
  box-shadow: 6px 6px 5px #909090;
}
.company-jx {
  position: fixed;
  margin: auto;
  top: auto;
  left: 0px;
  right: 0px;
  bottom: 120px;
  text-align: center;
  color: #fff;
  font-size: 15px;
}
  @import "@/styles/login.scss";
</style>
src/views/zc/zc.vue
New file
@@ -0,0 +1,275 @@
<template>
  <basic-container>
    <avue-crud :option="option"
               :table-loading="loading"
               :data="data"
               :page.sync="page"
               :permission="permissionList"
               :before-open="beforeOpen"
               v-model="form"
               ref="crud"
               @row-update="rowUpdate"
               @row-save="rowSave"
               @row-del="rowDel"
               @search-change="searchChange"
               @search-reset="searchReset"
               @selection-change="selectionChange"
               @current-change="currentChange"
               @size-change="sizeChange"
               @refresh-change="refreshChange"
               @on-load="onLoad">
      <template slot="menuLeft">
        <el-button type="danger"
                   size="small"
                   icon="el-icon-delete"
                   plain
                   v-if="permission.zc_delete"
                   @click="handleDelete">删 除
        </el-button>
      </template>
    <template slot-scope="{row}" slot="type">
        <el-tag>{{row.type==='0'?'未审核':row.type==='1'?'审核通过':'审核未通过'}}</el-tag>
      </template>
      <template slot-scope="{row}"
                slot="roleName">
        <el-tag>{{row.roleName}}</el-tag>
      </template>
      <template slot-scope="scope" slot="menu">
        <el-button icon="el-icon-check" size="small"  @click.stop="handleEdit(scope.row,scope.index)">审核</el-button>
      </template>
    </avue-crud>
  </basic-container>
</template>
<script>
  import {getList, getDetail, add, update, remove} from "@/api/zc/zc";
  import {getRoleTree} from "@/api/system/role";
  import {mapGetters} from "vuex";
  export default {
    data() {
      return {
        form: {},
        query: {},
        loading: true,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0
        },
        selectionList: [],
        option: {
          height:'auto',
          calcHeight: 54,
          tip: false,
          searchShow: true,
          searchMenuSpan: 4,
          border: true,
          index: true,
          viewBtn: true,
          selection: true,
          headerAlign: 'center',
          align: 'center',
          dialogClickModal: false,
          column: [
            {
              label: "账号",
              searchSpan:4,
              display: false,
              disabled:true,
              prop: "username",
            },
            {
              label: "密码",
              hide: true,
              editDisplay: false,
              viewDisplay: false,
              prop: "password",
            },
            {
              label: "姓名",
              display: false,
              searchSpan:4,
              disabled:true,
              prop: "sname",
            },
            {
              label: "身份证号",
              disabled:true,
              display: false,
              prop: "cardid",
            },
            {
              label: "部门",
              editDisplay: false,
              prop: "deptid",
            },
            {
              label: "审核状态",
              prop: "type",
              search: true,
              slot: true,
              searchSpan:4,
              type: "select",
              dicData: [
                {
                  label: "未审核",
                  value: "0"
                },
                {
                  label: "审核通过",
                  value: "1"
                },
                {
                  label: "审核不通过",
                  value: "2"
                }
              ],
            }
          ]
        },
        data: []
      };
    },
    computed: {
      ...mapGetters(["permission"]),
      permissionList() {
        return {
         addBtn: this.vaildData(this.permission.zc_add, false),
          viewBtn: this.vaildData(this.permission.zc_view, true),
          delBtn: this.vaildData(this.permission.zc_delete, false),
          editBtn: this.vaildData(this.permission.zc_edit, false)
        };
      },
      ids() {
        let ids = [];
        this.selectionList.forEach(ele => {
          ids.push(ele.id);
        });
        return ids.join(",");
      }
    },
    methods: {
      handleEdit (row, index) {
        this.$refs.crud.rowEdit(row, index);
      },
      rowSave(row, done, loading) {
        add(row).then(() => {
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          done();
        }, error => {
          loading();
          window.console.log(error);
        });
      },
      rowUpdate(row, index, done, loading) {
        update(row).then(() => {
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          done();
        }, error => {
          loading();
          console.log(error);
        });
      },
      rowDel(row) {
        this.$confirm("确定将选择数据删除?", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        })
          .then(() => {
            return remove(row.id);
          })
          .then(() => {
            this.onLoad(this.page);
            this.$message({
              type: "success",
              message: "操作成功!"
            });
          });
      },
      handleDelete() {
        if (this.selectionList.length === 0) {
          this.$message.warning("请选择至少一条数据");
          return;
        }
        this.$confirm("确定将选择数据删除?", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        })
          .then(() => {
            return remove(this.ids);
          })
          .then(() => {
            this.onLoad(this.page);
            this.$message({
              type: "success",
              message: "操作成功!"
            });
            this.$refs.crud.toggleSelection();
          });
      },
      beforeOpen(done, type) {
        if (["edit", "view"].includes(type)) {
          getDetail(this.form.id).then(res => {
            this.form = res.data.data;
          });
        }
        done();
      },
      searchReset() {
        this.query = {};
        this.onLoad(this.page);
      },
      searchChange(params, done) {
        this.query = params;
        this.page.currentPage = 1;
        this.onLoad(this.page, params);
        done();
      },
      selectionChange(list) {
        this.selectionList = list;
      },
      selectionClear() {
        this.selectionList = [];
        this.$refs.crud.toggleSelection();
      },
      currentChange(currentPage){
        this.page.currentPage = currentPage;
      },
      sizeChange(pageSize){
        this.page.pageSize = pageSize;
      },
      refreshChange() {
        this.onLoad(this.page, this.query);
      },
      onLoad(page, params = {}) {
        this.loading = true;
        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
          const data = res.data.data;
          this.page.total = data.total;
          this.data = data.records;
          this.loading = false;
          this.selectionClear();
        });
      }
    }
  };
</script>
<style>
</style>