252 lines
6.2 KiB
Vue

<template>
<view class="container" :style="appThemeStyle">
<view class="addres-list">
<view class="address-item" v-for="(item, index) in list" :key="index">
<view class="contacts">
<text class="name">{{ item.buyerName }}</text>
<text class="phone">{{ item.buyerPhone }}</text>
</view>
<view class="address">
<text class="region" v-for="(region, idx) in item.region" :key="idx">{{ region }}</text>
<text class="detail">{{ item.detail }}</text>
</view>
<view class="line"></view>
<view class="item-option">
<view class="_left">
<view class="item-radio">
<u-radio-group v-model="defaultId" @change="handleSetDefault(item.id)">
<u-radio :name="item.id" :active-color="appTheme.mainBg">默认</u-radio>
</u-radio-group>
</view>
</view>
<view class="_right">
<view class="events">
<view class="event-item" @click="handleUpdate(item)">
<text class="iconfont icon-edit"></text>
<text class="title">编辑</text>
</view>
<view class="event-item" @click="handleRemove(item.id)">
<text class="iconfont icon-delete"></text>
<text class="title">删除</text>
</view>
</view>
</view>
</view>
</view>
</view>
<empty v-if="!list.length" :isLoading="isLoading" tips="亲,暂无收货地址" />
<!-- 底部操作按钮 -->
<view class="footer-fixed">
<view class="btn-wrapper">
<view class="btn-item btn-item-main" @click="handleCreate()">添加新地址</view>
</view>
</view>
</view>
</template>
<script>
import * as AddressApi from '@/api/address'
import * as OrderApi from '@/api/order'
import Empty from '@/components/empty'
export default {
components: {
Empty
},
data() {
return {
options: {},
isLoading: true,
list: [],
defaultId: null
}
},
onLoad(options) {
// 当前页面参数
this.options = options
},
onShow() {
this.getPageData()
},
methods: {
getPageData() {
const app = this
app.isLoading = true
OrderApi.apiGetAddressList({}).then(res => {
const rows = res.data.rows.map(item => {
return {
...item,
region: [item.province, item.city, item.district]
}
});
const defaultItemIndex = rows.findIndex(item => item.status === 'default');
if (defaultItemIndex !== -1) {
const [defaultItem] = rows.splice(defaultItemIndex, 1);
app.defaultId = defaultItem.id;
app.list = [defaultItem, ...rows];
} else {
app.list = rows;
}
})
.finally(() => app.isLoading = false)
},
// 添加新地址
handleCreate() {
this.$goPageByToken('pages/address/create')
},
// 编辑地址
handleUpdate(item) {
const data = encodeURIComponent(JSON.stringify(item))
this.$goPageByToken('pages/address/update', { data })
},
// 删除收货地址
handleRemove(addressId) {
const app = this
uni.showModal({
title: "提示",
content: "您确定要删除当前收货地址吗?",
success({ confirm }) {
confirm && app.onRemove(addressId)
}
});
},
// 确认删除收货地址
onRemove(addressId) {
const app = this
OrderApi.apiInsertOrUpdateAddress({ id: addressId, status: 'deleted' })
.then(result => {
app.getPageData()
})
},
// 设置为默认地址
handleSetDefault(addressId) {
const app = this
OrderApi.apiInsertOrUpdateAddress({ id: addressId, status: 'default' })
.then(() => {
app.options.from === 'checkout' && uni.navigateBack()
})
}
}
}
</script>
<style lang="scss" scoped>
.addres-list {
padding-top: 20rpx;
// 设置ios刘海屏底部横线安全区域
padding-bottom: calc(constant(safe-area-inset-bottom) + 140rpx);
padding-bottom: calc(env(safe-area-inset-bottom) + 140rpx);
}
// 项目内容
.address-item {
margin: 0 auto 20rpx auto;
padding: 30rpx 40rpx;
width: 94%;
box-shadow: 0 1rpx 5rpx 0 rgba(0, 0, 0, 0.05);
border-radius: 16rpx;
background: #fff;
}
.contacts {
font-size: 30rpx;
margin-bottom: 16rpx;
.name {
margin-right: 16rpx;
}
}
.address {
font-size: 28rpx;
.region {
margin-right: 10rpx;
}
}
.line {
margin: 20rpx 0;
border-bottom: 1rpx solid #f3f3f3;
}
.item-option {
display: flex;
justify-content: space-between;
height: 48rpx;
// 单选框
.item-radio {
font-size: 28rpx;
.radio {
vertical-align: middle;
transform: scale(0.76)
}
.text {
vertical-align: middle;
}
}
// 操作
.events {
display: flex;
align-items: center;
line-height: 48rpx;
.event-item {
font-size: 28rpx;
margin-right: 26rpx;
color: #4c4c4c;
&:last-child {
margin-right: 0;
}
.title {
margin-left: 8rpx;
}
}
}
}
// 底部操作栏
.footer-fixed {
position: fixed;
bottom: var(--window-bottom);
left: var(--window-left);
right: var(--window-right);
z-index: 11;
// 设置ios刘海屏底部横线安全区域
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
.btn-wrapper {
height: 120rpx;
padding: 0 40rpx;
}
.btn-item {
flex: 1;
font-size: 28rpx;
height: 86rpx;
color: #fff;
border-radius: 50rpx;
display: flex;
justify-content: center;
align-items: center;
box-shadow: 0 1rpx 5rpx 0 rgba(0, 0, 0, 0.05);
}
.btn-item-main {
background: linear-gradient(to right, $main-bg, $main-bg2);
color: $main-text;
}
}
</style>