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.
303 lines
7.6 KiB
303 lines
7.6 KiB
<template>
|
|
<view class="address-popup-box" :class="{'address-popup-box--page': pageMode}">
|
|
<view v-if="!hideHeader" :style="headerStyle" :class="{'address-header-page': pageMode}">
|
|
<uni-icons v-if="pageMode" type="left" size="24" @tap="$emit('close')" class="address-back-icon"
|
|
:style="backIconStyle"></uni-icons>
|
|
<text class="address-header-title">收货地址</text>
|
|
<uni-icons v-if="!pageMode" type="closeempty" size="24" @tap="$emit('close')" style="position:absolute;right:30rpx;top:20rpx;"></uni-icons>
|
|
</view>
|
|
<view style="padding-bottom: 140rpx;">
|
|
<view v-for="(item, index) in addressList" :key="index" @tap="selectAddress(item)"
|
|
class="address-item">
|
|
<view class="address-info">
|
|
<view class="address-title-row">
|
|
<text v-if="item.isDefault == 1" class="address-default-tag">默认</text>
|
|
<text class="address-title">{{item.areaName || ''}}{{item.floor ? item.floor + '层' : ''}}{{item.roomNum || ''}}</text>
|
|
</view>
|
|
<view style="color: #777;">
|
|
{{item.receiverName}} {{item.receiverPhone}}
|
|
</view>
|
|
</view>
|
|
<view class="address-actions">
|
|
<view @tap.stop="openEdit(item)"
|
|
style="width: 88rpx;height: 50rpx;line-height: 50rpx;text-align: center;border: 1px solid #777;border-radius: 50rpx;color: #777;">
|
|
编辑
|
|
</view>
|
|
<view @tap.stop="deleteAddress(item.id)"
|
|
style="width: 88rpx;height: 50rpx;line-height: 50rpx;text-align: center;border: 1px solid #e43d33;border-radius: 50rpx;color: #e43d33;">
|
|
删除
|
|
</view>
|
|
</view>
|
|
</view>
|
|
|
|
<view v-if="addressList.length === 0" style="text-align: center;color: #999;margin-top: 100rpx;">
|
|
暂无收货地址
|
|
</view>
|
|
</view>
|
|
<view class="bottom-btn" @tap="openAdd">
|
|
新增地址
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
pageMode: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
hideHeader: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
safeTop: {
|
|
type: Number,
|
|
default: 0
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
addressList: []
|
|
}
|
|
},
|
|
created() {
|
|
this.getAddressList();
|
|
},
|
|
computed: {
|
|
headerStyle() {
|
|
if (this.pageMode) {
|
|
return {
|
|
height: (this.safeTop + 58) + 'px',
|
|
lineHeight: '44px',
|
|
paddingTop: this.safeTop + 'px',
|
|
fontSize: '36rpx',
|
|
fontWeight: 700,
|
|
textAlign: 'center',
|
|
position: 'relative',
|
|
boxSizing: 'border-box'
|
|
}
|
|
}
|
|
return {
|
|
height: '120rpx',
|
|
lineHeight: '120rpx',
|
|
fontSize: '36rpx',
|
|
fontWeight: 700,
|
|
textAlign: 'center',
|
|
position: 'relative'
|
|
}
|
|
},
|
|
backIconStyle() {
|
|
return {
|
|
position: 'absolute',
|
|
left: '30rpx',
|
|
top: (this.safeTop + 10) + 'px'
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
getCurrentRegionId() {
|
|
try {
|
|
const area = uni.getStorageSync('area');
|
|
if (!area) return '';
|
|
if (typeof area === 'object') return area.id ? String(area.id) : '';
|
|
const areaInfo = JSON.parse(area);
|
|
return areaInfo.id ? String(areaInfo.id) : '';
|
|
} catch (e) {
|
|
return '';
|
|
}
|
|
},
|
|
getAddressList() {
|
|
let that = this;
|
|
that.tui.request("/app/userAddress/list", "GET", {
|
|
userId: uni.getStorageSync('id'),
|
|
regionId: this.getCurrentRegionId()
|
|
}, false, true).then((res) => {
|
|
if (res.code == 200) {
|
|
that.addressList = res.result || [];
|
|
that.syncCache();
|
|
}
|
|
}).catch(() => {});
|
|
},
|
|
syncCache() {
|
|
let cached = uni.getStorageSync('selectedAddress');
|
|
let pending = uni.getStorageSync('pendingSelectedAddress');
|
|
let nextSelect = null;
|
|
if (this.addressList.length > 0) {
|
|
if (pending && pending.id) {
|
|
nextSelect = this.addressList.find(a => String(a.id) === String(pending.id));
|
|
}
|
|
if (!nextSelect && pending) {
|
|
nextSelect = this.addressList.find(a => {
|
|
return String(a.regionId || '') === String(pending.regionId || '') &&
|
|
String(a.areaId || '') === String(pending.areaId || '') &&
|
|
String(a.floor || '') === String(pending.floor || '') &&
|
|
String(a.roomNum || '') === String(pending.roomNum || '') &&
|
|
String(a.receiverName || '') === String(pending.receiverName || '') &&
|
|
String(a.receiverPhone || '') === String(pending.receiverPhone || '');
|
|
});
|
|
}
|
|
if (!nextSelect && cached && cached.id) {
|
|
// Look for the cached address in the fresh list to obtain updated fields if any
|
|
nextSelect = this.addressList.find(a => String(a.id) === String(cached.id));
|
|
}
|
|
if (!nextSelect) {
|
|
// If cached address was deleted or none existed, fallback to default or first
|
|
nextSelect = this.addressList.find(a => a.isDefault == 1) || this.addressList[0];
|
|
}
|
|
}
|
|
if (nextSelect) {
|
|
uni.setStorageSync('selectedAddress', nextSelect);
|
|
this.$emit('syncAddress', nextSelect);
|
|
} else {
|
|
uni.removeStorageSync('selectedAddress');
|
|
this.$emit('syncAddress', null);
|
|
}
|
|
if (pending) uni.removeStorageSync('pendingSelectedAddress');
|
|
uni.removeStorageSync('addressListNeedsRefresh');
|
|
},
|
|
selectAddress(item) {
|
|
this.$emit('selectAddress', item);
|
|
},
|
|
openAdd() {
|
|
if (!this.pageMode) uni.setStorageSync('keepAddressBookOpen', '1');
|
|
uni.navigateTo({
|
|
url: '/package1/address/addAddress'
|
|
});
|
|
},
|
|
openEdit(item) {
|
|
uni.setStorageSync('editingAddress', item);
|
|
if (!this.pageMode) uni.setStorageSync('keepAddressBookOpen', '1');
|
|
uni.navigateTo({
|
|
url: '/package1/address/addAddress?id=' + item.id
|
|
});
|
|
},
|
|
deleteAddress(id) {
|
|
let that = this;
|
|
uni.showModal({
|
|
title: '提示',
|
|
content: '确定要删除该地址吗?',
|
|
success: function (res) {
|
|
if (res.confirm) {
|
|
that.tui.request("/app/userAddress/delById", "POST", {id: id}, false, true).then((res) => {
|
|
if (res.code == 200) {
|
|
that.tui.toast("删除成功",1000);
|
|
that.getAddressList();
|
|
} else {
|
|
that.tui.toast(res.message,1000);
|
|
}
|
|
}).catch(() => {});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.address-popup-box {
|
|
height: 1200rpx;
|
|
}
|
|
|
|
.address-popup-box--page {
|
|
min-height: 100vh;
|
|
height: auto;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.address-header-page {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: center;
|
|
}
|
|
|
|
.address-header-page .address-header-title {
|
|
display: block;
|
|
width: 100%;
|
|
height: 44px;
|
|
line-height: 44px;
|
|
text-align: center;
|
|
}
|
|
|
|
.address-back-icon {
|
|
z-index: 2;
|
|
}
|
|
|
|
.address-item {
|
|
margin-bottom: 20rpx;
|
|
display: flex;
|
|
align-items: flex-start;
|
|
padding: 20rpx 40rpx 40rpx;
|
|
background: rgba(247, 248, 248, 0.6);
|
|
border-radius: 20rpx;
|
|
}
|
|
|
|
.address-info {
|
|
flex: 1;
|
|
min-width: 0;
|
|
padding-right: 20rpx;
|
|
}
|
|
|
|
.address-title-row {
|
|
min-height: 70rpx;
|
|
display: flex;
|
|
align-items: flex-start;
|
|
padding-top: 10rpx;
|
|
}
|
|
|
|
.address-default-tag {
|
|
flex-shrink: 0;
|
|
margin-top: 8rpx;
|
|
margin-right: 10rpx;
|
|
padding: 4rpx 12rpx;
|
|
border-radius: 8rpx;
|
|
background: red;
|
|
color: #fff;
|
|
font-size: 20rpx;
|
|
line-height: 1;
|
|
}
|
|
|
|
.address-title {
|
|
flex: 1;
|
|
min-width: 0;
|
|
font-size: 30rpx;
|
|
font-weight: 700;
|
|
line-height: 42rpx;
|
|
word-break: break-all;
|
|
overflow-wrap: break-word;
|
|
}
|
|
|
|
.address-actions {
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 20rpx;
|
|
padding-top: 25rpx;
|
|
}
|
|
|
|
.bottom-btn {
|
|
width: 90%;
|
|
height: 100rpx;
|
|
background: linear-gradient(90deg, #e3ff96, #a6ffea);
|
|
font-size: 26rpx;
|
|
font-weight: 700;
|
|
line-height: 100rpx;
|
|
text-align: center;
|
|
border-radius: 100rpx;
|
|
margin: 20rpx auto;
|
|
position: fixed;
|
|
bottom: 20rpx;
|
|
box-sizing: border-box;
|
|
z-index: 20;
|
|
}
|
|
|
|
.bottom-btn--disabled {
|
|
opacity: 0.65;
|
|
}
|
|
|
|
.address-popup-box--page>.bottom-btn {
|
|
left: 5%;
|
|
}
|
|
|
|
</style>
|