|
|
<!-- 添加修改地址 -->
|
|
|
<template>
|
|
|
<view class="address-wrap">
|
|
|
<u-form :model="model" :rules="rules" ref="uForm" :errorType="errorType">
|
|
|
<!-- 地址定位 -->
|
|
|
<view class="location-item u-flex u-row-between u-p-20 u-m-b-20" @tap="getLocation">
|
|
|
<view class="u-flex">
|
|
|
<text class="u-iconfont uicon-map-fill" style="#a76f0d;"></text>
|
|
|
<text>{{ chooseAddress }}</text>
|
|
|
</view>
|
|
|
<text class="u-iconfont uicon-arrow-right" style="color: #666"></text>
|
|
|
</view>
|
|
|
|
|
|
<view class="address-box">
|
|
|
<!-- 地址表单 -->
|
|
|
<u-form-item :labelStyle="labelStyle" label-width="150" label-position="left" label="姓名:" prop="consignee">
|
|
|
<u-input placeholder="请填写姓名" v-model="model.consignee" type="text"></u-input>
|
|
|
</u-form-item>
|
|
|
<u-form-item :labelStyle="labelStyle" label-width="150" label-position="left" label="手机号码:" prop="phone">
|
|
|
<u-input placeholder="请输入手机号" v-model="model.phone" type="number"></u-input>
|
|
|
<!-- <u-icon name="map" color="#2979ff" size="28"></u-icon> -->
|
|
|
</u-form-item>
|
|
|
<!-- <u-form-item :labelStyle="labelStyle" label-width="150" label-position="left" label="所在地区:" prop="area_text">
|
|
|
<u-input type="select" v-model="model.area_text" :select-open="showSelect" placeholder="请选择地区" @click="showSelect = true"></u-input>
|
|
|
</u-form-item> -->
|
|
|
<u-form-item :labelStyle="labelStyle" label-width="150" label-position="left" label="小区:" prop="community_text">
|
|
|
<u-input type="select" v-model="model.community_text" :select-open="comshowSelect" placeholder="请点击上方定位后再选择小区" @click="isChooseCommunity"></u-input>
|
|
|
</u-form-item>
|
|
|
<u-form-item :labelStyle="labelStyle" label-position="left" label-width="150" label="详细地址:" prop="address">
|
|
|
<u-input border type="textarea" v-model="model.address" placeholder="如街道、小区、楼牌号、单元号等" />
|
|
|
</u-form-item>
|
|
|
</view>
|
|
|
|
|
|
<!-- 设置默认 -->
|
|
|
<view class="default-box u-flex u-row-between">
|
|
|
<view class="left">
|
|
|
<view class="title">设为默认地址</view>
|
|
|
<view class="subtitle">提醒:下单时会优先使用此地址</view>
|
|
|
</view>
|
|
|
<u-switch v-model="model.is_default" activeColor="#17C161" size="40"></u-switch>
|
|
|
</view>
|
|
|
|
|
|
<!-- 功能按钮 -->
|
|
|
<view class="foot_box u-p-30 u-m-t-50 u-flex u-row-around">
|
|
|
<!-- <button v-show="addressId" class=" u-m-20 u-reset-button delete-btn u-flex-1" @tap="deleteAddress">删除收货地址</button> -->
|
|
|
<button class=" u-m-20 u-reset-button save-btn u-flex-1" @tap="submit">保存</button>
|
|
|
</view>
|
|
|
</u-form>
|
|
|
<!-- 小区选择器 -->
|
|
|
<u-select mode="single-column" safe-area-inset-bottom :list="communityList" value-name="id" label-name="name" v-model="comshowSelect" @confirm="communityConfirm"></u-select>
|
|
|
<!-- 省市区选择器 -->
|
|
|
<u-select mode="mutil-column-auto" safe-area-inset-bottom :list="addressAreaList" v-model="showSelect" @confirm="regionConfirm"></u-select>
|
|
|
</view>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
import { MAP_KEY } from '@/env.js';
|
|
|
import Auth from '@/shopro/permission/index.js';
|
|
|
export default {
|
|
|
components: {},
|
|
|
data() {
|
|
|
return {
|
|
|
showSelect: false, //省市区、小区
|
|
|
comshowSelect:false,
|
|
|
addressAreaList: [],
|
|
|
communityList:[],
|
|
|
addressId: 0, //收货地址ID
|
|
|
labelStyle: {
|
|
|
'font-size': '30rpx',
|
|
|
color: '#999999'
|
|
|
},
|
|
|
model: {
|
|
|
id: 0,
|
|
|
consignee: '',
|
|
|
phone: '',
|
|
|
area_text: '',
|
|
|
address: '',
|
|
|
is_default: false,
|
|
|
latitude: '',
|
|
|
longitude: '',
|
|
|
community_id:null,
|
|
|
community_text:""
|
|
|
},
|
|
|
rules: {
|
|
|
phone: [
|
|
|
{
|
|
|
required: true,
|
|
|
message: '请输入收货人手机号',
|
|
|
trigger: ['change', 'blur']
|
|
|
},
|
|
|
{
|
|
|
validator: (rule, value, callback) => {
|
|
|
return this.$u.test.mobile(value);
|
|
|
},
|
|
|
message: '手机号码不正确',
|
|
|
trigger: ['change', 'blur']
|
|
|
}
|
|
|
],
|
|
|
consignee: [
|
|
|
{
|
|
|
required: true,
|
|
|
message: '请填写收货人姓名',
|
|
|
trigger: ['change', 'blur']
|
|
|
}
|
|
|
],
|
|
|
area_text: [
|
|
|
{
|
|
|
required: true,
|
|
|
message: '请选择地区',
|
|
|
trigger: ['change', 'blur']
|
|
|
}
|
|
|
],
|
|
|
address: [
|
|
|
{
|
|
|
required: true,
|
|
|
message: '请输入详细地址',
|
|
|
trigger: ['change', 'blur']
|
|
|
}
|
|
|
]
|
|
|
},
|
|
|
errorType: ['message'],
|
|
|
communityDisabled:true,
|
|
|
chooseAddress: '点击选择地理位置' ,//定位地址
|
|
|
};
|
|
|
},
|
|
|
computed: {},
|
|
|
onReady() {
|
|
|
this.$refs.uForm.setRules(this.rules);
|
|
|
},
|
|
|
onLoad() {
|
|
|
this.getArea();
|
|
|
this.addressId = this.$Route.query.id ? this.$Route.query.id : 0;
|
|
|
uni.setNavigationBarTitle({
|
|
|
title: this.addressId ? '编辑收货地址' : '添加收货地址'
|
|
|
});
|
|
|
this.addressId && this.getAddressInfo();
|
|
|
this.addressId && this.getNearbyCommunity()
|
|
|
// 微信导入
|
|
|
this.$Route.query.addressData && this.wxAddressInit();
|
|
|
},
|
|
|
methods: {
|
|
|
isChooseCommunity(){
|
|
|
if(!this.communityDisabled){
|
|
|
this.comshowSelect = true
|
|
|
}else{
|
|
|
this.comshowSelect = false
|
|
|
}
|
|
|
},
|
|
|
// 获取省市区
|
|
|
getArea() {
|
|
|
this.$http('address.area').then(res => {
|
|
|
if (res.code === 1) {
|
|
|
let { provinceData, cityData, areaData } = res.data;
|
|
|
provinceData.forEach((item, index) => {
|
|
|
this.addressAreaList.push({ ...item, children: [] });
|
|
|
this.addressAreaList[index].children.push(...cityData[index]);
|
|
|
this.addressAreaList[index].children.forEach((item1, index1) => {
|
|
|
item1['children'] = [];
|
|
|
item1.children.push(...areaData[index][index1]);
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
// 获取商品支持的自提点。
|
|
|
async getNearbyCommunity() {
|
|
|
let that = this;
|
|
|
let res = await that.$http('common.getNearbyCommunity', {
|
|
|
latitude: this.model.latitude,
|
|
|
longitude: this.model.latitude
|
|
|
}, '')
|
|
|
this.communityList = res.data
|
|
|
},
|
|
|
// 微信导入数据格式
|
|
|
wxAddressInit() {
|
|
|
let wxAddress = this.$Route.query.addressData; //微信导入
|
|
|
this.model.id = 0;
|
|
|
this.model.consignee = wxAddress.userName;
|
|
|
this.model.phone = wxAddress.telNumber;
|
|
|
// #ifdef MP-WEIXIN
|
|
|
this.model.area_text = `${wxAddress.provinceName}-${wxAddress.cityName}-${wxAddress.countyName}`;
|
|
|
// #endif
|
|
|
// #ifdef H5
|
|
|
this.model.area_text = `${wxAddress.provinceName}-${wxAddress.cityName}-${wxAddress.countryName}`;
|
|
|
// #endif
|
|
|
this.model.address = wxAddress.detailInfo.replace(/%20/g, '');
|
|
|
this.model.is_default = false;
|
|
|
},
|
|
|
|
|
|
// 确认省市区
|
|
|
regionConfirm(e) {
|
|
|
this.model.area_text = `${e[0].label}-${e[1].label}-${e[2].label}`;
|
|
|
},
|
|
|
communityConfirm(e) {
|
|
|
console.log(e)
|
|
|
this.model.community_id = e[0].value
|
|
|
this.model.community_text = e[0].label
|
|
|
},
|
|
|
|
|
|
// 获取定位
|
|
|
async getLocation() {
|
|
|
let authState = await new Auth('userLocation').check();
|
|
|
authState &&
|
|
|
uni.chooseLocation({
|
|
|
success: res => {
|
|
|
this.model.latitude = res.latitude;
|
|
|
this.model.longitude = res.longitude;
|
|
|
this.getNearbyCommunity()
|
|
|
this.getLocationInfo();
|
|
|
},
|
|
|
fail: err => {
|
|
|
console.log(err);
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
|
|
|
//逆坐标解析
|
|
|
async getLocationInfo() {
|
|
|
this.chooseAddress = '定位中...';
|
|
|
const [error, res] = await uni.request({
|
|
|
url: `https://restapi.amap.com/v3/geocode/regeo?location=${this.model.longitude},${this.model.latitude}&key=${MAP_KEY}`
|
|
|
});
|
|
|
if (res.data.status === '1') {
|
|
|
const addressComponent = res.data.regeocode.addressComponent;
|
|
|
this.chooseAddress = res.data.regeocode.formatted_address;
|
|
|
this.model.area_text = `${addressComponent.province}-${addressComponent.city.length ? addressComponent.city : addressComponent.province}-${
|
|
|
addressComponent.district
|
|
|
}`;
|
|
|
this.communityDisabled = false
|
|
|
this.model.address = res.data.regeocode.formatted_address.replace(`${addressComponent.province}${addressComponent.city}${addressComponent.district}`, '');
|
|
|
} else {
|
|
|
console.log('%c逆地址解析失败,请检查是否在env中配置地图key', 'color:green;background:yellow');
|
|
|
}
|
|
|
},
|
|
|
|
|
|
// 提交
|
|
|
submit() {
|
|
|
this.$refs.uForm.validate(valid => {
|
|
|
valid ? this.editAddress() : console.log('验证失败');
|
|
|
});
|
|
|
},
|
|
|
|
|
|
// 编辑添加地址
|
|
|
editAddress() {
|
|
|
let that = this;
|
|
|
that.$http(
|
|
|
'address.edit',
|
|
|
{
|
|
|
...that.model,
|
|
|
id: that.addressId
|
|
|
},
|
|
|
'保存中...'
|
|
|
).then(res => {
|
|
|
if (res.code === 1) {
|
|
|
that.$Router.back();
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
|
|
|
// 地址信息
|
|
|
getAddressInfo() {
|
|
|
const that = this;
|
|
|
this.$http('address.info', {
|
|
|
id: that.$Route.query.id
|
|
|
}).then(res => {
|
|
|
if (res.code === 1) {
|
|
|
let addressData = res.data;
|
|
|
that.addressId = addressData.id;
|
|
|
that.model.area_text = `${addressData.province_name}-${addressData.city_name}-${addressData.area_name}`;
|
|
|
that.model.is_default = addressData.is_default === '1' ? true : false;
|
|
|
that.model.address = addressData.address;
|
|
|
that.model.phone = addressData.phone;
|
|
|
that.model.consignee = addressData.consignee;
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
|
|
|
// 删除收货地址
|
|
|
deleteAddress() {
|
|
|
const that = this;
|
|
|
that.$http(
|
|
|
'address.del',
|
|
|
{
|
|
|
id: that.addressId
|
|
|
},
|
|
|
'删除中...'
|
|
|
).then(res => {
|
|
|
if (res.code === 1) {
|
|
|
that.$Router.back();
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss">
|
|
|
// 点击定位
|
|
|
.location-item {
|
|
|
font-size: 28rpx;
|
|
|
font-weight: 500;
|
|
|
background-color: #fff;
|
|
|
// color: rgba(167, 111, 13, 1);
|
|
|
color:#17C161;
|
|
|
}
|
|
|
|
|
|
// 表单
|
|
|
.address-box {
|
|
|
background-color: #fff;
|
|
|
padding: 0 30rpx;
|
|
|
border-radius: 20rpx;
|
|
|
margin: 0 24rpx;
|
|
|
}
|
|
|
.address-item {
|
|
|
height: 96rpx;
|
|
|
background: #fff;
|
|
|
border-bottom: 1rpx solid rgba(#dfdfdf, 0.5);
|
|
|
padding: 0 25rpx;
|
|
|
|
|
|
.item-title {
|
|
|
color: #333;
|
|
|
font-size: 28rpx;
|
|
|
white-space: nowrap;
|
|
|
}
|
|
|
.inp {
|
|
|
color: #333;
|
|
|
font-size: 28rpx;
|
|
|
}
|
|
|
}
|
|
|
.area-box {
|
|
|
min-height: 120rpx;
|
|
|
padding-bottom: 60rpx;
|
|
|
background: #fff;
|
|
|
padding: 30rpx 25rpx;
|
|
|
.item-title {
|
|
|
font-size: 28rpx;
|
|
|
line-height: 28rpx;
|
|
|
vertical-align: middle;
|
|
|
white-space: nowrap;
|
|
|
}
|
|
|
.area-inp {
|
|
|
color: #333;
|
|
|
font-size: 28rpx;
|
|
|
vertical-align: middle;
|
|
|
margin-top: 8rpx;
|
|
|
width: 550rpx;
|
|
|
}
|
|
|
}
|
|
|
.default-box {
|
|
|
height: 157rpx;
|
|
|
padding: 0 20rpx;
|
|
|
background: #fff;
|
|
|
|
|
|
border-radius: 20rpx;
|
|
|
margin:0 24rpx;
|
|
|
margin-top: 20rpx;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: space-between;
|
|
|
.title {
|
|
|
font-size: 30rpx;
|
|
|
color: #222222;
|
|
|
}
|
|
|
.subtitle{
|
|
|
color: #999999;
|
|
|
font-size:24rpx;
|
|
|
margin-top:23rpx;
|
|
|
}
|
|
|
.switch {
|
|
|
transform: scale(0.8);
|
|
|
}
|
|
|
}
|
|
|
// 底部按钮
|
|
|
.foot_box {
|
|
|
.delete-btn {
|
|
|
line-height: 70rpx;
|
|
|
background: linear-gradient(93deg, rgba(208, 19, 37, 1), rgba(237, 60, 48, 1));
|
|
|
box-shadow: 0px 7rpx 6rpx 0px rgba(#ed3c30, 0.22);
|
|
|
font-size: 28rpx;
|
|
|
|
|
|
font-weight: 500;
|
|
|
color: rgba(255, 255, 255, 1);
|
|
|
border-radius: 35rpx;
|
|
|
padding: 0;
|
|
|
margin-right: 20rpx;
|
|
|
}
|
|
|
.save-btn {
|
|
|
height: 100rpx;
|
|
|
background: #17C161;
|
|
|
border-radius: 50rpx;
|
|
|
line-height: 100rpx;
|
|
|
color: rgba(#fff,1);
|
|
|
text-align:center;
|
|
|
}
|
|
|
}
|
|
|
</style>
|
|
|
|