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: { // 开启、关闭 changePath(path) { this.pageInfo.list = path + "/list"; this.pageInfo.del = path + "/delete"; this.pageInfo.add = path + "/add"; this.pageInfo.edit = path + "/edit"; this.pageInfo.view = path + "/view"; }, 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.data; 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 ? ( {content} ) : val ? ( val ) : ( "--" ); }, formatterYES(row, column, val) { const content = formatter(this.tableData, column, val); if (content) { if (val == "0") { return ( {content} ); } else if (val == "1") { return ( {content} ); } } else { return val; } }, formatterStatus(row, column, val) { const content = formatter(this.tableData, column, val); if (content) { if (val == "0") { return ( {content} ); } else if (val == "1") { return ( {content} ); } else if (val == "2") { return ( {content} ); } else { return {content}; } } else { return val; } }, formatterDictLink(row, column, val) { const content = formatter(this.tableData, column, val); let underline = false; let type = "primary"; if (val === 3) { type = "danger"; } return content ? ( { this.toDrawerMsg(row); }} size="mini" > {content} ) : ( val ); }, formatters(row, column, val) { if (val) { return val .split(",") .map((v) => { return formatter(this.tableData, column, v); }) .join(","); } return "--"; }, formatterLink(row, column, val) { //const content = formatter(this.tableData, column-2, val); return ( {row.fileName} ); //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); }, // 格式化单元格数据 formatterDateSeconds(row, column,val) { let h = parseInt(val / 60 / 60 % 24) let m = parseInt(val / 60 % 60) let s = parseInt(val % 60) //三元表达式 补零 如果小于10 则在前边进行补零 如果大于10 则不需要补零 h = h < 10 ? '0' + h : h m = m < 10 ? '0' + m : m s = s < 10 ? '0' + s : s if('00'===h&&'00'===m) return `${s}秒` if('00'===h) return `${m}分钟${s}秒` return `${h}小时${m}分钟${s}秒` //return formatterDate(row, column); }, // 格式化人员 formaterPeople(row, column, val) { let info; if (val) { if (typeof val === "number") { info = ( {this.util_formatter("assigneeList", val)} ); } else { info = val.split(",").map((v) => { if (this.tableData.dict["assigneeList"][v] != undefined) { return ( {this.util_formatter("assigneeList", v)} ); } }); } } else { info = "--"; } return info; }, // 多选表格行 handleSelectionChange(val) { this.selection = val.map((i) => i.id); }, // 当某一行被点击时会触发该事件 handleRowClick(row, column, event) {}, // 合并表格行列 handleSpanMethod() {}, // 自定义表格排序 handleSortChange() {}, // 自定义索引号 handleIndexMethod(index) { //prePageResult 每页条数 //console.log("index:"+index) let size = this.tableData.pageInfo.prePageResult; let page = this.tableData.pageInfo.currPage; let count = parseInt(size) * (parseInt(page) - 1); return count + index + 1; }, // 自定义表格选择行是否能勾选 handleSelectableMethod(row, index) { return true; }, // 设置单元行样式 tableRowClassName() {}, // 批量删除 toBatchDel() { this.toDel(this.selection.join(","), true); }, // 单个删除 toDel(id, isBatch) { if (!id) { return this.$message.warning("请选中一条记录"); } this.$get(this.pageInfo.del, { id: id }) .then((res) => { this.$message.success(res.msg); // 更新数据 if (isBatch) { // 批量删除,刷新页面 this.getData(); } else { let table = this.tableData.data; 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"), exclude: this.$route.path.replace("/list", "/list/exclude"), }; 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: [], // 头部搜索配置 tableName: "table", 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, handleIndexMethod: this.handleIndexMethod, handleSelectableMethod: this.handleSelectableMethod, 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: {}, }, }; }, };