{"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] || ' ' }}</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] || ' ' }}</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 {{ 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 <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 }} {{ 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]}
|