<template>
<div >
<el-form :label-position="labelPosition"
class="search-area-form" label-width="100px" :rules="rules" ref="items" :model="formData" size="mini" style="margin-top:10px" inline>
<div class="main-form">
<el-row>
<el-col v-for="item in formColumns" :key="item.key" :span="item.rowSpan ?item.rowSpan :6">
<el-form-item :label="item.label + ‘:‘" :prop="item.prop">
<select-dept-by-list v-if="item.type === ‘dept-by-list‘" v-model="formData[item.prop]" name="formData[item.prop]"></select-dept-by-list>
<area-select v-if="item.type === ‘area-select‘" v-model="formData[item.prop]" ></area-select>
<el-input v-if="item.type === ‘input‘" v-model="formData[item.prop]" :placeholder="item.props.placeholder || ‘请输入‘"
:disabled="item.props.disabled || false" clearable></el-input>
<el-select v-if="item.type === ‘select‘" v-model="formData[item.prop]" :placeholder="item.props.placeholder || ‘请选择‘"
:disabled="item.props.disabled || false" clearable>
<el-option v-for="i in item.props.options" :key="i.value" :label="i.label" :value="i.value"></el-option>
</el-select>
<el-switch v-model="formData[item.prop]" v-if="item.type === ‘switch‘" :disabled="item.props.disabled || false" ></el-switch>
<el-date-picker v-model="formData[item.prop]"
v-if="item.type === ‘date‘"
:format="item.format ? item.format : ‘yyyy-MM-dd‘"
:value-format="item.valueFormat ? item.valueFormat : ‘yyyy-MM-dd‘"
:disabled="item.props.disabled || false"
type="date" :placeholder="item.props.placeholder || ‘请选择日期‘" clearable></el-date-picker>
<el-date-picker v-model="formData[item.prop]"
v-if="item.type === ‘datetime‘"
:format="item.format ? item.format : ‘yyyy-MM-dd‘"
:value-format="item.valueFormat ? item.valueFormat : ‘yyyy-MM-dd‘"
:disabled="item.props.disabled || false"
type="datetime" :placeholder="item.props.placeholder || ‘请选择创建时间‘" clearable></el-date-picker>
</el-form-item></el-col>
</el-row>
</div>
</el-form>
</div>
</template>
<script>
import AreaSelect from ‘./../AreaSelect‘
export default {
name: ‘dataForm‘,
components: {
"AreaSelect":AreaSelect
},
props:{
formColumns:
{
type: Array,
default: () => []
},
formData:
{
type: Object,
required: true
},
labelPosition:
{
type: String,
default: "top"
},
saveOrUpdate:{
type: Boolean,
default: false
},
rules:{
}
},
data() {
return {
}
},
computed:{
},
created(){},
methods:{
submitForm()
{
console.log(this.formData);
this.$emit("save",this.formData)
}
}
}
</script>
<style scoped="scoped">
*{box-sizing: border-box;}
</style>
2.表格
<template>
<div>
<el-table
v-loading="loading"
ref="default"
v-bind="$attrs"
:data="data"
:header-cell-style="{background:‘#F4F4F5‘}"
:row-class-name="tableRowClassName"
@selection-change="selectionChange"
@sort-change="(s) => (sortChangeOperate ? sortChangeOperate(s) : null)"
@row-click="(row, column, event) => (rowClick ? rowClick(row, column, event) : null)">
<slot name="table-column-first"/>
<el-table-column
v-if="selectionCell"
type="selection"
width="55"/>
<el-table-column v-if="columns.length === 0" width="150">
<template slot-scope="scope">
{{ scope.$index }}
</template>
</el-table-column>
<el-table-column v-for="(column, index) in columns"
v-else
:align="column.align || column.headerAlign ? column.align || column.headerAlign : ‘center‘"
:key="index"
:label="column.label"
:prop="column.prop"
:sortable="column.sortBy != null || column.sortable"
:min-width="column.width ? column.width: null"
:show-overflow-tooltip="column.overflowTooltip">
</el-table-column>
<slot name="table-column"/>
<el-table-column
v-if="rowDeleteOperate != null || rowUpdateOperate != null || rowDetailOperate != null"
label="操作"
:width="rowOperateWidth"
align="center"
fixed="right">
<template slot-scope="scope">
<el-tooltip
v-if="rowDetailOperate != null"
:visible-arrow = "false"
class="item"
effect="light"
content="查看"
placement="bottom-start">
<el-button
v-if="rowDetailOperate != null"
key="detail"
:type="rowOperateMode ? rowOperateMode : ‘success‘"
:icon="rowOperateMode === ‘text‘ ? null : ‘el-icon-menu‘"
class="tiny"
@click="handleRowDetailOperate(scope.row)">
<template v-if="rowOperateMode === ‘text‘">
查看
</template>
</el-button>
</el-tooltip>
<el-tooltip
v-if="rowUpdateOperate != null"
:visible-arrow = "false"
class="item"
effect="light"
content="修改"
placement="bottom-start">
<el-button
v-if="rowUpdateOperate != null"
key="update"
:type="rowOperateMode ? rowOperateMode : ‘primary‘"
:icon="rowOperateMode === ‘text‘ ? null : ‘el-icon-edit‘"
class="tiny"
@click="handleRowUpdateOperate(scope.row)">
<template v-if="rowOperateMode === ‘text‘">
修改
</template>
</el-button>
</el-tooltip>
<el-tooltip
v-if="rowDeleteOperate != null"
:visible-arrow="false"
class="item"
effect="light"
content="删除"
placement="bottom-start">
<el-button
key="delete"
:type="rowOperateMode ? rowOperateMode : ‘danger‘"
:icon="rowOperateMode === ‘text‘ ? null : ‘el-icon-delete‘"
class="tiny"
@click="handleRowDeleteOperate(scope.row)">
<template v-if="rowOperateMode === ‘text‘">
删除
</template>
</el-button>
</el-tooltip>
<slot :data="scope.row"
:row="scope.row"
name="table-column-operation"/>
</template>
</el-table-column>
<slot name="table-column-last"/>
</el-table>
</div>
</template>
<script>
/**
* Description: 列表表格<br>
* Comments Name: ListTable<br>
* Date: 2020/05/17
* EditorDate: 2020/05/17
* Editor: sj
*/
export default {
name: "ListTable",
components: {},
props: {
columns:
{
type: Array,
default: () => []
},
data:
{
type: Array,
required: true
},
rowOperateMode:
{
type: String,
default: null
},
rowOperateWidth: {
type: String,
default: "150px"
},
rowDeleteOperate:
{
type: Function,
default: null
},
rowUpdateOperate:
{
type: Function,
default: null
},
rowDetailOperate:
{
type: Function,
default: null
},
sortChangeOperate:
{
type: Function,
default: null
},
rowClick: {
type: Function,
default: null
},
selectionCell: {
type: Boolean,
default: false
},
tableHeight: {
type: String,
default: ""
}
},
data()
{
return {
imgFileTypeName: ["bmp", "jpg", "jpeg", "png", "gif"],
pdfFileTypeName: ["pdf"],
downloadFlag: false,
loading:false,
};
},
methods:
{
tableRowClassName({ row })
{
if ((row.adjustState === "2" || row.adjustState === "3") && row.approvalStatus === "1")
{
return "expired-row";
}
if (row.approvalStatus === "3")
{
return "cancel-row";
}
return "";
},
imgPreview(file, downloadFlag)
{
if (!file) return;
let fileType = this.getFileType(file);
this.downloadFlag = downloadFlag || false;
if (this.pdfFileTypeName.indexOf(fileType) > -1)
{
this.pdfKey++;
this.previewPDFDialog.visited = true;
this.previewPDFDialog.url = file;
}
else
{
this.previewDialog.visited = true;
this.previewDialog.url = file;
}
},
imgDownload(file)
{
window.location.href = file;
},
getFileType(file)
{
let typeValue = file ? file.split(".") : [];
if (typeValue.length > 1)
{
return typeValue[typeValue.length - 1];
}
},
showOption(cell, options)
{
options = options.filter(o => (o.id || o.key) === cell);
if (options && options.length > 0)
{
return options[0].name || options[0].label;
}
return cell;
},
handleRowDeleteOperate(row)
{
this.$emit("rowDeleteOperate",row)
},
handleRowUpdateOperate(row)
{
this.$emit("rowUpdateOperate",row)
},
handleRowDetailOperate(row)
{
this.$emit("rowDetailOperate",row)
},
selectionChange(rows)
{
debugger;
this.$emit("selectionChangeOperate",rows)
},
showLoading()
{
this.loading=true;
},
hideLoading(){
this.loading=false;
}
}
};
</script>
<style scoped>
.img{
height: 0;
}
.downBtn {
text-align: center;
margin-top: 10px;
}
</style>
<style>
.el-table_1_column_1 .el-checkbox__inner{margin-left:4px!important;}
.el-tooltip__popper {
max-width: 400px;
}
.el-table .expired-row {
background: #9CBDDE;
}
.el-table .cancel-row {
background: #DCDFE6;
}
</style>
3.使用
<template>
<div class="base-page">
<el-row>
<el-button type="primary" @click="queryRecords(‘query‘)" size="mini">查询</el-button>
<el-button type="primary" @click="addRecord" size="mini">添加</el-button>
<el-button type="primary" @click="updateRecord" size="mini">修改</el-button>
<el-button type="danger" @click="deleteRecord" size="mini">删除</el-button>
</el-row>
<data-form :formColumns="searchFormItems" :formData="searchFormData"></data-form>
<el-pagination small @size-change="pageSizeChange" @current-change="currentPageChange"
:current-page="currentPage" :page-sizes="[10,20,50]" :page-size="pageSize" layout="->,prev, pager, next, jumper, sizes,total"
:total="totalSize" :pagerCount="5" background style="margin-bottom:10px">
</el-pagination>
<list-table ref="queryTable1" :columns="headArray" :data="tableData"
@selectionChangeOperate="selectionChange"
:selectionCell="true"></list-table>
<!--新增和修改-->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="800px" :close-on-click-modal=‘false‘ @close="closeEditForm">
<el-form :inline="true" :model="editForm" :rules="editRules" ref="editForm" label-width="140px" size="mini"
label-position="right" class="el-form-horizontal">
<el-form-item label="城市" prop="cityName">
<el-select v-model="editForm.cityCode" placeholder="请选择城市" clearable @change="cityCodeChange">
<el-option v-for="(item,index) in cityList" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="城市代码" prop="cityCode">
<el-input v-model="editForm.cityCode" placeholder="请输入城市代码" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="归属网点" prop="belongNetwork">
<el-select v-model="editForm.belongNetwork" placeholder="请选择归属网点" clearable>
<el-option v-for="(item,index) in cityList" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="机场三字码" prop="thrLetterCode">
<el-input v-model="editForm.thrLetterCode" placeholder="请输入机场三字码"></el-input>
</el-form-item>
<el-form-item label="归属类型" prop="belongType">
<el-select v-model="editForm.belongType" placeholder="请选择" clearable>
<el-option v-for="(item,index) in belongTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="业务类型" prop="serviceType">
<el-select v-model="editForm.serviceType" placeholder="请选择业务类型" :multiple="true" clearable>
<el-option v-for="(item,index) in serviceTypeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="行政代码" prop="administrativeCode">
<el-select v-model="editForm.administrativeCode" placeholder="请选择" clearable @change="">
<el-option v-for="(item,index) in codeList" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="closeEditForm" size="mini">取 消</el-button>
<el-button type="primary" @click="submitForm" size="mini">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import axios from ‘axios‘
import listTable from ‘./../../components/list-table‘
import dataForm from ‘./../../components/data-form‘
export default {
name: ‘dataForm1‘,
components: {
"list-table":listTable,
"data-form":dataForm
},
data() {
return {
dialogTitle:"添加",
dialogVisible:false,
tableData:[],
currentPage:1,
pageSize:10,
totalSize:0,
selectionRows:[],
detailRow:{},
headArray:[
{
key:1,
label:"城市",
prop:"cityName",
overflowTooltip: true
},
{
key:2,
label:"城市代码",
prop:‘cityCode‘,
exist:null,
},
{
key:3,
label:"归属网点",
prop:‘belongNetwork‘,
checked:true,
},
{
key:4,
label:"机场三字码",
prop:‘thrLetterCode‘,
checked:true,
},
{
key:5,
label:"归属类型",
prop:‘belongType‘,
checked:true,
},
{
key:6,
label:"业务类型",
prop:‘serviceType‘,//1.提货 2.发货
},
{
key:7,
label:"创建人",
prop:‘createdEmpCode‘,
checked:true,
},
{
key:8,
label:"创建时间",
prop:‘createdTmStr‘,
width:‘150px‘
},
{
key:9,
label:"修改人",
prop:‘modifiedEmpCode‘,
checked:true,
},
{
key:10,
label:"修改时间",
prop:‘modifiedTmStr‘,
width:‘150px‘
},
],
searchFormData:{
cityCode:"",//城市code
thrLetterCode:"",//机场三字码
belongNetwork:"",//归属网点
belongType:"",//归属类型(1 大网,2重货)
},
editForm:{
username:"",//用户名
cityCode:"",//城市code
thrLetterCode:"",//机场三字码
belongNetwork:"",//归属网点
belongType:"",//归属类型(1 大网,2重货)
serviceType:[],
id:""
},
formData: {
username:"",//用户名
cityCode:"",//城市code
thrLetterCode:"",//机场三字码
belongNetwork:"",//归属网点
belongType:"",//归属类型(1 大网,2重货)
},
labelPosition:"top",
searchFormItems:[
{
label: ‘城市‘,
prop: ‘cityCode‘,
type: ‘select‘,
props: {
placeholder: ‘‘,
options: () => this.cityList
},
rules: [{
required: true,
message: ‘请输入城市名称‘,
trigger: ‘blur‘
}]
},
{
label: ‘机场三字码‘,
prop: ‘thrLetterCode‘,
type: ‘input‘,
props: {
placeholder: ‘‘
}
},
{
label: ‘归属网点‘,
prop: ‘belongNetwork‘,
type: ‘dept-by-list‘,
props: {
placeholder: ‘‘,
}
},
{ label: ‘归属类型‘,
prop: ‘belongType‘,
type: ‘select‘,
props: {
placeholder: ‘请选择归属类型‘,
list: [{
value: ‘1‘,
label: ‘大网‘,
}, {
value: ‘2‘,
label: ‘重货‘
}
]
},
},
],
formItems: [
{
label: ‘城市‘,
prop: ‘cityCode‘,
type: ‘select‘,
props: {
placeholder: ‘‘,
list: () => this.cityList,
disabled:true,
},
rules: [{
required: true,
message: ‘请输入城市名称‘,
trigger: ‘blur‘
}]
},
{
label: ‘机场三字码‘,
prop: ‘thrLetterCode‘,
type: ‘input‘,
props: {
placeholder: ‘‘
}
},
{ label: ‘归属类型‘,
prop: ‘belongType‘,
type: ‘select‘,
props: {
placeholder: ‘请选择归属类型‘,
list: [{
value: ‘1‘,
label: ‘大网‘,
}, {
value: ‘2‘,
label: ‘重货‘
}
]
},
},
],
cityList:[
{
value: ‘010‘,
label: ‘北京‘,
},
{
value: ‘022‘,
label: ‘天津‘,
},
{
value: ‘023‘,
label: ‘重庆‘
},
{
value: ‘755‘,
label: ‘深圳‘
}
],
serviceTypeList:[
{
value: ‘1‘,
label: ‘提货‘,
}, {
value: ‘2‘,
label: ‘发货‘
}
],
belongTypeList:[
{
value: ‘1‘,
label: ‘大网‘,
}, {
value: ‘2‘,
label: ‘重货‘
}
],
codeList:[
{
value: ‘110000‘,
label: ‘110000‘,
}, {
value: ‘110101‘,
label: ‘110101‘
},
{
value: ‘110102‘,
label: ‘110102‘,
}, {
value: ‘110103‘,
label: ‘110103‘
}
],
editRules:{
}
}
},
computed:{
},
created(){
this.getCityList();
},
mounted(){
},
methods:{
submitForm()
{
console.log(this.formData);
this.saveRecord(this.editForm)
},
async getCityList()
{
let params={
distName:this.formData.cityCode,
}
const response = await axios.post(‘/sys/air-open-base/basedata/findDistrictNoCache‘, params) // todo del
const { status, data } = response
if (data.succ == ‘ok‘) {
let cityOptions = data.result.map(item => {
return {
label: item.distName,
value: item.distCode
}
})
this.cityList=cityOptions;
}
},
clearFormData()
{
Object.keys(this.formData).forEach(key=>{this.formData[key]=‘‘})
this.formData["serviceType"]=[]
},
async queryRecords(type)
{
if(type=="query"){
this.currentPage=1;
}
this.$refs.queryTable1.showLoading();
let params={
username:this.searchFormData.username,
cityCode:this.searchFormData.cityCode,
thrLetterCode:this.searchFormData.thrLetterCode,
belongNetwork:this.searchFormData.belongNetwork,
belongType:this.searchFormData.belongType,
currentPage:this.currentPage,
pageSize:this.pageSize,
}
const response = await axios.post(‘/sys/air-open-base/belongNetwork/findByPage‘, params) // todo del
const { status, data } = response
if (status === 200 && data.succ === ‘ok‘) {
this.loading = false
this.tableData = data.result.records
this.totalSize = data.result.total;
setTimeout(()=>{
this.$refs.queryTable1.hideLoading();
},1000)
} else {
this.$refs.queryTable1.hideLoading();
return false
}
},
cityCodeChange()
{
},
addRecord(row)
{
this.dialogTitle="添加"
this.dialogVisible=true;
Object.keys(this.editForm).forEach(key=>{this.editForm[key]=‘‘})
},
async saveRecord(row)
{
// 获取数据
let params={
cityName: row.cityName,
cityCode: row.cityCode,
belongNetwork: row.belongNetwork,
thrLetterCode: row.thrLetterCode,
belongType: row.belongType,
serviceType: row.serviceType.join(","),
administrativeCode: row.administrativeCode,
id:row["id"]==null? "":row["id"]
}
const response = await axios.post(‘/sys/air-open-base/belongNetwork/saveOrUpdate‘, params) //
if (response.data.succ === ‘ok‘) {
this.$message({
type: ‘success‘,
message: ‘操作成功!‘
});
this.dialogVisible=false;
this.queryRecords("query")
} else {
this.$confirm(response.data.msg, ‘提示‘, {
type: ‘warning‘,
showCancelButton:false,
confirmButtonText:"确定",
center: false
})
}
},
updateRecord()
{
if(this.selectionRows.length==1){
this.dialogTitle="编辑"
if(this.selectionRows[0].serviceType.indexOf(",")!=-1){
this.formData.serviceType=this.selectionRows[0].serviceType.split(",")
}
this.formData={
username:this.selectionRows[0].username,//用户名
cityCode:this.selectionRows[0].cityCode,//城市code
thrLetterCode:this.selectionRows[0].thrLetterCode,//机场三字码
belongNetwork:this.selectionRows[0].belongNetwork,//归属网点
belongType:this.selectionRows[0].belongType,//归属类型(1 大网,2重货)
serviceType: this.formData.serviceType,//业务类型
administrativeCode: this.selectionRows[0].administrativeCode,//行政代码
}
if(this.selectionRows[0]["id"]!="" && this.selectionRows[0]["id"]!=null){
this.formData.id=this.selectionRows[0]["id"];
}
this.editForm=JSON.parse(JSON.stringify(this.formData));
this.dialogVisible=true;
}else{
this.$confirm("请先选择一条数据", ‘提示‘, {
type: ‘warning‘,
showCancelButton:false,
confirmButtonText:"确定",
center: false
}).then(() => {
}).catch(() => {
});
return false;
}
},
closeEditForm()
{
this.dialogVisible=false;
Object.keys(this.editForm).forEach(key=>{this.editForm[key]=‘‘})
},
deleteRecord()
{
this.rowArray=this.selectionRows;
if (this.selectionRows.length>0) {
let tempArray=this.rowArray;
let tempIdArray=[];
for(var i=0;i<tempArray.length;i++){
tempIdArray.push(tempArray[i].id);
}
this.$confirm(‘确定删除吗, 是否继续?‘, ‘提示‘, {
confirmButtonText: ‘确定‘,
cancelButtonText: ‘取消‘,
type: ‘warning‘
}).then(() => {
let params={
ids:tempIdArray.join(","),//主键ID 多个用逗号分开
}
axios.post(‘/sys/air-open-base/belongNetwork/delete‘, params).then((res)=>{
if(res.data.succ=="ok"){
this.$message({
type: ‘success‘,
message: ‘删除成功!‘
});
this.queryRecords("query");
}
}).catch((res)=>{
})
}).catch(() => {
});
}else{
this.$confirm("请至少选择一条数据", ‘提示‘, {
type: ‘warning‘,
showCancelButton:false,
confirmButtonText:"确定",
center: false
})
}
},
currentPageChange(val)
{
this.currentPage = val;
this.tableData=[];
this.queryRecords();
},
//展示页数切换
pageSizeChange(val)
{
this.pageSize = val;
this.currentPage=1;
this.queryRecords();
},
rowUpdateOperate(row)
{
},
rowDeleteOperate(row)
{
},
selectionChange(rows)
{
this.selectionRows=rows;
},
}
}
</script>
<style scoped="scoped">
.base-page{padding:4px 10px}
.el-table_1_column_1.el-table-column--selection .el-checkbox__inner{margin-left:4px!important;}
</style>
原文:https://www.cnblogs.com/xmyfsj/p/14802620.html