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.
 
 
 
 
 

289 lines
7.3 KiB

<template>
<!-- 添加新地址 -->
<view :style="colorStyle">
<form @submit="formSubmit">
<view class='addAddress'>
<view class="input-wrapper">
<view class='list'>
<view class='item acea-row row-between-wrapper'>
<view class='name'>姓名</view>
<input type='text' placeholder='请输入姓名' name='real_name' :value="userAddress.real_name" placeholder-class='placeholder'></input>
</view>
<view class='item acea-row row-between-wrapper'>
<view class='name'>联系电话</view>
<input type='number' maxlength="11" placeholder='请输入联系电话' name="phone" :value='userAddress.phone' placeholder-class='placeholder' pattern="\d*"></input>
</view>
<view class='item acea-row row-between-wrapper'>
<view class='name'>所在地区</view>
<view class="address acea-row row-between-wrapper">
<view class="addressCon acea-row" @click="changeRegion">
<text class="picker color-add" v-if="!addressInfo.length">请选择地址</text>
<view v-else>
<text class="picker">{{addressText}}</text>
</view>
</view>
<view class="location1" @click="chooseLocation">
<text class="iconfont icon-ic_location1 text-primary"></text>定位
</view>
</view>
</view>
<view class='item acea-row row-between-wrapper'>
<view class='name'>详细地址</view>
<view class="address">
<input type='text' placeholder='请填写具体地址' name='detail' placeholder-class='placeholder' :value='userAddress.detail' class="detail"></input>
</view>
</view>
</view>
</view>
<button class='keepBnt' form-type="submit">立即保存</button>
</view>
</form>
<areaWindow ref="areaWindow" :display="display" :address="addressInfo" @submit="OnChangeAddress" @changeClose="changeClose"></areaWindow>
</view>
</template>
<script>
import {getGeocoder,getCityList} from '@/api/user.js';
import {mapGetters} from "vuex";
import colors from '@/mixins/color.js';
import areaWindow from '@/components/areaWindow';
import AddressParse from '../components/zh-address-parse.min.js'
export default {
components: {
areaWindow,
},
mixins: [colors],
data() {
return {
id: 0, //地址id
userAddress: {}, //地址详情
district: [],
display: false,
addressInfo: [],
addressVal: '',
latitude: '',
longitude: '',
city_id: 0,
addressValue: "",
};
},
computed: {
...mapGetters(['isLogin']),
addressText() {
return this.addressInfo.map(v => v.label).join('/');
}
},
onLoad(options) {
},
methods: {
changeRegion() {
this.display = true;
},
OnChangeAddress(address) {
this.latitude = ''
this.longitude = ''
this.addressInfo = address;
},
// 关闭地址弹窗;
changeClose: function() {
this.display = false;
},
// 获取选中位置
chooseLocation: function() {
let self = this;
uni.chooseLocation({
success: (res) => {
let latitude, longitude;
latitude = res.latitude.toString();
longitude = res.longitude.toString();
this.latitude = res.latitude
this.longitude = res.longitude
getGeocoder({
lat: latitude,
long: longitude
}).then(res => {
const data = res.data;
getCityList(data.address_component.province + '/' + data.address_component.city + '/' + data.address_component.district + '/' + (!data
.address_reference.town ? '' : data.address_reference.town.title)).then(res => {
self.addressInfo = res.data;
self.userAddress.detail = data.formatted_addresses.recommend;
}).catch(err => {
self.$util.Tips({
title: err
});
});
})
},
fail: (err) => {
console.log(err)
}
})
},
/**
* 提交用户添加地址
*
*/
formSubmit: function(e) {
let that = this,
value = e.detail.value;
if (!value.real_name) return that.$util.Tips({
title: '请填写收货人姓名'
});
if (!value.phone) return that.$util.Tips({
title: '请填写联系电话'
});
if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(value.phone)) return that.$util.Tips({
title: '请输入正确的手机号码'
});
if (!that.addressInfo.length) return that.$util.Tips({
title: '请选择所在地区'
});
if (that.addressInfo.length < 3) return that.$util.Tips({
title: '请补全所在地区信息'
});
if (!value.detail) return that.$util.Tips({
title: '请填写详细地址'
});
value.id = 0;
let regionArray = that.addressInfo;
value.address = {
province: regionArray[0].label,
city: regionArray[1].label,
district: regionArray[2].label,
street: regionArray[3] ? regionArray[3].label : '',
city_id: regionArray[regionArray.length - 1].id ? regionArray[regionArray.length - 1].id : that.city_id,
};
uni.$emit("refresh", value)
uni.navigateBack()
},
identify() {
const options = {
type: 0, // 哪种方式解析,0:正则,1:树查找
textFilter: [], // 预清洗的字段
nameMaxLength: 4, // 查找最大的中文名字长度
}
const parseResult = AddressParse(this.addressValue.trim(), options)
// type参数0表示使用正则解析,1表示采用树查找, textFilter地址预清洗过滤字段。
if (this.addressValue.trim()) {
getCityList(parseResult.province + '/' + parseResult.city + '/' + parseResult.area).then(res => {
this.addressInfo = res.data;
this.userAddress.phone = parseResult.phone;
this.userAddress.real_name = parseResult.name;
this.userAddress.detail = parseResult.detail;
}).catch(err => {
return this.$util.Tips({
title: err
});
})
}
}
}
}
</script>
<style scoped lang="scss">
.color-add {
color: #cdcdcd;
}
.location1 {
.iconfont {
margin-right: 8rpx;
}
}
.text-primary {
color: $primary-admin;
}
.addAddress {
padding: 24rpx 20rpx;
}
.addAddress .input-wrapper {
margin-bottom: 20rpx;
}
.addAddress .list {
padding: 8rpx 0;
border-radius: 16rpx;
background-color: #fff;
}
.addAddress .list .item {
padding: 32rpx 24rpx;
position: relative;
}
.addAddress .list .item .detail {
width: 368rpx;
}
.addAddress .list .item .location {
position: absolute;
right: 46rpx;
top: 50%;
margin-top: -40rpx !important;
font-size: 24rpx;
text-align: center;
}
.addAddress .list .item .icon-dizhi {
font-size: 36rpx !important;
}
.addAddress .list .item .name {
width: 195rpx;
font-size: 30rpx;
color: #333;
}
.addAddress .list .item .address {
// width: 412rpx;
flex: 1;
// margin-left: 20rpx;
}
.addAddress .list .item .address .addressCon {
width: 360rpx;
}
.addAddress .list .item .address .addressCon .tip {
font-size: 21rpx;
margin-top: 4rpx;
}
.addAddress .list .item input {
flex: 1;
font-size: 30rpx;
}
.placeholder {
color: #ccc;
}
.addAddress .list .item .picker {
width: 430rpx;
font-size: 30rpx;
}
.addAddress .list .item .iconfont {
font-size: 30rpx;
margin-top: 4rpx;
}
.addAddress .keepBnt {
position: fixed;
right: 20rpx;
bottom: 40rpx;
left: 20rpx;
height: 80rpx;
border-radius: 40rpx;
text-align: center;
line-height: 80rpx;
font-size: 28rpx;
color: #fff;
background-color: $primary-admin;
}
</style>