import axios from 'axios'; import { formatter,formatterAmount, formatterDate,formatterDateOnly, find, } from '@/assets/utils/table'; const tagsMap = { 1: 'danger', 0: 'success' }; export default { mounted() { this.getData(); }, watch: { '$route'(route) { this.query = Object.assign({}, this.query, route.query); this.getData(); } }, beforeDestroy () { this.source.cancel('自动取消ajax操作'); clearTimeout(this.loadingTimer); }, methods: { beforeFecth() { return Promise.resolve(); }, // 表格接收数据前 beforeRender(data){return data}, // 表格接收数据后 afterRender(data){}, // 删除动作发生后 afterDel(data){}, // 默认拉取数据 async getData() { try { await this.beforeFecth(); } catch (error) { return; } this.tableData.loading = true; this.$post(this.pageInfo.list, this.query,{ cancelToken: this.source.token }) .then(({data})=>{ this.tableData = this.beforeRender( Object.assign({}, this.tableData, data) ); this.afterRender(this.tableData); }) .catch(error=>{ if(error.message == '自动取消ajax操作') return this.$message.error(error.message); }) .then(data=>{ clearTimeout(this.loadingTimer); this.loadingTimer = setTimeout(() => { this.tableData.loading = false; }, 300); }) }, // 复制一个数组或对象 util_copy(data) { if(typeof data !== 'object') return data; return JSON.parse(JSON.stringify(data)) }, _showAll(item) { let data = this.util_copy(item); data.isShowAll = true; this.util_update(item.id, data) }, // 超长文本展开收起 util_short(key, size) { return row => { let string = row[key] || ''; if(string.length < size || row.isShowAll) return string; return ( {string.substr(0, 50)+'...'} {this._showAll(row)}}>更多 ) } }, // 从dict字段暴力取值,取不到则返回原值 util_formatter(key, val) { try { return this.tableData.dict[key][val] } catch (error) { return val; } }, // 通过id修改某条记录 util_update(id, newData, idColumnName) { let table = this.tableData.result; let {index, data} = find(table, !idColumnName ? 'id' : idColumnName, id); table.splice(index, 1, Object.assign({}, data, newData)); }, // 工具方法,把数字转化为字符串 util_toString(data, array) { const dataCopy = Object.assign({}, data); for(var item in data) { dataCopy[item] = dataCopy[item] === undefined ? '' : dataCopy[item]+''; } return dataCopy; }, util_formatterDate(time, fmt) { if(!time) return ''; let date = new Date(Number(time)); var o = { "M+": date.getMonth() + 1, //月份 "d+": date.getDate(), //日 "[h|H]+": date.getHours(), //小时 "m+": date.getMinutes(), //分 "s+": date.getSeconds(), //秒 "q+": Math.floor((date.getMonth() + 3) / 3), //季度 "S": date.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; }, util_getPrevMonthDate() { let date = new Date(); var year = date.getFullYear(); var month = date.getMonth(); var day = date.getDate(); if(month == 0){//年份为0代表,是本年的第一月,所以不能减 month = 11;//月份为上年的最后月份 year--;//年份减1 return new Date(year,month,day); } month--;//否则,只减去月份 return new Date(year,month,day); }, // 格式化单元格数据 formatter(row, column, val) { const content = formatter(this.tableData, column, val); //return content; return content ? {content} : val }, formatterLink(row, column, val) { const content = formatter(this.tableData, column-2, val); return {row.attachName} //return content; // return content ? {content} : val }, formatterString(row, column, val) { return formatter(this.tableData, column, val) }, // 格式化单元格数据 0显示 0.00 formatterAmount(row, column) { return formatterAmount(row, column) }, // 格式化单元格数据钱单位里换算成元 formatterMoney(row, column, val) { return ((val || 0) / 1000).toFixed(2) }, // 格式化单元格数据 formatterDate(row, column) { return formatterDate(row, column) }, // 格式化单元格数据 只要年月日 formatterDateOnly(row, column) { return formatterDateOnly(row, column) }, // 多选表格行 handleSelectionChange(val) { this.selection = val.map(i=>i.id); }, // 当某一行被点击时会触发该事件 handleRowClick(row, column, event) { }, // 合并表格行列 handleSpanMethod() { }, // 自定义表格排序 handleSortChange() { }, // 设置单元行样式 tableRowClassName() {}, // 批量删除 toBatchDel() { this.toDel(this.selection.join(','), true); }, // 单个删除 toDel(id, isBatch) { if(!id) { return this.$message.warning('请选中一条记录'); } this.$post(this.pageInfo.del, {id: id}) .then(res=>{ this.$message.success(res.msg) // 更新数据 if(isBatch) { // 批量删除,刷新页面 this.getData(); }else{ let table = this.tableData.result; let {index} = find(table, 'id', id); table.splice(index, 1); this.tableData.pageInfo.totalResult -= 1; } this.afterDel(id); }) .catch(error=>{ this.$message.error(error.message); }) }, // 新增 toAdd() { this.$router.push({ path: this.pageInfo.add, query: this.tableConfig.addQuery, }) }, // 编辑 toEdit(row, query) { this.$router.push({ path: this.pageInfo.edit, query: Object.assign({}, {id: row.id}, query) }) }, // 查看 toView(row, query) { this.$router.push({ path: this.pageInfo.view, query: Object.assign({}, {id: row.id}, query) }) }, // 导入 toImport() { this.$router.push({ path: this.pageInfo.importView, query: this.tableConfig.addQuery, }) }, // 查看 toBack() { this.$router.push({ path: this.pageInfo.back }) }, // 开启、关闭 open() { }, }, computed: { tableConfig() { return Object.assign({}, this.defaultConfig, this.config) }, pageInfo() { const urls = { // 操作所需的url地址,和url同路径 list: this.$route.path, edit: this.$route.path.replace('/list', '/edit'), save: this.$route.path.replace('/list', '/save'), del: this.$route.path.replace('/list', '/delete'), add: this.$route.path.replace('/list', '/add'), view: this.$route.path.replace('/list', '/view'), importView: this.$route.path.replace('/list', '/importView'), } return Object.assign({}, urls, this.urls) }, }, data() { return { source: axios.CancelToken.source(), loadingTimer: null, query: this.$route.query, // url-query参数 selection: [], // 表格内置的多选 urls: {}, toString: [], defaultConfig: { search: [], // 头部搜索配置 columns: [], // 表格列信息配置 addQuery: {}, // 新增按钮携带的参数 buttons: [], // 增加查询区域自定义操作按钮,格式:[{label:'按钮显示名称',isShow:是否显示true/false,loading:true/false,type:'类型',icon:'图标',method:function(){}}] methods: { handleSelectionChange: this.handleSelectionChange, handleRowClick: this.handleRowClick, tableRowClassName: this.tableRowClassName, handleSpanMethod: this.handleSpanMethod, handleSortChange: this.handleSortChange, edit: this.toEdit, add: this.toAdd, del: this.toBatchDel, back: this.toBack, importView: this.toImport, refresh: this.getData, } }, tableData: { // 表格数据 loading: true, // ajax请求状态 dict: {}, result: [], pageInfo: {}, } } } }