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.

357 lines
9.4 KiB

2 years ago
<!-- 添加修改地址 -->
<template>
2 years ago
<view class="address-wrap" style="padding:0 24rpx;padding-top:46rpx;">
2 years ago
<u-form :model="model" :rules="rules" ref="uForm" :errorType="errorType">
<!-- 地址定位 -->
2 years ago
<view class="location-item u-flex u-row-between u-m-b-20" @tap="getLocation">
2 years ago
<view class="u-flex">
<text class="u-iconfont uicon-map-fill" style="#a76f0d;"></text>
<text>{{ chooseAddress }}</text>
</view>
2 years ago
<text class="u-iconfont uicon-arrow-right" style="color: #222222"></text>
2 years ago
</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-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-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">
<text class="title">设为默认地址</text>
<u-switch v-model="model.is_default" activeColor="#e9b461" size="40"></u-switch>
</view>
<!-- 功能按钮 -->
2 years ago
<view class="foot_box 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-reset-button save-btn u-flex-1" @tap="submit">保存收货地址</button>
2 years ago
</view>
</u-form>
<!-- 省市区选择器 -->
<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, //省市区
addressAreaList: [],
addressId: 0, //收货地址ID
labelStyle: {
2 years ago
'font-size': '30rpx',
// 'font-weight': '600',
'color': '#999999',
2 years ago
},
model: {
id: 0,
consignee: '',
phone: '',
area_text: '',
address: '',
is_default: false,
latitude: '',
longitude: ''
},
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'],
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.$Route.query.addressData && this.wxAddressInit();
},
methods: {
// 获取省市区
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]);
});
});
}
});
},
// 微信导入数据格式
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}`;
},
// 获取定位
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.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.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;
2 years ago
padding:29rpx 20rpx;
2 years ago
font-weight: 500;
background-color: #fff;
2 years ago
// color: rgba(167, 111, 13, 1);
border-radius: 20rpx;
font-size: 30rpx;
font-family: PingFang SC;
font-weight: 500;
color: #222222;
2 years ago
}
// 表单
.address-box {
background-color: #fff;
padding: 0 30rpx;
2 years ago
border-radius:20rpx;
2 years ago
}
.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: 100rpx;
padding: 0 25rpx;
background: #fff;
margin-top: 20rpx;
2 years ago
border-radius:20rpx;
2 years ago
.title {
font-size: 28rpx;
}
.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 {
2 years ago
height: 100rpx;
background: #F0D2A0;
border-radius: 50rpx;
font-size: 30rpx;
font-family: PingFang SC;
font-weight: 500;
color: #09090B;
line-height: 100rpx;
2 years ago
}
}
</style>