2026-07-27 11:26:39 +08:00

154 lines
4.6 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<uni-popup ref="popup" type="bottom" :mask-click="false">
<view class="bg-white" :style="elderVarStyle">
<view class="border-b flex items-center justify-between px-15 py-12">
<view class="text-base text-dark">请选择收货地址</view>
<uni-icons type="closeempty" :size="elderMode ? 32 : 24" color="#999" @click="close"></uni-icons>
</view>
<scroll-view scroll-y="true" class="popup-content-scroll">
<view class="px-15 py-12">
<view v-for="(i, idx) in list" :key="i.id" class="bg-white rounded shadow-lg" :class="idx > 0 ? 'mt-12' : ''"
@click="select(i)">
<view class="px-15 border-b">
<view v-if="i.region && i.region.length" class="py-10 text-base text-gray">
{{ i.region.join(' ') }}
</view>
<view class="pb-10 text-base text-dark">{{ i.address }}</view>
<view class="pb-10 text-base text-dark">{{ i.name }} {{ i.phone }}</view>
</view>
<view class="flex items-center justify-between px-15 py-10">
<view class="flex-shrink-0 text-base" :class="i.isDefault ? 'text-primary' : 'text-gray'"
@click.stop="setDefault(i)">
{{ i.isDefault ? '默认地址' : '设为默认地址' }}
</view>
<view class="flex">
<view class="mr-10 text-base text-danger" @click.stop="remove(i.id)">删除</view>
<view class="mr-10 text-base text-primary" @click.stop="changeAddress(i)">编辑</view>
</view>
</view>
</view>
</view>
</scroll-view>
<view class="text-danger p-15">
<view class="text-base leading-normal">地址管理规则:</view>
<view class="text-base leading-normal">1每人最多可保存3个常用地址;</view>
<view class="text-base leading-normal">2任意变更操作(删除/修改)地址信息将锁定30天无法变更请谨慎操作</view>
</view>
<view v-if="list.length < 3" class="footer-buttons">
<footer-buttons :showCancel="false" confirmText="新增地址" @confirm="changeAddress()" />
</view>
</view>
</uni-popup>
</template>
<script setup>
import { ref, watch, onMounted, onUnmounted } from 'vue';
import useElder from '@/hooks/useElder';
import { getAddressList, deleteAddress, updateAddress } from '@/utils/api';
import { set } from '@/utils/cache';
import { confirm, loading, hideLoading, toast } from '@/utils/widget';
import FooterButtons from '@/components/footer-buttons.vue';
const emits = defineEmits(['close', 'confirm'])
const props = defineProps({
accountId: {
type: String,
default: ''
},
visible: {
type: Boolean,
default: false
}
})
const popup = ref()
const { elderMode, elderVarStyle } = useElder();
const list = ref([]);
function close() {
emits('close')
}
function select(i) {
emits('confirm', i)
}
function changeAddress(item) {
if (item) {
set('current-address', item)
}
uni.navigateTo({
url: `/pages/member/address?id=${item ? item.id : ''}`
})
}
async function getList() {
loading('请求中...')
const res = await getAddressList(props.accountId)
hideLoading()
list.value = res && Array.isArray(res.data) ? res.data : [];
if (!res || !res.success) {
toast(res && res.message ? res.message : '获取地址列表失败');
}
}
async function remove(id) {
await confirm('确定删除该地址吗?');
const res = await deleteAddress(props.accountId, id)
if (res && res.success) {
toast('删除成功');
list.value = list.value.filter(i => i.id !== id);
} else {
toast(res && res.message ? res.message : '删除失败');
}
}
async function setDefault(i) {
if (i.isDefault) return;
const item = { ...i, isDefault: true, accountId: props.accountId }
loading('请求中...')
const res = await updateAddress(item);
hideLoading()
if (res && res.success) {
list.value.forEach(j => {
j.isDefault = j.id === i.id
});
await toast('设置默认地址成功');
} else {
toast(res && res.message ? res.message : '设置默认地址失败');
}
}
watch(() => props.visible, n => {
if (n) {
popup.value && popup.value.open()
getList()
} else {
popup.value && popup.value.close()
}
})
onMounted(() => {
uni.$on('change-account-address', getList)
})
onUnmounted(() => {
uni.$off('change-account-address', getList)
})
</script>
<style lang="scss" scoped>
.popup-title {
font-size: var(--text-base);
font-weight: bold;
color: #333;
}
.popup-content-scroll {
max-height: 65vh;
background-color: #f5f5f5;
}
</style>