398 lines
9.8 KiB
Vue
398 lines
9.8 KiB
Vue
![]() |
<template>
|
|||
|
<NavBar />
|
|||
|
<view class="container">
|
|||
|
<view class="title">
|
|||
|
<PageTitle :title="$t('activity.pointExchange')" />
|
|||
|
</view>
|
|||
|
<view class="content">
|
|||
|
<Spin v-show="loading" />
|
|||
|
<view class="goods-info" v-if="info">
|
|||
|
<image :src="info.imgs.split(',')[0]" class="img"></image>
|
|||
|
<view class="info">
|
|||
|
<view class="order-title">{{ info.goods_name }}</view>
|
|||
|
<view class="order-point">
|
|||
|
<text class="point">{{ info.integral }}</text>
|
|||
|
<text>{{ ' ' + $t('activity.point') + ' x1' }}</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="address-info" v-if="info">
|
|||
|
<view class="item">
|
|||
|
<image src="../../../static/shop/recipients.svg" class="icon"></image>
|
|||
|
<view class="item-content">
|
|||
|
<view class="label">{{ $t('activity.recipients') }}</view>
|
|||
|
<view class="value">{{ addr.user_name }}</view>
|
|||
|
</view>
|
|||
|
<view class="item-btn">
|
|||
|
<button class="mini-btn" size="mini" style="flex-grow: 0; margin-right: 0; font-size: 24upx; font-weight: 400" @click="goAddress">
|
|||
|
{{ $t('activity.addrMgr') }}
|
|||
|
</button>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="item">
|
|||
|
<image src="../../../static/shop/phone.svg" class="icon"></image>
|
|||
|
<view class="item-content">
|
|||
|
<view class="label">{{ $t('activity.phone') }}</view>
|
|||
|
<view class="value">{{ addr.user_phone }}</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="item">
|
|||
|
<image src="../../../static/shop/addr.svg" class="icon"></image>
|
|||
|
<view class="item-content">
|
|||
|
<view class="label">{{ $t('activity.addr') }}</view>
|
|||
|
<view class="value">
|
|||
|
{{ (addr.userCountry ? addr.userCountry + ' ' : '') + (addr.userCity ? addr.userCity + ' ' : '') + (addr.userAddr ? addr.userAddr : '') }}
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view style="margin-top: 76upx" v-if="info">
|
|||
|
<button class="primaryButton" style="font-size: 32upx; font-weight: 400" @click="openApplyDialog">
|
|||
|
{{ $t('activity.exchange') }}
|
|||
|
</button>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<uni-popup ref="applyDialog" mask-background-color="transparent" :isMaskClick="false">
|
|||
|
<view class="formDialog">
|
|||
|
<view class="searchForm">
|
|||
|
<uni-forms ref="searchForm" :modelValue="applyFormData">
|
|||
|
<uni-row>
|
|||
|
<uni-col :span="24">
|
|||
|
<uni-forms-item :label="$t('activity.goodsName')">
|
|||
|
<view style="height: 100%; display: flex; align-items: center">{{ info.goods_name }}</view>
|
|||
|
</uni-forms-item>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="24">
|
|||
|
<uni-forms-item :label="$t('activity.point')">
|
|||
|
<view style="height: 100%; display: flex; align-items: center">{{ info.integral }}</view>
|
|||
|
</uni-forms-item>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="24">
|
|||
|
<uni-forms-item :label="$t('activity.country')">
|
|||
|
<view style="height: 100%; display: flex; align-items: center">{{ addr.userCountry }}</view>
|
|||
|
</uni-forms-item>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="24">
|
|||
|
<uni-forms-item :label="$t('activity.userCity')">
|
|||
|
<view style="height: 100%; display: flex; align-items: center">{{ addr.userCity }}</view>
|
|||
|
</uni-forms-item>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="24">
|
|||
|
<uni-forms-item :label="$t('activity.addr')">
|
|||
|
<view style="height: 100%; display: flex; align-items: center">{{ addr.userAddr }}</view>
|
|||
|
</uni-forms-item>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="24">
|
|||
|
<uni-forms-item :label="$t('activity.phone')">
|
|||
|
<view style="height: 100%; display: flex; align-items: center">{{ addr.user_phone }}</view>
|
|||
|
</uni-forms-item>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="24">
|
|||
|
<uni-forms-item :label="$t('activity.recipients')">
|
|||
|
<view style="height: 100%; display: flex; align-items: center">{{ addr.user_name }}</view>
|
|||
|
</uni-forms-item>
|
|||
|
</uni-col>
|
|||
|
<uni-col :span="24">
|
|||
|
<uni-forms-item :label="$t('form.remark.label')">
|
|||
|
<uni-easyinput primaryColor="#29BBE4" v-model="applyFormData.remark" />
|
|||
|
</uni-forms-item>
|
|||
|
</uni-col>
|
|||
|
</uni-row>
|
|||
|
</uni-forms>
|
|||
|
<view class="submitter">
|
|||
|
<button :disabled="submitBtnLoading" class="primaryButton" @click="save">
|
|||
|
<image v-show="submitBtnLoading" src="/static/loadingCircle.svg" mode="aspectFit" style="width: 16px; height: 16px"></image>
|
|||
|
{{ $t('common.okText') }}
|
|||
|
</button>
|
|||
|
<button class="secondaryButton" @click="closeApplyDialog">
|
|||
|
{{ $t('common.cancelText') }}
|
|||
|
</button>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</uni-popup>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import { getGoodsInfo, dh } from '@/services/activity/shop';
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
return {
|
|||
|
id: undefined,
|
|||
|
info: null,
|
|||
|
addr: null,
|
|||
|
loading: false,
|
|||
|
submitBtnLoading: false,
|
|||
|
applyFormData: {
|
|||
|
id: undefined,
|
|||
|
remark: undefined
|
|||
|
}
|
|||
|
};
|
|||
|
},
|
|||
|
methods: {
|
|||
|
openApplyDialog() {
|
|||
|
this.applyFormData.id = this.info.id;
|
|||
|
this.applyFormData.remark = undefined;
|
|||
|
this.$refs.applyDialog.open();
|
|||
|
},
|
|||
|
closeApplyDialog() {
|
|||
|
this.$refs.applyDialog.close();
|
|||
|
this.applyFormData.id = undefined;
|
|||
|
this.applyFormData.remark = undefined;
|
|||
|
},
|
|||
|
isEmpty(str) {
|
|||
|
if (this.isNumber(str)) str = str + '' //改为字符串,避免传入Number判定为空 add by mb 0526
|
|||
|
if (str == "undefined" || str == 'null' || str == null || str == "" || str == undefined) {
|
|||
|
return true;
|
|||
|
} else {
|
|||
|
return false;
|
|||
|
}
|
|||
|
},
|
|||
|
isNumber(value) {
|
|||
|
return typeof value === 'number' && !isNaN(value);
|
|||
|
},
|
|||
|
async save() {
|
|||
|
this.submitBtnLoading = true;
|
|||
|
let data = {
|
|||
|
...this.applyFormData,
|
|||
|
delivery_address: this.addr.userAddr,
|
|||
|
phone: this.addr.user_phone,
|
|||
|
recipients: this.addr.user_name,
|
|||
|
country: this.addr.userCountry,
|
|||
|
city: this.addr.userCity
|
|||
|
};
|
|||
|
if (this.isEmpty(data.delivery_address) || this.isEmpty(data.phone) || this.isEmpty(data.recipients)) {
|
|||
|
this.closeApplyDialog();
|
|||
|
this.$nextTick(() => {
|
|||
|
this.$cusModal.showModal({
|
|||
|
type: 'message',
|
|||
|
status: 'warning',
|
|||
|
contentText: this.$t('activity.addressErrorTips')
|
|||
|
});
|
|||
|
})
|
|||
|
return
|
|||
|
}
|
|||
|
const resp = await dh(data);
|
|||
|
this.submitBtnLoading = false;
|
|||
|
if (resp.code == 0) {
|
|||
|
this.closeApplyDialog();
|
|||
|
this.$nextTick(() => {
|
|||
|
this.$cusModal.showModal({
|
|||
|
type: 'message',
|
|||
|
status: 'success',
|
|||
|
contentText: this.$t('activity.dh'),
|
|||
|
onClose() {
|
|||
|
uni.redirectTo({
|
|||
|
url: '/pages/activity/shop/myOrder'
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
})
|
|||
|
} else if (resp.msg == 'kcbz' || resp.msg == 'jfbz' || resp.msg == 'sqgd') {
|
|||
|
this.closeApplyDialog();
|
|||
|
this.$nextTick(() => {
|
|||
|
this.$cusModal.showModal({
|
|||
|
type: 'message',
|
|||
|
status: 'warning',
|
|||
|
contentText: this.$t('activity.' + resp.msg)
|
|||
|
});
|
|||
|
})
|
|||
|
} else {
|
|||
|
this.closeApplyDialog();
|
|||
|
this.$nextTick(() => {
|
|||
|
this.$cusModal.showModal({
|
|||
|
type: 'message',
|
|||
|
status: 'warning',
|
|||
|
contentText: resp.msg ?? this.$t('common.error.sysError')
|
|||
|
});
|
|||
|
})
|
|||
|
}
|
|||
|
},
|
|||
|
goAddress() {
|
|||
|
uni.navigateTo({
|
|||
|
url: '/pages/activity/shop/address'
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
onLoad(options) {
|
|||
|
uni.$on('changeAddr', (data) => {
|
|||
|
this.addr = {
|
|||
|
userCountry: data.country,
|
|||
|
userCity: data.city,
|
|||
|
user_name: data.recipients,
|
|||
|
userAddr: data.delivery_address,
|
|||
|
user_phone: data.phone
|
|||
|
};
|
|||
|
});
|
|||
|
const { goods } = options;
|
|||
|
this.id = goods;
|
|||
|
this.loading = true;
|
|||
|
getGoodsInfo({ id: goods })
|
|||
|
.then((resp) => {
|
|||
|
if (resp.code == 0) {
|
|||
|
this.info = resp.data.info;
|
|||
|
resp.data.info = null;
|
|||
|
this.addr = resp.data;
|
|||
|
}
|
|||
|
this.loading = false;
|
|||
|
})
|
|||
|
.catch(() => {
|
|||
|
this.loading = false;
|
|||
|
});
|
|||
|
},
|
|||
|
onUnload() {
|
|||
|
uni.$off('changeAddr');
|
|||
|
}
|
|||
|
};
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
.container {
|
|||
|
padding: 0 40upx 162upx;
|
|||
|
.title {
|
|||
|
margin: 14px 0 15px;
|
|||
|
}
|
|||
|
.content {
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
margin-top: 40upx;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.goods-info {
|
|||
|
width: 100%;
|
|||
|
display: flex;
|
|||
|
box-shadow: -1px 0px 5px 1px rgba(0, 0, 0, 0.15);
|
|||
|
padding: 32upx;
|
|||
|
box-sizing: border-box;
|
|||
|
margin-bottom: 34upx;
|
|||
|
|
|||
|
.img {
|
|||
|
width: 272upx;
|
|||
|
height: 152upx;
|
|||
|
vertical-align: bottom;
|
|||
|
margin-right: 40upx;
|
|||
|
flex-shrink: 0;
|
|||
|
}
|
|||
|
|
|||
|
.info {
|
|||
|
flex-grow: 1;
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
justify-content: space-between;
|
|||
|
|
|||
|
.order-title {
|
|||
|
font-size: 40upx;
|
|||
|
font-weight: 700;
|
|||
|
color: rgba(51, 51, 51, 1);
|
|||
|
}
|
|||
|
|
|||
|
.order-point {
|
|||
|
margin-top: 20upx;
|
|||
|
color: rgba(102, 102, 102, 1);
|
|||
|
font-size: 28upx;
|
|||
|
font-weight: 400;
|
|||
|
|
|||
|
.point {
|
|||
|
color: rgba(41, 187, 228, 1);
|
|||
|
font-size: 28upx;
|
|||
|
font-weight: 400;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.address-info {
|
|||
|
width: 100%;
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
box-shadow: -1px 0px 5px 1px rgba(0, 0, 0, 0.15);
|
|||
|
padding: 40upx;
|
|||
|
box-sizing: border-box;
|
|||
|
|
|||
|
.item:not(:last-of-type) {
|
|||
|
margin-bottom: 40upx;
|
|||
|
}
|
|||
|
|
|||
|
.item {
|
|||
|
display: flex;
|
|||
|
flex-wrap: nowrap;
|
|||
|
|
|||
|
.icon {
|
|||
|
width: 40upx;
|
|||
|
height: 40upx;
|
|||
|
vertical-align: bottom;
|
|||
|
margin-right: 28upx;
|
|||
|
flex-shrink: 0;
|
|||
|
}
|
|||
|
|
|||
|
.item-content {
|
|||
|
flex-shrink: 1;
|
|||
|
flex-grow: 1;
|
|||
|
|
|||
|
.label {
|
|||
|
font-size: 36upx;
|
|||
|
font-weight: 700;
|
|||
|
color: rgba(51, 51, 51, 1);
|
|||
|
margin-bottom: 10upx;
|
|||
|
}
|
|||
|
|
|||
|
.value {
|
|||
|
font-size: 32upx;
|
|||
|
font-weight: 400;
|
|||
|
color: rgba(119, 119, 119, 1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.item-btn {
|
|||
|
flex-shrink: 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.mini-btn {
|
|||
|
flex: 1;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
// height: 40px;
|
|||
|
color: #fff;
|
|||
|
background-color: rgba(41, 187, 228, 1);
|
|||
|
border-radius: 0px;
|
|||
|
cursor: pointer;
|
|||
|
|
|||
|
&::after {
|
|||
|
border: none;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.formDialog {
|
|||
|
padding: 0 14px;
|
|||
|
.searchForm {
|
|||
|
padding: 28px 16px;
|
|||
|
background: #fff;
|
|||
|
box-shadow: -1px 0px 5px 1px rgba(0, 0, 0, 0.15);
|
|||
|
}
|
|||
|
.submitter {
|
|||
|
display: flex;
|
|||
|
column-gap: 10px;
|
|||
|
color: #fff;
|
|||
|
.confirmBtn,
|
|||
|
.cancelBtn {
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
height: 40px;
|
|||
|
flex: 1;
|
|||
|
}
|
|||
|
.confirmBtn {
|
|||
|
background-color: rgba(77, 192, 229, 1);
|
|||
|
}
|
|||
|
.cancelBtn {
|
|||
|
background-color: rgba(15, 54, 117, 1);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|