中航光电热表web
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

217 lines
5.8 KiB

import { mapGetters } from 'vuex';
export default (app, option = {}) => {
let optionObj = import.meta.glob(`../option/**/**`)[`../option/${option.name}.js`];
let apiObj = import.meta.glob(`../api/**/**`)[`../api/${option.name}.js`];
let mixins = {
data() {
return {
data: [],
form: {},
params: {},
option: {},
api: {},
loading: false,
page: {},
};
},
created() {
optionObj().then(mode => (this.option = mode.default));
apiObj().then(mode => {
this.api = mode;
this.getList();
});
},
computed: {
...mapGetters(['userInfo', 'permission', 'roles']),
ids() {
const ids = [];
this.selectionList.forEach(ele => {
ids.push(ele[this.rowKey]);
});
return ids.join(',');
},
bindVal() {
return {
ref: 'crud',
option: this.option,
data: this.data,
tableLoading: this.loading,
};
},
onEvent() {
return {
'size-change': this.sizeChange,
'current-change': this.currentChange,
'row-save': this.rowSave,
'row-update': this.rowUpdate,
'row-del': this.rowDel,
'refresh-change': this.refreshChange,
'search-reset': this.searchChange,
'search-change': this.searchChange,
};
},
rowKey() {
return option.rowKey || 'id';
},
},
methods: {
getList() {
const callback = () => {
this.loading = true;
this.data = [];
this.api[option.list || 'getList'](
this.page.currentPage,
this.page.pageSize,
this.params
).then(res => {
this.loading = false;
let data;
if (option.res) {
data = option.res(res.data);
} else {
data = res.data.data;
}
this.page.total = data[option.total || 'total'];
const result = data[option.data || 'records'];
this.data = result;
if (this.listAfter) {
this.listAfter(data);
}
});
};
if (this.listBefore) {
this.listBefore();
}
callback();
},
rowSave(row, done, loading) {
const callback = () => {
delete this.form.params;
this.api[option.add || 'add'](this.form)
.then(data => {
this.getList();
if (this.addAfter) {
this.addAfter(data);
} else {
this.$message.success('新增成功');
}
done();
})
.catch(() => {
loading();
});
};
if (this.addBefore) {
this.addBefore();
}
callback();
},
rowUpdate(row, index, done, loading) {
const callback = () => {
delete this.form.params;
this.api[option.update || 'update'](this.form)
.then(data => {
this.getList();
if (this.updateAfter) {
this.updateAfter(data);
} else {
this.$message.success('更新成功');
}
done();
})
.catch(() => {
loading();
});
};
if (this.updateBefore) {
this.updateBefore();
}
callback();
},
rowDel(row, index) {
const callback = () => {
this.api[option.del || 'del'](row[this.rowKey], row).then(data => {
this.getList();
if (this.delAfter) {
this.delAfter(data, row, index);
} else {
this.$message.success('删除成功');
}
});
};
if (this.delBefore) {
this.delBefore();
callback();
} else {
this.$confirm('确定将选择数据删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
callback();
});
}
},
handleDelete() {
if (this.selectionList.length === 0) {
this.$message.warning('请选择至少一条数据');
return;
}
this.$confirm('确定将选择数据删除?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
this.api[option.del || 'remove'](this.ids).then(data => {
this.getList();
if (this.delMultiAfter) {
this.delMultiAfter(data, this.ids);
} else {
this.$message.success('删除成功');
}
});
});
},
searchChange(params, done) {
if (done) done();
this.params = params;
this.page.currentPage = 1;
this.getList();
},
dateChange(date) {
if (date) {
this.params.createTime_dategt = date[0];
this.params.createTime_datelt = date[1];
} else {
delete this.params.createTime_dategt;
delete this.params.createTime_datelt;
}
this.page.currentPage = 1;
this.getList();
},
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
refreshChange() {
this.getList();
},
sizeChange(val) {
this.page.currentPage = 1;
this.page.pageSize = val;
this.getList();
},
currentChange(val) {
this.page.currentPage = val;
this.getList();
},
},
};
app.mixins = app.mixins || [];
app.mixins.push(mixins);
return app;
};