# PlaceEditor 地点编辑器组件
<template>
<div class="comp-container">
<tlbs-place-editor
ref="mapComp"
:filter-keyword="filterKeyword"
:filter-selects="filterSelects"
:filter-more="filterMore"
:list-data="listData"
:item-buttons="itemButtons"
:loading="loading"
:total="total"
:page-size="pageSize"
:form-title="formTitle"
:form-data="formData"
:form-configs="formConfigs"
:form-buttons="formButtons"
:form-rules="formRules"
@change-filters="onChangeFilters"
>
</tlbs-place-editor>
</div>
</template>
<script>
const validateTel = (rule, value, callback) => {
// 匹配所有号码(手机卡 + 数据卡 + 上网卡)
const reg = /^(?:\+?86)?1(?:3\d{3}|5[^4\D]\d{2}|8\d{3}|7(?:[01356789]\d{2}|4(?:0\d|1[0-2]|9\d))|9[189]\d{2}|6[567]\d{2}|4(?:[14]0\d{3}|[68]\d{4}|[579]\d{2}))\d{6}$/;
if (!reg.test(value)) {
callback(new Error('输入正确格式手机号码'));
} else {
callback();
}
};
export default {
name: 'PlaceEditor',
data() {
const _this = this;
return {
filterOptions: {
region: '全国'
},
filterKeyword: {
name: 'keyword',
placeholder: '搜索关键词'
},
filterSelects: [
{
name: 'region',
placeholder: '省市',
defaultValue: ['全国'],
type: 'city'
}
],
filterMore: [
{
name: 'address',
label: '地址',
type: 'text',
placeholder: '输入地址',
defaultValue: ''
},
{
name: 'price',
label: '价格',
type: 'text',
placeholder: '输入价格',
defaultValue: ''
}
// {
// name: 'oil',
// label: '在售油品',
// type: 'checkbox',
// defaultValue: [1, 2],
// options: [{value: 1, label: '#95'}, {value: 2, label: '#92'}, {value: 3, label: '#柴油'}]
// },
// {
// name: 'cate',
// label: '类型',
// type: 'radio',
// defaultValue: 1,
// options: [{value: 1, label: '中石油'}, {value: 2, label: '中石化'}, {value: 3, label: '中海油'}]
// },
// {
// name: 'floor',
// label: '楼层',
// type: 'select',
// defaultValue: 1,
// options: [{value: 1, label: '1F'}, {value: 2, label: '2F'}, {value: 3, label: '3F'}]
// },
// {
// name: 'date',
// label: '日期',
// type: 'date',
// defaultValue: '2020-07-20'
// },
// {
// name: 'time',
// label: '时间',
// type: 'time',
// defaultValue: '12:00:11'
// },
// {
// name: 'datetime',
// label: '日期时间',
// type: 'datetime',
// defaultValue: '2020-07-30 12:00:11'
// },
// {
// name: 'cityName',
// label: '城市',
// type: 'city',
// defaultValue: ['全国']
// }
],
loading: false,
listData: [],
itemButtons: [
{
text: '编辑', // 按钮中文字
onClick(data) {
_this.formData = data;
_this.$refs.mapComp.showForm();
},
customClass: '' // 自定义类
}
// {
// text: '删除', // 按钮中文字
// onClick(data) {
// // _this.formData = data;
// // _this.$refs.mapComp.showForm();
// },
// customClass: '' // 自定义类
// }
],
total: 0,
pageSize: 10,
formData: {},
formTitle: '编辑地点信息',
formButtons: [
{
text: '提交', // 按钮中文字
onClick(data) {
_this.$refs.mapComp.validateForm((valid) => {
if (valid) {
console.log(data);
_this.editData(data).done(() => {
_this.$refs.mapComp.hideForm();
_this.loadData(_this.filterOptions);
});
}
});
},
type: 'primary', // 按钮类型
customClass: '' // 自定义类
},
{
text: '重置', // 按钮中文字
onClick(data) {
_this.$refs.mapComp.resetForm();
},
type: '', // 按钮类型
customClass: '' // 自定义类
}
],
formConfigs: [
{
name: 'name',
label: '名称',
type: 'text',
placeholder: '输入名称'
},
{
name: 'latlng',
label: '经纬度',
type: 'location',
placeholder: '输入经纬度'
},
{
name: 'address',
label: '地址',
type: 'text',
placeholder: '输入地址'
},
{
name: 'floor',
label: '楼层',
type: 'text'
},
{
name: 'tel',
label: '门店电话',
type: 'text'
},
{
name: 'contactTel',
label: '联系人电话',
type: 'text'
}
],
formRules: {
address: [
{required: true, message: '门店地址不能为空'}
],
tel: [
{required: true, message: '门店电话不能为空'},
{validator: validateTel}
]
}
};
},
mounted() {
this.loadData(this.filterOptions);
},
methods: {
loadData(filterOptions) {
this.loading = true;
window.$.ajax({
method: 'GET',
url: '/place_cloud/search/region',
data: {
region: '北京市',
table_id: '5f2012d1d1247578cd1073a9',
key: '6XJBZ-LMJLW-GPERC-ONBHO-GEPFV-OKBK4',
...filterOptions
}
}).done((res) => {
this.loading = false;
if (res.status !== 0) {
alert(res.message);
return;
}
const {data, count} = res.result;
this.listData = data.map(data => {
data.latlng = `${data.location.lat},${data.location.lng}`;
data.name = data.title;
return data;
});
this.total = count;
});
},
editData(data) {
delete data.ud_id;
data.title = data.name;
return window.$.ajax({
method: 'POST',
url: '/place_cloud/data/update',
contentType: 'application/json',
data: JSON.stringify({
data,
filter: 'ud_id in("2")',
table_id: '5f2012d1d1247578cd1073a9',
key: '6XJBZ-LMJLW-GPERC-ONBHO-GEPFV-OKBK4'
})
}).done((res) => {
if (res.status !== 0) {
alert(res.message);
return;
}
});
},
onChangeFilters(filterOptions) {
const queryData = JSON.parse(JSON.stringify(filterOptions));
this.filterOptions = queryData;
this.filterOptions.region = queryData.region[queryData.region.length - 1];
this.loadData(this.filterOptions);
}
}
};
</script>
<style>
* {
margin: 0;
padding: 0;
box-sizing: content-box;
}
.comp-container {
height: 800px;
}
</style>
# Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
filter-keyword | 关键词搜索框 | Filter | object | - |
filter-selects | 下拉选择项 | Filter[] | ||
filters-more | 更多筛选条件数组 | Filter[] | — | [] |
total | 总数 | number | — | — |
page-size | 每页条数 | number | — | 10 |
list-data | 列表数组 | Item[] | ||
loading | 列表loading状态 | boolean | — | false |
form-title | 表单标题 | string | — | — |
item-buttons | 每条数据的操作按钮配置数组 | ItemButton[] | — | [] |
form-configs | 表单展示配置 | FormItemConfig[] | — | |
form-data | 表单数据回填 | object | — | |
form-buttons | 表单的操作按钮配置数组 | FormButton[] | — | [] |
form-rules | 表单字段校验规则 | object | — | — |
# Slot
name | 说明 |
---|---|
filter | 组件搜索区域 |
list | 组件列表区域 |
# 事件
事件名称 | 说明 | 回调参数 |
---|---|---|
changeFilters | 筛选时触发 | 筛选参数 |
# 方法
方法名称 | 说明 | 参数 |
---|---|---|
showForm | 显示表单 | — |
hideForm | 隐藏表单 | — |
validateForm | 校验表单 | — |
resetForm | 重置表单 | — |
# Filter 对象结构
{
name: 'key', //筛选项键值
label: '', //筛选项文本
hide: false,//是否隐藏,非必传默认是false
defaultValue: '', //默认值
type: '', //可选值 text | radio | checkbox | select | date | time | datetime,
options: [{label: '', value: ''}] //当type是radio、checkbox、select时
}
# FormItemConfig 对象结构
{
name: '', //筛选项字段名
label: '', //筛选项文本
defaultValue: '', //默认值
type: '', //可选值 text | radio | checkbox | select | date | time | city | location,
placeholder: ’占位符‘,
options: [{label: '', value: ''}], //当type是radio、checkbox、select时
required: true // 是否必填
disabled: false, //禁止输入
}
# Item 对象结构
{
name: ’‘,
address: '',
location: {lat: 39, lng: 116}
}
# ItemButton 对象结构
{
text: '编辑', //按钮中文字
onClick: function (formData) {} // 按钮回调
type: ‘primary’, //按钮类型
customClass: ’‘, //自定义类
}
# FormButton 对象结构
{
text: '编辑', //按钮中文字
onClick: function (formData) {} // 按钮回调
type: ‘primary’, //按钮类型
customClass: ’‘, //自定义类
}
# form-rules 对象结构
const validateTel = (rule, value, callback) => {
// 匹配所有号码(手机卡 + 数据卡 + 上网卡)
const reg = /^(?:\+?86)?1(?:3\d{3}|5[^4\D]\d{2}|8\d{3}|7(?:[01356789]\d{2}|4(?:0\d|1[0-2]|9\d))|9[189]\d{2}|6[567]\d{2}|4(?:[14]0\d{3}|[68]\d{4}|[579]\d{2}))\d{6}$/;
if (!reg.test(value)) {
callback(new Error('输入正确格式手机号码'));
} else {
callback();
}
};
{
//key是要校验的表单字段名
key: [
{required: true, message: '不能为空'},
{validator: validateTel}
]
}