You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
13 KiB
432 lines
13 KiB
<template>
|
|
<div class="table">
|
|
<el-table id="out-table"
|
|
ref="table"
|
|
:height="table.height"
|
|
:header-cell-style="{color:'#000'}"
|
|
:data="tableData"
|
|
:style="{width: '100%'}"
|
|
border
|
|
v-loading="loading"
|
|
element-loading-text="正在加载中"
|
|
element-loading-spinner="el-icon-loading"
|
|
element-loading-background="rgba(255, 255, 255, 0.8)"
|
|
@select="handleSelect"
|
|
@select-all="handleSelectAll"
|
|
@cell-click="handleCellClick"
|
|
@row-click="handleRowClick">
|
|
<!--设置index索引-->
|
|
<div v-if="columnType==='index'">
|
|
<el-table-column :type="columnType"></el-table-column>
|
|
</div>
|
|
<!--设置checkbox-->
|
|
<div v-if="columnType==='selection'">
|
|
<el-table-column :type="columnType"></el-table-column>
|
|
</div>
|
|
<div v-if="columnType==='radio'">
|
|
<el-table-column label=""
|
|
width="35"
|
|
center>
|
|
<template slot-scope="scope">
|
|
<el-radio :label="scope.row.id"
|
|
v-model.trim="templateRadio"
|
|
@change.native="getRadioRow(scope.$index,scope.row)"> </el-radio>
|
|
</template>
|
|
</el-table-column>
|
|
|
|
</div>
|
|
<template v-for="col in tableColumn">
|
|
<!--渲染列-->
|
|
<el-table-column v-if="col.tableType==='span'"
|
|
:key="col.key"
|
|
:label="col.title"
|
|
:min-width="col.width"
|
|
:fixed="col.isFrozen"
|
|
show-overflow-tooltip
|
|
:align="columnAlign"
|
|
:header-align="headerAlign">
|
|
<template slot-scope="scope">
|
|
<span v-html="col.render(scope.row[col.key])"></span>
|
|
</template>
|
|
</el-table-column>
|
|
<!--图片列-->
|
|
<el-table-column v-if="col.tableType==='image'"
|
|
:key="col.key"
|
|
:label="col.title"
|
|
:min-width="col.width"
|
|
:fixed="col.isFrozen"
|
|
show-overflow-tooltip
|
|
:align="'center'"
|
|
:header-align="headerAlign"
|
|
:formatter="col.formatter">
|
|
<template slot-scope="scope">
|
|
<img v-if="scope.row[col.key]"
|
|
:src="scope.row[col.key]"
|
|
:style="{width: col.imgWidth?col.imgWidth:'50px',height:col.imgHeight?col.imgHeight:'50px'}"
|
|
class="function-icon"
|
|
:fit=" col.fill?col.fill:'fill'">
|
|
|
|
</template>
|
|
</el-table-column>
|
|
<!--有背景的图片列-->
|
|
<el-table-column v-if="col.tableType==='bcImage'"
|
|
:key="col.key"
|
|
:label="col.title"
|
|
:min-width="col.width"
|
|
:fixed="col.isFrozen"
|
|
show-overflow-tooltip
|
|
:align="'center'"
|
|
:header-align="headerAlign"
|
|
:formatter="col.formatter">
|
|
<template slot-scope="scope">
|
|
<div v-if="scope.row[col.key]"
|
|
class="img_bc"
|
|
:style="{background: col.bcColor?col.bcColor:'#e3271c'}">
|
|
|
|
<img :src="scope.row[col.key]"
|
|
:style="{width: col.imgWidth?col.imgWidth:'50px',height:col.imgHeight?col.imgHeight:'50px'}"
|
|
class="function-icon"
|
|
:fit=" col.fill?col.fill:'fill'">
|
|
</div>
|
|
|
|
</template>
|
|
</el-table-column>
|
|
|
|
<!--普通列-->
|
|
<el-table-column v-if="!col.tableType||col.tableType===''"
|
|
:key="col.key"
|
|
:label="col.title"
|
|
:min-width="col.width"
|
|
:fixed="col.isFrozen"
|
|
show-overflow-tooltip
|
|
:align="columnAlign"
|
|
:header-align="headerAlign"
|
|
:formatter="col.formatter"></el-table-column>
|
|
</template>
|
|
<!--排序操作列-->
|
|
<el-table-column v-if="orderOperations.length && orderOperations.length > 0"
|
|
label="移动"
|
|
:width="orderOperationWidth"
|
|
fixed="right"
|
|
align="center"
|
|
header-align="center"
|
|
class="operate">
|
|
<template slot-scope="scope">
|
|
|
|
<el-button v-for="(item,index) in orderOperations"
|
|
:key="index"
|
|
:style=item.style
|
|
:type=item.type
|
|
:size=item.size
|
|
:icon=item.icon
|
|
:plain=item.plain
|
|
@click.stop="handleMethod(scope.$index, scope.row,item.methodName)"></el-button>
|
|
</template>
|
|
</el-table-column>
|
|
<!--操作列-->
|
|
<el-table-column v-if="operations.length && operations.length > 0"
|
|
label="操作"
|
|
:min-width="operationWidth"
|
|
fixed="right"
|
|
header-align="center"
|
|
class="operate">
|
|
<template slot-scope="scope">
|
|
<!--传入的操作按钮属性 lyx 20190411 -->
|
|
<el-button v-for="(item,index) in operations"
|
|
:key="index"
|
|
v-show="item.isShow(scope.row)"
|
|
:style=item.style
|
|
:type=item.type
|
|
:size=item.size
|
|
:plain=item.plain
|
|
@click.stop="handleMethod(scope.$index, scope.row,item.methodName)">{{typeof (item.lable) === 'function'?(item.lable)(scope.row[item.key]) :item.lable}}</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
|
|
import CDialog from './CDialog'
|
|
import { mapGetters } from 'vuex'
|
|
import { requestPost } from "@/js/dai/request";
|
|
export default {
|
|
components: { CDialog },
|
|
data () {
|
|
return {
|
|
tableData: [],
|
|
tableColumn: window.app.service.getColumns(this.keyword, 'table'),
|
|
loading: false,
|
|
table: {
|
|
height: this.tableHeight,
|
|
params: {}
|
|
},
|
|
|
|
selected: false,
|
|
visiblePopover: false, // 删除弹出层开关
|
|
templateRadio: ''
|
|
}
|
|
},
|
|
watch: {
|
|
tableHeight (height) {
|
|
this.table.height = height
|
|
}
|
|
},
|
|
props: {
|
|
keyword: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
columnType: {
|
|
type: String
|
|
},
|
|
columnAlign: {
|
|
type: String,
|
|
default: 'left'
|
|
},
|
|
headerAlign: {
|
|
type: String,
|
|
default: 'center'
|
|
},
|
|
url: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
params: {
|
|
type: Object,
|
|
default () {
|
|
return {}
|
|
}
|
|
},
|
|
operations: {
|
|
type: Array,
|
|
default () {
|
|
return []
|
|
}
|
|
},
|
|
orderOperations: {
|
|
type: Array,
|
|
default () {
|
|
return []
|
|
}
|
|
},
|
|
tableHeight: {
|
|
type: Number
|
|
},
|
|
pageVisible: Boolean, // 是否显示page分页 lyx 20190411
|
|
|
|
filterParams: {
|
|
type: Array,
|
|
default () {
|
|
return []
|
|
}
|
|
}
|
|
},
|
|
activated () {
|
|
// debugger
|
|
// this.$nextTick(() => {
|
|
// this.$refs.table.doLayout() // 解决表格错位
|
|
// })
|
|
},
|
|
computed: {
|
|
|
|
// 操作列宽度
|
|
operationWidth: function() {
|
|
|
|
if (this.operations.includes('add')) {
|
|
return (this.operations.length - 1) * 80 // 操作列包含add类型按钮时返回
|
|
} else if (this.operations.includes('analyze')) {
|
|
return (this.operations.length + 0.5) * 80 // 操作列包含analyze类型按钮时返回
|
|
} else {
|
|
return this.operations.length * 80
|
|
}
|
|
},
|
|
// 移动操作列宽度
|
|
orderOperationWidth: function() {
|
|
|
|
|
|
return this.orderOperations.length * 50
|
|
|
|
},
|
|
...mapGetters(['resolution'])
|
|
},
|
|
methods: {
|
|
doLayout () {
|
|
this.$refs.table.doLayout() // 解决表格错位
|
|
},
|
|
render () {
|
|
this.loadData()
|
|
},
|
|
async loadData () {
|
|
this.$refs.table.doLayout() // 解决表格错位
|
|
this.templateRadio = ''
|
|
this.loading = true
|
|
Object.keys(this.params).forEach(key => {
|
|
if (this.params[key] instanceof Array) {
|
|
this.params[key] = this.params[key].join(',')
|
|
}
|
|
})
|
|
Object.assign(this.table.params, this.params)
|
|
// 获取数据
|
|
|
|
const { data, code, rspMsg } = await requestPost(this.url, this.table.params)
|
|
if (code === 0) {
|
|
if (data) {
|
|
this.tableData = data
|
|
// console.log("this.filterParams", this.filterParams)
|
|
if (this.filterParams.length > 0) {
|
|
|
|
this.filterParams.forEach(paramItem => {
|
|
const key = this.filterParams[0].key
|
|
const value = this.filterParams[0].value
|
|
|
|
this.tableData = this.tableData.filter(item => {
|
|
// console.log(item[key])
|
|
// console.log(item[key].indexOf(value))
|
|
return item[key].indexOf(value) != -1
|
|
|
|
})
|
|
})
|
|
|
|
}
|
|
}
|
|
this.loading = false
|
|
} else {
|
|
this.$message.error(rspMsg)
|
|
|
|
this.loading = false
|
|
}
|
|
|
|
// await window.app.ajax.post(
|
|
// this.url,
|
|
// this.table.params,
|
|
// (data, rspMsg) => {
|
|
// if (data) {
|
|
// this.tableData = data
|
|
// console.log("this.filterParams", this.filterParams)
|
|
// if (this.filterParams.length > 0) {
|
|
|
|
// this.filterParams.forEach(paramItem => {
|
|
// const key = this.filterParams[0].key
|
|
// const value = this.filterParams[0].value
|
|
|
|
// this.tableData = this.tableData.filter(item => {
|
|
// // console.log(item[key])
|
|
// // console.log(item[key].indexOf(value))
|
|
// return item[key].indexOf(value) != -1
|
|
|
|
// })
|
|
// })
|
|
|
|
// }
|
|
// }
|
|
// // console.log(this.tableData)
|
|
// this.loading = false
|
|
|
|
// },
|
|
// (rspMsg, data) => {
|
|
|
|
// }
|
|
// )
|
|
},
|
|
handleClearSelection () {
|
|
// 清空选择
|
|
this.$refs['table'].clearSelection()
|
|
},
|
|
// 选中复选框
|
|
handleSelect (selection, row) {
|
|
this.$emit('select', selection)
|
|
// console.log(selection, row)
|
|
},
|
|
// 全选复选框
|
|
handleSelectAll (selection) {
|
|
this.$emit('selectAll', selection)
|
|
},
|
|
handleCellClick (row, column, cell, event) { },
|
|
handleRowClick (row) {
|
|
// 切换该列的勾选状态
|
|
this.selected = !this.selected
|
|
this.$refs['table'].toggleRowSelection(row, this.selected)
|
|
},
|
|
|
|
handleEdit (index, row) {
|
|
// 因为操作列与数据列属于同一行,编辑某一列后会继续触发table的row-click事件,所以在按钮上添加stop修饰符阻止事件的继续传播
|
|
this.handleClearSelection()
|
|
this.$refs['table'].toggleRowSelection(row)
|
|
this.$emit('update', row)
|
|
},
|
|
handleAnalyze (index, row) {
|
|
this.handleClearSelection() // 清空选择
|
|
this.$refs['table'].toggleRowSelection(row, true)
|
|
this.$emit('analyze', row)
|
|
},
|
|
handleDelete (index, row) {
|
|
this.handleClearSelection() // 删除选择
|
|
this.$refs['table'].toggleRowSelection(row, true)
|
|
this.$emit('delete', row)
|
|
},
|
|
handleDeleteCancel (scope) {
|
|
// 关闭popover弹出层
|
|
scope._self.$refs[`popover-${scope.$index}`].doClose()
|
|
},
|
|
|
|
// 单选选中
|
|
getRadioRow (index, row) { // 获取选中数据
|
|
this.$emit('selectRadioRow', row)
|
|
},
|
|
// 导出表格
|
|
handleOutTable (name) {
|
|
window.app.util.exportExcel(name, '#out-table')
|
|
},
|
|
exportExcel (tHeader, filterVal) {
|
|
// require.ensure([], () => {
|
|
// const { export_json_to_excel } = require('@js/excel/Export2Excel')
|
|
|
|
// const list = this.tableData
|
|
// const data = this.formatJson(filterVal, list)
|
|
// export_json_to_excel(tHeader, data, '列表excel')
|
|
// })
|
|
},
|
|
formatJson (filterVal, jsonData) {
|
|
return jsonData.map(v => filterVal.map(j => v[j]))
|
|
},
|
|
// 操作列点击实现方法 lyx 20190411
|
|
handleMethod (index, row, methodName) {
|
|
this.handleClearSelection()
|
|
this.$refs['table'].toggleRowSelection(row, true)
|
|
this.$emit(methodName, row, index)
|
|
},
|
|
getTableData () {
|
|
return this.tableData
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
</script>
|
|
<style >
|
|
.el-table td {
|
|
padding: 6px 0 !important;
|
|
}
|
|
|
|
.page {
|
|
padding: 20px 6px 0;
|
|
text-align: right;
|
|
}
|
|
|
|
.operate {
|
|
text-align: center;
|
|
}
|
|
|
|
.img_bc {
|
|
width: 50px;
|
|
height: 50px;
|
|
margin: 5px auto;
|
|
text-align: center;
|
|
background: #e3271c;
|
|
box-shadow: 0px 2px 12px 0px rgba(209, 34, 24, 0.57);
|
|
border-radius: 50%;
|
|
padding: 12px;
|
|
}
|
|
</style>
|
|
|