You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

205 lines
5.0 KiB
Vue

<!--
@name:数据预览弹窗
@description:
@author: liu.shiyi
@time:
-->
<template>
<div class="bs-data-view-dialog">
<el-dialog
:close-on-click-modal="false"
title="数据查看"
:visible.sync="formVisible"
:append-to-body="false"
class="bs-dialog-wrap bs-el-dialog"
>
<el-table
ref="table"
v-loading="loading"
class="bs-table bs-el-table"
height="300"
: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
slot="footer"
class="dialog-footer"
>
<DownloadExcel
:data="dataList"
:fields="fields"
:name="chartTitle+'数据导出'"
class="output-excel"
:before-finish="exportHandler"
>
<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 (config.type === 'customComponent' && (!config.dataSource.businessKey)) {
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不是数组则是js数据集或者是http前端数据集,则直接从option中获取
this.getDataByOption(config)
}
this.columnData = res.columnData || {}
this.fieldsFormat()
}).catch(err => { console.log(err) }).finally(() => {
this.loading = false
})
}
},
// 通过option获取数据
getDataByOption (config) {
const list = config.option.data || []
for (const key of Object.keys(list[0])) {
this.columnData[key] = {
aggregate: '',
alias: key,
originalColumn: key,
remark: key,
tableName: '',
type: 'varchar'
}
}
console.log(this.columnData)
this.dataList = list
},
// 获取表格的表头
getLabel (col) {
return col.remark || col.originalColumn
},
// 数据重置
resetData () {
this.columnData = {}
this.dataList = []
this.fields = {}
this.chartTitle = ''
},
// 格式化fields
fieldsFormat () {
for (const item in this.columnData) {
this.fields[this.columnData[item].remark || this.columnData[item].originalColumn] = this.columnData[item].originalColumn
}
},
// 导出数据
exportHandler () {
this.$message.success('导出数据')
}
}
}
</script>
<style lang="scss" scoped>
.bs-data-view-dialog{
/deep/.el-dialog__body{
background-color: var(--bs-background-2) !important;
max-height: unset!important;
min-height: unset!important;
}
.el-table th.el-table__cell.is-leaf, .el-table /deep/td.el-table__cell{
border-bottom:none;
}
/deep/.el-loading-mask{
background-color: var(--bs-background-2) !important;
}
/* 自定义滚动条样式 */
/deep/.el-table__body-wrapper::-webkit-scrollbar {
width: 6px; /* 滚动条宽度 */
}
/deep/.el-table__body-wrapper::-webkit-scrollbar-thumb {
background-color: #888; /* 滚动条拖动块颜色 */
height: 30px;
border-radius: 5px;
}
/deep/.el-table__body-wrapper::-webkit-scrollbar-track {
background-color: transparent; /* 滚动条轨道颜色 */
}
/* 鼠标悬停在滚动条上时的样式 */
/deep/.el-table__body-wrapper::-webkit-scrollbar-thumb:hover {
background-color: #555;
cursor: pointer;
}
}
</style>