127.0.
智能大石头 authored at 2024-11-20 00:19:29
694.99 KiB
Stardust
{"version":3,"file":"CubeUI.js","sources":["../../src/views/components/FormControl.vue","../../src/views/components/FormControl.vue","../../src/views/components/NormalTable.vue","../../src/views/components/NormalTable.vue","../../src/views/components/TableOperator.vue","../../src/views/components/TableSearch.vue","../../src/views/components/TableSearch.vue","../../node_modules/element-plus/lib/locale/lang/zh-cn.js","../../src/App.vue","../../src/App.vue","../../src/components/NormalTable.vue","../../src/components/NormalTable.vue","../../src/components/TableHandler.vue","../../src/components/TableHandler.vue","../../src/components/FormControl.vue","../../src/components/FormControl.vue","../../src/components/TableSearch.vue","../../src/components/TableSearch.vue","../../src/components/TablePagination.vue","../../src/components/TablePagination.vue","../../src/components/AdvancedTable.vue","../../src/components/multipleSelect.vue","../../src/components/multipleSelect.vue","../../src/components/singleSelect.vue","../../src/components/singleSelect.vue","../../src/layouts/components/appMain.vue","../../src/layouts/components/appMain.vue","../../src/layouts/components/hamburger.vue","../../src/layouts/components/hamburger.vue","../../src/views/layout/components/hamburger.vue","../../src/views/layout/components/hamburger.vue","../../src/layouts/components/navbar.vue","../../src/layouts/components/navbar.vue","../../src/layouts/components/sidebar/Item.vue","../../src/layouts/components/sidebar/Item.vue","../../src/layouts/components/sidebar/SidebarItem.vue","../../src/layouts/components/sidebar/SidebarItem.vue","../../src/utils/storage.ts","../../src/utils/menu.ts","../../src/layouts/components/sidebar/index.vue","../../src/layouts/components/sidebar/index.vue","../../src/views/layout/components/navbar.vue","../../src/views/layout/components/navbar.vue","../../src/views/layout/components/sidebar/Item.vue","../../src/views/layout/components/sidebar/Item.vue","../../src/views/layout/components/sidebar/SidebarItem.vue","../../src/views/layout/components/sidebar/SidebarItem.vue","../../src/views/layout/components/sidebar/index.vue","../../src/views/layout/components/sidebar/index.vue","../../src/views/layout/components/appMain.vue","../../src/views/layout/components/appMain.vue","../../src/views/layout/mixin/ResizeHandler.js","../../src/layouts/index.vue","../../src/pages/auth-redirect.vue","../../src/pages/docs.vue","../../src/pages/index.vue","../../src/pages/login.vue","../../src/pages/login.vue","../../src/pages/test.vue","../../src/views/common/objectForm.vue","../../src/views/common/objectForm.vue","../../src/views/common/list.vue","../../src/views/common/list.vue","../../src/views/Admin/Cube/list.vue","../../src/views/Admin/Index/Main.vue","../../src/views/Admin/Menu/form.vue","../../src/views/Admin/Menu/form.vue","../../src/views/Admin/Menu/list.vue","../../src/views/Admin/Menu/list.vue","../../src/views/Admin/Role/config.tsx","../../src/views/Admin/Role/form.vue","../../src/views/Admin/Role/form.vue","../../src/views/Admin/User/config.tsx","../../src/views/Admin/User/info.vue","../../src/views/Admin/User/info.vue","../../src/views/account/auth-redirect.vue","../../src/views/account/login.vue","../../src/views/account/login.vue","../../src/views/common/form.vue","../../src/views/common/form.vue","../../src/views/layout/index.vue","../../src/api/api-base.ts","../../src/api/config.ts","../../src/api/menu.ts","../../src/utils/token.ts","../../src/utils/user.ts","../../src/api/user.ts","../../src/api/index.ts","../../src/utils/request.ts","../../node_modules/lodash/_freeGlobal.js","../../node_modules/lodash/_root.js","../../node_modules/lodash/_Symbol.js","../../node_modules/lodash/_arrayMap.js","../../node_modules/lodash/isArray.js","../../node_modules/lodash/_getRawTag.js","../../node_modules/lodash/_objectToString.js","../../node_modules/lodash/_baseGetTag.js","../../node_modules/lodash/isObjectLike.js","../../node_modules/lodash/isSymbol.js","../../node_modules/lodash/_baseToString.js","../../node_modules/lodash/toString.js","../../node_modules/lodash/_baseSlice.js","../../node_modules/lodash/_castSlice.js","../../node_modules/lodash/_hasUnicode.js","../../node_modules/lodash/_asciiToArray.js","../../node_modules/lodash/_unicodeToArray.js","../../node_modules/lodash/_stringToArray.js","../../node_modules/lodash/_createCaseFirst.js","../../node_modules/lodash/upperFirst.js","../../node_modules/lodash/capitalize.js","../../node_modules/lodash/_arrayReduce.js","../../node_modules/lodash/_basePropertyOf.js","../../node_modules/lodash/_deburrLetter.js","../../node_modules/lodash/deburr.js","../../node_modules/lodash/_asciiWords.js","../../node_modules/lodash/_hasUnicodeWord.js","../../node_modules/lodash/_unicodeWords.js","../../node_modules/lodash/words.js","../../node_modules/lodash/_createCompounder.js","../../node_modules/lodash/camelCase.js","../../src/utils/requireComponent.ts","../../src/services/file-context.ts","../../src/router/beforeEach.ts","../../src/router/index.ts","../../src/utils/route.ts","../../src/store/modules/route.ts","../../src/store/modules/user.ts","../../src/store/modules/entity.ts","../../src/api/constant.ts","../../src/store/modules/app.ts","../../src/store/getters.ts","../../src/store/index.ts","../../src/index.ts"],"sourcesContent":["<template>\r\n  <el-select-v2\r\n    v-if=\"configs.itemType === 'select'\"\r\n    v-model=\"model\"\r\n    size=\"default\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    :placeholder=\"options.placeholder || '请选择' + configs.displayName\"\r\n    :remote=\"options.remote === 'true'\"\r\n    :remote-method=\"getRemoteData\"\r\n    :allow-create=\"options.allowCreate === 'true'\"\r\n    :multiple=\"options.multiple === 'true'\"\r\n    :options=\"selectOptions\"\r\n    filterable\r\n    clearable\r\n    v-bind=\"$attrs\"\r\n  >\r\n    <!-- <el-option\r\n      v-for=\"(item, idx) in dataList\"\r\n      :key=\"idx\"\r\n      :label=\"item[options.labelField || 'label']\"\r\n      :value=\"getValueByDataType(item, options)\"\r\n    ></el-option> -->\r\n  </el-select-v2>\r\n\r\n  <template v-else-if=\"configs.itemType === 'radio'\">\r\n    <div :style=\"{ width: configs.width ? configs.width : '220px' }\">\r\n      <el-radio\r\n        v-if=\"valueValidate(options.value1)\"\r\n        v-model=\"model\"\r\n        :label=\"\r\n          typeof model === 'number' ? parseInt(options.value1) : options.value1\r\n        \"\r\n        v-bind=\"$attrs\"\r\n      >\r\n        {{ options.label1 }}\r\n      </el-radio>\r\n      <el-radio\r\n        v-if=\"valueValidate(options.value2)\"\r\n        v-model=\"model\"\r\n        :label=\"\r\n          typeof model === 'number' ? parseInt(options.value2) : options.value2\r\n        \"\r\n        v-bind=\"$attrs\"\r\n      >\r\n        {{ options.label2 }}\r\n      </el-radio>\r\n    </div>\r\n  </template>\r\n\r\n  <div\r\n    v-else-if=\"configs.itemType === 'checkbox'\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n  >\r\n    <el-checkbox-group v-model=\"model\" v-bind=\"$attrs\">\r\n      <el-checkbox\r\n        v-for=\"item in dataList\"\r\n        :label=\"getValueByDataType(item, options)\"\r\n      >\r\n        {{ item[options.labelField || 'label'] }}\r\n      </el-checkbox>\r\n    </el-checkbox-group>\r\n  </div>\r\n\r\n  <!-- 日期时间选择器 -->\r\n  <el-date-picker\r\n    v-else-if=\"configs.itemType === 'datePicker'\"\r\n    v-model=\"model\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    size=\"default\"\r\n    class=\"date-time-picker\"\r\n    :type=\"options.type\"\r\n    format=\"YYYY-MM-DD\"\r\n    value-format=\"YYYY-MM-DD\"\r\n    range-separator=\"至\"\r\n    :start-placeholder=\"'开始时间'\"\r\n    :end-placeholder=\"'结束时间'\"\r\n    :shortcuts=\"shortcuts\"\r\n    v-bind=\"$attrs\"\r\n  ></el-date-picker>\r\n\r\n  <!-- input 标签 ,默认-->\r\n  <el-input\r\n    v-else\r\n    size=\"default\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    :prefix-icon=\"options.icon\"\r\n    :placeholder=\"options.placeholder || '请输入' + configs.displayName\"\r\n    v-model=\"model\"\r\n    clearable\r\n    :rows=\"4\"\r\n    :type=\"options.type || 'text'\"\r\n    :disabled=\"options.disabled === 'true' ? true : false\"\r\n    v-bind=\"$attrs\"\r\n  ></el-input>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue'\r\nexport default defineComponent({\r\n  name: 'FormControl',\r\n  props: {\r\n    // modelValue: [String, Number, Object, Boolean, Array],\r\n    modelValue: [Object],\r\n    // 字段配置\r\n    configs: {\r\n      type: Object,\r\n      default: {}\r\n    }\r\n  },\r\n  emits: ['update:modelValue'],\r\n  data() {\r\n    return {\r\n      model: undefined as any,\r\n      shortcuts: [\r\n        {\r\n          text: '昨天',\r\n          value() {\r\n            const end = new Date()\r\n            const start = new Date()\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)\r\n            end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)\r\n            return [start, end]\r\n          }\r\n        },\r\n        {\r\n          text: '今天',\r\n          value() {\r\n            const end = new Date()\r\n            const start = new Date()\r\n            return [start, end]\r\n          }\r\n        },\r\n        {\r\n          text: '最近一周',\r\n          value() {\r\n            const end = new Date()\r\n            const start = new Date()\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)\r\n            return [start, end]\r\n          }\r\n        },\r\n        {\r\n          text: '最近一个月',\r\n          value() {\r\n            const end = new Date()\r\n            const start = new Date()\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)\r\n            return [start, end]\r\n          }\r\n        }\r\n      ],\r\n      // 选项列表\r\n      dataList: [] as any\r\n    }\r\n  },\r\n  computed: {\r\n    // ui组件的配置\r\n    options(): any {\r\n      let vm = this\r\n      let obj = {} as any\r\n      let configs = vm.configs\r\n\r\n      if (!configs.options) {\r\n        return obj\r\n      }\r\n\r\n      let searchParams = new URLSearchParams(configs.options) as any\r\n      for (const item of searchParams) {\r\n        let val = item[1] as any\r\n        // if (val.startsWith('{') || val.startsWith('[]')) {\r\n        //   val = JSON.parse(val)\r\n        // }\r\n\r\n        // 不转类型。直接判断字符串的值,可以优化为。无值的时候赋值false\r\n        // if (val === 'true') {\r\n        //   val = true\r\n        // } else if (val === 'false') {\r\n        //   val = false\r\n        // }\r\n        obj[item[0]] = val\r\n      }\r\n      // console.log('options', obj)\r\n      return obj\r\n    },\r\n    name() {\r\n      return this.configs.name\r\n    },\r\n    selectOptions() {\r\n      return this.dataList.map(\r\n        (x: any) =>\r\n          new Object({\r\n            label: x[this.options.labelField || 'label'],\r\n            // 如果是多选,由于数组转逗号隔开的字符串,再转成数组,值就变成字符串,因此统一处理为字符串\r\n            value:\r\n              this.options.multiple === 'true'\r\n                ? this.getValueByDataType(x, this.options) + ''\r\n                : this.getValueByDataType(x, this.options)\r\n          })\r\n      )\r\n    }\r\n  },\r\n  watch: {\r\n    model(val, oldVal) {\r\n      let name = this.name\r\n      let configs = this.configs\r\n      let options = this.options\r\n\r\n      // 字段名包含$,特殊处理\r\n      let temp = this.modelValue as any\r\n      if (name.includes('$')) {\r\n        let arr = val // temp[name]\r\n        let names = name.split('$')\r\n\r\n        if (\r\n          configs.itemType === 'datePicker' &&\r\n          configs.options &&\r\n          configs.options.includes('type=daterange')\r\n        ) {\r\n          // 日期范围\r\n\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr[0]\r\n            temp[names[1]] = arr[1]\r\n          } else {\r\n            temp[names[0]] = undefined\r\n            temp[names[1]] = undefined\r\n          }\r\n        } else if (configs.itemType === 'checkbox') {\r\n          // 多选框\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr.join()\r\n          } else {\r\n            temp[names[0]] = undefined\r\n          }\r\n        } else if (\r\n          configs.itemType === 'select' &&\r\n          options.multiple === 'true'\r\n        ) {\r\n          // 多选下拉\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr.join()\r\n          } else {\r\n            temp[names[0]] = undefined\r\n          }\r\n        } else {\r\n          console.warn('表单名中带$,但是未配置处理器')\r\n        }\r\n      } else {\r\n        if (configs.itemType === 'select' && !this.valueValidate(val)) {\r\n          // 下拉框上点击清除时,值为空字符串,处理为undefined\r\n          val = undefined\r\n        }\r\n\r\n        temp[name] = val\r\n      }\r\n\r\n      // 因为是对象引用,单属性值变化,可以不触发更新\r\n      // this.$emit('update:modelValue', this.modelValue)\r\n    },\r\n    // 外部修改此值,以便传递到model\r\n    modelValue: {\r\n      handler(val: any, oldVal) {\r\n        let name = this.name\r\n        let value = val[this.name]\r\n        let configs = this.configs\r\n        let options = this.options\r\n\r\n        // 字段名包含$,特殊处理\r\n        if (name.includes('$')) {\r\n          let names = name.split('$')\r\n          if (\r\n            configs.itemType === 'datePicker' &&\r\n            configs.options &&\r\n            configs.options.includes('type=daterange')\r\n          ) {\r\n            // 特殊处理日期范围选择,日期范围传进来的应是个数组\r\n            // 取完值后置空,model的watch事件会为modelValue增加两个字段,即$分割的两个字段\r\n            // TODO 这里可增加一个处理,从被分割的两个字段中拿值\r\n            if (this.valueValidate(value)) {\r\n              this.model = [value[0], value[1]]\r\n              ;(this.modelValue as any)[name] = undefined\r\n            } else {\r\n              // 如果分割后的两个字段不为空,就不用重置值。因为有可能传进来的值为空是上面的if设置导致\r\n              if (\r\n                !(this.modelValue as any)[names[0]] ||\r\n                !(this.modelValue as any)[names[1]]\r\n              ) {\r\n                this.model = undefined\r\n              }\r\n            }\r\n          } else if (configs.itemType === 'checkbox') {\r\n            // 外部传进来的应是逗号隔开的值,传值的字段从name中分离出,然后在这里被序列化成数组\r\n            // value 重新取值\r\n            value = val[names[0]]\r\n            if (this.valueValidate(value)) {\r\n              let arr = value.split(',')\r\n              this.model = arr\r\n            } else {\r\n              this.model = undefined\r\n            }\r\n          } else if (\r\n            configs.itemType === 'select' &&\r\n            options.multiple === 'true'\r\n          ) {\r\n            // 外部传进来的应是逗号隔开的值,传值的字段从name中分离出,然后在这里被序列化成数组\r\n            // value 重新取值\r\n            value = val[names[0]]\r\n            if (this.valueValidate(value)) {\r\n              let arr = value.split(',')\r\n              this.model = arr\r\n            } else {\r\n              this.model = []\r\n            }\r\n          }\r\n        } else {\r\n          if (configs.itemType === 'select' && options.multiple === 'true') {\r\n            this.model = value || []\r\n          } else { this.model = value }\r\n        }\r\n      },\r\n      // 加了此选项,就不用再created赋值\r\n      immediate: true,\r\n      deep: true\r\n    },\r\n    'configs.url': {\r\n      handler() {\r\n        this.getData()\r\n      }\r\n    },\r\n    // 获取远程数据的参数\r\n    'configs.data': {\r\n      handler() {\r\n        this.getData()\r\n      },\r\n      deep: true\r\n    }\r\n    // !!! 不能监听,外部如果共用configs,那么所有用了该configs的组件都会受影响\r\n    // 'configs.dataList': {\r\n    //   handler() {\r\n    //     this.dataList = this.configs.dataList\r\n    //   },\r\n    //   deep: true\r\n    // }\r\n  },\r\n  created() {\r\n    let vm = this\r\n\r\n    // 远程或本地数据源处理\r\n    vm.getData()\r\n  },\r\n  methods: {\r\n    // 设置请求参数,configs.data。对options.data进行处理,如果值有{{field}}形式的值,则替换成为model中的值\r\n    setData() {\r\n      if (!this.options.data) { return }\r\n      let data = JSON.parse(this.options.data)\r\n\r\n      if (!this.configs.data) {\r\n        this.configs.data = {}\r\n      }\r\n\r\n      for (const key in data) {\r\n        if (Object.prototype.hasOwnProperty.call(data, key)) {\r\n          const val = data[key]\r\n\r\n          if (\r\n            typeof val === 'string' &&\r\n            val.startsWith('{{') &&\r\n            val.endsWith('}}')\r\n          ) {\r\n            if (this.modelValue) {\r\n              this.configs.data[key] =\r\n                this.modelValue[val.substring(2, val.length - 2)]\r\n            }\r\n          } else {\r\n            this.configs.data[key] = val\r\n          }\r\n        }\r\n      }\r\n    },\r\n    // 类似多选下拉的组件,设置默认值\r\n    setDefaultValue() {\r\n      let vm = this\r\n      let options = vm.options\r\n      let row = vm.modelValue as any\r\n      if (vm.dataList) {\r\n        // 不设置该选项,直接返回\r\n        if (!options.getValueField || !options.getLabelField) {\r\n          return\r\n        }\r\n\r\n        let val = row[options.getValueField]\r\n        // 如果值为空,说明是新增,还没有默认值\r\n        if (!val) { return }\r\n\r\n        let data = {\r\n          [options.labelField]: row[options.getLabelField] || val,\r\n          [options.valueField]: val\r\n        }\r\n\r\n        vm.dataList.push(data)\r\n      }\r\n    },\r\n    getData() {\r\n      let vm = this\r\n      let url = vm.configs.url\r\n      if (!url) {\r\n        return\r\n      }\r\n\r\n      // 远程下拉框,直接返回\r\n      if (vm.options.remote === 'true') {\r\n        // 设置默认选项\r\n        this.setDefaultValue()\r\n        return\r\n      }\r\n\r\n      // 如果本身就是数组\r\n      if (typeof url === 'object' && url.length > 0) {\r\n        vm.dataList = url\r\n        return\r\n      }\r\n\r\n      // 如果是[开头,说明数据是数组\r\n      if (typeof url !== 'string') {\r\n        console.warn('配置中url不正确,不进行处理', url)\r\n        return\r\n      }\r\n\r\n      if (url.startsWith('[')) {\r\n        // 直接解析url中数据\r\n        vm.getLocalData()\r\n      } else if (url.startsWith('/') || url.startsWith('http')) {\r\n        // 请求url获取数据\r\n        vm.getRemoteData()\r\n      } else {\r\n        console.warn('配置中url不正确,不进行处理', url)\r\n      }\r\n    },\r\n    // 获取远程数据\r\n    getRemoteData(query = '') {\r\n      let vm = this\r\n      let url = vm.configs.url\r\n      let method = vm.options.method || 'post'\r\n      let data =\r\n        method === 'post'\r\n          ? {\r\n              txtKeywords: query\r\n            }\r\n          : undefined\r\n\r\n      // 设置data,处理插值\r\n      this.setData()\r\n\r\n      if (vm.configs.data) {\r\n        data = { ...data, ...vm.configs.data }\r\n      }\r\n\r\n      let config = {\r\n        url,\r\n        method,\r\n        data\r\n      }\r\n\r\n      vm.$http(config).then((resp) => {\r\n        const array = resp.data\r\n        vm.dataList = array.rows || array.list || array\r\n      })\r\n    },\r\n    // 解析url中的数据\r\n    getLocalData() {\r\n      const vm = this\r\n      const data = JSON.parse(vm.configs.url)\r\n      vm.dataList = data\r\n    },\r\n    getValueByDataType(data: any, option: any) {\r\n      let val = data[option.valueField || 'value']\r\n      if (option.dataType === 'Int32' || option.dataType === 'int') {\r\n        val = parseInt(val)\r\n      }\r\n      return val\r\n    },\r\n    /**\r\n     * 有效值验证,不为undefined、空字符串、null\r\n     */\r\n    valueValidate(value: any) {\r\n      return value !== '' && value !== undefined && value !== null\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style></style>\r\n","<template>\r\n  <el-select-v2\r\n    v-if=\"configs.itemType === 'select'\"\r\n    v-model=\"model\"\r\n    size=\"default\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    :placeholder=\"options.placeholder || '请选择' + configs.displayName\"\r\n    :remote=\"options.remote === 'true'\"\r\n    :remote-method=\"getRemoteData\"\r\n    :allow-create=\"options.allowCreate === 'true'\"\r\n    :multiple=\"options.multiple === 'true'\"\r\n    :options=\"selectOptions\"\r\n    filterable\r\n    clearable\r\n    v-bind=\"$attrs\"\r\n  >\r\n    <!-- <el-option\r\n      v-for=\"(item, idx) in dataList\"\r\n      :key=\"idx\"\r\n      :label=\"item[options.labelField || 'label']\"\r\n      :value=\"getValueByDataType(item, options)\"\r\n    ></el-option> -->\r\n  </el-select-v2>\r\n\r\n  <template v-else-if=\"configs.itemType === 'radio'\">\r\n    <div :style=\"{ width: configs.width ? configs.width : '220px' }\">\r\n      <el-radio\r\n        v-if=\"valueValidate(options.value1)\"\r\n        v-model=\"model\"\r\n        :label=\"\r\n          typeof model === 'number' ? parseInt(options.value1) : options.value1\r\n        \"\r\n        v-bind=\"$attrs\"\r\n      >\r\n        {{ options.label1 }}\r\n      </el-radio>\r\n      <el-radio\r\n        v-if=\"valueValidate(options.value2)\"\r\n        v-model=\"model\"\r\n        :label=\"\r\n          typeof model === 'number' ? parseInt(options.value2) : options.value2\r\n        \"\r\n        v-bind=\"$attrs\"\r\n      >\r\n        {{ options.label2 }}\r\n      </el-radio>\r\n    </div>\r\n  </template>\r\n\r\n  <div\r\n    v-else-if=\"configs.itemType === 'checkbox'\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n  >\r\n    <el-checkbox-group v-model=\"model\" v-bind=\"$attrs\">\r\n      <el-checkbox\r\n        v-for=\"item in dataList\"\r\n        :label=\"getValueByDataType(item, options)\"\r\n      >\r\n        {{ item[options.labelField || 'label'] }}\r\n      </el-checkbox>\r\n    </el-checkbox-group>\r\n  </div>\r\n\r\n  <!-- 日期时间选择器 -->\r\n  <el-date-picker\r\n    v-else-if=\"configs.itemType === 'datePicker'\"\r\n    v-model=\"model\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    size=\"default\"\r\n    class=\"date-time-picker\"\r\n    :type=\"options.type\"\r\n    format=\"YYYY-MM-DD\"\r\n    value-format=\"YYYY-MM-DD\"\r\n    range-separator=\"至\"\r\n    :start-placeholder=\"'开始时间'\"\r\n    :end-placeholder=\"'结束时间'\"\r\n    :shortcuts=\"shortcuts\"\r\n    v-bind=\"$attrs\"\r\n  ></el-date-picker>\r\n\r\n  <!-- input 标签 ,默认-->\r\n  <el-input\r\n    v-else\r\n    size=\"default\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    :prefix-icon=\"options.icon\"\r\n    :placeholder=\"options.placeholder || '请输入' + configs.displayName\"\r\n    v-model=\"model\"\r\n    clearable\r\n    :rows=\"4\"\r\n    :type=\"options.type || 'text'\"\r\n    :disabled=\"options.disabled === 'true' ? true : false\"\r\n    v-bind=\"$attrs\"\r\n  ></el-input>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue'\r\nexport default defineComponent({\r\n  name: 'FormControl',\r\n  props: {\r\n    // modelValue: [String, Number, Object, Boolean, Array],\r\n    modelValue: [Object],\r\n    // 字段配置\r\n    configs: {\r\n      type: Object,\r\n      default: {}\r\n    }\r\n  },\r\n  emits: ['update:modelValue'],\r\n  data() {\r\n    return {\r\n      model: undefined as any,\r\n      shortcuts: [\r\n        {\r\n          text: '昨天',\r\n          value() {\r\n            const end = new Date()\r\n            const start = new Date()\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)\r\n            end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)\r\n            return [start, end]\r\n          }\r\n        },\r\n        {\r\n          text: '今天',\r\n          value() {\r\n            const end = new Date()\r\n            const start = new Date()\r\n            return [start, end]\r\n          }\r\n        },\r\n        {\r\n          text: '最近一周',\r\n          value() {\r\n            const end = new Date()\r\n            const start = new Date()\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)\r\n            return [start, end]\r\n          }\r\n        },\r\n        {\r\n          text: '最近一个月',\r\n          value() {\r\n            const end = new Date()\r\n            const start = new Date()\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)\r\n            return [start, end]\r\n          }\r\n        }\r\n      ],\r\n      // 选项列表\r\n      dataList: [] as any\r\n    }\r\n  },\r\n  computed: {\r\n    // ui组件的配置\r\n    options(): any {\r\n      let vm = this\r\n      let obj = {} as any\r\n      let configs = vm.configs\r\n\r\n      if (!configs.options) {\r\n        return obj\r\n      }\r\n\r\n      let searchParams = new URLSearchParams(configs.options) as any\r\n      for (const item of searchParams) {\r\n        let val = item[1] as any\r\n        // if (val.startsWith('{') || val.startsWith('[]')) {\r\n        //   val = JSON.parse(val)\r\n        // }\r\n\r\n        // 不转类型。直接判断字符串的值,可以优化为。无值的时候赋值false\r\n        // if (val === 'true') {\r\n        //   val = true\r\n        // } else if (val === 'false') {\r\n        //   val = false\r\n        // }\r\n        obj[item[0]] = val\r\n      }\r\n      // console.log('options', obj)\r\n      return obj\r\n    },\r\n    name() {\r\n      return this.configs.name\r\n    },\r\n    selectOptions() {\r\n      return this.dataList.map(\r\n        (x: any) =>\r\n          new Object({\r\n            label: x[this.options.labelField || 'label'],\r\n            // 如果是多选,由于数组转逗号隔开的字符串,再转成数组,值就变成字符串,因此统一处理为字符串\r\n            value:\r\n              this.options.multiple === 'true'\r\n                ? this.getValueByDataType(x, this.options) + ''\r\n                : this.getValueByDataType(x, this.options)\r\n          })\r\n      )\r\n    }\r\n  },\r\n  watch: {\r\n    model(val, oldVal) {\r\n      let name = this.name\r\n      let configs = this.configs\r\n      let options = this.options\r\n\r\n      // 字段名包含$,特殊处理\r\n      let temp = this.modelValue as any\r\n      if (name.includes('$')) {\r\n        let arr = val // temp[name]\r\n        let names = name.split('$')\r\n\r\n        if (\r\n          configs.itemType === 'datePicker' &&\r\n          configs.options &&\r\n          configs.options.includes('type=daterange')\r\n        ) {\r\n          // 日期范围\r\n\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr[0]\r\n            temp[names[1]] = arr[1]\r\n          } else {\r\n            temp[names[0]] = undefined\r\n            temp[names[1]] = undefined\r\n          }\r\n        } else if (configs.itemType === 'checkbox') {\r\n          // 多选框\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr.join()\r\n          } else {\r\n            temp[names[0]] = undefined\r\n          }\r\n        } else if (\r\n          configs.itemType === 'select' &&\r\n          options.multiple === 'true'\r\n        ) {\r\n          // 多选下拉\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr.join()\r\n          } else {\r\n            temp[names[0]] = undefined\r\n          }\r\n        } else {\r\n          console.warn('表单名中带$,但是未配置处理器')\r\n        }\r\n      } else {\r\n        if (configs.itemType === 'select' && !this.valueValidate(val)) {\r\n          // 下拉框上点击清除时,值为空字符串,处理为undefined\r\n          val = undefined\r\n        }\r\n\r\n        temp[name] = val\r\n      }\r\n\r\n      // 因为是对象引用,单属性值变化,可以不触发更新\r\n      // this.$emit('update:modelValue', this.modelValue)\r\n    },\r\n    // 外部修改此值,以便传递到model\r\n    modelValue: {\r\n      handler(val: any, oldVal) {\r\n        let name = this.name\r\n        let value = val[this.name]\r\n        let configs = this.configs\r\n        let options = this.options\r\n\r\n        // 字段名包含$,特殊处理\r\n        if (name.includes('$')) {\r\n          let names = name.split('$')\r\n          if (\r\n            configs.itemType === 'datePicker' &&\r\n            configs.options &&\r\n            configs.options.includes('type=daterange')\r\n          ) {\r\n            // 特殊处理日期范围选择,日期范围传进来的应是个数组\r\n            // 取完值后置空,model的watch事件会为modelValue增加两个字段,即$分割的两个字段\r\n            // TODO 这里可增加一个处理,从被分割的两个字段中拿值\r\n            if (this.valueValidate(value)) {\r\n              this.model = [value[0], value[1]]\r\n              ;(this.modelValue as any)[name] = undefined\r\n            } else {\r\n              // 如果分割后的两个字段不为空,就不用重置值。因为有可能传进来的值为空是上面的if设置导致\r\n              if (\r\n                !(this.modelValue as any)[names[0]] ||\r\n                !(this.modelValue as any)[names[1]]\r\n              ) {\r\n                this.model = undefined\r\n              }\r\n            }\r\n          } else if (configs.itemType === 'checkbox') {\r\n            // 外部传进来的应是逗号隔开的值,传值的字段从name中分离出,然后在这里被序列化成数组\r\n            // value 重新取值\r\n            value = val[names[0]]\r\n            if (this.valueValidate(value)) {\r\n              let arr = value.split(',')\r\n              this.model = arr\r\n            } else {\r\n              this.model = undefined\r\n            }\r\n          } else if (\r\n            configs.itemType === 'select' &&\r\n            options.multiple === 'true'\r\n          ) {\r\n            // 外部传进来的应是逗号隔开的值,传值的字段从name中分离出,然后在这里被序列化成数组\r\n            // value 重新取值\r\n            value = val[names[0]]\r\n            if (this.valueValidate(value)) {\r\n              let arr = value.split(',')\r\n              this.model = arr\r\n            } else {\r\n              this.model = []\r\n            }\r\n          }\r\n        } else {\r\n          if (configs.itemType === 'select' && options.multiple === 'true') {\r\n            this.model = value || []\r\n          } else { this.model = value }\r\n        }\r\n      },\r\n      // 加了此选项,就不用再created赋值\r\n      immediate: true,\r\n      deep: true\r\n    },\r\n    'configs.url': {\r\n      handler() {\r\n        this.getData()\r\n      }\r\n    },\r\n    // 获取远程数据的参数\r\n    'configs.data': {\r\n      handler() {\r\n        this.getData()\r\n      },\r\n      deep: true\r\n    }\r\n    // !!! 不能监听,外部如果共用configs,那么所有用了该configs的组件都会受影响\r\n    // 'configs.dataList': {\r\n    //   handler() {\r\n    //     this.dataList = this.configs.dataList\r\n    //   },\r\n    //   deep: true\r\n    // }\r\n  },\r\n  created() {\r\n    let vm = this\r\n\r\n    // 远程或本地数据源处理\r\n    vm.getData()\r\n  },\r\n  methods: {\r\n    // 设置请求参数,configs.data。对options.data进行处理,如果值有{{field}}形式的值,则替换成为model中的值\r\n    setData() {\r\n      if (!this.options.data) { return }\r\n      let data = JSON.parse(this.options.data)\r\n\r\n      if (!this.configs.data) {\r\n        this.configs.data = {}\r\n      }\r\n\r\n      for (const key in data) {\r\n        if (Object.prototype.hasOwnProperty.call(data, key)) {\r\n          const val = data[key]\r\n\r\n          if (\r\n            typeof val === 'string' &&\r\n            val.startsWith('{{') &&\r\n            val.endsWith('}}')\r\n          ) {\r\n            if (this.modelValue) {\r\n              this.configs.data[key] =\r\n                this.modelValue[val.substring(2, val.length - 2)]\r\n            }\r\n          } else {\r\n            this.configs.data[key] = val\r\n          }\r\n        }\r\n      }\r\n    },\r\n    // 类似多选下拉的组件,设置默认值\r\n    setDefaultValue() {\r\n      let vm = this\r\n      let options = vm.options\r\n      let row = vm.modelValue as any\r\n      if (vm.dataList) {\r\n        // 不设置该选项,直接返回\r\n        if (!options.getValueField || !options.getLabelField) {\r\n          return\r\n        }\r\n\r\n        let val = row[options.getValueField]\r\n        // 如果值为空,说明是新增,还没有默认值\r\n        if (!val) { return }\r\n\r\n        let data = {\r\n          [options.labelField]: row[options.getLabelField] || val,\r\n          [options.valueField]: val\r\n        }\r\n\r\n        vm.dataList.push(data)\r\n      }\r\n    },\r\n    getData() {\r\n      let vm = this\r\n      let url = vm.configs.url\r\n      if (!url) {\r\n        return\r\n      }\r\n\r\n      // 远程下拉框,直接返回\r\n      if (vm.options.remote === 'true') {\r\n        // 设置默认选项\r\n        this.setDefaultValue()\r\n        return\r\n      }\r\n\r\n      // 如果本身就是数组\r\n      if (typeof url === 'object' && url.length > 0) {\r\n        vm.dataList = url\r\n        return\r\n      }\r\n\r\n      // 如果是[开头,说明数据是数组\r\n      if (typeof url !== 'string') {\r\n        console.warn('配置中url不正确,不进行处理', url)\r\n        return\r\n      }\r\n\r\n      if (url.startsWith('[')) {\r\n        // 直接解析url中数据\r\n        vm.getLocalData()\r\n      } else if (url.startsWith('/') || url.startsWith('http')) {\r\n        // 请求url获取数据\r\n        vm.getRemoteData()\r\n      } else {\r\n        console.warn('配置中url不正确,不进行处理', url)\r\n      }\r\n    },\r\n    // 获取远程数据\r\n    getRemoteData(query = '') {\r\n      let vm = this\r\n      let url = vm.configs.url\r\n      let method = vm.options.method || 'post'\r\n      let data =\r\n        method === 'post'\r\n          ? {\r\n              txtKeywords: query\r\n            }\r\n          : undefined\r\n\r\n      // 设置data,处理插值\r\n      this.setData()\r\n\r\n      if (vm.configs.data) {\r\n        data = { ...data, ...vm.configs.data }\r\n      }\r\n\r\n      let config = {\r\n        url,\r\n        method,\r\n        data\r\n      }\r\n\r\n      vm.$http(config).then((resp) => {\r\n        const array = resp.data\r\n        vm.dataList = array.rows || array.list || array\r\n      })\r\n    },\r\n    // 解析url中的数据\r\n    getLocalData() {\r\n      const vm = this\r\n      const data = JSON.parse(vm.configs.url)\r\n      vm.dataList = data\r\n    },\r\n    getValueByDataType(data: any, option: any) {\r\n      let val = data[option.valueField || 'value']\r\n      if (option.dataType === 'Int32' || option.dataType === 'int') {\r\n        val = parseInt(val)\r\n      }\r\n      return val\r\n    },\r\n    /**\r\n     * 有效值验证,不为undefined、空字符串、null\r\n     */\r\n    valueValidate(value: any) {\r\n      return value !== '' && value !== undefined && value !== null\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style></style>\r\n","<template>\r\n  <div class=\"table-container\" :style=\"normalHeight\">\r\n    <el-table\r\n      :data=\"tableData\"\r\n      :header-cell-style=\"changeHeaderClass\"\r\n      stripe\r\n      border\r\n      :height=\"tableHeight\"\r\n      ref=\"table\"\r\n      v-bind=\"$attrs\"\r\n    >\r\n      <!-- @selection-change=\"handleSelectionChange\" -->\r\n      <!-- 勾选框 -->\r\n      <el-table-column v-if=\"selection\" type=\"selection\" width=\"40\"></el-table-column>\r\n      <!-- 编号 -->\r\n      <el-table-column v-if=\"showIndex\" align=\"center\" label=\"序号\" type=\"index\" width=\"50\" />\r\n      <!-- 常规列 -->\r\n      <template v-if=\"!vertical\">\r\n        <template v-for=\"(col, idx) in columns\">\r\n          <el-table-column\r\n            v-if=\"col.showInList && !col.hidden\"\r\n            align=\"center\"\r\n            :fixed=\"col.actionList ? 'right' : false\"\r\n            :key=\"idx\"\r\n            :label=\"col.displayName\"\r\n            :prop=\"col.name\"\r\n            resizable\r\n            :sortable=\"col.isDataObjectField\"\r\n            :width=\"col.width\"\r\n          >\r\n            <template #header>\r\n              <div style=\"display:inline-flex\">\r\n                <span>{{ col.displayName }}</span>\r\n                <el-tooltip\r\n                  v-if=\"col.description && col.displayName != col.description\"\r\n                  :content=\"col.description\"\r\n                >\r\n                  <i\r\n                    class=\"el-icon-warning-outline\"\r\n                    @click=\"\r\n                      (e) => {\r\n                        e.stopPropagation()\r\n                      }\r\n                    \"\r\n                  ></i>\r\n                </el-tooltip>\r\n              </div>\r\n            </template>\r\n\r\n            <template v-slot=\"scope\">\r\n              <slot :name=\"'col-' + scope.column.property\" :colData=\"col\" :colScope=\"scope\">\r\n                <!-- 使用示例 -->\r\n                <!-- <template v-slot:col-colName=\"{ colData: col, colScope: { row } }\">\r\n        {{ col.name }}1{{ row[col.name] }},\r\n                </template>-->\r\n                <template v-if=\"col.dataType === 'Boolean'\">\r\n                  <el-switch\r\n                    :value=\"scope.row[col.name]\"\r\n                    active-color=\"#13ce66\"\r\n                    inactive-color=\"#ff4949\"\r\n                  />\r\n                </template>\r\n                <template v-else-if=\"!col.isDataObjectField && col.cellUrl\">\r\n                  <a :href=\"getUrl(col, scope.row)\">{{ col.displayName }}</a>\r\n                </template>\r\n                <template v-else-if=\"col.actionList\">\r\n                  <template v-for=\"(actionItem, i) in col.actionList\">\r\n                    <el-button\r\n                      :key=\"i\"\r\n                      v-if=\"\r\n                        operator(\r\n                          { action: 'hasPermission' },\r\n                          actionItem.permission\r\n                        )\r\n                      \"\r\n                      :type=\"actionItem.type\"\r\n                      size=\"mini\"\r\n                      @click=\"operator(actionItem, scope.row)\"\r\n                    >{{ actionItem.text }}</el-button>\r\n                  </template>\r\n                </template>\r\n                <div v-else>{{ scope.row[col.name] }}</div>\r\n              </slot>\r\n            </template>\r\n          </el-table-column>\r\n        </template>\r\n      </template>\r\n\r\n      <!-- 垂直列-第一列为表头 -->\r\n      <el-table-column v-if=\"vertical\" label width=\"150px\">\r\n        <template v-for=\"(col, cindex) in columns\">\r\n          <div :key=\"cindex\" v-if=\"col.showInList && !col.hidden\">\r\n            <span>{{ col.displayName }}</span>\r\n          </div>\r\n        </template>\r\n      </el-table-column>\r\n\r\n      <!-- 垂直列-第二列为内容 -->\r\n      <el-table-column label v-if=\"vertical\">\r\n        <template v-slot=\"scope\">\r\n          <div v-for=\"(col, index) in columns\" :key=\"index\">\r\n            <div v-if=\"col.showInList && !col.hidden\">\r\n              <span v-if=\"!col.actionList\">{{ scope.row[col.name] || '&nbsp;' }}</span>\r\n\r\n              <!-- 操作栏 -->\r\n              <div v-if=\"col.actionList\">\r\n                <span\r\n                  class=\"handbtn\"\r\n                  v-for=\"(actionItem, hIndex) in col.actionList\"\r\n                  @click=\"operator(actionItem, scope.row)\"\r\n                  :key=\"hIndex\"\r\n                >{{ actionItem.text }}</span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </template>\r\n      </el-table-column>\r\n    </el-table>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue'\r\nexport default defineComponent({\r\n  name: 'NormalTable',\r\n  description: '常规表格封装,使用的地方的父级必须指定高度',\r\n  props: {\r\n    // 表格列配置\r\n    columns: {\r\n      type: Array as PropType<any[]>,\r\n      default: []\r\n    },\r\n    // 表格数据\r\n    tableData: {\r\n      type: Array,\r\n      default: []\r\n    },\r\n    // 是否垂直展示数据\r\n    vertical: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    // 是否树状结构数据\r\n    isTree: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    // 树形结构key值\r\n    treeKey: {\r\n      type: String,\r\n      require: false\r\n    },\r\n    // 是否设置了改变表头颜色\r\n    changeHeader: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    // 表格最大高度需要减去的高度,这个值不能太低,否则表格高度会自己不断拉长\r\n    height: {\r\n      type: String,\r\n      default: 'calc(100% - 170px)'\r\n    },\r\n    /**\r\n     *  表格height属性,与height组合,可达到不同效果。\r\n       1、height设置100%,表格没有数据时也能撑开一定高度,此时tableHeight设置100%,\r\n        表格高度超过height时自动出现滚动条\r\n       2、tableHeight设置为null,表格内容自动撑开高度\r\n     */\r\n    tableHeight: {\r\n      type: String,\r\n      default: '100%'\r\n    },\r\n    // 是否显示勾选框\r\n    selection: {\r\n      type: Boolean,\r\n      default: true\r\n    },\r\n    showIndex: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    // 显示标题\r\n    showHeader: {\r\n      type: Boolean,\r\n      default: true\r\n    }\r\n  },\r\n  emits: ['operator'],\r\n  data() {\r\n    return {}\r\n  },\r\n  computed: {\r\n    normalHeight() {\r\n      // console.log('normalHeight', this.height)\r\n      return {\r\n        // height: `calc(100% - ${this.height}px)`\r\n        height: this.height\r\n      }\r\n    }\r\n  },\r\n  watch: {\r\n    // 表格数据变化时重新渲染表格\r\n    tableData() {\r\n      let vm = this as any\r\n      let table = vm.$refs.table\r\n      if (table) {\r\n        setTimeout(() => {\r\n          table.doLayout()\r\n        }, 1000)\r\n      }\r\n\r\n    }\r\n  },\r\n  created() {\r\n    // console.log(this.columns)\r\n  },\r\n  mounted() {\r\n    window.addEventListener(\"resize\", this.resize)\r\n  },\r\n  beforeDestroy() {\r\n    window.removeEventListener(\"resize\", this.resize)\r\n  },\r\n  methods: {\r\n    changeHeaderClass(row: any) {\r\n      if (this.changeHeader) {\r\n        let colorMap = {} as any\r\n        this.columns.forEach((item) => {\r\n          colorMap[item.label] = item.color || '#fff'\r\n        })\r\n        return {\r\n          backgroundColor: colorMap[row.column.label] || '#fff',\r\n          color: '#000'\r\n        }\r\n      }\r\n      return {\r\n        backgroundColor: '#f6f6f6'\r\n        // color: '#333333',\r\n        // fontWeight: 'normal'\r\n      }\r\n    },\r\n    rowChangeStyle(row: any) {\r\n      // console.log(row)\r\n      if (\r\n        row.row.childTransferObject &&\r\n        row.row.childTransferObject.length > 0 &&\r\n        this.isTree\r\n      ) {\r\n        return {\r\n          backgroundColor: '#ddebf7'\r\n        }\r\n      }\r\n    },\r\n    getUrl(column: any, entity: any) {\r\n      // 针对指定实体对象计算url,替换其中变量\r\n      const reg = /{(\\w+)}/g\r\n      return column.cellUrl.replace(reg, (a: any, b: any) => entity[b])\r\n    },\r\n    handler(hand: any, scope: any) {\r\n      this.$emit('operator', hand, scope.row)\r\n    },\r\n    operator(option: any, data: any) {\r\n      let returnData = null\r\n      this.$emit('operator', option, data, (val: any) => {\r\n        returnData = val\r\n      })\r\n\r\n      return returnData\r\n    },\r\n    resize() {\r\n      let vm = this as any\r\n      vm.$refs.table.doLayout()\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.normal-table {\r\n  margin-top: 1px;\r\n  overflow: auto;\r\n}\r\n\r\n.table-container {\r\n  /* max-height: calc(100vh - 177px); */\r\n  /* overflow-y: auto; */\r\n  height: auto;\r\n  margin: 5px 0 2px 0;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n/** 操作按钮 */\r\n.el-table .el-button {\r\n  margin: 2px;\r\n}\r\n\r\n/** 表格操作 */\r\n.action {\r\n  margin: 0 8px;\r\n  cursor: pointer;\r\n  font-size: 17px;\r\n}\r\n\r\n/** 表头、行上下间距 */\r\n::v-deep(.el-table td) {\r\n  padding: 2px 0 2px 0;\r\n}\r\n::v-deep(.el-table th) {\r\n  padding: 2px 0 2px 0;\r\n}\r\n\r\n/** 表头、行上下间距 */\r\n::v-deep(.cell) {\r\n  padding: 0 1px 0 1px;\r\n}\r\n\r\n// 表格行高度设置48px,避免内容高度过低使得表格变得紧凑\r\n::v-deep(.el-table .el-table__cell) {\r\n  height: 48px;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"table-container\" :style=\"normalHeight\">\r\n    <el-table\r\n      :data=\"tableData\"\r\n      :header-cell-style=\"changeHeaderClass\"\r\n      stripe\r\n      border\r\n      :height=\"tableHeight\"\r\n      ref=\"table\"\r\n      v-bind=\"$attrs\"\r\n    >\r\n      <!-- @selection-change=\"handleSelectionChange\" -->\r\n      <!-- 勾选框 -->\r\n      <el-table-column v-if=\"selection\" type=\"selection\" width=\"40\"></el-table-column>\r\n      <!-- 编号 -->\r\n      <el-table-column v-if=\"showIndex\" align=\"center\" label=\"序号\" type=\"index\" width=\"50\" />\r\n      <!-- 常规列 -->\r\n      <template v-if=\"!vertical\">\r\n        <template v-for=\"(col, idx) in columns\">\r\n          <el-table-column\r\n            v-if=\"col.showInList && !col.hidden\"\r\n            align=\"center\"\r\n            :fixed=\"col.actionList ? 'right' : false\"\r\n            :key=\"idx\"\r\n            :label=\"col.displayName\"\r\n            :prop=\"col.name\"\r\n            resizable\r\n            :sortable=\"col.isDataObjectField\"\r\n            :width=\"col.width\"\r\n          >\r\n            <template #header>\r\n              <div style=\"display:inline-flex\">\r\n                <span>{{ col.displayName }}</span>\r\n                <el-tooltip\r\n                  v-if=\"col.description && col.displayName != col.description\"\r\n                  :content=\"col.description\"\r\n                >\r\n                  <i\r\n                    class=\"el-icon-warning-outline\"\r\n                    @click=\"\r\n                      (e) => {\r\n                        e.stopPropagation()\r\n                      }\r\n                    \"\r\n                  ></i>\r\n                </el-tooltip>\r\n              </div>\r\n            </template>\r\n\r\n            <template v-slot=\"scope\">\r\n              <slot :name=\"'col-' + scope.column.property\" :colData=\"col\" :colScope=\"scope\">\r\n                <!-- 使用示例 -->\r\n                <!-- <template v-slot:col-colName=\"{ colData: col, colScope: { row } }\">\r\n        {{ col.name }}1{{ row[col.name] }},\r\n                </template>-->\r\n                <template v-if=\"col.dataType === 'Boolean'\">\r\n                  <el-switch\r\n                    :value=\"scope.row[col.name]\"\r\n                    active-color=\"#13ce66\"\r\n                    inactive-color=\"#ff4949\"\r\n                  />\r\n                </template>\r\n                <template v-else-if=\"!col.isDataObjectField && col.cellUrl\">\r\n                  <a :href=\"getUrl(col, scope.row)\">{{ col.displayName }}</a>\r\n                </template>\r\n                <template v-else-if=\"col.actionList\">\r\n                  <template v-for=\"(actionItem, i) in col.actionList\">\r\n                    <el-button\r\n                      :key=\"i\"\r\n                      v-if=\"\r\n                        operator(\r\n                          { action: 'hasPermission' },\r\n                          actionItem.permission\r\n                        )\r\n                      \"\r\n                      :type=\"actionItem.type\"\r\n                      size=\"mini\"\r\n                      @click=\"operator(actionItem, scope.row)\"\r\n                    >{{ actionItem.text }}</el-button>\r\n                  </template>\r\n                </template>\r\n                <div v-else>{{ scope.row[col.name] }}</div>\r\n              </slot>\r\n            </template>\r\n          </el-table-column>\r\n        </template>\r\n      </template>\r\n\r\n      <!-- 垂直列-第一列为表头 -->\r\n      <el-table-column v-if=\"vertical\" label width=\"150px\">\r\n        <template v-for=\"(col, cindex) in columns\">\r\n          <div :key=\"cindex\" v-if=\"col.showInList && !col.hidden\">\r\n            <span>{{ col.displayName }}</span>\r\n          </div>\r\n        </template>\r\n      </el-table-column>\r\n\r\n      <!-- 垂直列-第二列为内容 -->\r\n      <el-table-column label v-if=\"vertical\">\r\n        <template v-slot=\"scope\">\r\n          <div v-for=\"(col, index) in columns\" :key=\"index\">\r\n            <div v-if=\"col.showInList && !col.hidden\">\r\n              <span v-if=\"!col.actionList\">{{ scope.row[col.name] || '&nbsp;' }}</span>\r\n\r\n              <!-- 操作栏 -->\r\n              <div v-if=\"col.actionList\">\r\n                <span\r\n                  class=\"handbtn\"\r\n                  v-for=\"(actionItem, hIndex) in col.actionList\"\r\n                  @click=\"operator(actionItem, scope.row)\"\r\n                  :key=\"hIndex\"\r\n                >{{ actionItem.text }}</span>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </template>\r\n      </el-table-column>\r\n    </el-table>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue'\r\nexport default defineComponent({\r\n  name: 'NormalTable',\r\n  description: '常规表格封装,使用的地方的父级必须指定高度',\r\n  props: {\r\n    // 表格列配置\r\n    columns: {\r\n      type: Array as PropType<any[]>,\r\n      default: []\r\n    },\r\n    // 表格数据\r\n    tableData: {\r\n      type: Array,\r\n      default: []\r\n    },\r\n    // 是否垂直展示数据\r\n    vertical: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    // 是否树状结构数据\r\n    isTree: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    // 树形结构key值\r\n    treeKey: {\r\n      type: String,\r\n      require: false\r\n    },\r\n    // 是否设置了改变表头颜色\r\n    changeHeader: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    // 表格最大高度需要减去的高度,这个值不能太低,否则表格高度会自己不断拉长\r\n    height: {\r\n      type: String,\r\n      default: 'calc(100% - 170px)'\r\n    },\r\n    /**\r\n     *  表格height属性,与height组合,可达到不同效果。\r\n       1、height设置100%,表格没有数据时也能撑开一定高度,此时tableHeight设置100%,\r\n        表格高度超过height时自动出现滚动条\r\n       2、tableHeight设置为null,表格内容自动撑开高度\r\n     */\r\n    tableHeight: {\r\n      type: String,\r\n      default: '100%'\r\n    },\r\n    // 是否显示勾选框\r\n    selection: {\r\n      type: Boolean,\r\n      default: true\r\n    },\r\n    showIndex: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    // 显示标题\r\n    showHeader: {\r\n      type: Boolean,\r\n      default: true\r\n    }\r\n  },\r\n  emits: ['operator'],\r\n  data() {\r\n    return {}\r\n  },\r\n  computed: {\r\n    normalHeight() {\r\n      // console.log('normalHeight', this.height)\r\n      return {\r\n        // height: `calc(100% - ${this.height}px)`\r\n        height: this.height\r\n      }\r\n    }\r\n  },\r\n  watch: {\r\n    // 表格数据变化时重新渲染表格\r\n    tableData() {\r\n      let vm = this as any\r\n      let table = vm.$refs.table\r\n      if (table) {\r\n        setTimeout(() => {\r\n          table.doLayout()\r\n        }, 1000)\r\n      }\r\n\r\n    }\r\n  },\r\n  created() {\r\n    // console.log(this.columns)\r\n  },\r\n  mounted() {\r\n    window.addEventListener(\"resize\", this.resize)\r\n  },\r\n  beforeDestroy() {\r\n    window.removeEventListener(\"resize\", this.resize)\r\n  },\r\n  methods: {\r\n    changeHeaderClass(row: any) {\r\n      if (this.changeHeader) {\r\n        let colorMap = {} as any\r\n        this.columns.forEach((item) => {\r\n          colorMap[item.label] = item.color || '#fff'\r\n        })\r\n        return {\r\n          backgroundColor: colorMap[row.column.label] || '#fff',\r\n          color: '#000'\r\n        }\r\n      }\r\n      return {\r\n        backgroundColor: '#f6f6f6'\r\n        // color: '#333333',\r\n        // fontWeight: 'normal'\r\n      }\r\n    },\r\n    rowChangeStyle(row: any) {\r\n      // console.log(row)\r\n      if (\r\n        row.row.childTransferObject &&\r\n        row.row.childTransferObject.length > 0 &&\r\n        this.isTree\r\n      ) {\r\n        return {\r\n          backgroundColor: '#ddebf7'\r\n        }\r\n      }\r\n    },\r\n    getUrl(column: any, entity: any) {\r\n      // 针对指定实体对象计算url,替换其中变量\r\n      const reg = /{(\\w+)}/g\r\n      return column.cellUrl.replace(reg, (a: any, b: any) => entity[b])\r\n    },\r\n    handler(hand: any, scope: any) {\r\n      this.$emit('operator', hand, scope.row)\r\n    },\r\n    operator(option: any, data: any) {\r\n      let returnData = null\r\n      this.$emit('operator', option, data, (val: any) => {\r\n        returnData = val\r\n      })\r\n\r\n      return returnData\r\n    },\r\n    resize() {\r\n      let vm = this as any\r\n      vm.$refs.table.doLayout()\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.normal-table {\r\n  margin-top: 1px;\r\n  overflow: auto;\r\n}\r\n\r\n.table-container {\r\n  /* max-height: calc(100vh - 177px); */\r\n  /* overflow-y: auto; */\r\n  height: auto;\r\n  margin: 5px 0 2px 0;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n/** 操作按钮 */\r\n.el-table .el-button {\r\n  margin: 2px;\r\n}\r\n\r\n/** 表格操作 */\r\n.action {\r\n  margin: 0 8px;\r\n  cursor: pointer;\r\n  font-size: 17px;\r\n}\r\n\r\n/** 表头、行上下间距 */\r\n::v-deep(.el-table td) {\r\n  padding: 2px 0 2px 0;\r\n}\r\n::v-deep(.el-table th) {\r\n  padding: 2px 0 2px 0;\r\n}\r\n\r\n/** 表头、行上下间距 */\r\n::v-deep(.cell) {\r\n  padding: 0 1px 0 1px;\r\n}\r\n\r\n// 表格行高度设置48px,避免内容高度过低使得表格变得紧凑\r\n::v-deep(.el-table .el-table__cell) {\r\n  height: 48px;\r\n}\r\n</style>\r\n","<template>\r\n  <el-row type=\"flex\" justify=\"center\" align=\"center\" class=\"operator\">\r\n    <el-col :span=\"12\" class=\"left-search\">\r\n      <el-button\r\n        size=\"small\"\r\n        v-for=\"(btn, idx) in operatorList\"\r\n        :key=\"idx\"\r\n        @click=\"operator(btn)\"\r\n        :type=\"btn.type\"\r\n        :plain=\"btn.plain\"\r\n      >\r\n        {{ btn.name }}\r\n      </el-button>\r\n    </el-col>\r\n    <el-col\r\n      :span=\"12\"\r\n      style=\"display: flex; justify-content: flex-end; align-items: center;\"\r\n    >\r\n      <el-tooltip effect=\"dark\" content=\"刷新\" placement=\"top-end\">\r\n        <el-icon class=\"action\" @click=\"operator({ action: 'getTableData' })\">\r\n          <refresh />\r\n        </el-icon>\r\n      </el-tooltip>\r\n\r\n      <el-popover placement=\"bottom\" :width=\"220\" trigger=\"click\">\r\n        <div>设置列字段</div>\r\n        <div class=\"setting-btn\">\r\n          <div style=\"padding-top: 5px\">\r\n            <el-checkbox\r\n              @change=\"chooseAll\"\r\n              v-model=\"allChoose\"\r\n              :indeterminate=\"isIndeterminate\"\r\n            >\r\n              全选\r\n            </el-checkbox>\r\n          </div>\r\n        </div>\r\n        <div style=\"height:68vh;overflow: auto;\">\r\n          <div v-for=\"(field, index) in columns\" :key=\"index\">\r\n            <template v-if=\"field.showInList\">\r\n              <el-checkbox\r\n                @change=\"chooseItem(field)\"\r\n                :model-value=\"!field.hidden\"\r\n              >\r\n                {{ field.displayName }}\r\n              </el-checkbox>\r\n            </template>\r\n          </div>\r\n        </div>\r\n        <template #reference>\r\n          <el-icon class=\"action\">\r\n            <setting />\r\n          </el-icon>\r\n        </template>\r\n      </el-popover>\r\n\r\n      <!-- <el-tooltip effect=\"dark\" content=\"全屏\" placement=\"top-end\">\r\n        <el-icon class=\"action\">\r\n          <full-screen />\r\n        </el-icon>\r\n      </el-tooltip> -->\r\n    </el-col>\r\n  </el-row>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n  props: {\r\n    columns: {\r\n      type: Array,\r\n      default: () => []\r\n    },\r\n    operatorList: {\r\n      type: Array,\r\n      default: () => []\r\n    },\r\n    permissionFlags: {\r\n      type: Object,\r\n      default: () => {}\r\n    }\r\n  },\r\n  emits: ['operator'],\r\n  //   setup(props, context) {\r\n  //     // console.log(arguments)\r\n\r\n  //     const operator = (option) => {\r\n  //       context.emit('operator', option)\r\n  //     }\r\n\r\n  //     return {\r\n  //       operator\r\n  //     }\r\n  //   },\r\n  data() {\r\n    return {\r\n      allChoose: true,\r\n      isIndeterminate: false\r\n    }\r\n  },\r\n  methods: {\r\n    checkChoose() {\r\n      let trueLength = this.columns.filter((item) => !item.hidden).length\r\n      if (trueLength == this.columns.length) {\r\n        this.allChoose = true\r\n        return\r\n      }\r\n      this.allChoose = false\r\n      this.isIndeterminate = trueLength > 0 && trueLength < this.columns.length\r\n    },\r\n    chooseAll(val) {\r\n      this.columns.forEach((item) => {\r\n        item.hidden = !val\r\n      })\r\n    },\r\n    chooseItem(val) {\r\n      val.hidden = !val.hidden\r\n      this.checkChoose()\r\n    },\r\n    operator(option, data) {\r\n      this.$emit('operator', option, data)\r\n    }\r\n  }\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.operator {\r\n  margin: 2px 0 10px 0;\r\n}\r\n\r\n.action {\r\n  margin: 0 8px;\r\n  cursor: pointer;\r\n  font-size: 17px;\r\n}\r\n</style>\r\n","<template>\r\n  <el-row type=\"flex\" justify=\"end\" class=\"search\">\r\n    <el-col :span=\"24\" class=\"letf-search\">\r\n      <el-form\r\n        ref=\"form\"\r\n        v-model=\"model\"\r\n        label-position=\"right\"\r\n        :inline=\"true\"\r\n        class=\"search-form-container\"\r\n      >\r\n        <template v-for=\"item in columns\">\r\n          <el-form-item\r\n            :label=\"item.displayName\"\r\n            :key=\"item.name\"\r\n            v-if=\"item.showInSearch\"\r\n            v-show=\"!item.hidden\"\r\n          >\r\n            <template v-if=\"!item.if || item.if(model)\">\r\n              <slot :name=\"'search-' + item.name\" :model=\"model\" :config=\"item\">\r\n                <FormControl v-model=\"model\" :configs=\"item\"></FormControl>\r\n              </slot>\r\n            </template>\r\n          </el-form-item>\r\n        </template>\r\n        <el-button size=\"default\" type=\"primary\" @click=\"search\">\r\n          查询\r\n        </el-button>\r\n        <el-button size=\"default\" type=\"default\" @click=\"resetSearch\">\r\n          重置\r\n        </el-button>\r\n      </el-form>\r\n    </el-col>\r\n  </el-row>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType, ref } from 'vue'\r\n// import singleSelect from '../../components/singleSelect'\r\n// import multipleSelect from '../../components/multipleSelect'\r\nimport FormControl from './FormControl.vue'\r\n\r\nexport default defineComponent({\r\n  name: 'TableSearch',\r\n  components: {\r\n    FormControl\r\n  },\r\n  props: {\r\n    columns: {\r\n      type: Array as PropType<any[]>,\r\n      default: () => [] as any[]\r\n    },\r\n    modelValue: {\r\n      type: Object,\r\n      default: () => {}\r\n    },\r\n    searchMethod: {\r\n      type: Function,\r\n      default: undefined\r\n    },\r\n    resetSearchMethod: {\r\n      type: Function,\r\n      default: undefined\r\n    }\r\n  },\r\n  emits: ['getDataList', 'resetSearch', 'update:modelValue'],\r\n  data() {\r\n    return {\r\n      model: {} as any\r\n    }\r\n  },\r\n  watch: {\r\n    model: {\r\n      handler(val) {\r\n        this.$emit('update:modelValue', val)\r\n      },\r\n      deep: true\r\n    },\r\n    modelValue(val) {\r\n      this.model = val\r\n    }\r\n  },\r\n  created() {\r\n    this.model = this.modelValue // JSON.parse(JSON.stringify(this.modelValue))\r\n\r\n    let columns = this.columns\r\n    for (const key in columns) {\r\n      if (Object.prototype.hasOwnProperty.call(columns, key)) {\r\n        const item = columns[key]\r\n        if (\r\n          item.itemType === 'datePicker' &&\r\n          item.options &&\r\n          item.options.includes('type=daterange') &&\r\n          !item.options.includes('setDefaultValue=false')\r\n        ) {\r\n          // 如果是日期范围选择器,默认值设为最近一个月\r\n          const end = new Date()\r\n          const start = new Date()\r\n          start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)\r\n          this.model[item.name] = [\r\n            // 此格式化可能不同浏览器表现不同,返回的可能不是YYYY-MM-DD格式\r\n            start.toLocaleDateString('fr-CA'),\r\n            end.toLocaleDateString('fr-CA')\r\n          ]\r\n        }\r\n\r\n        // 默认值设置\r\n        if (typeof item.value !== 'undefined') {\r\n          this.model[item.name] = item.value\r\n        }\r\n      }\r\n    }\r\n  },\r\n  methods: {\r\n    search() {\r\n      let vm = this\r\n      if (vm.searchMethod) {\r\n        vm.searchMethod()\r\n      } else {\r\n        this.$emit('getDataList')\r\n      }\r\n    },\r\n    resetSearch() {\r\n      let vm = this\r\n      if (vm.resetSearchMethod) {\r\n        vm.resetSearchMethod()\r\n      } else {\r\n        this.$emit('resetSearch')\r\n      }\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.search {\r\n  /* height: 60px; */\r\n  /* overflow: hidden; */\r\n  /* position: relative; */\r\n  display: -moz-flex;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  // border-bottom: 1px solid #eeeeee;\r\n  border-bottom: 1px solid #eeeeee;\r\n  min-height: 50px;\r\n  padding-bottom: 8px;\r\n  // margin-bottom: 10px;\r\n}\r\n\r\n.search .left-search {\r\n  line-height: 58px;\r\n  /* height: 60px; */\r\n  /* float: left; */\r\n  padding: 0 10px;\r\n}\r\n.search .letf-search {\r\n  line-height: 40px;\r\n  /* height: 65px; */\r\n  /* float: right; */\r\n  /* max-height: 110px; */\r\n  padding: 0 10px;\r\n  /* overflow-y: auto; */\r\n  display: flex;\r\n  justify-content: flex-start;\r\n}\r\n.search .el-button + .el-button {\r\n  margin-left: 0px;\r\n}\r\n\r\n/* 搜索框元素间距 */\r\n:deep(.el-input) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-button) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-date-editor) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-date-editor) {\r\n  width: 250px;\r\n}\r\n\r\n:deep(.el-form-item) {\r\n  margin-bottom: 0;\r\n}\r\n</style>\r\n","<template>\r\n  <el-row type=\"flex\" justify=\"end\" class=\"search\">\r\n    <el-col :span=\"24\" class=\"letf-search\">\r\n      <el-form\r\n        ref=\"form\"\r\n        v-model=\"model\"\r\n        label-position=\"right\"\r\n        :inline=\"true\"\r\n        class=\"search-form-container\"\r\n      >\r\n        <template v-for=\"item in columns\">\r\n          <el-form-item\r\n            :label=\"item.displayName\"\r\n            :key=\"item.name\"\r\n            v-if=\"item.showInSearch\"\r\n            v-show=\"!item.hidden\"\r\n          >\r\n            <template v-if=\"!item.if || item.if(model)\">\r\n              <slot :name=\"'search-' + item.name\" :model=\"model\" :config=\"item\">\r\n                <FormControl v-model=\"model\" :configs=\"item\"></FormControl>\r\n              </slot>\r\n            </template>\r\n          </el-form-item>\r\n        </template>\r\n        <el-button size=\"default\" type=\"primary\" @click=\"search\">\r\n          查询\r\n        </el-button>\r\n        <el-button size=\"default\" type=\"default\" @click=\"resetSearch\">\r\n          重置\r\n        </el-button>\r\n      </el-form>\r\n    </el-col>\r\n  </el-row>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType, ref } from 'vue'\r\n// import singleSelect from '../../components/singleSelect'\r\n// import multipleSelect from '../../components/multipleSelect'\r\nimport FormControl from './FormControl.vue'\r\n\r\nexport default defineComponent({\r\n  name: 'TableSearch',\r\n  components: {\r\n    FormControl\r\n  },\r\n  props: {\r\n    columns: {\r\n      type: Array as PropType<any[]>,\r\n      default: () => [] as any[]\r\n    },\r\n    modelValue: {\r\n      type: Object,\r\n      default: () => {}\r\n    },\r\n    searchMethod: {\r\n      type: Function,\r\n      default: undefined\r\n    },\r\n    resetSearchMethod: {\r\n      type: Function,\r\n      default: undefined\r\n    }\r\n  },\r\n  emits: ['getDataList', 'resetSearch', 'update:modelValue'],\r\n  data() {\r\n    return {\r\n      model: {} as any\r\n    }\r\n  },\r\n  watch: {\r\n    model: {\r\n      handler(val) {\r\n        this.$emit('update:modelValue', val)\r\n      },\r\n      deep: true\r\n    },\r\n    modelValue(val) {\r\n      this.model = val\r\n    }\r\n  },\r\n  created() {\r\n    this.model = this.modelValue // JSON.parse(JSON.stringify(this.modelValue))\r\n\r\n    let columns = this.columns\r\n    for (const key in columns) {\r\n      if (Object.prototype.hasOwnProperty.call(columns, key)) {\r\n        const item = columns[key]\r\n        if (\r\n          item.itemType === 'datePicker' &&\r\n          item.options &&\r\n          item.options.includes('type=daterange') &&\r\n          !item.options.includes('setDefaultValue=false')\r\n        ) {\r\n          // 如果是日期范围选择器,默认值设为最近一个月\r\n          const end = new Date()\r\n          const start = new Date()\r\n          start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)\r\n          this.model[item.name] = [\r\n            // 此格式化可能不同浏览器表现不同,返回的可能不是YYYY-MM-DD格式\r\n            start.toLocaleDateString('fr-CA'),\r\n            end.toLocaleDateString('fr-CA')\r\n          ]\r\n        }\r\n\r\n        // 默认值设置\r\n        if (typeof item.value !== 'undefined') {\r\n          this.model[item.name] = item.value\r\n        }\r\n      }\r\n    }\r\n  },\r\n  methods: {\r\n    search() {\r\n      let vm = this\r\n      if (vm.searchMethod) {\r\n        vm.searchMethod()\r\n      } else {\r\n        this.$emit('getDataList')\r\n      }\r\n    },\r\n    resetSearch() {\r\n      let vm = this\r\n      if (vm.resetSearchMethod) {\r\n        vm.resetSearchMethod()\r\n      } else {\r\n        this.$emit('resetSearch')\r\n      }\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.search {\r\n  /* height: 60px; */\r\n  /* overflow: hidden; */\r\n  /* position: relative; */\r\n  display: -moz-flex;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  // border-bottom: 1px solid #eeeeee;\r\n  border-bottom: 1px solid #eeeeee;\r\n  min-height: 50px;\r\n  padding-bottom: 8px;\r\n  // margin-bottom: 10px;\r\n}\r\n\r\n.search .left-search {\r\n  line-height: 58px;\r\n  /* height: 60px; */\r\n  /* float: left; */\r\n  padding: 0 10px;\r\n}\r\n.search .letf-search {\r\n  line-height: 40px;\r\n  /* height: 65px; */\r\n  /* float: right; */\r\n  /* max-height: 110px; */\r\n  padding: 0 10px;\r\n  /* overflow-y: auto; */\r\n  display: flex;\r\n  justify-content: flex-start;\r\n}\r\n.search .el-button + .el-button {\r\n  margin-left: 0px;\r\n}\r\n\r\n/* 搜索框元素间距 */\r\n:deep(.el-input) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-button) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-date-editor) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-date-editor) {\r\n  width: 250px;\r\n}\r\n\r\n:deep(.el-form-item) {\r\n  margin-bottom: 0;\r\n}\r\n</style>\r\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar zhCn = {\n  name: \"zh-cn\",\n  el: {\n    colorpicker: {\n      confirm: \"\\u786E\\u5B9A\",\n      clear: \"\\u6E05\\u7A7A\"\n    },\n    datepicker: {\n      now: \"\\u6B64\\u523B\",\n      today: \"\\u4ECA\\u5929\",\n      cancel: \"\\u53D6\\u6D88\",\n      clear: \"\\u6E05\\u7A7A\",\n      confirm: \"\\u786E\\u5B9A\",\n      selectDate: \"\\u9009\\u62E9\\u65E5\\u671F\",\n      selectTime: \"\\u9009\\u62E9\\u65F6\\u95F4\",\n      startDate: \"\\u5F00\\u59CB\\u65E5\\u671F\",\n      startTime: \"\\u5F00\\u59CB\\u65F6\\u95F4\",\n      endDate: \"\\u7ED3\\u675F\\u65E5\\u671F\",\n      endTime: \"\\u7ED3\\u675F\\u65F6\\u95F4\",\n      prevYear: \"\\u524D\\u4E00\\u5E74\",\n      nextYear: \"\\u540E\\u4E00\\u5E74\",\n      prevMonth: \"\\u4E0A\\u4E2A\\u6708\",\n      nextMonth: \"\\u4E0B\\u4E2A\\u6708\",\n      year: \"\\u5E74\",\n      month1: \"1 \\u6708\",\n      month2: \"2 \\u6708\",\n      month3: \"3 \\u6708\",\n      month4: \"4 \\u6708\",\n      month5: \"5 \\u6708\",\n      month6: \"6 \\u6708\",\n      month7: \"7 \\u6708\",\n      month8: \"8 \\u6708\",\n      month9: \"9 \\u6708\",\n      month10: \"10 \\u6708\",\n      month11: \"11 \\u6708\",\n      month12: \"12 \\u6708\",\n      weeks: {\n        sun: \"\\u65E5\",\n        mon: \"\\u4E00\",\n        tue: \"\\u4E8C\",\n        wed: \"\\u4E09\",\n        thu: \"\\u56DB\",\n        fri: \"\\u4E94\",\n        sat: \"\\u516D\"\n      },\n      months: {\n        jan: \"\\u4E00\\u6708\",\n        feb: \"\\u4E8C\\u6708\",\n        mar: \"\\u4E09\\u6708\",\n        apr: \"\\u56DB\\u6708\",\n        may: \"\\u4E94\\u6708\",\n        jun: \"\\u516D\\u6708\",\n        jul: \"\\u4E03\\u6708\",\n        aug: \"\\u516B\\u6708\",\n        sep: \"\\u4E5D\\u6708\",\n        oct: \"\\u5341\\u6708\",\n        nov: \"\\u5341\\u4E00\\u6708\",\n        dec: \"\\u5341\\u4E8C\\u6708\"\n      }\n    },\n    select: {\n      loading: \"\\u52A0\\u8F7D\\u4E2D\",\n      noMatch: \"\\u65E0\\u5339\\u914D\\u6570\\u636E\",\n      noData: \"\\u65E0\\u6570\\u636E\",\n      placeholder: \"\\u8BF7\\u9009\\u62E9\"\n    },\n    cascader: {\n      noMatch: \"\\u65E0\\u5339\\u914D\\u6570\\u636E\",\n      loading: \"\\u52A0\\u8F7D\\u4E2D\",\n      placeholder: \"\\u8BF7\\u9009\\u62E9\",\n      noData: \"\\u6682\\u65E0\\u6570\\u636E\"\n    },\n    pagination: {\n      goto: \"\\u524D\\u5F80\",\n      pagesize: \"\\u6761/\\u9875\",\n      total: \"\\u5171 {total} \\u6761\",\n      pageClassifier: \"\\u9875\",\n      deprecationWarning: \"\\u4F60\\u4F7F\\u7528\\u4E86\\u4E00\\u4E9B\\u5DF2\\u88AB\\u5E9F\\u5F03\\u7684\\u7528\\u6CD5\\uFF0C\\u8BF7\\u53C2\\u8003 el-pagination \\u7684\\u5B98\\u65B9\\u6587\\u6863\"\n    },\n    messagebox: {\n      title: \"\\u63D0\\u793A\",\n      confirm: \"\\u786E\\u5B9A\",\n      cancel: \"\\u53D6\\u6D88\",\n      error: \"\\u8F93\\u5165\\u7684\\u6570\\u636E\\u4E0D\\u5408\\u6CD5!\"\n    },\n    upload: {\n      deleteTip: \"\\u6309 delete \\u952E\\u53EF\\u5220\\u9664\",\n      delete: \"\\u5220\\u9664\",\n      preview: \"\\u67E5\\u770B\\u56FE\\u7247\",\n      continue: \"\\u7EE7\\u7EED\\u4E0A\\u4F20\"\n    },\n    table: {\n      emptyText: \"\\u6682\\u65E0\\u6570\\u636E\",\n      confirmFilter: \"\\u7B5B\\u9009\",\n      resetFilter: \"\\u91CD\\u7F6E\",\n      clearFilter: \"\\u5168\\u90E8\",\n      sumText: \"\\u5408\\u8BA1\"\n    },\n    tree: {\n      emptyText: \"\\u6682\\u65E0\\u6570\\u636E\"\n    },\n    transfer: {\n      noMatch: \"\\u65E0\\u5339\\u914D\\u6570\\u636E\",\n      noData: \"\\u65E0\\u6570\\u636E\",\n      titles: [\"\\u5217\\u8868 1\", \"\\u5217\\u8868 2\"],\n      filterPlaceholder: \"\\u8BF7\\u8F93\\u5165\\u641C\\u7D22\\u5185\\u5BB9\",\n      noCheckedFormat: \"\\u5171 {total} \\u9879\",\n      hasCheckedFormat: \"\\u5DF2\\u9009 {checked}/{total} \\u9879\"\n    },\n    image: {\n      error: \"\\u52A0\\u8F7D\\u5931\\u8D25\"\n    },\n    pageHeader: {\n      title: \"\\u8FD4\\u56DE\"\n    },\n    popconfirm: {\n      confirmButtonText: \"\\u786E\\u5B9A\",\n      cancelButtonText: \"\\u53D6\\u6D88\"\n    }\n  }\n};\n\nexports[\"default\"] = zhCn;\n//# sourceMappingURL=zh-cn.js.map\n","<template>\r\n  <el-config-provider :locale=\"locale\">\r\n    <router-view></router-view>\r\n  </el-config-provider>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n// 设置语言为中文\r\nimport { ElConfigProvider } from 'element-plus'\r\nimport zhCn from 'element-plus/lib/locale/lang/zh-cn'\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'App',\r\n  components: {\r\n    ElConfigProvider\r\n  },\r\n  data() {\r\n    return {\r\n      locale: zhCn\r\n    }\r\n  }\r\n})\r\n</script>\r\n","<template>\r\n  <el-config-provider :locale=\"locale\">\r\n    <router-view></router-view>\r\n  </el-config-provider>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\n// 设置语言为中文\r\nimport { ElConfigProvider } from 'element-plus'\r\nimport zhCn from 'element-plus/lib/locale/lang/zh-cn'\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'App',\r\n  components: {\r\n    ElConfigProvider\r\n  },\r\n  data() {\r\n    return {\r\n      locale: zhCn\r\n    }\r\n  }\r\n})\r\n</script>\r\n","<template>\r\n  <div class=\"table-container\" :style=\"{ height: normalHeight }\">\r\n    <el-table\r\n      :data=\"tableData\"\r\n      :header-cell-style=\"changeHeaderClass\"\r\n      stripe\r\n      border\r\n      :height=\"height\"\r\n      ref=\"table\"\r\n      v-bind=\"$attrs\"\r\n    >\r\n      <!-- @selection-change=\"handleSelectionChange\" -->\r\n      <!-- 勾选框 -->\r\n      <el-table-column\r\n        v-if=\"selection\"\r\n        align=\"center\"\r\n        type=\"selection\"\r\n        width=\"40px\"\r\n      ></el-table-column>\r\n      <!-- 编号 -->\r\n      <el-table-column\r\n        v-if=\"showIndex\"\r\n        align=\"center\"\r\n        label=\"序号\"\r\n        type=\"index\"\r\n        width=\"50px\"\r\n      />\r\n      <template v-for=\"(col, idx) in columns\">\r\n        <el-table-column\r\n          v-if=\"col.showInList && !col.hidden && (!col.if || col.if())\"\r\n          align=\"center\"\r\n          :fixed=\"col.handlerList ? 'right' : false\"\r\n          :key=\"idx\"\r\n          :label=\"col.displayName\"\r\n          :prop=\"col.name\"\r\n          resizable\r\n          :sortable=\"col.isDataObjectField\"\r\n          :width=\"col.width\"\r\n        >\r\n          <template #header>\r\n            <div style=\"display: inline-flex\">\r\n              <span>{{ col.displayName }}</span>\r\n              <el-tooltip\r\n                v-if=\"col.description && col.displayName != col.description\"\r\n                :content=\"col.description\"\r\n              >\r\n                <el-icon><InfoFilled /></el-icon>\r\n                <!-- <i class=\"el-icon-warning-outline\"></i> -->\r\n              </el-tooltip>\r\n            </div>\r\n          </template>\r\n\r\n          <template v-slot=\"scope\">\r\n            <span\r\n              :class=\"\r\n                  'column' +\r\n                    idx +\r\n                    (isAdjustColumnWidth ? ' adjust-column-width' : '')\r\n                \"\r\n              :data-index=\"idx\"\r\n            >\r\n              <slot\r\n                :name=\"'col-' + scope.column.property\"\r\n                :colData=\"col\"\r\n                :colScope=\"scope\"\r\n              >\r\n                <!-- 使用示例 -->\r\n                <!-- <template v-slot:col-colName=\"{ colData: col, colScope: { row } }\">\r\n        {{ col.name }}1{{ row[col.name] }},\r\n                </template>-->\r\n                <template v-if=\"col.dataType === 'Boolean'\">\r\n                  <el-switch\r\n                    v-model=\"scope.row[col.name]\"\r\n                    active-color=\"#13ce66\"\r\n                    inactive-color=\"#ff4949\"\r\n                    disabled\r\n                  />\r\n                </template>\r\n                <template v-else-if=\"col.itemType === 'select'\">\r\n                  {{ getColumnValue(scope, col) }}\r\n                </template>\r\n                <template v-else-if=\"!col.isDataObjectField && col.cellUrl\">\r\n                  <a :href=\"getUrl(col, scope.row)\">{{ col.displayName }}</a>\r\n                </template>\r\n                <template v-else-if=\"col.handlerList\">\r\n                  <template\r\n                    v-for=\"(handlerItem, i) in col.handlerList\"\r\n                    :key=\"i\"\r\n                  >\r\n                    <template\r\n                      v-if=\"!handlerItem.if || handlerItem.if(scope.row)\"\r\n                    >\r\n                      <el-button\r\n                        :type=\"handlerItem.type\"\r\n                        size=\"default\"\r\n                        @click=\"handlerClick(handlerItem, scope)\"\r\n                        v-bind=\"handlerItem\"\r\n                      >\r\n                        {{ handlerItem.text }}\r\n                      </el-button>\r\n                    </template>\r\n                  </template>\r\n                </template>\r\n                <template v-else>{{ scope.row[col.name] }}</template>\r\n              </slot>\r\n            </span>\r\n          </template>\r\n        </el-table-column>\r\n      </template>\r\n    </el-table>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue';\r\nexport default defineComponent({\r\n  name: 'NormalTable',\r\n  description: '常规表格封装,使用的地方的父级必须指定高度',\r\n  props: {\r\n    // 表格列配置\r\n    columns: {\r\n      type: Array as PropType<any[]>,\r\n      default: [],\r\n    },\r\n    // 表格数据\r\n    tableData: {\r\n      type: Array,\r\n      default: [],\r\n    },\r\n    // 是否垂直展示数据\r\n    vertical: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    // 是否树状结构数据\r\n    isTree: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    // 树形结构key值\r\n    treeKey: {\r\n      type: String,\r\n      require: false,\r\n    },\r\n    // 是否设置了改变表头颜色\r\n    changeHeader: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    // 表格最大高度需要减去的高度,这个值不能太低,否则表格高度会自己不断拉长\r\n    normalHeight: {\r\n      type: String,\r\n      default: 'calc(100% - 146px)',\r\n    },\r\n    /**\r\n     *  表格height属性,与normalHeight组合,可达到不同效果。\r\n       1、normalHeight设置100%,表格没有数据时也能撑开一定高度,此时height设置100%,\r\n        表格高度超过height时自动出现滚动条\r\n       2、height设置为null,表格内容自动撑开高度\r\n     */\r\n    height: {\r\n      type: String,\r\n      default: '100%',\r\n    },\r\n    // 是否显示勾选框\r\n    selection: {\r\n      type: Boolean,\r\n      default: true,\r\n    },\r\n    // 是否显示序号列\r\n    showIndex: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    // 是否自适应列宽\r\n    isAdjustColumnWidth: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n  },\r\n  emits: ['handlerClick'],\r\n  data() {\r\n    return {};\r\n  },\r\n  // computed: {\r\n  //   normalHeight() {\r\n  //     // console.log('normalHeight', this.height)\r\n  //     return {\r\n  //       // height: `calc(100% - ${this.height}px)`\r\n  //       height: this.tableHeight\r\n  //     }\r\n  //   }\r\n  // },\r\n  watch: {\r\n    // 表格数据变化时重新渲染表格\r\n    tableData() {\r\n      const vm = this as any;\r\n      const table = vm.$refs.table;\r\n      if (table) {\r\n        setTimeout(() => {\r\n          table.doLayout();\r\n        }, 600);\r\n\r\n        this.$nextTick(() => {\r\n          if (vm.isAdjustColumnWidth) {\r\n            vm.adjustColumnWidth();\r\n          }\r\n        });\r\n      }\r\n    },\r\n  },\r\n  created() {\r\n    // console.log(this.columns)\r\n  },\r\n  mounted() {\r\n    window.addEventListener('resize', this.resize);\r\n  },\r\n  beforeDestroy() {\r\n    window.removeEventListener('resize', this.resize);\r\n  },\r\n  methods: {\r\n    adjustColumnWidth() {\r\n      const vm = this as any;\r\n      const tableEl = vm.$refs.table.$el;\r\n\r\n      if (tableEl) {\r\n        for (let index = 0; index < this.columns.length; index++) {\r\n          const column = this.columns[index];\r\n          const maxWidth = this.getMaxWidth(index);\r\n          if (maxWidth > 0) {\r\n            column.width = maxWidth + 20; // 20间距\r\n          }\r\n        }\r\n      }\r\n    },\r\n    getMaxWidth(index: any) {\r\n      const vm = this as any;\r\n      const tableEl = vm.$refs.table.$el;\r\n      // // 先获取原来的宽度,作为默认值\r\n      // let colEl = tableEl.querySelector(\r\n      //   `col[name=el-table_1_column_${\r\n      //     this.selection && this.showIndex\r\n      //       ? index + 2\r\n      //       : this.selection || this.showIndex\r\n      //       ? index + 1\r\n      //       : index\r\n      //   }]`\r\n      // )\r\n\r\n      let maxWidth = 0;\r\n\r\n      // if (colEl && colEl.width) {\r\n      //   // maxWidth = parseInt(colEl.width)\r\n      //   console.log(\r\n      //     'width',\r\n      //     index,\r\n      //     colEl.width,\r\n      //     this.selection && this.showIndex\r\n      //       ? index + 3\r\n      //       : this.selection || this.showIndex\r\n      //       ? index + 2\r\n      //       : index + 1\r\n      //   )\r\n      // }\r\n\r\n      const columnEls = tableEl.querySelectorAll('.column' + index);\r\n      for (const el of columnEls) {\r\n        if (el.offsetWidth > maxWidth) {\r\n          maxWidth = el.offsetWidth;\r\n        }\r\n      }\r\n\r\n      return maxWidth;\r\n    },\r\n    changeHeaderClass(scope: any) {\r\n      if (this.changeHeader) {\r\n        const colorMap = {} as any;\r\n        this.columns.forEach((item) => {\r\n          colorMap[item.name] = item.color || '#fff';\r\n        });\r\n        return {\r\n          backgroundColor: colorMap[scope.column.property] || '#fff',\r\n          color: '#000',\r\n        };\r\n      }\r\n      return {\r\n        backgroundColor: '#f6f6f6',\r\n        // color: '#333333',\r\n        // fontWeight: 'normal'\r\n      };\r\n    },\r\n    rowChangeStyle(row: any) {\r\n      // console.log(row)\r\n      if (\r\n        row.row.childTransferObject &&\r\n        row.row.childTransferObject.length > 0 &&\r\n        this.isTree\r\n      ) {\r\n        return {\r\n          backgroundColor: '#ddebf7',\r\n        };\r\n      }\r\n    },\r\n    getUrl(column: any, entity: any) {\r\n      // 针对指定实体对象计算url,替换其中变量\r\n      const reg = /{(\\w+)}/g;\r\n      return column.cellUrl.replace(reg, (a: any, b: any) => entity[b]);\r\n    },\r\n    handlerClick(option: any, data: any) {\r\n      let returnData = null;\r\n      this.$emit('handlerClick', option, data, (val: any) => {\r\n        returnData = val;\r\n      });\r\n\r\n      return returnData;\r\n    },\r\n    resize() {\r\n      const vm = this as any;\r\n      const table = vm.$refs.table;\r\n      if (table) {\r\n        setTimeout(() => {\r\n          table.doLayout();\r\n        }, 1000);\r\n      }\r\n    },\r\n    // 从配置中读取要显示的值,适用于下拉框\r\n    getColumnValue(scope: any, col: any) {\r\n      // 判断是否是数据行\r\n      if (scope.$index < 0) {\r\n        return scope.row[col.name];\r\n      }\r\n\r\n      const row = scope.row;\r\n      let dataList = col.dataList;\r\n      const url = col.url;\r\n\r\n      if (!dataList) {\r\n        if (typeof url === 'string' && url.startsWith('[')) {\r\n          dataList = col.dataList = JSON.parse(url);\r\n        } else if (\r\n          typeof url === 'string' &&\r\n          (url.startsWith('/') || url.startsWith('http'))\r\n        ) {\r\n          // 请求url获取数据\r\n          this.getRemoteData(row, col);\r\n          // 请求远程数据有延迟,先返回原始数据\r\n          return row[col.name];\r\n        } else if (typeof url === 'object' && url.length > 0) {\r\n          dataList = col.dataList = col.url;\r\n        } else {\r\n          return row[col.name];\r\n        }\r\n      }\r\n\r\n      if (!dataList) {\r\n        return row[col.name];\r\n      }\r\n\r\n      if (dataList.length > 0) {\r\n        for (const item of dataList) {\r\n          if (item[col.valueField || 'value'] === row[col.name]) {\r\n            return item[col.labelField || 'label'];\r\n          }\r\n        }\r\n      }\r\n\r\n      return row[col.name];\r\n    },\r\n    // 获取远程数据\r\n    getRemoteData(row: any, configs: any) {\r\n      const vm = this;\r\n      if (configs.loading) {\r\n        // 正在加载数据,直接返回\r\n        return;\r\n      }\r\n\r\n      configs.loading = true;\r\n\r\n      const url = configs.url;\r\n      const options = {} as any;\r\n\r\n      const searchParams = new URLSearchParams(configs.options) as any;\r\n      for (const item of searchParams) {\r\n        options[item[0]] = item[1];\r\n      }\r\n      const method = options.method || 'post';\r\n      let data = {};\r\n\r\n      // 设置data,处理插值\r\n      this.setData(configs, options, row);\r\n\r\n      if (configs.data) {\r\n        data = { ...data, ...JSON.parse(configs.data) };\r\n      }\r\n\r\n      const config = {\r\n        url,\r\n        method,\r\n        data,\r\n      };\r\n\r\n      vm.$http(config).then((res) => {\r\n        configs.dataList = res.data.list || res.data.rows || res.data;\r\n        configs.loading = false;\r\n        const table = vm.$refs.table as any;\r\n        if (table) {\r\n          setTimeout(() => {\r\n            table.doLayout();\r\n          }, 100);\r\n        }\r\n      });\r\n    },\r\n    // 设置请求参数,configs.data。对options.data进行处理,如果值有{{field}}形式的值,则替换成为model中的值\r\n    setData(configs: any, options: any, row: any) {\r\n      if (!options.data) {\r\n        return;\r\n      }\r\n\r\n      const data = JSON.parse(options.data);\r\n\r\n      if (!configs.data) {\r\n        configs.data = {};\r\n      }\r\n\r\n      for (const key in data) {\r\n        if (Object.prototype.hasOwnProperty.call(data, key)) {\r\n          const val = data[key];\r\n\r\n          if (\r\n            typeof val === 'string' &&\r\n            val.startsWith('{{') &&\r\n            val.endsWith('}}')\r\n          ) {\r\n            if (row) {\r\n              configs.data[key] = row[val.substring(2, val.length - 2)];\r\n            }\r\n          } else {\r\n            configs.data[key] = val;\r\n          }\r\n        }\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.normal-table {\r\n  margin-top: 1px;\r\n  overflow: auto;\r\n}\r\n\r\n.table-container {\r\n  /* max-height: calc(100vh - 177px); */\r\n  /* overflow-y: auto; */\r\n  height: auto;\r\n  // margin: 5px 0 2px 0;\r\n  // padding: 3px 0 2px 0;\r\n  // box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n/** 操作按钮 */\r\n.el-table .el-button {\r\n  margin: 2px;\r\n}\r\n\r\n/** 表格操作 */\r\n.action {\r\n  margin: 0 8px;\r\n  cursor: pointer;\r\n  font-size: 17px;\r\n}\r\n\r\n/** 表头、行上下间距 */\r\n:deep(.el-table td) {\r\n  padding: 2px 0 2px 0;\r\n}\r\n:deep(.el-table th) {\r\n  padding: 2px 0 2px 0;\r\n}\r\n\r\n/** 表头、行上下间距 */\r\n:deep(.cell) {\r\n  padding: 0 1px 0 1px;\r\n  // overflow: unset;\r\n}\r\n\r\n// 表格行高度设置48px,避免内容高度过低使得表格变得紧凑\r\n:deep(.el-table .el-table__cell) {\r\n  height: 48px;\r\n}\r\n\r\n:deep(.el-table .el-table__cell .cell > span.adjust-column-width) {\r\n  word-break: normal;\r\n  text-overflow: clip;\r\n  overflow: auto;\r\n  white-space: nowrap;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"table-container\" :style=\"{ height: normalHeight }\">\r\n    <el-table\r\n      :data=\"tableData\"\r\n      :header-cell-style=\"changeHeaderClass\"\r\n      stripe\r\n      border\r\n      :height=\"height\"\r\n      ref=\"table\"\r\n      v-bind=\"$attrs\"\r\n    >\r\n      <!-- @selection-change=\"handleSelectionChange\" -->\r\n      <!-- 勾选框 -->\r\n      <el-table-column\r\n        v-if=\"selection\"\r\n        align=\"center\"\r\n        type=\"selection\"\r\n        width=\"40px\"\r\n      ></el-table-column>\r\n      <!-- 编号 -->\r\n      <el-table-column\r\n        v-if=\"showIndex\"\r\n        align=\"center\"\r\n        label=\"序号\"\r\n        type=\"index\"\r\n        width=\"50px\"\r\n      />\r\n      <template v-for=\"(col, idx) in columns\">\r\n        <el-table-column\r\n          v-if=\"col.showInList && !col.hidden && (!col.if || col.if())\"\r\n          align=\"center\"\r\n          :fixed=\"col.handlerList ? 'right' : false\"\r\n          :key=\"idx\"\r\n          :label=\"col.displayName\"\r\n          :prop=\"col.name\"\r\n          resizable\r\n          :sortable=\"col.isDataObjectField\"\r\n          :width=\"col.width\"\r\n        >\r\n          <template #header>\r\n            <div style=\"display: inline-flex\">\r\n              <span>{{ col.displayName }}</span>\r\n              <el-tooltip\r\n                v-if=\"col.description && col.displayName != col.description\"\r\n                :content=\"col.description\"\r\n              >\r\n                <el-icon><InfoFilled /></el-icon>\r\n                <!-- <i class=\"el-icon-warning-outline\"></i> -->\r\n              </el-tooltip>\r\n            </div>\r\n          </template>\r\n\r\n          <template v-slot=\"scope\">\r\n            <span\r\n              :class=\"\r\n                  'column' +\r\n                    idx +\r\n                    (isAdjustColumnWidth ? ' adjust-column-width' : '')\r\n                \"\r\n              :data-index=\"idx\"\r\n            >\r\n              <slot\r\n                :name=\"'col-' + scope.column.property\"\r\n                :colData=\"col\"\r\n                :colScope=\"scope\"\r\n              >\r\n                <!-- 使用示例 -->\r\n                <!-- <template v-slot:col-colName=\"{ colData: col, colScope: { row } }\">\r\n        {{ col.name }}1{{ row[col.name] }},\r\n                </template>-->\r\n                <template v-if=\"col.dataType === 'Boolean'\">\r\n                  <el-switch\r\n                    v-model=\"scope.row[col.name]\"\r\n                    active-color=\"#13ce66\"\r\n                    inactive-color=\"#ff4949\"\r\n                    disabled\r\n                  />\r\n                </template>\r\n                <template v-else-if=\"col.itemType === 'select'\">\r\n                  {{ getColumnValue(scope, col) }}\r\n                </template>\r\n                <template v-else-if=\"!col.isDataObjectField && col.cellUrl\">\r\n                  <a :href=\"getUrl(col, scope.row)\">{{ col.displayName }}</a>\r\n                </template>\r\n                <template v-else-if=\"col.handlerList\">\r\n                  <template\r\n                    v-for=\"(handlerItem, i) in col.handlerList\"\r\n                    :key=\"i\"\r\n                  >\r\n                    <template\r\n                      v-if=\"!handlerItem.if || handlerItem.if(scope.row)\"\r\n                    >\r\n                      <el-button\r\n                        :type=\"handlerItem.type\"\r\n                        size=\"default\"\r\n                        @click=\"handlerClick(handlerItem, scope)\"\r\n                        v-bind=\"handlerItem\"\r\n                      >\r\n                        {{ handlerItem.text }}\r\n                      </el-button>\r\n                    </template>\r\n                  </template>\r\n                </template>\r\n                <template v-else>{{ scope.row[col.name] }}</template>\r\n              </slot>\r\n            </span>\r\n          </template>\r\n        </el-table-column>\r\n      </template>\r\n    </el-table>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue';\r\nexport default defineComponent({\r\n  name: 'NormalTable',\r\n  description: '常规表格封装,使用的地方的父级必须指定高度',\r\n  props: {\r\n    // 表格列配置\r\n    columns: {\r\n      type: Array as PropType<any[]>,\r\n      default: [],\r\n    },\r\n    // 表格数据\r\n    tableData: {\r\n      type: Array,\r\n      default: [],\r\n    },\r\n    // 是否垂直展示数据\r\n    vertical: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    // 是否树状结构数据\r\n    isTree: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    // 树形结构key值\r\n    treeKey: {\r\n      type: String,\r\n      require: false,\r\n    },\r\n    // 是否设置了改变表头颜色\r\n    changeHeader: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    // 表格最大高度需要减去的高度,这个值不能太低,否则表格高度会自己不断拉长\r\n    normalHeight: {\r\n      type: String,\r\n      default: 'calc(100% - 146px)',\r\n    },\r\n    /**\r\n     *  表格height属性,与normalHeight组合,可达到不同效果。\r\n       1、normalHeight设置100%,表格没有数据时也能撑开一定高度,此时height设置100%,\r\n        表格高度超过height时自动出现滚动条\r\n       2、height设置为null,表格内容自动撑开高度\r\n     */\r\n    height: {\r\n      type: String,\r\n      default: '100%',\r\n    },\r\n    // 是否显示勾选框\r\n    selection: {\r\n      type: Boolean,\r\n      default: true,\r\n    },\r\n    // 是否显示序号列\r\n    showIndex: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n    // 是否自适应列宽\r\n    isAdjustColumnWidth: {\r\n      type: Boolean,\r\n      default: false,\r\n    },\r\n  },\r\n  emits: ['handlerClick'],\r\n  data() {\r\n    return {};\r\n  },\r\n  // computed: {\r\n  //   normalHeight() {\r\n  //     // console.log('normalHeight', this.height)\r\n  //     return {\r\n  //       // height: `calc(100% - ${this.height}px)`\r\n  //       height: this.tableHeight\r\n  //     }\r\n  //   }\r\n  // },\r\n  watch: {\r\n    // 表格数据变化时重新渲染表格\r\n    tableData() {\r\n      const vm = this as any;\r\n      const table = vm.$refs.table;\r\n      if (table) {\r\n        setTimeout(() => {\r\n          table.doLayout();\r\n        }, 600);\r\n\r\n        this.$nextTick(() => {\r\n          if (vm.isAdjustColumnWidth) {\r\n            vm.adjustColumnWidth();\r\n          }\r\n        });\r\n      }\r\n    },\r\n  },\r\n  created() {\r\n    // console.log(this.columns)\r\n  },\r\n  mounted() {\r\n    window.addEventListener('resize', this.resize);\r\n  },\r\n  beforeDestroy() {\r\n    window.removeEventListener('resize', this.resize);\r\n  },\r\n  methods: {\r\n    adjustColumnWidth() {\r\n      const vm = this as any;\r\n      const tableEl = vm.$refs.table.$el;\r\n\r\n      if (tableEl) {\r\n        for (let index = 0; index < this.columns.length; index++) {\r\n          const column = this.columns[index];\r\n          const maxWidth = this.getMaxWidth(index);\r\n          if (maxWidth > 0) {\r\n            column.width = maxWidth + 20; // 20间距\r\n          }\r\n        }\r\n      }\r\n    },\r\n    getMaxWidth(index: any) {\r\n      const vm = this as any;\r\n      const tableEl = vm.$refs.table.$el;\r\n      // // 先获取原来的宽度,作为默认值\r\n      // let colEl = tableEl.querySelector(\r\n      //   `col[name=el-table_1_column_${\r\n      //     this.selection && this.showIndex\r\n      //       ? index + 2\r\n      //       : this.selection || this.showIndex\r\n      //       ? index + 1\r\n      //       : index\r\n      //   }]`\r\n      // )\r\n\r\n      let maxWidth = 0;\r\n\r\n      // if (colEl && colEl.width) {\r\n      //   // maxWidth = parseInt(colEl.width)\r\n      //   console.log(\r\n      //     'width',\r\n      //     index,\r\n      //     colEl.width,\r\n      //     this.selection && this.showIndex\r\n      //       ? index + 3\r\n      //       : this.selection || this.showIndex\r\n      //       ? index + 2\r\n      //       : index + 1\r\n      //   )\r\n      // }\r\n\r\n      const columnEls = tableEl.querySelectorAll('.column' + index);\r\n      for (const el of columnEls) {\r\n        if (el.offsetWidth > maxWidth) {\r\n          maxWidth = el.offsetWidth;\r\n        }\r\n      }\r\n\r\n      return maxWidth;\r\n    },\r\n    changeHeaderClass(scope: any) {\r\n      if (this.changeHeader) {\r\n        const colorMap = {} as any;\r\n        this.columns.forEach((item) => {\r\n          colorMap[item.name] = item.color || '#fff';\r\n        });\r\n        return {\r\n          backgroundColor: colorMap[scope.column.property] || '#fff',\r\n          color: '#000',\r\n        };\r\n      }\r\n      return {\r\n        backgroundColor: '#f6f6f6',\r\n        // color: '#333333',\r\n        // fontWeight: 'normal'\r\n      };\r\n    },\r\n    rowChangeStyle(row: any) {\r\n      // console.log(row)\r\n      if (\r\n        row.row.childTransferObject &&\r\n        row.row.childTransferObject.length > 0 &&\r\n        this.isTree\r\n      ) {\r\n        return {\r\n          backgroundColor: '#ddebf7',\r\n        };\r\n      }\r\n    },\r\n    getUrl(column: any, entity: any) {\r\n      // 针对指定实体对象计算url,替换其中变量\r\n      const reg = /{(\\w+)}/g;\r\n      return column.cellUrl.replace(reg, (a: any, b: any) => entity[b]);\r\n    },\r\n    handlerClick(option: any, data: any) {\r\n      let returnData = null;\r\n      this.$emit('handlerClick', option, data, (val: any) => {\r\n        returnData = val;\r\n      });\r\n\r\n      return returnData;\r\n    },\r\n    resize() {\r\n      const vm = this as any;\r\n      const table = vm.$refs.table;\r\n      if (table) {\r\n        setTimeout(() => {\r\n          table.doLayout();\r\n        }, 1000);\r\n      }\r\n    },\r\n    // 从配置中读取要显示的值,适用于下拉框\r\n    getColumnValue(scope: any, col: any) {\r\n      // 判断是否是数据行\r\n      if (scope.$index < 0) {\r\n        return scope.row[col.name];\r\n      }\r\n\r\n      const row = scope.row;\r\n      let dataList = col.dataList;\r\n      const url = col.url;\r\n\r\n      if (!dataList) {\r\n        if (typeof url === 'string' && url.startsWith('[')) {\r\n          dataList = col.dataList = JSON.parse(url);\r\n        } else if (\r\n          typeof url === 'string' &&\r\n          (url.startsWith('/') || url.startsWith('http'))\r\n        ) {\r\n          // 请求url获取数据\r\n          this.getRemoteData(row, col);\r\n          // 请求远程数据有延迟,先返回原始数据\r\n          return row[col.name];\r\n        } else if (typeof url === 'object' && url.length > 0) {\r\n          dataList = col.dataList = col.url;\r\n        } else {\r\n          return row[col.name];\r\n        }\r\n      }\r\n\r\n      if (!dataList) {\r\n        return row[col.name];\r\n      }\r\n\r\n      if (dataList.length > 0) {\r\n        for (const item of dataList) {\r\n          if (item[col.valueField || 'value'] === row[col.name]) {\r\n            return item[col.labelField || 'label'];\r\n          }\r\n        }\r\n      }\r\n\r\n      return row[col.name];\r\n    },\r\n    // 获取远程数据\r\n    getRemoteData(row: any, configs: any) {\r\n      const vm = this;\r\n      if (configs.loading) {\r\n        // 正在加载数据,直接返回\r\n        return;\r\n      }\r\n\r\n      configs.loading = true;\r\n\r\n      const url = configs.url;\r\n      const options = {} as any;\r\n\r\n      const searchParams = new URLSearchParams(configs.options) as any;\r\n      for (const item of searchParams) {\r\n        options[item[0]] = item[1];\r\n      }\r\n      const method = options.method || 'post';\r\n      let data = {};\r\n\r\n      // 设置data,处理插值\r\n      this.setData(configs, options, row);\r\n\r\n      if (configs.data) {\r\n        data = { ...data, ...JSON.parse(configs.data) };\r\n      }\r\n\r\n      const config = {\r\n        url,\r\n        method,\r\n        data,\r\n      };\r\n\r\n      vm.$http(config).then((res) => {\r\n        configs.dataList = res.data.list || res.data.rows || res.data;\r\n        configs.loading = false;\r\n        const table = vm.$refs.table as any;\r\n        if (table) {\r\n          setTimeout(() => {\r\n            table.doLayout();\r\n          }, 100);\r\n        }\r\n      });\r\n    },\r\n    // 设置请求参数,configs.data。对options.data进行处理,如果值有{{field}}形式的值,则替换成为model中的值\r\n    setData(configs: any, options: any, row: any) {\r\n      if (!options.data) {\r\n        return;\r\n      }\r\n\r\n      const data = JSON.parse(options.data);\r\n\r\n      if (!configs.data) {\r\n        configs.data = {};\r\n      }\r\n\r\n      for (const key in data) {\r\n        if (Object.prototype.hasOwnProperty.call(data, key)) {\r\n          const val = data[key];\r\n\r\n          if (\r\n            typeof val === 'string' &&\r\n            val.startsWith('{{') &&\r\n            val.endsWith('}}')\r\n          ) {\r\n            if (row) {\r\n              configs.data[key] = row[val.substring(2, val.length - 2)];\r\n            }\r\n          } else {\r\n            configs.data[key] = val;\r\n          }\r\n        }\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.normal-table {\r\n  margin-top: 1px;\r\n  overflow: auto;\r\n}\r\n\r\n.table-container {\r\n  /* max-height: calc(100vh - 177px); */\r\n  /* overflow-y: auto; */\r\n  height: auto;\r\n  // margin: 5px 0 2px 0;\r\n  // padding: 3px 0 2px 0;\r\n  // box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n/** 操作按钮 */\r\n.el-table .el-button {\r\n  margin: 2px;\r\n}\r\n\r\n/** 表格操作 */\r\n.action {\r\n  margin: 0 8px;\r\n  cursor: pointer;\r\n  font-size: 17px;\r\n}\r\n\r\n/** 表头、行上下间距 */\r\n:deep(.el-table td) {\r\n  padding: 2px 0 2px 0;\r\n}\r\n:deep(.el-table th) {\r\n  padding: 2px 0 2px 0;\r\n}\r\n\r\n/** 表头、行上下间距 */\r\n:deep(.cell) {\r\n  padding: 0 1px 0 1px;\r\n  // overflow: unset;\r\n}\r\n\r\n// 表格行高度设置48px,避免内容高度过低使得表格变得紧凑\r\n:deep(.el-table .el-table__cell) {\r\n  height: 48px;\r\n}\r\n\r\n:deep(.el-table .el-table__cell .cell > span.adjust-column-width) {\r\n  word-break: normal;\r\n  text-overflow: clip;\r\n  overflow: auto;\r\n  white-space: nowrap;\r\n}\r\n</style>\r\n","<template>\r\n  <el-row type=\"flex\" justify=\"center\" align=\"middle\" class=\"operator\">\r\n    <el-col :span=\"12\" class=\"left-search\">\r\n      <template v-for=\"(btn, idx) in tableHandlerList\" :key=\"idx\">\r\n        <template v-if=\"!btn.if || btn.if(searchParams)\">\r\n          <slot :name=\"'handler-' + btn.name\" :config=\"btn\">\r\n            <el-button size=\"default\" @click=\"handlerClick(btn)\" v-bind=\"btn\">\r\n              {{ btn.name }}\r\n            </el-button>\r\n          </slot>\r\n        </template>\r\n      </template>\r\n    </el-col>\r\n    <el-col\r\n      :span=\"12\"\r\n      style=\"display: flex; justify-content: flex-end; align-items: center\"\r\n    >\r\n      <el-tooltip effect=\"dark\" content=\"刷新\" placement=\"top-end\">\r\n        <el-icon\r\n          class=\"action\"\r\n          @click=\"handlerClick({ handler: 'getDataList' })\"\r\n        >\r\n          <refresh />\r\n        </el-icon>\r\n      </el-tooltip>\r\n\r\n      <el-popover placement=\"bottom\" :width=\"220\" trigger=\"click\">\r\n        <div>设置列字段</div>\r\n        <div class=\"setting-btn\">\r\n          <div style=\"padding-top: 5px\">\r\n            <el-checkbox\r\n              @change=\"chooseAll\"\r\n              v-model=\"allChoose\"\r\n              :indeterminate=\"isIndeterminate\"\r\n            >\r\n              全选\r\n            </el-checkbox>\r\n          </div>\r\n        </div>\r\n        <el-divider></el-divider>\r\n        <div style=\"max-height: 380px; overflow: auto\">\r\n          <div v-for=\"(field, index) in columns\" :key=\"index\">\r\n            <template v-if=\"field.showInList\">\r\n              <el-checkbox\r\n                @change=\"chooseItem(field)\"\r\n                :model-value=\"!field.hidden\"\r\n              >\r\n                {{ field.displayName }}\r\n              </el-checkbox>\r\n            </template>\r\n          </div>\r\n        </div>\r\n        <template #reference>\r\n          <div>\r\n            <el-tooltip effect=\"dark\" content=\"列设置\" placement=\"top-end\">\r\n              <el-icon class=\"action\">\r\n                <setting />\r\n              </el-icon>\r\n            </el-tooltip>\r\n          </div>\r\n        </template>\r\n      </el-popover>\r\n\r\n      <!-- <el-tooltip effect=\"dark\" content=\"全屏\" placement=\"top-end\">\r\n        <el-icon class=\"action\">\r\n          <full-screen />\r\n        </el-icon>\r\n      </el-tooltip>-->\r\n    </el-col>\r\n  </el-row>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'TableHandler',\r\n  props: {\r\n    columns: {\r\n      type: Array as any,\r\n      default: () => []\r\n    },\r\n    tableHandlerList: {\r\n      type: Array as PropType<any[]>,\r\n      default: () => []\r\n    },\r\n    permissionFlags: {\r\n      type: Object,\r\n      default: () => {}\r\n    },\r\n    // 搜索参数\r\n    searchParams: {\r\n      type: Object,\r\n      default: () => {}\r\n    }\r\n  },\r\n  emits: ['handlerClick'],\r\n  //   setup(props, context) {\r\n  //     // console.log(arguments)\r\n\r\n  //     const operator = (option) => {\r\n  //       context.emit('operator', option)\r\n  //     }\r\n\r\n  //     return {\r\n  //       operator\r\n  //     }\r\n  //   },\r\n  data() {\r\n    return {\r\n      allChoose: true,\r\n      isIndeterminate: false\r\n    }\r\n  },\r\n  methods: {\r\n    checkChoose() {\r\n      let trueLength = this.columns.filter((item: any) => !item.hidden).length\r\n      if (trueLength == this.columns.length) {\r\n        this.allChoose = true\r\n        this.isIndeterminate = false\r\n        return\r\n      }\r\n      this.allChoose = false\r\n      this.isIndeterminate = trueLength > 0 && trueLength < this.columns.length\r\n    },\r\n    chooseAll(val: any) {\r\n      this.columns.forEach((item: any) => {\r\n        item.hidden = !val\r\n      })\r\n\r\n      if (val) {\r\n        this.isIndeterminate = false\r\n      }\r\n    },\r\n    chooseItem(val: any) {\r\n      val.hidden = !val.hidden\r\n      this.checkChoose()\r\n    },\r\n    handlerClick(option: any, data?: any) {\r\n      this.$emit('handlerClick', option, data)\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.operator {\r\n  padding: 8px 0 10px 0;\r\n}\r\n\r\n.action {\r\n  margin: 0 8px;\r\n  cursor: pointer;\r\n  font-size: 17px;\r\n  background-color: #f4f4f5;\r\n  min-width: 30px;\r\n  min-height: 30px;\r\n  display: flex;\r\n  justify-content: center;\r\n  align-items: center;\r\n}\r\n</style>\r\n","<template>\r\n  <el-row type=\"flex\" justify=\"center\" align=\"middle\" class=\"operator\">\r\n    <el-col :span=\"12\" class=\"left-search\">\r\n      <template v-for=\"(btn, idx) in tableHandlerList\" :key=\"idx\">\r\n        <template v-if=\"!btn.if || btn.if(searchParams)\">\r\n          <slot :name=\"'handler-' + btn.name\" :config=\"btn\">\r\n            <el-button size=\"default\" @click=\"handlerClick(btn)\" v-bind=\"btn\">\r\n              {{ btn.name }}\r\n            </el-button>\r\n          </slot>\r\n        </template>\r\n      </template>\r\n    </el-col>\r\n    <el-col\r\n      :span=\"12\"\r\n      style=\"display: flex; justify-content: flex-end; align-items: center\"\r\n    >\r\n      <el-tooltip effect=\"dark\" content=\"刷新\" placement=\"top-end\">\r\n        <el-icon\r\n          class=\"action\"\r\n          @click=\"handlerClick({ handler: 'getDataList' })\"\r\n        >\r\n          <refresh />\r\n        </el-icon>\r\n      </el-tooltip>\r\n\r\n      <el-popover placement=\"bottom\" :width=\"220\" trigger=\"click\">\r\n        <div>设置列字段</div>\r\n        <div class=\"setting-btn\">\r\n          <div style=\"padding-top: 5px\">\r\n            <el-checkbox\r\n              @change=\"chooseAll\"\r\n              v-model=\"allChoose\"\r\n              :indeterminate=\"isIndeterminate\"\r\n            >\r\n              全选\r\n            </el-checkbox>\r\n          </div>\r\n        </div>\r\n        <el-divider></el-divider>\r\n        <div style=\"max-height: 380px; overflow: auto\">\r\n          <div v-for=\"(field, index) in columns\" :key=\"index\">\r\n            <template v-if=\"field.showInList\">\r\n              <el-checkbox\r\n                @change=\"chooseItem(field)\"\r\n                :model-value=\"!field.hidden\"\r\n              >\r\n                {{ field.displayName }}\r\n              </el-checkbox>\r\n            </template>\r\n          </div>\r\n        </div>\r\n        <template #reference>\r\n          <div>\r\n            <el-tooltip effect=\"dark\" content=\"列设置\" placement=\"top-end\">\r\n              <el-icon class=\"action\">\r\n                <setting />\r\n              </el-icon>\r\n            </el-tooltip>\r\n          </div>\r\n        </template>\r\n      </el-popover>\r\n\r\n      <!-- <el-tooltip effect=\"dark\" content=\"全屏\" placement=\"top-end\">\r\n        <el-icon class=\"action\">\r\n          <full-screen />\r\n        </el-icon>\r\n      </el-tooltip>-->\r\n    </el-col>\r\n  </el-row>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'TableHandler',\r\n  props: {\r\n    columns: {\r\n      type: Array as any,\r\n      default: () => []\r\n    },\r\n    tableHandlerList: {\r\n      type: Array as PropType<any[]>,\r\n      default: () => []\r\n    },\r\n    permissionFlags: {\r\n      type: Object,\r\n      default: () => {}\r\n    },\r\n    // 搜索参数\r\n    searchParams: {\r\n      type: Object,\r\n      default: () => {}\r\n    }\r\n  },\r\n  emits: ['handlerClick'],\r\n  //   setup(props, context) {\r\n  //     // console.log(arguments)\r\n\r\n  //     const operator = (option) => {\r\n  //       context.emit('operator', option)\r\n  //     }\r\n\r\n  //     return {\r\n  //       operator\r\n  //     }\r\n  //   },\r\n  data() {\r\n    return {\r\n      allChoose: true,\r\n      isIndeterminate: false\r\n    }\r\n  },\r\n  methods: {\r\n    checkChoose() {\r\n      let trueLength = this.columns.filter((item: any) => !item.hidden).length\r\n      if (trueLength == this.columns.length) {\r\n        this.allChoose = true\r\n        this.isIndeterminate = false\r\n        return\r\n      }\r\n      this.allChoose = false\r\n      this.isIndeterminate = trueLength > 0 && trueLength < this.columns.length\r\n    },\r\n    chooseAll(val: any) {\r\n      this.columns.forEach((item: any) => {\r\n        item.hidden = !val\r\n      })\r\n\r\n      if (val) {\r\n        this.isIndeterminate = false\r\n      }\r\n    },\r\n    chooseItem(val: any) {\r\n      val.hidden = !val.hidden\r\n      this.checkChoose()\r\n    },\r\n    handlerClick(option: any, data?: any) {\r\n      this.$emit('handlerClick', option, data)\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.operator {\r\n  padding: 8px 0 10px 0;\r\n}\r\n\r\n.action {\r\n  margin: 0 8px;\r\n  cursor: pointer;\r\n  font-size: 17px;\r\n  background-color: #f4f4f5;\r\n  min-width: 30px;\r\n  min-height: 30px;\r\n  display: flex;\r\n  justify-content: center;\r\n  align-items: center;\r\n}\r\n</style>\r\n","<template>\r\n  <el-select-v2\r\n    v-if=\"configs.itemType === 'select'\"\r\n    v-model=\"model\"\r\n    size=\"default\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    :placeholder=\"options.placeholder || '请选择' + configs.displayName\"\r\n    :remote=\"options.remote === 'true' || options.remote === true\"\r\n    :remote-method=\"getRemoteData\"\r\n    :allow-create=\"\r\n      options.allowCreate === 'true' || options.allowCreate === true\r\n    \"\r\n    :multiple=\"options.multiple === 'true' || options.multiple === true\"\r\n    :options=\"selectOptions\"\r\n    filterable\r\n    clearable\r\n    v-bind=\"$attrs\"\r\n  >\r\n    <!-- <el-option\r\n      v-for=\"(item, idx) in dataList\"\r\n      :key=\"idx\"\r\n      :label=\"item[options.labelField || 'label']\"\r\n      :value=\"getValueByDataType(item, options)\"\r\n    ></el-option> -->\r\n  </el-select-v2>\r\n\r\n  <template v-else-if=\"configs.itemType === 'radio'\">\r\n    <div :style=\"{ width: configs.width ? configs.width : '220px' }\">\r\n      <el-radio\r\n        v-if=\"valueValidate(options.value1)\"\r\n        v-model=\"model\"\r\n        :label=\"\r\n          typeof model === 'number' ? parseInt(options.value1) : options.value1\r\n        \"\r\n        v-bind=\"$attrs\"\r\n      >\r\n        {{ options.label1 }}\r\n      </el-radio>\r\n      <el-radio\r\n        v-if=\"valueValidate(options.value2)\"\r\n        v-model=\"model\"\r\n        :label=\"\r\n          typeof model === 'number' ? parseInt(options.value2) : options.value2\r\n        \"\r\n        v-bind=\"$attrs\"\r\n      >\r\n        {{ options.label2 }}\r\n      </el-radio>\r\n    </div>\r\n  </template>\r\n\r\n  <div\r\n    v-else-if=\"configs.itemType === 'checkbox'\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n  >\r\n    <el-checkbox-group v-model=\"model\" v-bind=\"$attrs\">\r\n      <el-checkbox\r\n        v-for=\"item in dataList\"\r\n        :label=\"getValueByDataType(item, options)\"\r\n      >\r\n        {{ item[options.labelField || 'label'] }}\r\n      </el-checkbox>\r\n    </el-checkbox-group>\r\n  </div>\r\n\r\n  <!-- 日期时间选择器 -->\r\n  <el-date-picker\r\n    v-else-if=\"configs.itemType === 'datePicker'\"\r\n    v-model=\"model\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    size=\"default\"\r\n    class=\"date-time-picker\"\r\n    :type=\"options.type\"\r\n    format=\"YYYY-MM-DD\"\r\n    value-format=\"YYYY-MM-DD\"\r\n    range-separator=\"至\"\r\n    :start-placeholder=\"'开始时间'\"\r\n    :end-placeholder=\"'结束时间'\"\r\n    :shortcuts=\"shortcuts\"\r\n    v-bind=\"$attrs\"\r\n  ></el-date-picker>\r\n\r\n  <template\r\n    v-else-if=\"configs.itemType === 'switch' || configs.dataType === 'Boolean'\"\r\n  >\r\n    <el-switch\r\n      v-model=\"model\"\r\n      :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n      active-color=\"#13ce66\"\r\n      inactive-color=\"#ff4949\"\r\n      :disabled=\"\r\n      options.disabled === 'true' || options.disabled === true ? true : false\r\n    \"\r\n    />\r\n  </template>\r\n\r\n  <!-- input 标签 ,默认-->\r\n  <el-input\r\n    v-else\r\n    size=\"default\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    :prefix-icon=\"options.icon\"\r\n    :placeholder=\"options.placeholder || '请输入' + configs.displayName\"\r\n    v-model=\"model\"\r\n    clearable\r\n    autosize\r\n    :rows=\"4\"\r\n    :type=\"options.type || 'text'\"\r\n    :disabled=\"\r\n      options.disabled === 'true' || options.disabled === true ? true : false\r\n    \"\r\n    v-bind=\"$attrs\"\r\n  ></el-input>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue';\r\n// import CustomSelect from './CustomSelect.vue'\r\nexport default defineComponent({\r\n  name: 'FormControl',\r\n  // components: { CustomSelect },\r\n  props: {\r\n    // modelValue: [String, Number, Object, Boolean, Array],\r\n    modelValue: [Object],\r\n    // 字段配置\r\n    configs: {\r\n      type: Object,\r\n      default: {},\r\n    },\r\n  },\r\n  emits: ['update:modelValue'],\r\n  data() {\r\n    return {\r\n      model: undefined as any,\r\n      shortcuts: [\r\n        {\r\n          text: '昨天',\r\n          value() {\r\n            const end = new Date();\r\n            const start = new Date();\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 1);\r\n            end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);\r\n            return [start, end];\r\n          },\r\n        },\r\n        {\r\n          text: '今天',\r\n          value() {\r\n            const end = new Date();\r\n            const start = new Date();\r\n            return [start, end];\r\n          },\r\n        },\r\n        {\r\n          text: '最近一周',\r\n          value() {\r\n            const end = new Date();\r\n            const start = new Date();\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);\r\n            return [start, end];\r\n          },\r\n        },\r\n        {\r\n          text: '最近一个月',\r\n          value() {\r\n            const end = new Date();\r\n            const start = new Date();\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);\r\n            return [start, end];\r\n          },\r\n        },\r\n      ],\r\n      // 选项列表\r\n      dataList: [] as any,\r\n    };\r\n  },\r\n  computed: {\r\n    // ui组件的配置\r\n    options(): any {\r\n      let vm = this;\r\n      let obj = {} as any;\r\n      let configs = vm.configs;\r\n\r\n      if (!configs.options) {\r\n        return obj;\r\n      }\r\n\r\n      // 如果options本身就是对象,直接返回\r\n      if (typeof configs.options === 'object') {\r\n        return configs.options;\r\n      }\r\n\r\n      let searchParams = new URLSearchParams(configs.options) as any;\r\n      for (const item of searchParams) {\r\n        let val = item[1] as any;\r\n        // if (val.startsWith('{') || val.startsWith('[]')) {\r\n        //   val = JSON.parse(val)\r\n        // }\r\n\r\n        // 不转类型。直接判断字符串的值,可以优化为。无值的时候赋值false\r\n        // if (val === 'true') {\r\n        //   val = true\r\n        // } else if (val === 'false') {\r\n        //   val = false\r\n        // }\r\n        obj[item[0]] = val;\r\n      }\r\n      // console.log('options', obj)\r\n      return obj;\r\n    },\r\n    name() {\r\n      return this.configs.name;\r\n    },\r\n    selectOptions() {\r\n      return this.dataList.map(\r\n        (x: any) =>\r\n          new Object({\r\n            label: x[this.options.labelField || 'label'],\r\n            // 如果是多选,由于数组转逗号隔开的字符串,再转成数组,值就变成字符串,因此统一处理为字符串\r\n            value:\r\n              this.options.multiple === 'true' || this.options.multiple === true\r\n                ? this.getValueByDataType(x, this.options) + ''\r\n                : this.getValueByDataType(x, this.options),\r\n          }),\r\n      );\r\n    },\r\n  },\r\n  watch: {\r\n    model(val, oldVal) {\r\n      let name = this.name;\r\n      let configs = this.configs;\r\n      let options = this.options;\r\n\r\n      // 字段名包含$,特殊处理\r\n      let temp = this.modelValue as any;\r\n      if (name.includes('$')) {\r\n        let arr = val; // temp[name]\r\n        let names = name.split('$');\r\n\r\n        if (\r\n          configs.itemType === 'datePicker' &&\r\n          configs.options &&\r\n          (configs.options.type === 'daterange' ||\r\n            (typeof configs.options === 'string' &&\r\n              configs.options.includes('type=daterange')))\r\n        ) {\r\n          // 日期范围\r\n\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr[0];\r\n            temp[names[1]] = arr[1];\r\n          } else {\r\n            temp[names[0]] = undefined;\r\n            temp[names[1]] = undefined;\r\n          }\r\n        } else if (configs.itemType === 'checkbox') {\r\n          // 多选框\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr.join();\r\n          } else {\r\n            temp[names[0]] = undefined;\r\n          }\r\n        } else if (\r\n          configs.itemType === 'select' &&\r\n          (options.multiple == 'true' || options.multiple === true)\r\n        ) {\r\n          // 多选下拉\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr.join();\r\n          } else {\r\n            temp[names[0]] = undefined;\r\n          }\r\n        } else {\r\n          console.warn('表单名中带$,但是未配置处理器');\r\n        }\r\n      } else {\r\n        if (configs.itemType === 'select' && !this.valueValidate(val)) {\r\n          // 下拉框上点击清除时,值为空字符串,处理为undefined\r\n          val = undefined;\r\n        }\r\n\r\n        temp[name] = val;\r\n      }\r\n\r\n      // 因为是对象引用,单属性值变化,可以不触发更新\r\n      // this.$emit('update:modelValue', this.modelValue)\r\n    },\r\n    // 外部修改此值,以便传递到model\r\n    modelValue: {\r\n      handler(val: any, oldVal) {\r\n        const name = this.name;\r\n        let value = val[this.name];\r\n        const configs = this.configs;\r\n        const options = this.options;\r\n        // console.log('modelValue', val, oldVal, value)\r\n\r\n        // 字段名包含$,特殊处理\r\n        if (name.includes('$')) {\r\n          const names = name.split('$');\r\n          if (\r\n            configs.itemType === 'datePicker' &&\r\n            configs.options &&\r\n            (configs.options.type === 'daterange' ||\r\n              configs.options.toString().includes('type=daterange'))\r\n          ) {\r\n            // 日期范围从$分割的两个字段中取值\r\n            const val1 = val[names[0]];\r\n            const val2 = val[names[1]];\r\n\r\n            if (this.valueValidate(val1) && this.valueValidate(val2)) {\r\n              this.model = [val1, val2];\r\n              // ;(this.modelValue as any)[name] = undefined\r\n            } else {\r\n              // 如果分割后的两个字段不为空,就不用重置值。因为有可能传进来的值为空是上面的if设置导致\r\n              if (\r\n                !(this.modelValue as any)[names[0]] ||\r\n                !(this.modelValue as any)[names[1]]\r\n              ) {\r\n                this.model = undefined;\r\n              }\r\n            }\r\n          } else if (configs.itemType === 'checkbox') {\r\n            // 外部传进来的应是逗号隔开的值,传值的字段从name中分离出,然后在这里被序列化成数组\r\n            // value 重新取值\r\n            value = val[names[0]];\r\n            if (this.valueValidate(value)) {\r\n              const arr = value.split(',');\r\n              this.model = arr;\r\n            } else {\r\n              this.model = undefined;\r\n            }\r\n          } else if (\r\n            configs.itemType === 'select' &&\r\n            (options.multiple === 'true' || options.multiple === true)\r\n          ) {\r\n            // 外部传进来的应是逗号隔开的值,传值的字段从name中分离出,然后在这里被序列化成数组\r\n            // value 重新取值\r\n            value = val[names[0]];\r\n            if (this.valueValidate(value)) {\r\n              const arr = value.split(',');\r\n              this.model = arr;\r\n            } else {\r\n              this.model = [];\r\n            }\r\n          }\r\n        } else {\r\n          if (\r\n            configs.itemType === 'select' &&\r\n            (options.multiple === 'true' || options.multiple === true)\r\n          ) {\r\n            this.model = value || [];\r\n          } else {\r\n            this.model = value;\r\n          }\r\n        }\r\n      },\r\n      // 加了此选项,就不用再created赋值\r\n      immediate: true,\r\n      deep: true,\r\n    },\r\n    'configs.url': {\r\n      handler() {\r\n        this.getData();\r\n      },\r\n    },\r\n    // 获取远程数据的参数\r\n    'configs.data': {\r\n      handler() {\r\n        this.getData();\r\n      },\r\n      deep: true,\r\n    },\r\n    // !!! 不能监听,外部如果共用configs,那么所有用了该configs的组件都会受影响\r\n    // 'configs.dataList': {\r\n    //   handler() {\r\n    //     this.dataList = this.configs.dataList\r\n    //   },\r\n    //   deep: true\r\n    // }\r\n  },\r\n  created() {\r\n    const vm = this;\r\n\r\n    // 远程或本地数据源处理\r\n    vm.getData();\r\n  },\r\n  methods: {\r\n    // 设置请求参数,configs.data。对options.data进行处理,如果值有{{field}}形式的值,则替换成为model中的值\r\n    setData() {\r\n      if (!this.options.data) {\r\n        return;\r\n      }\r\n\r\n      let data;\r\n\r\n      // 如果options.data是对象,直接赋值,否则解析为对象\r\n      if (typeof this.options.data === 'object') {\r\n        data = this.options.data;\r\n      } else {\r\n        data = JSON.parse(this.options.data);\r\n      }\r\n\r\n      // 将options的data解析后,挂到configs上\r\n      if (!this.configs.data) {\r\n        this.configs.data = {};\r\n      }\r\n\r\n      for (const key in data) {\r\n        if (Object.prototype.hasOwnProperty.call(data, key)) {\r\n          const val = data[key];\r\n\r\n          if (\r\n            typeof val === 'string' &&\r\n            val.startsWith('{{') &&\r\n            val.endsWith('}}')\r\n          ) {\r\n            if (this.modelValue) {\r\n              this.configs.data[key] =\r\n                this.modelValue[val.substring(2, val.length - 2)];\r\n            }\r\n          } else {\r\n            this.configs.data[key] = val;\r\n          }\r\n        }\r\n      }\r\n    },\r\n    // 类似多选下拉的组件,设置默认值\r\n    setDefaultValue() {\r\n      const vm = this;\r\n      const options = vm.options;\r\n      const row = vm.modelValue as any;\r\n      if (vm.dataList) {\r\n        // 不设置该选项,直接返回\r\n        if (!options.getValueField || !options.getLabelField) {\r\n          return;\r\n        }\r\n\r\n        const val = row[options.getValueField];\r\n        // 如果值为空,说明是新增,还没有默认值\r\n        if (!val) {\r\n          return;\r\n        }\r\n\r\n        const data = {\r\n          [options.labelField]: row[options.getLabelField] || val,\r\n          [options.valueField]: val,\r\n        };\r\n\r\n        vm.dataList.push(data);\r\n      }\r\n    },\r\n    getData() {\r\n      const vm = this;\r\n      const url = vm.configs.url;\r\n      if (!url) {\r\n        return;\r\n      }\r\n\r\n      // 远程下拉框,直接返回\r\n      if (vm.options.remote === 'true' || vm.options.remote === true) {\r\n        // 设置默认选项\r\n        this.setDefaultValue();\r\n        return;\r\n      }\r\n\r\n      // 如果本身就是数组\r\n      if (typeof url === 'object' && url.length > 0) {\r\n        vm.dataList = url;\r\n        return;\r\n      }\r\n\r\n      // 如果是[开头,说明数据是数组\r\n      if (typeof url !== 'string') {\r\n        console.warn('配置中url不正确,不进行处理', url);\r\n        return;\r\n      }\r\n\r\n      if (url.startsWith('[')) {\r\n        // 直接解析url中数据\r\n        vm.getLocalData();\r\n      } else if (url.startsWith('/') || url.startsWith('http')) {\r\n        // 请求url获取数据\r\n        vm.getRemoteData();\r\n      } else {\r\n        console.warn('配置中url不正确,不进行处理', url);\r\n      }\r\n    },\r\n    // 获取远程数据\r\n    getRemoteData(query = '') {\r\n      const vm = this;\r\n      const url = vm.configs.url;\r\n      const method = vm.options.method || 'post';\r\n      const keyField = vm.options.keyField || 'txtKeywords';\r\n\r\n      let data = {\r\n        [keyField]: query,\r\n      };\r\n\r\n      // 设置data,处理插值\r\n      this.setData();\r\n\r\n      if (vm.configs.data) {\r\n        data = { ...data, ...vm.configs.data };\r\n      }\r\n\r\n      const config = {\r\n        url,\r\n        method,\r\n        data: undefined as any,\r\n        params: undefined as any,\r\n      };\r\n\r\n      if (method === 'post') {\r\n        config.data = data;\r\n      } else if (method === 'get') {\r\n        config.params = data;\r\n      }\r\n\r\n      vm.$http(config).then((resp) => {\r\n        const array = resp.data;\r\n        const list = array.rows || array.list || array;\r\n        vm.dataList =\r\n          typeof vm.options.afterGetDataList === 'function'\r\n            ? vm.options.afterGetDataList(list)\r\n            : list;\r\n      });\r\n    },\r\n    // 解析url中的数据\r\n    getLocalData() {\r\n      const vm = this;\r\n      const data = JSON.parse(vm.configs.url);\r\n      vm.dataList = data;\r\n    },\r\n    getValueByDataType(data: any, option: any) {\r\n      let val = data[option.valueField || 'value'];\r\n      if (option.dataType === 'Int32' || option.dataType === 'int') {\r\n        val = parseInt(val);\r\n      }\r\n      return val;\r\n    },\r\n    /**\r\n     * 有效值验证,不为undefined、空字符串、null\r\n     */\r\n    valueValidate(value: any) {\r\n      return value !== '' && value !== undefined && value !== null;\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style></style>\r\n","<template>\r\n  <el-select-v2\r\n    v-if=\"configs.itemType === 'select'\"\r\n    v-model=\"model\"\r\n    size=\"default\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    :placeholder=\"options.placeholder || '请选择' + configs.displayName\"\r\n    :remote=\"options.remote === 'true' || options.remote === true\"\r\n    :remote-method=\"getRemoteData\"\r\n    :allow-create=\"\r\n      options.allowCreate === 'true' || options.allowCreate === true\r\n    \"\r\n    :multiple=\"options.multiple === 'true' || options.multiple === true\"\r\n    :options=\"selectOptions\"\r\n    filterable\r\n    clearable\r\n    v-bind=\"$attrs\"\r\n  >\r\n    <!-- <el-option\r\n      v-for=\"(item, idx) in dataList\"\r\n      :key=\"idx\"\r\n      :label=\"item[options.labelField || 'label']\"\r\n      :value=\"getValueByDataType(item, options)\"\r\n    ></el-option> -->\r\n  </el-select-v2>\r\n\r\n  <template v-else-if=\"configs.itemType === 'radio'\">\r\n    <div :style=\"{ width: configs.width ? configs.width : '220px' }\">\r\n      <el-radio\r\n        v-if=\"valueValidate(options.value1)\"\r\n        v-model=\"model\"\r\n        :label=\"\r\n          typeof model === 'number' ? parseInt(options.value1) : options.value1\r\n        \"\r\n        v-bind=\"$attrs\"\r\n      >\r\n        {{ options.label1 }}\r\n      </el-radio>\r\n      <el-radio\r\n        v-if=\"valueValidate(options.value2)\"\r\n        v-model=\"model\"\r\n        :label=\"\r\n          typeof model === 'number' ? parseInt(options.value2) : options.value2\r\n        \"\r\n        v-bind=\"$attrs\"\r\n      >\r\n        {{ options.label2 }}\r\n      </el-radio>\r\n    </div>\r\n  </template>\r\n\r\n  <div\r\n    v-else-if=\"configs.itemType === 'checkbox'\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n  >\r\n    <el-checkbox-group v-model=\"model\" v-bind=\"$attrs\">\r\n      <el-checkbox\r\n        v-for=\"item in dataList\"\r\n        :label=\"getValueByDataType(item, options)\"\r\n      >\r\n        {{ item[options.labelField || 'label'] }}\r\n      </el-checkbox>\r\n    </el-checkbox-group>\r\n  </div>\r\n\r\n  <!-- 日期时间选择器 -->\r\n  <el-date-picker\r\n    v-else-if=\"configs.itemType === 'datePicker'\"\r\n    v-model=\"model\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    size=\"default\"\r\n    class=\"date-time-picker\"\r\n    :type=\"options.type\"\r\n    format=\"YYYY-MM-DD\"\r\n    value-format=\"YYYY-MM-DD\"\r\n    range-separator=\"至\"\r\n    :start-placeholder=\"'开始时间'\"\r\n    :end-placeholder=\"'结束时间'\"\r\n    :shortcuts=\"shortcuts\"\r\n    v-bind=\"$attrs\"\r\n  ></el-date-picker>\r\n\r\n  <template\r\n    v-else-if=\"configs.itemType === 'switch' || configs.dataType === 'Boolean'\"\r\n  >\r\n    <el-switch\r\n      v-model=\"model\"\r\n      :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n      active-color=\"#13ce66\"\r\n      inactive-color=\"#ff4949\"\r\n      :disabled=\"\r\n      options.disabled === 'true' || options.disabled === true ? true : false\r\n    \"\r\n    />\r\n  </template>\r\n\r\n  <!-- input 标签 ,默认-->\r\n  <el-input\r\n    v-else\r\n    size=\"default\"\r\n    :style=\"{ width: configs.width ? configs.width : '220px' }\"\r\n    :prefix-icon=\"options.icon\"\r\n    :placeholder=\"options.placeholder || '请输入' + configs.displayName\"\r\n    v-model=\"model\"\r\n    clearable\r\n    autosize\r\n    :rows=\"4\"\r\n    :type=\"options.type || 'text'\"\r\n    :disabled=\"\r\n      options.disabled === 'true' || options.disabled === true ? true : false\r\n    \"\r\n    v-bind=\"$attrs\"\r\n  ></el-input>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue';\r\n// import CustomSelect from './CustomSelect.vue'\r\nexport default defineComponent({\r\n  name: 'FormControl',\r\n  // components: { CustomSelect },\r\n  props: {\r\n    // modelValue: [String, Number, Object, Boolean, Array],\r\n    modelValue: [Object],\r\n    // 字段配置\r\n    configs: {\r\n      type: Object,\r\n      default: {},\r\n    },\r\n  },\r\n  emits: ['update:modelValue'],\r\n  data() {\r\n    return {\r\n      model: undefined as any,\r\n      shortcuts: [\r\n        {\r\n          text: '昨天',\r\n          value() {\r\n            const end = new Date();\r\n            const start = new Date();\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 1);\r\n            end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);\r\n            return [start, end];\r\n          },\r\n        },\r\n        {\r\n          text: '今天',\r\n          value() {\r\n            const end = new Date();\r\n            const start = new Date();\r\n            return [start, end];\r\n          },\r\n        },\r\n        {\r\n          text: '最近一周',\r\n          value() {\r\n            const end = new Date();\r\n            const start = new Date();\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);\r\n            return [start, end];\r\n          },\r\n        },\r\n        {\r\n          text: '最近一个月',\r\n          value() {\r\n            const end = new Date();\r\n            const start = new Date();\r\n            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);\r\n            return [start, end];\r\n          },\r\n        },\r\n      ],\r\n      // 选项列表\r\n      dataList: [] as any,\r\n    };\r\n  },\r\n  computed: {\r\n    // ui组件的配置\r\n    options(): any {\r\n      let vm = this;\r\n      let obj = {} as any;\r\n      let configs = vm.configs;\r\n\r\n      if (!configs.options) {\r\n        return obj;\r\n      }\r\n\r\n      // 如果options本身就是对象,直接返回\r\n      if (typeof configs.options === 'object') {\r\n        return configs.options;\r\n      }\r\n\r\n      let searchParams = new URLSearchParams(configs.options) as any;\r\n      for (const item of searchParams) {\r\n        let val = item[1] as any;\r\n        // if (val.startsWith('{') || val.startsWith('[]')) {\r\n        //   val = JSON.parse(val)\r\n        // }\r\n\r\n        // 不转类型。直接判断字符串的值,可以优化为。无值的时候赋值false\r\n        // if (val === 'true') {\r\n        //   val = true\r\n        // } else if (val === 'false') {\r\n        //   val = false\r\n        // }\r\n        obj[item[0]] = val;\r\n      }\r\n      // console.log('options', obj)\r\n      return obj;\r\n    },\r\n    name() {\r\n      return this.configs.name;\r\n    },\r\n    selectOptions() {\r\n      return this.dataList.map(\r\n        (x: any) =>\r\n          new Object({\r\n            label: x[this.options.labelField || 'label'],\r\n            // 如果是多选,由于数组转逗号隔开的字符串,再转成数组,值就变成字符串,因此统一处理为字符串\r\n            value:\r\n              this.options.multiple === 'true' || this.options.multiple === true\r\n                ? this.getValueByDataType(x, this.options) + ''\r\n                : this.getValueByDataType(x, this.options),\r\n          }),\r\n      );\r\n    },\r\n  },\r\n  watch: {\r\n    model(val, oldVal) {\r\n      let name = this.name;\r\n      let configs = this.configs;\r\n      let options = this.options;\r\n\r\n      // 字段名包含$,特殊处理\r\n      let temp = this.modelValue as any;\r\n      if (name.includes('$')) {\r\n        let arr = val; // temp[name]\r\n        let names = name.split('$');\r\n\r\n        if (\r\n          configs.itemType === 'datePicker' &&\r\n          configs.options &&\r\n          (configs.options.type === 'daterange' ||\r\n            (typeof configs.options === 'string' &&\r\n              configs.options.includes('type=daterange')))\r\n        ) {\r\n          // 日期范围\r\n\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr[0];\r\n            temp[names[1]] = arr[1];\r\n          } else {\r\n            temp[names[0]] = undefined;\r\n            temp[names[1]] = undefined;\r\n          }\r\n        } else if (configs.itemType === 'checkbox') {\r\n          // 多选框\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr.join();\r\n          } else {\r\n            temp[names[0]] = undefined;\r\n          }\r\n        } else if (\r\n          configs.itemType === 'select' &&\r\n          (options.multiple == 'true' || options.multiple === true)\r\n        ) {\r\n          // 多选下拉\r\n          if (this.valueValidate(arr)) {\r\n            temp[names[0]] = arr.join();\r\n          } else {\r\n            temp[names[0]] = undefined;\r\n          }\r\n        } else {\r\n          console.warn('表单名中带$,但是未配置处理器');\r\n        }\r\n      } else {\r\n        if (configs.itemType === 'select' && !this.valueValidate(val)) {\r\n          // 下拉框上点击清除时,值为空字符串,处理为undefined\r\n          val = undefined;\r\n        }\r\n\r\n        temp[name] = val;\r\n      }\r\n\r\n      // 因为是对象引用,单属性值变化,可以不触发更新\r\n      // this.$emit('update:modelValue', this.modelValue)\r\n    },\r\n    // 外部修改此值,以便传递到model\r\n    modelValue: {\r\n      handler(val: any, oldVal) {\r\n        const name = this.name;\r\n        let value = val[this.name];\r\n        const configs = this.configs;\r\n        const options = this.options;\r\n        // console.log('modelValue', val, oldVal, value)\r\n\r\n        // 字段名包含$,特殊处理\r\n        if (name.includes('$')) {\r\n          const names = name.split('$');\r\n          if (\r\n            configs.itemType === 'datePicker' &&\r\n            configs.options &&\r\n            (configs.options.type === 'daterange' ||\r\n              configs.options.toString().includes('type=daterange'))\r\n          ) {\r\n            // 日期范围从$分割的两个字段中取值\r\n            const val1 = val[names[0]];\r\n            const val2 = val[names[1]];\r\n\r\n            if (this.valueValidate(val1) && this.valueValidate(val2)) {\r\n              this.model = [val1, val2];\r\n              // ;(this.modelValue as any)[name] = undefined\r\n            } else {\r\n              // 如果分割后的两个字段不为空,就不用重置值。因为有可能传进来的值为空是上面的if设置导致\r\n              if (\r\n                !(this.modelValue as any)[names[0]] ||\r\n                !(this.modelValue as any)[names[1]]\r\n              ) {\r\n                this.model = undefined;\r\n              }\r\n            }\r\n          } else if (configs.itemType === 'checkbox') {\r\n            // 外部传进来的应是逗号隔开的值,传值的字段从name中分离出,然后在这里被序列化成数组\r\n            // value 重新取值\r\n            value = val[names[0]];\r\n            if (this.valueValidate(value)) {\r\n              const arr = value.split(',');\r\n              this.model = arr;\r\n            } else {\r\n              this.model = undefined;\r\n            }\r\n          } else if (\r\n            configs.itemType === 'select' &&\r\n            (options.multiple === 'true' || options.multiple === true)\r\n          ) {\r\n            // 外部传进来的应是逗号隔开的值,传值的字段从name中分离出,然后在这里被序列化成数组\r\n            // value 重新取值\r\n            value = val[names[0]];\r\n            if (this.valueValidate(value)) {\r\n              const arr = value.split(',');\r\n              this.model = arr;\r\n            } else {\r\n              this.model = [];\r\n            }\r\n          }\r\n        } else {\r\n          if (\r\n            configs.itemType === 'select' &&\r\n            (options.multiple === 'true' || options.multiple === true)\r\n          ) {\r\n            this.model = value || [];\r\n          } else {\r\n            this.model = value;\r\n          }\r\n        }\r\n      },\r\n      // 加了此选项,就不用再created赋值\r\n      immediate: true,\r\n      deep: true,\r\n    },\r\n    'configs.url': {\r\n      handler() {\r\n        this.getData();\r\n      },\r\n    },\r\n    // 获取远程数据的参数\r\n    'configs.data': {\r\n      handler() {\r\n        this.getData();\r\n      },\r\n      deep: true,\r\n    },\r\n    // !!! 不能监听,外部如果共用configs,那么所有用了该configs的组件都会受影响\r\n    // 'configs.dataList': {\r\n    //   handler() {\r\n    //     this.dataList = this.configs.dataList\r\n    //   },\r\n    //   deep: true\r\n    // }\r\n  },\r\n  created() {\r\n    const vm = this;\r\n\r\n    // 远程或本地数据源处理\r\n    vm.getData();\r\n  },\r\n  methods: {\r\n    // 设置请求参数,configs.data。对options.data进行处理,如果值有{{field}}形式的值,则替换成为model中的值\r\n    setData() {\r\n      if (!this.options.data) {\r\n        return;\r\n      }\r\n\r\n      let data;\r\n\r\n      // 如果options.data是对象,直接赋值,否则解析为对象\r\n      if (typeof this.options.data === 'object') {\r\n        data = this.options.data;\r\n      } else {\r\n        data = JSON.parse(this.options.data);\r\n      }\r\n\r\n      // 将options的data解析后,挂到configs上\r\n      if (!this.configs.data) {\r\n        this.configs.data = {};\r\n      }\r\n\r\n      for (const key in data) {\r\n        if (Object.prototype.hasOwnProperty.call(data, key)) {\r\n          const val = data[key];\r\n\r\n          if (\r\n            typeof val === 'string' &&\r\n            val.startsWith('{{') &&\r\n            val.endsWith('}}')\r\n          ) {\r\n            if (this.modelValue) {\r\n              this.configs.data[key] =\r\n                this.modelValue[val.substring(2, val.length - 2)];\r\n            }\r\n          } else {\r\n            this.configs.data[key] = val;\r\n          }\r\n        }\r\n      }\r\n    },\r\n    // 类似多选下拉的组件,设置默认值\r\n    setDefaultValue() {\r\n      const vm = this;\r\n      const options = vm.options;\r\n      const row = vm.modelValue as any;\r\n      if (vm.dataList) {\r\n        // 不设置该选项,直接返回\r\n        if (!options.getValueField || !options.getLabelField) {\r\n          return;\r\n        }\r\n\r\n        const val = row[options.getValueField];\r\n        // 如果值为空,说明是新增,还没有默认值\r\n        if (!val) {\r\n          return;\r\n        }\r\n\r\n        const data = {\r\n          [options.labelField]: row[options.getLabelField] || val,\r\n          [options.valueField]: val,\r\n        };\r\n\r\n        vm.dataList.push(data);\r\n      }\r\n    },\r\n    getData() {\r\n      const vm = this;\r\n      const url = vm.configs.url;\r\n      if (!url) {\r\n        return;\r\n      }\r\n\r\n      // 远程下拉框,直接返回\r\n      if (vm.options.remote === 'true' || vm.options.remote === true) {\r\n        // 设置默认选项\r\n        this.setDefaultValue();\r\n        return;\r\n      }\r\n\r\n      // 如果本身就是数组\r\n      if (typeof url === 'object' && url.length > 0) {\r\n        vm.dataList = url;\r\n        return;\r\n      }\r\n\r\n      // 如果是[开头,说明数据是数组\r\n      if (typeof url !== 'string') {\r\n        console.warn('配置中url不正确,不进行处理', url);\r\n        return;\r\n      }\r\n\r\n      if (url.startsWith('[')) {\r\n        // 直接解析url中数据\r\n        vm.getLocalData();\r\n      } else if (url.startsWith('/') || url.startsWith('http')) {\r\n        // 请求url获取数据\r\n        vm.getRemoteData();\r\n      } else {\r\n        console.warn('配置中url不正确,不进行处理', url);\r\n      }\r\n    },\r\n    // 获取远程数据\r\n    getRemoteData(query = '') {\r\n      const vm = this;\r\n      const url = vm.configs.url;\r\n      const method = vm.options.method || 'post';\r\n      const keyField = vm.options.keyField || 'txtKeywords';\r\n\r\n      let data = {\r\n        [keyField]: query,\r\n      };\r\n\r\n      // 设置data,处理插值\r\n      this.setData();\r\n\r\n      if (vm.configs.data) {\r\n        data = { ...data, ...vm.configs.data };\r\n      }\r\n\r\n      const config = {\r\n        url,\r\n        method,\r\n        data: undefined as any,\r\n        params: undefined as any,\r\n      };\r\n\r\n      if (method === 'post') {\r\n        config.data = data;\r\n      } else if (method === 'get') {\r\n        config.params = data;\r\n      }\r\n\r\n      vm.$http(config).then((resp) => {\r\n        const array = resp.data;\r\n        const list = array.rows || array.list || array;\r\n        vm.dataList =\r\n          typeof vm.options.afterGetDataList === 'function'\r\n            ? vm.options.afterGetDataList(list)\r\n            : list;\r\n      });\r\n    },\r\n    // 解析url中的数据\r\n    getLocalData() {\r\n      const vm = this;\r\n      const data = JSON.parse(vm.configs.url);\r\n      vm.dataList = data;\r\n    },\r\n    getValueByDataType(data: any, option: any) {\r\n      let val = data[option.valueField || 'value'];\r\n      if (option.dataType === 'Int32' || option.dataType === 'int') {\r\n        val = parseInt(val);\r\n      }\r\n      return val;\r\n    },\r\n    /**\r\n     * 有效值验证,不为undefined、空字符串、null\r\n     */\r\n    valueValidate(value: any) {\r\n      return value !== '' && value !== undefined && value !== null;\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style></style>\r\n","<template>\r\n  <el-row type=\"flex\" justify=\"end\" class=\"search\">\r\n    <el-col :span=\"24\" class=\"letf-search\">\r\n      <el-form\r\n        ref=\"form\"\r\n        v-model=\"model\"\r\n        label-position=\"right\"\r\n        :inline=\"true\"\r\n        class=\"search-form-container\"\r\n      >\r\n        <template v-for=\"item in columns\">\r\n          <el-form-item\r\n            :label=\"item.displayName\"\r\n            :key=\"item.name\"\r\n            v-if=\"item.showInSearch && (!item.if || item.if(model))\"\r\n            v-show=\"!item.hidden\"\r\n          >\r\n            <!-- <template v-if=\"!item.if || item.if(model)\"> -->\r\n            <slot :name=\"'search-' + item.name\" :model=\"model\" :config=\"item\">\r\n              <FormControl v-model=\"model\" :configs=\"item\"></FormControl>\r\n            </slot>\r\n            <!-- </template> -->\r\n          </el-form-item>\r\n        </template>\r\n        <el-button size=\"default\" type=\"primary\" @click=\"search\">\r\n          查询\r\n        </el-button>\r\n        <el-button size=\"default\" type=\"default\" @click=\"resetSearch\">\r\n          重置\r\n        </el-button>\r\n      </el-form>\r\n    </el-col>\r\n  </el-row>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType, ref } from 'vue';\r\n// import singleSelect from '../../components/singleSelect'\r\n// import multipleSelect from '../../components/multipleSelect'\r\nimport FormControl from './FormControl.vue';\r\n\r\nexport default defineComponent({\r\n  name: 'TableSearch',\r\n  components: {\r\n    FormControl,\r\n  },\r\n  props: {\r\n    columns: {\r\n      type: Array as PropType<any[]>,\r\n      default: () => [] as any[],\r\n    },\r\n    modelValue: {\r\n      type: Object,\r\n      default: () => {},\r\n    },\r\n    searchMethod: {\r\n      type: Function,\r\n      default: undefined,\r\n    },\r\n    resetSearchMethod: {\r\n      type: Function,\r\n      default: undefined,\r\n    },\r\n  },\r\n  emits: ['getDataList', 'resetSearch', 'update:modelValue'],\r\n  data() {\r\n    return {\r\n      model: {} as any,\r\n    };\r\n  },\r\n  watch: {\r\n    model: {\r\n      handler(val) {\r\n        this.$emit('update:modelValue', val);\r\n      },\r\n      deep: true,\r\n    },\r\n    modelValue(val) {\r\n      this.model = val;\r\n    },\r\n  },\r\n  created() {\r\n    this.model = this.modelValue; // JSON.parse(JSON.stringify(this.modelValue))\r\n\r\n    const columns = this.columns;\r\n    for (const key in columns) {\r\n      if (Object.prototype.hasOwnProperty.call(columns, key)) {\r\n        const item = columns[key];\r\n        // console.log(item)\r\n\r\n        if (\r\n          item.name.includes('$') &&\r\n          item.itemType === 'datePicker' &&\r\n          item.options &&\r\n          (item.options.type === 'daterange' ||\r\n            (typeof item.options === 'string' &&\r\n              item.options.includes('type=daterange'))) &&\r\n          (item.options.setDefaultValue ||\r\n            (typeof item.options === 'string' &&\r\n              !item.options.includes('setDefaultValue=false')))\r\n        ) {\r\n          const name = item.name;\r\n          const names = name.split('$');\r\n\r\n          // 如果是日期范围选择器,默认值设为最近一个月\r\n          const end = new Date();\r\n          const start = new Date();\r\n          start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);\r\n          // 此格式化可能不同浏览器表现不同,返回的可能不是YYYY-MM-DD格式\r\n          this.model[names[0]] = start.toLocaleDateString('fr-CA');\r\n          this.model[names[1]] = end.toLocaleDateString('fr-CA');\r\n\r\n          // console.log('daterange', this.model[item.name])\r\n        }\r\n\r\n        // 默认值设置\r\n        if (typeof item.value !== 'undefined') {\r\n          this.model[item.name] = item.value;\r\n        }\r\n      }\r\n    }\r\n  },\r\n  methods: {\r\n    search() {\r\n      const vm = this;\r\n      if (vm.searchMethod) {\r\n        vm.searchMethod();\r\n      } else {\r\n        this.$emit('getDataList');\r\n      }\r\n    },\r\n    resetSearch() {\r\n      const vm = this;\r\n      if (vm.resetSearchMethod) {\r\n        vm.resetSearchMethod();\r\n      } else {\r\n        this.$emit('resetSearch');\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.search {\r\n  /* height: 60px; */\r\n  /* overflow: hidden; */\r\n  /* position: relative; */\r\n  display: -moz-flex;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  // border-bottom: 1px solid #eeeeee;\r\n  border-bottom: 1px solid #eeeeee;\r\n  min-height: 50px;\r\n  padding-bottom: 8px;\r\n  // margin-bottom: 10px;\r\n}\r\n\r\n.search .left-search {\r\n  line-height: 58px;\r\n  /* height: 60px; */\r\n  /* float: left; */\r\n  padding: 0 10px;\r\n}\r\n.search .letf-search {\r\n  line-height: 40px;\r\n  /* height: 65px; */\r\n  /* float: right; */\r\n  /* max-height: 110px; */\r\n  padding: 0 10px;\r\n  /* overflow-y: auto; */\r\n  display: flex;\r\n  justify-content: flex-start;\r\n}\r\n.search .el-button + .el-button {\r\n  margin-left: 0px;\r\n}\r\n\r\n/* 搜索框元素间距 */\r\n:deep(.el-input) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-button) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-date-editor) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-date-editor) {\r\n  width: 250px;\r\n}\r\n\r\n:deep(.el-form-item) {\r\n  margin-bottom: 0;\r\n}\r\n</style>\r\n","<template>\r\n  <el-row type=\"flex\" justify=\"end\" class=\"search\">\r\n    <el-col :span=\"24\" class=\"letf-search\">\r\n      <el-form\r\n        ref=\"form\"\r\n        v-model=\"model\"\r\n        label-position=\"right\"\r\n        :inline=\"true\"\r\n        class=\"search-form-container\"\r\n      >\r\n        <template v-for=\"item in columns\">\r\n          <el-form-item\r\n            :label=\"item.displayName\"\r\n            :key=\"item.name\"\r\n            v-if=\"item.showInSearch && (!item.if || item.if(model))\"\r\n            v-show=\"!item.hidden\"\r\n          >\r\n            <!-- <template v-if=\"!item.if || item.if(model)\"> -->\r\n            <slot :name=\"'search-' + item.name\" :model=\"model\" :config=\"item\">\r\n              <FormControl v-model=\"model\" :configs=\"item\"></FormControl>\r\n            </slot>\r\n            <!-- </template> -->\r\n          </el-form-item>\r\n        </template>\r\n        <el-button size=\"default\" type=\"primary\" @click=\"search\">\r\n          查询\r\n        </el-button>\r\n        <el-button size=\"default\" type=\"default\" @click=\"resetSearch\">\r\n          重置\r\n        </el-button>\r\n      </el-form>\r\n    </el-col>\r\n  </el-row>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType, ref } from 'vue';\r\n// import singleSelect from '../../components/singleSelect'\r\n// import multipleSelect from '../../components/multipleSelect'\r\nimport FormControl from './FormControl.vue';\r\n\r\nexport default defineComponent({\r\n  name: 'TableSearch',\r\n  components: {\r\n    FormControl,\r\n  },\r\n  props: {\r\n    columns: {\r\n      type: Array as PropType<any[]>,\r\n      default: () => [] as any[],\r\n    },\r\n    modelValue: {\r\n      type: Object,\r\n      default: () => {},\r\n    },\r\n    searchMethod: {\r\n      type: Function,\r\n      default: undefined,\r\n    },\r\n    resetSearchMethod: {\r\n      type: Function,\r\n      default: undefined,\r\n    },\r\n  },\r\n  emits: ['getDataList', 'resetSearch', 'update:modelValue'],\r\n  data() {\r\n    return {\r\n      model: {} as any,\r\n    };\r\n  },\r\n  watch: {\r\n    model: {\r\n      handler(val) {\r\n        this.$emit('update:modelValue', val);\r\n      },\r\n      deep: true,\r\n    },\r\n    modelValue(val) {\r\n      this.model = val;\r\n    },\r\n  },\r\n  created() {\r\n    this.model = this.modelValue; // JSON.parse(JSON.stringify(this.modelValue))\r\n\r\n    const columns = this.columns;\r\n    for (const key in columns) {\r\n      if (Object.prototype.hasOwnProperty.call(columns, key)) {\r\n        const item = columns[key];\r\n        // console.log(item)\r\n\r\n        if (\r\n          item.name.includes('$') &&\r\n          item.itemType === 'datePicker' &&\r\n          item.options &&\r\n          (item.options.type === 'daterange' ||\r\n            (typeof item.options === 'string' &&\r\n              item.options.includes('type=daterange'))) &&\r\n          (item.options.setDefaultValue ||\r\n            (typeof item.options === 'string' &&\r\n              !item.options.includes('setDefaultValue=false')))\r\n        ) {\r\n          const name = item.name;\r\n          const names = name.split('$');\r\n\r\n          // 如果是日期范围选择器,默认值设为最近一个月\r\n          const end = new Date();\r\n          const start = new Date();\r\n          start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);\r\n          // 此格式化可能不同浏览器表现不同,返回的可能不是YYYY-MM-DD格式\r\n          this.model[names[0]] = start.toLocaleDateString('fr-CA');\r\n          this.model[names[1]] = end.toLocaleDateString('fr-CA');\r\n\r\n          // console.log('daterange', this.model[item.name])\r\n        }\r\n\r\n        // 默认值设置\r\n        if (typeof item.value !== 'undefined') {\r\n          this.model[item.name] = item.value;\r\n        }\r\n      }\r\n    }\r\n  },\r\n  methods: {\r\n    search() {\r\n      const vm = this;\r\n      if (vm.searchMethod) {\r\n        vm.searchMethod();\r\n      } else {\r\n        this.$emit('getDataList');\r\n      }\r\n    },\r\n    resetSearch() {\r\n      const vm = this;\r\n      if (vm.resetSearchMethod) {\r\n        vm.resetSearchMethod();\r\n      } else {\r\n        this.$emit('resetSearch');\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.search {\r\n  /* height: 60px; */\r\n  /* overflow: hidden; */\r\n  /* position: relative; */\r\n  display: -moz-flex;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  // border-bottom: 1px solid #eeeeee;\r\n  border-bottom: 1px solid #eeeeee;\r\n  min-height: 50px;\r\n  padding-bottom: 8px;\r\n  // margin-bottom: 10px;\r\n}\r\n\r\n.search .left-search {\r\n  line-height: 58px;\r\n  /* height: 60px; */\r\n  /* float: left; */\r\n  padding: 0 10px;\r\n}\r\n.search .letf-search {\r\n  line-height: 40px;\r\n  /* height: 65px; */\r\n  /* float: right; */\r\n  /* max-height: 110px; */\r\n  padding: 0 10px;\r\n  /* overflow-y: auto; */\r\n  display: flex;\r\n  justify-content: flex-start;\r\n}\r\n.search .el-button + .el-button {\r\n  margin-left: 0px;\r\n}\r\n\r\n/* 搜索框元素间距 */\r\n:deep(.el-input) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-button) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-date-editor) {\r\n  margin-right: 10px;\r\n}\r\n\r\n:deep(.el-date-editor) {\r\n  width: 250px;\r\n}\r\n\r\n:deep(.el-form-item) {\r\n  margin-bottom: 0;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"table-pagination\">\r\n    <el-pagination\r\n      style=\"height: 46px\"\r\n      background\r\n      v-model:current-page=\"modelValue.pageIndex\"\r\n      v-model:page-size=\"modelValue.pageSize\"\r\n      layout=\"total, prev, pager, next, sizes, jumper\"\r\n      :total=\"modelValue.total\"\r\n      v-bind=\"$attrs\"\r\n    ></el-pagination>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'TablePagination',\r\n  props: ['modelValue'],\r\n  emits: ['update:modelValue', 'pagerChange'],\r\n  watch: {\r\n    'modelValue.pageSize': {\r\n      handler(val, oldVal) {\r\n        if (val == oldVal) {\r\n          return\r\n        }\r\n\r\n        this.$emit('update:modelValue', this.modelValue)\r\n        this.$emit('pagerChange', this.modelValue)\r\n      },\r\n      deep: true\r\n    },\r\n    'modelValue.pageIndex': {\r\n      handler(val, oldVal) {\r\n        if (val == oldVal) {\r\n          return\r\n        }\r\n\r\n        this.$emit('update:modelValue', this.modelValue)\r\n        this.$emit('pagerChange', this.modelValue)\r\n      },\r\n      deep: true\r\n    }\r\n  }\r\n  // methods: {\r\n  //   pagerChange() {\r\n  //     this.$emit('pagerChange', this.modelValue)\r\n  //   }\r\n  // }\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.table-pagination {\r\n  display: flex;\r\n  justify-content: flex-end;\r\n  align-items: center;\r\n  // margin-top: 15px;\r\n  // margin-bottom: 10px;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"table-pagination\">\r\n    <el-pagination\r\n      style=\"height: 46px\"\r\n      background\r\n      v-model:current-page=\"modelValue.pageIndex\"\r\n      v-model:page-size=\"modelValue.pageSize\"\r\n      layout=\"total, prev, pager, next, sizes, jumper\"\r\n      :total=\"modelValue.total\"\r\n      v-bind=\"$attrs\"\r\n    ></el-pagination>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'TablePagination',\r\n  props: ['modelValue'],\r\n  emits: ['update:modelValue', 'pagerChange'],\r\n  watch: {\r\n    'modelValue.pageSize': {\r\n      handler(val, oldVal) {\r\n        if (val == oldVal) {\r\n          return\r\n        }\r\n\r\n        this.$emit('update:modelValue', this.modelValue)\r\n        this.$emit('pagerChange', this.modelValue)\r\n      },\r\n      deep: true\r\n    },\r\n    'modelValue.pageIndex': {\r\n      handler(val, oldVal) {\r\n        if (val == oldVal) {\r\n          return\r\n        }\r\n\r\n        this.$emit('update:modelValue', this.modelValue)\r\n        this.$emit('pagerChange', this.modelValue)\r\n      },\r\n      deep: true\r\n    }\r\n  }\r\n  // methods: {\r\n  //   pagerChange() {\r\n  //     this.$emit('pagerChange', this.modelValue)\r\n  //   }\r\n  // }\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.table-pagination {\r\n  display: flex;\r\n  justify-content: flex-end;\r\n  align-items: center;\r\n  // margin-top: 15px;\r\n  // margin-bottom: 10px;\r\n}\r\n</style>\r\n","<script lang=\"tsx\">\r\nimport { defineComponent, PropType, h } from 'vue';\r\nimport { TableSearch, TableHandler, NormalTable, TablePagination } from './';\r\nexport default defineComponent({\r\n  name: 'AdvancedTable',\r\n  props: {\r\n    // 搜索条件列表\r\n    searchList: {\r\n      type: Array as PropType<any[]>,\r\n      default: [],\r\n    },\r\n    // 操作列表\r\n    tableHandlerList: {\r\n      type: Array as PropType<any[]>,\r\n      default: [],\r\n    },\r\n    // 表格数据\r\n    tableDataList: {\r\n      type: Array as PropType<any[]>,\r\n      default: null,\r\n    },\r\n    // 表格列配置\r\n    columns: {\r\n      type: Array as PropType<any[]>,\r\n      default: [],\r\n    },\r\n    // 表格数据请求地址,如果设置了tableData,url参数将不会生效\r\n    url: {\r\n      type: String as PropType<string>,\r\n      require: true,\r\n      default: '',\r\n    },\r\n    // 显示搜索条件区\r\n    showSearch: {\r\n      type: Boolean as PropType<boolean>,\r\n      default: true,\r\n    },\r\n    // 显示操作区\r\n    showHandler: {\r\n      type: Boolean as PropType<boolean>,\r\n      default: true,\r\n    },\r\n    // 显示分页\r\n    showPagination: {\r\n      type: Boolean as PropType<boolean>,\r\n      default: true,\r\n    },\r\n    // 请求数据前的过滤方法\r\n    beforeGetDataList: {\r\n      type: Function,\r\n      require: false,\r\n    },\r\n    // 请求数据后的过滤方法\r\n    afterGetDataList: {\r\n      type: Function,\r\n      require: false,\r\n    },\r\n    // 当此组件的父级不是整个页面而是某个组件,需要设置父级,以便操作方法能被找到\r\n    tableParent: {\r\n      type: Object,\r\n      require: false,\r\n    },\r\n  },\r\n  data() {\r\n    return {\r\n      // 组件激活状态,默认true。失活时置为false,被激活时判断该值,\r\n      // 如果为false则更新列表数据,避免第一次创建组件时激活重复获取数据\r\n      activated: true,\r\n      loadingTable: false,\r\n      showTable: true,\r\n      // 批量选中的数据\r\n      selectList: [],\r\n      // 表格数据\r\n      tableData: [] as any[],\r\n      // 分页参数\r\n      pager: {\r\n        pageSize: 10,\r\n        pageIndex: 1,\r\n        total: 0,\r\n        totalCount: 0,\r\n        desc: true,\r\n        sort: undefined,\r\n      },\r\n      // 搜索参数\r\n      searchParams: {},\r\n      // 搜索框高度\r\n      tableSearchHeight: 50,\r\n    };\r\n  },\r\n  computed: {\r\n    // 非表格的其它组件高度\r\n    nonTableHeight() {\r\n      const vm = this as any;\r\n      return (\r\n        vm.tableSearchHeight +\r\n        (vm.showHandler ? 50 : 0) +\r\n        (vm.showPagination ? 50 : 0)\r\n      );\r\n    },\r\n    // 表格高度\r\n    normalTableHeight() {\r\n      const vm = this as any;\r\n      return `calc(100% - ${vm.nonTableHeight + 3}px)`;\r\n    },\r\n  },\r\n  watch: {\r\n    tableDataList(val) {\r\n      this.tableData = this.tableDataList;\r\n    },\r\n  },\r\n  mounted() {\r\n    this.getDataList();\r\n\r\n    // 手动触发一次\r\n    this.resize();\r\n    window.addEventListener('resize', this.resize);\r\n  },\r\n  beforeDestroy() {\r\n    window.removeEventListener('resize', this.resize);\r\n  },\r\n  activated() {\r\n    if (!this.activated) {\r\n      this.activated = true;\r\n      this.getDataList();\r\n    }\r\n  },\r\n  deactivated() {\r\n    this.activated = false;\r\n  },\r\n  methods: {\r\n    // 获取表格数据\r\n    getDataList() {\r\n      if (this.tableDataList) {\r\n        this.tableData = this.tableDataList;\r\n        return;\r\n      }\r\n\r\n      const searchParams = this.searchParams as any;\r\n      const data = {\r\n        // limit: this.pager.pageSize,\r\n        // offset: this.pager.pageIndex - 1,\r\n        // currentPage: this.pager.pageIndex,\r\n        keyWord: searchParams.txtKeywords,\r\n        ...this.pager,\r\n        ...searchParams,\r\n      };\r\n\r\n      if (this.beforeGetDataList) {\r\n        this.beforeGetDataList(data);\r\n      }\r\n\r\n      this.loadingTable = true;\r\n      this.$http.post(this.url, data).then((res) => {\r\n        this.tableData = res.data.list || res.data.rows || res.data;\r\n\r\n        if (res.data.pagerModel) {\r\n          this.pager.total = res.data.pagerModel.total;\r\n        } else if ((res as any).pager) {\r\n          this.pager.total = parseInt((res as any).pager.totalCount || 0);\r\n        } else {\r\n          this.pager.total = res.data.total || 0;\r\n        }\r\n\r\n        if (this.afterGetDataList) {\r\n          this.afterGetDataList(res.data);\r\n        }\r\n        this.loadingTable = false;\r\n      });\r\n    },\r\n    resetSearch() {\r\n      this.pager = {\r\n        pageSize: 10,\r\n        pageIndex: 1,\r\n        total: 0,\r\n        totalCount: 0,\r\n        desc: true,\r\n        sort: undefined,\r\n      };\r\n      this.searchParams = {};\r\n      this.getDataList();\r\n    },\r\n    // 子组件调用此方法,再通过参数action调用本组件方法\r\n    handler(option: any, data: any, callback: any) {\r\n      const vm = this as any;\r\n      const handler = option.handler;\r\n      let func;\r\n\r\n      // 优先查找指定父级组件方法,高级表格组件独有\r\n      if (this.tableParent) {\r\n        func = (this.tableParent as any)[handler];\r\n      }\r\n\r\n      // 再查找当前组件父级组件方法,高级表格组件独有\r\n      if (!func && this.$parent) {\r\n        func = (this.$parent as any)[handler];\r\n      }\r\n\r\n      if (!func) {\r\n        func = vm[handler];\r\n      }\r\n\r\n      if (!func || typeof func !== 'function') {\r\n        const msg = `未实现的方法:${handler},或请设置属性=>:table-parent=\"this\"`;\r\n        console.error(msg);\r\n        vm.$message.error(msg);\r\n      } else {\r\n        const returnData = (func as Function).call(vm, data);\r\n        if (typeof callback === 'function') {\r\n          callback(returnData);\r\n        }\r\n      }\r\n    },\r\n    // 设置选中的行数\r\n    setSelectList(list: any) {\r\n      this.selectList = list;\r\n    },\r\n    // 设置显示的表头\r\n    setColumns(list: any) {\r\n      //   this.showTable = false\r\n      //   this.$nextTick(() => {\r\n      //     this.showTable = true\r\n      //   })\r\n    },\r\n    resize() {\r\n      const vm = this as any;\r\n\r\n      vm.$nextTick(() => {\r\n        const tableSearch = vm.$refs.tableSearch;\r\n\r\n        if (tableSearch) {\r\n          // 由于搜索条件个数不确定,可能会换行,因此需要根据实际高度再调整表格高度\r\n          vm.tableSearchHeight = tableSearch.$el.offsetHeight;\r\n          // setTimeout(() => {\r\n          //   tableSearch.doLayout()\r\n          // }, 1000)\r\n        } else {\r\n          vm.tableSearchHeight = 0;\r\n        }\r\n      });\r\n    },\r\n    handlerSortChange({ col, prop, order }: any) {\r\n      console.log(col, prop, order);\r\n\r\n      if (order === 'ascending') {\r\n        this.pager.desc = false;\r\n        this.pager.sort = prop;\r\n      } else if (order === 'descending') {\r\n        this.pager.desc = true;\r\n        this.pager.sort = prop;\r\n      } else {\r\n        this.pager.desc = true;\r\n        this.pager.sort = undefined;\r\n      }\r\n      this.getDataList();\r\n    },\r\n  },\r\n  render(ctx: any) {\r\n    return (\r\n      <div style={{ height: '100%' }}>\r\n        {ctx.showSearch ? (\r\n          <TableSearch\r\n            ref=\"tableSearch\"\r\n            v-model={ctx.searchParams}\r\n            columns={ctx.searchList}\r\n            onGetDataList={ctx.getDataList}\r\n            onResetSearch={ctx.resetSearch}\r\n            v-slots={ctx.$slots}\r\n          />\r\n        ) : (\r\n          ''\r\n        )}\r\n        {ctx.showHandler ? (\r\n          <TableHandler\r\n            ref=\"tableHandler\"\r\n            columns={ctx.columns}\r\n            tableHandlerList={ctx.tableHandlerList}\r\n            searchParams={ctx.searchParams}\r\n            onHandlerClick={ctx.handler}\r\n            v-slots={ctx.$slots}\r\n          />\r\n        ) : (\r\n          ''\r\n        )}\r\n        {ctx.showTable ? (\r\n          <NormalTable\r\n            ref=\"normalTable\"\r\n            v-loading={ctx.loadingTable}\r\n            columns={ctx.columns}\r\n            tableData={ctx.tableData}\r\n            normalHeight={ctx.normalTableHeight}\r\n            onSelectionChange={ctx.setSelectList}\r\n            onHandlerClick={ctx.handler}\r\n            onSortChange={ctx.handlerSortChange}\r\n            {...ctx.$attrs}\r\n            v-slots={ctx.$slots}\r\n          ></NormalTable>\r\n        ) : (\r\n          ''\r\n        )}\r\n        {ctx.showPagination ? (\r\n          <TablePagination\r\n            ref=\"tablePagination\"\r\n            onPagerChange={ctx.getDataList}\r\n            v-model={ctx.pager}\r\n          />\r\n        ) : (\r\n          ''\r\n        )}\r\n      </div>\r\n    );\r\n  },\r\n});\r\n</script>\r\n","<template>\r\n  <el-select\r\n    v-model=\"data\"\r\n    :multiple=\"true\"\r\n    filterable\r\n    clearable\r\n    @focus=\"getData\"\r\n  >\r\n    <el-option\r\n      v-for=\"item in options\"\r\n      :key=\"item.value\"\r\n      :label=\"item.key\"\r\n      :value=\"item.value\"\r\n    ></el-option>\r\n  </el-select>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'multipleSelect',\r\n  props: {\r\n    url: {\r\n      type: String,\r\n      required: true\r\n    },\r\n    value: {\r\n      required: true\r\n    }\r\n  },\r\n  computed: {\r\n    kv() {\r\n      var search = this.url.substring(this.url.lastIndexOf('?') + 1)\r\n      var obj = {} as any\r\n      var reg = /([^?&=]+)=([^?&=]*)/g\r\n      search.replace(reg, function(rs, $1, $2) {\r\n        var name = decodeURIComponent($1)\r\n        var val = decodeURIComponent($2)\r\n        val = String(val)\r\n        obj[name] = val\r\n        return rs\r\n      })\r\n      return obj\r\n    }\r\n  },\r\n  data() {\r\n    return {\r\n      options: [] as any[],\r\n      data: ''\r\n    }\r\n  },\r\n  watch: {\r\n    data(val, oldVal) {\r\n      this.$emit('input', val.join())\r\n    }\r\n  },\r\n  methods: {\r\n    getData() {\r\n      let vm = this\r\n\r\n      if (vm.options.length > 0) return\r\n      vm.$http({\r\n        url: vm.url,\r\n        method: 'post'\r\n      }).then((resp) => {\r\n        let array = resp.data\r\n        for (let i = 0; i < array.length; i++) {\r\n          const e = array[i]\r\n          vm.options[i] = { key: e[vm.kv.key], value: e[vm.kv.value] + '' }\r\n        }\r\n        vm.$forceUpdate()\r\n      })\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style></style>\r\n","<template>\r\n  <el-select\r\n    v-model=\"data\"\r\n    :multiple=\"true\"\r\n    filterable\r\n    clearable\r\n    @focus=\"getData\"\r\n  >\r\n    <el-option\r\n      v-for=\"item in options\"\r\n      :key=\"item.value\"\r\n      :label=\"item.key\"\r\n      :value=\"item.value\"\r\n    ></el-option>\r\n  </el-select>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'multipleSelect',\r\n  props: {\r\n    url: {\r\n      type: String,\r\n      required: true\r\n    },\r\n    value: {\r\n      required: true\r\n    }\r\n  },\r\n  computed: {\r\n    kv() {\r\n      var search = this.url.substring(this.url.lastIndexOf('?') + 1)\r\n      var obj = {} as any\r\n      var reg = /([^?&=]+)=([^?&=]*)/g\r\n      search.replace(reg, function(rs, $1, $2) {\r\n        var name = decodeURIComponent($1)\r\n        var val = decodeURIComponent($2)\r\n        val = String(val)\r\n        obj[name] = val\r\n        return rs\r\n      })\r\n      return obj\r\n    }\r\n  },\r\n  data() {\r\n    return {\r\n      options: [] as any[],\r\n      data: ''\r\n    }\r\n  },\r\n  watch: {\r\n    data(val, oldVal) {\r\n      this.$emit('input', val.join())\r\n    }\r\n  },\r\n  methods: {\r\n    getData() {\r\n      let vm = this\r\n\r\n      if (vm.options.length > 0) return\r\n      vm.$http({\r\n        url: vm.url,\r\n        method: 'post'\r\n      }).then((resp) => {\r\n        let array = resp.data\r\n        for (let i = 0; i < array.length; i++) {\r\n          const e = array[i]\r\n          vm.options[i] = { key: e[vm.kv.key], value: e[vm.kv.value] + '' }\r\n        }\r\n        vm.$forceUpdate()\r\n      })\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style></style>\r\n","<template>\r\n  <el-select v-model=\"data\" filterable clearable @focus=\"getData\">\r\n    <el-option\r\n      v-for=\"item in options\"\r\n      :key=\"item.value\"\r\n      :label=\"item.key\"\r\n      :value=\"item.value\"\r\n    ></el-option>\r\n  </el-select>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'singleSelect',\r\n  props: {\r\n    url: {\r\n      type: String,\r\n      required: true\r\n    },\r\n    value: {\r\n      required: true\r\n    }\r\n  },\r\n  computed: {\r\n    kv(): any {\r\n      var search = this.url.substring(this.url.lastIndexOf('?') + 1)\r\n      var obj = {} as any\r\n      var reg = /([^?&=]+)=([^?&=]*)/g\r\n      search.replace(reg, function(rs, $1, $2) {\r\n        var name = decodeURIComponent($1)\r\n        var val = decodeURIComponent($2)\r\n        val = String(val)\r\n        obj[name] = val\r\n        return rs\r\n      })\r\n      return obj\r\n    }\r\n  },\r\n  data() {\r\n    return {\r\n      options: [] as any[],\r\n      data: ''\r\n    }\r\n  },\r\n  watch: {\r\n    data(val, oldVal) {\r\n      this.$emit('input', val)\r\n    }\r\n  },\r\n  methods: {\r\n    getData() {\r\n      let vm = this\r\n\r\n      if (!vm.url) {\r\n        return\r\n      }\r\n\r\n      if (vm.options.length > 0) return\r\n      // 如果是[开头,说明数据是数组\r\n      if (vm.url.substring(0, 1) === '[') {\r\n        vm.getLocalData()\r\n      } else {\r\n        vm.getRemoteData()\r\n      }\r\n    },\r\n    getRemoteData() {\r\n      let vm = this\r\n      vm.$http({\r\n        url: vm.url,\r\n        method: 'post'\r\n      }).then((resp) => {\r\n        let array = resp.data\r\n        for (let i = 0; i < array.length; i++) {\r\n          const e = array[i]\r\n          vm.options[i] = { key: e[vm.kv.key], value: e[vm.kv.value] + '' }\r\n        }\r\n        vm.$forceUpdate()\r\n      })\r\n    },\r\n    getLocalData() {\r\n      let vm = this\r\n      let data = JSON.parse(vm.url)\r\n      vm.options = data\r\n      vm.$forceUpdate()\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style></style>\r\n","<template>\r\n  <el-select v-model=\"data\" filterable clearable @focus=\"getData\">\r\n    <el-option\r\n      v-for=\"item in options\"\r\n      :key=\"item.value\"\r\n      :label=\"item.key\"\r\n      :value=\"item.value\"\r\n    ></el-option>\r\n  </el-select>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'singleSelect',\r\n  props: {\r\n    url: {\r\n      type: String,\r\n      required: true\r\n    },\r\n    value: {\r\n      required: true\r\n    }\r\n  },\r\n  computed: {\r\n    kv(): any {\r\n      var search = this.url.substring(this.url.lastIndexOf('?') + 1)\r\n      var obj = {} as any\r\n      var reg = /([^?&=]+)=([^?&=]*)/g\r\n      search.replace(reg, function(rs, $1, $2) {\r\n        var name = decodeURIComponent($1)\r\n        var val = decodeURIComponent($2)\r\n        val = String(val)\r\n        obj[name] = val\r\n        return rs\r\n      })\r\n      return obj\r\n    }\r\n  },\r\n  data() {\r\n    return {\r\n      options: [] as any[],\r\n      data: ''\r\n    }\r\n  },\r\n  watch: {\r\n    data(val, oldVal) {\r\n      this.$emit('input', val)\r\n    }\r\n  },\r\n  methods: {\r\n    getData() {\r\n      let vm = this\r\n\r\n      if (!vm.url) {\r\n        return\r\n      }\r\n\r\n      if (vm.options.length > 0) return\r\n      // 如果是[开头,说明数据是数组\r\n      if (vm.url.substring(0, 1) === '[') {\r\n        vm.getLocalData()\r\n      } else {\r\n        vm.getRemoteData()\r\n      }\r\n    },\r\n    getRemoteData() {\r\n      let vm = this\r\n      vm.$http({\r\n        url: vm.url,\r\n        method: 'post'\r\n      }).then((resp) => {\r\n        let array = resp.data\r\n        for (let i = 0; i < array.length; i++) {\r\n          const e = array[i]\r\n          vm.options[i] = { key: e[vm.kv.key], value: e[vm.kv.value] + '' }\r\n        }\r\n        vm.$forceUpdate()\r\n      })\r\n    },\r\n    getLocalData() {\r\n      let vm = this\r\n      let data = JSON.parse(vm.url)\r\n      vm.options = data\r\n      vm.$forceUpdate()\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style></style>\r\n","<template>\r\n  <section class=\"app-main\">\r\n    <!-- <keep-alive :include=\"cachedViews\"> -->\r\n    <router-view :key=\"key\" />\r\n    <!-- </keep-alive> -->\r\n  </section>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'AppMain',\r\n  computed: {\r\n    // cachedViews() {\r\n    //   return this.$store.state.tagsView.cachedViews\r\n    // },\r\n    key() {\r\n      return this.$route.fullPath\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.app-main {\r\n  min-height: 100%;\r\n  width: 100%;\r\n  position: relative;\r\n  overflow: hidden;\r\n  padding: 0px 0px 0px 15px;\r\n}\r\n</style>\r\n","<template>\r\n  <section class=\"app-main\">\r\n    <!-- <keep-alive :include=\"cachedViews\"> -->\r\n    <router-view :key=\"key\" />\r\n    <!-- </keep-alive> -->\r\n  </section>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'AppMain',\r\n  computed: {\r\n    // cachedViews() {\r\n    //   return this.$store.state.tagsView.cachedViews\r\n    // },\r\n    key() {\r\n      return this.$route.fullPath\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.app-main {\r\n  min-height: 100%;\r\n  width: 100%;\r\n  position: relative;\r\n  overflow: hidden;\r\n  padding: 0px 0px 0px 15px;\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <svg\r\n      :class=\"{ 'is-active': isActive }\"\r\n      t=\"1492500959545\"\r\n      class=\"hamburger\"\r\n      v-show=\"show\"\r\n      viewBox=\"0 0 1024 1024\"\r\n      version=\"1.1\"\r\n      xmlns=\"http://www.w3.org/2000/svg\"\r\n      p-id=\"1691\"\r\n      xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n      width=\"64\"\r\n      height=\"64\"\r\n      @click=\"toggleClick\"\r\n    >\r\n      <path\r\n        d=\"M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z\"\r\n        p-id=\"1692\"\r\n      />\r\n      <path\r\n        d=\"M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z\"\r\n        p-id=\"1693\"\r\n      />\r\n      <path\r\n        d=\"M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z\"\r\n        p-id=\"1694\"\r\n      />\r\n    </svg>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'Hamburger',\r\n  props: {\r\n    isActive: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    toggleClick: {\r\n      type: Function as PropType<() => void>,\r\n      default: null\r\n    }\r\n  },\r\n  computed: {\r\n    show(): boolean {\r\n      return this.$store.getters.app.device === 'mobile'\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.hamburger {\r\n  display: inline-block;\r\n  cursor: pointer;\r\n  width: 20px;\r\n  height: 20px;\r\n  transform: rotate(90deg);\r\n  transition: 0.38s;\r\n  transform-origin: 50% 50%;\r\n}\r\n\r\n.hamburger.is-active {\r\n  transform: rotate(0deg);\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <svg\r\n      :class=\"{ 'is-active': isActive }\"\r\n      t=\"1492500959545\"\r\n      class=\"hamburger\"\r\n      v-show=\"show\"\r\n      viewBox=\"0 0 1024 1024\"\r\n      version=\"1.1\"\r\n      xmlns=\"http://www.w3.org/2000/svg\"\r\n      p-id=\"1691\"\r\n      xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n      width=\"64\"\r\n      height=\"64\"\r\n      @click=\"toggleClick\"\r\n    >\r\n      <path\r\n        d=\"M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z\"\r\n        p-id=\"1692\"\r\n      />\r\n      <path\r\n        d=\"M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z\"\r\n        p-id=\"1693\"\r\n      />\r\n      <path\r\n        d=\"M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z\"\r\n        p-id=\"1694\"\r\n      />\r\n    </svg>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'Hamburger',\r\n  props: {\r\n    isActive: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    toggleClick: {\r\n      type: Function as PropType<() => void>,\r\n      default: null\r\n    }\r\n  },\r\n  computed: {\r\n    show(): boolean {\r\n      return this.$store.getters.app.device === 'mobile'\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.hamburger {\r\n  display: inline-block;\r\n  cursor: pointer;\r\n  width: 20px;\r\n  height: 20px;\r\n  transform: rotate(90deg);\r\n  transition: 0.38s;\r\n  transform-origin: 50% 50%;\r\n}\r\n\r\n.hamburger.is-active {\r\n  transform: rotate(0deg);\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <svg\r\n      :class=\"{ 'is-active': isActive }\"\r\n      t=\"1492500959545\"\r\n      class=\"hamburger\"\r\n      v-show=\"show\"\r\n      viewBox=\"0 0 1024 1024\"\r\n      version=\"1.1\"\r\n      xmlns=\"http://www.w3.org/2000/svg\"\r\n      p-id=\"1691\"\r\n      xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n      width=\"64\"\r\n      height=\"64\"\r\n      @click=\"toggleClick\"\r\n    >\r\n      <path\r\n        d=\"M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z\"\r\n        p-id=\"1692\"\r\n      />\r\n      <path\r\n        d=\"M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z\"\r\n        p-id=\"1693\"\r\n      />\r\n      <path\r\n        d=\"M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z\"\r\n        p-id=\"1694\"\r\n      />\r\n    </svg>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'Hamburger',\r\n  props: {\r\n    isActive: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    toggleClick: {\r\n      type: Function as PropType<() => void>,\r\n      default: null\r\n    }\r\n  },\r\n  computed: {\r\n    show(): boolean {\r\n      return this.$store.getters.app.device === 'mobile'\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.hamburger {\r\n  display: inline-block;\r\n  cursor: pointer;\r\n  width: 20px;\r\n  height: 20px;\r\n  transform: rotate(90deg);\r\n  transition: 0.38s;\r\n  transform-origin: 50% 50%;\r\n}\r\n\r\n.hamburger.is-active {\r\n  transform: rotate(0deg);\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <svg\r\n      :class=\"{ 'is-active': isActive }\"\r\n      t=\"1492500959545\"\r\n      class=\"hamburger\"\r\n      v-show=\"show\"\r\n      viewBox=\"0 0 1024 1024\"\r\n      version=\"1.1\"\r\n      xmlns=\"http://www.w3.org/2000/svg\"\r\n      p-id=\"1691\"\r\n      xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n      width=\"64\"\r\n      height=\"64\"\r\n      @click=\"toggleClick\"\r\n    >\r\n      <path\r\n        d=\"M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z\"\r\n        p-id=\"1692\"\r\n      />\r\n      <path\r\n        d=\"M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z\"\r\n        p-id=\"1693\"\r\n      />\r\n      <path\r\n        d=\"M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z\"\r\n        p-id=\"1694\"\r\n      />\r\n    </svg>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent, PropType } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'Hamburger',\r\n  props: {\r\n    isActive: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    toggleClick: {\r\n      type: Function as PropType<() => void>,\r\n      default: null\r\n    }\r\n  },\r\n  computed: {\r\n    show(): boolean {\r\n      return this.$store.getters.app.device === 'mobile'\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.hamburger {\r\n  display: inline-block;\r\n  cursor: pointer;\r\n  width: 20px;\r\n  height: 20px;\r\n  transform: rotate(90deg);\r\n  transition: 0.38s;\r\n  transform-origin: 50% 50%;\r\n}\r\n\r\n.hamburger.is-active {\r\n  transform: rotate(0deg);\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"navbar\">\r\n    <hamburger\r\n      :toggle-click=\"toggleSideBar\"\r\n      :is-active=\"sidebar.opened\"\r\n      class=\"hamburger-container\"\r\n    />\r\n    <div class=\"left-menu\">\r\n      <a href=\"/\">\r\n        <span style=\"display: inline-block;\">{{ displayName }}</span>\r\n      </a>\r\n    </div>\r\n    <div class=\"right-menu\">\r\n      <!-- <template v-if=\"device !== 'mobile'\"> -->\r\n      <template>\r\n        <!-- <error-log class=\"errLog-container right-menu-item\" /> -->\r\n\r\n        <!-- <el-tooltip content=\"全屏\" effect=\"dark\" placement=\"bottom\">\r\n          <screenfull class=\"screenfull right-menu-item\" />\r\n        </el-tooltip>-->\r\n\r\n        <!-- <el-tooltip content=\"布局大小\" effect=\"dark\" placement=\"bottom\">\r\n          <size-select class=\"international right-menu-item\" />\r\n        </el-tooltip>-->\r\n\r\n        <!-- <el-tooltip content=\"换肤\" effect=\"dark\" placement=\"bottom\">\r\n          <theme-picker class=\"theme-switch right-menu-item\" />\r\n        </el-tooltip>-->\r\n      </template>\r\n\r\n      <el-dropdown class=\"avatar-container right-menu-item\" trigger=\"click\">\r\n        <div class=\"avatar-wrapper\">\r\n          <span>\r\n            <img :src=\"myAvatar\" class=\"user-avatar\" />\r\n          </span>\r\n          <span class=\"user-info\">\r\n            {{ userInfo && userInfo.displayName }}\r\n            <br />\r\n            [{{ userInfo && userInfo.roleNames }}]\r\n          </span>\r\n          <i class=\"el-icon-caret-bottom\" />\r\n        </div>\r\n        <template #dropdown>\r\n          <el-dropdown-menu class=\"avatar-dropdown\">\r\n            <router-link to=\"/\">\r\n              <el-dropdown-item>\r\n                <span style=\"display:inline-block;\">首页</span>\r\n              </el-dropdown-item>\r\n            </router-link>\r\n\r\n            <router-link to=\"/Admin/User/Info\">\r\n              <el-dropdown-item divided>\r\n                <span style=\"display:inline-block;\">个人信息</span>\r\n              </el-dropdown-item>\r\n            </router-link>\r\n\r\n            <el-dropdown-item divided>\r\n              <span style=\"display:block;\" @click=\"logout\">退出登录</span>\r\n            </el-dropdown-item>\r\n          </el-dropdown-menu>\r\n        </template>\r\n      </el-dropdown>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport Hamburger from '@/views/layout/components/hamburger.vue'\r\n// import SizeSelect from 'src/components/SizeSelect'\r\n// import ThemePicker from 'src/components/ThemePicker'\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n  components: {\r\n    Hamburger\r\n    // Screenfull,\r\n    // SizeSelect,\r\n    // ThemePicker,\r\n  },\r\n  computed: {\r\n    sidebar() {\r\n      return this.$store.getters.sidebar\r\n    },\r\n    userInfo() {\r\n      return this.$store.getters.userInfo || {}\r\n    },\r\n    sysConfig() {\r\n      return this.$store.getters.sysConfig\r\n    },\r\n    urls() {\r\n      return this.$store.getters.urls\r\n    },\r\n    myAvatar() {\r\n      const vm = this as any\r\n      let avatar = vm.userInfo && vm.userInfo.avatar\r\n      if (avatar) {\r\n        if (avatar.indexOf('http') !== 0) {\r\n          avatar = vm.urls.baseUrl + avatar\r\n        }\r\n        return avatar\r\n      }\r\n      return 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif?imageView2/1/w/80/h/80'\r\n    },\r\n    displayName() {\r\n      const vm = this as any\r\n      if (vm.sysConfig && vm.sysConfig.displayName) {\r\n        return vm.sysConfig.displayName\r\n      }\r\n      return ''\r\n    }\r\n  },\r\n  methods: {\r\n    toggleSideBar() {\r\n      this.$store.dispatch('toggleSideBar')\r\n    },\r\n    logout() {\r\n      const vm = this\r\n      vm.$api.user.logout().then(() => {\r\n        vm.$store.dispatch('logout')\r\n        location.reload() // 为了重新实例化vue-router对象 避免bug\r\n      })\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style acoped>\r\n.navbar {\r\n  height: 50px;\r\n  overflow: hidden;\r\n  position: fixed;\r\n  top: 0;\r\n  left: 0;\r\n  width: 100%;\r\n  /* background: #fff; */\r\n  background: #1d5e91;\r\n  -webkit-box-shadow: 0 1px 4px rgb(0 21 41 / 8%);\r\n  box-shadow: 0 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n.navbar .left-menu {\r\n  line-height: 48px;\r\n  height: 50px;\r\n  float: left;\r\n  padding: 0 10px;\r\n}\r\n\r\n.navbar .left-menu a:link {\r\n  font-size: 18px;\r\n}\r\n.navbar .left-menu a:visited {\r\n  text-decoration: none;\r\n  color: #606266;\r\n}\r\n\r\n.navbar .hamburger-container {\r\n  line-height: 58px;\r\n  height: 50px;\r\n  float: left;\r\n  padding: 0 10px;\r\n}\r\n.navbar .breadcrumb-container {\r\n  float: left;\r\n}\r\n.navbar .errLog-container {\r\n  display: inline-block;\r\n  vertical-align: top;\r\n}\r\n.navbar .right-menu {\r\n  line-height: 48px;\r\n  float: right;\r\n  height: 100%;\r\n}\r\n.navbar .right-menu:focus {\r\n  outline: none;\r\n}\r\n.navbar .right-menu .right-menu-item {\r\n  display: inline-block;\r\n  margin: 0 8px;\r\n}\r\n.navbar .right-menu .screenfull {\r\n  height: 20px;\r\n}\r\n.navbar .right-menu .international {\r\n  vertical-align: top;\r\n}\r\n.navbar .right-menu .theme-switch {\r\n  vertical-align: 15px;\r\n}\r\n.navbar .right-menu .avatar-container {\r\n  height: 50px;\r\n  margin-right: 30px;\r\n}\r\n\r\n.navbar .right-menu .avatar-container .avatar-wrapper {\r\n  margin-top: 5px;\r\n  position: relative;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .user-avatar {\r\n  cursor: pointer;\r\n  width: 40px;\r\n  height: 40px;\r\n  border-radius: 10px;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .user-info {\r\n  max-width: 150px;\r\n  display: inline-block;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n  text-align: left;\r\n  vertical-align: top;\r\n  line-height: 16px;\r\n  position: relative;\r\n  top: 6px;\r\n  margin-left: 5px;\r\n  color: #c7c7c7;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .el-icon-caret-bottom {\r\n  cursor: pointer;\r\n  position: absolute;\r\n  right: -20px;\r\n  top: 25px;\r\n  font-size: 12px;\r\n  color: #c7c7c7;\r\n}\r\n\r\n.avatar-dropdown a:visited {\r\n  text-decoration: none;\r\n  color: #606266;\r\n}\r\n.avatar-dropdown a:hover {\r\n  color: inherit;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"navbar\">\r\n    <hamburger\r\n      :toggle-click=\"toggleSideBar\"\r\n      :is-active=\"sidebar.opened\"\r\n      class=\"hamburger-container\"\r\n    />\r\n    <div class=\"left-menu\">\r\n      <a href=\"/\">\r\n        <span style=\"display: inline-block;\">{{ displayName }}</span>\r\n      </a>\r\n    </div>\r\n    <div class=\"right-menu\">\r\n      <!-- <template v-if=\"device !== 'mobile'\"> -->\r\n      <template>\r\n        <!-- <error-log class=\"errLog-container right-menu-item\" /> -->\r\n\r\n        <!-- <el-tooltip content=\"全屏\" effect=\"dark\" placement=\"bottom\">\r\n          <screenfull class=\"screenfull right-menu-item\" />\r\n        </el-tooltip>-->\r\n\r\n        <!-- <el-tooltip content=\"布局大小\" effect=\"dark\" placement=\"bottom\">\r\n          <size-select class=\"international right-menu-item\" />\r\n        </el-tooltip>-->\r\n\r\n        <!-- <el-tooltip content=\"换肤\" effect=\"dark\" placement=\"bottom\">\r\n          <theme-picker class=\"theme-switch right-menu-item\" />\r\n        </el-tooltip>-->\r\n      </template>\r\n\r\n      <el-dropdown class=\"avatar-container right-menu-item\" trigger=\"click\">\r\n        <div class=\"avatar-wrapper\">\r\n          <span>\r\n            <img :src=\"myAvatar\" class=\"user-avatar\" />\r\n          </span>\r\n          <span class=\"user-info\">\r\n            {{ userInfo && userInfo.displayName }}\r\n            <br />\r\n            [{{ userInfo && userInfo.roleNames }}]\r\n          </span>\r\n          <i class=\"el-icon-caret-bottom\" />\r\n        </div>\r\n        <template #dropdown>\r\n          <el-dropdown-menu class=\"avatar-dropdown\">\r\n            <router-link to=\"/\">\r\n              <el-dropdown-item>\r\n                <span style=\"display:inline-block;\">首页</span>\r\n              </el-dropdown-item>\r\n            </router-link>\r\n\r\n            <router-link to=\"/Admin/User/Info\">\r\n              <el-dropdown-item divided>\r\n                <span style=\"display:inline-block;\">个人信息</span>\r\n              </el-dropdown-item>\r\n            </router-link>\r\n\r\n            <el-dropdown-item divided>\r\n              <span style=\"display:block;\" @click=\"logout\">退出登录</span>\r\n            </el-dropdown-item>\r\n          </el-dropdown-menu>\r\n        </template>\r\n      </el-dropdown>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport Hamburger from '@/views/layout/components/hamburger.vue'\r\n// import SizeSelect from 'src/components/SizeSelect'\r\n// import ThemePicker from 'src/components/ThemePicker'\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n  components: {\r\n    Hamburger\r\n    // Screenfull,\r\n    // SizeSelect,\r\n    // ThemePicker,\r\n  },\r\n  computed: {\r\n    sidebar() {\r\n      return this.$store.getters.sidebar\r\n    },\r\n    userInfo() {\r\n      return this.$store.getters.userInfo || {}\r\n    },\r\n    sysConfig() {\r\n      return this.$store.getters.sysConfig\r\n    },\r\n    urls() {\r\n      return this.$store.getters.urls\r\n    },\r\n    myAvatar() {\r\n      const vm = this as any\r\n      let avatar = vm.userInfo && vm.userInfo.avatar\r\n      if (avatar) {\r\n        if (avatar.indexOf('http') !== 0) {\r\n          avatar = vm.urls.baseUrl + avatar\r\n        }\r\n        return avatar\r\n      }\r\n      return 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif?imageView2/1/w/80/h/80'\r\n    },\r\n    displayName() {\r\n      const vm = this as any\r\n      if (vm.sysConfig && vm.sysConfig.displayName) {\r\n        return vm.sysConfig.displayName\r\n      }\r\n      return ''\r\n    }\r\n  },\r\n  methods: {\r\n    toggleSideBar() {\r\n      this.$store.dispatch('toggleSideBar')\r\n    },\r\n    logout() {\r\n      const vm = this\r\n      vm.$api.user.logout().then(() => {\r\n        vm.$store.dispatch('logout')\r\n        location.reload() // 为了重新实例化vue-router对象 避免bug\r\n      })\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style acoped>\r\n.navbar {\r\n  height: 50px;\r\n  overflow: hidden;\r\n  position: fixed;\r\n  top: 0;\r\n  left: 0;\r\n  width: 100%;\r\n  /* background: #fff; */\r\n  background: #1d5e91;\r\n  -webkit-box-shadow: 0 1px 4px rgb(0 21 41 / 8%);\r\n  box-shadow: 0 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n.navbar .left-menu {\r\n  line-height: 48px;\r\n  height: 50px;\r\n  float: left;\r\n  padding: 0 10px;\r\n}\r\n\r\n.navbar .left-menu a:link {\r\n  font-size: 18px;\r\n}\r\n.navbar .left-menu a:visited {\r\n  text-decoration: none;\r\n  color: #606266;\r\n}\r\n\r\n.navbar .hamburger-container {\r\n  line-height: 58px;\r\n  height: 50px;\r\n  float: left;\r\n  padding: 0 10px;\r\n}\r\n.navbar .breadcrumb-container {\r\n  float: left;\r\n}\r\n.navbar .errLog-container {\r\n  display: inline-block;\r\n  vertical-align: top;\r\n}\r\n.navbar .right-menu {\r\n  line-height: 48px;\r\n  float: right;\r\n  height: 100%;\r\n}\r\n.navbar .right-menu:focus {\r\n  outline: none;\r\n}\r\n.navbar .right-menu .right-menu-item {\r\n  display: inline-block;\r\n  margin: 0 8px;\r\n}\r\n.navbar .right-menu .screenfull {\r\n  height: 20px;\r\n}\r\n.navbar .right-menu .international {\r\n  vertical-align: top;\r\n}\r\n.navbar .right-menu .theme-switch {\r\n  vertical-align: 15px;\r\n}\r\n.navbar .right-menu .avatar-container {\r\n  height: 50px;\r\n  margin-right: 30px;\r\n}\r\n\r\n.navbar .right-menu .avatar-container .avatar-wrapper {\r\n  margin-top: 5px;\r\n  position: relative;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .user-avatar {\r\n  cursor: pointer;\r\n  width: 40px;\r\n  height: 40px;\r\n  border-radius: 10px;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .user-info {\r\n  max-width: 150px;\r\n  display: inline-block;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n  text-align: left;\r\n  vertical-align: top;\r\n  line-height: 16px;\r\n  position: relative;\r\n  top: 6px;\r\n  margin-left: 5px;\r\n  color: #c7c7c7;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .el-icon-caret-bottom {\r\n  cursor: pointer;\r\n  position: absolute;\r\n  right: -20px;\r\n  top: 25px;\r\n  font-size: 12px;\r\n  color: #c7c7c7;\r\n}\r\n\r\n.avatar-dropdown a:visited {\r\n  text-decoration: none;\r\n  color: #606266;\r\n}\r\n.avatar-dropdown a:hover {\r\n  color: inherit;\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <template v-if=\"icon\">\r\n      <i v-if=\"icon.includes('el-icon')\" :class=\"[icon, 'sub-el-icon']\" />\r\n      <!-- <svg-icon v-else :icon-class=\"icon\" /> -->\r\n    </template>\r\n    <template v-if=\"title\">\r\n      <span>{{ title }}</span>\r\n    </template>\r\n  </div>\r\n</template>\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'MenuItem',\r\n  props: {\r\n    icon: {\r\n      type: String,\r\n      default: ''\r\n    },\r\n    title: {\r\n      type: String,\r\n      default: ''\r\n    }\r\n  }\r\n  // render(h, context) {\r\n  //   console.log(context)\r\n  //   const { icon, title } = context.props\r\n  //   const vnodes = []\r\n\r\n  //   if (icon) {\r\n  //     if (icon.includes('el-icon')) {\r\n  //       vnodes.push(<i class={[icon, 'sub-el-icon']} />)\r\n  //     } else {\r\n  //       vnodes.push(<svg-icon icon-class={icon} />)\r\n  //     }\r\n  //   }\r\n\r\n  //   if (title) {\r\n  //     vnodes.push(<span>{title}</span>)\r\n  //   }\r\n  //   return vnodes\r\n  // }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.sub-el-icon {\r\n  color: currentColor;\r\n  width: 1em;\r\n  height: 1em;\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <template v-if=\"icon\">\r\n      <i v-if=\"icon.includes('el-icon')\" :class=\"[icon, 'sub-el-icon']\" />\r\n      <!-- <svg-icon v-else :icon-class=\"icon\" /> -->\r\n    </template>\r\n    <template v-if=\"title\">\r\n      <span>{{ title }}</span>\r\n    </template>\r\n  </div>\r\n</template>\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'MenuItem',\r\n  props: {\r\n    icon: {\r\n      type: String,\r\n      default: ''\r\n    },\r\n    title: {\r\n      type: String,\r\n      default: ''\r\n    }\r\n  }\r\n  // render(h, context) {\r\n  //   console.log(context)\r\n  //   const { icon, title } = context.props\r\n  //   const vnodes = []\r\n\r\n  //   if (icon) {\r\n  //     if (icon.includes('el-icon')) {\r\n  //       vnodes.push(<i class={[icon, 'sub-el-icon']} />)\r\n  //     } else {\r\n  //       vnodes.push(<svg-icon icon-class={icon} />)\r\n  //     }\r\n  //   }\r\n\r\n  //   if (title) {\r\n  //     vnodes.push(<span>{title}</span>)\r\n  //   }\r\n  //   return vnodes\r\n  // }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.sub-el-icon {\r\n  color: currentColor;\r\n  width: 1em;\r\n  height: 1em;\r\n}\r\n</style>\r\n","<template>\r\n  <div v-if=\"item.visible\">\r\n    <template\r\n      v-if=\"\r\n        onlyOneChild &&\r\n          (!onlyOneChild.children || onlyOneChild.noShowingChildren) &&\r\n          !item.alwaysShow\r\n      \"\r\n    >\r\n      <router-link\r\n        v-if=\"onlyOneChild\"\r\n        :to=\"onlyOneChild.path || onlyOneChild.url\"\r\n      >\r\n        <el-menu-item\r\n          :index=\"onlyOneChild.path || onlyOneChild.url\"\r\n          :class=\"{ 'submenu-title-noDropdown': !isNest }\"\r\n        >\r\n          <item :title=\"onlyOneChild.displayName\" />\r\n        </el-menu-item>\r\n      </router-link>\r\n    </template>\r\n\r\n    <el-sub-menu v-else ref=\"subMenu\" :index=\"item.path || item.url\" teleported>\r\n      <template v-slot:title>\r\n        <item\r\n          v-if=\"item\"\r\n          :icon=\"item.meta && item.meta.icon\"\r\n          :title=\"item.displayName\"\r\n        />\r\n      </template>\r\n      <sidebar-item\r\n        v-for=\"child in item.children\"\r\n        :key=\"child.path\"\r\n        :is-nest=\"true\"\r\n        :item=\"child\"\r\n        :base-path=\"child.path\"\r\n        class=\"nest-menu\"\r\n      />\r\n    </el-sub-menu>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nimport Item from './Item.vue'\r\n\r\nexport default defineComponent({\r\n  name: 'SidebarItem',\r\n  components: { Item },\r\n  props: {\r\n    // route object\r\n    item: {\r\n      type: Object,\r\n      required: true\r\n    },\r\n    isNest: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    basePath: {\r\n      type: String,\r\n      default: ''\r\n    }\r\n  },\r\n  computed: {\r\n    onlyOneChild() {\r\n      const vm = this as any\r\n      const children = vm.item.children\r\n      const parent = vm.item\r\n      let showingChildren = []\r\n      let child = null\r\n      if (children) {\r\n        showingChildren = children.filter((item: any) => {\r\n          if (item.hidden) {\r\n            return false\r\n          } else {\r\n            // Temp set(will be used if only has one showing child)\r\n            child = item\r\n\r\n            return true\r\n          }\r\n        })\r\n      }\r\n\r\n      // When there is only one child router, the child router is displayed by default\r\n      if (showingChildren.length === 1) {\r\n        return child\r\n      }\r\n\r\n      // Show parent if there are no child router to display\r\n      if (showingChildren.length === 0) {\r\n        child = { ...parent, /*: '',*/ noShowingChildren: true }\r\n        return child\r\n      }\r\n\r\n      return null\r\n    }\r\n  }\r\n  // methods: {\r\n  //   hasOneShowingChild(children: any[] = [], parent: any) {\r\n  //     let showingChildren = []\r\n  //     if (children) {\r\n  //       showingChildren = children.filter((item) => {\r\n  //         if (item.hidden) {\r\n  //           return false\r\n  //         } else {\r\n  //           // Temp set(will be used if only has one showing child)\r\n  //           this.onlyOneChild = item\r\n\r\n  //           return true\r\n  //         }\r\n  //       })\r\n  //     }\r\n\r\n  //     // When there is only one child router, the child router is displayed by default\r\n  //     if (showingChildren.length === 1) {\r\n  //       return true\r\n  //     }\r\n\r\n  //     // Show parent if there are no child router to display\r\n  //     if (showingChildren.length === 0) {\r\n  //       this.onlyOneChild = { ...parent, /*: '',*/ noShowingChildren: true }\r\n  //       return true\r\n  //     }\r\n\r\n  //     return false\r\n  //   }\r\n  // }\r\n})\r\n</script>\r\n","<template>\r\n  <div v-if=\"item.visible\">\r\n    <template\r\n      v-if=\"\r\n        onlyOneChild &&\r\n          (!onlyOneChild.children || onlyOneChild.noShowingChildren) &&\r\n          !item.alwaysShow\r\n      \"\r\n    >\r\n      <router-link\r\n        v-if=\"onlyOneChild\"\r\n        :to=\"onlyOneChild.path || onlyOneChild.url\"\r\n      >\r\n        <el-menu-item\r\n          :index=\"onlyOneChild.path || onlyOneChild.url\"\r\n          :class=\"{ 'submenu-title-noDropdown': !isNest }\"\r\n        >\r\n          <item :title=\"onlyOneChild.displayName\" />\r\n        </el-menu-item>\r\n      </router-link>\r\n    </template>\r\n\r\n    <el-sub-menu v-else ref=\"subMenu\" :index=\"item.path || item.url\" teleported>\r\n      <template v-slot:title>\r\n        <item\r\n          v-if=\"item\"\r\n          :icon=\"item.meta && item.meta.icon\"\r\n          :title=\"item.displayName\"\r\n        />\r\n      </template>\r\n      <sidebar-item\r\n        v-for=\"child in item.children\"\r\n        :key=\"child.path\"\r\n        :is-nest=\"true\"\r\n        :item=\"child\"\r\n        :base-path=\"child.path\"\r\n        class=\"nest-menu\"\r\n      />\r\n    </el-sub-menu>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nimport Item from './Item.vue'\r\n\r\nexport default defineComponent({\r\n  name: 'SidebarItem',\r\n  components: { Item },\r\n  props: {\r\n    // route object\r\n    item: {\r\n      type: Object,\r\n      required: true\r\n    },\r\n    isNest: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    basePath: {\r\n      type: String,\r\n      default: ''\r\n    }\r\n  },\r\n  computed: {\r\n    onlyOneChild() {\r\n      const vm = this as any\r\n      const children = vm.item.children\r\n      const parent = vm.item\r\n      let showingChildren = []\r\n      let child = null\r\n      if (children) {\r\n        showingChildren = children.filter((item: any) => {\r\n          if (item.hidden) {\r\n            return false\r\n          } else {\r\n            // Temp set(will be used if only has one showing child)\r\n            child = item\r\n\r\n            return true\r\n          }\r\n        })\r\n      }\r\n\r\n      // When there is only one child router, the child router is displayed by default\r\n      if (showingChildren.length === 1) {\r\n        return child\r\n      }\r\n\r\n      // Show parent if there are no child router to display\r\n      if (showingChildren.length === 0) {\r\n        child = { ...parent, /*: '',*/ noShowingChildren: true }\r\n        return child\r\n      }\r\n\r\n      return null\r\n    }\r\n  }\r\n  // methods: {\r\n  //   hasOneShowingChild(children: any[] = [], parent: any) {\r\n  //     let showingChildren = []\r\n  //     if (children) {\r\n  //       showingChildren = children.filter((item) => {\r\n  //         if (item.hidden) {\r\n  //           return false\r\n  //         } else {\r\n  //           // Temp set(will be used if only has one showing child)\r\n  //           this.onlyOneChild = item\r\n\r\n  //           return true\r\n  //         }\r\n  //       })\r\n  //     }\r\n\r\n  //     // When there is only one child router, the child router is displayed by default\r\n  //     if (showingChildren.length === 1) {\r\n  //       return true\r\n  //     }\r\n\r\n  //     // Show parent if there are no child router to display\r\n  //     if (showingChildren.length === 0) {\r\n  //       this.onlyOneChild = { ...parent, /*: '',*/ noShowingChildren: true }\r\n  //       return true\r\n  //     }\r\n\r\n  //     return false\r\n  //   }\r\n  // }\r\n})\r\n</script>\r\n","export function getItem(key: string): string | null {\r\n  return localStorage.getItem(key)\r\n}\r\n\r\nexport function setItem(key: string, value: any): void {\r\n  localStorage.setItem(key, value)\r\n}\r\n\r\nexport function removeItem(key: string): void {\r\n  localStorage.removeItem(key)\r\n}\r\n\r\nexport default {\r\n  getItem,\r\n  setItem,\r\n  removeItem\r\n}\r\n","import Storage from '@/utils/storage'\r\n\r\nconst Key = 'menu'\r\n\r\nexport function getMenu(): any | null {\r\n  const u = Storage.getItem(Key)\r\n  if (u) {\r\n    return JSON.parse(u)\r\n  }\r\n\r\n  return null\r\n}\r\n\r\nexport function setMenu(value: object) {\r\n  return Storage.setItem(Key, JSON.stringify(value))\r\n}\r\n\r\nexport function removeMenu() {\r\n  return Storage.removeItem(Key)\r\n}\r\n","<template>\r\n  <div class=\"box\">\r\n    <el-scrollbar wrap-class=\"scrollbar-wrapper\">\r\n      <el-menu\r\n        :default-active=\"$route.path\"\r\n        :collapse=\"isCollapse\"\r\n        background-color=\"#333333\"\r\n        text-color=\"#bfcbd9\"\r\n        :unique-opened=\"true\"\r\n        active-text-color=\"#409EFF\"\r\n        :collapse-transition=\"false\"\r\n        mode=\"vertical\"\r\n      >\r\n        <sidebar-item\r\n          v-for=\"route in menuRouters\"\r\n          :key=\"route.path\"\r\n          :item=\"route\"\r\n          :base-path=\"route.path\"\r\n        />\r\n      </el-menu>\r\n    </el-scrollbar>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { getMenu } from '@/utils/menu'\r\nimport { defineComponent } from 'vue'\r\nimport SidebarItem from './SidebarItem.vue'\r\n\r\nexport default defineComponent({\r\n  name: 'Sidebar',\r\n  components: { SidebarItem },\r\n  computed: {\r\n    menuRouters(): any {\r\n      const vm = this\r\n      let menuRouters = vm.$store.getters.menuRouters\r\n\r\n      if (menuRouters && menuRouters.length > 0) {\r\n        return menuRouters\r\n      }\r\n\r\n      const menus = getMenu()\r\n      if (menus && menus.length > 0) {\r\n        // 将菜单数据转化成路由以及菜单信息\r\n        const accessedRouters = menus\r\n\r\n        // 设置路由信息\r\n        vm.$store.dispatch('generateRoutes', accessedRouters)\r\n\r\n        // 添加路由信息\r\n        const addRouters = vm.$store.getters.addRouters\r\n        if (addRouters) {\r\n          addRouters.forEach((e: any) => {\r\n            vm.$router.addRoute(e) // 动态添加可访问路由表\r\n          })\r\n        }\r\n      }\r\n\r\n      menuRouters = vm.$store.getters.menuRouters\r\n\r\n      return menuRouters\r\n    },\r\n    sidebar(): any {\r\n      return this.$store.getters.sidebar\r\n    },\r\n    isCollapse(): any {\r\n      return !(this as any).sidebar.opened\r\n    }\r\n  },\r\n  data() {\r\n    return {\r\n      active: '1-1-1',\r\n      data: []\r\n    }\r\n  },\r\n  created() {\r\n    // window.menuRouters = this.menuRouters\r\n    // console.log(this.menuRouters)\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.box-wrap {\r\n  display: -moz-flex;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  height: auto;\r\n}\r\n.box {\r\n  width: auto;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"box\">\r\n    <el-scrollbar wrap-class=\"scrollbar-wrapper\">\r\n      <el-menu\r\n        :default-active=\"$route.path\"\r\n        :collapse=\"isCollapse\"\r\n        background-color=\"#333333\"\r\n        text-color=\"#bfcbd9\"\r\n        :unique-opened=\"true\"\r\n        active-text-color=\"#409EFF\"\r\n        :collapse-transition=\"false\"\r\n        mode=\"vertical\"\r\n      >\r\n        <sidebar-item\r\n          v-for=\"route in menuRouters\"\r\n          :key=\"route.path\"\r\n          :item=\"route\"\r\n          :base-path=\"route.path\"\r\n        />\r\n      </el-menu>\r\n    </el-scrollbar>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { getMenu } from '@/utils/menu'\r\nimport { defineComponent } from 'vue'\r\nimport SidebarItem from './SidebarItem.vue'\r\n\r\nexport default defineComponent({\r\n  name: 'Sidebar',\r\n  components: { SidebarItem },\r\n  computed: {\r\n    menuRouters(): any {\r\n      const vm = this\r\n      let menuRouters = vm.$store.getters.menuRouters\r\n\r\n      if (menuRouters && menuRouters.length > 0) {\r\n        return menuRouters\r\n      }\r\n\r\n      const menus = getMenu()\r\n      if (menus && menus.length > 0) {\r\n        // 将菜单数据转化成路由以及菜单信息\r\n        const accessedRouters = menus\r\n\r\n        // 设置路由信息\r\n        vm.$store.dispatch('generateRoutes', accessedRouters)\r\n\r\n        // 添加路由信息\r\n        const addRouters = vm.$store.getters.addRouters\r\n        if (addRouters) {\r\n          addRouters.forEach((e: any) => {\r\n            vm.$router.addRoute(e) // 动态添加可访问路由表\r\n          })\r\n        }\r\n      }\r\n\r\n      menuRouters = vm.$store.getters.menuRouters\r\n\r\n      return menuRouters\r\n    },\r\n    sidebar(): any {\r\n      return this.$store.getters.sidebar\r\n    },\r\n    isCollapse(): any {\r\n      return !(this as any).sidebar.opened\r\n    }\r\n  },\r\n  data() {\r\n    return {\r\n      active: '1-1-1',\r\n      data: []\r\n    }\r\n  },\r\n  created() {\r\n    // window.menuRouters = this.menuRouters\r\n    // console.log(this.menuRouters)\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.box-wrap {\r\n  display: -moz-flex;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  height: auto;\r\n}\r\n.box {\r\n  width: auto;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"navbar\">\r\n    <hamburger\r\n      :toggle-click=\"toggleSideBar\"\r\n      :is-active=\"sidebar.opened\"\r\n      class=\"hamburger-container\"\r\n    />\r\n    <div class=\"left-menu\">\r\n      <a href=\"/\">\r\n        <span style=\"display: inline-block\">{{ displayName }}</span>\r\n      </a>\r\n    </div>\r\n    <div class=\"right-menu\">\r\n      <!-- <template v-if=\"device !== 'mobile'\"> -->\r\n      <template>\r\n        <!-- <error-log class=\"errLog-container right-menu-item\" /> -->\r\n\r\n        <!-- <el-tooltip content=\"全屏\" effect=\"dark\" placement=\"bottom\">\r\n          <screenfull class=\"screenfull right-menu-item\" />\r\n        </el-tooltip>-->\r\n\r\n        <!-- <el-tooltip content=\"布局大小\" effect=\"dark\" placement=\"bottom\">\r\n          <size-select class=\"international right-menu-item\" />\r\n        </el-tooltip>-->\r\n\r\n        <!-- <el-tooltip content=\"换肤\" effect=\"dark\" placement=\"bottom\">\r\n          <theme-picker class=\"theme-switch right-menu-item\" />\r\n        </el-tooltip>-->\r\n      </template>\r\n\r\n      <el-dropdown class=\"avatar-container right-menu-item\" trigger=\"click\">\r\n        <div class=\"avatar-wrapper\">\r\n          <span>\r\n            <img :src=\"myAvatar\" class=\"user-avatar\" />\r\n          </span>\r\n          <span class=\"user-info\">\r\n            {{ userInfo && userInfo.displayName }}\r\n            <br />\r\n            [{{ userInfo && userInfo.roleNames }}]\r\n          </span>\r\n          <i class=\"el-icon-caret-bottom\" />\r\n        </div>\r\n        <template #dropdown>\r\n          <el-dropdown-menu class=\"avatar-dropdown\">\r\n            <router-link to=\"/\">\r\n              <el-dropdown-item>\r\n                <span style=\"display: inline-block\">首页</span>\r\n              </el-dropdown-item>\r\n            </router-link>\r\n\r\n            <router-link to=\"/Admin/User/Info\">\r\n              <el-dropdown-item divided>\r\n                <span style=\"display: inline-block\">个人信息</span>\r\n              </el-dropdown-item>\r\n            </router-link>\r\n\r\n            <el-dropdown-item divided>\r\n              <span style=\"display: block\" @click=\"logout\">退出登录</span>\r\n            </el-dropdown-item>\r\n          </el-dropdown-menu>\r\n        </template>\r\n      </el-dropdown>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport Hamburger from '@/views/layout/components/hamburger.vue';\r\n// import SizeSelect from 'src/components/SizeSelect'\r\n// import ThemePicker from 'src/components/ThemePicker'\r\nimport { defineComponent } from 'vue';\r\n\r\nexport default defineComponent({\r\n  components: {\r\n    Hamburger,\r\n    // Screenfull,\r\n    // SizeSelect,\r\n    // ThemePicker,\r\n  },\r\n  computed: {\r\n    store() {\r\n      return this.$store;\r\n    },\r\n    sidebar() {\r\n      return this.$store.getters.sidebar;\r\n    },\r\n    userInfo() {\r\n      return this.$store.getters.userInfo || {};\r\n    },\r\n    sysConfig() {\r\n      return this.$store.getters.sysConfig;\r\n    },\r\n    urls() {\r\n      return this.$store.getters.urls;\r\n    },\r\n    myAvatar() {\r\n      const vm = this as any;\r\n      let avatar = vm.userInfo && vm.userInfo.avatar;\r\n      if (avatar) {\r\n        if (avatar.indexOf('http') !== 0) {\r\n          avatar = vm.urls.baseUrl + avatar;\r\n        }\r\n        return avatar;\r\n      }\r\n      return 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif?imageView2/1/w/80/h/80';\r\n    },\r\n    displayName() {\r\n      const vm = this as any;\r\n      if (vm.sysConfig && vm.sysConfig.displayName) {\r\n        return vm.sysConfig.displayName;\r\n      }\r\n      return '';\r\n    },\r\n  },\r\n  methods: {\r\n    toggleSideBar() {\r\n      this.store.dispatch('toggleSideBar');\r\n    },\r\n    logout() {\r\n      const vm = this as any;\r\n      vm.$api.user.logout().then(() => {\r\n        vm.store.dispatch('logout');\r\n        location.reload(); // 为了重新实例化vue-router对象 避免bug\r\n      });\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style acoped>\r\n.navbar {\r\n  height: 50px;\r\n  overflow: hidden;\r\n  position: fixed;\r\n  top: 0;\r\n  left: 0;\r\n  width: 100%;\r\n  /* background: #fff; */\r\n  background: #1d5e91;\r\n  -webkit-box-shadow: 0 1px 4px rgb(0 21 41 / 8%);\r\n  box-shadow: 0 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n.navbar .left-menu {\r\n  line-height: 48px;\r\n  height: 50px;\r\n  float: left;\r\n  padding: 0 10px;\r\n}\r\n\r\n.navbar .left-menu a:link {\r\n  font-size: 18px;\r\n}\r\n.navbar .left-menu a:visited {\r\n  text-decoration: none;\r\n  color: #606266;\r\n}\r\n\r\n.navbar .hamburger-container {\r\n  line-height: 58px;\r\n  height: 50px;\r\n  float: left;\r\n  padding: 0 10px;\r\n}\r\n.navbar .breadcrumb-container {\r\n  float: left;\r\n}\r\n.navbar .errLog-container {\r\n  display: inline-block;\r\n  vertical-align: top;\r\n}\r\n.navbar .right-menu {\r\n  line-height: 48px;\r\n  float: right;\r\n  height: 100%;\r\n}\r\n.navbar .right-menu:focus {\r\n  outline: none;\r\n}\r\n.navbar .right-menu .right-menu-item {\r\n  display: inline-block;\r\n  margin: 0 8px;\r\n}\r\n.navbar .right-menu .screenfull {\r\n  height: 20px;\r\n}\r\n.navbar .right-menu .international {\r\n  vertical-align: top;\r\n}\r\n.navbar .right-menu .theme-switch {\r\n  vertical-align: 15px;\r\n}\r\n.navbar .right-menu .avatar-container {\r\n  height: 50px;\r\n  margin-right: 30px;\r\n}\r\n\r\n.navbar .right-menu .avatar-container .avatar-wrapper {\r\n  margin-top: 5px;\r\n  position: relative;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .user-avatar {\r\n  cursor: pointer;\r\n  width: 40px;\r\n  height: 40px;\r\n  border-radius: 10px;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .user-info {\r\n  max-width: 150px;\r\n  display: inline-block;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n  text-align: left;\r\n  vertical-align: top;\r\n  line-height: 16px;\r\n  position: relative;\r\n  top: 6px;\r\n  margin-left: 5px;\r\n  color: #c7c7c7;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .el-icon-caret-bottom {\r\n  cursor: pointer;\r\n  position: absolute;\r\n  right: -20px;\r\n  top: 25px;\r\n  font-size: 12px;\r\n  color: #c7c7c7;\r\n}\r\n\r\n.avatar-dropdown a:visited {\r\n  text-decoration: none;\r\n  color: #606266;\r\n}\r\n.avatar-dropdown a:hover {\r\n  color: inherit;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"navbar\">\r\n    <hamburger\r\n      :toggle-click=\"toggleSideBar\"\r\n      :is-active=\"sidebar.opened\"\r\n      class=\"hamburger-container\"\r\n    />\r\n    <div class=\"left-menu\">\r\n      <a href=\"/\">\r\n        <span style=\"display: inline-block\">{{ displayName }}</span>\r\n      </a>\r\n    </div>\r\n    <div class=\"right-menu\">\r\n      <!-- <template v-if=\"device !== 'mobile'\"> -->\r\n      <template>\r\n        <!-- <error-log class=\"errLog-container right-menu-item\" /> -->\r\n\r\n        <!-- <el-tooltip content=\"全屏\" effect=\"dark\" placement=\"bottom\">\r\n          <screenfull class=\"screenfull right-menu-item\" />\r\n        </el-tooltip>-->\r\n\r\n        <!-- <el-tooltip content=\"布局大小\" effect=\"dark\" placement=\"bottom\">\r\n          <size-select class=\"international right-menu-item\" />\r\n        </el-tooltip>-->\r\n\r\n        <!-- <el-tooltip content=\"换肤\" effect=\"dark\" placement=\"bottom\">\r\n          <theme-picker class=\"theme-switch right-menu-item\" />\r\n        </el-tooltip>-->\r\n      </template>\r\n\r\n      <el-dropdown class=\"avatar-container right-menu-item\" trigger=\"click\">\r\n        <div class=\"avatar-wrapper\">\r\n          <span>\r\n            <img :src=\"myAvatar\" class=\"user-avatar\" />\r\n          </span>\r\n          <span class=\"user-info\">\r\n            {{ userInfo && userInfo.displayName }}\r\n            <br />\r\n            [{{ userInfo && userInfo.roleNames }}]\r\n          </span>\r\n          <i class=\"el-icon-caret-bottom\" />\r\n        </div>\r\n        <template #dropdown>\r\n          <el-dropdown-menu class=\"avatar-dropdown\">\r\n            <router-link to=\"/\">\r\n              <el-dropdown-item>\r\n                <span style=\"display: inline-block\">首页</span>\r\n              </el-dropdown-item>\r\n            </router-link>\r\n\r\n            <router-link to=\"/Admin/User/Info\">\r\n              <el-dropdown-item divided>\r\n                <span style=\"display: inline-block\">个人信息</span>\r\n              </el-dropdown-item>\r\n            </router-link>\r\n\r\n            <el-dropdown-item divided>\r\n              <span style=\"display: block\" @click=\"logout\">退出登录</span>\r\n            </el-dropdown-item>\r\n          </el-dropdown-menu>\r\n        </template>\r\n      </el-dropdown>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport Hamburger from '@/views/layout/components/hamburger.vue';\r\n// import SizeSelect from 'src/components/SizeSelect'\r\n// import ThemePicker from 'src/components/ThemePicker'\r\nimport { defineComponent } from 'vue';\r\n\r\nexport default defineComponent({\r\n  components: {\r\n    Hamburger,\r\n    // Screenfull,\r\n    // SizeSelect,\r\n    // ThemePicker,\r\n  },\r\n  computed: {\r\n    store() {\r\n      return this.$store;\r\n    },\r\n    sidebar() {\r\n      return this.$store.getters.sidebar;\r\n    },\r\n    userInfo() {\r\n      return this.$store.getters.userInfo || {};\r\n    },\r\n    sysConfig() {\r\n      return this.$store.getters.sysConfig;\r\n    },\r\n    urls() {\r\n      return this.$store.getters.urls;\r\n    },\r\n    myAvatar() {\r\n      const vm = this as any;\r\n      let avatar = vm.userInfo && vm.userInfo.avatar;\r\n      if (avatar) {\r\n        if (avatar.indexOf('http') !== 0) {\r\n          avatar = vm.urls.baseUrl + avatar;\r\n        }\r\n        return avatar;\r\n      }\r\n      return 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif?imageView2/1/w/80/h/80';\r\n    },\r\n    displayName() {\r\n      const vm = this as any;\r\n      if (vm.sysConfig && vm.sysConfig.displayName) {\r\n        return vm.sysConfig.displayName;\r\n      }\r\n      return '';\r\n    },\r\n  },\r\n  methods: {\r\n    toggleSideBar() {\r\n      this.store.dispatch('toggleSideBar');\r\n    },\r\n    logout() {\r\n      const vm = this as any;\r\n      vm.$api.user.logout().then(() => {\r\n        vm.store.dispatch('logout');\r\n        location.reload(); // 为了重新实例化vue-router对象 避免bug\r\n      });\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style acoped>\r\n.navbar {\r\n  height: 50px;\r\n  overflow: hidden;\r\n  position: fixed;\r\n  top: 0;\r\n  left: 0;\r\n  width: 100%;\r\n  /* background: #fff; */\r\n  background: #1d5e91;\r\n  -webkit-box-shadow: 0 1px 4px rgb(0 21 41 / 8%);\r\n  box-shadow: 0 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n.navbar .left-menu {\r\n  line-height: 48px;\r\n  height: 50px;\r\n  float: left;\r\n  padding: 0 10px;\r\n}\r\n\r\n.navbar .left-menu a:link {\r\n  font-size: 18px;\r\n}\r\n.navbar .left-menu a:visited {\r\n  text-decoration: none;\r\n  color: #606266;\r\n}\r\n\r\n.navbar .hamburger-container {\r\n  line-height: 58px;\r\n  height: 50px;\r\n  float: left;\r\n  padding: 0 10px;\r\n}\r\n.navbar .breadcrumb-container {\r\n  float: left;\r\n}\r\n.navbar .errLog-container {\r\n  display: inline-block;\r\n  vertical-align: top;\r\n}\r\n.navbar .right-menu {\r\n  line-height: 48px;\r\n  float: right;\r\n  height: 100%;\r\n}\r\n.navbar .right-menu:focus {\r\n  outline: none;\r\n}\r\n.navbar .right-menu .right-menu-item {\r\n  display: inline-block;\r\n  margin: 0 8px;\r\n}\r\n.navbar .right-menu .screenfull {\r\n  height: 20px;\r\n}\r\n.navbar .right-menu .international {\r\n  vertical-align: top;\r\n}\r\n.navbar .right-menu .theme-switch {\r\n  vertical-align: 15px;\r\n}\r\n.navbar .right-menu .avatar-container {\r\n  height: 50px;\r\n  margin-right: 30px;\r\n}\r\n\r\n.navbar .right-menu .avatar-container .avatar-wrapper {\r\n  margin-top: 5px;\r\n  position: relative;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .user-avatar {\r\n  cursor: pointer;\r\n  width: 40px;\r\n  height: 40px;\r\n  border-radius: 10px;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .user-info {\r\n  max-width: 150px;\r\n  display: inline-block;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n  white-space: nowrap;\r\n  text-align: left;\r\n  vertical-align: top;\r\n  line-height: 16px;\r\n  position: relative;\r\n  top: 6px;\r\n  margin-left: 5px;\r\n  color: #c7c7c7;\r\n}\r\n.navbar .right-menu .avatar-container .avatar-wrapper .el-icon-caret-bottom {\r\n  cursor: pointer;\r\n  position: absolute;\r\n  right: -20px;\r\n  top: 25px;\r\n  font-size: 12px;\r\n  color: #c7c7c7;\r\n}\r\n\r\n.avatar-dropdown a:visited {\r\n  text-decoration: none;\r\n  color: #606266;\r\n}\r\n.avatar-dropdown a:hover {\r\n  color: inherit;\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <template v-if=\"icon\">\r\n      <i v-if=\"icon.includes('el-icon')\" :class=\"[icon, 'sub-el-icon']\" />\r\n      <!-- <svg-icon v-else :icon-class=\"icon\" /> -->\r\n    </template>\r\n    <template v-if=\"title\">\r\n      <span>{{ title }}</span>\r\n    </template>\r\n  </div>\r\n</template>\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'MenuItem',\r\n  props: {\r\n    icon: {\r\n      type: String,\r\n      default: ''\r\n    },\r\n    title: {\r\n      type: String,\r\n      default: ''\r\n    }\r\n  }\r\n  // render(h, context) {\r\n  //   console.log(context)\r\n  //   const { icon, title } = context.props\r\n  //   const vnodes = []\r\n\r\n  //   if (icon) {\r\n  //     if (icon.includes('el-icon')) {\r\n  //       vnodes.push(<i class={[icon, 'sub-el-icon']} />)\r\n  //     } else {\r\n  //       vnodes.push(<svg-icon icon-class={icon} />)\r\n  //     }\r\n  //   }\r\n\r\n  //   if (title) {\r\n  //     vnodes.push(<span>{title}</span>)\r\n  //   }\r\n  //   return vnodes\r\n  // }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.sub-el-icon {\r\n  color: currentColor;\r\n  width: 1em;\r\n  height: 1em;\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <template v-if=\"icon\">\r\n      <i v-if=\"icon.includes('el-icon')\" :class=\"[icon, 'sub-el-icon']\" />\r\n      <!-- <svg-icon v-else :icon-class=\"icon\" /> -->\r\n    </template>\r\n    <template v-if=\"title\">\r\n      <span>{{ title }}</span>\r\n    </template>\r\n  </div>\r\n</template>\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'MenuItem',\r\n  props: {\r\n    icon: {\r\n      type: String,\r\n      default: ''\r\n    },\r\n    title: {\r\n      type: String,\r\n      default: ''\r\n    }\r\n  }\r\n  // render(h, context) {\r\n  //   console.log(context)\r\n  //   const { icon, title } = context.props\r\n  //   const vnodes = []\r\n\r\n  //   if (icon) {\r\n  //     if (icon.includes('el-icon')) {\r\n  //       vnodes.push(<i class={[icon, 'sub-el-icon']} />)\r\n  //     } else {\r\n  //       vnodes.push(<svg-icon icon-class={icon} />)\r\n  //     }\r\n  //   }\r\n\r\n  //   if (title) {\r\n  //     vnodes.push(<span>{title}</span>)\r\n  //   }\r\n  //   return vnodes\r\n  // }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.sub-el-icon {\r\n  color: currentColor;\r\n  width: 1em;\r\n  height: 1em;\r\n}\r\n</style>\r\n","<template>\r\n  <div v-if=\"item.visible\">\r\n    <template\r\n      v-if=\"\r\n        onlyOneChild &&\r\n          (!onlyOneChild.children || onlyOneChild.noShowingChildren) &&\r\n          !item.alwaysShow\r\n      \"\r\n    >\r\n      <router-link\r\n        v-if=\"onlyOneChild\"\r\n        :to=\"onlyOneChild.path || onlyOneChild.url\"\r\n      >\r\n        <el-menu-item\r\n          :index=\"onlyOneChild.path || onlyOneChild.url\"\r\n          :class=\"{ 'submenu-title-noDropdown': !isNest }\"\r\n        >\r\n          <item :title=\"onlyOneChild.displayName\" />\r\n        </el-menu-item>\r\n      </router-link>\r\n    </template>\r\n\r\n    <el-sub-menu v-else ref=\"subMenu\" :index=\"item.path || item.url\" teleported>\r\n      <template v-slot:title>\r\n        <item\r\n          v-if=\"item\"\r\n          :icon=\"item.meta && item.meta.icon\"\r\n          :title=\"item.displayName\"\r\n        />\r\n      </template>\r\n      <sidebar-item\r\n        v-for=\"child in item.children\"\r\n        :key=\"child.path\"\r\n        :is-nest=\"true\"\r\n        :item=\"child\"\r\n        :base-path=\"child.path\"\r\n        class=\"nest-menu\"\r\n      />\r\n    </el-sub-menu>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nimport Item from './Item.vue'\r\n\r\nexport default defineComponent({\r\n  name: 'SidebarItem',\r\n  components: { Item },\r\n  props: {\r\n    // route object\r\n    item: {\r\n      type: Object,\r\n      required: true\r\n    },\r\n    isNest: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    basePath: {\r\n      type: String,\r\n      default: ''\r\n    }\r\n  },\r\n  computed: {\r\n    onlyOneChild() {\r\n      const vm = this as any\r\n      const children = vm.item.children\r\n      const parent = vm.item\r\n      let showingChildren = []\r\n      let child = null\r\n      if (children) {\r\n        showingChildren = children.filter((item: any) => {\r\n          if (item.hidden) {\r\n            return false\r\n          } else {\r\n            // Temp set(will be used if only has one showing child)\r\n            child = item\r\n\r\n            return true\r\n          }\r\n        })\r\n      }\r\n\r\n      // When there is only one child router, the child router is displayed by default\r\n      if (showingChildren.length === 1) {\r\n        return child\r\n      }\r\n\r\n      // Show parent if there are no child router to display\r\n      if (showingChildren.length === 0) {\r\n        child = { ...parent, /*: '',*/ noShowingChildren: true }\r\n        return child\r\n      }\r\n\r\n      return null\r\n    }\r\n  }\r\n  // methods: {\r\n  //   hasOneShowingChild(children: any[] = [], parent: any) {\r\n  //     let showingChildren = []\r\n  //     if (children) {\r\n  //       showingChildren = children.filter((item) => {\r\n  //         if (item.hidden) {\r\n  //           return false\r\n  //         } else {\r\n  //           // Temp set(will be used if only has one showing child)\r\n  //           this.onlyOneChild = item\r\n\r\n  //           return true\r\n  //         }\r\n  //       })\r\n  //     }\r\n\r\n  //     // When there is only one child router, the child router is displayed by default\r\n  //     if (showingChildren.length === 1) {\r\n  //       return true\r\n  //     }\r\n\r\n  //     // Show parent if there are no child router to display\r\n  //     if (showingChildren.length === 0) {\r\n  //       this.onlyOneChild = { ...parent, /*: '',*/ noShowingChildren: true }\r\n  //       return true\r\n  //     }\r\n\r\n  //     return false\r\n  //   }\r\n  // }\r\n})\r\n</script>\r\n","<template>\r\n  <div v-if=\"item.visible\">\r\n    <template\r\n      v-if=\"\r\n        onlyOneChild &&\r\n          (!onlyOneChild.children || onlyOneChild.noShowingChildren) &&\r\n          !item.alwaysShow\r\n      \"\r\n    >\r\n      <router-link\r\n        v-if=\"onlyOneChild\"\r\n        :to=\"onlyOneChild.path || onlyOneChild.url\"\r\n      >\r\n        <el-menu-item\r\n          :index=\"onlyOneChild.path || onlyOneChild.url\"\r\n          :class=\"{ 'submenu-title-noDropdown': !isNest }\"\r\n        >\r\n          <item :title=\"onlyOneChild.displayName\" />\r\n        </el-menu-item>\r\n      </router-link>\r\n    </template>\r\n\r\n    <el-sub-menu v-else ref=\"subMenu\" :index=\"item.path || item.url\" teleported>\r\n      <template v-slot:title>\r\n        <item\r\n          v-if=\"item\"\r\n          :icon=\"item.meta && item.meta.icon\"\r\n          :title=\"item.displayName\"\r\n        />\r\n      </template>\r\n      <sidebar-item\r\n        v-for=\"child in item.children\"\r\n        :key=\"child.path\"\r\n        :is-nest=\"true\"\r\n        :item=\"child\"\r\n        :base-path=\"child.path\"\r\n        class=\"nest-menu\"\r\n      />\r\n    </el-sub-menu>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nimport Item from './Item.vue'\r\n\r\nexport default defineComponent({\r\n  name: 'SidebarItem',\r\n  components: { Item },\r\n  props: {\r\n    // route object\r\n    item: {\r\n      type: Object,\r\n      required: true\r\n    },\r\n    isNest: {\r\n      type: Boolean,\r\n      default: false\r\n    },\r\n    basePath: {\r\n      type: String,\r\n      default: ''\r\n    }\r\n  },\r\n  computed: {\r\n    onlyOneChild() {\r\n      const vm = this as any\r\n      const children = vm.item.children\r\n      const parent = vm.item\r\n      let showingChildren = []\r\n      let child = null\r\n      if (children) {\r\n        showingChildren = children.filter((item: any) => {\r\n          if (item.hidden) {\r\n            return false\r\n          } else {\r\n            // Temp set(will be used if only has one showing child)\r\n            child = item\r\n\r\n            return true\r\n          }\r\n        })\r\n      }\r\n\r\n      // When there is only one child router, the child router is displayed by default\r\n      if (showingChildren.length === 1) {\r\n        return child\r\n      }\r\n\r\n      // Show parent if there are no child router to display\r\n      if (showingChildren.length === 0) {\r\n        child = { ...parent, /*: '',*/ noShowingChildren: true }\r\n        return child\r\n      }\r\n\r\n      return null\r\n    }\r\n  }\r\n  // methods: {\r\n  //   hasOneShowingChild(children: any[] = [], parent: any) {\r\n  //     let showingChildren = []\r\n  //     if (children) {\r\n  //       showingChildren = children.filter((item) => {\r\n  //         if (item.hidden) {\r\n  //           return false\r\n  //         } else {\r\n  //           // Temp set(will be used if only has one showing child)\r\n  //           this.onlyOneChild = item\r\n\r\n  //           return true\r\n  //         }\r\n  //       })\r\n  //     }\r\n\r\n  //     // When there is only one child router, the child router is displayed by default\r\n  //     if (showingChildren.length === 1) {\r\n  //       return true\r\n  //     }\r\n\r\n  //     // Show parent if there are no child router to display\r\n  //     if (showingChildren.length === 0) {\r\n  //       this.onlyOneChild = { ...parent, /*: '',*/ noShowingChildren: true }\r\n  //       return true\r\n  //     }\r\n\r\n  //     return false\r\n  //   }\r\n  // }\r\n})\r\n</script>\r\n","<template>\r\n  <div class=\"box\">\r\n    <el-scrollbar wrap-class=\"scrollbar-wrapper\">\r\n      <el-menu\r\n        :default-active=\"$route.path\"\r\n        :collapse=\"isCollapse\"\r\n        background-color=\"#333333\"\r\n        text-color=\"#bfcbd9\"\r\n        :unique-opened=\"true\"\r\n        active-text-color=\"#409EFF\"\r\n        :collapse-transition=\"false\"\r\n        mode=\"vertical\"\r\n      >\r\n        <sidebar-item\r\n          v-for=\"route in menuRouters\"\r\n          :key=\"route.path\"\r\n          :item=\"route\"\r\n          :base-path=\"route.path\"\r\n        />\r\n      </el-menu>\r\n    </el-scrollbar>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { getMenu } from '@/utils/menu';\r\nimport { defineComponent } from 'vue';\r\nimport SidebarItem from './SidebarItem.vue';\r\n\r\nexport default defineComponent({\r\n  name: 'Sidebar',\r\n  components: { SidebarItem },\r\n  computed: {\r\n    menuRouters(): any {\r\n      const vm = this;\r\n      let menuRouters = vm.$store.getters.menuRouters;\r\n\r\n      if (menuRouters && menuRouters.length > 0) {\r\n        return menuRouters;\r\n      }\r\n\r\n      const menus = getMenu();\r\n      if (menus && menus.length > 0) {\r\n        // 将菜单数据转化成路由以及菜单信息\r\n        const accessedRouters = menus;\r\n\r\n        // 设置路由信息\r\n        vm.$store.dispatch('generateRoutes', accessedRouters);\r\n\r\n        // 添加路由信息\r\n        const addRouters = vm.$store.getters.addRouters;\r\n        if (addRouters) {\r\n          addRouters.forEach((e: any) => {\r\n            vm.$router.addRoute(e); // 动态添加可访问路由表\r\n          });\r\n        }\r\n      }\r\n\r\n      menuRouters = vm.$store.getters.menuRouters;\r\n\r\n      return menuRouters;\r\n    },\r\n    sidebar(): any {\r\n      return this.$store.getters.sidebar;\r\n    },\r\n    isCollapse(): any {\r\n      return !(this as any).sidebar.opened;\r\n    },\r\n  },\r\n  data() {\r\n    return {\r\n      active: '1-1-1',\r\n      data: [],\r\n    };\r\n  },\r\n  created() {\r\n    // window.menuRouters = this.menuRouters\r\n    // console.log(this.menuRouters)\r\n  },\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.box-wrap {\r\n  display: -moz-flex;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  height: auto;\r\n}\r\n.box {\r\n  width: auto;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"box\">\r\n    <el-scrollbar wrap-class=\"scrollbar-wrapper\">\r\n      <el-menu\r\n        :default-active=\"$route.path\"\r\n        :collapse=\"isCollapse\"\r\n        background-color=\"#333333\"\r\n        text-color=\"#bfcbd9\"\r\n        :unique-opened=\"true\"\r\n        active-text-color=\"#409EFF\"\r\n        :collapse-transition=\"false\"\r\n        mode=\"vertical\"\r\n      >\r\n        <sidebar-item\r\n          v-for=\"route in menuRouters\"\r\n          :key=\"route.path\"\r\n          :item=\"route\"\r\n          :base-path=\"route.path\"\r\n        />\r\n      </el-menu>\r\n    </el-scrollbar>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { getMenu } from '@/utils/menu';\r\nimport { defineComponent } from 'vue';\r\nimport SidebarItem from './SidebarItem.vue';\r\n\r\nexport default defineComponent({\r\n  name: 'Sidebar',\r\n  components: { SidebarItem },\r\n  computed: {\r\n    menuRouters(): any {\r\n      const vm = this;\r\n      let menuRouters = vm.$store.getters.menuRouters;\r\n\r\n      if (menuRouters && menuRouters.length > 0) {\r\n        return menuRouters;\r\n      }\r\n\r\n      const menus = getMenu();\r\n      if (menus && menus.length > 0) {\r\n        // 将菜单数据转化成路由以及菜单信息\r\n        const accessedRouters = menus;\r\n\r\n        // 设置路由信息\r\n        vm.$store.dispatch('generateRoutes', accessedRouters);\r\n\r\n        // 添加路由信息\r\n        const addRouters = vm.$store.getters.addRouters;\r\n        if (addRouters) {\r\n          addRouters.forEach((e: any) => {\r\n            vm.$router.addRoute(e); // 动态添加可访问路由表\r\n          });\r\n        }\r\n      }\r\n\r\n      menuRouters = vm.$store.getters.menuRouters;\r\n\r\n      return menuRouters;\r\n    },\r\n    sidebar(): any {\r\n      return this.$store.getters.sidebar;\r\n    },\r\n    isCollapse(): any {\r\n      return !(this as any).sidebar.opened;\r\n    },\r\n  },\r\n  data() {\r\n    return {\r\n      active: '1-1-1',\r\n      data: [],\r\n    };\r\n  },\r\n  created() {\r\n    // window.menuRouters = this.menuRouters\r\n    // console.log(this.menuRouters)\r\n  },\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.box-wrap {\r\n  display: -moz-flex;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n  height: auto;\r\n}\r\n.box {\r\n  width: auto;\r\n}\r\n</style>\r\n","<template>\r\n  <section class=\"app-main\">\r\n    <!-- <keep-alive :include=\"cachedViews\"> -->\r\n    <router-view :key=\"key\" />\r\n    <!-- </keep-alive> -->\r\n  </section>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'AppMain',\r\n  computed: {\r\n    // cachedViews() {\r\n    //   return this.$store.state.tagsView.cachedViews\r\n    // },\r\n    key() {\r\n      return this.$route.fullPath\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.app-main {\r\n  min-height: 100%;\r\n  width: 100%;\r\n  position: relative;\r\n  overflow: hidden;\r\n  padding: 0px 0px 0px 15px;\r\n}\r\n</style>\r\n","<template>\r\n  <section class=\"app-main\">\r\n    <!-- <keep-alive :include=\"cachedViews\"> -->\r\n    <router-view :key=\"key\" />\r\n    <!-- </keep-alive> -->\r\n  </section>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n  name: 'AppMain',\r\n  computed: {\r\n    // cachedViews() {\r\n    //   return this.$store.state.tagsView.cachedViews\r\n    // },\r\n    key() {\r\n      return this.$route.fullPath\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.app-main {\r\n  min-height: 100%;\r\n  width: 100%;\r\n  position: relative;\r\n  overflow: hidden;\r\n  padding: 0px 0px 0px 15px;\r\n}\r\n</style>\r\n","const { body } = document\r\nconst WIDTH = 1024\r\nconst RATIO = 3\r\n\r\nexport default {\r\n  data() {\r\n    return {\r\n      currentDevice: 'desktop',\r\n    }\r\n  },\r\n  watch: {\r\n    $route() {\r\n      if (this.device === 'mobile' && this.sidebar.opened) {\r\n        this.currentDevice = 'mobile'\r\n        this.$store.dispatch('closeSideBar', { withoutAnimation: false })\r\n      }\r\n    },\r\n  },\r\n  beforeMount() {\r\n    window.addEventListener('resize', this.resizeHandler)\r\n  },\r\n  mounted() {\r\n    const isMobile = this.isMobile()\r\n    if (isMobile) {\r\n      this.currentDevice = 'mobile'\r\n      this.$store.dispatch('toggleDevice', 'mobile')\r\n      this.$store.dispatch('closeSideBar', { withoutAnimation: true })\r\n    }\r\n  },\r\n  methods: {\r\n    isMobile() {\r\n      const rect = body.getBoundingClientRect()\r\n      return rect.width - RATIO < WIDTH\r\n    },\r\n    resizeHandler() {\r\n      if (!document.hidden) {\r\n        const isMobile = this.isMobile()\r\n        if (isMobile && this.currentDevice !== 'mobile') {\r\n          this.currentDevice = 'mobile'\r\n          this.$store.dispatch('toggleDevice', 'mobile')\r\n          this.$store.dispatch('closeSideBar', { withoutAnimation: true })\r\n        } else if (!isMobile && this.currentDevice !== 'desktop') {\r\n          this.currentDevice = 'desktop'\r\n          this.$store.dispatch('toggleDevice', 'desktop')\r\n          this.$store.dispatch('toggleSideBar')\r\n        }\r\n      }\r\n    },\r\n  },\r\n}\r\n","<template>\r\n  <div :class=\"classObj\" class=\"app-wrapper\">\r\n    <div>\r\n      <div\r\n        v-show=\"!hiddenLayout && device === 'mobile' && sidebar.opened\"\r\n        class=\"drawer-bg\"\r\n        @click=\"handleClickOutside\"\r\n      />\r\n      <navbar v-show=\"!hiddenLayout\" />\r\n      <sidebar v-show=\"!hiddenLayout\" class=\"sidebar sidebar-container\" />\r\n      <div :class=\"classAppMain\" class=\"main\">\r\n        <app-main></app-main>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script>\r\nimport { Navbar, Sidebar, AppMain } from '@/views/layout/components';\r\nimport ResizeMixin from '@/views/layout/mixin/ResizeHandler';\r\n\r\nexport default {\r\n  components: {\r\n    Navbar,\r\n    Sidebar,\r\n    AppMain,\r\n  },\r\n  mixins: [ResizeMixin],\r\n  computed: {\r\n    sidebar() {\r\n      return this.$store.state.app.sidebar;\r\n    },\r\n    device() {\r\n      return this.$store.state.app.device;\r\n    },\r\n    hiddenLayout() {\r\n      let query = this.$route.query;\r\n      return query.hiddenLayout === 'true' || query.hl === 'true';\r\n    },\r\n    classObj() {\r\n      return {\r\n        hideSidebar: !this.sidebar.opened,\r\n        openSidebar: this.sidebar.opened,\r\n        withoutAnimation: this.sidebar.withoutAnimation,\r\n        mobile: this.device === 'mobile',\r\n      };\r\n    },\r\n    classAppMain() {\r\n      return {\r\n        hiddenLayout: this.hiddenLayout,\r\n        hideSidebarMain: !this.sidebar.opened,\r\n        openSidebarMain: this.sidebar.opened,\r\n      };\r\n    },\r\n  },\r\n  methods: {\r\n    handleClickOutside() {\r\n      this.$store.dispatch('closeSideBar', { withoutAnimation: false });\r\n    },\r\n  },\r\n};\r\n</script>\r\n\r\n<style>\r\n.app-wrapper {\r\n  position: relative;\r\n  height: 100%;\r\n  width: 100%;\r\n}\r\n\r\n.sidebar {\r\n  position: fixed;\r\n  top: 50px;\r\n  bottom: 0;\r\n  height: 100%;\r\n}\r\n\r\n.main {\r\n  position: fixed;\r\n  top: 50px;\r\n  bottom: 0;\r\n  height: 100%;\r\n}\r\n\r\n.hideSidebarMain {\r\n  left: 0px;\r\n  width: -webkit-calc(100% - 40px);\r\n  width: -moz-calc(100% - 40px);\r\n  width: calc(100% - 40px);\r\n}\r\n\r\n.openSidebarMain {\r\n  left: 210px;\r\n  width: -webkit-calc(100% - 240px);\r\n  width: -moz-calc(100% - 240px);\r\n  width: calc(100% - 240px);\r\n}\r\n\r\n.hiddenLayout {\r\n  left: 0px;\r\n  width: -webkit-calc(100% - 40px);\r\n  width: -moz-calc(100% - 40px);\r\n  width: calc(100% - 40px);\r\n  top: 0px;\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.drawer-bg {\r\n  background: #000;\r\n  opacity: 0.3;\r\n  width: 100%;\r\n  top: 0;\r\n  height: 100%;\r\n  position: fixed;\r\n  z-index: 999;\r\n}\r\n</style>\r\n","<script lang=\"ts\">\r\nimport { setMenu } from '@/utils/menu'\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'AuthRedirect',\r\n  async created() {\r\n    let vm = this\r\n    const redirect = vm.$route.query.redirect || '/'\r\n    let token = vm.$route.hash.replace('#token=', '')\r\n    vm.$store.dispatch('setToken', token)\r\n    // 报错解决:Redirected when going from \"/auth-redirect\" to \"/Admin/User\" via a navigation guard\r\n    // https://blog.csdn.net/Tom__cy/article/details/112846816\r\n    // 获取用户信息\r\n    vm.$api.user.getUserInfo().then((response: any) => {\r\n      const data = response.data\r\n      // 设置用户信息\r\n      vm.$store.dispatch('setUserInfo', data)\r\n    })\r\n\r\n    // 获取菜单信息, 将请求回来的菜单转化成路由以及菜单信息\r\n    vm.$api.menu.getMenu().then((routeRes: any) => {\r\n      const accessedRouters = routeRes.data\r\n\r\n      // 保存一份在浏览器\r\n      setMenu(accessedRouters)\r\n\r\n      // 设置路由信息\r\n      vm.$store.dispatch('generateRoutes', accessedRouters)\r\n\r\n      // 添加路由信息\r\n      const addRouters = vm.$store.getters.addRouters\r\n      if (addRouters) {\r\n        addRouters.forEach((e: any) => {\r\n          vm.$router.addRoute(e) // 动态添加可访问路由表\r\n        })\r\n      }\r\n\r\n      vm.$router.push({ path: redirect } as any)\r\n    })\r\n  },\r\n  render() {\r\n    return ''\r\n  }\r\n})\r\n</script>\r\n","<template>\n  <div>\n    <p>This is umi docs.</p>\n  </div>\n</template>\n","<template>\n  <div>\n    <h2>Yay! Welcome to umi ❤️ vue!</h2>\n    <p>\n      <!-- <img src=\"../assets/yay.jpg\" width=\"388\" /> -->\n    </p>\n    <p>To get started, edit <code>pages/index.vue</code> and save to reload.</p>\n  </div>\n</template>\n","<template>\r\n  <div class=\"center\">\r\n    <div class=\"login-col\">\r\n      <!-- Login -->\r\n      <div>\r\n        <!-- Logo-->\r\n        <el-row>\r\n          <el-col :span=\"24\" class=\"login-logo\">\r\n            <i class=\"el-icon-cloudy\"></i>\r\n          </el-col>\r\n        </el-row>\r\n        <template v-if=\"loginConfig.allowLogin\">\r\n          <el-form :model=\"loginForm\" size=\"default\" class=\"cube-login\">\r\n            <!-- 登录-->\r\n            <span class=\"heading text-primary\">{{ displayName }} 登录</span>\r\n            <el-form-item label>\r\n              <el-input\r\n                v-model=\"loginForm.username\"\r\n                placeholder=\"用户名 / 邮箱\"\r\n                prefix-icon=\"el-icon-user\"\r\n              ></el-input>\r\n            </el-form-item>\r\n\r\n            <el-form-item label>\r\n              <el-input\r\n                v-model=\"loginForm.password\"\r\n                placeholder=\"密码\"\r\n                prefix-icon=\"el-icon-lock\"\r\n                show-password\r\n              ></el-input>\r\n            </el-form-item>\r\n            <el-form-item label>\r\n              <el-checkbox\r\n                class=\"text text-primary\"\r\n                v-model=\"loginForm.remember\"\r\n              >\r\n                记住我\r\n              </el-checkbox>\r\n\r\n              <!-- <template v-if=\"loginConfig.allowRegister\">\r\n                <div\r\n                  style=\"display: inline-block; margin-top: 5px; float: right;\"\r\n                >\r\n                  <a\r\n                    href=\"#Register\"\r\n                    data-toggle=\"tab\"\r\n                    style=\"margin-left: auto; margin-right: auto; position: static; font-size: 15px; margin-top: 5px;\"\r\n                  >\r\n                    <span>我要注册</span>\r\n                  </a>\r\n                </div>\r\n              </template>-->\r\n            </el-form-item>\r\n          </el-form>\r\n\r\n          <button class=\"btn\" @click=\"login\">登录</button>\r\n        </template>\r\n      </div>\r\n      <!-- Login3 -->\r\n      <div v-if=\"loginConfig.providers.length > 0\" class=\"center\">\r\n        <p class=\"login3\">\r\n          <span class=\"left\"></span>\r\n          第三方登录\r\n          <span class=\"right\"></span>\r\n        </p>\r\n\r\n        <el-row>\r\n          <el-col :sm=\"24\">\r\n            <a\r\n              v-for=\"(mi, i) in loginConfig.providers\"\r\n              :key=\"i\"\r\n              :title=\"mi.nickName || mi.name\"\r\n              @click=\"ssoClick(getUrl(mi))\"\r\n            >\r\n              <img\r\n                v-if=\"mi.logo\"\r\n                :src=\"getLogoUrl(mi.logo)\"\r\n                style=\"width: 64px; height: 64px\"\r\n              />\r\n              <template v-else>{{ mi.nickName || mi.name }}</template>\r\n            </a>\r\n          </el-col>\r\n        </el-row>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { setMenu } from '@/utils/menu';\r\nimport { defineComponent } from 'vue';\r\nexport default defineComponent({\r\n  data() {\r\n    return {\r\n      loginForm: {\r\n        username: null,\r\n        password: null,\r\n        remember: true,\r\n      },\r\n    };\r\n  },\r\n  computed: {\r\n    sysConfig() {\r\n      return this.$store.getters.sysConfig;\r\n    },\r\n    loginConfig() {\r\n      let vm = this;\r\n      let loginConfig = vm.$store.getters.loginConfig;\r\n      if (!loginConfig) {\r\n        loginConfig = {\r\n          displayName: '魔方',\r\n          logo: '', // 系统logo\r\n          allowLogin: true,\r\n          allowRegister: true,\r\n          providers: [],\r\n        };\r\n      }\r\n      return loginConfig;\r\n    },\r\n    baseUrl() {\r\n      return this.$store.getters.urls.baseUrl;\r\n    },\r\n    redirect() {\r\n      return this.$route.query.redirect;\r\n    },\r\n    displayName() {\r\n      let vm = this as any;\r\n      return (\r\n        (vm.sysConfig && vm.sysConfig.displayName) ||\r\n        (vm.loginConfig && vm.loginConfig.displayName)\r\n      );\r\n    },\r\n  },\r\n  created() {\r\n    let vm = this;\r\n    try {\r\n      // 关闭所有弹窗\r\n      vm.$messageBox.close();\r\n    } catch (error) {}\r\n    // 为了本地快速检查是否需要自动跳转第三方登录,使用缓存的配置立即进行检查跳转\r\n    vm.autoAuthRedirect();\r\n\r\n    // 获取一次登录设置,如果跳转了第三方登录,会被强制取消\r\n    vm.$api.config.getLoginConfig().then((res: any) => {\r\n      let cfg = res.data;\r\n      vm.$store.dispatch('setLoginConfig', cfg);\r\n    });\r\n  },\r\n  methods: {\r\n    login() {\r\n      let vm = this;\r\n      vm.$api.user.login(vm.loginForm).then(async (response: any) => {\r\n        const data = response.data;\r\n        let token = data.token;\r\n        await vm.$store.dispatch('setToken', token);\r\n\r\n        // 获取用户信息\r\n        vm.$api.user.getUserInfo().then((response: any) => {\r\n          const data = response.data;\r\n          // 设置用户信息\r\n          vm.$store.dispatch('setUserInfo', data);\r\n        });\r\n\r\n        // 获取菜单信息, 将请求回来的菜单转化成路由以及菜单信息\r\n        vm.$api.menu.getMenu().then((routeRes: any) => {\r\n          const accessedRouters = routeRes.data;\r\n\r\n          // 保存一份在浏览器\r\n          setMenu(accessedRouters);\r\n\r\n          // 设置路由信息\r\n          vm.$store.dispatch('generateRoutes', accessedRouters);\r\n\r\n          // 添加路由信息\r\n          const addRouters = vm.$store.getters.addRouters;\r\n          if (addRouters) {\r\n            addRouters.forEach((e: any) => {\r\n              vm.$router.addRoute(e); // 动态添加可访问路由表\r\n            });\r\n          }\r\n\r\n          vm.$router.push({ path: vm.redirect || '/' } as any);\r\n        });\r\n\r\n        // 拉取系统配置信息\r\n        vm.$api.config.getObject('/Admin/Sys').then((res: any) => {\r\n          const cfg = res.data.value;\r\n          vm.$store.dispatch('setSysConfig', cfg);\r\n        });\r\n      });\r\n    },\r\n    ssoClick(url: any) {\r\n      location.href = this.baseUrl + url;\r\n      // location.href = urls.ssoUrl + url\r\n    },\r\n    getUrl(mi: any) {\r\n      // console.log(mi)\r\n      let vm = this;\r\n      // let name = 'NewLife.Cube'\r\n      let url = `/Sso/Login?name=${mi.name}&source=front-end`;\r\n      // let url = `/sso/authorize?response_type=token&client_id=${name}`\r\n      let redirect_uri = encodeURIComponent(\r\n        location.origin +\r\n          '/auth-redirect' +\r\n          (vm.redirect ? '?redirect=' + vm.redirect : ''),\r\n      );\r\n      url += `&redirect_uri=${redirect_uri}`;\r\n      return url;\r\n    },\r\n    getLogoUrl(logo: any) {\r\n      let vm = this;\r\n      if (logo.indexOf('http') !== 0) {\r\n        logo = vm.baseUrl + logo;\r\n      }\r\n      return logo;\r\n    },\r\n    autoAuthRedirect() {\r\n      // 根据设置,如果不允许密码登录,且只有一个第三方登录,自动跳转\r\n      let vm = this;\r\n      let loginConfig = vm.loginConfig;\r\n      if (\r\n        loginConfig &&\r\n        !loginConfig.allowLogin &&\r\n        loginConfig.providers.length === 1\r\n      ) {\r\n        vm.ssoClick(vm.getUrl(loginConfig.providers[0]));\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<!-- Login -->\r\n<style scoped>\r\n.login-logo {\r\n  text-align: center;\r\n  font-size: 130px;\r\n  color: #4ca6ff;\r\n  margin-top: 50px;\r\n}\r\n\r\n.cube-login {\r\n  background: #fff;\r\n  padding-bottom: 0;\r\n  border-radius: 15px;\r\n  text-align: center;\r\n}\r\n\r\n.cube-login .heading {\r\n  display: block;\r\n  font-size: 24px;\r\n  font-weight: 700;\r\n  padding: 5px 0;\r\n  margin-bottom: 20px;\r\n  text-align: center;\r\n}\r\n\r\n.cube-login input {\r\n  border-radius: 20px;\r\n  box-shadow: none;\r\n  padding: 0 20px 0 45px;\r\n  height: 40px;\r\n  transition: all 0.3s ease 0s;\r\n}\r\n\r\n.cube-login .text {\r\n  float: left;\r\n  margin-left: 7px;\r\n  line-height: 20px;\r\n  padding-top: 5px;\r\n  text-transform: capitalize;\r\n}\r\n\r\n.cube-login a {\r\n  position: absolute;\r\n  top: 12px;\r\n  right: 0px;\r\n  font-size: 17px;\r\n  color: #c8c8c8;\r\n  transition: all 0.5s ease 0s;\r\n  color: #4ca6ff;\r\n}\r\n\r\n.el-input input {\r\n  border-radius: 20px;\r\n  box-shadow: none;\r\n  padding: 0 20px 0 45px;\r\n  height: 40px;\r\n  transition: all 0.3s ease 0s;\r\n  font-size: 14px;\r\n  line-height: 1.42857143;\r\n  color: #555;\r\n  background-color: #fff;\r\n  background-image: none;\r\n  border: 1px solid #ccc;\r\n}\r\n\r\n.btn {\r\n  float: right;\r\n  font-size: 14px;\r\n  color: #fff;\r\n  background: #00b4ef;\r\n  /* border-radius: 30px; */\r\n  border-radius: 4px;\r\n  padding: 8px 50px;\r\n  border: none;\r\n  text-transform: capitalize;\r\n  transition: all 0.5s ease 0s;\r\n  margin: -25px 0 15px 0;\r\n  width: 100%;\r\n}\r\n\r\n.text-primary {\r\n  color: #337ab7;\r\n}\r\n\r\nlabel {\r\n  display: inline-block;\r\n  max-width: 100%;\r\n  margin-bottom: 5px;\r\n  font-weight: 700;\r\n}\r\n</style>\r\n<!-- Login3 -->\r\n<style scoped>\r\np.login3 {\r\n  font-size: 22px;\r\n  position: relative;\r\n  width: 100%;\r\n  color: #333;\r\n  text-align: center;\r\n}\r\n\r\np.login3 span {\r\n  height: 1px;\r\n  position: absolute;\r\n  background-color: #928f8f;\r\n  width: 35%;\r\n  top: 50%;\r\n}\r\n\r\np.login3 span.right {\r\n  right: 65%;\r\n}\r\n\r\np.login3 span.left {\r\n  left: 65%;\r\n}\r\n\r\n.center {\r\n  display: flex;\r\n  width: 100%;\r\n  flex-direction: column;\r\n  align-items: center;\r\n}\r\n\r\n@media screen and (max-width: 680px) {\r\n  .login-col {\r\n    width: 80%;\r\n  }\r\n}\r\n\r\n@media screen and (min-width: 680px) and (max-width: 1680px) {\r\n  .login-col {\r\n    width: 30%;\r\n  }\r\n}\r\n\r\n@media screen and (min-width: 1680px) {\r\n  .login-col {\r\n    width: 445px;\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"center\">\r\n    <div class=\"login-col\">\r\n      <!-- Login -->\r\n      <div>\r\n        <!-- Logo-->\r\n        <el-row>\r\n          <el-col :span=\"24\" class=\"login-logo\">\r\n            <i class=\"el-icon-cloudy\"></i>\r\n          </el-col>\r\n        </el-row>\r\n        <template v-if=\"loginConfig.allowLogin\">\r\n          <el-form :model=\"loginForm\" size=\"default\" class=\"cube-login\">\r\n            <!-- 登录-->\r\n            <span class=\"heading text-primary\">{{ displayName }} 登录</span>\r\n            <el-form-item label>\r\n              <el-input\r\n                v-model=\"loginForm.username\"\r\n                placeholder=\"用户名 / 邮箱\"\r\n                prefix-icon=\"el-icon-user\"\r\n              ></el-input>\r\n            </el-form-item>\r\n\r\n            <el-form-item label>\r\n              <el-input\r\n                v-model=\"loginForm.password\"\r\n                placeholder=\"密码\"\r\n                prefix-icon=\"el-icon-lock\"\r\n                show-password\r\n              ></el-input>\r\n            </el-form-item>\r\n            <el-form-item label>\r\n              <el-checkbox\r\n                class=\"text text-primary\"\r\n                v-model=\"loginForm.remember\"\r\n              >\r\n                记住我\r\n              </el-checkbox>\r\n\r\n              <!-- <template v-if=\"loginConfig.allowRegister\">\r\n                <div\r\n                  style=\"display: inline-block; margin-top: 5px; float: right;\"\r\n                >\r\n                  <a\r\n                    href=\"#Register\"\r\n                    data-toggle=\"tab\"\r\n                    style=\"margin-left: auto; margin-right: auto; position: static; font-size: 15px; margin-top: 5px;\"\r\n                  >\r\n                    <span>我要注册</span>\r\n                  </a>\r\n                </div>\r\n              </template>-->\r\n            </el-form-item>\r\n          </el-form>\r\n\r\n          <button class=\"btn\" @click=\"login\">登录</button>\r\n        </template>\r\n      </div>\r\n      <!-- Login3 -->\r\n      <div v-if=\"loginConfig.providers.length > 0\" class=\"center\">\r\n        <p class=\"login3\">\r\n          <span class=\"left\"></span>\r\n          第三方登录\r\n          <span class=\"right\"></span>\r\n        </p>\r\n\r\n        <el-row>\r\n          <el-col :sm=\"24\">\r\n            <a\r\n              v-for=\"(mi, i) in loginConfig.providers\"\r\n              :key=\"i\"\r\n              :title=\"mi.nickName || mi.name\"\r\n              @click=\"ssoClick(getUrl(mi))\"\r\n            >\r\n              <img\r\n                v-if=\"mi.logo\"\r\n                :src=\"getLogoUrl(mi.logo)\"\r\n                style=\"width: 64px; height: 64px\"\r\n              />\r\n              <template v-else>{{ mi.nickName || mi.name }}</template>\r\n            </a>\r\n          </el-col>\r\n        </el-row>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { setMenu } from '@/utils/menu';\r\nimport { defineComponent } from 'vue';\r\nexport default defineComponent({\r\n  data() {\r\n    return {\r\n      loginForm: {\r\n        username: null,\r\n        password: null,\r\n        remember: true,\r\n      },\r\n    };\r\n  },\r\n  computed: {\r\n    sysConfig() {\r\n      return this.$store.getters.sysConfig;\r\n    },\r\n    loginConfig() {\r\n      let vm = this;\r\n      let loginConfig = vm.$store.getters.loginConfig;\r\n      if (!loginConfig) {\r\n        loginConfig = {\r\n          displayName: '魔方',\r\n          logo: '', // 系统logo\r\n          allowLogin: true,\r\n          allowRegister: true,\r\n          providers: [],\r\n        };\r\n      }\r\n      return loginConfig;\r\n    },\r\n    baseUrl() {\r\n      return this.$store.getters.urls.baseUrl;\r\n    },\r\n    redirect() {\r\n      return this.$route.query.redirect;\r\n    },\r\n    displayName() {\r\n      let vm = this as any;\r\n      return (\r\n        (vm.sysConfig && vm.sysConfig.displayName) ||\r\n        (vm.loginConfig && vm.loginConfig.displayName)\r\n      );\r\n    },\r\n  },\r\n  created() {\r\n    let vm = this;\r\n    try {\r\n      // 关闭所有弹窗\r\n      vm.$messageBox.close();\r\n    } catch (error) {}\r\n    // 为了本地快速检查是否需要自动跳转第三方登录,使用缓存的配置立即进行检查跳转\r\n    vm.autoAuthRedirect();\r\n\r\n    // 获取一次登录设置,如果跳转了第三方登录,会被强制取消\r\n    vm.$api.config.getLoginConfig().then((res: any) => {\r\n      let cfg = res.data;\r\n      vm.$store.dispatch('setLoginConfig', cfg);\r\n    });\r\n  },\r\n  methods: {\r\n    login() {\r\n      let vm = this;\r\n      vm.$api.user.login(vm.loginForm).then(async (response: any) => {\r\n        const data = response.data;\r\n        let token = data.token;\r\n        await vm.$store.dispatch('setToken', token);\r\n\r\n        // 获取用户信息\r\n        vm.$api.user.getUserInfo().then((response: any) => {\r\n          const data = response.data;\r\n          // 设置用户信息\r\n          vm.$store.dispatch('setUserInfo', data);\r\n        });\r\n\r\n        // 获取菜单信息, 将请求回来的菜单转化成路由以及菜单信息\r\n        vm.$api.menu.getMenu().then((routeRes: any) => {\r\n          const accessedRouters = routeRes.data;\r\n\r\n          // 保存一份在浏览器\r\n          setMenu(accessedRouters);\r\n\r\n          // 设置路由信息\r\n          vm.$store.dispatch('generateRoutes', accessedRouters);\r\n\r\n          // 添加路由信息\r\n          const addRouters = vm.$store.getters.addRouters;\r\n          if (addRouters) {\r\n            addRouters.forEach((e: any) => {\r\n              vm.$router.addRoute(e); // 动态添加可访问路由表\r\n            });\r\n          }\r\n\r\n          vm.$router.push({ path: vm.redirect || '/' } as any);\r\n        });\r\n\r\n        // 拉取系统配置信息\r\n        vm.$api.config.getObject('/Admin/Sys').then((res: any) => {\r\n          const cfg = res.data.value;\r\n          vm.$store.dispatch('setSysConfig', cfg);\r\n        });\r\n      });\r\n    },\r\n    ssoClick(url: any) {\r\n      location.href = this.baseUrl + url;\r\n      // location.href = urls.ssoUrl + url\r\n    },\r\n    getUrl(mi: any) {\r\n      // console.log(mi)\r\n      let vm = this;\r\n      // let name = 'NewLife.Cube'\r\n      let url = `/Sso/Login?name=${mi.name}&source=front-end`;\r\n      // let url = `/sso/authorize?response_type=token&client_id=${name}`\r\n      let redirect_uri = encodeURIComponent(\r\n        location.origin +\r\n          '/auth-redirect' +\r\n          (vm.redirect ? '?redirect=' + vm.redirect : ''),\r\n      );\r\n      url += `&redirect_uri=${redirect_uri}`;\r\n      return url;\r\n    },\r\n    getLogoUrl(logo: any) {\r\n      let vm = this;\r\n      if (logo.indexOf('http') !== 0) {\r\n        logo = vm.baseUrl + logo;\r\n      }\r\n      return logo;\r\n    },\r\n    autoAuthRedirect() {\r\n      // 根据设置,如果不允许密码登录,且只有一个第三方登录,自动跳转\r\n      let vm = this;\r\n      let loginConfig = vm.loginConfig;\r\n      if (\r\n        loginConfig &&\r\n        !loginConfig.allowLogin &&\r\n        loginConfig.providers.length === 1\r\n      ) {\r\n        vm.ssoClick(vm.getUrl(loginConfig.providers[0]));\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<!-- Login -->\r\n<style scoped>\r\n.login-logo {\r\n  text-align: center;\r\n  font-size: 130px;\r\n  color: #4ca6ff;\r\n  margin-top: 50px;\r\n}\r\n\r\n.cube-login {\r\n  background: #fff;\r\n  padding-bottom: 0;\r\n  border-radius: 15px;\r\n  text-align: center;\r\n}\r\n\r\n.cube-login .heading {\r\n  display: block;\r\n  font-size: 24px;\r\n  font-weight: 700;\r\n  padding: 5px 0;\r\n  margin-bottom: 20px;\r\n  text-align: center;\r\n}\r\n\r\n.cube-login input {\r\n  border-radius: 20px;\r\n  box-shadow: none;\r\n  padding: 0 20px 0 45px;\r\n  height: 40px;\r\n  transition: all 0.3s ease 0s;\r\n}\r\n\r\n.cube-login .text {\r\n  float: left;\r\n  margin-left: 7px;\r\n  line-height: 20px;\r\n  padding-top: 5px;\r\n  text-transform: capitalize;\r\n}\r\n\r\n.cube-login a {\r\n  position: absolute;\r\n  top: 12px;\r\n  right: 0px;\r\n  font-size: 17px;\r\n  color: #c8c8c8;\r\n  transition: all 0.5s ease 0s;\r\n  color: #4ca6ff;\r\n}\r\n\r\n.el-input input {\r\n  border-radius: 20px;\r\n  box-shadow: none;\r\n  padding: 0 20px 0 45px;\r\n  height: 40px;\r\n  transition: all 0.3s ease 0s;\r\n  font-size: 14px;\r\n  line-height: 1.42857143;\r\n  color: #555;\r\n  background-color: #fff;\r\n  background-image: none;\r\n  border: 1px solid #ccc;\r\n}\r\n\r\n.btn {\r\n  float: right;\r\n  font-size: 14px;\r\n  color: #fff;\r\n  background: #00b4ef;\r\n  /* border-radius: 30px; */\r\n  border-radius: 4px;\r\n  padding: 8px 50px;\r\n  border: none;\r\n  text-transform: capitalize;\r\n  transition: all 0.5s ease 0s;\r\n  margin: -25px 0 15px 0;\r\n  width: 100%;\r\n}\r\n\r\n.text-primary {\r\n  color: #337ab7;\r\n}\r\n\r\nlabel {\r\n  display: inline-block;\r\n  max-width: 100%;\r\n  margin-bottom: 5px;\r\n  font-weight: 700;\r\n}\r\n</style>\r\n<!-- Login3 -->\r\n<style scoped>\r\np.login3 {\r\n  font-size: 22px;\r\n  position: relative;\r\n  width: 100%;\r\n  color: #333;\r\n  text-align: center;\r\n}\r\n\r\np.login3 span {\r\n  height: 1px;\r\n  position: absolute;\r\n  background-color: #928f8f;\r\n  width: 35%;\r\n  top: 50%;\r\n}\r\n\r\np.login3 span.right {\r\n  right: 65%;\r\n}\r\n\r\np.login3 span.left {\r\n  left: 65%;\r\n}\r\n\r\n.center {\r\n  display: flex;\r\n  width: 100%;\r\n  flex-direction: column;\r\n  align-items: center;\r\n}\r\n\r\n@media screen and (max-width: 680px) {\r\n  .login-col {\r\n    width: 80%;\r\n  }\r\n}\r\n\r\n@media screen and (min-width: 680px) and (max-width: 1680px) {\r\n  .login-col {\r\n    width: 30%;\r\n  }\r\n}\r\n\r\n@media screen and (min-width: 1680px) {\r\n  .login-col {\r\n    width: 445px;\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <p>Test.</p>\r\n  </div>\r\n</template>\r\n","<template>\r\n  <div class=\"objform\">\r\n    <el-form\r\n      label-position=\"right\"\r\n      label-width=\"120px\"\r\n      ref=\"form\"\r\n      :model=\"form\"\r\n    >\r\n      <template v-for=\"(list, cate) in properties\">\r\n        <div v-if=\"list.length > 0\" :key=\"cate\">\r\n          <div :key=\"cate\">\r\n            <label>\r\n              <h2>{{ cate }}</h2>\r\n            </label>\r\n          </div>\r\n          <el-form-item\r\n            v-for=\"(item, k) in list\"\r\n            :key=\"k + cate\"\r\n            :label=\"item.displayName\"\r\n            :prop=\"item.name\"\r\n          >\r\n            <el-switch\r\n              v-if=\"item.typeStr == 'Boolean'\"\r\n              v-model=\"form[item.name]\"\r\n              active-color=\"#13ce66\"\r\n              inactive-color=\"#ff4949\"\r\n            />\r\n\r\n            <el-date-picker\r\n              v-else-if=\"item.typeStr == 'DateTime'\"\r\n              v-model=\"form[item.name]\"\r\n              type=\"datetime\"\r\n              format=\"YYYY-MM-DD HH:mm:ss\"\r\n              value-format=\"YYYY-MM-DD HH:mm:ss\"\r\n            />\r\n\r\n            <el-input\r\n              v-else\r\n              v-model=\"form[item.name]\"\r\n              type=\"text\"\r\n              size=\"default\"\r\n            />\r\n            <span>{{ item.description }}</span>\r\n          </el-form-item>\r\n        </div>\r\n      </template>\r\n\r\n      <el-form-item prop label-name>\r\n        <div\r\n          style=\"position: fixed; margin: 30px; float:right; bottom: 0px; right: 0px; z-index: 1;\"\r\n        >\r\n          <el-button type=\"primary\" @click=\"confirm\">保存</el-button>\r\n        </div>\r\n      </el-form-item>\r\n    </el-form>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue';\r\nexport default defineComponent({\r\n  props: ['path'],\r\n  data() {\r\n    return {\r\n      form: {} as any,\r\n      properties: [] as any,\r\n    };\r\n  },\r\n  computed: {\r\n    currentPath() {\r\n      return this.path;\r\n    },\r\n  },\r\n  watch: {\r\n    $route: {\r\n      handler: function () {\r\n        this.init();\r\n      },\r\n      immediate: true,\r\n    },\r\n  },\r\n  methods: {\r\n    init() {\r\n      this.query();\r\n    },\r\n    query() {\r\n      let vm = this;\r\n      vm.$api.config.getObject(vm.currentPath).then((res) => {\r\n        vm.form = res.data.value;\r\n        vm.properties = res.data.properties;\r\n      });\r\n    },\r\n    confirm() {\r\n      let vm = this;\r\n      vm.$api.config.updateObject(vm.currentPath, vm.form).then(() => {\r\n        let msg = '保存成功';\r\n\r\n        if (!vm.form.enableNewUI) {\r\n          msg += ',正在跳转页面';\r\n        }\r\n\r\n        vm.$message({\r\n          message: msg,\r\n          type: 'success',\r\n          duration: 3 * 1000,\r\n        });\r\n\r\n        if (!vm.form.enableNewUI) {\r\n          location.href = '/';\r\n        }\r\n      });\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.objform {\r\n  max-height: -moz-calc(100vh - 200px);\r\n  max-height: -webkit-calc(100vh - 200px);\r\n  max-height: calc(100vh - 200px);\r\n  overflow: auto;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n.objform h2 {\r\n  margin: 35px 0;\r\n}\r\n\r\n.el-input,\r\n.el-switch {\r\n  width: 380px;\r\n  margin-right: 15px;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"objform\">\r\n    <el-form\r\n      label-position=\"right\"\r\n      label-width=\"120px\"\r\n      ref=\"form\"\r\n      :model=\"form\"\r\n    >\r\n      <template v-for=\"(list, cate) in properties\">\r\n        <div v-if=\"list.length > 0\" :key=\"cate\">\r\n          <div :key=\"cate\">\r\n            <label>\r\n              <h2>{{ cate }}</h2>\r\n            </label>\r\n          </div>\r\n          <el-form-item\r\n            v-for=\"(item, k) in list\"\r\n            :key=\"k + cate\"\r\n            :label=\"item.displayName\"\r\n            :prop=\"item.name\"\r\n          >\r\n            <el-switch\r\n              v-if=\"item.typeStr == 'Boolean'\"\r\n              v-model=\"form[item.name]\"\r\n              active-color=\"#13ce66\"\r\n              inactive-color=\"#ff4949\"\r\n            />\r\n\r\n            <el-date-picker\r\n              v-else-if=\"item.typeStr == 'DateTime'\"\r\n              v-model=\"form[item.name]\"\r\n              type=\"datetime\"\r\n              format=\"YYYY-MM-DD HH:mm:ss\"\r\n              value-format=\"YYYY-MM-DD HH:mm:ss\"\r\n            />\r\n\r\n            <el-input\r\n              v-else\r\n              v-model=\"form[item.name]\"\r\n              type=\"text\"\r\n              size=\"default\"\r\n            />\r\n            <span>{{ item.description }}</span>\r\n          </el-form-item>\r\n        </div>\r\n      </template>\r\n\r\n      <el-form-item prop label-name>\r\n        <div\r\n          style=\"position: fixed; margin: 30px; float:right; bottom: 0px; right: 0px; z-index: 1;\"\r\n        >\r\n          <el-button type=\"primary\" @click=\"confirm\">保存</el-button>\r\n        </div>\r\n      </el-form-item>\r\n    </el-form>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue';\r\nexport default defineComponent({\r\n  props: ['path'],\r\n  data() {\r\n    return {\r\n      form: {} as any,\r\n      properties: [] as any,\r\n    };\r\n  },\r\n  computed: {\r\n    currentPath() {\r\n      return this.path;\r\n    },\r\n  },\r\n  watch: {\r\n    $route: {\r\n      handler: function () {\r\n        this.init();\r\n      },\r\n      immediate: true,\r\n    },\r\n  },\r\n  methods: {\r\n    init() {\r\n      this.query();\r\n    },\r\n    query() {\r\n      let vm = this;\r\n      vm.$api.config.getObject(vm.currentPath).then((res) => {\r\n        vm.form = res.data.value;\r\n        vm.properties = res.data.properties;\r\n      });\r\n    },\r\n    confirm() {\r\n      let vm = this;\r\n      vm.$api.config.updateObject(vm.currentPath, vm.form).then(() => {\r\n        let msg = '保存成功';\r\n\r\n        if (!vm.form.enableNewUI) {\r\n          msg += ',正在跳转页面';\r\n        }\r\n\r\n        vm.$message({\r\n          message: msg,\r\n          type: 'success',\r\n          duration: 3 * 1000,\r\n        });\r\n\r\n        if (!vm.form.enableNewUI) {\r\n          location.href = '/';\r\n        }\r\n      });\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.objform {\r\n  max-height: -moz-calc(100vh - 200px);\r\n  max-height: -webkit-calc(100vh - 200px);\r\n  max-height: calc(100vh - 200px);\r\n  overflow: auto;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n.objform h2 {\r\n  margin: 35px 0;\r\n}\r\n\r\n.el-input,\r\n.el-switch {\r\n  width: 380px;\r\n  margin-right: 15px;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"list-container\">\r\n    <AdvancedTable\r\n      ref=\"advancedTable\"\r\n      :searchList=\"columns\"\r\n      :tableHandlerList=\"tableHandlerList\"\r\n      :columns=\"columns\"\r\n      :url=\"currentPath\"\r\n    ></AdvancedTable>\r\n  </div>\r\n</template>\r\n<script lang=\"ts\">\r\nimport AdvancedTable from '@/components/AdvancedTable.vue';\r\nimport { defineComponent } from 'vue';\r\nconst permissionFlags = {\r\n  none: 0,\r\n  detail: 1,\r\n  insert: 2,\r\n  update: 4,\r\n  delete: 8,\r\n};\r\nexport default defineComponent({\r\n  name: 'List',\r\n  components: {\r\n    AdvancedTable,\r\n  },\r\n  props: {\r\n    // 搜索字段配置\r\n    tableSearchConfig: {\r\n      type: Array,\r\n      default: () => [\r\n        {\r\n          itemType: 'datePicker',\r\n          name: 'dtStart$dtEnd',\r\n          displayName: '时间范围',\r\n          showInSearch: true,\r\n          options: { type: 'daterange', setDefaultValue: false },\r\n        },\r\n        {\r\n          name: 'Q',\r\n          displayName: '',\r\n          showInSearch: true,\r\n          options: {\r\n            placeholder: '请输入关键字',\r\n          },\r\n        },\r\n      ],\r\n    },\r\n    // 表格操作按钮配置\r\n    tableHandlerConfig: {\r\n      type: Array,\r\n      default: () => [],\r\n    },\r\n    // 列表字段配置\r\n    tableColumnConfig: {\r\n      type: Array,\r\n      default: () => [],\r\n    },\r\n    // 列表操作按钮配置\r\n    tableActionConfig: {\r\n      type: Array,\r\n      default: () => [],\r\n    },\r\n  },\r\n  data() {\r\n    return {\r\n      tableData: [],\r\n      actionList: [\r\n        {\r\n          name: 'handler',\r\n          displayName: '操作',\r\n          width: '155px',\r\n          showInList: true,\r\n          handlerList: [\r\n            {\r\n              innerText: '查看',\r\n              handler: 'detail',\r\n              if: () =>\r\n                !this.hasPermission(permissionFlags.update) &&\r\n                this.hasPermission(permissionFlags.detail),\r\n            },\r\n            {\r\n              innerText: '编辑',\r\n              handler: 'editData',\r\n              if: () => this.hasPermission(permissionFlags.update),\r\n            },\r\n            {\r\n              innerText: '删除',\r\n              type: 'danger',\r\n              handler: 'deleteData',\r\n              if: () => this.hasPermission(permissionFlags.delete),\r\n            },\r\n          ],\r\n        },\r\n      ],\r\n      headerData: [],\r\n    };\r\n  },\r\n  computed: {\r\n    tableHandlerList() {\r\n      const vm = this;\r\n      if (vm.tableHandlerConfig.length < 1) {\r\n        return [\r\n          {\r\n            name: '新增',\r\n            handler: 'add',\r\n            type: 'primary',\r\n            if: () => this.hasPermission(permissionFlags.insert),\r\n          },\r\n        ];\r\n      } else {\r\n        return vm.tableHandlerConfig.map((handler: any) => {\r\n          const ifFn2 = handler.if;\r\n          if (typeof ifFn2 === 'function') {\r\n            handler.if = (row: any) => ifFn2(vm, row);\r\n          }\r\n\r\n          return handler;\r\n        });\r\n      }\r\n    },\r\n    columns() {\r\n      const vm = this as any;\r\n\r\n      // 如果有传入列信息,则使用传入的列信息,否则请求接口使用headerData\r\n      let tableColumnConfig = vm.tableColumnConfig;\r\n      let actionList = vm.tableActionConfig;\r\n\r\n      if (tableColumnConfig.length === 0) {\r\n        tableColumnConfig = vm.headerData;\r\n      }\r\n\r\n      if (actionList.length === 0) {\r\n        actionList = vm.actionList;\r\n      }\r\n\r\n      const columns = vm.tableSearchConfig.concat(\r\n        tableColumnConfig.concat(actionList),\r\n      );\r\n\r\n      // 处理if条件,this当前页面实例\r\n      for (const column of columns) {\r\n        const ifFn = column.if;\r\n\r\n        if (typeof ifFn === 'function') {\r\n          column.if = (row: any) => ifFn(vm, row);\r\n        }\r\n\r\n        if (column.handlerList && column.handlerList.length > 0) {\r\n          column.handlerList = column.handlerList.map((handler: any) => {\r\n            const ifFn2 = handler.if;\r\n            if (typeof ifFn2 === 'function') {\r\n              handler.if = (row: any) => ifFn2(vm, row);\r\n            }\r\n\r\n            return handler;\r\n          });\r\n        }\r\n      }\r\n\r\n      return columns;\r\n    },\r\n    currentPath() {\r\n      return this.$route.path;\r\n    },\r\n    advancedTable(): any {\r\n      return this.$refs.advancedTable as any;\r\n    },\r\n    // 批量选中的数据\r\n    batchList(): any {\r\n      return this.advancedTable.selectList;\r\n    },\r\n  },\r\n  created() {\r\n    this.init();\r\n  },\r\n  activated() {\r\n    this.init();\r\n  },\r\n  methods: {\r\n    init() {\r\n      this.getColumns();\r\n    },\r\n    // 获取表格数据\r\n    getDataList() {\r\n      this.advancedTable.getDataList();\r\n    },\r\n    getColumns() {\r\n      // TODO 可改造成vue的属性,自动根据路由获取对应的列信息\r\n      const vm = this;\r\n\r\n      if (vm.tableColumnConfig.length > 0) {\r\n        return;\r\n      }\r\n\r\n      const path = vm.currentPath;\r\n\r\n      vm.$api.base.getColumns(path).then((res) => {\r\n        vm.headerData = res.data;\r\n      });\r\n    },\r\n    add() {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Add');\r\n    },\r\n    detail(scope: any) {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Detail/' + scope.row.id);\r\n    },\r\n    editData(scope: any) {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Edit/' + scope.row.id);\r\n    },\r\n    deleteData(scope: any) {\r\n      const vm = this;\r\n      vm.$api.base.deleteById(vm.currentPath, scope.row.id).then(() => {\r\n        vm.getDataList();\r\n      });\r\n    },\r\n    rowDblclick(row: any) {\r\n      this.editData({ row });\r\n    },\r\n    // 判断操作id会否有权限\r\n    hasPermission(actionId: any) {\r\n      const vm = this;\r\n      const menuId = vm.$route.meta.menuId;\r\n      const permissions = vm.$route.meta.permissions;\r\n      const has = (vm.$store.state as any).user.hasPermission(vm.$store, {\r\n        menuId,\r\n        actionId,\r\n        permissions,\r\n      });\r\n      return has;\r\n    },\r\n  },\r\n});\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n.list-container {\r\n  height: -moz-calc(100vh - 51px);\r\n  height: -webkit-calc(100vh - 51px);\r\n  height: calc(100vh - 51px);\r\n  overflow-x: hidden;\r\n  overflow-y: auto;\r\n  padding: 5px;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"list-container\">\r\n    <AdvancedTable\r\n      ref=\"advancedTable\"\r\n      :searchList=\"columns\"\r\n      :tableHandlerList=\"tableHandlerList\"\r\n      :columns=\"columns\"\r\n      :url=\"currentPath\"\r\n    ></AdvancedTable>\r\n  </div>\r\n</template>\r\n<script lang=\"ts\">\r\nimport AdvancedTable from '@/components/AdvancedTable.vue';\r\nimport { defineComponent } from 'vue';\r\nconst permissionFlags = {\r\n  none: 0,\r\n  detail: 1,\r\n  insert: 2,\r\n  update: 4,\r\n  delete: 8,\r\n};\r\nexport default defineComponent({\r\n  name: 'List',\r\n  components: {\r\n    AdvancedTable,\r\n  },\r\n  props: {\r\n    // 搜索字段配置\r\n    tableSearchConfig: {\r\n      type: Array,\r\n      default: () => [\r\n        {\r\n          itemType: 'datePicker',\r\n          name: 'dtStart$dtEnd',\r\n          displayName: '时间范围',\r\n          showInSearch: true,\r\n          options: { type: 'daterange', setDefaultValue: false },\r\n        },\r\n        {\r\n          name: 'Q',\r\n          displayName: '',\r\n          showInSearch: true,\r\n          options: {\r\n            placeholder: '请输入关键字',\r\n          },\r\n        },\r\n      ],\r\n    },\r\n    // 表格操作按钮配置\r\n    tableHandlerConfig: {\r\n      type: Array,\r\n      default: () => [],\r\n    },\r\n    // 列表字段配置\r\n    tableColumnConfig: {\r\n      type: Array,\r\n      default: () => [],\r\n    },\r\n    // 列表操作按钮配置\r\n    tableActionConfig: {\r\n      type: Array,\r\n      default: () => [],\r\n    },\r\n  },\r\n  data() {\r\n    return {\r\n      tableData: [],\r\n      actionList: [\r\n        {\r\n          name: 'handler',\r\n          displayName: '操作',\r\n          width: '155px',\r\n          showInList: true,\r\n          handlerList: [\r\n            {\r\n              innerText: '查看',\r\n              handler: 'detail',\r\n              if: () =>\r\n                !this.hasPermission(permissionFlags.update) &&\r\n                this.hasPermission(permissionFlags.detail),\r\n            },\r\n            {\r\n              innerText: '编辑',\r\n              handler: 'editData',\r\n              if: () => this.hasPermission(permissionFlags.update),\r\n            },\r\n            {\r\n              innerText: '删除',\r\n              type: 'danger',\r\n              handler: 'deleteData',\r\n              if: () => this.hasPermission(permissionFlags.delete),\r\n            },\r\n          ],\r\n        },\r\n      ],\r\n      headerData: [],\r\n    };\r\n  },\r\n  computed: {\r\n    tableHandlerList() {\r\n      const vm = this;\r\n      if (vm.tableHandlerConfig.length < 1) {\r\n        return [\r\n          {\r\n            name: '新增',\r\n            handler: 'add',\r\n            type: 'primary',\r\n            if: () => this.hasPermission(permissionFlags.insert),\r\n          },\r\n        ];\r\n      } else {\r\n        return vm.tableHandlerConfig.map((handler: any) => {\r\n          const ifFn2 = handler.if;\r\n          if (typeof ifFn2 === 'function') {\r\n            handler.if = (row: any) => ifFn2(vm, row);\r\n          }\r\n\r\n          return handler;\r\n        });\r\n      }\r\n    },\r\n    columns() {\r\n      const vm = this as any;\r\n\r\n      // 如果有传入列信息,则使用传入的列信息,否则请求接口使用headerData\r\n      let tableColumnConfig = vm.tableColumnConfig;\r\n      let actionList = vm.tableActionConfig;\r\n\r\n      if (tableColumnConfig.length === 0) {\r\n        tableColumnConfig = vm.headerData;\r\n      }\r\n\r\n      if (actionList.length === 0) {\r\n        actionList = vm.actionList;\r\n      }\r\n\r\n      const columns = vm.tableSearchConfig.concat(\r\n        tableColumnConfig.concat(actionList),\r\n      );\r\n\r\n      // 处理if条件,this当前页面实例\r\n      for (const column of columns) {\r\n        const ifFn = column.if;\r\n\r\n        if (typeof ifFn === 'function') {\r\n          column.if = (row: any) => ifFn(vm, row);\r\n        }\r\n\r\n        if (column.handlerList && column.handlerList.length > 0) {\r\n          column.handlerList = column.handlerList.map((handler: any) => {\r\n            const ifFn2 = handler.if;\r\n            if (typeof ifFn2 === 'function') {\r\n              handler.if = (row: any) => ifFn2(vm, row);\r\n            }\r\n\r\n            return handler;\r\n          });\r\n        }\r\n      }\r\n\r\n      return columns;\r\n    },\r\n    currentPath() {\r\n      return this.$route.path;\r\n    },\r\n    advancedTable(): any {\r\n      return this.$refs.advancedTable as any;\r\n    },\r\n    // 批量选中的数据\r\n    batchList(): any {\r\n      return this.advancedTable.selectList;\r\n    },\r\n  },\r\n  created() {\r\n    this.init();\r\n  },\r\n  activated() {\r\n    this.init();\r\n  },\r\n  methods: {\r\n    init() {\r\n      this.getColumns();\r\n    },\r\n    // 获取表格数据\r\n    getDataList() {\r\n      this.advancedTable.getDataList();\r\n    },\r\n    getColumns() {\r\n      // TODO 可改造成vue的属性,自动根据路由获取对应的列信息\r\n      const vm = this;\r\n\r\n      if (vm.tableColumnConfig.length > 0) {\r\n        return;\r\n      }\r\n\r\n      const path = vm.currentPath;\r\n\r\n      vm.$api.base.getColumns(path).then((res) => {\r\n        vm.headerData = res.data;\r\n      });\r\n    },\r\n    add() {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Add');\r\n    },\r\n    detail(scope: any) {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Detail/' + scope.row.id);\r\n    },\r\n    editData(scope: any) {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Edit/' + scope.row.id);\r\n    },\r\n    deleteData(scope: any) {\r\n      const vm = this;\r\n      vm.$api.base.deleteById(vm.currentPath, scope.row.id).then(() => {\r\n        vm.getDataList();\r\n      });\r\n    },\r\n    rowDblclick(row: any) {\r\n      this.editData({ row });\r\n    },\r\n    // 判断操作id会否有权限\r\n    hasPermission(actionId: any) {\r\n      const vm = this;\r\n      const menuId = vm.$route.meta.menuId;\r\n      const permissions = vm.$route.meta.permissions;\r\n      const has = (vm.$store.state as any).user.hasPermission(vm.$store, {\r\n        menuId,\r\n        actionId,\r\n        permissions,\r\n      });\r\n      return has;\r\n    },\r\n  },\r\n});\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n.list-container {\r\n  height: -moz-calc(100vh - 51px);\r\n  height: -webkit-calc(100vh - 51px);\r\n  height: calc(100vh - 51px);\r\n  overflow-x: hidden;\r\n  overflow-y: auto;\r\n  padding: 5px;\r\n}\r\n</style>\r\n","<template>\r\n  <el-tabs v-model=\"activeName\" @tab-click=\"handleClick\">\r\n    <el-tab-pane label=\"魔方设置\" name=\"Cube\">\r\n      <object-form path=\"/Admin/Cube\"></object-form>\r\n    </el-tab-pane>\r\n    <el-tab-pane label=\"基础设置\" name=\"Core\">\r\n      <object-form path=\"/Admin/Core\"></object-form>\r\n    </el-tab-pane>\r\n    <el-tab-pane label=\"系统设置\" name=\"Sys\">\r\n      <object-form path=\"/Admin/Sys\"></object-form>\r\n    </el-tab-pane>\r\n    <el-tab-pane label=\"数据中间件\" name=\"XCode\">\r\n      <object-form path=\"/Admin/XCode\"></object-form>\r\n    </el-tab-pane>\r\n    <el-tab-pane label=\"OAuth设置\" name=\"OAuthConfig\">\r\n      <router-link to=\"/Admin/OAuthConfig\">跳转OAuth设置</router-link>\r\n    </el-tab-pane>\r\n  </el-tabs>\r\n</template>\r\n<script>\r\nimport ObjectForm from '@/views/common/objectForm'\r\nimport List from '@/views/common/list'\r\nexport default {\r\n  components: {\r\n    ObjectForm\r\n  },\r\n  data() {\r\n    return {\r\n      activeName: 'Cube'\r\n    }\r\n  },\r\n  methods: {\r\n    handleClick(tab, event) {\r\n      let vm = this\r\n      // console.log(tab, event)\r\n      if (tab.name === 'OAuthConfig') {\r\n        vm.$router.push({ path: '/Admin/OAuthConfig', component: List })\r\n      }\r\n    }\r\n  }\r\n}\r\n</script>\r\n","<template>\r\n  <div>\r\n    <div class=\"table-responsive\">\r\n      <table\r\n        class=\"table table-bordered table-hover table-striped table-condensed\"\r\n      >\r\n        <thead>\r\n          <tr>\r\n            <th colspan=\"4\">\r\n              服务器信息\r\n            </th>\r\n          </tr>\r\n        </thead>\r\n        <tbody>\r\n          <tr>\r\n            <td class=\"name\">\r\n              应用系统:\r\n            </td>\r\n            <td class=\"value\">\r\n              <!-- @if (this.has((PermissionFlags)16)) -->\r\n\r\n              <a style=\"cursor: pointer;\" @click=\"restart\">重启应用系统</a>\r\n\r\n              &nbsp;&nbsp;&nbsp;&nbsp;{{ model.rawUrl }}\r\n            </td>\r\n            <td class=\"name\">\r\n              目录:\r\n            </td>\r\n            <td class=\"value\">\r\n              {{ model.contentRootPath }}\r\n            </td>\r\n          </tr>\r\n          <tr>\r\n            <td class=\"name\">\r\n              域名地址:\r\n            </td>\r\n            <td class=\"value\">\r\n              <span title=\"主机\">{{ model.host }}</span\r\n              >,\r\n              <span title=\"本地\">{{ model.localHost }}</span>\r\n              &nbsp;<span title=\"远程\">{{ model.remoteHost }}</span>\r\n            </td>\r\n            <td class=\"name\">\r\n              应用程序:\r\n            </td>\r\n            <td class=\"value\">\r\n              <span :title=\"model.commandLine\">{{ model.processName }}</span>\r\n            </td>\r\n          </tr>\r\n          <tr>\r\n            <td class=\"name\">\r\n              应用域:\r\n            </td>\r\n            <td class=\"value\">\r\n              {{ model.curDomainFriendlyName }}\r\n              <!-- <a href=\"@Url.action(\"Main\", new{ id = \"Assembly\" })\" target=\"_blank\" title=\"点击打开进程程序集列表\">程序集列表</a>\r\n                    <a href=\"@Url.action(\"Main\", new{ id = \"ProcessModules\" })\" target=\"_blank\" title=\"点击打开进程模块列表\">模块列表</a>\r\n                    <a href=\"@Url.action(\"Main\", new{ id = \"ServerVar\" })\" target=\"_blank\" title=\"点击打开服务器变量列表\">服务器变量列表</a> -->\r\n            </td>\r\n            <td class=\"name\">\r\n              .net 版本:\r\n            </td>\r\n            <td class=\"value\">\r\n              {{ model.envVersion }} &nbsp;{{ model.frameworkName }}\r\n            </td>\r\n          </tr>\r\n          <tr>\r\n            <td class=\"name\">\r\n              操作系统:\r\n            </td>\r\n            <td class=\"value\" :title=\"model.guid\">\r\n              {{ model.oSName }} {{ model.oSVersion }}\r\n            </td>\r\n            <td class=\"name\">\r\n              机器用户:\r\n            </td>\r\n            <td class=\"value\" :title=\"model.uuid\">\r\n              <span v-if=\"model.product !== undefined\"\r\n                >{{ model.product }},</span\r\n              >\r\n              {{ model.userName + '/' + model.machineName }}\r\n            </td>\r\n          </tr>\r\n          <tr>\r\n            <td class=\"name\">\r\n              处理器:\r\n            </td>\r\n            <td class=\"value\" :title=\"model.cpuID\">\r\n              {{ model.processor }},\r\n              {{ model.processorCount }}\r\n              核心,{{ model.cpuRate }}\r\n              <span v-if=\"model.temperature > 0\"\r\n                >,{{ model.temperature }} ℃</span\r\n              >\r\n            </td>\r\n            <td class=\"name\">\r\n              时间:\r\n            </td>\r\n\r\n            <td\r\n              class=\"value\"\r\n              title=\"这里使用了服务器默认的时间格式!后面是开机时间。\"\r\n            >\r\n              {{ model.dateTimeNow }},开机{{ model.uptime }}\r\n            </td>\r\n          </tr>\r\n          <tr>\r\n            <td class=\"name\">\r\n              内存:\r\n            </td>\r\n            <td class=\"value\">\r\n              物理:{{ model.availableMemory }}M / {{ model.memory }}M,\r\n              工作/提交: {{ model.workingSet64 }}M/{{\r\n                model.privateMemorySize64\r\n              }}M GC: {{ model.totalMemory }}M\r\n              <a @click=\"memoryFree\" title=\"点击释放进程内存\">释放内存</a>\r\n            </td>\r\n            <td class=\"name\">\r\n              进程时间:\r\n            </td>\r\n            <td class=\"value\">\r\n              <!-- @process.totalProcessorTime.totalSeconds.toString(\"N2\")秒 启动于 @process.startTime.toLocalTime().toFullString() -->\r\n            </td>\r\n          </tr>\r\n          <tr>\r\n            <td class=\"name\">\r\n              Session:\r\n            </td>\r\n            <td class=\"value\">\r\n              <!-- @httpContext.session.keys.count() 个 -->\r\n              <a\r\n                @click=\"main('Session')\"\r\n                target=\"_blank\"\r\n                title=\"点击打开Session列表\"\r\n                >Session列表</a\r\n              >\r\n              <!-- ,@gc -->\r\n            </td>\r\n            <td class=\"name\">\r\n              <!-- @{ var app = ApplicationManager.load();} -->\r\n              应用启动:\r\n            </td>\r\n            <td class=\"value\">\r\n              <!-- 启动于 @app.startTime.toLocalTime().toFullString() -->\r\n            </td>\r\n          </tr>\r\n        </tbody>\r\n      </table>\r\n      <table\r\n        class=\"table table-bordered table-hover table-striped table-condensed\"\r\n      >\r\n        <thead>\r\n          <tr>\r\n            <th>名称</th>\r\n            <th>标题</th>\r\n            <th>文件版本</th>\r\n            <th>内部版本</th>\r\n            <th>编译时间</th>\r\n            <th>描述</th>\r\n          </tr>\r\n        </thead>\r\n        <tbody>\r\n          <!-- @foreach (AssemblyX item in ViewBag.myAsms)\r\n            {\r\n                <tr>\r\n                    <td>@item.name</td>\r\n                    <td>@item.title</td>\r\n                    <td>@item.fileVersion</td>\r\n                    <td>@item.version</td>\r\n                    <td>@(item.compile.year <= 2000 ? \"\" : item.compile.toFullString())</td>\r\n                    <td>@item.description</td>\r\n                </tr>\r\n            } -->\r\n        </tbody>\r\n      </table>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n  data() {\r\n    return {\r\n      model: {\r\n        rawUrl: 'RawUrl',\r\n        contentRootPath: 'ContentRootPath',\r\n        host: 'Host',\r\n        localHost: 'LocalHost',\r\n        remoteHost: 'RemoteHost',\r\n        commandLine: 'CommandLine',\r\n        processName: 'ProcessName',\r\n        curDomainFriendlyName: 'FriendlyName',\r\n        envVersion: 'EnvVersion',\r\n        frameworkName: 'FrameworkName',\r\n        guid: 'Guid',\r\n        oSName: 'OSName',\r\n        oSVersion: 'OSVersion',\r\n        product: 'Product',\r\n        userName: 'UserName',\r\n        machineName: 'MachineName',\r\n        uuid: 'UUID',\r\n        processor: 'Processor',\r\n        processorCount: 'ProcessorCount',\r\n        cpuRate: 'CpuRate',\r\n        temperature: 0,\r\n        dateTimeNow: 'DateTimeNow',\r\n        uptime: 'Uptime',\r\n        availableMemory: 'AvailableMemory',\r\n        memory: 'Memory',\r\n        workingSet64: 'WorkingSet64',\r\n        privateMemorySize64: 'PrivateMemorySize64',\r\n        totalMemory: 'TotalMemory',\r\n      },\r\n    }\r\n  },\r\n  methods: {\r\n    restart() {\r\n      this.$alert(\r\n        '仅重启ASP.Net Core应用程序域,而不是操作系统!<br/>确认重启?',\r\n        '提示',\r\n        {\r\n          confirmButtonText: 'confirm',\r\n          callback: (action) => {\r\n            console.log(action)\r\n          },\r\n        }\r\n      )\r\n    },\r\n    memoryFree() {\r\n      console.log('memoryFree')\r\n    },\r\n    main(id) {\r\n      console.log(id)\r\n    },\r\n  },\r\n}\r\n</script>\r\n\r\n<style></style>\r\n","<template>\r\n  <div>\r\n    <div>{{ typeMap[type] }}</div>\r\n    <el-form\r\n      ref=\"form\"\r\n      v-model=\"form\"\r\n      label-position=\"right\"\r\n      label-width=\"120px\"\r\n      :inline=\"true\"\r\n      class=\"form-container\"\r\n    >\r\n      <template v-for=\"(column, k) in fields\">\r\n        <el-form-item\r\n          v-if=\"column.name.toLowerCase() != 'id'\"\r\n          :key=\"k\"\r\n          :prop=\"column.name\"\r\n          :label=\"column.displayName || column.name\"\r\n        >\r\n          <el-switch\r\n            v-if=\"column.dataType == 'Boolean'\"\r\n            v-model=\"form[column.name]\"\r\n            active-color=\"#13ce66\"\r\n            inactive-color=\"#ff4949\"\r\n          />\r\n\r\n          <el-date-picker\r\n            v-else-if=\"column.dataType == 'DateTime'\"\r\n            v-model=\"form[column.name]\"\r\n            type=\"datetime\"\r\n            format=\"YYYY-MM-DD HH:mm:ss\"\r\n            value-format=\"YYYY-MM-DD HH:mm:ss\"\r\n            placeholder=\"选择日期时间\"\r\n          />\r\n\r\n          <el-input\r\n            v-else-if=\"column.dataType == 'String' && column.length > 50\"\r\n            v-model=\"form[column.name]\"\r\n            autosize\r\n            type=\"textarea\"\r\n          />\r\n\r\n          <el-input v-else v-model=\"form[column.name]\" type=\"text\" />\r\n        </el-form-item>\r\n      </template>\r\n\r\n      <el-form-item v-if=\"!isDetail\">\r\n        <div\r\n          style=\"position: fixed; margin:20px; float:right; bottom: 0px; right: 0px; z-index: 1;\"\r\n        >\r\n          <el-button @click=\"returnIndex\">取消</el-button>\r\n          <el-button type=\"primary\" @click=\"confirm\">保存</el-button>\r\n        </div>\r\n      </el-form-item>\r\n    </el-form>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  data() {\r\n    return {\r\n      form: {} as any,\r\n      typeMap: { Add: '新增', Detail: '查看', Edit: '编辑' } as any,\r\n      fields: [\r\n        {\r\n          name: 'id',\r\n          displayName: '编号',\r\n          dataType: 'Int32',\r\n          description: '编号'\r\n        },\r\n        {\r\n          name: 'name',\r\n          displayName: '名称',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '名称'\r\n        },\r\n        {\r\n          name: 'displayName',\r\n          displayName: '显示名',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '显示名'\r\n        },\r\n        {\r\n          name: 'fullName',\r\n          displayName: '全名',\r\n          dataType: 'String',\r\n          length: 200,\r\n          description: '全名'\r\n        },\r\n        {\r\n          name: 'parentID',\r\n          displayName: '父编号',\r\n          dataType: 'Int32',\r\n          description: '父编号'\r\n        },\r\n        {\r\n          name: 'url',\r\n          displayName: '链接',\r\n          dataType: 'String',\r\n          length: 200,\r\n          description: '链接'\r\n        },\r\n        {\r\n          name: 'sort',\r\n          displayName: '排序',\r\n          dataType: 'Int32',\r\n          description: '排序'\r\n        },\r\n        {\r\n          name: 'icon',\r\n          displayName: '图标',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '图标'\r\n        },\r\n        {\r\n          name: 'visible',\r\n          displayName: '可见',\r\n          dataType: 'Boolean',\r\n          description: '可见'\r\n        },\r\n        {\r\n          name: 'necessary',\r\n          displayName: '必要',\r\n          dataType: 'Boolean',\r\n          description:\r\n            '必要。必要的菜单,必须至少有角色拥有这些权限,如果没有则自动授权给系统角色'\r\n        },\r\n        {\r\n          name: 'permission',\r\n          displayName: '权限子项',\r\n          dataType: 'String',\r\n          length: 200,\r\n          description: '权限子项。逗号分隔,每个权限子项名值竖线分隔'\r\n        },\r\n        {\r\n          name: 'ex1',\r\n          displayName: '扩展1',\r\n          dataType: 'Int32',\r\n          description: '扩展1'\r\n        },\r\n        {\r\n          name: 'ex2',\r\n          displayName: '扩展2',\r\n          dataType: 'Int32',\r\n          description: '扩展2'\r\n        },\r\n        {\r\n          name: 'ex3',\r\n          displayName: '扩展3',\r\n          dataType: 'Double',\r\n          description: '扩展3'\r\n        },\r\n        {\r\n          name: 'ex4',\r\n          displayName: '扩展4',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '扩展4'\r\n        },\r\n        {\r\n          name: 'ex5',\r\n          displayName: '扩展5',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '扩展5'\r\n        },\r\n        {\r\n          name: 'ex6',\r\n          displayName: '扩展6',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '扩展6'\r\n        },\r\n        {\r\n          name: 'remark',\r\n          displayName: '备注',\r\n          dataType: 'String',\r\n          length: 500,\r\n          description: '备注'\r\n        }\r\n      ] as any\r\n    }\r\n  },\r\n  computed: {\r\n    id() {\r\n      return this.$route.params.id\r\n    },\r\n    currentPath() {\r\n      let vm = this as any\r\n      let rplStr = `/${vm.type}${vm.id === undefined ? '' : '/' + vm.id}`\r\n      return this.$route.path.replace(rplStr, '')\r\n    },\r\n    type(): any {\r\n      return this.$route.params.type\r\n    },\r\n    isAdd() {\r\n      return (this as any).type === 'Add'\r\n    },\r\n    isDetail() {\r\n      return (this as any).type === 'Detail'\r\n    }\r\n  },\r\n  // watch: {\r\n  //   $route: {\r\n  //     handler: function () {\r\n  //       this.init()\r\n  //     },\r\n  //     immediate: true\r\n  //   }\r\n  // },\r\n  created() {\r\n    this.init()\r\n  },\r\n  activated() {\r\n    this.init()\r\n  },\r\n  methods: {\r\n    init() {\r\n      // this.getFields()\r\n      // this.getColumns()\r\n      if (!this.isAdd) {\r\n        this.query()\r\n      }\r\n    },\r\n    getColumns() {\r\n      // TODO 可改造成vue的属性,自动根据路由获取对应的列信息\r\n      let vm = this\r\n      let path = vm.currentPath\r\n      vm.$api.base.getColumns(path).then((res) => {\r\n        vm.fields = res.data\r\n      })\r\n    },\r\n    query() {\r\n      let vm = this\r\n      if (vm.isDetail) {\r\n        vm.$api.base.getDetailData(vm.currentPath, vm.id).then((res) => {\r\n          vm.form = res.data\r\n        })\r\n      } else {\r\n        vm.$api.base.getData(vm.currentPath, vm.id).then((res) => {\r\n          vm.form = res.data\r\n        })\r\n      }\r\n    },\r\n    confirm() {\r\n      let vm = this\r\n      if (vm.isAdd) {\r\n        vm.$api.base.add(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '新增成功',\r\n            type: 'success',\r\n            duration: 5 * 1000\r\n          })\r\n        })\r\n      } else {\r\n        vm.$api.base.edit(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '保存成功',\r\n            type: 'success',\r\n            duration: 5 * 1000\r\n          })\r\n        })\r\n      }\r\n    },\r\n    returnIndex() {\r\n      this.$router.push(this.currentPath)\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.form-container {\r\n  margin-left: 50px;\r\n  margin-bottom: 75px;\r\n  max-height: -moz-calc(100vh - 160px);\r\n  max-height: -webkit-calc(100vh - 160px);\r\n  max-height: calc(100vh - 160px);\r\n  overflow-y: auto;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n.el-switch,\r\n.el-input,\r\n.el-textarea {\r\n  width: 220px;\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <div>{{ typeMap[type] }}</div>\r\n    <el-form\r\n      ref=\"form\"\r\n      v-model=\"form\"\r\n      label-position=\"right\"\r\n      label-width=\"120px\"\r\n      :inline=\"true\"\r\n      class=\"form-container\"\r\n    >\r\n      <template v-for=\"(column, k) in fields\">\r\n        <el-form-item\r\n          v-if=\"column.name.toLowerCase() != 'id'\"\r\n          :key=\"k\"\r\n          :prop=\"column.name\"\r\n          :label=\"column.displayName || column.name\"\r\n        >\r\n          <el-switch\r\n            v-if=\"column.dataType == 'Boolean'\"\r\n            v-model=\"form[column.name]\"\r\n            active-color=\"#13ce66\"\r\n            inactive-color=\"#ff4949\"\r\n          />\r\n\r\n          <el-date-picker\r\n            v-else-if=\"column.dataType == 'DateTime'\"\r\n            v-model=\"form[column.name]\"\r\n            type=\"datetime\"\r\n            format=\"YYYY-MM-DD HH:mm:ss\"\r\n            value-format=\"YYYY-MM-DD HH:mm:ss\"\r\n            placeholder=\"选择日期时间\"\r\n          />\r\n\r\n          <el-input\r\n            v-else-if=\"column.dataType == 'String' && column.length > 50\"\r\n            v-model=\"form[column.name]\"\r\n            autosize\r\n            type=\"textarea\"\r\n          />\r\n\r\n          <el-input v-else v-model=\"form[column.name]\" type=\"text\" />\r\n        </el-form-item>\r\n      </template>\r\n\r\n      <el-form-item v-if=\"!isDetail\">\r\n        <div\r\n          style=\"position: fixed; margin:20px; float:right; bottom: 0px; right: 0px; z-index: 1;\"\r\n        >\r\n          <el-button @click=\"returnIndex\">取消</el-button>\r\n          <el-button type=\"primary\" @click=\"confirm\">保存</el-button>\r\n        </div>\r\n      </el-form-item>\r\n    </el-form>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  data() {\r\n    return {\r\n      form: {} as any,\r\n      typeMap: { Add: '新增', Detail: '查看', Edit: '编辑' } as any,\r\n      fields: [\r\n        {\r\n          name: 'id',\r\n          displayName: '编号',\r\n          dataType: 'Int32',\r\n          description: '编号'\r\n        },\r\n        {\r\n          name: 'name',\r\n          displayName: '名称',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '名称'\r\n        },\r\n        {\r\n          name: 'displayName',\r\n          displayName: '显示名',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '显示名'\r\n        },\r\n        {\r\n          name: 'fullName',\r\n          displayName: '全名',\r\n          dataType: 'String',\r\n          length: 200,\r\n          description: '全名'\r\n        },\r\n        {\r\n          name: 'parentID',\r\n          displayName: '父编号',\r\n          dataType: 'Int32',\r\n          description: '父编号'\r\n        },\r\n        {\r\n          name: 'url',\r\n          displayName: '链接',\r\n          dataType: 'String',\r\n          length: 200,\r\n          description: '链接'\r\n        },\r\n        {\r\n          name: 'sort',\r\n          displayName: '排序',\r\n          dataType: 'Int32',\r\n          description: '排序'\r\n        },\r\n        {\r\n          name: 'icon',\r\n          displayName: '图标',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '图标'\r\n        },\r\n        {\r\n          name: 'visible',\r\n          displayName: '可见',\r\n          dataType: 'Boolean',\r\n          description: '可见'\r\n        },\r\n        {\r\n          name: 'necessary',\r\n          displayName: '必要',\r\n          dataType: 'Boolean',\r\n          description:\r\n            '必要。必要的菜单,必须至少有角色拥有这些权限,如果没有则自动授权给系统角色'\r\n        },\r\n        {\r\n          name: 'permission',\r\n          displayName: '权限子项',\r\n          dataType: 'String',\r\n          length: 200,\r\n          description: '权限子项。逗号分隔,每个权限子项名值竖线分隔'\r\n        },\r\n        {\r\n          name: 'ex1',\r\n          displayName: '扩展1',\r\n          dataType: 'Int32',\r\n          description: '扩展1'\r\n        },\r\n        {\r\n          name: 'ex2',\r\n          displayName: '扩展2',\r\n          dataType: 'Int32',\r\n          description: '扩展2'\r\n        },\r\n        {\r\n          name: 'ex3',\r\n          displayName: '扩展3',\r\n          dataType: 'Double',\r\n          description: '扩展3'\r\n        },\r\n        {\r\n          name: 'ex4',\r\n          displayName: '扩展4',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '扩展4'\r\n        },\r\n        {\r\n          name: 'ex5',\r\n          displayName: '扩展5',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '扩展5'\r\n        },\r\n        {\r\n          name: 'ex6',\r\n          displayName: '扩展6',\r\n          dataType: 'String',\r\n          length: 50,\r\n          description: '扩展6'\r\n        },\r\n        {\r\n          name: 'remark',\r\n          displayName: '备注',\r\n          dataType: 'String',\r\n          length: 500,\r\n          description: '备注'\r\n        }\r\n      ] as any\r\n    }\r\n  },\r\n  computed: {\r\n    id() {\r\n      return this.$route.params.id\r\n    },\r\n    currentPath() {\r\n      let vm = this as any\r\n      let rplStr = `/${vm.type}${vm.id === undefined ? '' : '/' + vm.id}`\r\n      return this.$route.path.replace(rplStr, '')\r\n    },\r\n    type(): any {\r\n      return this.$route.params.type\r\n    },\r\n    isAdd() {\r\n      return (this as any).type === 'Add'\r\n    },\r\n    isDetail() {\r\n      return (this as any).type === 'Detail'\r\n    }\r\n  },\r\n  // watch: {\r\n  //   $route: {\r\n  //     handler: function () {\r\n  //       this.init()\r\n  //     },\r\n  //     immediate: true\r\n  //   }\r\n  // },\r\n  created() {\r\n    this.init()\r\n  },\r\n  activated() {\r\n    this.init()\r\n  },\r\n  methods: {\r\n    init() {\r\n      // this.getFields()\r\n      // this.getColumns()\r\n      if (!this.isAdd) {\r\n        this.query()\r\n      }\r\n    },\r\n    getColumns() {\r\n      // TODO 可改造成vue的属性,自动根据路由获取对应的列信息\r\n      let vm = this\r\n      let path = vm.currentPath\r\n      vm.$api.base.getColumns(path).then((res) => {\r\n        vm.fields = res.data\r\n      })\r\n    },\r\n    query() {\r\n      let vm = this\r\n      if (vm.isDetail) {\r\n        vm.$api.base.getDetailData(vm.currentPath, vm.id).then((res) => {\r\n          vm.form = res.data\r\n        })\r\n      } else {\r\n        vm.$api.base.getData(vm.currentPath, vm.id).then((res) => {\r\n          vm.form = res.data\r\n        })\r\n      }\r\n    },\r\n    confirm() {\r\n      let vm = this\r\n      if (vm.isAdd) {\r\n        vm.$api.base.add(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '新增成功',\r\n            type: 'success',\r\n            duration: 5 * 1000\r\n          })\r\n        })\r\n      } else {\r\n        vm.$api.base.edit(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '保存成功',\r\n            type: 'success',\r\n            duration: 5 * 1000\r\n          })\r\n        })\r\n      }\r\n    },\r\n    returnIndex() {\r\n      this.$router.push(this.currentPath)\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.form-container {\r\n  margin-left: 50px;\r\n  margin-bottom: 75px;\r\n  max-height: -moz-calc(100vh - 160px);\r\n  max-height: -webkit-calc(100vh - 160px);\r\n  max-height: calc(100vh - 160px);\r\n  overflow-y: auto;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n.el-switch,\r\n.el-input,\r\n.el-textarea {\r\n  width: 220px;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"list-container\">\r\n    <el-row type=\"flex\" class=\"search\" justify=\"end\">\r\n      <el-col\r\n        :span=\"4\"\r\n        class=\"left-search\"\r\n        v-if=\"hasPermission(permissionFlags.insert)\"\r\n      >\r\n        <el-button type=\"primary\" @click=\"add\">新增</el-button>\r\n      </el-col>\r\n      <el-col :span=\"20\" class=\"right-search\"></el-col>\r\n    </el-row>\r\n    <div class=\"table-container\">\r\n      <el-table\r\n        v-loading=\"listLoading\"\r\n        :data=\"tableData\"\r\n        stripe\r\n        border\r\n        @sort-change=\"sortChange\"\r\n        @row-dblclick=\"rowDblclick\"\r\n        :tree-props=\"{\r\n          children: 'children',\r\n          hasChildren: 'hasChildren'\r\n        }\"\r\n        row-key=\"id\"\r\n        default-expand-all\r\n      >\r\n        <el-table-column prop=\"name\" label=\"节点名\" width=\"180\" />\r\n        <el-table-column prop=\"displayName\" label=\"显示名\" width=\"180\" />\r\n        <el-table-column prop=\"url\" label=\"链接\" width=\"250\" />\r\n        <el-table-column prop=\"sort\" label=\"排序\" width=\"50\" />\r\n        <el-table-column align=\"center\" prop=\"visible\" label=\"可见\" width=\"80\">\r\n          <template v-slot=\"scope\">\r\n            <el-switch\r\n              v-model=\"scope.row.visible\"\r\n              active-color=\"#13ce66\"\r\n              inactive-color=\"#ff4949\"\r\n              disabled\r\n            />\r\n          </template>\r\n        </el-table-column>\r\n        <el-table-column\r\n          align=\"center\"\r\n          prop=\"necessary\"\r\n          label=\"必要\"\r\n          width=\"80\"\r\n        >\r\n          <template v-slot=\"scope\">\r\n            <el-switch\r\n              :value=\"scope.row.necessary\"\r\n              active-color=\"#13ce66\"\r\n              inactive-color=\"#ff4949\"\r\n            />\r\n          </template>\r\n        </el-table-column>\r\n        <el-table-column prop=\"permission\" label=\"权限子项\" width=\"250\" />\r\n\r\n        <el-table-column\r\n          label=\"操作\"\r\n          align=\"center\"\r\n          width=\"140\"\r\n          class-name=\"small-padding fixed-width\"\r\n        >\r\n          <template v-slot=\"scope\">\r\n            <el-button\r\n              v-if=\"\r\n                !hasPermission(permissionFlags.update) &&\r\n                  hasPermission(permissionFlags.detail)\r\n              \"\r\n              type=\"primary\"\r\n              size=\"small\"\r\n              @click=\"detail(scope.row)\"\r\n            >\r\n              查看\r\n            </el-button>\r\n            <el-button\r\n              v-if=\"hasPermission(permissionFlags.update)\"\r\n              type=\"primary\"\r\n              size=\"small\"\r\n              @click=\"editData(scope.row)\"\r\n            >\r\n              编辑\r\n            </el-button>\r\n            <el-button\r\n              v-if=\"hasPermission(permissionFlags.delete)\"\r\n              size=\"small\"\r\n              type=\"danger\"\r\n              @click=\"deleteData(scope.row)\"\r\n            >\r\n              删除\r\n            </el-button>\r\n          </template>\r\n        </el-table-column>\r\n      </el-table>\r\n    </div>\r\n    <!-- <div>\r\n      <el-pagination\r\n        :current-page=\"page.pageIndex\"\r\n        :page-size=\"page.pageSize\"\r\n        :page-sizes=\"[10, 20, 50, 100]\"\r\n        :total=\"page.totalCount\"\r\n        @current-change=\"currentChange\"\r\n        @size-change=\"handleSizeChange\"\r\n        layout=\"total, sizes, prev, pager, next, jumper\"\r\n      ></el-pagination>\r\n    </div> -->\r\n  </div>\r\n</template>\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue';\r\nexport default defineComponent({\r\n  name: 'MenuList',\r\n  data() {\r\n    return {\r\n      tableData: [] as any,\r\n      tableHeight: '300px',\r\n      queryParams: {\r\n        Q: null,\r\n        dateRange: null,\r\n      } as any,\r\n      page: {\r\n        pageIndex: 1,\r\n        pageSize: 20,\r\n        totalCount: 0,\r\n      } as any,\r\n      listLoading: false,\r\n      permissionFlags: {\r\n        none: 0,\r\n        detail: 1,\r\n        insert: 2,\r\n        update: 4,\r\n        delete: 8,\r\n      },\r\n    };\r\n  },\r\n  computed: {\r\n    currentPath() {\r\n      return this.$route.path;\r\n    },\r\n    queryData() {\r\n      const vm = this;\r\n      const dateRange = vm.queryParams.dateRange;\r\n      if (dateRange) {\r\n        vm.queryParams.dtStart = dateRange[0];\r\n        vm.queryParams.dtEnd = dateRange[1];\r\n      } else {\r\n        vm.queryParams.dtStart = null;\r\n        vm.queryParams.dtEnd = null;\r\n      }\r\n\r\n      const temp = {} as any;\r\n      // 查询参数也添加上\r\n      Object.assign(temp, vm.page, vm.queryParams);\r\n      temp.dateRange = undefined;\r\n      return temp;\r\n    },\r\n  },\r\n  // watch: {\r\n  //   $route: {\r\n  //     handler: function () {\r\n  //       this.init()\r\n  //     },\r\n  //     immediate: true\r\n  //   }\r\n  // },\r\n  created() {\r\n    this.init();\r\n  },\r\n  activated() {\r\n    this.init();\r\n  },\r\n  methods: {\r\n    init() {\r\n      this.setQueryParams();\r\n      this.query();\r\n    },\r\n    setQueryParams() {\r\n      // 设置查询参数\r\n      const vm = this;\r\n      for (const key in vm.$route.query) {\r\n        if (Object.hasOwnProperty.call(vm.$route.query, key)) {\r\n          const element = vm.$route.query[key];\r\n          vm.queryParams[key] = element;\r\n        }\r\n      }\r\n    },\r\n    getUrl(column: any, entity: any) {\r\n      // 针对指定实体对象计算url,替换其中变量\r\n      const reg = /{(\\w+)}/g;\r\n      return column.cellUrl.replace(reg, (a: any, b: any) => entity[b]);\r\n    },\r\n    add() {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Add');\r\n    },\r\n    detail(row: any) {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Detail/' + row.id);\r\n    },\r\n    editData(row: any) {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Edit/' + row.id);\r\n    },\r\n    deleteData(row: any) {\r\n      const vm = this;\r\n      vm.$api.base.deleteById(vm.currentPath, row.id).then(() => {\r\n        vm.getTableData();\r\n      });\r\n    },\r\n    query() {\r\n      this.page.pageIndex = 1;\r\n      this.getTableData();\r\n    },\r\n    getTableData() {\r\n      const vm = this;\r\n      vm.listLoading = true;\r\n\r\n      vm.$api.base.getDataList(vm.currentPath, vm.queryData).then((res) => {\r\n        vm.listLoading = false;\r\n        const tableData = vm.getTreeData(res.data);\r\n        // console.log(tableData)\r\n        vm.tableData = tableData;\r\n        vm.page = (res as any).pager;\r\n        vm.page.totalCount = parseInt(vm.page.totalCount);\r\n        vm.setTableHeight(vm.tableData.length);\r\n      });\r\n    },\r\n    getTreeData(dataList: any, pId = 0) {\r\n      // 将列表数据构造成树状结构数据\r\n\r\n      const vm = this;\r\n\r\n      if (!dataList || dataList.length < 1) {\r\n        return [];\r\n      }\r\n\r\n      const len = dataList.length;\r\n      // 父级列表\r\n      const pList = [];\r\n      for (let idx = 0; idx < len; idx++) {\r\n        const e = dataList[idx];\r\n\r\n        if (e.parentID === pId) {\r\n          const m = {\r\n            id: e.id,\r\n            name: e.name,\r\n            displayName: e.displayName,\r\n            parentID: e.parentID,\r\n          };\r\n          pList.push(e);\r\n          const children = vm.getTreeData(dataList, e.id);\r\n          if (children.length > 0) {\r\n            e.children = children;\r\n          }\r\n        }\r\n      }\r\n\r\n      return pList;\r\n    },\r\n    currentChange(val: any) {\r\n      this.page.pageIndex = val;\r\n      this.getTableData();\r\n    },\r\n    handleSizeChange(val: any) {\r\n      this.page.pageSize = val;\r\n      this.getTableData();\r\n    },\r\n    sortChange({ column, prop, order }: any) {\r\n      if (order === 'ascending') {\r\n        this.page.desc = false;\r\n        this.page.sort = prop;\r\n      } else if (order === 'descending') {\r\n        this.page.desc = true;\r\n        this.page.sort = prop;\r\n      } else {\r\n        this.page.desc = true;\r\n        this.page.sort = undefined;\r\n      }\r\n      this.getTableData();\r\n    },\r\n    rowDblclick(row: any) {\r\n      this.editData(row);\r\n    },\r\n    hasPermission(actionId: any) {\r\n      const vm = this as any;\r\n      const menuId = vm.$route.meta.menuId;\r\n      const permissions = vm.$route.meta.permissions;\r\n      const has = vm.$store.state.user.hasPermission(vm.$store, {\r\n        menuId,\r\n        actionId,\r\n        permissions,\r\n      });\r\n      return has;\r\n    },\r\n    setTableHeight(count: any) {\r\n      // 根据数据条数设置表格高度,最高设置708px,一页最多显示20条\r\n      const vm = this;\r\n      // console.log(count)\r\n      if (count && count > 0) {\r\n        if (count > 20) {\r\n          count = 20;\r\n        } else if (count < 8) {\r\n          count = 9;\r\n        }\r\n        setTimeout(() => {\r\n          vm.tableHeight = count * 35.9 + 'px';\r\n        }, 500);\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n<style scoped>\r\n.list-container {\r\n  height: -moz-calc(100vh - 61px);\r\n  height: -webkit-calc(100vh - 61px);\r\n  height: calc(100vh - 61px);\r\n  overflow-x: hidden;\r\n  overflow-y: auto;\r\n}\r\n\r\n.search {\r\n  /* height: 60px; */\r\n  /* overflow: hidden; */\r\n  /* position: relative; */\r\n  display: -moz-flex;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n}\r\n\r\n.search .left-search {\r\n  line-height: 58px;\r\n  /* height: 60px; */\r\n  /* float: left; */\r\n  padding: 0 10px;\r\n}\r\n.search .right-search {\r\n  line-height: 58px;\r\n  /* height: 65px; */\r\n  /* float: right; */\r\n  /* max-height: 110px; */\r\n  padding: 0 10px;\r\n  /* overflow-y: auto; */\r\n}\r\n.table-container {\r\n  /* max-height: calc(100vh - 177px); */\r\n  /* overflow-y: auto; */\r\n  height: auto;\r\n  margin-bottom: 2px;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n.search .el-input,\r\n.el-button,\r\n.el-date-editor {\r\n  margin-right: 2px;\r\n}\r\n\r\n.search .el-date-editor {\r\n  width: 250px;\r\n}\r\n\r\n/** 操作按钮 */\r\n.el-table .el-button + .el-button {\r\n  margin-left: 3px;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"list-container\">\r\n    <el-row type=\"flex\" class=\"search\" justify=\"end\">\r\n      <el-col\r\n        :span=\"4\"\r\n        class=\"left-search\"\r\n        v-if=\"hasPermission(permissionFlags.insert)\"\r\n      >\r\n        <el-button type=\"primary\" @click=\"add\">新增</el-button>\r\n      </el-col>\r\n      <el-col :span=\"20\" class=\"right-search\"></el-col>\r\n    </el-row>\r\n    <div class=\"table-container\">\r\n      <el-table\r\n        v-loading=\"listLoading\"\r\n        :data=\"tableData\"\r\n        stripe\r\n        border\r\n        @sort-change=\"sortChange\"\r\n        @row-dblclick=\"rowDblclick\"\r\n        :tree-props=\"{\r\n          children: 'children',\r\n          hasChildren: 'hasChildren'\r\n        }\"\r\n        row-key=\"id\"\r\n        default-expand-all\r\n      >\r\n        <el-table-column prop=\"name\" label=\"节点名\" width=\"180\" />\r\n        <el-table-column prop=\"displayName\" label=\"显示名\" width=\"180\" />\r\n        <el-table-column prop=\"url\" label=\"链接\" width=\"250\" />\r\n        <el-table-column prop=\"sort\" label=\"排序\" width=\"50\" />\r\n        <el-table-column align=\"center\" prop=\"visible\" label=\"可见\" width=\"80\">\r\n          <template v-slot=\"scope\">\r\n            <el-switch\r\n              v-model=\"scope.row.visible\"\r\n              active-color=\"#13ce66\"\r\n              inactive-color=\"#ff4949\"\r\n              disabled\r\n            />\r\n          </template>\r\n        </el-table-column>\r\n        <el-table-column\r\n          align=\"center\"\r\n          prop=\"necessary\"\r\n          label=\"必要\"\r\n          width=\"80\"\r\n        >\r\n          <template v-slot=\"scope\">\r\n            <el-switch\r\n              :value=\"scope.row.necessary\"\r\n              active-color=\"#13ce66\"\r\n              inactive-color=\"#ff4949\"\r\n            />\r\n          </template>\r\n        </el-table-column>\r\n        <el-table-column prop=\"permission\" label=\"权限子项\" width=\"250\" />\r\n\r\n        <el-table-column\r\n          label=\"操作\"\r\n          align=\"center\"\r\n          width=\"140\"\r\n          class-name=\"small-padding fixed-width\"\r\n        >\r\n          <template v-slot=\"scope\">\r\n            <el-button\r\n              v-if=\"\r\n                !hasPermission(permissionFlags.update) &&\r\n                  hasPermission(permissionFlags.detail)\r\n              \"\r\n              type=\"primary\"\r\n              size=\"small\"\r\n              @click=\"detail(scope.row)\"\r\n            >\r\n              查看\r\n            </el-button>\r\n            <el-button\r\n              v-if=\"hasPermission(permissionFlags.update)\"\r\n              type=\"primary\"\r\n              size=\"small\"\r\n              @click=\"editData(scope.row)\"\r\n            >\r\n              编辑\r\n            </el-button>\r\n            <el-button\r\n              v-if=\"hasPermission(permissionFlags.delete)\"\r\n              size=\"small\"\r\n              type=\"danger\"\r\n              @click=\"deleteData(scope.row)\"\r\n            >\r\n              删除\r\n            </el-button>\r\n          </template>\r\n        </el-table-column>\r\n      </el-table>\r\n    </div>\r\n    <!-- <div>\r\n      <el-pagination\r\n        :current-page=\"page.pageIndex\"\r\n        :page-size=\"page.pageSize\"\r\n        :page-sizes=\"[10, 20, 50, 100]\"\r\n        :total=\"page.totalCount\"\r\n        @current-change=\"currentChange\"\r\n        @size-change=\"handleSizeChange\"\r\n        layout=\"total, sizes, prev, pager, next, jumper\"\r\n      ></el-pagination>\r\n    </div> -->\r\n  </div>\r\n</template>\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue';\r\nexport default defineComponent({\r\n  name: 'MenuList',\r\n  data() {\r\n    return {\r\n      tableData: [] as any,\r\n      tableHeight: '300px',\r\n      queryParams: {\r\n        Q: null,\r\n        dateRange: null,\r\n      } as any,\r\n      page: {\r\n        pageIndex: 1,\r\n        pageSize: 20,\r\n        totalCount: 0,\r\n      } as any,\r\n      listLoading: false,\r\n      permissionFlags: {\r\n        none: 0,\r\n        detail: 1,\r\n        insert: 2,\r\n        update: 4,\r\n        delete: 8,\r\n      },\r\n    };\r\n  },\r\n  computed: {\r\n    currentPath() {\r\n      return this.$route.path;\r\n    },\r\n    queryData() {\r\n      const vm = this;\r\n      const dateRange = vm.queryParams.dateRange;\r\n      if (dateRange) {\r\n        vm.queryParams.dtStart = dateRange[0];\r\n        vm.queryParams.dtEnd = dateRange[1];\r\n      } else {\r\n        vm.queryParams.dtStart = null;\r\n        vm.queryParams.dtEnd = null;\r\n      }\r\n\r\n      const temp = {} as any;\r\n      // 查询参数也添加上\r\n      Object.assign(temp, vm.page, vm.queryParams);\r\n      temp.dateRange = undefined;\r\n      return temp;\r\n    },\r\n  },\r\n  // watch: {\r\n  //   $route: {\r\n  //     handler: function () {\r\n  //       this.init()\r\n  //     },\r\n  //     immediate: true\r\n  //   }\r\n  // },\r\n  created() {\r\n    this.init();\r\n  },\r\n  activated() {\r\n    this.init();\r\n  },\r\n  methods: {\r\n    init() {\r\n      this.setQueryParams();\r\n      this.query();\r\n    },\r\n    setQueryParams() {\r\n      // 设置查询参数\r\n      const vm = this;\r\n      for (const key in vm.$route.query) {\r\n        if (Object.hasOwnProperty.call(vm.$route.query, key)) {\r\n          const element = vm.$route.query[key];\r\n          vm.queryParams[key] = element;\r\n        }\r\n      }\r\n    },\r\n    getUrl(column: any, entity: any) {\r\n      // 针对指定实体对象计算url,替换其中变量\r\n      const reg = /{(\\w+)}/g;\r\n      return column.cellUrl.replace(reg, (a: any, b: any) => entity[b]);\r\n    },\r\n    add() {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Add');\r\n    },\r\n    detail(row: any) {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Detail/' + row.id);\r\n    },\r\n    editData(row: any) {\r\n      const vm = this;\r\n      vm.$router.push(vm.currentPath + '/Edit/' + row.id);\r\n    },\r\n    deleteData(row: any) {\r\n      const vm = this;\r\n      vm.$api.base.deleteById(vm.currentPath, row.id).then(() => {\r\n        vm.getTableData();\r\n      });\r\n    },\r\n    query() {\r\n      this.page.pageIndex = 1;\r\n      this.getTableData();\r\n    },\r\n    getTableData() {\r\n      const vm = this;\r\n      vm.listLoading = true;\r\n\r\n      vm.$api.base.getDataList(vm.currentPath, vm.queryData).then((res) => {\r\n        vm.listLoading = false;\r\n        const tableData = vm.getTreeData(res.data);\r\n        // console.log(tableData)\r\n        vm.tableData = tableData;\r\n        vm.page = (res as any).pager;\r\n        vm.page.totalCount = parseInt(vm.page.totalCount);\r\n        vm.setTableHeight(vm.tableData.length);\r\n      });\r\n    },\r\n    getTreeData(dataList: any, pId = 0) {\r\n      // 将列表数据构造成树状结构数据\r\n\r\n      const vm = this;\r\n\r\n      if (!dataList || dataList.length < 1) {\r\n        return [];\r\n      }\r\n\r\n      const len = dataList.length;\r\n      // 父级列表\r\n      const pList = [];\r\n      for (let idx = 0; idx < len; idx++) {\r\n        const e = dataList[idx];\r\n\r\n        if (e.parentID === pId) {\r\n          const m = {\r\n            id: e.id,\r\n            name: e.name,\r\n            displayName: e.displayName,\r\n            parentID: e.parentID,\r\n          };\r\n          pList.push(e);\r\n          const children = vm.getTreeData(dataList, e.id);\r\n          if (children.length > 0) {\r\n            e.children = children;\r\n          }\r\n        }\r\n      }\r\n\r\n      return pList;\r\n    },\r\n    currentChange(val: any) {\r\n      this.page.pageIndex = val;\r\n      this.getTableData();\r\n    },\r\n    handleSizeChange(val: any) {\r\n      this.page.pageSize = val;\r\n      this.getTableData();\r\n    },\r\n    sortChange({ column, prop, order }: any) {\r\n      if (order === 'ascending') {\r\n        this.page.desc = false;\r\n        this.page.sort = prop;\r\n      } else if (order === 'descending') {\r\n        this.page.desc = true;\r\n        this.page.sort = prop;\r\n      } else {\r\n        this.page.desc = true;\r\n        this.page.sort = undefined;\r\n      }\r\n      this.getTableData();\r\n    },\r\n    rowDblclick(row: any) {\r\n      this.editData(row);\r\n    },\r\n    hasPermission(actionId: any) {\r\n      const vm = this as any;\r\n      const menuId = vm.$route.meta.menuId;\r\n      const permissions = vm.$route.meta.permissions;\r\n      const has = vm.$store.state.user.hasPermission(vm.$store, {\r\n        menuId,\r\n        actionId,\r\n        permissions,\r\n      });\r\n      return has;\r\n    },\r\n    setTableHeight(count: any) {\r\n      // 根据数据条数设置表格高度,最高设置708px,一页最多显示20条\r\n      const vm = this;\r\n      // console.log(count)\r\n      if (count && count > 0) {\r\n        if (count > 20) {\r\n          count = 20;\r\n        } else if (count < 8) {\r\n          count = 9;\r\n        }\r\n        setTimeout(() => {\r\n          vm.tableHeight = count * 35.9 + 'px';\r\n        }, 500);\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n<style scoped>\r\n.list-container {\r\n  height: -moz-calc(100vh - 61px);\r\n  height: -webkit-calc(100vh - 61px);\r\n  height: calc(100vh - 61px);\r\n  overflow-x: hidden;\r\n  overflow-y: auto;\r\n}\r\n\r\n.search {\r\n  /* height: 60px; */\r\n  /* overflow: hidden; */\r\n  /* position: relative; */\r\n  display: -moz-flex;\r\n  display: -webkit-flex;\r\n  display: flex;\r\n}\r\n\r\n.search .left-search {\r\n  line-height: 58px;\r\n  /* height: 60px; */\r\n  /* float: left; */\r\n  padding: 0 10px;\r\n}\r\n.search .right-search {\r\n  line-height: 58px;\r\n  /* height: 65px; */\r\n  /* float: right; */\r\n  /* max-height: 110px; */\r\n  padding: 0 10px;\r\n  /* overflow-y: auto; */\r\n}\r\n.table-container {\r\n  /* max-height: calc(100vh - 177px); */\r\n  /* overflow-y: auto; */\r\n  height: auto;\r\n  margin-bottom: 2px;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n.search .el-input,\r\n.el-button,\r\n.el-date-editor {\r\n  margin-right: 2px;\r\n}\r\n\r\n.search .el-date-editor {\r\n  width: 250px;\r\n}\r\n\r\n/** 操作按钮 */\r\n.el-table .el-button + .el-button {\r\n  margin-left: 3px;\r\n}\r\n</style>\r\n","export const tableSearchConfig = [\r\n  {\r\n    itemType: 'datePicker',\r\n    name: 'dtStart$dtEnd',\r\n    displayName: '时间范围',\r\n    showInSearch: true,\r\n    options: { type: 'daterange', setDefaultValue: false },\r\n  },\r\n  {\r\n    name: 'Q',\r\n    displayName: '',\r\n    showInSearch: true,\r\n    options: {\r\n      placeholder: '请输入关键字',\r\n    },\r\n  },\r\n];\r\n\r\nexport const tableColumnConfig = [\r\n  {\r\n    name: 'id',\r\n    displayName: '编号',\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '编号',\r\n    showInList: true,\r\n    width: '95',\r\n  },\r\n  {\r\n    name: 'name',\r\n    displayName: '名称',\r\n    dataType: 'String',\r\n    itemType: null,\r\n    length: 50,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '名称',\r\n    showInList: true,\r\n    width: '95',\r\n  },\r\n  {\r\n    name: 'enable',\r\n    displayName: '启用',\r\n    dataType: 'Boolean',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '启用',\r\n    showInList: true,\r\n    width: '95',\r\n  },\r\n  {\r\n    name: 'isSystem',\r\n    displayName: '系统',\r\n    dataType: 'Boolean',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description:\r\n      '系统。用于业务系统开发使用,不受数据权限约束,禁止修改名称或删除',\r\n    showInList: true,\r\n    width: '95',\r\n  },\r\n  {\r\n    name: 'permission',\r\n    displayName: '权限',\r\n    dataType: 'String',\r\n    itemType: null,\r\n    length: -1,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '权限。对不同资源的权限,逗号分隔,每个资源的权限子项竖线分隔',\r\n    showInList: false,\r\n    width: '95',\r\n  },\r\n  {\r\n    name: 'sort',\r\n    displayName: '排序',\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '排序',\r\n    showInList: true,\r\n    width: '95',\r\n  },\r\n  {\r\n    name: 'ex1',\r\n    displayName: '扩展1',\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '扩展1',\r\n    showInList: true,\r\n    width: '105',\r\n  },\r\n  {\r\n    name: 'ex2',\r\n    displayName: '扩展2',\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '扩展2',\r\n    showInList: true,\r\n    width: '105',\r\n  },\r\n  {\r\n    name: 'ex3',\r\n    displayName: '扩展3',\r\n    dataType: 'Double',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '扩展3',\r\n    showInList: true,\r\n    width: '105',\r\n  },\r\n  {\r\n    name: 'ex4',\r\n    displayName: '扩展4',\r\n    dataType: 'String',\r\n    itemType: null,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '扩展4',\r\n    showInList: true,\r\n    width: '105',\r\n  },\r\n  {\r\n    name: 'ex5',\r\n    displayName: '扩展5',\r\n    dataType: 'String',\r\n    itemType: null,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '扩展5',\r\n    showInList: true,\r\n    width: '105',\r\n  },\r\n  {\r\n    name: 'ex6',\r\n    displayName: '扩展6',\r\n    dataType: 'String',\r\n    itemType: null,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '扩展6',\r\n    showInList: true,\r\n    width: '105',\r\n  },\r\n  {\r\n    name: 'createUser',\r\n    displayName: '创建者',\r\n    dataType: 'String',\r\n    itemType: null,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '创建者',\r\n    showInList: true,\r\n    width: '105',\r\n  },\r\n  {\r\n    name: 'createUserID',\r\n    displayName: '创建用户',\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '创建用户',\r\n    showInList: true,\r\n    width: '120',\r\n  },\r\n  {\r\n    name: 'createIP',\r\n    displayName: '创建地址',\r\n    dataType: 'String',\r\n    itemType: null,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '创建地址',\r\n    showInList: true,\r\n    width: '120',\r\n  },\r\n  {\r\n    name: 'createTime',\r\n    displayName: '创建时间',\r\n    dataType: 'DateTime',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '创建时间',\r\n    showInList: true,\r\n    width: '155',\r\n  },\r\n  {\r\n    name: 'updateUser',\r\n    displayName: '更新者',\r\n    dataType: 'String',\r\n    itemType: null,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '更新者',\r\n    showInList: true,\r\n    width: '105',\r\n  },\r\n  {\r\n    name: 'updateUserID',\r\n    displayName: '更新用户',\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '更新用户',\r\n    showInList: true,\r\n    width: '120',\r\n  },\r\n  {\r\n    name: 'updateIP',\r\n    displayName: '更新地址',\r\n    dataType: 'String',\r\n    itemType: null,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '更新地址',\r\n    showInList: true,\r\n    width: '120',\r\n  },\r\n  {\r\n    name: 'updateTime',\r\n    displayName: '更新时间',\r\n    dataType: 'DateTime',\r\n    itemType: null,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '更新时间',\r\n    showInList: true,\r\n    width: '155',\r\n  },\r\n  {\r\n    name: 'remark',\r\n    displayName: '备注',\r\n    dataType: 'String',\r\n    itemType: null,\r\n    length: 500,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '备注',\r\n    showInList: true,\r\n    width: '95',\r\n  },\r\n];\r\n","<template>\r\n  <div>\r\n    <div>{{ typeMap[type] }}</div>\r\n    <el-form\r\n      ref=\"form\"\r\n      v-model=\"form\"\r\n      label-position=\"right\"\r\n      label-width=\"120px\"\r\n      :inline=\"true\"\r\n      class=\"form-container\"\r\n    >\r\n      <el-form-item label=\"名称\" prop=\"name\">\r\n        <el-input v-model=\"form.name\" />\r\n      </el-form-item>\r\n      <el-form-item label=\"启用\" prop=\"enable\">\r\n        <el-switch\r\n          v-model=\"form.enable\"\r\n          active-color=\"#13ce66\"\r\n          inactive-color=\"#ff4949\"\r\n        />\r\n      </el-form-item>\r\n      <el-form-item label=\"系统\" prop=\"isSystem\">\r\n        <el-switch\r\n          v-model=\"form.isSystem\"\r\n          active-color=\"#13ce66\"\r\n          inactive-color=\"#ff4949\"\r\n        />\r\n      </el-form-item>\r\n      <el-form-item label=\"备注\" prop=\"remark\">\r\n        <el-input :rows=\"4\" type=\"textarea\" v-model=\"form.remark\" />\r\n      </el-form-item>\r\n\r\n      <el-form-item>\r\n        <div\r\n          style=\"\r\n            position: fixed;\r\n            margin: 20px;\r\n            float: right;\r\n            bottom: 0px;\r\n            right: 0px;\r\n            z-index: 1;\r\n          \"\r\n        >\r\n          <el-button @click=\"returnIndex\">返回</el-button>\r\n          <el-button type=\"primary\" @click=\"confirm\">保存</el-button>\r\n        </div>\r\n      </el-form-item>\r\n      <el-table\r\n        v-if=\"!isAdd\"\r\n        :data=\"tableData\"\r\n        :tree-props=\"{\r\n          children: 'children',\r\n          hasChildren: 'hasChildren',\r\n        }\"\r\n        row-key=\"id\"\r\n        border\r\n        default-expand-all\r\n      >\r\n        >\r\n        <el-table-column prop=\"name\" label=\"名称\" width=\"200\" />\r\n        <el-table-column prop=\"displayName\" label=\"显示名\" width=\"100\" />\r\n        <!-- <el-table-column label=\"授权\" width=\"60\">\r\n          <template v-slot=\"scope\">\r\n            <el-checkbox\r\n              v-model=\"form['p' + scope.row.id]\"\r\n              @change=\"handleCheckAllChange\"\r\n            />\r\n          </template>\r\n        </el-table-column>-->\r\n        <el-table-column label=\"操作\">\r\n          <template v-slot=\"scope\">\r\n            <template v-if=\"Object.entries(scope.row.permissions).length > 0\">\r\n              <el-checkbox\r\n                :indeterminate=\"imObj[scope.row.id]\"\r\n                v-model=\"form['p' + scope.row.id]\"\r\n                @change=\"checkAllChange(scope.row)\"\r\n              >\r\n                全选\r\n              </el-checkbox>\r\n              <el-checkbox\r\n                v-for=\"(item, key) in scope.row.permissions\"\r\n                :key=\"scope.row.id + '' + key\"\r\n                :label=\"item\"\r\n                v-model=\"form['pf' + scope.row.id + '_' + key]\"\r\n                @change=\"checkChange(scope.row)\"\r\n              ></el-checkbox>\r\n            </template>\r\n            <template v-else>\r\n              <!-- 父级全选 -->\r\n              <el-checkbox\r\n                :indeterminate=\"imObj[scope.row.id]\"\r\n                v-model=\"form['p' + scope.row.id]\"\r\n                @change=\"parentCheckAllChange(scope.row)\"\r\n              >\r\n                全选\r\n              </el-checkbox>\r\n              <!-- <el-checkbox>读写</el-checkbox> -->\r\n              <el-checkbox\r\n                v-model=\"form['pc_readonly_' + scope.row.id]\"\r\n                @change=\"roCheck(scope.row)\"\r\n              >\r\n                只读\r\n              </el-checkbox>\r\n            </template>\r\n          </template>\r\n        </el-table-column>\r\n      </el-table>\r\n    </el-form>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue';\r\nexport default defineComponent({\r\n  data() {\r\n    return {\r\n      form: {} as any,\r\n      fields: [],\r\n      imObj: {} as any, // 父级全选半选状态\r\n      typeMap: { Add: '新增', Detail: '查看', Edit: '编辑' } as any,\r\n    };\r\n  },\r\n  computed: {\r\n    id() {\r\n      return this.$route.params.id;\r\n    },\r\n    currentPath() {\r\n      const vm = this as any;\r\n      const rplStr = `/${vm.type}${vm.id === undefined ? '' : '/' + vm.id}`;\r\n      return this.$route.path.replace(rplStr, '');\r\n    },\r\n    type() {\r\n      return this.$route.params.type as any;\r\n    },\r\n    isAdd() {\r\n      return (this as any).type === 'Add';\r\n    },\r\n    isDetail() {\r\n      return (this as any).type === 'Detail';\r\n    },\r\n    rolePermissions() {\r\n      // 角色菜单权限\r\n      const vm = this;\r\n      // permission格式: 1#255,2#255。#前为菜单id,#后为权限值\r\n      const permission = vm.form.permission;\r\n      const pObj = {} as any;\r\n      if (!permission) {\r\n        return pObj;\r\n      }\r\n      const mlist = permission.split(',');\r\n      for (const key in mlist) {\r\n        if (Object.prototype.hasOwnProperty.call(mlist, key)) {\r\n          const m = mlist[key];\r\n          const p = m.split('#');\r\n          pObj[p[0]] = p[1];\r\n        }\r\n      }\r\n      return pObj;\r\n    },\r\n    tableData() {\r\n      // console.log('init')\r\n      // 角色菜单数据\r\n      const vm = this;\r\n      const menuRouters: any[] = vm.$store.getters.menuRouters;\r\n      const menus: any[] = [];\r\n      menuRouters.map((i: any) => {\r\n        const menu = {\r\n          id: i.id,\r\n          name: i.name,\r\n          displayName: i.displayName,\r\n          permissions: i.permissions,\r\n          parentID: i.parentID,\r\n        } as any;\r\n\r\n        // // 父级全选勾选框是否勾选\r\n        // let pCheck = false\r\n\r\n        if (i.hasChildren) {\r\n          menu.children = [];\r\n          i.children.map((j: any) => {\r\n            // 表单路由不处理\r\n            if (j.isFormRoute) {\r\n              return;\r\n            }\r\n            const menuChild = {\r\n              id: j.id,\r\n              name: j.name,\r\n              displayName: j.displayName,\r\n              permissions: j.permissions,\r\n              parentID: j.parentID,\r\n            };\r\n\r\n            // // 全选勾选框是否勾选,取决于子项是否有勾选\r\n            // let pc = false\r\n            // // 子项勾选个数\r\n            // let checkChildCount = 0\r\n\r\n            // // 设置操作勾选框\r\n            // menuChild.permissions.map((p) => {\r\n            //   let c = (p.k & vm.rolePermissions[j.id]) !== 0\r\n            //   if (c) checkChildCount = checkChildCount + 1\r\n            //   vm.form['pf' + j.id + '_' + p.k] = c\r\n            //   pc = pc || c\r\n            // })\r\n\r\n            // // 设置全选勾选框\r\n            // vm.form['p' + j.id] = pc\r\n            // pCheck = pCheck || pc\r\n\r\n            menu.children.push(menuChild);\r\n\r\n            // 更新勾选框状态\r\n            // vm.checkChange(menuChild)\r\n          });\r\n        } else {\r\n          // pCheck = true\r\n        }\r\n\r\n        // 设置授权勾选框\r\n        // vm.form['p' + i.id] = pCheck\r\n        menus.push(menu);\r\n      });\r\n\r\n      return menus;\r\n    },\r\n  },\r\n  // watch: {\r\n  //   $route: {\r\n  //     handler: function () {\r\n  //       this.init()\r\n  //     },\r\n  //     immediate: true\r\n  //   }\r\n  // },\r\n  created() {\r\n    this.init();\r\n  },\r\n  activated() {\r\n    this.init();\r\n  },\r\n  methods: {\r\n    init() {\r\n      if (!this.isAdd) {\r\n        this.query();\r\n      }\r\n    },\r\n    query() {\r\n      const vm = this;\r\n      vm.$api.base.getData(vm.currentPath, vm.id).then((res: any) => {\r\n        vm.form = res.data;\r\n        vm.allCheckUpdate();\r\n      });\r\n    },\r\n    confirm() {\r\n      const vm = this;\r\n      if (vm.isAdd) {\r\n        vm.$api.base.add(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '新增成功',\r\n            type: 'success',\r\n            duration: 5 * 1000,\r\n          });\r\n          vm.$router.go(-1);\r\n        });\r\n      } else {\r\n        vm.$api.base.edit(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '保存成功',\r\n            type: 'success',\r\n            duration: 5 * 1000,\r\n          });\r\n          vm.$router.go(-1);\r\n        });\r\n      }\r\n    },\r\n    returnIndex() {\r\n      this.$router.push(this.currentPath);\r\n    },\r\n    checkChange({ id, permissions, parentID }: any) {\r\n      // console.log('checkChange', id)\r\n      // 子权限项勾选,\r\n      const vm = this;\r\n      let pCheck = false;\r\n      let checkCount = 0;\r\n      for (const key in permissions) {\r\n        if (Object.prototype.hasOwnProperty.call(permissions, key)) {\r\n          const c = vm.form['pf' + id + '_' + key];\r\n          if (c) {\r\n            checkCount = checkCount + 1;\r\n          }\r\n          pCheck = pCheck || c;\r\n        }\r\n      }\r\n      // permissions.forEach((e: any) => {\r\n      //   const c = vm.form['pf' + id + '_' + e.k];\r\n      //   if (c) {\r\n      //     checkCount = checkCount + 1;\r\n      //   }\r\n      //   pCheck = pCheck || c;\r\n      // });\r\n\r\n      vm.form['p' + id] = pCheck;\r\n      vm.imObj[id] =\r\n        checkCount > 0 && checkCount < Object.entries(permissions).length;\r\n\r\n      // 更新父级全选\r\n      vm.parentCheckUpdate(parentID);\r\n    },\r\n    checkAllChange({ id, permissions, parentID }: any) {\r\n      // console.log('checkAllChange', id, permissions)\r\n      // 子权限项全勾选,更新子级级勾选\r\n      const vm = this;\r\n      const pCheck = vm.form['p' + id];\r\n      for (const key in permissions) {\r\n        if (Object.prototype.hasOwnProperty.call(permissions, key)) {\r\n          vm.form['pf' + id + '_' + key] = pCheck;\r\n        }\r\n      }\r\n      // permissions.forEach((e: any) => {\r\n      //   vm.form['pf' + id + '_' + e.k] = pCheck;\r\n      // });\r\n\r\n      vm.imObj[id] = false;\r\n\r\n      // 更新父级全选\r\n      vm.parentCheckUpdate(parentID);\r\n    },\r\n    parentCheckAllChange({ id, children }: any) {\r\n      // console.log('parentCheckAllChange', id, children)\r\n\r\n      // 父级全选,勾选所有子权限项\r\n      const vm = this;\r\n      const pCheck = vm.form['p' + id];\r\n      children.forEach((e: any) => {\r\n        vm.form['p' + e.id] = pCheck;\r\n        vm.checkAllChange({\r\n          id: e.id,\r\n          permissions: e.permissions,\r\n          parentID: e.parentID,\r\n        });\r\n      });\r\n\r\n      vm.imObj[id] = false;\r\n    },\r\n    parentCheckUpdate(parentID: any) {\r\n      // console.log('parentCheckUpdate', parentID)\r\n\r\n      // 父级勾选状态更新\r\n      const vm = this;\r\n      let parentCheck = false;\r\n      let parentIm = false;\r\n      const parent = vm.tableData.find((f) => f.id === parentID);\r\n      parent.children.forEach((e: any) => {\r\n        const c = vm.form['p' + e.id];\r\n        const im = vm.imObj[e.id];\r\n        parentCheck = parentCheck || c || false;\r\n        parentIm = parentIm || !c || im || false;\r\n        // console.log(parentCheck, !parentIm, !c)\r\n      });\r\n\r\n      if (!parentCheck) {\r\n        parentIm = false;\r\n      }\r\n\r\n      vm.form['p' + parentID] = parentCheck;\r\n      vm.imObj[parentID] = parentIm;\r\n    },\r\n    roCheck({ id, children }: any) {\r\n      // 只读勾选,勾选所有子权限只读项\r\n      const vm = this;\r\n      const pCheck = vm.form['pc_readonly_' + id];\r\n      children.forEach((e: any) => {\r\n        vm.form['pf' + e.id + '_' + 1] = pCheck;\r\n        vm.checkChange(e);\r\n      });\r\n    },\r\n    allCheckUpdate() {\r\n      // console.log('allCheckUpdate', this.tableData)\r\n      // 更新所有勾选框状态\r\n      const vm = this;\r\n      vm.tableData.map((menu) => {\r\n        // console.log('0', menu)\r\n\r\n        // 处理当前菜单权限勾选\r\n        if (menu.permissions) {\r\n          for (const key in menu.permissions) {\r\n            if (Object.prototype.hasOwnProperty.call(menu.permissions, key)) {\r\n              // const p = menu.permissions[key];\r\n              const c =\r\n                // tslint:disable-next-line:no-bitwise\r\n                (parseInt(key, 10) &\r\n                  parseInt(vm.rolePermissions[menu.id], 10)) !==\r\n                0;\r\n              // console.log('allCheckUpdate1', menu.id, p.k, c)\r\n              vm.form['pf' + menu.id + '_' + key] = c;\r\n            }\r\n          }\r\n          // menu.permissions.map((p: any) => {\r\n          //   // console.log('1', p)\r\n\r\n          //   let c = (p.k & vm.rolePermissions[menu.id]) !== 0\r\n          //   // console.log('allCheckUpdate1', menu.id, p.k, c)\r\n          //   vm.form['pf' + menu.id + '_' + p.k] = c\r\n          // })\r\n        }\r\n\r\n        // 子菜单\r\n        if (menu.children) {\r\n          menu.children.map((j: any) => {\r\n            // console.log('2', j)\r\n            // 设置操作勾选框\r\n            for (const key in j.permissions) {\r\n              if (Object.prototype.hasOwnProperty.call(j.permissions, key)) {\r\n                const p = j.permissions[key];\r\n\r\n                const c =\r\n                  // tslint:disable-next-line:no-bitwise\r\n                  (parseInt(key, 10) &\r\n                    parseInt(vm.rolePermissions[j.id], 10)) !==\r\n                  0;\r\n                // console.log('allCheckUpdate2', j.id, p.k, c)\r\n\r\n                vm.form['pf' + j.id + '_' + parseInt(key, 10)] = c;\r\n              }\r\n            }\r\n            // j.permissions.map((p: any) => {\r\n            //   // console.log('3', p)\r\n\r\n            //   const c = (p.k & vm.rolePermissions[j.id]) !== 0;\r\n            //   // console.log('allCheckUpdate2', j.id, p.k, c)\r\n\r\n            //   vm.form['pf' + j.id + '_' + p.k] = c;\r\n            // });\r\n            vm.checkChange(j);\r\n          });\r\n        }\r\n      });\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.form-container {\r\n  margin-left: 50px;\r\n  margin-bottom: 75px;\r\n  max-height: -moz-calc(100vh - 160px);\r\n  max-height: -webkit-calc(100vh - 160px);\r\n  max-height: calc(100vh - 160px);\r\n  overflow-y: auto;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n.el-switch,\r\n.el-input,\r\n.el-textarea {\r\n  width: 220px;\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <div>{{ typeMap[type] }}</div>\r\n    <el-form\r\n      ref=\"form\"\r\n      v-model=\"form\"\r\n      label-position=\"right\"\r\n      label-width=\"120px\"\r\n      :inline=\"true\"\r\n      class=\"form-container\"\r\n    >\r\n      <el-form-item label=\"名称\" prop=\"name\">\r\n        <el-input v-model=\"form.name\" />\r\n      </el-form-item>\r\n      <el-form-item label=\"启用\" prop=\"enable\">\r\n        <el-switch\r\n          v-model=\"form.enable\"\r\n          active-color=\"#13ce66\"\r\n          inactive-color=\"#ff4949\"\r\n        />\r\n      </el-form-item>\r\n      <el-form-item label=\"系统\" prop=\"isSystem\">\r\n        <el-switch\r\n          v-model=\"form.isSystem\"\r\n          active-color=\"#13ce66\"\r\n          inactive-color=\"#ff4949\"\r\n        />\r\n      </el-form-item>\r\n      <el-form-item label=\"备注\" prop=\"remark\">\r\n        <el-input :rows=\"4\" type=\"textarea\" v-model=\"form.remark\" />\r\n      </el-form-item>\r\n\r\n      <el-form-item>\r\n        <div\r\n          style=\"\r\n            position: fixed;\r\n            margin: 20px;\r\n            float: right;\r\n            bottom: 0px;\r\n            right: 0px;\r\n            z-index: 1;\r\n          \"\r\n        >\r\n          <el-button @click=\"returnIndex\">返回</el-button>\r\n          <el-button type=\"primary\" @click=\"confirm\">保存</el-button>\r\n        </div>\r\n      </el-form-item>\r\n      <el-table\r\n        v-if=\"!isAdd\"\r\n        :data=\"tableData\"\r\n        :tree-props=\"{\r\n          children: 'children',\r\n          hasChildren: 'hasChildren',\r\n        }\"\r\n        row-key=\"id\"\r\n        border\r\n        default-expand-all\r\n      >\r\n        >\r\n        <el-table-column prop=\"name\" label=\"名称\" width=\"200\" />\r\n        <el-table-column prop=\"displayName\" label=\"显示名\" width=\"100\" />\r\n        <!-- <el-table-column label=\"授权\" width=\"60\">\r\n          <template v-slot=\"scope\">\r\n            <el-checkbox\r\n              v-model=\"form['p' + scope.row.id]\"\r\n              @change=\"handleCheckAllChange\"\r\n            />\r\n          </template>\r\n        </el-table-column>-->\r\n        <el-table-column label=\"操作\">\r\n          <template v-slot=\"scope\">\r\n            <template v-if=\"Object.entries(scope.row.permissions).length > 0\">\r\n              <el-checkbox\r\n                :indeterminate=\"imObj[scope.row.id]\"\r\n                v-model=\"form['p' + scope.row.id]\"\r\n                @change=\"checkAllChange(scope.row)\"\r\n              >\r\n                全选\r\n              </el-checkbox>\r\n              <el-checkbox\r\n                v-for=\"(item, key) in scope.row.permissions\"\r\n                :key=\"scope.row.id + '' + key\"\r\n                :label=\"item\"\r\n                v-model=\"form['pf' + scope.row.id + '_' + key]\"\r\n                @change=\"checkChange(scope.row)\"\r\n              ></el-checkbox>\r\n            </template>\r\n            <template v-else>\r\n              <!-- 父级全选 -->\r\n              <el-checkbox\r\n                :indeterminate=\"imObj[scope.row.id]\"\r\n                v-model=\"form['p' + scope.row.id]\"\r\n                @change=\"parentCheckAllChange(scope.row)\"\r\n              >\r\n                全选\r\n              </el-checkbox>\r\n              <!-- <el-checkbox>读写</el-checkbox> -->\r\n              <el-checkbox\r\n                v-model=\"form['pc_readonly_' + scope.row.id]\"\r\n                @change=\"roCheck(scope.row)\"\r\n              >\r\n                只读\r\n              </el-checkbox>\r\n            </template>\r\n          </template>\r\n        </el-table-column>\r\n      </el-table>\r\n    </el-form>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue';\r\nexport default defineComponent({\r\n  data() {\r\n    return {\r\n      form: {} as any,\r\n      fields: [],\r\n      imObj: {} as any, // 父级全选半选状态\r\n      typeMap: { Add: '新增', Detail: '查看', Edit: '编辑' } as any,\r\n    };\r\n  },\r\n  computed: {\r\n    id() {\r\n      return this.$route.params.id;\r\n    },\r\n    currentPath() {\r\n      const vm = this as any;\r\n      const rplStr = `/${vm.type}${vm.id === undefined ? '' : '/' + vm.id}`;\r\n      return this.$route.path.replace(rplStr, '');\r\n    },\r\n    type() {\r\n      return this.$route.params.type as any;\r\n    },\r\n    isAdd() {\r\n      return (this as any).type === 'Add';\r\n    },\r\n    isDetail() {\r\n      return (this as any).type === 'Detail';\r\n    },\r\n    rolePermissions() {\r\n      // 角色菜单权限\r\n      const vm = this;\r\n      // permission格式: 1#255,2#255。#前为菜单id,#后为权限值\r\n      const permission = vm.form.permission;\r\n      const pObj = {} as any;\r\n      if (!permission) {\r\n        return pObj;\r\n      }\r\n      const mlist = permission.split(',');\r\n      for (const key in mlist) {\r\n        if (Object.prototype.hasOwnProperty.call(mlist, key)) {\r\n          const m = mlist[key];\r\n          const p = m.split('#');\r\n          pObj[p[0]] = p[1];\r\n        }\r\n      }\r\n      return pObj;\r\n    },\r\n    tableData() {\r\n      // console.log('init')\r\n      // 角色菜单数据\r\n      const vm = this;\r\n      const menuRouters: any[] = vm.$store.getters.menuRouters;\r\n      const menus: any[] = [];\r\n      menuRouters.map((i: any) => {\r\n        const menu = {\r\n          id: i.id,\r\n          name: i.name,\r\n          displayName: i.displayName,\r\n          permissions: i.permissions,\r\n          parentID: i.parentID,\r\n        } as any;\r\n\r\n        // // 父级全选勾选框是否勾选\r\n        // let pCheck = false\r\n\r\n        if (i.hasChildren) {\r\n          menu.children = [];\r\n          i.children.map((j: any) => {\r\n            // 表单路由不处理\r\n            if (j.isFormRoute) {\r\n              return;\r\n            }\r\n            const menuChild = {\r\n              id: j.id,\r\n              name: j.name,\r\n              displayName: j.displayName,\r\n              permissions: j.permissions,\r\n              parentID: j.parentID,\r\n            };\r\n\r\n            // // 全选勾选框是否勾选,取决于子项是否有勾选\r\n            // let pc = false\r\n            // // 子项勾选个数\r\n            // let checkChildCount = 0\r\n\r\n            // // 设置操作勾选框\r\n            // menuChild.permissions.map((p) => {\r\n            //   let c = (p.k & vm.rolePermissions[j.id]) !== 0\r\n            //   if (c) checkChildCount = checkChildCount + 1\r\n            //   vm.form['pf' + j.id + '_' + p.k] = c\r\n            //   pc = pc || c\r\n            // })\r\n\r\n            // // 设置全选勾选框\r\n            // vm.form['p' + j.id] = pc\r\n            // pCheck = pCheck || pc\r\n\r\n            menu.children.push(menuChild);\r\n\r\n            // 更新勾选框状态\r\n            // vm.checkChange(menuChild)\r\n          });\r\n        } else {\r\n          // pCheck = true\r\n        }\r\n\r\n        // 设置授权勾选框\r\n        // vm.form['p' + i.id] = pCheck\r\n        menus.push(menu);\r\n      });\r\n\r\n      return menus;\r\n    },\r\n  },\r\n  // watch: {\r\n  //   $route: {\r\n  //     handler: function () {\r\n  //       this.init()\r\n  //     },\r\n  //     immediate: true\r\n  //   }\r\n  // },\r\n  created() {\r\n    this.init();\r\n  },\r\n  activated() {\r\n    this.init();\r\n  },\r\n  methods: {\r\n    init() {\r\n      if (!this.isAdd) {\r\n        this.query();\r\n      }\r\n    },\r\n    query() {\r\n      const vm = this;\r\n      vm.$api.base.getData(vm.currentPath, vm.id).then((res: any) => {\r\n        vm.form = res.data;\r\n        vm.allCheckUpdate();\r\n      });\r\n    },\r\n    confirm() {\r\n      const vm = this;\r\n      if (vm.isAdd) {\r\n        vm.$api.base.add(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '新增成功',\r\n            type: 'success',\r\n            duration: 5 * 1000,\r\n          });\r\n          vm.$router.go(-1);\r\n        });\r\n      } else {\r\n        vm.$api.base.edit(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '保存成功',\r\n            type: 'success',\r\n            duration: 5 * 1000,\r\n          });\r\n          vm.$router.go(-1);\r\n        });\r\n      }\r\n    },\r\n    returnIndex() {\r\n      this.$router.push(this.currentPath);\r\n    },\r\n    checkChange({ id, permissions, parentID }: any) {\r\n      // console.log('checkChange', id)\r\n      // 子权限项勾选,\r\n      const vm = this;\r\n      let pCheck = false;\r\n      let checkCount = 0;\r\n      for (const key in permissions) {\r\n        if (Object.prototype.hasOwnProperty.call(permissions, key)) {\r\n          const c = vm.form['pf' + id + '_' + key];\r\n          if (c) {\r\n            checkCount = checkCount + 1;\r\n          }\r\n          pCheck = pCheck || c;\r\n        }\r\n      }\r\n      // permissions.forEach((e: any) => {\r\n      //   const c = vm.form['pf' + id + '_' + e.k];\r\n      //   if (c) {\r\n      //     checkCount = checkCount + 1;\r\n      //   }\r\n      //   pCheck = pCheck || c;\r\n      // });\r\n\r\n      vm.form['p' + id] = pCheck;\r\n      vm.imObj[id] =\r\n        checkCount > 0 && checkCount < Object.entries(permissions).length;\r\n\r\n      // 更新父级全选\r\n      vm.parentCheckUpdate(parentID);\r\n    },\r\n    checkAllChange({ id, permissions, parentID }: any) {\r\n      // console.log('checkAllChange', id, permissions)\r\n      // 子权限项全勾选,更新子级级勾选\r\n      const vm = this;\r\n      const pCheck = vm.form['p' + id];\r\n      for (const key in permissions) {\r\n        if (Object.prototype.hasOwnProperty.call(permissions, key)) {\r\n          vm.form['pf' + id + '_' + key] = pCheck;\r\n        }\r\n      }\r\n      // permissions.forEach((e: any) => {\r\n      //   vm.form['pf' + id + '_' + e.k] = pCheck;\r\n      // });\r\n\r\n      vm.imObj[id] = false;\r\n\r\n      // 更新父级全选\r\n      vm.parentCheckUpdate(parentID);\r\n    },\r\n    parentCheckAllChange({ id, children }: any) {\r\n      // console.log('parentCheckAllChange', id, children)\r\n\r\n      // 父级全选,勾选所有子权限项\r\n      const vm = this;\r\n      const pCheck = vm.form['p' + id];\r\n      children.forEach((e: any) => {\r\n        vm.form['p' + e.id] = pCheck;\r\n        vm.checkAllChange({\r\n          id: e.id,\r\n          permissions: e.permissions,\r\n          parentID: e.parentID,\r\n        });\r\n      });\r\n\r\n      vm.imObj[id] = false;\r\n    },\r\n    parentCheckUpdate(parentID: any) {\r\n      // console.log('parentCheckUpdate', parentID)\r\n\r\n      // 父级勾选状态更新\r\n      const vm = this;\r\n      let parentCheck = false;\r\n      let parentIm = false;\r\n      const parent = vm.tableData.find((f) => f.id === parentID);\r\n      parent.children.forEach((e: any) => {\r\n        const c = vm.form['p' + e.id];\r\n        const im = vm.imObj[e.id];\r\n        parentCheck = parentCheck || c || false;\r\n        parentIm = parentIm || !c || im || false;\r\n        // console.log(parentCheck, !parentIm, !c)\r\n      });\r\n\r\n      if (!parentCheck) {\r\n        parentIm = false;\r\n      }\r\n\r\n      vm.form['p' + parentID] = parentCheck;\r\n      vm.imObj[parentID] = parentIm;\r\n    },\r\n    roCheck({ id, children }: any) {\r\n      // 只读勾选,勾选所有子权限只读项\r\n      const vm = this;\r\n      const pCheck = vm.form['pc_readonly_' + id];\r\n      children.forEach((e: any) => {\r\n        vm.form['pf' + e.id + '_' + 1] = pCheck;\r\n        vm.checkChange(e);\r\n      });\r\n    },\r\n    allCheckUpdate() {\r\n      // console.log('allCheckUpdate', this.tableData)\r\n      // 更新所有勾选框状态\r\n      const vm = this;\r\n      vm.tableData.map((menu) => {\r\n        // console.log('0', menu)\r\n\r\n        // 处理当前菜单权限勾选\r\n        if (menu.permissions) {\r\n          for (const key in menu.permissions) {\r\n            if (Object.prototype.hasOwnProperty.call(menu.permissions, key)) {\r\n              // const p = menu.permissions[key];\r\n              const c =\r\n                // tslint:disable-next-line:no-bitwise\r\n                (parseInt(key, 10) &\r\n                  parseInt(vm.rolePermissions[menu.id], 10)) !==\r\n                0;\r\n              // console.log('allCheckUpdate1', menu.id, p.k, c)\r\n              vm.form['pf' + menu.id + '_' + key] = c;\r\n            }\r\n          }\r\n          // menu.permissions.map((p: any) => {\r\n          //   // console.log('1', p)\r\n\r\n          //   let c = (p.k & vm.rolePermissions[menu.id]) !== 0\r\n          //   // console.log('allCheckUpdate1', menu.id, p.k, c)\r\n          //   vm.form['pf' + menu.id + '_' + p.k] = c\r\n          // })\r\n        }\r\n\r\n        // 子菜单\r\n        if (menu.children) {\r\n          menu.children.map((j: any) => {\r\n            // console.log('2', j)\r\n            // 设置操作勾选框\r\n            for (const key in j.permissions) {\r\n              if (Object.prototype.hasOwnProperty.call(j.permissions, key)) {\r\n                const p = j.permissions[key];\r\n\r\n                const c =\r\n                  // tslint:disable-next-line:no-bitwise\r\n                  (parseInt(key, 10) &\r\n                    parseInt(vm.rolePermissions[j.id], 10)) !==\r\n                  0;\r\n                // console.log('allCheckUpdate2', j.id, p.k, c)\r\n\r\n                vm.form['pf' + j.id + '_' + parseInt(key, 10)] = c;\r\n              }\r\n            }\r\n            // j.permissions.map((p: any) => {\r\n            //   // console.log('3', p)\r\n\r\n            //   const c = (p.k & vm.rolePermissions[j.id]) !== 0;\r\n            //   // console.log('allCheckUpdate2', j.id, p.k, c)\r\n\r\n            //   vm.form['pf' + j.id + '_' + p.k] = c;\r\n            // });\r\n            vm.checkChange(j);\r\n          });\r\n        }\r\n      });\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.form-container {\r\n  margin-left: 50px;\r\n  margin-bottom: 75px;\r\n  max-height: -moz-calc(100vh - 160px);\r\n  max-height: -webkit-calc(100vh - 160px);\r\n  max-height: calc(100vh - 160px);\r\n  overflow-y: auto;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n.el-switch,\r\n.el-input,\r\n.el-textarea {\r\n  width: 220px;\r\n}\r\n</style>\r\n","export const tableSearchConfig = [\r\n  {\r\n    name: 'dtStart$dtEnd',\r\n    displayName: '时间范围',\r\n    showInSearch: true,\r\n    itemType: 'datePicker',\r\n    options: { type: 'daterange', setDefaultValue: false },\r\n  },\r\n  {\r\n    name: 'roleIds',\r\n    displayName: '角色',\r\n    showInSearch: true,\r\n    itemType: 'select',\r\n    url: '/Admin/Role?enable=true',\r\n    //  [\r\n    //   { label: '管理员', value: 1 },\r\n    //   { label: '高级用户', value: 2 },\r\n    //   { label: '普通用户', value: 3 },\r\n    //   { label: '游客', value: 4 },\r\n    //   { label: '新生命', value: 5 },\r\n    // ],\r\n    options: { labelField: 'name', valueField: 'id' },\r\n  },\r\n  {\r\n    name: 'Q',\r\n    displayName: '',\r\n    showInSearch: true,\r\n    options: {\r\n      placeholder: '请输入关键字',\r\n    },\r\n  },\r\n];\r\n\r\nexport const tableHandlerConfig = [\r\n  {\r\n    name: '新增',\r\n    handler: 'add',\r\n    type: 'primary',\r\n  },\r\n];\r\n\r\nconst permissionFlags = {\r\n  none: 0,\r\n  detail: 1,\r\n  insert: 2,\r\n  update: 4,\r\n  delete: 8,\r\n};\r\n\r\nexport const tableActionConfig = [\r\n  {\r\n    name: 'handler',\r\n    displayName: '操作',\r\n    width: '155px',\r\n    showInList: true,\r\n    handlerList: [\r\n      {\r\n        innerText: '查看',\r\n        handler: 'detail',\r\n        if: (app: any) =>\r\n          !app.hasPermission(permissionFlags.update) &&\r\n          app.hasPermission(permissionFlags.detail),\r\n      },\r\n      {\r\n        innerText: '编辑',\r\n        handler: 'editData',\r\n        type: 'primary',\r\n        if: (app: any) => app.hasPermission(permissionFlags.update),\r\n      },\r\n      {\r\n        innerText: '删除',\r\n        type: 'danger',\r\n        handler: 'deleteData',\r\n        if: (app: any) => app.hasPermission(permissionFlags.delete),\r\n      },\r\n    ],\r\n  },\r\n];\r\n\r\nexport const tableColumnConfig = [\r\n  {\r\n    tableName: 'User',\r\n    id: 28,\r\n    tableId: 3,\r\n    name: 'id',\r\n    displayName: '编号',\r\n    enable: true,\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    primaryKey: true,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '编号',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 1,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 29,\r\n    tableId: 3,\r\n    name: 'name',\r\n    displayName: '名称',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: true,\r\n    length: 50,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '名称。登录用户名',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 2,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 31,\r\n    tableId: 3,\r\n    name: 'displayName',\r\n    displayName: '昵称',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '昵称',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 4,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 32,\r\n    tableId: 3,\r\n    name: 'sex',\r\n    displayName: '性别',\r\n    enable: true,\r\n    dataType: 'SexKinds',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '性别。未知、男、女',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 5,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 33,\r\n    tableId: 3,\r\n    name: 'mail',\r\n    displayName: '邮件',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: 'mail',\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '邮件',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 6,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 34,\r\n    tableId: 3,\r\n    name: 'mobile',\r\n    displayName: '手机',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: 'mobile',\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '手机',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 7,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 35,\r\n    tableId: 3,\r\n    name: 'code',\r\n    displayName: '代码',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '代码。身份证、员工编号等',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 8,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 36,\r\n    tableId: 3,\r\n    name: 'areaId',\r\n    displayName: '地区',\r\n    enable: true,\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '地区。省市区',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 9,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 37,\r\n    tableId: 3,\r\n    name: 'avatar',\r\n    displayName: '头像',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: 'image',\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 200,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '头像',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 10,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 38,\r\n    tableId: 3,\r\n    name: 'roleID',\r\n    displayName: '角色',\r\n    enable: true,\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '角色。主要角色',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 11,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 39,\r\n    tableId: 3,\r\n    name: 'roleIds',\r\n    displayName: '角色组',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 200,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '角色组。次要角色集合',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 12,\r\n    width: '105',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 40,\r\n    tableId: 3,\r\n    name: 'departmentID',\r\n    displayName: '部门',\r\n    enable: true,\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '部门。组织机构',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 13,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 41,\r\n    tableId: 3,\r\n    name: 'online',\r\n    displayName: '在线',\r\n    enable: true,\r\n    dataType: 'Boolean',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '在线',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 14,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 42,\r\n    tableId: 3,\r\n    name: 'enable',\r\n    displayName: '启用',\r\n    enable: true,\r\n    dataType: 'Boolean',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '启用',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 15,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 43,\r\n    tableId: 3,\r\n    name: 'age',\r\n    displayName: '年龄',\r\n    enable: true,\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '年龄。周岁',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 16,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 44,\r\n    tableId: 3,\r\n    name: 'birthday',\r\n    displayName: '生日',\r\n    enable: true,\r\n    dataType: 'DateTime',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '生日。公历年月日',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 17,\r\n    width: '155',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 45,\r\n    tableId: 3,\r\n    name: 'logins',\r\n    displayName: '登录次数',\r\n    enable: true,\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '登录次数',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 18,\r\n    width: '120',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 46,\r\n    tableId: 3,\r\n    name: 'lastLogin',\r\n    displayName: '最后登录',\r\n    enable: true,\r\n    dataType: 'DateTime',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '最后登录',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 19,\r\n    width: '155',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 47,\r\n    tableId: 3,\r\n    name: 'lastLoginIP',\r\n    displayName: '最后登录IP',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '最后登录IP',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 20,\r\n    width: '130',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 48,\r\n    tableId: 3,\r\n    name: 'registerTime',\r\n    displayName: '注册时间',\r\n    enable: true,\r\n    dataType: 'DateTime',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '注册时间',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 21,\r\n    width: '155',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 49,\r\n    tableId: 3,\r\n    name: 'registerIP',\r\n    displayName: '注册IP',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '注册IP',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 22,\r\n    width: '120',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 3,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 3,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 50,\r\n    tableId: 3,\r\n    name: 'onlineTime',\r\n    displayName: '在线时间',\r\n    enable: true,\r\n    dataType: 'Int32',\r\n    itemType: 'TimeSpan',\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '在线时间。累计在线总时间,秒',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 23,\r\n    width: '120',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 45,\r\n    updateTime: '2022-12-27 14:43:22',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 51,\r\n    tableId: 3,\r\n    name: 'ex1',\r\n    displayName: '扩展1',\r\n    enable: true,\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '扩展1',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 24,\r\n    width: '105',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 52,\r\n    tableId: 3,\r\n    name: 'ex2',\r\n    displayName: '扩展2',\r\n    enable: true,\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '扩展2',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 25,\r\n    width: '105',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 53,\r\n    tableId: 3,\r\n    name: 'ex3',\r\n    displayName: '扩展3',\r\n    enable: true,\r\n    dataType: 'Double',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '扩展3',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 26,\r\n    width: '105',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 54,\r\n    tableId: 3,\r\n    name: 'ex4',\r\n    displayName: '扩展4',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '扩展4',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 27,\r\n    width: '105',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 55,\r\n    tableId: 3,\r\n    name: 'ex5',\r\n    displayName: '扩展5',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '扩展5',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 28,\r\n    width: '105',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 56,\r\n    tableId: 3,\r\n    name: 'ex6',\r\n    displayName: '扩展6',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '扩展6',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 29,\r\n    width: '105',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 57,\r\n    tableId: 3,\r\n    name: 'updateUser',\r\n    displayName: '更新者',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '更新者',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 30,\r\n    width: '105',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 58,\r\n    tableId: 3,\r\n    name: 'updateUserID',\r\n    displayName: '更新用户',\r\n    enable: true,\r\n    dataType: 'Int32',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '更新用户',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 31,\r\n    width: '120',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 59,\r\n    tableId: 3,\r\n    name: 'updateIP',\r\n    displayName: '更新地址',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 50,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '更新地址',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 32,\r\n    width: '120',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 60,\r\n    tableId: 3,\r\n    name: 'updateTime',\r\n    displayName: '更新时间',\r\n    enable: true,\r\n    dataType: 'DateTime',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: true,\r\n    description: '更新时间',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 33,\r\n    width: '155',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 61,\r\n    tableId: 3,\r\n    name: 'remark',\r\n    displayName: '备注',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 500,\r\n    nullable: true,\r\n    isDataObjectField: true,\r\n    description: '备注',\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 34,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 62,\r\n    tableId: 3,\r\n    name: 'lastLoginAddress',\r\n    displayName: '物理地址',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: false,\r\n    description: null,\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 35,\r\n    width: '120',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 63,\r\n    tableId: 3,\r\n    name: 'departmentName',\r\n    displayName: '部门',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: false,\r\n    description: null,\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 36,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 64,\r\n    tableId: 3,\r\n    name: 'areaName',\r\n    displayName: '地区',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: false,\r\n    description: null,\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 37,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 65,\r\n    tableId: 3,\r\n    name: 'roleName',\r\n    displayName: '角色',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: false,\r\n    description: null,\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 38,\r\n    width: '95',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n  {\r\n    tableName: 'User',\r\n    id: 66,\r\n    tableId: 3,\r\n    name: 'roleNames',\r\n    displayName: '角色组',\r\n    enable: true,\r\n    dataType: 'String',\r\n    itemType: null,\r\n    primaryKey: false,\r\n    master: false,\r\n    length: 0,\r\n    nullable: false,\r\n    isDataObjectField: false,\r\n    description: null,\r\n    showInList: true,\r\n    showInAddForm: true,\r\n    showInEditForm: true,\r\n    showInDetailForm: true,\r\n    showInSearch: false,\r\n    sort: 39,\r\n    width: '105',\r\n    cellText: null,\r\n    cellTitle: null,\r\n    cellUrl: null,\r\n    headerText: null,\r\n    headerTitle: null,\r\n    headerUrl: null,\r\n    dataAction: null,\r\n    dataSource: null,\r\n    createUserId: 0,\r\n    createTime: '2022-12-02 23:46:29',\r\n    createIP: null,\r\n    updateUserId: 0,\r\n    updateTime: '2022-12-02 23:46:29',\r\n    updateIP: null,\r\n  },\r\n];\r\n","<template>\r\n  <el-tabs v-model=\"activeName\">\r\n    <el-tab-pane label=\"基本信息\" name=\"UserInfo\">\r\n      <div class=\"objform\">\r\n        <el-form\r\n          label-position=\"right\"\r\n          label-width=\"120px\"\r\n          ref=\"form\"\r\n          :model=\"form\"\r\n        >\r\n          <el-form-item label=\"头像\" prop=\"avatar\">\r\n            <img\r\n              style=\"height:100px;width:100px;\"\r\n              :src=\"$store.getters.urls.baseUrl + form.avatar\"\r\n            />\r\n          </el-form-item>\r\n          <el-form-item label=\"名称\" prop=\"name\">\r\n            <el-input v-model=\"form.name\" disabled></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"显示名\" prop=\"displayName\">\r\n            <el-input v-model=\"form.displayName\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"性别\" prop=\"sex\">\r\n            <el-select v-model=\"form.sex\" filterable>\r\n              <el-option :key=\"0\" label=\"未知\" :value=\"0\"></el-option>\r\n              <el-option :key=\"1\" label=\"男\" :value=\"1\"></el-option>\r\n              <el-option :key=\"2\" label=\"女\" :value=\"-1\"></el-option>\r\n            </el-select>\r\n          </el-form-item>\r\n          <el-form-item label=\"邮箱\" prop=\"mail\">\r\n            <el-input v-model=\"form.mail\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"手机\" prop=\"mobile\">\r\n            <el-input v-model=\"form.mobile\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"代码\" prop=\"code\">\r\n            <el-input v-model=\"form.code\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"角色\" prop=\"name\">\r\n            <span>{{ form.roleNames }}</span>\r\n          </el-form-item>\r\n          <el-form-item label=\"登录次数\" prop=\"name\">\r\n            <span>{{ form.logins }}</span>\r\n          </el-form-item>\r\n          <el-form-item label=\"最后登录时间\" prop=\"name\">\r\n            <span>{{ form.lastLogin }}</span>\r\n          </el-form-item>\r\n          <el-form-item label=\"最后登录IP\" prop=\"name\">\r\n            <span>{{ form.lastLoginIP }}</span>\r\n          </el-form-item>\r\n\r\n          <el-form-item prop label-name>\r\n            <div\r\n              style=\"position: fixed; margin: 30px; float:right; bottom: 0px; right: 0px; z-index: 1;\"\r\n            >\r\n              <el-button type=\"primary\" @click=\"confirm\">保存</el-button>\r\n            </div>\r\n          </el-form-item>\r\n        </el-form>\r\n      </div>\r\n    </el-tab-pane>\r\n    <el-tab-pane label=\"修改密码\" name=\"ChangePassword\">\r\n      <div class=\"objform\">\r\n        <el-form\r\n          label-position=\"right\"\r\n          label-width=\"120px\"\r\n          ref=\"form2\"\r\n          :model=\"form2\"\r\n        >\r\n          <el-form-item label=\"旧密码\" prop=\"oldPassword\">\r\n            <el-input type=\"password\" v-model=\"form2.oldPassword\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"新密码\" prop=\"newPassword\">\r\n            <el-input type=\"password\" v-model=\"form2.newPassword\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"确认密码\" prop=\"newPassword2\">\r\n            <el-input type=\"password\" v-model=\"form2.newPassword2\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item prop label-name>\r\n            <div\r\n              style=\"position: fixed; margin: 30px; float:right; bottom: 0px; right: 0px; z-index: 1;\"\r\n            >\r\n              <el-button type=\"primary\" @click=\"confirm2\">保存</el-button>\r\n            </div>\r\n          </el-form-item>\r\n        </el-form>\r\n      </div>\r\n    </el-tab-pane>\r\n    <el-tab-pane label=\"第三方授权\" name=\"OAuthConfig\">3</el-tab-pane>\r\n  </el-tabs>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  props: ['path'],\r\n  data() {\r\n    return {\r\n      form: {} as any,\r\n      form2: {} as any,\r\n      properties: [],\r\n      activeName: 'UserInfo'\r\n    }\r\n  },\r\n  computed: {\r\n    currentPath() {\r\n      return this.path\r\n    }\r\n  },\r\n  watch: {\r\n    $route: {\r\n      handler: function() {\r\n        this.init()\r\n      },\r\n      immediate: true\r\n    }\r\n  },\r\n  methods: {\r\n    init() {\r\n      this.query()\r\n    },\r\n    query() {\r\n      let vm = this as any\r\n      vm.$api.user.getUserInfo().then((resp: any) => {\r\n        const data = resp.data\r\n        // 设置用户信息,本页修改信息后再掉此方法刷新\r\n        vm.$store.dispatch('setUserInfo', data)\r\n        vm.form = data\r\n      })\r\n    },\r\n    confirm() {\r\n      let vm = this as any\r\n      vm.$api.user.updateUserInfo(vm.form).then(() => {\r\n        let msg = '保存成功'\r\n\r\n        vm.$message({\r\n          message: msg,\r\n          type: 'success',\r\n          duration: 3 * 1000\r\n        })\r\n\r\n        // 刷新用户信息\r\n        vm.query()\r\n      })\r\n    },\r\n    confirm2() {\r\n      let vm = this as any\r\n      vm.$api.user.changePassword(vm.form2).then(() => {\r\n        let msg = '保存成功'\r\n\r\n        vm.$message({\r\n          message: msg,\r\n          type: 'success',\r\n          duration: 3 * 1000\r\n        })\r\n\r\n        vm.form2 = {}\r\n      })\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.objform {\r\n  max-height: -moz-calc(100vh - 200px);\r\n  max-height: -webkit-calc(100vh - 200px);\r\n  max-height: calc(100vh - 200px);\r\n  overflow: auto;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n.objform h2 {\r\n  margin: 35px 0;\r\n}\r\n\r\n.el-input,\r\n.el-switch {\r\n  width: 380px;\r\n  margin-right: 15px;\r\n}\r\n</style>\r\n","<template>\r\n  <el-tabs v-model=\"activeName\">\r\n    <el-tab-pane label=\"基本信息\" name=\"UserInfo\">\r\n      <div class=\"objform\">\r\n        <el-form\r\n          label-position=\"right\"\r\n          label-width=\"120px\"\r\n          ref=\"form\"\r\n          :model=\"form\"\r\n        >\r\n          <el-form-item label=\"头像\" prop=\"avatar\">\r\n            <img\r\n              style=\"height:100px;width:100px;\"\r\n              :src=\"$store.getters.urls.baseUrl + form.avatar\"\r\n            />\r\n          </el-form-item>\r\n          <el-form-item label=\"名称\" prop=\"name\">\r\n            <el-input v-model=\"form.name\" disabled></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"显示名\" prop=\"displayName\">\r\n            <el-input v-model=\"form.displayName\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"性别\" prop=\"sex\">\r\n            <el-select v-model=\"form.sex\" filterable>\r\n              <el-option :key=\"0\" label=\"未知\" :value=\"0\"></el-option>\r\n              <el-option :key=\"1\" label=\"男\" :value=\"1\"></el-option>\r\n              <el-option :key=\"2\" label=\"女\" :value=\"-1\"></el-option>\r\n            </el-select>\r\n          </el-form-item>\r\n          <el-form-item label=\"邮箱\" prop=\"mail\">\r\n            <el-input v-model=\"form.mail\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"手机\" prop=\"mobile\">\r\n            <el-input v-model=\"form.mobile\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"代码\" prop=\"code\">\r\n            <el-input v-model=\"form.code\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"角色\" prop=\"name\">\r\n            <span>{{ form.roleNames }}</span>\r\n          </el-form-item>\r\n          <el-form-item label=\"登录次数\" prop=\"name\">\r\n            <span>{{ form.logins }}</span>\r\n          </el-form-item>\r\n          <el-form-item label=\"最后登录时间\" prop=\"name\">\r\n            <span>{{ form.lastLogin }}</span>\r\n          </el-form-item>\r\n          <el-form-item label=\"最后登录IP\" prop=\"name\">\r\n            <span>{{ form.lastLoginIP }}</span>\r\n          </el-form-item>\r\n\r\n          <el-form-item prop label-name>\r\n            <div\r\n              style=\"position: fixed; margin: 30px; float:right; bottom: 0px; right: 0px; z-index: 1;\"\r\n            >\r\n              <el-button type=\"primary\" @click=\"confirm\">保存</el-button>\r\n            </div>\r\n          </el-form-item>\r\n        </el-form>\r\n      </div>\r\n    </el-tab-pane>\r\n    <el-tab-pane label=\"修改密码\" name=\"ChangePassword\">\r\n      <div class=\"objform\">\r\n        <el-form\r\n          label-position=\"right\"\r\n          label-width=\"120px\"\r\n          ref=\"form2\"\r\n          :model=\"form2\"\r\n        >\r\n          <el-form-item label=\"旧密码\" prop=\"oldPassword\">\r\n            <el-input type=\"password\" v-model=\"form2.oldPassword\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"新密码\" prop=\"newPassword\">\r\n            <el-input type=\"password\" v-model=\"form2.newPassword\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item label=\"确认密码\" prop=\"newPassword2\">\r\n            <el-input type=\"password\" v-model=\"form2.newPassword2\"></el-input>\r\n          </el-form-item>\r\n          <el-form-item prop label-name>\r\n            <div\r\n              style=\"position: fixed; margin: 30px; float:right; bottom: 0px; right: 0px; z-index: 1;\"\r\n            >\r\n              <el-button type=\"primary\" @click=\"confirm2\">保存</el-button>\r\n            </div>\r\n          </el-form-item>\r\n        </el-form>\r\n      </div>\r\n    </el-tab-pane>\r\n    <el-tab-pane label=\"第三方授权\" name=\"OAuthConfig\">3</el-tab-pane>\r\n  </el-tabs>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  props: ['path'],\r\n  data() {\r\n    return {\r\n      form: {} as any,\r\n      form2: {} as any,\r\n      properties: [],\r\n      activeName: 'UserInfo'\r\n    }\r\n  },\r\n  computed: {\r\n    currentPath() {\r\n      return this.path\r\n    }\r\n  },\r\n  watch: {\r\n    $route: {\r\n      handler: function() {\r\n        this.init()\r\n      },\r\n      immediate: true\r\n    }\r\n  },\r\n  methods: {\r\n    init() {\r\n      this.query()\r\n    },\r\n    query() {\r\n      let vm = this as any\r\n      vm.$api.user.getUserInfo().then((resp: any) => {\r\n        const data = resp.data\r\n        // 设置用户信息,本页修改信息后再掉此方法刷新\r\n        vm.$store.dispatch('setUserInfo', data)\r\n        vm.form = data\r\n      })\r\n    },\r\n    confirm() {\r\n      let vm = this as any\r\n      vm.$api.user.updateUserInfo(vm.form).then(() => {\r\n        let msg = '保存成功'\r\n\r\n        vm.$message({\r\n          message: msg,\r\n          type: 'success',\r\n          duration: 3 * 1000\r\n        })\r\n\r\n        // 刷新用户信息\r\n        vm.query()\r\n      })\r\n    },\r\n    confirm2() {\r\n      let vm = this as any\r\n      vm.$api.user.changePassword(vm.form2).then(() => {\r\n        let msg = '保存成功'\r\n\r\n        vm.$message({\r\n          message: msg,\r\n          type: 'success',\r\n          duration: 3 * 1000\r\n        })\r\n\r\n        vm.form2 = {}\r\n      })\r\n    }\r\n  }\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.objform {\r\n  max-height: -moz-calc(100vh - 200px);\r\n  max-height: -webkit-calc(100vh - 200px);\r\n  max-height: calc(100vh - 200px);\r\n  overflow: auto;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n\r\n.objform h2 {\r\n  margin: 35px 0;\r\n}\r\n\r\n.el-input,\r\n.el-switch {\r\n  width: 380px;\r\n  margin-right: 15px;\r\n}\r\n</style>\r\n","<script lang=\"ts\">\r\nimport { setMenu } from '@/utils/menu'\r\nimport { defineComponent } from 'vue'\r\nexport default defineComponent({\r\n  name: 'AuthRedirect',\r\n  async created() {\r\n    let vm = this\r\n    const redirect = vm.$route.query.redirect || '/'\r\n    let token = vm.$route.hash.replace('#token=', '')\r\n    vm.$store.dispatch('setToken', token)\r\n    // 报错解决:Redirected when going from \"/auth-redirect\" to \"/Admin/User\" via a navigation guard\r\n    // https://blog.csdn.net/Tom__cy/article/details/112846816\r\n    // 获取用户信息\r\n    vm.$api.user.getUserInfo().then((response: any) => {\r\n      const data = response.data\r\n      // 设置用户信息\r\n      vm.$store.dispatch('setUserInfo', data)\r\n    })\r\n\r\n    // 获取菜单信息, 将请求回来的菜单转化成路由以及菜单信息\r\n    vm.$api.menu.getMenu().then((routeRes: any) => {\r\n      const accessedRouters = routeRes.data\r\n\r\n      // 保存一份在浏览器\r\n      setMenu(accessedRouters)\r\n\r\n      // 设置路由信息\r\n      vm.$store.dispatch('generateRoutes', accessedRouters)\r\n\r\n      // 添加路由信息\r\n      const addRouters = vm.$store.getters.addRouters\r\n      if (addRouters) {\r\n        addRouters.forEach((e: any) => {\r\n          vm.$router.addRoute(e) // 动态添加可访问路由表\r\n        })\r\n      }\r\n\r\n      vm.$router.push({ path: redirect } as any)\r\n    })\r\n  },\r\n  render() {\r\n    return ''\r\n  }\r\n})\r\n</script>\r\n","<template>\r\n  <div class=\"center\">\r\n    <div class=\"login-col\">\r\n      <!-- Login -->\r\n      <div>\r\n        <!-- Logo-->\r\n        <el-row>\r\n          <el-col :span=\"24\" class=\"login-logo\">\r\n            <i class=\"el-icon-cloudy\"></i>\r\n          </el-col>\r\n        </el-row>\r\n        <template v-if=\"loginConfig.allowLogin\">\r\n          <el-form :model=\"loginForm\" size=\"default\" class=\"cube-login\">\r\n            <!-- 登录-->\r\n            <span class=\"heading text-primary\">{{ displayName }} 登录</span>\r\n            <el-form-item label>\r\n              <el-input\r\n                v-model=\"loginForm.username\"\r\n                placeholder=\"用户名 / 邮箱\"\r\n                prefix-icon=\"el-icon-user\"\r\n              ></el-input>\r\n            </el-form-item>\r\n\r\n            <el-form-item label>\r\n              <el-input\r\n                v-model=\"loginForm.password\"\r\n                placeholder=\"密码\"\r\n                prefix-icon=\"el-icon-lock\"\r\n                show-password\r\n              ></el-input>\r\n            </el-form-item>\r\n            <el-form-item label>\r\n              <el-checkbox\r\n                class=\"text text-primary\"\r\n                v-model=\"loginForm.remember\"\r\n              >\r\n                记住我\r\n              </el-checkbox>\r\n\r\n              <!-- <template v-if=\"loginConfig.allowRegister\">\r\n                <div\r\n                  style=\"display: inline-block; margin-top: 5px; float: right;\"\r\n                >\r\n                  <a\r\n                    href=\"#Register\"\r\n                    data-toggle=\"tab\"\r\n                    style=\"margin-left: auto; margin-right: auto; position: static; font-size: 15px; margin-top: 5px;\"\r\n                  >\r\n                    <span>我要注册</span>\r\n                  </a>\r\n                </div>\r\n              </template>-->\r\n            </el-form-item>\r\n          </el-form>\r\n\r\n          <button class=\"btn\" @click=\"login\">登录</button>\r\n        </template>\r\n      </div>\r\n      <!-- Login3 -->\r\n      <div v-if=\"loginConfig.providers.length > 0\" class=\"center\">\r\n        <p class=\"login3\">\r\n          <span class=\"left\"></span>\r\n          第三方登录\r\n          <span class=\"right\"></span>\r\n        </p>\r\n\r\n        <el-row>\r\n          <el-col :sm=\"24\">\r\n            <a\r\n              v-for=\"(mi, i) in loginConfig.providers\"\r\n              :key=\"i\"\r\n              :title=\"mi.nickName || mi.name\"\r\n              @click=\"ssoClick(getUrl(mi))\"\r\n            >\r\n              <img\r\n                v-if=\"mi.logo\"\r\n                :src=\"getLogoUrl(mi.logo)\"\r\n                style=\"width: 64px;height: 64px;\"\r\n              />\r\n              <template v-else>{{ mi.nickName || mi.name }}</template>\r\n            </a>\r\n          </el-col>\r\n        </el-row>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { setMenu } from '@/utils/menu';\r\nimport { defineComponent } from 'vue';\r\nexport default defineComponent({\r\n  data() {\r\n    return {\r\n      loginForm: {\r\n        username: null,\r\n        password: null,\r\n        remember: true,\r\n      },\r\n    };\r\n  },\r\n  computed: {\r\n    sysConfig() {\r\n      return this.$store.getters.sysConfig;\r\n    },\r\n    loginConfig() {\r\n      let vm = this;\r\n      let loginConfig = vm.$store.getters.loginConfig;\r\n      if (!loginConfig) {\r\n        loginConfig = {\r\n          displayName: '魔方',\r\n          logo: '', // 系统logo\r\n          allowLogin: true,\r\n          allowRegister: true,\r\n          providers: [],\r\n        };\r\n      }\r\n      return loginConfig;\r\n    },\r\n    baseUrl() {\r\n      return this.$store.getters.urls.baseUrl;\r\n    },\r\n    redirect() {\r\n      return this.$route.query.redirect;\r\n    },\r\n    displayName() {\r\n      let vm = this as any;\r\n      return (\r\n        (vm.sysConfig && vm.sysConfig.displayName) ||\r\n        (vm.loginConfig && vm.loginConfig.displayName)\r\n      );\r\n    },\r\n  },\r\n  created() {\r\n    let vm = this;\r\n    try {\r\n      // 关闭所有弹窗\r\n      vm.$messageBox.close();\r\n    } catch (error) {}\r\n    // 为了本地快速检查是否需要自动跳转第三方登录,使用缓存的配置立即进行检查跳转\r\n    vm.autoAuthRedirect();\r\n\r\n    // 获取一次登录设置,如果跳转了第三方登录,会被强制取消\r\n    vm.$api.config.getLoginConfig().then((res: any) => {\r\n      let cfg = res.data;\r\n      vm.$store.dispatch('setLoginConfig', cfg);\r\n    });\r\n  },\r\n  methods: {\r\n    login() {\r\n      let vm = this;\r\n      vm.$api.user.login(vm.loginForm).then(async (response: any) => {\r\n        const data = response.data;\r\n        let token = data.token;\r\n        await vm.$store.dispatch('setToken', token);\r\n\r\n        // 获取用户信息\r\n        vm.$api.user.getUserInfo().then((response: any) => {\r\n          const data = response.data;\r\n          // 设置用户信息\r\n          vm.$store.dispatch('setUserInfo', data);\r\n        });\r\n\r\n        // 获取菜单信息, 将请求回来的菜单转化成路由以及菜单信息\r\n        vm.$api.menu.getMenu().then((routeRes: any) => {\r\n          const accessedRouters = routeRes.data;\r\n\r\n          // 保存一份在浏览器\r\n          setMenu(accessedRouters);\r\n\r\n          // 设置路由信息\r\n          vm.$store.dispatch('generateRoutes', accessedRouters);\r\n\r\n          // 添加路由信息\r\n          const addRouters = vm.$store.getters.addRouters;\r\n          if (addRouters) {\r\n            addRouters.forEach((e: any) => {\r\n              vm.$router.addRoute(e); // 动态添加可访问路由表\r\n            });\r\n          }\r\n\r\n          vm.$router.push({ path: vm.redirect || '/' } as any);\r\n        });\r\n\r\n        // 拉取系统配置信息\r\n        vm.$api.config.getObject('/Admin/Sys').then((res: any) => {\r\n          const cfg = res.data.value;\r\n          vm.$store.dispatch('setSysConfig', cfg);\r\n        });\r\n      });\r\n    },\r\n    ssoClick(url: any) {\r\n      location.href = this.baseUrl + url;\r\n      // location.href = urls.ssoUrl + url\r\n    },\r\n    getUrl(mi: any) {\r\n      // console.log(mi)\r\n      let vm = this;\r\n      // let name = 'NewLife.Cube'\r\n      let url = `/Sso/Login?name=${mi.name}&source=front-end`;\r\n      // let url = `/sso/authorize?response_type=token&client_id=${name}`\r\n      let redirect_uri = encodeURIComponent(\r\n        location.origin +\r\n          '/auth-redirect' +\r\n          (vm.redirect ? '?redirect=' + vm.redirect : ''),\r\n      );\r\n      url += `&redirect_uri=${redirect_uri}`;\r\n      return url;\r\n    },\r\n    getLogoUrl(logo: any) {\r\n      let vm = this;\r\n      if (logo.indexOf('http') !== 0) {\r\n        logo = vm.baseUrl + logo;\r\n      }\r\n      return logo;\r\n    },\r\n    autoAuthRedirect() {\r\n      // 根据设置,如果不允许密码登录,且只有一个第三方登录,自动跳转\r\n      let vm = this;\r\n      let loginConfig = vm.loginConfig;\r\n      if (\r\n        loginConfig &&\r\n        !loginConfig.allowLogin &&\r\n        loginConfig.providers.length === 1\r\n      ) {\r\n        vm.ssoClick(vm.getUrl(loginConfig.providers[0]));\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<!-- Login -->\r\n<style scoped>\r\n.login-logo {\r\n  text-align: center;\r\n  font-size: 130px;\r\n  color: #4ca6ff;\r\n  margin-top: 50px;\r\n}\r\n\r\n.cube-login {\r\n  background: #fff;\r\n  padding-bottom: 0;\r\n  border-radius: 15px;\r\n  text-align: center;\r\n}\r\n\r\n.cube-login .heading {\r\n  display: block;\r\n  font-size: 24px;\r\n  font-weight: 700;\r\n  padding: 5px 0;\r\n  margin-bottom: 20px;\r\n  text-align: center;\r\n}\r\n\r\n.cube-login input {\r\n  border-radius: 20px;\r\n  box-shadow: none;\r\n  padding: 0 20px 0 45px;\r\n  height: 40px;\r\n  transition: all 0.3s ease 0s;\r\n}\r\n\r\n.cube-login .text {\r\n  float: left;\r\n  margin-left: 7px;\r\n  line-height: 20px;\r\n  padding-top: 5px;\r\n  text-transform: capitalize;\r\n}\r\n\r\n.cube-login a {\r\n  position: absolute;\r\n  top: 12px;\r\n  right: 0px;\r\n  font-size: 17px;\r\n  color: #c8c8c8;\r\n  transition: all 0.5s ease 0s;\r\n  color: #4ca6ff;\r\n}\r\n\r\n.el-input input {\r\n  border-radius: 20px;\r\n  box-shadow: none;\r\n  padding: 0 20px 0 45px;\r\n  height: 40px;\r\n  transition: all 0.3s ease 0s;\r\n  font-size: 14px;\r\n  line-height: 1.42857143;\r\n  color: #555;\r\n  background-color: #fff;\r\n  background-image: none;\r\n  border: 1px solid #ccc;\r\n}\r\n\r\n.btn {\r\n  float: right;\r\n  font-size: 14px;\r\n  color: #fff;\r\n  background: #00b4ef;\r\n  /* border-radius: 30px; */\r\n  border-radius: 4px;\r\n  padding: 8px 50px;\r\n  border: none;\r\n  text-transform: capitalize;\r\n  transition: all 0.5s ease 0s;\r\n  margin: -25px 0 15px 0;\r\n  width: 100%;\r\n}\r\n\r\n.text-primary {\r\n  color: #337ab7;\r\n}\r\n\r\nlabel {\r\n  display: inline-block;\r\n  max-width: 100%;\r\n  margin-bottom: 5px;\r\n  font-weight: 700;\r\n}\r\n</style>\r\n<!-- Login3 -->\r\n<style scoped>\r\np.login3 {\r\n  font-size: 22px;\r\n  position: relative;\r\n  width: 100%;\r\n  color: #333;\r\n  text-align: center;\r\n}\r\n\r\np.login3 span {\r\n  height: 1px;\r\n  position: absolute;\r\n  background-color: #928f8f;\r\n  width: 35%;\r\n  top: 50%;\r\n}\r\n\r\np.login3 span.right {\r\n  right: 65%;\r\n}\r\n\r\np.login3 span.left {\r\n  left: 65%;\r\n}\r\n\r\n.center {\r\n  display: flex;\r\n  width: 100%;\r\n  flex-direction: column;\r\n  align-items: center;\r\n}\r\n\r\n@media screen and (max-width: 680px) {\r\n  .login-col {\r\n    width: 80%;\r\n  }\r\n}\r\n\r\n@media screen and (min-width: 680px) and (max-width: 1680px) {\r\n  .login-col {\r\n    width: 30%;\r\n  }\r\n}\r\n\r\n@media screen and (min-width: 1680px) {\r\n  .login-col {\r\n    width: 445px;\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"center\">\r\n    <div class=\"login-col\">\r\n      <!-- Login -->\r\n      <div>\r\n        <!-- Logo-->\r\n        <el-row>\r\n          <el-col :span=\"24\" class=\"login-logo\">\r\n            <i class=\"el-icon-cloudy\"></i>\r\n          </el-col>\r\n        </el-row>\r\n        <template v-if=\"loginConfig.allowLogin\">\r\n          <el-form :model=\"loginForm\" size=\"default\" class=\"cube-login\">\r\n            <!-- 登录-->\r\n            <span class=\"heading text-primary\">{{ displayName }} 登录</span>\r\n            <el-form-item label>\r\n              <el-input\r\n                v-model=\"loginForm.username\"\r\n                placeholder=\"用户名 / 邮箱\"\r\n                prefix-icon=\"el-icon-user\"\r\n              ></el-input>\r\n            </el-form-item>\r\n\r\n            <el-form-item label>\r\n              <el-input\r\n                v-model=\"loginForm.password\"\r\n                placeholder=\"密码\"\r\n                prefix-icon=\"el-icon-lock\"\r\n                show-password\r\n              ></el-input>\r\n            </el-form-item>\r\n            <el-form-item label>\r\n              <el-checkbox\r\n                class=\"text text-primary\"\r\n                v-model=\"loginForm.remember\"\r\n              >\r\n                记住我\r\n              </el-checkbox>\r\n\r\n              <!-- <template v-if=\"loginConfig.allowRegister\">\r\n                <div\r\n                  style=\"display: inline-block; margin-top: 5px; float: right;\"\r\n                >\r\n                  <a\r\n                    href=\"#Register\"\r\n                    data-toggle=\"tab\"\r\n                    style=\"margin-left: auto; margin-right: auto; position: static; font-size: 15px; margin-top: 5px;\"\r\n                  >\r\n                    <span>我要注册</span>\r\n                  </a>\r\n                </div>\r\n              </template>-->\r\n            </el-form-item>\r\n          </el-form>\r\n\r\n          <button class=\"btn\" @click=\"login\">登录</button>\r\n        </template>\r\n      </div>\r\n      <!-- Login3 -->\r\n      <div v-if=\"loginConfig.providers.length > 0\" class=\"center\">\r\n        <p class=\"login3\">\r\n          <span class=\"left\"></span>\r\n          第三方登录\r\n          <span class=\"right\"></span>\r\n        </p>\r\n\r\n        <el-row>\r\n          <el-col :sm=\"24\">\r\n            <a\r\n              v-for=\"(mi, i) in loginConfig.providers\"\r\n              :key=\"i\"\r\n              :title=\"mi.nickName || mi.name\"\r\n              @click=\"ssoClick(getUrl(mi))\"\r\n            >\r\n              <img\r\n                v-if=\"mi.logo\"\r\n                :src=\"getLogoUrl(mi.logo)\"\r\n                style=\"width: 64px;height: 64px;\"\r\n              />\r\n              <template v-else>{{ mi.nickName || mi.name }}</template>\r\n            </a>\r\n          </el-col>\r\n        </el-row>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { setMenu } from '@/utils/menu';\r\nimport { defineComponent } from 'vue';\r\nexport default defineComponent({\r\n  data() {\r\n    return {\r\n      loginForm: {\r\n        username: null,\r\n        password: null,\r\n        remember: true,\r\n      },\r\n    };\r\n  },\r\n  computed: {\r\n    sysConfig() {\r\n      return this.$store.getters.sysConfig;\r\n    },\r\n    loginConfig() {\r\n      let vm = this;\r\n      let loginConfig = vm.$store.getters.loginConfig;\r\n      if (!loginConfig) {\r\n        loginConfig = {\r\n          displayName: '魔方',\r\n          logo: '', // 系统logo\r\n          allowLogin: true,\r\n          allowRegister: true,\r\n          providers: [],\r\n        };\r\n      }\r\n      return loginConfig;\r\n    },\r\n    baseUrl() {\r\n      return this.$store.getters.urls.baseUrl;\r\n    },\r\n    redirect() {\r\n      return this.$route.query.redirect;\r\n    },\r\n    displayName() {\r\n      let vm = this as any;\r\n      return (\r\n        (vm.sysConfig && vm.sysConfig.displayName) ||\r\n        (vm.loginConfig && vm.loginConfig.displayName)\r\n      );\r\n    },\r\n  },\r\n  created() {\r\n    let vm = this;\r\n    try {\r\n      // 关闭所有弹窗\r\n      vm.$messageBox.close();\r\n    } catch (error) {}\r\n    // 为了本地快速检查是否需要自动跳转第三方登录,使用缓存的配置立即进行检查跳转\r\n    vm.autoAuthRedirect();\r\n\r\n    // 获取一次登录设置,如果跳转了第三方登录,会被强制取消\r\n    vm.$api.config.getLoginConfig().then((res: any) => {\r\n      let cfg = res.data;\r\n      vm.$store.dispatch('setLoginConfig', cfg);\r\n    });\r\n  },\r\n  methods: {\r\n    login() {\r\n      let vm = this;\r\n      vm.$api.user.login(vm.loginForm).then(async (response: any) => {\r\n        const data = response.data;\r\n        let token = data.token;\r\n        await vm.$store.dispatch('setToken', token);\r\n\r\n        // 获取用户信息\r\n        vm.$api.user.getUserInfo().then((response: any) => {\r\n          const data = response.data;\r\n          // 设置用户信息\r\n          vm.$store.dispatch('setUserInfo', data);\r\n        });\r\n\r\n        // 获取菜单信息, 将请求回来的菜单转化成路由以及菜单信息\r\n        vm.$api.menu.getMenu().then((routeRes: any) => {\r\n          const accessedRouters = routeRes.data;\r\n\r\n          // 保存一份在浏览器\r\n          setMenu(accessedRouters);\r\n\r\n          // 设置路由信息\r\n          vm.$store.dispatch('generateRoutes', accessedRouters);\r\n\r\n          // 添加路由信息\r\n          const addRouters = vm.$store.getters.addRouters;\r\n          if (addRouters) {\r\n            addRouters.forEach((e: any) => {\r\n              vm.$router.addRoute(e); // 动态添加可访问路由表\r\n            });\r\n          }\r\n\r\n          vm.$router.push({ path: vm.redirect || '/' } as any);\r\n        });\r\n\r\n        // 拉取系统配置信息\r\n        vm.$api.config.getObject('/Admin/Sys').then((res: any) => {\r\n          const cfg = res.data.value;\r\n          vm.$store.dispatch('setSysConfig', cfg);\r\n        });\r\n      });\r\n    },\r\n    ssoClick(url: any) {\r\n      location.href = this.baseUrl + url;\r\n      // location.href = urls.ssoUrl + url\r\n    },\r\n    getUrl(mi: any) {\r\n      // console.log(mi)\r\n      let vm = this;\r\n      // let name = 'NewLife.Cube'\r\n      let url = `/Sso/Login?name=${mi.name}&source=front-end`;\r\n      // let url = `/sso/authorize?response_type=token&client_id=${name}`\r\n      let redirect_uri = encodeURIComponent(\r\n        location.origin +\r\n          '/auth-redirect' +\r\n          (vm.redirect ? '?redirect=' + vm.redirect : ''),\r\n      );\r\n      url += `&redirect_uri=${redirect_uri}`;\r\n      return url;\r\n    },\r\n    getLogoUrl(logo: any) {\r\n      let vm = this;\r\n      if (logo.indexOf('http') !== 0) {\r\n        logo = vm.baseUrl + logo;\r\n      }\r\n      return logo;\r\n    },\r\n    autoAuthRedirect() {\r\n      // 根据设置,如果不允许密码登录,且只有一个第三方登录,自动跳转\r\n      let vm = this;\r\n      let loginConfig = vm.loginConfig;\r\n      if (\r\n        loginConfig &&\r\n        !loginConfig.allowLogin &&\r\n        loginConfig.providers.length === 1\r\n      ) {\r\n        vm.ssoClick(vm.getUrl(loginConfig.providers[0]));\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<!-- Login -->\r\n<style scoped>\r\n.login-logo {\r\n  text-align: center;\r\n  font-size: 130px;\r\n  color: #4ca6ff;\r\n  margin-top: 50px;\r\n}\r\n\r\n.cube-login {\r\n  background: #fff;\r\n  padding-bottom: 0;\r\n  border-radius: 15px;\r\n  text-align: center;\r\n}\r\n\r\n.cube-login .heading {\r\n  display: block;\r\n  font-size: 24px;\r\n  font-weight: 700;\r\n  padding: 5px 0;\r\n  margin-bottom: 20px;\r\n  text-align: center;\r\n}\r\n\r\n.cube-login input {\r\n  border-radius: 20px;\r\n  box-shadow: none;\r\n  padding: 0 20px 0 45px;\r\n  height: 40px;\r\n  transition: all 0.3s ease 0s;\r\n}\r\n\r\n.cube-login .text {\r\n  float: left;\r\n  margin-left: 7px;\r\n  line-height: 20px;\r\n  padding-top: 5px;\r\n  text-transform: capitalize;\r\n}\r\n\r\n.cube-login a {\r\n  position: absolute;\r\n  top: 12px;\r\n  right: 0px;\r\n  font-size: 17px;\r\n  color: #c8c8c8;\r\n  transition: all 0.5s ease 0s;\r\n  color: #4ca6ff;\r\n}\r\n\r\n.el-input input {\r\n  border-radius: 20px;\r\n  box-shadow: none;\r\n  padding: 0 20px 0 45px;\r\n  height: 40px;\r\n  transition: all 0.3s ease 0s;\r\n  font-size: 14px;\r\n  line-height: 1.42857143;\r\n  color: #555;\r\n  background-color: #fff;\r\n  background-image: none;\r\n  border: 1px solid #ccc;\r\n}\r\n\r\n.btn {\r\n  float: right;\r\n  font-size: 14px;\r\n  color: #fff;\r\n  background: #00b4ef;\r\n  /* border-radius: 30px; */\r\n  border-radius: 4px;\r\n  padding: 8px 50px;\r\n  border: none;\r\n  text-transform: capitalize;\r\n  transition: all 0.5s ease 0s;\r\n  margin: -25px 0 15px 0;\r\n  width: 100%;\r\n}\r\n\r\n.text-primary {\r\n  color: #337ab7;\r\n}\r\n\r\nlabel {\r\n  display: inline-block;\r\n  max-width: 100%;\r\n  margin-bottom: 5px;\r\n  font-weight: 700;\r\n}\r\n</style>\r\n<!-- Login3 -->\r\n<style scoped>\r\np.login3 {\r\n  font-size: 22px;\r\n  position: relative;\r\n  width: 100%;\r\n  color: #333;\r\n  text-align: center;\r\n}\r\n\r\np.login3 span {\r\n  height: 1px;\r\n  position: absolute;\r\n  background-color: #928f8f;\r\n  width: 35%;\r\n  top: 50%;\r\n}\r\n\r\np.login3 span.right {\r\n  right: 65%;\r\n}\r\n\r\np.login3 span.left {\r\n  left: 65%;\r\n}\r\n\r\n.center {\r\n  display: flex;\r\n  width: 100%;\r\n  flex-direction: column;\r\n  align-items: center;\r\n}\r\n\r\n@media screen and (max-width: 680px) {\r\n  .login-col {\r\n    width: 80%;\r\n  }\r\n}\r\n\r\n@media screen and (min-width: 680px) and (max-width: 1680px) {\r\n  .login-col {\r\n    width: 30%;\r\n  }\r\n}\r\n\r\n@media screen and (min-width: 1680px) {\r\n  .login-col {\r\n    width: 445px;\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <div>{{ title }}</div>\r\n    <el-form\r\n      ref=\"form\"\r\n      v-model=\"form\"\r\n      label-position=\"right\"\r\n      label-width=\"135px\"\r\n      :inline=\"true\"\r\n      class=\"form-container\"\r\n    >\r\n      <template v-for=\"(column, k) in fields\">\r\n        <el-form-item\r\n          v-if=\"column.name.toLowerCase() != 'id' && showInForm(column)\"\r\n          :key=\"k\"\r\n          :prop=\"column.isDataObjectField ? column.name : column.columnName\"\r\n          :label=\"(column.displayName || column.name)+':'\"\r\n        >\r\n          <template\r\n            v-if=\"\r\n              column.description && column.displayName != column.description\r\n            \"\r\n            #label\r\n          >\r\n            <div style=\"display:inline-flex\">\r\n              <span>{{ column.displayName || column.name }}</span>\r\n              <el-tooltip :content=\"column.description\">\r\n                <el-icon><InfoFilled /></el-icon>\r\n              </el-tooltip>\r\n            </div>\r\n          </template>\r\n\r\n          <FormControl\r\n            v-if=\"\r\n                !isDetail\r\n              \"\r\n            v-model=\"form\"\r\n            :configs=\"column\"\r\n          ></FormControl>\r\n          <span\r\n            style=\"width: 220px;word-break: break-all;\"\r\n            v-else\r\n            >{{ form[column.name] }}</span\r\n          >\r\n\r\n          <!-- <el-switch\r\n            v-if=\"column.dataType == 'Boolean'\"\r\n            v-model=\"form[column.name]\"\r\n            active-color=\"#13ce66\"\r\n            inactive-color=\"#ff4949\"\r\n          /> -->\r\n\r\n          <!-- <el-date-picker\r\n            v-else-if=\"column.dataType == 'DateTime'\"\r\n            v-model=\"form[column.name]\"\r\n            type=\"datetime\"\r\n            format=\"YYYY-MM-DD HH:mm:ss\"\r\n            value-format=\"YYYY-MM-DD HH:mm:ss\"\r\n            placeholder=\"选择日期时间\"\r\n          /> -->\r\n\r\n          <!-- <el-input\r\n            v-else-if=\"column.dataType == 'String' && column.length > 50\"\r\n            v-model=\"form[column.name]\"\r\n            autosize\r\n            type=\"textarea\"\r\n          /> -->\r\n\r\n          <!-- <el-input\r\n            v-else\r\n            v-model=\"\r\n              form[column.isDataObjectField ? column.name : column.columnName]\r\n            \"\r\n            type=\"text\"\r\n          /> -->\r\n        </el-form-item>\r\n      </template>\r\n\r\n      <el-form-item>\r\n        <div\r\n          style=\"position: fixed; margin:20px; float:right; bottom: 0px; right: 0px; z-index: 1;\"\r\n        >\r\n          <el-button @click=\"returnIndex\">返回</el-button>\r\n          <el-button v-if=\"!isDetail\" type=\"primary\" @click=\"confirm\"\r\n            >保存</el-button\r\n          >\r\n        </div>\r\n      </el-form-item>\r\n    </el-form>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue';\r\nimport FormControl from '@/components/FormControl.vue';\r\n\r\nexport default defineComponent({\r\n  components: {\r\n    FormControl,\r\n  },\r\n  data() {\r\n    return {\r\n      form: {} as any,\r\n      fields: [] as any,\r\n      typeMap: { Add: '新增', Detail: '查看', Edit: '编辑' },\r\n    };\r\n  },\r\n  computed: {\r\n    id() {\r\n      return this.$route.params.id;\r\n    },\r\n    currentPath() {\r\n      const vm = this as any;\r\n      let rplStr = `/${vm.type}`;\r\n      if (!vm.isAdd) {\r\n        rplStr += `/${vm.id}`;\r\n      }\r\n      return this.$route.path.replace(rplStr, '');\r\n    },\r\n    type(): string {\r\n      return this.$route.params.type.toString();\r\n    },\r\n    isAdd() {\r\n      return (this as any).type === 'Add';\r\n    },\r\n    isDetail() {\r\n      return (this as any).type === 'Detail';\r\n    },\r\n    isEdit() {\r\n      return (this as any).type === 'Edit';\r\n    },\r\n    title() {\r\n      return (this as any).typeMap[(this as any).type];\r\n    },\r\n  },\r\n  // watch: {\r\n  // 原本是通过路由变化初始化数据,但是切换页面时仍会触发\r\n  //   $route: {\r\n  //     handler: function() {\r\n  //       this.init()\r\n  //     },\r\n  //     immediate: true\r\n  //   }\r\n  // },\r\n  created() {\r\n    this.init();\r\n  },\r\n  methods: {\r\n    init() {\r\n      this.getColumns();\r\n      if (!this.isAdd) {\r\n        this.query();\r\n      }\r\n    },\r\n    getColumns() {\r\n      // TODO 可改造成vue的属性,自动根据路由获取对应的列信息\r\n      const vm = this;\r\n      const path = vm.currentPath;\r\n\r\n      vm.$api.base.getColumns(path).then((res: any) => {\r\n        vm.fields = res.data;\r\n      });\r\n    },\r\n    query() {\r\n      const vm = this;\r\n      if (vm.isDetail) {\r\n        vm.$api.base.getDetailData(vm.currentPath, vm.id).then((res: any) => {\r\n          vm.form = res.data;\r\n        });\r\n      } else {\r\n        vm.$api.base.getData(vm.currentPath, vm.id).then((res: any) => {\r\n          vm.form = res.data;\r\n        });\r\n      }\r\n    },\r\n    confirm() {\r\n      const vm = this;\r\n      if (vm.isAdd) {\r\n        vm.$api.base.add(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '新增成功',\r\n            type: 'success',\r\n            duration: 5 * 1000,\r\n          });\r\n          vm.$router.go(-1);\r\n        });\r\n      } else {\r\n        vm.$api.base.edit(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '保存成功',\r\n            type: 'success',\r\n            duration: 5 * 1000,\r\n          });\r\n          vm.$router.go(-1);\r\n        });\r\n      }\r\n    },\r\n    returnIndex() {\r\n      this.$router.push(this.currentPath);\r\n    },\r\n    showInForm(col: any) {\r\n      const vm = this;\r\n      if (vm.isAdd) {\r\n        return col.showInAddForm;\r\n      } else if (vm.isDetail) {\r\n        return col.showInDetailForm;\r\n      } else {\r\n        return col.showInEditForm;\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.form-container {\r\n  margin-left: 50px;\r\n  margin-bottom: 75px;\r\n  max-height: -moz-calc(100vh - 160px);\r\n  max-height: -webkit-calc(100vh - 160px);\r\n  max-height: calc(100vh - 160px);\r\n  overflow-y: auto;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n.el-switch,\r\n.el-input,\r\n.el-textarea {\r\n  width: 220px;\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <div>{{ title }}</div>\r\n    <el-form\r\n      ref=\"form\"\r\n      v-model=\"form\"\r\n      label-position=\"right\"\r\n      label-width=\"135px\"\r\n      :inline=\"true\"\r\n      class=\"form-container\"\r\n    >\r\n      <template v-for=\"(column, k) in fields\">\r\n        <el-form-item\r\n          v-if=\"column.name.toLowerCase() != 'id' && showInForm(column)\"\r\n          :key=\"k\"\r\n          :prop=\"column.isDataObjectField ? column.name : column.columnName\"\r\n          :label=\"(column.displayName || column.name)+':'\"\r\n        >\r\n          <template\r\n            v-if=\"\r\n              column.description && column.displayName != column.description\r\n            \"\r\n            #label\r\n          >\r\n            <div style=\"display:inline-flex\">\r\n              <span>{{ column.displayName || column.name }}</span>\r\n              <el-tooltip :content=\"column.description\">\r\n                <el-icon><InfoFilled /></el-icon>\r\n              </el-tooltip>\r\n            </div>\r\n          </template>\r\n\r\n          <FormControl\r\n            v-if=\"\r\n                !isDetail\r\n              \"\r\n            v-model=\"form\"\r\n            :configs=\"column\"\r\n          ></FormControl>\r\n          <span\r\n            style=\"width: 220px;word-break: break-all;\"\r\n            v-else\r\n            >{{ form[column.name] }}</span\r\n          >\r\n\r\n          <!-- <el-switch\r\n            v-if=\"column.dataType == 'Boolean'\"\r\n            v-model=\"form[column.name]\"\r\n            active-color=\"#13ce66\"\r\n            inactive-color=\"#ff4949\"\r\n          /> -->\r\n\r\n          <!-- <el-date-picker\r\n            v-else-if=\"column.dataType == 'DateTime'\"\r\n            v-model=\"form[column.name]\"\r\n            type=\"datetime\"\r\n            format=\"YYYY-MM-DD HH:mm:ss\"\r\n            value-format=\"YYYY-MM-DD HH:mm:ss\"\r\n            placeholder=\"选择日期时间\"\r\n          /> -->\r\n\r\n          <!-- <el-input\r\n            v-else-if=\"column.dataType == 'String' && column.length > 50\"\r\n            v-model=\"form[column.name]\"\r\n            autosize\r\n            type=\"textarea\"\r\n          /> -->\r\n\r\n          <!-- <el-input\r\n            v-else\r\n            v-model=\"\r\n              form[column.isDataObjectField ? column.name : column.columnName]\r\n            \"\r\n            type=\"text\"\r\n          /> -->\r\n        </el-form-item>\r\n      </template>\r\n\r\n      <el-form-item>\r\n        <div\r\n          style=\"position: fixed; margin:20px; float:right; bottom: 0px; right: 0px; z-index: 1;\"\r\n        >\r\n          <el-button @click=\"returnIndex\">返回</el-button>\r\n          <el-button v-if=\"!isDetail\" type=\"primary\" @click=\"confirm\"\r\n            >保存</el-button\r\n          >\r\n        </div>\r\n      </el-form-item>\r\n    </el-form>\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport { defineComponent } from 'vue';\r\nimport FormControl from '@/components/FormControl.vue';\r\n\r\nexport default defineComponent({\r\n  components: {\r\n    FormControl,\r\n  },\r\n  data() {\r\n    return {\r\n      form: {} as any,\r\n      fields: [] as any,\r\n      typeMap: { Add: '新增', Detail: '查看', Edit: '编辑' },\r\n    };\r\n  },\r\n  computed: {\r\n    id() {\r\n      return this.$route.params.id;\r\n    },\r\n    currentPath() {\r\n      const vm = this as any;\r\n      let rplStr = `/${vm.type}`;\r\n      if (!vm.isAdd) {\r\n        rplStr += `/${vm.id}`;\r\n      }\r\n      return this.$route.path.replace(rplStr, '');\r\n    },\r\n    type(): string {\r\n      return this.$route.params.type.toString();\r\n    },\r\n    isAdd() {\r\n      return (this as any).type === 'Add';\r\n    },\r\n    isDetail() {\r\n      return (this as any).type === 'Detail';\r\n    },\r\n    isEdit() {\r\n      return (this as any).type === 'Edit';\r\n    },\r\n    title() {\r\n      return (this as any).typeMap[(this as any).type];\r\n    },\r\n  },\r\n  // watch: {\r\n  // 原本是通过路由变化初始化数据,但是切换页面时仍会触发\r\n  //   $route: {\r\n  //     handler: function() {\r\n  //       this.init()\r\n  //     },\r\n  //     immediate: true\r\n  //   }\r\n  // },\r\n  created() {\r\n    this.init();\r\n  },\r\n  methods: {\r\n    init() {\r\n      this.getColumns();\r\n      if (!this.isAdd) {\r\n        this.query();\r\n      }\r\n    },\r\n    getColumns() {\r\n      // TODO 可改造成vue的属性,自动根据路由获取对应的列信息\r\n      const vm = this;\r\n      const path = vm.currentPath;\r\n\r\n      vm.$api.base.getColumns(path).then((res: any) => {\r\n        vm.fields = res.data;\r\n      });\r\n    },\r\n    query() {\r\n      const vm = this;\r\n      if (vm.isDetail) {\r\n        vm.$api.base.getDetailData(vm.currentPath, vm.id).then((res: any) => {\r\n          vm.form = res.data;\r\n        });\r\n      } else {\r\n        vm.$api.base.getData(vm.currentPath, vm.id).then((res: any) => {\r\n          vm.form = res.data;\r\n        });\r\n      }\r\n    },\r\n    confirm() {\r\n      const vm = this;\r\n      if (vm.isAdd) {\r\n        vm.$api.base.add(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '新增成功',\r\n            type: 'success',\r\n            duration: 5 * 1000,\r\n          });\r\n          vm.$router.go(-1);\r\n        });\r\n      } else {\r\n        vm.$api.base.edit(vm.currentPath, vm.form).then(() => {\r\n          vm.$message({\r\n            message: '保存成功',\r\n            type: 'success',\r\n            duration: 5 * 1000,\r\n          });\r\n          vm.$router.go(-1);\r\n        });\r\n      }\r\n    },\r\n    returnIndex() {\r\n      this.$router.push(this.currentPath);\r\n    },\r\n    showInForm(col: any) {\r\n      const vm = this;\r\n      if (vm.isAdd) {\r\n        return col.showInAddForm;\r\n      } else if (vm.isDetail) {\r\n        return col.showInDetailForm;\r\n      } else {\r\n        return col.showInEditForm;\r\n      }\r\n    },\r\n  },\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.form-container {\r\n  margin-left: 50px;\r\n  margin-bottom: 75px;\r\n  max-height: -moz-calc(100vh - 160px);\r\n  max-height: -webkit-calc(100vh - 160px);\r\n  max-height: calc(100vh - 160px);\r\n  overflow-y: auto;\r\n  box-shadow: 1px 1px 4px rgb(0 21 41 / 8%);\r\n}\r\n.el-switch,\r\n.el-input,\r\n.el-textarea {\r\n  width: 220px;\r\n}\r\n</style>\r\n","<template>\r\n  <div :class=\"classObj\" class=\"app-wrapper\">\r\n    <div>\r\n      <div\r\n        v-show=\"!hiddenLayout && device === 'mobile' && sidebar.opened\"\r\n        class=\"drawer-bg\"\r\n        @click=\"handleClickOutside\"\r\n      />\r\n      <navbar v-show=\"!hiddenLayout\" />\r\n      <sidebar v-show=\"!hiddenLayout\" class=\"sidebar sidebar-container\" />\r\n      <div :class=\"classAppMain\" class=\"main\">\r\n        <app-main></app-main>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script>\r\nimport { Navbar, Sidebar, AppMain } from '@/views/layout/components'\r\nimport ResizeMixin from '@/views/layout/mixin/ResizeHandler'\r\n\r\nexport default {\r\n  components: {\r\n    Navbar,\r\n    Sidebar,\r\n    AppMain,\r\n  },\r\n  mixins: [ResizeMixin],\r\n  computed: {\r\n    sidebar() {\r\n      return this.$store.state.app.sidebar\r\n    },\r\n    device() {\r\n      return this.$store.state.app.device\r\n    },\r\n    hiddenLayout() {\r\n      let query = this.$route.query\r\n      return query.hiddenLayout === 'true' || query.hl === 'true'\r\n    },\r\n    classObj() {\r\n      return {\r\n        hideSidebar: !this.sidebar.opened,\r\n        openSidebar: this.sidebar.opened,\r\n        withoutAnimation: this.sidebar.withoutAnimation,\r\n        mobile: this.device === 'mobile',\r\n      }\r\n    },\r\n    classAppMain() {\r\n      return {\r\n        hiddenLayout: this.hiddenLayout,\r\n        hideSidebarMain: !this.sidebar.opened,\r\n        openSidebarMain: this.sidebar.opened,\r\n      }\r\n    },\r\n  },\r\n  methods: {\r\n    handleClickOutside() {\r\n      this.$store.dispatch('closeSideBar', { withoutAnimation: false })\r\n    },\r\n  },\r\n}\r\n</script>\r\n\r\n<style>\r\n.app-wrapper {\r\n  position: relative;\r\n  height: 100%;\r\n  width: 100%;\r\n}\r\n\r\n.sidebar {\r\n  position: fixed;\r\n  top: 50px;\r\n  bottom: 0;\r\n  height: 100%;\r\n}\r\n\r\n.main {\r\n  position: fixed;\r\n  top: 50px;\r\n  bottom: 0;\r\n  height: 100%;\r\n}\r\n\r\n.hideSidebarMain {\r\n  left: 0px;\r\n  width: -webkit-calc(100% - 40px);\r\n  width: -moz-calc(100% - 40px);\r\n  width: calc(100% - 40px);\r\n}\r\n\r\n.openSidebarMain {\r\n  left: 210px;\r\n  width: -webkit-calc(100% - 240px);\r\n  width: -moz-calc(100% - 240px);\r\n  width: calc(100% - 240px);\r\n}\r\n\r\n.hiddenLayout {\r\n  left: 0px;\r\n  width: -webkit-calc(100% - 40px);\r\n  width: -moz-calc(100% - 40px);\r\n  width: calc(100% - 40px);\r\n  top: 0px;\r\n}\r\n</style>\r\n\r\n<style scoped>\r\n.drawer-bg {\r\n  background: #000;\r\n  opacity: 0.3;\r\n  width: 100%;\r\n  top: 0;\r\n  height: 100%;\r\n  position: fixed;\r\n  z-index: 999;\r\n}\r\n</style>\r\n","import type { AxiosInstance } from 'axios';\r\n\r\n/**\r\n * 请求基类\r\n */\r\nclass ApiBase {\r\n  /** axios实例 */\r\n  public request: AxiosInstance;\r\n\r\n  constructor(request: AxiosInstance) {\r\n    this.request = request;\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * 获取表对应的列\r\n   * @param {*} path 基础请求路径\r\n   * @returns\r\n   */\r\n  public getColumns(path: string) {\r\n    const request = this.request;\r\n    return request({\r\n      url: path + '/GetColumns',\r\n      method: 'get',\r\n    });\r\n  }\r\n\r\n  public getDataList(path: string, page: any) {\r\n    const request = this.request;\r\n    return request({\r\n      url: path + '/Index',\r\n      method: 'post',\r\n      data: page,\r\n    });\r\n  }\r\n\r\n  public getData(path: string, id: any) {\r\n    const request = this.request;\r\n    const params = {\r\n      id,\r\n    };\r\n    return request({\r\n      url: path + '/Edit',\r\n      method: 'get',\r\n      params,\r\n    });\r\n  }\r\n\r\n  public getDetailData(path: string, id: any) {\r\n    const request = this.request;\r\n    const params = {\r\n      id,\r\n    };\r\n    return request({\r\n      url: path + '/Detail',\r\n      method: 'get',\r\n      params,\r\n    });\r\n  }\r\n\r\n  public deleteById(path: string, id: any) {\r\n    const request = this.request;\r\n    const params = {\r\n      id,\r\n    };\r\n    return request({\r\n      url: path + '/Delete',\r\n      method: 'get',\r\n      params,\r\n    });\r\n  }\r\n\r\n  public add(path: string, entity: any) {\r\n    const request = this.request;\r\n    return request({\r\n      url: path + '/Add',\r\n      method: 'post',\r\n      data: entity,\r\n    });\r\n  }\r\n\r\n  public edit(path: string, entity: any) {\r\n    const request = this.request;\r\n    return request({\r\n      url: path + '/Edit',\r\n      method: 'post',\r\n      data: entity,\r\n    });\r\n  }\r\n}\r\n\r\nexport default ApiBase;\r\n","import ApiBase from './api-base'\r\n\r\nexport class ApiConfig extends ApiBase {\r\n  public getObject(path: string) {\r\n    const request = this.request\r\n\r\n    return request({\r\n      url: path + '/Index',\r\n      method: 'get'\r\n    })\r\n  }\r\n\r\n  public updateObject(path: string, obj: object) {\r\n    const request = this.request\r\n\r\n    return request({\r\n      url: path + '/Update',\r\n      method: 'post',\r\n      data: obj\r\n    })\r\n  }\r\n\r\n  public getLoginConfig() {\r\n    const request = this.request\r\n\r\n    return request({\r\n      url: '/Admin/Cube/GetLoginConfig',\r\n      method: 'get'\r\n    })\r\n  }\r\n}\r\n","import ApiBase from './api-base'\r\n\r\nexport class ApiMenu extends ApiBase {\r\n  public getMenu() {\r\n    const request = this.request\r\n    return request({\r\n      url: '/Admin/Index/GetMenuTree',\r\n      method: 'get'\r\n    })\r\n  }\r\n}\r\n","import Storage from '@/utils/storage'\r\n\r\nconst TokenKey = 'token'\r\n\r\nexport function getToken() {\r\n  return Storage.getItem(TokenKey)\r\n}\r\n\r\nexport function setToken(token: string) {\r\n  return Storage.setItem(TokenKey, token)\r\n}\r\n\r\nexport function removeToken() {\r\n  return Storage.removeItem(TokenKey)\r\n}\r\n","import Storage from '@/utils/storage'\r\n\r\nconst Key = 'userInfo'\r\n\r\nexport function getUserInfo(): any | null {\r\n  const u = Storage.getItem(Key)\r\n  if (u && u !== 'undefined') {\r\n    return JSON.parse(u)\r\n  }\r\n\r\n  return null\r\n}\r\n\r\nexport function setUserInfo(value: object) {\r\n  return Storage.setItem(Key, JSON.stringify(value))\r\n}\r\n\r\nexport function removeUserInfo() {\r\n  return Storage.removeItem(Key)\r\n}\r\n","import { removeMenu } from '@/utils/menu'\r\nimport { removeToken } from '@/utils/token'\r\nimport { removeUserInfo } from '@/utils/user'\r\nimport ApiBase from './api-base'\r\n\r\nexport class ApiUser extends ApiBase {\r\n  public login(loginForm: any) {\r\n    const request = this.request\r\n\r\n    return request({\r\n      url: '/Admin/User/Login',\r\n      method: 'post',\r\n      data: loginForm\r\n      // params: data,\r\n    })\r\n  }\r\n\r\n  /**\r\n   * 注销登陆之后,移除token、用户信息、菜单\r\n   * @returns\r\n   */\r\n  public logout() {\r\n    const request = this.request\r\n\r\n    return request({\r\n      url: '/Admin/User/Logout',\r\n      method: 'get'\r\n    }).then(() => {\r\n      // TODO 如果不放这里,则考虑在调用此方法的地方使用事件总线\r\n      removeToken()\r\n      removeUserInfo()\r\n      removeMenu()\r\n    })\r\n  }\r\n\r\n  public getUserInfo() {\r\n    const request = this.request\r\n\r\n    return request({\r\n      url: '/Admin/User/Info/',\r\n      method: 'get'\r\n    })\r\n  }\r\n\r\n  public updateUserInfo(userInfo: any) {\r\n    const request = this.request\r\n\r\n    return request({\r\n      url: '/Admin/User/Info/',\r\n      method: 'post',\r\n      data: userInfo\r\n    })\r\n  }\r\n\r\n  public changePassword(data: any) {\r\n    const request = this.request\r\n\r\n    return request({\r\n      url: '/Admin/User/ChangePassword',\r\n      method: 'post',\r\n      data\r\n    })\r\n  }\r\n}\r\n","import type { AxiosInstance } from 'axios';\r\nimport type { App } from 'vue';\r\nimport ApiBase from './api-base';\r\nimport { ApiConfig } from './config';\r\nimport { ApiMenu } from './menu';\r\nimport { ApiUser } from './user';\r\n\r\nlet api: Api;\r\n\r\nexport const createApi = (app: App<Element>, request: AxiosInstance) => {\r\n  api = {\r\n    base: new ApiBase(request),\r\n    user: new ApiUser(request),\r\n    menu: new ApiMenu(request),\r\n    config: new ApiConfig(request),\r\n  };\r\n\r\n  app.config.globalProperties.$api = api;\r\n\r\n  return api;\r\n};\r\n\r\nexport interface Api {\r\n  base: ApiBase;\r\n  user: ApiUser;\r\n  menu: ApiMenu;\r\n  config: ApiConfig;\r\n}\r\n\r\nexport function getApi() {\r\n  if (!api) {\r\n    throw new Error('请调用createApi方法创建api');\r\n  }\r\n  return api;\r\n}\r\n","import { getApi } from '@/api'\r\nimport axios, { AxiosRequestConfig, AxiosResponse } from 'axios'\r\nimport { ElMessage as message, ElMessageBox as messageBox } from 'element-plus'\r\nimport { App } from 'vue'\r\nimport { getToken } from './token'\r\n// import JSONbig from 'json-bigint'\r\n\r\n// 是否正在弹窗\r\nlet isLoginTimeout = false\r\n\r\nfunction handle401() {\r\n  // 如果已弹窗,不重复弹窗\r\n  if (!isLoginTimeout) {\r\n    isLoginTimeout = true\r\n  } else {\r\n    console.log('登录超时,已弹窗,尝试关闭已打开的弹窗')\r\n    try {\r\n      // 关闭所有弹窗\r\n      messageBox.close()\r\n    } catch (error) {}\r\n  }\r\n\r\n  messageBox\r\n    .confirm('登陆超时,可以取消继续留在该页面,或者重新登录', '确定登出', {\r\n      confirmButtonText: '重新登录',\r\n      cancelButtonText: '取消',\r\n      type: 'warning'\r\n    })\r\n    .then(() => {\r\n      isLoginTimeout = false\r\n      getApi()\r\n        .user.logout()\r\n        .then(() => {\r\n          isLoginTimeout = false\r\n          location.reload() // 为了重新实例化vue-router对象 避免bug\r\n        })\r\n    })\r\n\r\n  return Promise.reject('登录超时')\r\n}\r\n\r\nfunction handle403(res: any) {\r\n  message({\r\n    message: res.message,\r\n    type: 'warning',\r\n    duration: 5 * 1000\r\n  })\r\n  return Promise.reject('没有权限')\r\n}\r\n\r\nconst axiosRequestConfig: AxiosRequestConfig = {\r\n  timeout: 50000\r\n  // // 响应拦截处理大数值\r\n  // transformResponse: [\r\n  //   (data) => {\r\n  //     try {\r\n  //       // 使用正则将长整数替换为字符串\r\n  //       data = data.replace(/(\\d{16,})/gi, '\"$1\"')\r\n  //       return JSON.parse(data)\r\n  //       // // 使用json-bigint将大数值转成\r\n  //       // data = JSONbig.parse(data)\r\n  //       // return data\r\n  //     } catch (err) {\r\n  //       return data\r\n  //     }\r\n  //   }\r\n  // ]\r\n}\r\n\r\nconst interceptorsConfig = {\r\n  request: (\r\n    config: AxiosRequestConfig\r\n  ): AxiosRequestConfig | Promise<AxiosRequestConfig> => {\r\n    // 所有请求默认是json格式,除了上传文件,不用表单\r\n    config.headers['Content-Type'] = 'application/json; charset=UTF-8'\r\n\r\n    const token = getToken()\r\n    if (token) {\r\n      // 让每个请求携带token-- ['Authorization']为自定义key 请根据实际情况自行修改\r\n      config.headers.Authorization = token\r\n    }\r\n\r\n    return config\r\n  },\r\n  requestError: (error: any): any => {\r\n    console.log(error)\r\n    message({\r\n      message: error,\r\n      type: 'error',\r\n      duration: 5 * 1000\r\n    })\r\n    return Promise.reject(error)\r\n  },\r\n  response: (\r\n    response: AxiosResponse<any>\r\n  ): AxiosResponse<any> | Promise<AxiosResponse<any>> => {\r\n    // console.log(response)\r\n    // http状态不是200不会到这里\r\n    let res = response.data\r\n    if (typeof res === 'string') {\r\n      res = JSON.parse(res)\r\n    }\r\n    if (res.code !== undefined && res.code !== null) {\r\n      if (res.code >= 500) {\r\n        message({\r\n          message: res.message,\r\n          type: 'error',\r\n          duration: 5 * 1000\r\n        })\r\n        return Promise.reject('后端服务错误')\r\n      } else if (res.code === 401) {\r\n        return handle401()\r\n      } else if (res.code === 403) {\r\n        return handle403(res)\r\n      } else {\r\n        return res\r\n      }\r\n    } else {\r\n      console.log('格式错误', res) // for debug\r\n      message({\r\n        message: '服务端返回格式不正确!!!请联系管理员',\r\n        type: 'error',\r\n        duration: 5 * 1000\r\n      })\r\n      return Promise.reject('服务端返回格式不正确')\r\n    }\r\n  },\r\n  responseError: (error: any): any => {\r\n    if (error.message === 'Request failed with status code 401') {\r\n      handle401()\r\n    } else if (error.message === 'Request failed with status code 403') {\r\n      handle403({ message: '没有权限!' })\r\n    } else {\r\n      console.log('err', error, JSON.stringify(error)) // for debug\r\n      message({\r\n        message: '服务请求出错',\r\n        type: 'error',\r\n        duration: 5 * 1000\r\n      })\r\n    }\r\n\r\n    return Promise.reject(error)\r\n  }\r\n}\r\n\r\nexport const createAxios = (\r\n  app: App<Element>,\r\n  options: ((config: AxiosRequestConfig) => void) | undefined = undefined,\r\n  configure:\r\n    | ((config: typeof interceptorsConfig) => void)\r\n    | undefined = undefined\r\n) => {\r\n  if (options) {\r\n    options(axiosRequestConfig)\r\n  }\r\n\r\n  if (configure) {\r\n    configure(interceptorsConfig)\r\n  }\r\n\r\n  const service = (app.config.globalProperties.$http = axios.create(\r\n    axiosRequestConfig\r\n  ))\r\n\r\n  const config = interceptorsConfig\r\n  service.interceptors.request.use(config.request, config.requestError)\r\n\r\n  service.interceptors.response.use(config.response, config.responseError)\r\n\r\n  return service\r\n}\r\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var Symbol = require('./_Symbol'),\n    arrayMap = require('./_arrayMap'),\n    isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n  var index = -1,\n      length = array.length;\n\n  if (start < 0) {\n    start = -start > length ? 0 : (length + start);\n  }\n  end = end > length ? length : end;\n  if (end < 0) {\n    end += length;\n  }\n  length = start > end ? 0 : ((end - start) >>> 0);\n  start >>>= 0;\n\n  var result = Array(length);\n  while (++index < length) {\n    result[index] = array[index + start];\n  }\n  return result;\n}\n\nmodule.exports = baseSlice;\n","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n  var length = array.length;\n  end = end === undefined ? length : end;\n  return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n  return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n  return string.split('');\n}\n\nmodule.exports = asciiToArray;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n    rsCombo = '[' + rsComboRange + ']',\n    rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n    rsNonAstral = '[^' + rsAstralRange + ']',\n    rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n    rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n    rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n    rsOptVar = '[' + rsVarRange + ']?',\n    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n    rsSeq = rsOptVar + reOptMod + rsOptJoin,\n    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n  return string.match(reUnicode) || [];\n}\n\nmodule.exports = unicodeToArray;\n","var asciiToArray = require('./_asciiToArray'),\n    hasUnicode = require('./_hasUnicode'),\n    unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n  return hasUnicode(string)\n    ? unicodeToArray(string)\n    : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n","var castSlice = require('./_castSlice'),\n    hasUnicode = require('./_hasUnicode'),\n    stringToArray = require('./_stringToArray'),\n    toString = require('./toString');\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n  return function(string) {\n    string = toString(string);\n\n    var strSymbols = hasUnicode(string)\n      ? stringToArray(string)\n      : undefined;\n\n    var chr = strSymbols\n      ? strSymbols[0]\n      : string.charAt(0);\n\n    var trailing = strSymbols\n      ? castSlice(strSymbols, 1).join('')\n      : string.slice(1);\n\n    return chr[methodName]() + trailing;\n  };\n}\n\nmodule.exports = createCaseFirst;\n","var createCaseFirst = require('./_createCaseFirst');\n\n/**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\nvar upperFirst = createCaseFirst('toUpperCase');\n\nmodule.exports = upperFirst;\n","var toString = require('./toString'),\n    upperFirst = require('./upperFirst');\n\n/**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\nfunction capitalize(string) {\n  return upperFirst(toString(string).toLowerCase());\n}\n\nmodule.exports = capitalize;\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n *  the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  if (initAccum && length) {\n    accumulator = array[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, array[index], index, array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","/**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyOf(object) {\n  return function(key) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = basePropertyOf;\n","var basePropertyOf = require('./_basePropertyOf');\n\n/** Used to map Latin Unicode letters to basic Latin letters. */\nvar deburredLetters = {\n  // Latin-1 Supplement block.\n  '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n  '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n  '\\xc7': 'C',  '\\xe7': 'c',\n  '\\xd0': 'D',  '\\xf0': 'd',\n  '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n  '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n  '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n  '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n  '\\xd1': 'N',  '\\xf1': 'n',\n  '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n  '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n  '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n  '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n  '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n  '\\xc6': 'Ae', '\\xe6': 'ae',\n  '\\xde': 'Th', '\\xfe': 'th',\n  '\\xdf': 'ss',\n  // Latin Extended-A block.\n  '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n  '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n  '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n  '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n  '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n  '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n  '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n  '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n  '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n  '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n  '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n  '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n  '\\u0134': 'J',  '\\u0135': 'j',\n  '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n  '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n  '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n  '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n  '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n  '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n  '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n  '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n  '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n  '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n  '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n  '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n  '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n  '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n  '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n  '\\u0174': 'W',  '\\u0175': 'w',\n  '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n  '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n  '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n  '\\u0132': 'IJ', '\\u0133': 'ij',\n  '\\u0152': 'Oe', '\\u0153': 'oe',\n  '\\u0149': \"'n\", '\\u017f': 's'\n};\n\n/**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\nvar deburrLetter = basePropertyOf(deburredLetters);\n\nmodule.exports = deburrLetter;\n","var deburrLetter = require('./_deburrLetter'),\n    toString = require('./toString');\n\n/** Used to match Latin Unicode letters (excluding mathematical operators). */\nvar reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n/** Used to compose unicode character classes. */\nvar rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange;\n\n/** Used to compose unicode capture groups. */\nvar rsCombo = '[' + rsComboRange + ']';\n\n/**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\nvar reComboMark = RegExp(rsCombo, 'g');\n\n/**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\nfunction deburr(string) {\n  string = toString(string);\n  return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n}\n\nmodule.exports = deburr;\n","/** Used to match words composed of alphanumeric characters. */\nvar reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n/**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction asciiWords(string) {\n  return string.match(reAsciiWord) || [];\n}\n\nmodule.exports = asciiWords;\n","/** Used to detect strings that need a more robust regexp to match words. */\nvar reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n/**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\nfunction hasUnicodeWord(string) {\n  return reHasUnicodeWord.test(string);\n}\n\nmodule.exports = hasUnicodeWord;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsDingbatRange = '\\\\u2700-\\\\u27bf',\n    rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n    rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n    rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n    rsPunctuationRange = '\\\\u2000-\\\\u206f',\n    rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n    rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n    rsVarRange = '\\\\ufe0e\\\\ufe0f',\n    rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\",\n    rsBreak = '[' + rsBreakRange + ']',\n    rsCombo = '[' + rsComboRange + ']',\n    rsDigits = '\\\\d+',\n    rsDingbat = '[' + rsDingbatRange + ']',\n    rsLower = '[' + rsLowerRange + ']',\n    rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n    rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n    rsNonAstral = '[^' + rsAstralRange + ']',\n    rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n    rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n    rsUpper = '[' + rsUpperRange + ']',\n    rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n    rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n    rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n    rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n    reOptMod = rsModifier + '?',\n    rsOptVar = '[' + rsVarRange + ']?',\n    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n    rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n    rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n    rsSeq = rsOptVar + reOptMod + rsOptJoin,\n    rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq;\n\n/** Used to match complex or compound words. */\nvar reUnicodeWord = RegExp([\n  rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n  rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n  rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n  rsUpper + '+' + rsOptContrUpper,\n  rsOrdUpper,\n  rsOrdLower,\n  rsDigits,\n  rsEmoji\n].join('|'), 'g');\n\n/**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\nfunction unicodeWords(string) {\n  return string.match(reUnicodeWord) || [];\n}\n\nmodule.exports = unicodeWords;\n","var asciiWords = require('./_asciiWords'),\n    hasUnicodeWord = require('./_hasUnicodeWord'),\n    toString = require('./toString'),\n    unicodeWords = require('./_unicodeWords');\n\n/**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\nfunction words(string, pattern, guard) {\n  string = toString(string);\n  pattern = guard ? undefined : pattern;\n\n  if (pattern === undefined) {\n    return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n  }\n  return string.match(pattern) || [];\n}\n\nmodule.exports = words;\n","var arrayReduce = require('./_arrayReduce'),\n    deburr = require('./deburr'),\n    words = require('./words');\n\n/** Used to compose unicode capture groups. */\nvar rsApos = \"['\\u2019]\";\n\n/** Used to match apostrophes. */\nvar reApos = RegExp(rsApos, 'g');\n\n/**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\nfunction createCompounder(callback) {\n  return function(string) {\n    return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n  };\n}\n\nmodule.exports = createCompounder;\n","var capitalize = require('./capitalize'),\n    createCompounder = require('./_createCompounder');\n\n/**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\nvar camelCase = createCompounder(function(result, word, index) {\n  word = word.toLowerCase();\n  return result + (index ? capitalize(word) : word);\n});\n\nmodule.exports = camelCase;\n","import camelCase from 'lodash/camelCase';\r\nimport upperFirst from 'lodash/upperFirst';\r\n\r\n/**\r\n * 组件自动化全局注册\r\n * @param app\r\n * @param fileContext const fileContext = require.context('@/views/components', true, /\\w+\\.(vue|js)$/)\r\n */\r\nexport const requireComponent = (app: any, fileContext: any) => {\r\n  // fileContext.keys().forEach((fileName: string) => {\r\n  //   // 获取组件配置\r\n  //   const componentConfig = fileContext(fileName)\r\n  Object.entries(fileContext).forEach(([fileName, val]) => {\r\n    const componentConfig = val as any;\r\n\r\n    // 获取组件的 PascalCase 名\r\n    const componentName = upperFirst(\r\n      camelCase(\r\n        // 获取目录深度无关的文件名\r\n        fileName\r\n          .split('/')\r\n          .pop()\r\n          ?.replace(/\\.\\w+$/, ''),\r\n      ),\r\n    );\r\n\r\n    app.component(\r\n      componentName,\r\n      // 在 `.default` 上查找组件选项。\r\n      // 如果组件导出了 `export default` 的话,该选项会存在。\r\n      // 否则回退到模块的根。\r\n      componentConfig.default || componentConfig,\r\n    );\r\n  });\r\n};\r\n","// const map = state.files.map || {}\r\n// files.keys().forEach((key: any) => {\r\n//   map[key] = files(key)\r\n// })\r\n// state.files = function(req: any) {\r\n//   return map[req]\r\n// }\r\n// state.files.map = map\r\n// state.files.keys = function() {\r\n//   return Object.keys(map)\r\n// }\r\n\r\n// { \"./src/views/account/login.vue\": VueComponet }\r\nlet map: any = {};\r\n\r\nfunction context(id: string) {\r\n  // console.log('获取文件', id)\r\n  //   console.log(__webpack_require__)\r\n  //   return __webpack_require__(id)\r\n  const req = resolve(id);\r\n  if (!req) {\r\n    throw new Error('找不到模块:' + id);\r\n  }\r\n  return map[req];\r\n}\r\n\r\nconst keys = function fileContextKeys() {\r\n  return Object.keys(map);\r\n};\r\n\r\nconst addFiles = function fileContextAddFiles(files: any) {\r\n  // files.keys().forEach((value: any) => {\r\n  //   // 在本地调试的时候“files.resolve(value)”获取的id是“./src”开头的路径\r\n  //   // 打包后运行获取到的是一个4位长的编码\r\n  //   // const id = files.resolve(value)\r\n  //   map[value] = files(value);\r\n  // });\r\n\r\n  map = { ...map, ...files }; // 使用vite后,此对象直接就是文件对象\r\n};\r\n\r\n/**\r\n * 解析组件,id传值路径规则:src目录为起始目录\r\n * 例如:./App.vue\r\n */\r\nconst resolve = (id: any) => {\r\n  if (id.startsWith('@/')) {\r\n    id = id.replace('@/', '/src/'); // vite中,@/ 变成 /src/\r\n  }\r\n\r\n  if (keys().includes(id)) {\r\n    return id;\r\n  } else {\r\n    return null;\r\n  }\r\n};\r\n\r\ncontext.addFiles = addFiles;\r\ncontext.id = 'fileContext';\r\ncontext.keys = keys;\r\ncontext.resolve = resolve;\r\n\r\nexport const fileContext = context;\r\nexport default fileContext;\r\n","import { getToken } from '@/utils/token' // getToken from cookie\r\n\r\nconst whiteList = ['/login', '/auth-redirect'] // no redirect whitelist\r\n\r\nexport default (to: any, from: any, next: any) => {\r\n  if (getToken()) {\r\n    // 有token,又去登录页,跳回主页\r\n    if (to.path === '/login') {\r\n      next({\r\n        path: '/'\r\n      })\r\n    } else {\r\n      next()\r\n    }\r\n  } else {\r\n    /* has no token*/\r\n    if (whiteList.indexOf(to.path) !== -1) {\r\n      // 在免登录白名单,直接进入\r\n      next()\r\n    } else {\r\n      next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页\r\n    }\r\n  }\r\n}\r\n","import {\r\n  createRouter as create,\r\n  createWebHistory,\r\n  NavigationGuardWithThis,\r\n  NavigationHookAfter,\r\n  Router,\r\n  RouterOptions,\r\n} from 'vue-router';\r\nimport fileContext from '@/services/file-context';\r\nimport beforeEachFn from './beforeEach';\r\n\r\nconst Layout = () => Promise.resolve(fileContext('@/views/layout/index.vue'));\r\n// () => import('@/views/layout/index.vue')\r\n\r\nexport const constantRouterMap = [\r\n  // {\r\n  //   path: '/redirect',\r\n  //   component: Layout,\r\n  //   hidden: true,\r\n  //   children: [\r\n  //     {\r\n  //       path: '/redirect/:path*',\r\n  //       component: () => import('src/views/redirect'),\r\n  //     },\r\n  //   ],\r\n  // },\r\n  {\r\n    path: '/login',\r\n    component: () => Promise.resolve(fileContext('@/views/account/login.vue')),\r\n    hidden: true,\r\n  },\r\n  {\r\n    path: '/auth-redirect',\r\n    component: () =>\r\n      Promise.resolve(fileContext('@/views/account/auth-redirect.vue')),\r\n    hidden: true,\r\n  },\r\n  {\r\n    path: '',\r\n    redirect: '/Admin/User/Info',\r\n    component: Layout,\r\n    children: [\r\n      {\r\n        path: '/Admin/User/Info',\r\n        component: () =>\r\n          Promise.resolve(fileContext('@/views/Admin/User/info.vue')),\r\n        name: 'UserInfo',\r\n        meta: {\r\n          title: '个人信息',\r\n          noCache: true,\r\n        },\r\n      },\r\n    ],\r\n  },\r\n  // {\r\n  //   path: '/404',\r\n  //   component: () => import('src/views/errorPage/404'),\r\n  //   hidden: true,\r\n  // },\r\n  // {\r\n  //   path: '/401',\r\n  //   component: () => import('src/views/errorPage/401'),\r\n  //   hidden: true,\r\n  // },\r\n  {\r\n    path: '',\r\n    component: Layout,\r\n    // redirect: 'dashboard',\r\n    children: [\r\n      {\r\n        path: 'dashboard',\r\n        component: () =>\r\n          Promise.resolve(fileContext('@/views/Admin/Index/Main.vue')),\r\n        name: 'Dashboard',\r\n        meta: {\r\n          title: '首页',\r\n          icon: 'dashboard',\r\n          noCache: true,\r\n        },\r\n      },\r\n    ],\r\n  },\r\n  {\r\n    path: '/Admin/Index/Main',\r\n    redirect: 'dashboard',\r\n  },\r\n];\r\n\r\nexport const asyncRouterMap = [\r\n  {\r\n    path: '*',\r\n    redirect: '/404',\r\n    hidden: true,\r\n  },\r\n];\r\n\r\nexport const routerOptions = {\r\n  history: createWebHistory(),\r\n  scrollBehavior: () => ({\r\n    top: 0,\r\n  }),\r\n  routes: constantRouterMap,\r\n};\r\n\r\n/**\r\n * 安装路由\r\n * @param app vue app实例\r\n * @param options 配置方法,可自定义修改\r\n * @beforeEach 路由前执行,比如 (to, from, next)=>{}\r\n * @returns Router实例\r\n */\r\nexport const createRouter = (\r\n  app: any,\r\n  configure: ((routerOptions: RouterOptions) => void) | undefined | null = null,\r\n  beforeEach: NavigationGuardWithThis<undefined> | undefined | null = null,\r\n  afterEach: NavigationHookAfter | undefined | null = null,\r\n): Router => {\r\n  if (configure) {\r\n    configure(routerOptions);\r\n  }\r\n\r\n  const router = create(routerOptions);\r\n  app.use(router);\r\n\r\n  if (beforeEach) {\r\n    router.beforeEach(beforeEach);\r\n  } else {\r\n    router.beforeEach(beforeEachFn);\r\n  }\r\n\r\n  if (afterEach) {\r\n    router.afterEach(afterEach);\r\n  }\r\n\r\n  return router;\r\n};\r\n","import { h } from 'vue';\r\n\r\n/**\r\n * 将菜单转化成路由\r\n * @param {*} routes 请求返回菜单\r\n */\r\nexport function formatRoutes(files: any, routes: any[], depth = 0) {\r\n  routes.forEach((router) => {\r\n    router.path = router.url;\r\n    if (router.path.startsWith('~')) {\r\n      router.path = router.path.substr(1);\r\n    }\r\n    router.displayName = router.displayName || router.name;\r\n    if (router.visible === undefined) {\r\n      console.log(router.name + ' visible为空');\r\n    }\r\n    if (router.meta) {\r\n      router.meta.menuId = router.id;\r\n      router.meta.permissions = router.permissions;\r\n    } else {\r\n      router.meta = { menuId: router.id, permissions: router.permissions };\r\n    }\r\n\r\n    // 第一层使用布局模板\r\n    if (depth === 0) {\r\n      router.component = () =>\r\n        Promise.resolve(files('@/views/layout/index.vue'));\r\n    } else {\r\n      // 处理名称,避免冲突\r\n      router.name = router.path.replace(/\\//g, '');\r\n\r\n      // 目前只按照两层处理\r\n      let filePath = `@/views${router.path}/list.vue`;\r\n      // router.component = () => import('@/views/common/list.vue')\r\n      // router.component = () => {\r\n      //   return <div>123</div>\r\n      // }\r\n      // router.component = () => Promise.resolve(files('@/views/common/list.vue'))\r\n\r\n      router.component = () => {\r\n        // 先尝试加载自定义视图,不存在使用默认视图\r\n        // 同时注入同目录下的config.ts文件\r\n\r\n        let props = {};\r\n        const configPath = `@/views${router.path}/config.tsx`;\r\n\r\n        if (files.resolve(configPath)) {\r\n          props = files(configPath);\r\n        }\r\n\r\n        if (!files.resolve(filePath)) {\r\n          filePath = '@/views/common/list.vue';\r\n        }\r\n\r\n        return Promise.resolve(h(files(filePath).default, { ...props }));\r\n      };\r\n\r\n      // 添加、编辑页路由\r\n      routes.push(getEditRoute(files, router, router.path));\r\n    }\r\n\r\n    let children = router.children;\r\n    if (children && children instanceof Array) {\r\n      router.hasChildren = true;\r\n      children = formatRoutes(files, children, depth + 1);\r\n    } else {\r\n      router.hasChildren = false;\r\n    }\r\n\r\n    router.children = children;\r\n  });\r\n\r\n  return routes;\r\n}\r\n\r\nfunction getEditRoute(files: any, router: any, path: string) {\r\n  // 添加、编辑页路由\r\n  const r = {\r\n    visible: false,\r\n    path: `${path}/:type(Edit|Add|Detail)/:id?`,\r\n    // path: `User/Edit/:id?`,\r\n    name: router.name + 'Form',\r\n    isFormRoute: true, // 是否表单路由\r\n    component: () => {\r\n      // 先尝试加载自定义视图,不存在使用默认视图\r\n      const filePath = `@/views${path}/form.vue`;\r\n      if (files.resolve(filePath)) {\r\n        return Promise.resolve(files(filePath));\r\n      } else {\r\n        return Promise.resolve(files('@/views/common/form.vue'));\r\n      }\r\n    },\r\n  };\r\n\r\n  return r;\r\n}\r\n","import fileContext from '@/services/file-context';\r\nimport { formatRoutes } from '@/utils/route';\r\n\r\nconst route = {\r\n  state: {\r\n    // 将展示在侧边栏的菜单\r\n    // menuRouters: [], // constantRouterMap,\r\n    menuRouters: [],\r\n    // 将要添加到路由系统中的新路由\r\n    addRouters: [],\r\n    // src/views 文件夹下的文件组件\r\n    files(req: any) {\r\n      console.log('no module');\r\n      return null;\r\n    },\r\n  },\r\n  mutations: {\r\n    SET_ROUTERS: (state: any, routers: any) => {\r\n      state.addRouters = routers;\r\n      state.menuRouters = /* constantRouterMap.concat*/ routers;\r\n    },\r\n    ADD_ROUTERS: (state: any, routers: any) => {\r\n      state.addRouters = state.addRouters.concat(routers);\r\n    },\r\n    SET_FILES: (state: any, files: any) => {\r\n      let map = state.files.map || {};\r\n      // files.keys().forEach((key: any) => {\r\n      //   map[key] = files(key)\r\n      // })\r\n      map = { ...map, ...files };\r\n      state.files = (req: any) => map[req];\r\n      state.files.map = map;\r\n      state.files.keys = () => Object.keys(map);\r\n    },\r\n  },\r\n  actions: {\r\n    generateRoutes({ commit, state }: any, accessedRouters: any) {\r\n      // 将请求回来的菜单生成为路由\r\n      const addRouters = formatRoutes(fileContext, accessedRouters);\r\n      commit('SET_ROUTERS', addRouters);\r\n    },\r\n    setRouters({ commit }: any, addRouters: any) {\r\n      commit('SET_ROUTERS', addRouters);\r\n    },\r\n    setFiles({ commit }: any, files: any) {\r\n      commit('SET_FILES', files);\r\n    },\r\n  },\r\n};\r\n\r\nexport default route;\r\n","import { removeMenu } from '@/utils/menu';\r\nimport { getToken, setToken, removeToken } from '@/utils/token';\r\nimport { getUserInfo, removeUserInfo, setUserInfo } from '@/utils/user';\r\nimport { Store } from 'vuex';\r\n\r\nconst user = {\r\n  state: {\r\n    userInfo: getUserInfo(),\r\n    permission: undefined, // 权限集合\r\n    token: getToken(),\r\n    hasPermission,\r\n  },\r\n\r\n  mutations: {\r\n    SET_USERINFO: (state: any, userInfo: any) => {\r\n      setUserInfo(userInfo);\r\n      state.userInfo = userInfo;\r\n    },\r\n    REMOVE_USERINFO: (state: any) => {\r\n      removeUserInfo();\r\n      state.userInfo = undefined;\r\n    },\r\n    SET_TOKEN: (state: any, token: any) => {\r\n      setToken(token);\r\n      state.token = token;\r\n    },\r\n    REMOVE_TOKEN: (state: any) => {\r\n      removeToken();\r\n      state.token = undefined;\r\n    },\r\n    SET_PERMISSION: (state: any, permission: any) => {\r\n      state.permission = permission;\r\n    },\r\n    REMOVE_MENU: (state: any) => {\r\n      removeMenu();\r\n    },\r\n  },\r\n\r\n  actions: {\r\n    setToken({ commit }: any, token: any) {\r\n      commit('SET_TOKEN', token);\r\n    },\r\n    // 设置用户信息\r\n    setUserInfo({ commit }: any, userInfo: any) {\r\n      commit('SET_USERINFO', userInfo);\r\n    },\r\n    // 登出\r\n    logout({ commit, state }: any) {\r\n      // 移除token\r\n      commit('REMOVE_TOKEN');\r\n      // 移除用户信息\r\n      commit('REMOVE_USERINFO');\r\n      // 移除菜单信息\r\n      commit('REMOVE_MENU');\r\n    },\r\n  },\r\n};\r\n\r\n// 判断当前用户是否拥有某个操作的权限\r\nfunction hasPermission(\r\n  store: Store<any>,\r\n  { menuId, actionId, permissions }: any,\r\n) {\r\n  const userStore = store.state.user;\r\n  if (!userStore.permission) {\r\n    if (!userStore.userInfo || !userStore.userInfo.permission) {\r\n      return false;\r\n    }\r\n    // permission格式: 1#255,2#255。#前为菜单id,#后为权限值\r\n    // 处理成以菜单id为key的对象\r\n    const permission = userStore.userInfo.permission;\r\n    const pObj: any = {};\r\n    const mlist = permission.split(',');\r\n    for (const key in mlist) {\r\n      const m = mlist[key];\r\n      const p: [string, string] = m.split('#');\r\n      pObj[p[0]] = p[1];\r\n    }\r\n    store.commit('SET_PERMISSION', pObj);\r\n  }\r\n\r\n  // 没有这个菜单\r\n  const permissionFlags = userStore.permission[menuId];\r\n  if (permissionFlags === undefined) {\r\n    return false;\r\n  }\r\n\r\n  // 只传了菜单id,没有传权限,并且菜单存在,说明有只读权限\r\n  if (actionId === undefined || actionId === null || actionId < 1) {\r\n    return true;\r\n  }\r\n\r\n  // 菜单没有这个权限\r\n  // if (permissions!.findIndex((f: any) => f.k === actionId) < 0) {\r\n  //   return false\r\n  // }\r\n  if (!permissions[actionId]) {\r\n    return false;\r\n  }\r\n\r\n  return (permissionFlags & actionId) > 0;\r\n}\r\n\r\nexport default user;\r\n","const route = {\r\n  state: {\r\n    listFields: {},\r\n    addFormFields: {},\r\n    editFormFields: {},\r\n    detailFields: {}\r\n  },\r\n  mutations: {\r\n    SET_ListFields: (state: any, { key, fields }: any) => {\r\n      state.listFields[key] = fields\r\n    },\r\n    SET_AddFormFields: (state: any, { key, fields }: any) => {\r\n      state.addFormFields[key] = fields\r\n    },\r\n    SET_EditFormFields: (state: any, { key, fields }: any) => {\r\n      state.editFormFields[key] = fields\r\n    },\r\n    SET_DetailFields: (state: any, { key, fields }: any) => {\r\n      state.detailFields[key] = fields\r\n    }\r\n  },\r\n  actions: {\r\n    setListFields({ commit }: any, { key, fields }: any) {\r\n      commit('SET_ListFields', { key, fields })\r\n    },\r\n    setAddFormFields({ commit }: any, { key, fields }: any) {\r\n      commit('SET_AddFormFields', { key, fields })\r\n    },\r\n    setEditFormFields({ commit }: any, { key, fields }: any) {\r\n      commit('SET_EditFormFields', { key, fields })\r\n    },\r\n    setDetailFields({ commit }: any, { key, fields }: any) {\r\n      commit('SET_DetailFields', { key, fields })\r\n    }\r\n  }\r\n}\r\n\r\nexport default route\r\n","export default {\r\n  baseUrl: '',\r\n  getBaseUrl() {\r\n    // 获取基础请求路径,可重载\r\n    return this.baseUrl\r\n  },\r\n  ssoUrl: 'https://sso.newlifex.com',\r\n  login: '/Admin/User/Login',\r\n  getToken: '/Sso/LoginInfo',\r\n  getUserInfo: '/Admin/User/Info/',\r\n  logout: '/Admin/User/Logout',\r\n  changePassword: '/Admin/User/ChangePassword',\r\n  getMenu: '/Admin/Index/GetMenuTree',\r\n  getEntityFields: '/GetFields',\r\n  getColumns: '/GetColumns',\r\n  getDataList: '/Index',\r\n  getData: '/Edit',\r\n  getDetailData: '/Detail',\r\n  deleteById: '/Delete',\r\n  add: '/Add',\r\n  edit: '/Edit',\r\n  getObject: '/Index',\r\n  getSysConfig: '/Admin/Sys',\r\n  updateObject: '/Update',\r\n  getLoginConfig: '/Admin/Cube/GetLoginConfig'\r\n}\r\n","import Storage from '@/utils/storage';\r\nimport urls from '@/api/constant';\r\nconst loginConfig = Storage.getItem('loginConfig');\r\nconst app = {\r\n  state: {\r\n    sidebar: {\r\n      opened: true, // !+Storage.getItem('sidebarStatus'),\r\n      withoutAnimation: false,\r\n    },\r\n    device: 'desktop',\r\n    size: Storage.getItem('size') || 'default',\r\n    urls,\r\n    // 系统配置\r\n    sysConfig: undefined,\r\n    // 登录页面配置\r\n    loginConfig: loginConfig ? JSON.parse(loginConfig) : null,\r\n    // 是否隐藏布局\r\n    hiddenLayout: false,\r\n    // 信息弹窗\r\n    message: undefined,\r\n    // 确认框弹窗\r\n    messageBox: undefined,\r\n  },\r\n  mutations: {\r\n    TOGGLE_SIDEBAR: (state: any) => {\r\n      if (state.sidebar.opened) {\r\n        Storage.setItem('sidebarStatus', 1);\r\n      } else {\r\n        Storage.setItem('sidebarStatus', 0);\r\n      }\r\n      state.sidebar.opened = !state.sidebar.opened;\r\n      state.sidebar.withoutAnimation = false;\r\n    },\r\n    CLOSE_SIDEBAR: (state: any, withoutAnimation: any) => {\r\n      Storage.setItem('sidebarStatus', 1);\r\n      state.sidebar.opened = false;\r\n      state.sidebar.withoutAnimation = withoutAnimation;\r\n    },\r\n    TOGGLE_DEVICE: (state: any, device: any) => {\r\n      state.device = device;\r\n    },\r\n    SET_SIZE: (state: any, size: any) => {\r\n      state.size = size;\r\n      Storage.setItem('size', size);\r\n    },\r\n    SET_URLS: (state: any, urls: any) => {\r\n      Object.assign(state.urls, urls);\r\n    },\r\n    SET_SYSCONFIG: (state: any, cfg: any) => {\r\n      state.sysConfig = cfg;\r\n    },\r\n    SET_LOGINCONFIG: (state: any, cfg: any) => {\r\n      state.loginConfig = cfg;\r\n      Storage.setItem('loginConfig', JSON.stringify(cfg));\r\n    },\r\n    SET_HIDDENLAYOUT: (state: any, hidden: any) => {\r\n      state.hiddenLayout = hidden;\r\n    },\r\n    SET_MESSAGE: (state: any, message: any) => {\r\n      state.message = message;\r\n    },\r\n    SET_MESSAGEBOX: (state: any, messageBox: any) => {\r\n      state.messageBox = messageBox;\r\n    },\r\n  },\r\n  actions: {\r\n    toggleSideBar({ commit }: any) {\r\n      commit('TOGGLE_SIDEBAR');\r\n    },\r\n    closeSideBar({ commit }: any, { withoutAnimation }: any) {\r\n      commit('CLOSE_SIDEBAR', withoutAnimation);\r\n    },\r\n    toggleDevice({ commit }: any, device: any) {\r\n      commit('TOGGLE_DEVICE', device);\r\n    },\r\n    setSize({ commit }: any, size: any) {\r\n      commit('SET_SIZE', size);\r\n    },\r\n    setUrls({ commit }: any, urls: any) {\r\n      commit('SET_URLS', urls);\r\n    },\r\n    setHiddenLayout({ commit }: any, hidden: any) {\r\n      commit('SET_HIDDENLAYOUT', hidden);\r\n    },\r\n    setSysConfig({ commit }: any, cfg: any) {\r\n      commit('SET_SYSCONFIG', cfg);\r\n    },\r\n    setLoginConfig({ commit }: any, cfg: any) {\r\n      commit('SET_LOGINCONFIG', cfg);\r\n    },\r\n    setMessage({ commit }: any, message: any) {\r\n      commit('SET_MESSAGE', message);\r\n    },\r\n    setMessageBox({ commit }: any, messageBox: any) {\r\n      commit('SET_MESSAGEBOX', messageBox);\r\n    },\r\n  },\r\n};\r\n\r\nexport default app;\r\n","const getters = {\r\n  token: (state: any) => state.user.token,\r\n  userInfo: (state: any) => state.user.userInfo,\r\n  menuRouters: (state: any) => state.route.menuRouters,\r\n  addRouters: (state: any) => state.route.addRouters,\r\n  files: (state: any) => state.route.files,\r\n  sysConfig: (state: any) => state.app.sysConfig,\r\n  loginConfig: (state: any) => state.app.loginConfig,\r\n  sidebar: (state: any) => state.app.sidebar,\r\n  app: (state: any) => state.app,\r\n  urls: (state: any) => state.app.urls,\r\n  message: (state: any) => state.app.message,\r\n  messageBox: (state: any) => state.app.messageBox\r\n}\r\nexport default getters\r\n","import route from './modules/route';\r\nimport user from './modules/user';\r\nimport entity from './modules/entity';\r\nimport moduleApp from './modules/app';\r\nimport getters from './getters';\r\nimport { createStore as create, Store, StoreOptions } from 'vuex';\r\nimport { App } from 'vue';\r\n\r\ninterface S {\r\n  app: typeof moduleApp.state;\r\n  entity: typeof entity.state;\r\n  route: typeof route.state;\r\n  user: typeof user.state;\r\n}\r\n\r\nexport const storeOptions: StoreOptions<S> = {\r\n  state: {} as S,\r\n  mutations: {},\r\n  actions: {},\r\n  modules: {\r\n    app: moduleApp,\r\n    entity,\r\n    route,\r\n    user,\r\n  },\r\n  getters,\r\n};\r\n\r\nexport const createStore = (\r\n  app: App<Element>,\r\n  configure: ((options: StoreOptions<S>) => void) | undefined | null = null,\r\n): Store<S> => {\r\n  if (configure) {\r\n    configure(storeOptions);\r\n  }\r\n  const store = create(storeOptions);\r\n  app.use(store);\r\n\r\n  return store;\r\n};\r\n","import { createApi } from '@/api';\r\nimport '@/styles/index.scss'; // global css\r\nimport { createAxios } from '@/utils/request';\r\nimport { requireComponent } from '@/utils/requireComponent';\r\nimport { AppMain, Navbar, Sidebar } from '@/views/layout/components/index';\r\nimport * as ElementIcons from '@element-plus/icons-vue';\r\nimport * as Element from 'element-plus';\r\nimport { createRouter } from './router';\r\nimport { fileContext } from './services/file-context';\r\nimport { createStore } from './store';\r\nimport { getMenu } from './utils/menu';\r\n\r\n// tslint:disable-next-line:whitespace\r\nconst golbalComponent = import.meta.glob('/src/views/components/*.vue', {\r\n  eager: true,\r\n});\r\n\r\nlet elementUI: any;\r\nlet elementIcons: any;\r\n\r\nconst install: any = (app: any) => {\r\n  if (install.installed) {\r\n    return;\r\n  }\r\n  install.installed = true;\r\n\r\n  // const files = require.context('@/', true, /^.*\\.(vue|tsx)$/);\r\n  // tslint:disable-next-line:whitespace\r\n  const files = import.meta.glob('@/**/*.(vue|tsx)', { eager: true });\r\n\r\n  // 注入视图文件\r\n  fileContext.addFiles(files);\r\n\r\n  app.component('Navbar', Navbar);\r\n  app.component('Sidebar', Sidebar);\r\n  app.component('AppMain', AppMain);\r\n\r\n  const store = createStore(app);\r\n\r\n  // 注册组件\r\n  store.dispatch('setFiles', files);\r\n\r\n  // 注册请求封装和api,注入$http\r\n  const axios = createAxios(app, undefined, (options) => {\r\n    // options.response = (res) => {\r\n    //   return Promise.resolve(res)\r\n    // }\r\n    // options.responseError = (err) => {}\r\n  });\r\n  axios.interceptors.request.use((config) => {\r\n    config.baseURL = store.getters.urls.getBaseUrl();\r\n    return config;\r\n  });\r\n\r\n  // 创建api,公用接口,注入$api\r\n  createApi(app, axios);\r\n\r\n  store.dispatch('setMessage', elementUI.ElMessage);\r\n  store.dispatch('setMessageBox', elementUI.ElMessageBox);\r\n\r\n  // 尝试从本地缓存加载菜单\r\n  const accessedRouters = getMenu();\r\n  let menuRouters: any[] = [];\r\n  if (accessedRouters && accessedRouters.length > 0) {\r\n    // 设置路由信息\r\n    store.dispatch('generateRoutes', accessedRouters);\r\n\r\n    // 添加路由信息\r\n    menuRouters = store.getters.addRouters;\r\n  }\r\n\r\n  // 配置路由\r\n  const router = createRouter(app, (options) => {\r\n    // options.history = createWebHashHistory()\r\n\r\n    // 从本地缓存加载的路由必须在这里添加\r\n    // 否则在已登录的情况,先进行导航再动态添加路由,导致找不到页面\r\n    options.routes = menuRouters.concat(options.routes);\r\n  });\r\n\r\n  app.use(elementUI, { size: store.state.app.size });\r\n  for (const key in elementIcons) {\r\n    if (Object.prototype.hasOwnProperty.call(elementIcons, key)) {\r\n      const e = elementIcons[key];\r\n      app.component(e.name, e);\r\n    }\r\n  }\r\n\r\n  // 自动注册全局组件\r\n  requireComponent(app, golbalComponent);\r\n\r\n  app.config.globalProperties.$message = elementUI.ElMessage;\r\n  app.config.globalProperties.$messageBox = elementUI.ElMessageBox;\r\n  app.config.globalProperties.$warn = (config: any) => {\r\n    elementUI.ElMessage.warning(config);\r\n  };\r\n\r\n  // 注入的计算属性自动解包\r\n  app.config.unwrapInjectedRef = true;\r\n};\r\n\r\nexport const createCubeUI = () => {\r\n  elementUI = Element;\r\n  elementIcons = ElementIcons;\r\n\r\n  return {\r\n    install,\r\n  };\r\n};\r\nexport default {\r\n  version: '1.0',\r\n  install,\r\n};\r\n\r\nexport * from '@/views/components/index';\r\nexport * from '@/views/layout/components/index';\r\nexport * from './services/file-context';\r\n// export {\r\n//   fileContext,\r\n//   createStore,\r\n//   createRouter,\r\n//   createAxios,\r\n//   createApi,\r\n//   requireComponent,\r\n//   utils,\r\n// };\r\n"],"names":["_sfc_main$G","defineComponent","end","start","vm","obj","configs","searchParams","item","val","x","oldVal","name","options","temp","arr","names","value","data","key","row","url","query","method","config","resp","array","option","_resolveComponent","_createBlock","_component_el_select_v2","_mergeProps","_ctx","_cache","$event","_createElementBlock","_normalizeStyle","_component_el_radio","_openBlock","_createCommentVNode","_Fragment","_renderList","_component_el_date_picker","_component_el_input","_sfc_main$F","table","colorMap","column","entity","reg","b","hand","scope","returnData","_createVNode","_component_el_table","_withCtx","_component_el_table_column","col","idx","_createElementVNode","_hoisted_1","_toDisplayString","_component_el_tooltip","e","_renderSlot","_component_el_switch","_hoisted_2","actionItem","i","_component_el_button","cindex","index","_hoisted_4","_hoisted_5","_hoisted_6","hIndex","_sfc_main","trueLength","_withScopeId","_hoisted_3","_component_el_row","_component_el_col","$props","btn","$options","_createTextVNode","_component_el_icon","_component_refresh","_component_el_popover","_component_setting","_component_el_checkbox","$data","field","_sfc_main$D","FormControl","columns","_component_el_form","_withDirectives","_component_el_form_item","exports","zhCn","_sfc_main$C","ElConfigProvider","_component_el_config_provider","_sfc_main$B","maxWidth","tableEl","columnEls","el","dataList","res","_normalizeClass","handlerItem","_sfc_main$A","n","_pushScopeId","_popScopeId","_component_el_divider","_sfc_main$z","val1","val2","list","_sfc_main$y","_sfc_main$x","_component_el_pagination","_sfc_main$w","props","searchList","type","Array","default","tableHandlerList","tableDataList","String","require","showSearch","Boolean","showHandler","showPagination","beforeGetDataList","Function","afterGetDataList","tableParent","Object","activated","loadingTable","showTable","selectList","tableData","pager","pageSize","pageIndex","total","totalCount","desc","sort","undefined","tableSearchHeight","computed","nonTableHeight","normalTableHeight","watch","mounted","getDataList","resize","window","addEventListener","beforeDestroy","removeEventListener","deactivated","methods","keyWord","txtKeywords","$http","post","then","rows","pagerModel","parseInt","resetSearch","handler","callback","func","$parent","msg","console","error","$message","call","setSelectList","setColumns","$nextTick","tableSearch","$refs","$el","offsetHeight","handlerSortChange","prop","order","log","render","ctx","height","$slots","$attrs","_resolveDirective","_sfc_main$v","search","rs","$1","$2","_component_el_option","_sfc_main$u","_sfc_main$t","_component_router_view","_sfc_main$s","$setup","args","_sfc_main$r","_sfc_main$q","Hamburger","avatar","_hoisted_7","_hoisted_9","_hoisted_10","_component_hamburger","_component_el_dropdown","_component_el_dropdown_menu","_component_router_link","_component_el_dropdown_item","_hoisted_8","_sfc_main$p","_sfc_render","_sfc_main$o","Item","children","parent","showingChildren","child","_component_el_sub_menu","_component_el_menu_item","_component_item","_component_sidebar_item","getItem","setItem","removeItem","Storage","Key","getMenu","u","setMenu","removeMenu","_sfc_main$n","SidebarItem","menuRouters","menus","accessedRouters","addRouters","_component_el_scrollbar","_component_el_menu","route","_sfc_main$m","_sfc_main$l","_sfc_main$k","_sfc_main$j","_sfc_main$i","body","WIDTH","RATIO","ResizeMixin","isMobile","Navbar","Sidebar","AppMain","_vShow","_component_navbar","_component_sidebar","_component_app_main","_sfc_main$g","redirect","token","response","routeRes","_sfc_main$d","loginConfig","cfg","mi","redirect_uri","logo","_sfc_main$b","cate","k","permissionFlags","_sfc_main$a","AdvancedTable","ifFn2","tableColumnConfig","actionList","ifFn","path","actionId","menuId","permissions","_component_AdvancedTable","ObjectForm","tab","event","List","_component_el_tabs","_component_el_tab_pane","_component_object_form","action","id","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_22","_hoisted_25","_hoisted_28","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_15","_hoisted_21","_hoisted_24","_hoisted_29","_hoisted_33","_hoisted_37","_hoisted_38","_sfc_main$7","rplStr","_sfc_main$6","dateRange","element","pId","len","pList","count","_directive_loading","tableSearchConfig","itemType","displayName","showInSearch","setDefaultValue","placeholder","dataType","length","nullable","isDataObjectField","description","showInList","width","_sfc_main$5","permission","pObj","mlist","p","menu","j","menuChild","parentID","pCheck","checkCount","parentCheck","parentIm","f","c","im","labelField","valueField","tableHandlerConfig","none","detail","insert","update","delete","tableActionConfig","handlerList","innerText","if","app","hasPermission","tableName","tableId","enable","primaryKey","master","showInAddForm","showInEditForm","showInDetailForm","cellText","cellTitle","cellUrl","headerText","headerTitle","headerUrl","dataAction","dataSource","createUserId","createTime","createIP","updateUserId","updateTime","updateIP","_sfc_main$4","_component_el_select","_sfc_main$3","_sfc_main$2","_sfc_main$1","_createSlots","_component_FormControl","ApiBase","request","__publicField","page","params","ApiConfig","ApiMenu","TokenKey","getToken","setToken","removeToken","getUserInfo","setUserInfo","removeUserInfo","ApiUser","loginForm","userInfo","api","createApi","getApi","isLoginTimeout","handle401","messageBox","handle403","message","axiosRequestConfig","interceptorsConfig","createAxios","configure","service","axios","freeGlobal","global","_freeGlobal","require$$0","freeSelf","root","_root","Symbol","_Symbol","arrayMap","iteratee","result","_arrayMap","isArray","isArray_1","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","isOwn","tag","unmasked","_getRawTag","objectToString","_objectToString","require$$1","require$$2","nullTag","undefinedTag","baseGetTag","_baseGetTag","isObjectLike","isObjectLike_1","symbolTag","isSymbol","isSymbol_1","require$$3","INFINITY","symbolProto","symbolToString","baseToString","_baseToString","toString","toString_1","baseSlice","_baseSlice","castSlice","_castSlice","rsAstralRange","rsComboMarksRange","reComboHalfMarksRange","rsComboSymbolsRange","rsComboRange","rsVarRange","rsZWJ","reHasUnicode","hasUnicode","string","_hasUnicode","asciiToArray","_asciiToArray","rsAstral","rsCombo","rsFitz","rsModifier","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsOptJoin","rsSeq","rsSymbol","reUnicode","unicodeToArray","_unicodeToArray","stringToArray","_stringToArray","createCaseFirst","methodName","strSymbols","chr","trailing","_createCaseFirst","upperFirst","upperFirst_1","capitalize","capitalize_1","arrayReduce","accumulator","initAccum","_arrayReduce","basePropertyOf","object","_basePropertyOf","deburredLetters","deburrLetter","_deburrLetter","reLatin","reComboMark","deburr","deburr_1","reAsciiWord","asciiWords","_asciiWords","reHasUnicodeWord","hasUnicodeWord","_hasUnicodeWord","rsDingbatRange","rsLowerRange","rsMathOpRange","rsNonCharRange","rsPunctuationRange","rsSpaceRange","rsUpperRange","rsBreakRange","rsApos","rsBreak","rsDigits","rsDingbat","rsLower","rsMisc","rsUpper","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","rsOrdLower","rsOrdUpper","rsEmoji","reUnicodeWord","unicodeWords","_unicodeWords","words","pattern","guard","words_1","reApos","createCompounder","_createCompounder","camelCase","word","camelCase_1","requireComponent","fileContext","fileName","componentConfig","componentName","_a","map","context","req","resolve","keys","addFiles","files","whiteList","beforeEachFn","to","from","next","Layout","constantRouterMap","routerOptions","createWebHistory","createRouter","beforeEach","afterEach","router","create","formatRoutes","routes","depth","filePath","configPath","h","getEditRoute","state","routers","commit","user","store","userStore","fields","urls","withoutAnimation","device","size","hidden","getters","storeOptions","moduleApp","createStore","golbalComponent","__vite_glob_0_0","__vite_glob_0_1","__vite_glob_0_2","__vite_glob_0_3","elementUI","elementIcons","install","createCubeUI","Element","ElementIcons"],"mappings":"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AAAA,EACxD,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACxD,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACxD,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACvE,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACvE,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACxD,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACxD,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACxD,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACvE,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACvE,GAAU;AAAA,EAAM,GAAU;AAAA,EAC1B,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EACzC,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACvE,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACvE,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACxD,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,GAAU;AAAA,EACxD,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EACzC,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EACzC,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EACzC,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EACzC,GAAU;AAAA,EAAM,GAAU;AAAA,EAAK,GAAU;AAAA,EAAK,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","x_google_ignoreList":[7,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119]}