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;
|
};
|