| ¶Ô±ÈÐÂÎļþ | 
|  |  |  | 
|---|
|  |  |  | <script> | 
|---|
|  |  |  | import BasePage from './BasePage' | 
|---|
|  |  |  | import { isFunction } from 'element-ui' | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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: [], | 
|---|
|  |  |  | // å½åé¡µæ°æ® | 
|---|
|  |  |  | 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']) | 
|---|
|  |  |  | 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: this.tableData.pagination.pageIndex, | 
|---|
|  |  |  | capacity: 1000000, | 
|---|
|  |  |  | model: this.searchForm, | 
|---|
|  |  |  | sorts: this.tableData.sorts | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .then(response => { | 
|---|
|  |  |  | this.download(response) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .catch(e => { | 
|---|
|  |  |  | this.$tip.apiFailed(e) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .finally(() => { | 
|---|
|  |  |  | this.isWorking.export = false | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .catch(() => {}) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * éç½®æç´¢æ¡ä»¶ï¼ç¹å»éç½®æé®æ¶è§¦åï¼ | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | reset () { | 
|---|
|  |  |  | this.$refs.searchForm.resetFields() | 
|---|
|  |  |  | this.search() | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | refresh () { | 
|---|
|  |  |  | window.location.reload() | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * é¡µå®¹éåæ´å¤çï¼åæ¢é¡µå®¹éæ¶è§¦åï¼ | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @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, call) { | 
|---|
|  |  |  | this.__checkApi() | 
|---|
|  |  |  | let message = `确认å é¤${this.module}å?` | 
|---|
|  |  |  | 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() | 
|---|
|  |  |  | if (call) { | 
|---|
|  |  |  | call() | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .catch(e => { | 
|---|
|  |  |  | this.$tip.apiFailed(e) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .finally(() => { | 
|---|
|  |  |  | this.isWorking.delete = false | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .catch(() => {}) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * æ¹éå é¤ï¼ç¹å»æ¹éå é¤æ¶è§¦åï¼ | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param childConfirm å é¤åèç¹æ¶æ¯å¦è¿è¡äºæ¬¡ç¡®è®¤ | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | deleteByIdInBatch (childConfirm = true, call) { | 
|---|
|  |  |  | 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[this.configData['field.id']]).join(',')) | 
|---|
|  |  |  | .then(() => { | 
|---|
|  |  |  | this.__afterDelete(this.tableData.selectedRows.length) | 
|---|
|  |  |  | if (call) { | 
|---|
|  |  |  | call() | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .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 () { | 
|---|
|  |  |  | if (this.api == null) { | 
|---|
|  |  |  | throw new Error('The page is not initialized, you can use method \'this.config\' to initialize this page.') | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | </script> | 
|---|