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.
172 lines
5.0 KiB
172 lines
5.0 KiB
11 months ago
|
<template>
|
||
|
<div class="address h-100%">
|
||
|
<div class="flex-between-center mb-37px">
|
||
|
<div>
|
||
|
<span class="font18 fontColor333 mr-10px">收货地址({{ addressList.length }})</span>
|
||
|
<span class="text-12px text-#666">最多可添加10条</span>
|
||
|
</div>
|
||
|
<div v-if="addressList.length<10" class="handleBtn w-86px h-30px lh-29px cursors" style="font-size: 14px" @click="handleAddAddress">添加地址</div>
|
||
|
</div>
|
||
|
<div v-loading="listLoading" class="h-82%">
|
||
|
<div v-if="addressList.length">
|
||
|
|
||
|
<div
|
||
|
v-for="item in addressList"
|
||
|
:key="item.id"
|
||
|
class="mb-20px flex-between-center b-rd-16px w-960px h-106px bg-#FAFAFA px-20px py-20px"
|
||
|
>
|
||
|
<div class="text-14px text-#666">
|
||
|
<div class="mb-10px">
|
||
|
<span class="w-70px inline-block mr-6px">收货人:</span>{{ item.realName }}
|
||
|
</div>
|
||
|
<div class="mb-10px">
|
||
|
<span class="w-70px inline-block mr-6px">联系电话:</span>{{ item.phone }}
|
||
|
</div>
|
||
|
<div class="w-815px line1">
|
||
|
<span class="w-70px inline-block mr-6px"
|
||
|
>收货地址:</span
|
||
|
>{{ item.province }}{{ item.city }}{{ item.district }}{{item.street}}{{ item.detail }}
|
||
|
</div>
|
||
|
</div>
|
||
|
<div>
|
||
|
<div class="mb-34px text-right">
|
||
|
<span class="iconfont icon-bianji mr-14px cursors" @click="handleEditAddress(item.id)"></span
|
||
|
><span class="iconfont icon-shanchu cursors" @click="handleDelAddress(item.id)"></span>
|
||
|
</div>
|
||
|
<el-radio-group v-model="defaultId" @change="handleChecked">
|
||
|
<el-radio :label="item.id" size="large">
|
||
|
<div class="text-14px text-#666">{{item.isDefault?'默认地址':'设为默认地址'}}</div>
|
||
|
</el-radio>
|
||
|
</el-radio-group>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
</div>
|
||
|
<div v-else class="w-100% h-100%">
|
||
|
<empty-page title="暂无地址信息呦~">
|
||
|
<template v-slot:emptyImage>
|
||
|
<img src="@/assets/images/wudizhi.png">
|
||
|
</template>
|
||
|
</empty-page>
|
||
|
</div>
|
||
|
</div>
|
||
|
<!--地址弹窗-->
|
||
|
<add-address
|
||
|
ref="userAddAddressRef"
|
||
|
:addressInfo="addressInfo"
|
||
|
:isShowDialog="dialogVisible"
|
||
|
@handleSubmitAddress="handleSubmitAddress"
|
||
|
v-if="dialogVisible"
|
||
|
@handleSubmitClose="handleSubmitClose"
|
||
|
:selAddressData="selAddressData"
|
||
|
></add-address>
|
||
|
</div>
|
||
|
</template>
|
||
|
|
||
|
<script lang="ts" setup>
|
||
|
import {addressListApi, setAddressDefaultApi, addressDelApi, addressDetailApi} from '~/server/userApi'
|
||
|
import feedback from '~/utils/feedback'
|
||
|
import { ref, reactive } from 'vue'
|
||
|
import { AddressInfo } from '~/types/user'
|
||
|
import { addressDefault } from '~/pages/users/defaultUser'
|
||
|
|
||
|
//地址列表
|
||
|
const { data: addressList, pending: listLoading, refresh } = await useAsyncData(async () => addressListApi())
|
||
|
//默认地址选中的值
|
||
|
const defaultId = ref<number>(0)
|
||
|
const getIsDefault = () => {
|
||
|
let data = addressList.value.find((item: any) => item.isDefault)
|
||
|
defaultId.value = data?.id
|
||
|
}
|
||
|
getIsDefault()
|
||
|
|
||
|
/**
|
||
|
* 设置默认地址
|
||
|
*/
|
||
|
const handleChecked = async () => {
|
||
|
await setAddressDefaultApi(defaultId.value)
|
||
|
await feedback.msgSuccess('设置默认地址成功')
|
||
|
await refresh()
|
||
|
}
|
||
|
|
||
|
//地址弹窗
|
||
|
const { bool: dialogVisible, DialogOpen, DialogClose } = useDialog()
|
||
|
|
||
|
//添加地址
|
||
|
const handleAddAddress = async () => {
|
||
|
Object.assign(addressInfo, addressDefault())
|
||
|
selAddressData.value = []
|
||
|
DialogOpen()
|
||
|
}
|
||
|
|
||
|
//关闭弹窗
|
||
|
const handleSubmitClose = () => {
|
||
|
DialogClose()
|
||
|
}
|
||
|
|
||
|
//删除
|
||
|
const handleDelAddress = async (id:number) => {
|
||
|
await feedback.confirm('确认删除该地址吗?')
|
||
|
await addressDelApi(id)
|
||
|
await refresh()
|
||
|
}
|
||
|
|
||
|
//提交地址
|
||
|
const handleSubmitAddress = async () => {
|
||
|
await refresh()
|
||
|
await DialogClose()
|
||
|
await getIsDefault()
|
||
|
}
|
||
|
|
||
|
//编辑地址
|
||
|
const addressInfo = reactive<AddressInfo>(addressDefault())
|
||
|
const selAddressData = ref<any[]>([]) //选中的地址数组
|
||
|
const handleEditAddress = async (id: number) => {
|
||
|
let info =await addressDetailApi(id)
|
||
|
Object.assign(addressInfo, info)
|
||
|
selAddressData.value = [
|
||
|
{
|
||
|
regionName: info.province,
|
||
|
parentId: 1,
|
||
|
isChild: true,
|
||
|
regionId: info.provinceId,
|
||
|
regionType: 1,
|
||
|
},
|
||
|
{
|
||
|
regionName: info.city,
|
||
|
parentId: info.provinceId,
|
||
|
regionId: info.cityId,
|
||
|
isChild: true,
|
||
|
regionType: 2,
|
||
|
},
|
||
|
{
|
||
|
regionName: info.district,
|
||
|
parentId: info.cityId,
|
||
|
regionId: info.districtId,
|
||
|
isChild: true,
|
||
|
regionType: 3,
|
||
|
},
|
||
|
{
|
||
|
isChild: false,
|
||
|
parentId: info.districtId,
|
||
|
regionName: info.street,
|
||
|
regionType: 4,
|
||
|
},
|
||
|
]
|
||
|
DialogOpen()
|
||
|
}
|
||
|
|
||
|
|
||
|
</script>
|
||
|
|
||
|
<style lang="scss" scoped>
|
||
|
@import '@/assets/scss/checkbox.scss';
|
||
|
:deep(.el-radio.el-radio--large .el-radio__inner){
|
||
|
width: 18px !important;
|
||
|
height: 18px !important;
|
||
|
}
|
||
|
:deep(.el-radio) {
|
||
|
height: 0 !important;
|
||
|
}
|
||
|
</style>
|