MAP: {
KEY: `${MAPKEY}`//自己申请的腾讯开发者密钥
},
loading: false,
isAjaxSearch: false,
// 地区列表
areas: [],
// 地图搜索出来的地址
addressList: [
{ value: 1, label: '', desc: '', },
],
mapDialog: false,
keyword: '', // 用于绑定输入框的值
defaultForm: {
isSelect: 1, // 是否选择了详细地址0
area: [441900], // 存储省市区ID数组
areaArr: ['广东省'], // 存储省市区json数组
province: '广东省', // 省
city: '', // 市
region: '', // 区
address: '东莞市', // 详细地址
// mapCenter: '39.12,116.54', // 默认中心点
mapCenter: '23.02067,113.75179',
mapSrc: '', // 地图图片地址
// 经纬度
location: {
lat: '',
lng: '',
},
},
form: {
address: '',
mapCenter: '',
},
<el-form ref="mapForm">
<!-- <el-form-item label="学校地址:" class="tipsDiv">
<span class="tipsStart">*</span>
<el-col>
<el-cascader ref="myCascader" style="width:100%" :options="area" v-model="ruleForm.area" change-on-select
clearable @change="changeArea" placeholder="请选择省/市/县(区)" filterable
:props="{ value: 'code', label: 'name', children: 'children' }"></el-cascader>
</el-col>
</el-form-item> -->
<!-- <el-form-item label="详细地址" prop="schoolAddress">
<el-input v-model.trim="ruleForm.schoolAddress" clearable placeholder="请填写详细地址,30个字符以内"
maxlength="30"></el-input>
</el-form-item> -->
<!-- 提交后台的参数 -->
<el-form-item label="学校地址省市区:" class="tipsDiv" style="position: relative;">
<span class="tipsStart" style="position: absolute;left: -8px;">*</span>
<el-col>
<el-cascader ref="myCascader" style="width:100%" :options="area" v-model="form.area" change-on-select
clearable @change="changeArea" placeholder="请选择省/市/县(区)" filterable
:props="{ value: 'code', label: 'name', children: 'children' }"></el-cascader>
</el-col>
</el-form-item>
<!-- <el-form-item label="省市区:">
<el-cascader ref="myCascader" v-model="form.area"
:props="{ value: 'code', label: 'name', children: 'children' }" :options="area" placeholder="请选择"
@change="changeArea">
<template slot="displayRender" slot-scope="{ labels }">
<span v-for="(label, index) in labels" :key="index">
<span v-if="index === 0" style="color: #262626;">
{{ labels && labels.length && labels.join(' ') || '' }}
</span>
</span>
</template>
</el-cascader>
</el-form-item> -->
<el-form-item label="详细地址:" prop="schoolAddress" style="position: relative;">
<span class="tipsStart" style="position: absolute;left: -8px;">*</span>
<el-autocomplete style="width: 100%;" allow-clear v-model="keyword" :fetch-suggestions="querySearch"
:disabled="form.area && form.area.length > 1 ? false : true" @select="handleSelect"
placeholder="请输入关键字"></el-autocomplete>
<p v-if="!keyword"
style="font-size: 12px;min-height: 22px;font-size: 14px;line-height: 1.5;color: #F56C6C;font-size: 12px;">
请选择省市区后选择详细地址
</p>
</el-form-item>
<el-form-item label="地图显示:">
<div class="form-map-box">
<div class="form-map">
<img :src="form.mapSrc" style="width: 100%;height: 100%;">
</div>
</div>
</el-form-item>
</el-form>
this.form = { ...this.defaultForm }
// 添加debounce
// this.ajaxSearch = lodash.debounce(this.ajaxSearch, 500)
// // 地图区域生成未选择图片展示
this.getMapSrc()
//输入框获取焦点时调用的方法
querySearch(queryString, cb) { // queryString是用户输入的想要查询的内容,cb是回调函数(可以发请求获取数据)
console.log("如何触发", queryString, cb);
if (queryString == "") {
cb([]); // 当然这里的历史记录是后端返给我们的,应该为接口返回的数据
} else {
// let apiResult = [
// {
// value: "老王",
// },
// {
// value: "王老吉",
// },
// ];
// // 这里我们模拟从后端的接口异步获取的数据
// setTimeout(() => {
// // cb([]) cb函数如果返回一个空数组的话,那个模糊搜索输入建议的下拉选项因为length为0就会消失了
// cb(apiResult);
// }, 500);
let res = []
// console.log(e)
// if (!e) { return } hhr
this.loading = true
getSuggestion({
key: this.MAP.KEY,
province: this.form.province || '',
city: this.form.city || '',
region: this.form.region || '',
keyword: this.keyword
})
.then(res => {
// if (res.message == 'query ok') {
res = res.data
this.loading = false
res = (res && res.data) || res || []
// console.log('搜索地址结果:', res)
// it.value = it.address || ''//有变化 id hhr
const result = res.map((it) => {
it.value = it.address || ''
it.label = it.title || ''
it.desc = it.address || ''
return it
}).filter((it) => it && it.id && it.address) || []
console.log("addrress")
this.addressList = result
cb(result)
// 如果地址结果为空,设置为未选择地址状态
if (result.length === 0) {
this.clearAddress()
}
this.isAjaxSearch = true
// }
})
.catch(err => {
this.dataLoading = false
})
console.log('1111')
}
},
// 选中输入框推荐的值的时候触发
handleSelect(item) { // 参数
console.log("拿到数据", item);
console.log(this.addressList)
this.form.isSelect = '1'
this.form.mapCenter = `${item.location.lat},${item.location.lng}`
this.form.location = {
lat: item.location.lat,
lng: item.location.lng
}
this.form.address = item.address
this.getMapSrc()
},
// 点击clearable清空小图标按钮以后,继续重新在输入框中输入数据,querySearch会触发,但是cb函数不会触发
// 这样的话就会出现发请求了,也获取数据了,但是input框的输入建议下拉框不呈现在页面上的问题,所以解决方法就是
// 只要用户点击了
blurForBug() {
document.activeElement.blur()
},
// querySearch(queryString, cb) {
// // 对输入的关键字进行匹配,返回匹配的选项
// const options = this.options;
// const results = queryString ? options.filter(this.createFilter(queryString)) : options;
// // 通过回调函数将匹配的选项返回给el-autocomplete组件
// cb(results);
// },
createFilter(queryString) {
return (option) => {
return option.indexOf(queryString) === 0;
};
},
// setData(obj = {}) {
// setTimeout(() => {
// if (!obj.location) { obj.location = {} }
// try { obj.location.lat = obj.location.lat || obj.latitude } catch (error) { }
// try { obj.location.lng = obj.location.lng || obj.longitude } catch (error) { }
// this.form = {
// ...this.form,
// ...obj,
// mapCenter: `${obj.location.lat || ''},${obj.location.lng || ''}`,
// isSelect: 1,
// area: obj.province ? this.$tool.getAreaIndexFromName(this.area, [obj.province, obj.city, obj.region], 'name', 'id') : [440000],
// }
// // console.log(this.form, this.$tool.getAreaIndexFromName(this.area, [obj.province, obj.city, obj.region], 'name', 'id'))
// this.$nextTick(() => {
// this.handleSearch(this.form.address || '')
// this.getMapSrc()
// })
// }, 700)
// },
getLenText(keyword, len = 64) {
if (!keyword) { return '' }
let str = keyword
try {
str = str.substring(0, len)
} catch (e) { }
return str
},
// 选择省市区
changeArea(e) {
this.$emit('change', e)
// this.$nextTick(() => {
// this.areaNames = this.$refs['myCascader'].currentLabels //获取lable的值
// })
// console.log(this.$refs['myCascader'].getCheckedNodes()[0].label )
let data =''
if(this.$refs["myCascader"].getCheckedNodes()&&this.$refs["myCascader"].getCheckedNodes()[0]&&this.$refs["myCascader"].getCheckedNodes()[0].pathLabels){
data = this.$refs["myCascader"].getCheckedNodes()[0].pathLabels
}else{
return
}
// 切换省市区,清空地址
this.clearAddress()
this.form = {
...this.form,
area: e || [],
areaArr: data,
province: (data && data[0]) || '',
city: (data && data[1]) || '',
region: (data && data[2]) || '',
address: '',
}
this.keyword = ''
this.addressList = []
this.$nextTick(() => {
this.getMapLng(data.join(''))
})
},
getMapLng(address) {
// let res = []
// // console.log(e)
// // if (!e) { return } hhr
// this.loading = true
getSuggestion1({
key: this.MAP.KEY,
address: address || this.form.province||'',
})
.then(res => {
if (res.message == 'query ok') {
let obj = res.result
this.form.isSelect = '1'
this.form.mapCenter = `${obj.location.lat},${obj.location.lng}`
this.form.location = {
lat: obj.location.lat,
lng: obj.location.lng
}
this.form.address = obj.title
this.getMapSrc()
}
})
.catch(err => {
// this.dataLoading = false
})
},
// 选择地址
selectAddress(e, props) {
let item = {}
try {
item = (props && props.data.attrs.item) || {}
item.location = item.location || {}
} catch (error) { }
// console.log(e, item)
if (!item.location) { item.location = {} }
this.form = {
...this.form,
location: item.location || {},
mapCenter: `${item.location.lat},${item.location.lng}`,
// province: item.province || '',
// city: item.city || '',
// region: item.region || item.district || '',
address: `${item.title}${item.address}` || '',
isSelect: 1,
}
this.$nextTick(() => {
this.getMapSrc()
})
},
// 设置为未选择地址状态
clearAddress() {
this.form.isSelect = 0
this.form.location = {}
},
// handleSearch(e) {
// if (!this.form.area || this.form.area.length === 0) { return }
// const region = this.form.region || ''
// if (!region || !e) {
// // 设置为未选择地址状态
// this.clearAddress()
// return
// }
// // 搜索地址列表
// this.ajaxSearch(e)
// },
// 搜索地址列表
// async ajaxSearch(e) {
// let res = []
// // console.log(e)
// if (!e) { return }
// this.loading = true
// getSuggestion({
// key: this.MAP.KEY,
// province: this.form.province || '',
// city: this.form.city || '',
// region: this.form.region || '',
// keyword: this.keyword
// })
// .then(res => {
// // if (res.message == 'query ok') {
// res = res.data
// this.loading = false
// res = (res && res.data) || res || []
// // console.log('搜索地址结果:', res)
// const result = res.map((it) => {
// it.value = it.id || ''
// it.label = it.title || ''
// it.desc = it.address || ''
// return it
// }).filter((it) => it && it.id && it.address) || []
// console.log("addrress")
// this.addressList = result
// console.log(this.addressList)
// // this.form.isSelect = '1'
// // this.form.mapCenter = '39.827982,116.459249'
// // this.form.address = '小红门[地铁站]'
// // this.getMapSrc()
// // 如果地址结果为空,设置为未选择地址状态
// if (result.length === 0) {
// this.clearAddress()
// }
// this.isAjaxSearch = true
// // }
// })
// .catch(err => {
// this.dataLoading = false
// })
// console.log('1111')
// },
// 生成图片地图
getMapSrc() {
// ${this.form.province || ''}${this.form.city || ''}${this.form.region || ''}
let title = this.form.isSelect === 0 ? `未选择地址` : `${this.form.address || ''}`
title = title.substring(0, 13)
// console.log('title', title)
let center = this.form.mapCenter
if (this.form.isSelect === 0) {
center = '39.12,116.54'
}
const obj = {
center: `${center}`,
zoom: `17`,
size: `270*115`,
maptype: `roadmap`,
scale: `2`,
markers: `size:large|color:red|${center}`,
key: `${this.MAP.KEY}`,
labels: `border:0|size:12|color:0x262626|bgcolor:white|anchor:3|offset:0_-10|${title}|${center}`
}
const str = `https://apis.map.qq.com/ws/staticmap/v2/?${Qs.stringify(obj)}`
// console.log(str, 'map')
this.form.mapSrc = str
this.form.isSelect === 0 && (this.defaultMapSrc = str)
},
// getContainer() {
// return document.getElementById('component-modal-addr-map')
// },
// close() {
// this.isAjaxSearch = false
// this.$emit('close')
// },
// confirm() {
// this.$refs.form.validate(valid => {
// // console.log('表单数据:', this.form)
// if (!valid) { return }
// // console.log(valid)
// this.$emit('ok', this.form)
// })
// },
// 根据省市区关键字获取下拉数据
export function getSuggestion(obj) {
return request({
url: '/qqUrl/ws/place/v1/suggestion/?region='+obj.province+''+obj.city+''+obj.region+'&keyword='+obj.keyword+'&key='+obj.key,
method: 'get',
data: obj
})
}
// 根据位置获取经纬度
export function getSuggestion1(obj) {
return request({
url: '/qqUrl/ws/geocoder/v1/?address='+obj.address+'&key='+obj.key,
method: 'get',
data: obj
})
}
![]()
![]()