<!-- @name:数据预览弹窗 @description: @author: liu.shiyi @time: --> <template> <div class="bs-data-view-dialog"> <el-dialog :close-on-click-modal="false" title="数据查看" width="60%" :visible.sync="formVisible" :append-to-body="false" class="bs-dialog-wrap bs-el-dialog" > <div class="table-box"> <el-table ref="table" v-loading="loading" max-height="500" class="bs-table bs-el-table fixed-header-table" :data="dataList" > <el-table-column v-for="(col,index) in columnData" :key="index" show-overflow-tooltip :prop="col.alias" :label="getLabel(col)" align="center" /> </el-table> </div> <div slot="footer" class="dialog-footer" > <el-button class="bs-el-button-default cancel" @click="cancel" > 取消 </el-button> <DownloadExcel :data="dataList" :fields="fields" :name="chartTitle+'数据导出'" class="output-excel" :before-finish="exportHandler" :before-generate="generate" > <el-button type="primary" :loading="exportLoading" > 导出数据 </el-button> </DownloadExcel> </div> </el-dialog> </div> </template> <script> import { getUpdateChartInfo } from 'data-room-ui/js/api/bigScreenApi' import { mapState } from 'vuex' import Vue from 'vue' import JsonExcel from 'vue-json-excel' Vue.component('DownloadExcel', JsonExcel) export default { name: 'DataViewDialog', components: {}, props: { }, data () { return { chartTitle: '', fields: {}, formVisible: false, exportLoading: false, loading: false, dataList: [], columnData: {} } }, computed: { ...mapState({ pageCode: state => state.bigScreen.pageInfo.code }) }, watch: {}, created () { }, mounted () { }, methods: { init (config) { this.resetData() this.chartTitle = config.title this.formVisible = true this.getDataList(config) }, // 获取数据列表 getDataList (config) { this.loading = true // 如果是G2组件并且未配置数据集的情况下,则需要从option里面取数据 if ((['customComponent', 'remoteComponent', 'echartsComponent'].includes(config.type) && (!config.dataSource.businessKey)) || (config.expressionCodes && config.expressionCodes.length)) { this.getDataByOption(config) this.fieldsFormat() this.loading = false } else { const params = { chart: { ...config, option: undefined }, current: 1, pageCode: this.pageCode, type: config.type } // 调接口获取数据 getUpdateChartInfo(params).then(res => { this.loading = false if (Array.isArray(res.data)) { this.dataList = res.data || [] } else { // 如果返回的data不是数组,存在以下几种情况:则直接从option中获取 // 1、是组件绑定的是js数据集或者是http前端数据集, // 2、是组件返回的模拟数据为null this.getDataByOption(config) } this.columnData = res.columnData || {} this.fieldsFormat() }).catch(err => { console.log(err) }).finally(() => { this.loading = false }) } }, // 通过option获取数据 getDataByOption (config) { let list = [] if (config.chartType === 'Treemap') { list = config.option.data.children } else if (config.type === 'tables') { list = config.option.tableData } else if (config.expressionCodes && config.expressionCodes.length) { list = [{ title: config.customize.title }] } else { list = config.option.data } let keyList = [] if (list && list.length) { // 如果list[0]是对象 if (typeof list[0] === 'object' && list[0] !== null) { keyList = Object.keys(list[0]) } else { keyList = list } for (const key of keyList) { const _key = key + '' this.columnData[_key] = { aggregate: '', alias: _key, originalColumn: _key, remark: _key, tableName: '', type: 'varchar' } } } else { this.columnData = {} } this.dataList = list || [] }, // 获取表格的表头 getLabel (col) { return col.remark || col.alias }, // 数据重置 resetData () { this.columnData = {} this.dataList = [] this.fields = {} this.chartTitle = '' }, // 格式化fields fieldsFormat () { if (this.columnData && Object.keys(this.columnData).length) { for (const item in this.columnData) { this.fields[this.columnData[item].remark || this.columnData[item].alias] = this.columnData[item].alias } } else { this.fields = {} } }, // 取消 cancel () { this.formVisible = false }, generate (val) { if (!Object.keys(this.fields).length) { this.$message.warning('数据为空') } this.formVisible = false this.exportLoading = true }, // 导出数据 exportHandler () { this.exportLoading = false if (Object.keys(this.fields).length) { this.$message.success('数据导出成功') } this.formVisible = false } } } </script> <style lang="scss" scoped> .bs-data-view-dialog{ ::v-deep .el-dialog__body{ background-color: var(--bs-background-2) !important; overflow: hidden; max-height: 540px!important; } .table-box{ height: 100%; overflow-y: auto; /* 当内容溢出时显示垂直滚动条 */ } .dialog-footer{ display: flex; justify-content: flex-end; .cancel{ margin-right: 10px; overflow-y: hidden; } } ::v-deep .el-table__body-wrapper{ min-height: 200px !important; } .el-table th.el-table__cell.is-leaf, .el-table ::v-deep td.el-table__cell{ border-bottom:none; } ::v-deep .el-loading-mask{ background-color: var(--bs-background-2) !important; } .el-table ::v-deep thead{ color: var(--bs-el-title); } .bs-el-table ::v-deep td.el-table__cell{ color: #bcc9d4; } .el-table--scrollable-y ::v-deep .el-table__body-wrapper{ overflow: auto!important; } /* 修改滚动条的样式 */ ::v-deep .el-dialog__body::-webkit-scrollbar { width: 8px; /* 滚动条宽度 */ } ::v-deep .el-dialog__body::-webkit-scrollbar-thumb { background-color: #888; /* 滚动条拖动块颜色 */ height: 6px; border-radius: 5px; } ::v-deep .el-dialog__body::-webkit-scrollbar-track { background-color: transparent; /* 滚动条轨道颜色 */ } /* 鼠标悬停在滚动条上时的样式 */ ::v-deep .el-dialog__body::-webkit-scrollbar-thumb:hover { background-color: #555; } } /* 自定义滚动条样式 */ ::v-deep .el-table__body-wrapper::-webkit-scrollbar { width: 6px; /* 滚动条宽度 */ height: 6px; } ::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb { background-color: #888; /* 滚动条拖动块颜色 */ height: 100px; border-radius: 5px; } ::v-deep .el-table__body-wrapper::-webkit-scrollbar-track { background-color: transparent; /* 滚动条轨道颜色 */ } /* 鼠标悬停在滚动条上时的样式 */ ::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb:hover { background-color: #555; cursor: pointer; } </style>