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