| <script> | 
| import BasePage from './BasePage' | 
| export default { | 
|   name: 'BaseTable', | 
|   extends: BasePage, | 
|   data() { | 
|     return { | 
|       // 接口 | 
|       api: null, | 
|       // 模块名称 | 
|       module: '数据', | 
|       // 配置数据 | 
|       configData: { | 
|         // id字段 | 
|         'field.id': 'id', | 
|         // 主字段 | 
|         'field.main': 'name' | 
|       }, | 
|       // 是否正在执行 | 
|       isWorking: { | 
|         // 搜索中 | 
|         search: false, | 
|         // 删除中 | 
|         delete: false, | 
|         // 导出中 | 
|         export: false | 
|       }, | 
|       // 表格数据 | 
|       tableData: { | 
|         // 已选中的数据 | 
|         selectedRows: [], | 
|         // 排序的字段 | 
|         sorts: { | 
|           direction: 'DESC', | 
|           property: 'CREATE_TIME' | 
|         }, | 
|         // 当前页数据 | 
|         list: [], | 
|         // 分页 | 
|         pagination: { | 
|           pageIndex: 1, | 
|           pageSize: 10, | 
|           total: 0 | 
|         } | 
|       } | 
|     } | 
|   }, | 
|   methods: { | 
|     /** | 
|      * 配置 | 
|      * | 
|      * @param extParams 配置参数 | 
|      */ | 
|     config(extParams) { | 
|       if (extParams == null) { | 
|         throw new Error('Parameter can not be null of method \'config\' .') | 
|       } | 
|       if (extParams.api == null) { | 
|         throw new Error('Missing config option \'api\'.') | 
|       } | 
|       this.api = require('@/api' + extParams.api) | 
|       extParams.module && (this.module = extParams.module) | 
|       extParams['field.id'] && (this.configData['field.id'] = extParams['field.id']) | 
|       extParams['field.main'] && (this.configData['field.main'] = extParams['field.main']) | 
|       // if (extParams.sorts) { | 
|       //   this.tableData.sorts = extParams.sorts | 
|       // } | 
|       this.tableData.sorts = extParams.sorts | 
|     }, | 
|     /** | 
|      * 搜索(点击搜索按钮时触发) | 
|      */ | 
|     search() { | 
|       this.handlePageChange(1) | 
|     }, | 
|     /** | 
|      * 导出Excel(点击导出按钮时触发) | 
|      */ | 
|     exportExcel() { | 
|       this.__checkApi() | 
|       this.$dialog.exportConfirm('确认导出吗?') | 
|         .then(() => { | 
|           this.isWorking.export = true | 
|           this.api.exportExcel({ | 
|             page: 1, | 
|             // capacity: 0, | 
|             capacity: 1000000, | 
|             model: this.searchForm, | 
|             sorts: this.tableData.sorts | 
|           }) | 
|             .then(response => { | 
|               console.log(response); | 
|               this.download(response) | 
|             }) | 
|             .catch(e => { | 
|               console.log(e); | 
|               this.$tip.apiFailed(e) | 
|             }) | 
|             .finally(() => { | 
|   | 
|               this.isWorking.export = false | 
|             }) | 
|         }) | 
|         .catch(() => { | 
|           console.log('导出报错'); | 
|         }) | 
|     }, | 
|     /** | 
|      * 重置搜索条件(点击重置按钮时触发) | 
|      */ | 
|     reset() { | 
|       this.$refs.searchForm.resetFields() | 
|       this.search() | 
|     }, | 
|     /** | 
|      * 页容量变更处理(切换页容量时触发) | 
|      * | 
|      * @param pageSize 页容量 | 
|      */ | 
|     handleSizeChange(pageSize) { | 
|       this.tableData.pagination.pageSize = pageSize | 
|       this.search() | 
|     }, | 
|     /** | 
|      * 行选中处理(点击选中列时触发) | 
|      * | 
|      * @param selectedRows 已选中的行数组 | 
|      */ | 
|     handleSelectionChange(selectedRows) { | 
|       this.tableData.selectedRows = selectedRows | 
|     }, | 
|     /** | 
|      * 排序(点击列头排序时触发) | 
|      * | 
|      * @param sortData 排序参数 | 
|      */ | 
|     handleSortChange(sortData) { | 
|       this.tableData.sorts = [] | 
|       if (sortData.order != null) { | 
|         this.tableData.sorts.push({ | 
|           property: sortData.column.sortBy, | 
|           direction: sortData.order === 'descending' ? 'DESC' : 'ASC' | 
|         }) | 
|       } | 
|       this.handlePageChange() | 
|     }, | 
|     /** | 
|      * 页码变更处理(分页时触发) | 
|      * | 
|      * @param pageIndex 新页码 | 
|      */ | 
|     handlePageChange(pageIndex) { | 
|       this.__checkApi() | 
|       this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex | 
|       this.isWorking.search = true | 
|       this.api.fetchList({ | 
|         page: this.tableData.pagination.pageIndex, | 
|         capacity: this.tableData.pagination.pageSize, | 
|         model: this.searchForm, | 
|         sorts: this.tableData.sorts | 
|       }) | 
|         .then(data => { | 
|           this.tableData.list = data.records | 
|           this.tableData.pagination.total = data.total | 
|         }) | 
|         .catch(e => { | 
|           this.$tip.apiFailed(e) | 
|         }) | 
|         .finally(() => { | 
|           this.isWorking.search = false | 
|         }) | 
|     }, | 
|     /** | 
|      * 删除(点击行操作/删除时触发) | 
|      * | 
|      * @param row 行对象 | 
|      * @param childConfirm 删除子节点时是否进行二次确认 | 
|      */ | 
|     deleteById(row, childConfirm = true) { | 
|       this.__checkApi() | 
|       let message = `确认删除${this.module}【${row[this.configData['field.main']]}】吗?` | 
|       if (childConfirm && row.children != null && row.children.length > 0) { | 
|         message = `确认删除${this.module}【${row[this.configData['field.main']]}】及其子${this.module}吗?` | 
|       } | 
|       this.$dialog.deleteConfirm(message) | 
|         .then(() => { | 
|           this.isWorking.delete = true | 
|           this.api.deleteById(row[this.configData['field.id']]) | 
|             .then(() => { | 
|               this.__afterDelete() | 
|             }) | 
|             .catch(e => { | 
|               this.$tip.apiFailed(e) | 
|             }) | 
|             .finally(() => { | 
|               this.isWorking.delete = false | 
|             }) | 
|         }) | 
|         .catch(() => { }) | 
|     }, | 
|     /** | 
|      * 批量删除(点击批量删除时触发) | 
|      * | 
|      * @param childConfirm 删除子节点时是否进行二次确认 | 
|      */ | 
|     deleteByIdInBatch(childConfirm = true) { | 
|       this.__checkApi() | 
|       if (this.tableData.selectedRows.length === 0) { | 
|         this.$tip.warning('请至少选择一条数据') | 
|         return | 
|       } | 
|       let message = `确认删除已选中的 ${this.tableData.selectedRows.length} 条${this.module}记录吗?` | 
|       if (childConfirm) { | 
|         const containChildrenRows = [] | 
|         for (const row of this.tableData.selectedRows) { | 
|           if (row.children != null && row.children.length > 0) { | 
|             containChildrenRows.push(row[this.configData['field.main']]) | 
|           } | 
|         } | 
|         if (containChildrenRows.length > 0) { | 
|           message = `本次将删除${this.module}【${containChildrenRows.join('、')}】及其子${this.module}记录,确认删除吗?` | 
|         } | 
|       } | 
|       this.$dialog.deleteConfirm(message) | 
|         .then(() => { | 
|           this.isWorking.delete = true | 
|           this.api.deleteByIdInBatch(this.tableData.selectedRows.map(row => row.id).join(',')) | 
|             .then(() => { | 
|               this.__afterDelete(this.tableData.selectedRows.length) | 
|             }) | 
|             .catch(e => { | 
|               this.$tip.apiFailed(e) | 
|             }) | 
|             .finally(() => { | 
|               this.isWorking.delete = false | 
|             }) | 
|         }) | 
|         .catch(() => { }) | 
|     }, | 
|     /** | 
|      * 删除后处理,在单行删除或多行删除后调用 | 
|      * | 
|      * @param deleteCount 删除数量 | 
|      * @private | 
|      */ | 
|     __afterDelete(deleteCount = 1) { | 
|       this.$tip.apiSuccess('删除成功') | 
|       // 删除当前页最后一条记录时查询上一页数据 | 
|       if (this.tableData.list.length - deleteCount === 0) { | 
|         this.handlePageChange(this.tableData.pagination.pageIndex - 1 === 0 ? 1 : this.tableData.pagination.pageIndex - 1) | 
|       } else { | 
|         this.handlePageChange(this.tableData.pagination.pageIndex) | 
|       } | 
|     }, | 
|     /** | 
|      * 检查接口是否配置,在调用接口时调用 | 
|      * | 
|      * @private | 
|      */ | 
|     __checkApi() { | 
|       console.log(this.api); | 
|       if (this.api == null) { | 
|         throw new Error('The page is not initialized, you can use method \'this.config\' to initialize this page.') | 
|       } | 
|     }, | 
|     /** | 
|  * 数字相加 | 
|  * @param {*} arg1  | 
|  * @param {*} arg2  | 
|  * @returns  | 
|  */ | 
|     accAdd(arg1, arg2) { | 
|       return this.changeNum(arg1, arg2) | 
|     }, | 
|   | 
|     /** | 
|      * 数字相减 | 
|      * @param {*} arg1  | 
|      * @param {*} arg2  | 
|      * @returns  | 
|      */ | 
|     accSub(arg1, arg2) { | 
|       return this.changeNum(arg1, arg2, false) | 
|     }, | 
|   | 
|     /** | 
|      * 数字相乘 | 
|      * @param {*} arg1  | 
|      * @param {*} arg2  | 
|      * @returns  | 
|      */ | 
|     accMul(arg1, arg2) { | 
|       let m = 0; | 
|       m = accAdd(m, getDecimalLength(arg1)) | 
|       m = accAdd(m, getDecimalLength(arg2)) | 
|       return getNum(arg1) * getNum(arg2) / Math.pow(10, m) | 
|     }, | 
|   | 
|     /** | 
|      * 数字相除 | 
|      * @param {*} arg1  | 
|      * @param {*} arg2  | 
|      * @returns  | 
|      */ | 
|     accDiv(arg1, arg2) { | 
|       let t1, t2; | 
|       t1 = this.getDecimalLength(arg1) | 
|       t2 = this.getDecimalLength(arg2) | 
|       if (t1 - t2 > 0) { | 
|         return (this.getNum(arg1) / this.getNum(arg2)) / Math.pow(10, t1 - t2) | 
|       } else { | 
|         return (this.getNum(arg1) / this.getNum(arg2)) * Math.pow(10, t2 - t1) | 
|       } | 
|     }, | 
|   | 
|     changeNum(arg1 = '', arg2 = '', isAdd = true) { | 
|       function changeInteger(arg, r, maxR) { | 
|         if (r != maxR) { | 
|           let addZero = '' | 
|           for (let i = 0; i < maxR - r; i++) { | 
|             addZero += '0' | 
|           } | 
|           arg = Number(arg.toString().replace('.', '') + addZero) | 
|         } else { | 
|           arg = this.getNum(arg) | 
|         } | 
|         return arg | 
|       } | 
|       let r1, r2, maxR, m; | 
|       r1 = this.getDecimalLength(arg1) | 
|       r2 = this.getDecimalLength(arg2) | 
|       maxR = Math.max(r1, r2) | 
|       arg1 = changeInteger(arg1, r1, maxR) | 
|       arg2 = changeInteger(arg2, r2, maxR) | 
|       m = Math.pow(10, maxR) | 
|       if (isAdd) { | 
|         return (arg1 + arg2) / m | 
|       } else { | 
|         return (arg1 - arg2) / m | 
|       } | 
|     }, | 
|   | 
|     getDecimalLength(arg = '') { | 
|       try { | 
|         return arg.toString().split(".")[1].length | 
|       } catch (e) { | 
|         return 0 | 
|       } | 
|     }, | 
|   | 
|     getNum(arg = '') { | 
|       return Number(arg.toString().replace(".", "")) | 
|     } | 
|   | 
|   } | 
| } | 
| </script> |