rt-sim-training-client/src/components/QueryListPage/QueryListPage.vue
2020-04-22 18:37:09 +08:00

510 lines
19 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- :style="{height: queryList.height ? 'auto' : listPageHeight}" -->
<div class="query-list-page">
<query-form
v-show="!(queryForm.show === false)"
ref="queryForm"
:query-form="queryForm"
:left-span="queryForm.leftSpan"
:offset-span="queryForm.offsetSpan"
:query-list="queryList"
:before-query="queryForm.beforeQuery"
:can-query="canQuery"
@query="query"
@queryExport="queryExport"
@disableQuery="disableQuery"
@enableQuery="enableQuery"
/>
<el-card v-loading="loading">
<el-table
ref="table2"
highlight-current-row
stripe
border
:data="queryList.data"
size="medium"
:header-cell-style="headerCellStyle"
:default-sort="queryList.defaultSort"
@row-click="onRowClick"
@select="onSelect"
@select-all="onSelectAll"
@selection-change="onSelectionChange"
@sort-change="sortChange"
>
<el-table-column v-if="queryList.selectCheckShow" type="selection" width="55" />
<el-table-column v-if="queryList.indexShow" type="index" width="50" :label="this.$t('global.index')" />
<el-table-column v-if="queryList.radioShow" :label="`#${$t('global.select')}`" width="80">
<template slot-scope="scope">
<el-radio v-model="choose" :label="scope.row">{{ `` }}</el-radio>
</template>
</el-table-column>
<template v-for="(column, index) in queryList.columns">
<el-table-column
v-if="checkColumnTyep(column, 'basic')"
:key="index"
:prop="column.prop"
:label="column.title"
:width="column.width"
show-overflow-tooltip
:sortable="column.sortable"
:sort-by="column.sortBy"
/>
<el-table-column
v-else-if="checkColumnTyep(column, 'basicText')"
:key="index"
:label="column.title"
:width="column.width"
:sortable="column.sortable"
:sort-by="column.sortBy"
>
<template slot-scope="scope">
<span class="hideOutContent">{{ column.columnValue(scope.row, scope.$index) }}</span>
</template>
</el-table-column>
<el-table-column
v-else-if="checkColumnTyep(column, 'tag')"
:key="index"
:label="column.title"
:width="column.width"
:sortable="column.sortable"
:sort-by="column.sortBy"
>
<template slot-scope="scope">
<el-tag v-if="column.columnValue(scope.row, scope.$index)" :type="column.tagType(scope.row, scope.$index)">{{ column.columnValue(scope.row, scope.$index) }}</el-tag>
</template>
</el-table-column>
<el-table-column
v-else-if="checkColumnTyep(column, 'replicText')"
:key="index"
:label="column.title"
:width="column.width"
:sortable="column.sortable"
:sort-by="column.sortBy"
>
<template slot-scope="scope">
<span>{{ column.columnValue(scope.row, scope.$index) }}</span>
</template>
</el-table-column>
<el-table-column
v-else-if="checkColumnTyep(column, 'tagMore')"
:key="index"
:label="column.title"
:width="column.width"
:sortable="column.sortable"
:sort-by="column.sortBy"
>
<template slot-scope="scope">
<template v-for="tag in column.columnValue(scope.row)">
<el-tag
:key="tag"
:type="column.tagType(scope.row, scope.$index)"
style="margin-right: 10px; margin-bottom: 5px;"
>{{ tag }}</el-tag>
</template>
</template>
</el-table-column>
<el-table-column
v-else-if="checkColumnTyep(column, 'formatter')"
:key="index"
:prop="column.prop"
:label="column.title"
:formatter="column.formatter"
:sortable="column.sortable"
:sort-by="column.sortBy"
/>
<el-table-column
v-else-if="checkColumnTyep(column, 'button') && !(column.hide && column.hide(column))"
:key="index"
:label="column.title"
:width="column.width"
>
<template slot-scope="scope">
<template v-for="(button, idx) in column.buttons">
<el-button
v-if="button.show === undefined ? ((button.showControl === undefined) ? true: button.showControl(scope.row)): button.show"
:key="idx"
size="mini"
style="margin-top: 5px;"
:type="button.type ? button.type : 'primary'"
:disabled="isTableBtnDisabled(button, scope.$index, scope.row)"
@click="button.handleClick(scope.$index, scope.row) "
>{{ getTableBtnName(button.name, scope.$index, scope.row) }}</el-button>
</template>
</template>
</el-table-column>
</template>
</el-table>
<div v-if="queryList.selectCheckShow" style="margin-top: 8px; margin-left: 8px;">
<el-button
size="mini"
:type="'primary'"
:disabled="!queryList.selection.length"
@click="queryList.selectAllClick(queryList.selection)"
>{{ $t('global.selectAdd') }}</el-button>
</div>
<div class="page-container " style="text-align: center; margin: 10px 0; height: 40px;">
<el-pagination
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100] "
:page-size="pageSize "
layout="total, sizes, prev, pager, next, jumper "
:total="queryList.total "
@size-change="pageSizeChange "
@current-change="changePage"
/>
</div>
</el-card>
</div>
</template>
<script>
// import QueryForm from '@/components/QueryListPage/QueryForm'
// import { mapGetters } from 'vuex'
export default {
components: {
QueryForm: resolve => { require(['@/components/QueryListPage/QueryForm'], resolve); } // 懒加载
},
props: {
queryForm: {
type: Object,
required: true
},
pagerConfig: {
type: Object,
default() {
return {};
}
},
queryList: {
type: Object,
required: true
}
},
data() {
return {
loading: false,
choose: null,
queryData: {},
currentpagerConfig: {},
headerCellStyle: {
// "background-color ": 'rgba(48, 60, 86, 1)',
// color: 'white'
},
listPageHeight: '100%',
tableHeight: 0,
pageSize: 10,
pageIndex: 1,
pageOffset: 0,
canQuery: true, // 查询按钮是否可点
thirdQRCodeMakeUrl: 'http://s.jiathis.com/qrcode.php?url=',
sortBy:''
};
},
computed: {
globalPagerConfig: function() {
const pagerConfig = {
pageSize: 'pageSize',
pageIndex: 'pageNow'
};
return pagerConfig;
}
},
created() {
const self = this;
// queryList 如果没有data属性,就创建并赋值为[]
if (!this.queryList.data) {
this.$set(this.queryList, 'data', []);
}
// queryList 如果没有total属性,就创建并赋值为0
if (!this.queryList.total) {
this.$set(this.queryList, 'total', 0);
}
// 如果设置了pageConfig就使用它,否则使用globalPageConfig
if (!this.pagerConfig) {
this.currentpagerConfig = Object.assign({}, this.globalPagerConfig);
} else {
this.currentpagerConfig = Object.assign({}, this.pagerConfig);
}
// queryList 如果没有selection属性,就创建并赋值为[]
if (!this.queryList.selection) {
this.$set(this.queryList, 'selection', []);
}
// 给queryList添加数据重载的方法
this.queryList.reload = function() {
return self.commitQuery();
};
},
mounted() {
// this.commitQuery();
// this.tableHeight = this.$refs.table2.$el.offsetHeight + 23;
},
methods: {
// 根据类型显示
checkColumnTyep(column, typeName) {
if (column.show === false) {
return false;
} else if (column.isShow) {
return column.isShow();
}
if (typeof column.type === 'undefined') {
if (column.formatter instanceof Function) {
column.type = 'formatter';
} else {
column.type = 'basic';
}
}
// 类型是否匹配
const typeFlag = column.type === typeName;
return typeFlag;
},
isTableBtnDisabled(button, index, row) {
if (button.isDisabled) {
return button.isDisabled(index, row);
} else {
return false;
}
},
// 计算列表的列为链接时显示的名称,可能为列对象的字段
getTableBtnName(btnName, index, row) {
if (typeof btnName.trim() === 'function') {
return btnName(index, row);
} else {
return btnName;
}
},
// 按钮查询
query(queryData) {
this.queryData = queryData;
this.pageIndex = 1;
this.queryData[this.currentpagerConfig.pageSize] = this.pageSize;
this.queryData[this.currentpagerConfig.pageIndex] = this.pageIndex;
this.queryList.reload();
},
// 导出操作
queryExport(queryData) {
const self = this;
self.disableQuery();
self.queryData = queryData;
import('@/utils/Export2Excel').then(excel => {
const tHeader = self.queryForm.exportConfig.header;
self.prepareExportData().then(data => {
excel.export_json_to_excel(tHeader, data, self.queryForm.exportConfig.filename);
self.enableQuery();
}).catch(() => {
self.enableQuery();
});
});
},
// 导出数据准备
prepareExportData() {
return new Promise((resolve, reject) => {
const filterVals = this.queryForm.exportConfig.filterVals;
this.queryExportData().then(result => {
const list = result.list;
const data = this.formatJson(filterVals, list);
resolve(data);
}).catch(error => {
reject(error);
});
});
},
// 格式化数据列表
formatJson(filterVals, list) {
return list.map(v => filterVals.map(fv => {
let keys = [];
if (typeof (fv) === 'string') {
keys = fv.split('.');
} else {
keys = fv.key.split('.');
}
let obj = v;
keys.forEach(element => {
obj = obj[element];
});
if (fv.type === 'date') {
const format = fv.format || 'yyyy-MM-dd';
return new Date(obj).Format(format);
} else if (fv.formatter instanceof Function) {
return fv.formatter(v);
} else {
return obj;
}
}));
},
// 查询需要导出的数据列表
queryExportData() {
},
/**
* 翻页方法
* pageIndex: 翻页后是第几页
* params: 查询条件
**/
changePage(pageIndex, params) {
this.pageIndex = pageIndex;
this.pageOffset = (this.pageIndex - 1) * this.pageSize;
if (params) {
// 如果是点查询按钮到这来的,不用混合分页信息,已经有默认的第一页信息
this.queryData = params;
// 以防pageSize改变, 重新赋值
this.queryData[this.currentpagerConfig.pageSize] = this.pageSize;
} else {
// 如果是点翻页按钮到这来的把分页信息混合到this.queryData里
this.mixinBackPageInfoToQueryData();
}
// 加时间戳
// this.queryData._time = this.$moment()._d.getTime();
this.queryList.reload();
},
/**
* 改变分页大小回调函数执行完毕后iview会自动触发changePage事件去查第一页数据
*/
pageSizeChange(newPageSize) {
if (newPageSize) {
this.pageSize = newPageSize;
this.changePage(1, this.queryData);
}
},
/**
* 把分页信息混合到this.queryData里
*/
mixinBackPageInfoToQueryData() {
// 当前的分页信息
const pagerParams = {
pageSize: this.pageSize,
pageIndex: this.pageIndex,
pageOffset: this.pageOffset
};
const tempPagerParams = {};
// 肯定要有pageSize
tempPagerParams[this.currentpagerConfig.pageSize] = pagerParams.pageSize || this.queryData[this.currentpagerConfig.pageSize];
// 判断使用 pageIndex 还是 pageOffset
if (this.currentpagerConfig.pageIndex) {
// 使用 pageIndex
tempPagerParams[this.currentpagerConfig.pageIndex] = pagerParams.pageIndex || this.queryData[this.currentpagerConfig.pageIndex];
} else {
// 使用 pageOffset
tempPagerParams[this.currentpagerConfig.pageOffset] = pagerParams.pageOffset !== undefined ? pagerParams.pageOffset : this.queryData[this.currentpagerConfig.pageOffset];
}
// 将分页信息封装到查询条件中
this.queryData = { ...this.queryData, ...tempPagerParams };
},
preCommitQueryHandler() {
// 填充表单
// this.$refs.form2.initFormData(this.queryData);
// 预设分页组件
this.pageIndex = parseInt(this.queryData[this.currentpagerConfig.pageIndex] || this.pageIndex);
this.pageSize = parseInt(this.queryData[this.currentpagerConfig.pageSize]);
},
commitQuery() {
const self = this;
return new Promise((resolve, reject) => {
self.disableQuery();
self.mixinBackPageInfoToQueryData();
const postData = this.queryData;
if (postData === false) {
self.enableQuery();
return;
}
if (this.queryList.query instanceof Function) {
this.queryList.query(this.queryData).then(response => {
self.enableQuery();
if (this.queryList.afterQuery && this.queryList.afterQuery instanceof Function) {
this.queryList.afterQuery(response.data);
}
const resultData = response.data;
this.$set(this.queryList, 'data', resultData.list);
this.$set(this.queryList, 'total', resultData.total);
}).catch(() => {
self.enableQuery();
});
} else {
const data = this.queryList.data;
if (data) {
self.enableQuery();
if (this.queryList.afterQuery && this.queryList.afterQuery instanceof Function) {
this.queryList.afterQuery(data);
}
this.$set(this.queryList, 'data', data);
let total = this.queryList.total;
if (!total) {
total = this.queryList.data.length;
}
this.$set(this.queryList, 'total', total);
}
}
});
},
enableQuery() {
this.canQuery = true;
this.loading = false;
},
disableQuery() {
// 禁止查询按钮
this.canQuery = false;
this.loading = true;
// 清空表格的数据
// this.queryList.data = [];
},
onSelect(selection, row) {
this.queryList.onSelect && this.queryList.onSelect(selection, row);
this.queryList.selection = selection;
},
onSelectAll(selection) {
this.queryList.onSelectAll && this.queryList.onSelectAll(selection);
this.queryList.selection = selection;
},
onSelectionChange(selection) {
this.queryList.onSelectionChange && this.queryList.onSelectionChange(selection);
this.queryList.selection = selection;
},
onRowClick(row) {
this.choose = row;
},
currentChoose() {
return this.choose;
},
refresh(flag) {
if (flag) {
this.commitQuery();
}
this.queryList.data = [...this.queryList.data];
},
sortChange(data) {
const self = this;
if (data.order && data.column.sortable == 'custom') {
switch (data.order) {
case 'ascending': {
if (data.column.sortBy) {
const temp = {};
temp[data.column.sortBy] = data.prop;
self.queryData = { ...self.queryData, ...temp };
self.sortBy = data.column.sortBy;
self.refresh(true);
}
break;
}
case 'descending': {
if (data.column.sortBy) {
const temp = {};
temp[data.column.sortBy] = data.prop + ' desc';
self.queryData = { ...self.queryData, ...temp };
self.sortBy = data.column.sortBy;
self.refresh(true);
}
break;
}
}
} else {
delete self.queryData[self.sortBy];
self.refresh(true);
}
}
}
};
</script>