@ -0,0 +1,111 @@ | |||||
<template> | |||||
<view class="card flex store"> | |||||
<image class="store-img" :src="data.imgUrl"></image> | |||||
<view class="store-info"> | |||||
<view class="store-name">{{ data.name }}</view> | |||||
<view class="store-desc">{{ `地址:${data.address}` }}</view> | |||||
<view class="store-desc">{{ `联系方式:${data.phone}` }}</view> | |||||
<view class="store-contact"> | |||||
<button plain class="flex btn" @click="onCall(data.phone)"> | |||||
<image class="btn-icon" src="../../static/voucher/icon-phone.png" mode="widthFix"></image> | |||||
<text>电话</text> | |||||
</button> | |||||
<button plain class="flex btn" @click="openLocation(data.latitude, data.longitude)"> | |||||
<image class="btn-icon" src="../../static/voucher/icon-address.png" mode="widthFix"></image> | |||||
<text>导航</text> | |||||
</button> | |||||
</view> | |||||
</view> | |||||
</view> | |||||
</template> | |||||
<script> | |||||
const TEST_DATA = { | |||||
id: '001', | |||||
imgUrl: 'http://gips3.baidu.com/it/u=70459541,3412285454&fm=3028&app=3028&f=JPEG&fmt=auto?w=960&h=1280', | |||||
name: '推拿馆', | |||||
address: '湖南省长沙市岳麓区麓云路268号', | |||||
latitude: 0, | |||||
longitude: 0, | |||||
phone: '13425992900' | |||||
} | |||||
export default { | |||||
props: { | |||||
data: { | |||||
type: Object, | |||||
default() { | |||||
return TEST_DATA | |||||
} | |||||
}, | |||||
}, | |||||
methods: { | |||||
onCall(phoneNumber) { | |||||
uni.makePhoneCall({ | |||||
phoneNumber, | |||||
success() { | |||||
console.log('安卓拨打成功'); | |||||
}, | |||||
fail() { | |||||
console.log('安卓拨打失败'); | |||||
} | |||||
}) | |||||
}, | |||||
}, | |||||
} | |||||
</script> | |||||
<style lang="scss" scoped> | |||||
.store { | |||||
padding: 22rpx 38rpx 30rpx 30rpx; | |||||
&-img { | |||||
width: 155rpx; | |||||
height: 155rpx; | |||||
margin-right: 23rpx; | |||||
} | |||||
&-info { | |||||
flex: 1; | |||||
} | |||||
&-name { | |||||
color: #3B3B3B; | |||||
font-size: 28rpx; | |||||
font-weight: 700; | |||||
} | |||||
&-desc { | |||||
color: #999999; | |||||
font-size: 22rpx; | |||||
margin-top: 13rpx; | |||||
} | |||||
&-contact { | |||||
margin-top: 3rpx; | |||||
text-align: right; | |||||
} | |||||
} | |||||
.btn { | |||||
display: inline-flex; | |||||
border: none; | |||||
color: $uni-color-light; | |||||
font-size: 22rpx; | |||||
line-height: 30rpx; | |||||
& + & { | |||||
margin-left: 44rpx; | |||||
} | |||||
&-icon { | |||||
width: 23rpx; | |||||
height: 23rpx; | |||||
margin-right: 6rpx; | |||||
} | |||||
} | |||||
</style> |
@ -0,0 +1,94 @@ | |||||
<template> | |||||
<view class="voucher"> | |||||
<image class="voucher-bg" src="@/pages_order/static/voucher/voucher-bg.png" ></image> | |||||
<view class="voucher-info"> | |||||
<view class="voucher-row voucher-title">{{ data.name }}</view> | |||||
<view class="voucher-row voucher-time">{{ `${data.startTime}-${data.endTime}` }}</view> | |||||
<view class="voucher-row voucher-desc">{{ data.desc }}</view> | |||||
</view> | |||||
<template v-if="!readonly"> | |||||
<button palin class="btn" @click="onClick">立即使用</button> | |||||
</template> | |||||
</view> | |||||
</template> | |||||
<script> | |||||
const TEST_DATA = { | |||||
id: '001', | |||||
name: '【会员礼】50元代金券', | |||||
startTime: '2025.03.12', | |||||
endTime: '2025.09.12', | |||||
desc: '只可在线下门店使用', | |||||
} | |||||
export default { | |||||
props: { | |||||
data: { | |||||
type: Object, | |||||
default() { | |||||
return TEST_DATA | |||||
} | |||||
}, | |||||
readonly: { | |||||
type: Boolean, | |||||
default: false, | |||||
} | |||||
}, | |||||
methods: { | |||||
onClick() { | |||||
this.$utils.navigateTo(`/pages_order/mine/verifyVoucher?id=${this.data.id}`) | |||||
} | |||||
}, | |||||
} | |||||
</script> | |||||
<style lang="scss" scoped> | |||||
.voucher { | |||||
width: 100%; | |||||
height: 202rpx; | |||||
position: relative; | |||||
&-bg { | |||||
width: 100%; | |||||
height: 100%; | |||||
} | |||||
&-info { | |||||
position: absolute; | |||||
top: 49rpx; | |||||
left: 253rpx; | |||||
color: $uni-color-light; | |||||
font-size: 18rpx; | |||||
} | |||||
&-row { | |||||
& + & { | |||||
margin-top: 6rpx; | |||||
} | |||||
} | |||||
&-title { | |||||
font-size: 28rpx; | |||||
font-weight: 900; | |||||
} | |||||
.btn { | |||||
position: absolute; | |||||
bottom: 39rpx; | |||||
right: 39rpx; | |||||
width: auto; | |||||
padding: 12rpx 29rpx; | |||||
color: $uni-text-color-inverse; | |||||
font-size: 18rpx; | |||||
line-height: 25rpx; | |||||
border-radius: 25rpx; | |||||
border: none; | |||||
background-image: linear-gradient(to right, #84A73F, #D8FF8F); | |||||
} | |||||
} | |||||
</style> |
@ -0,0 +1,106 @@ | |||||
<template> | |||||
<view class="page"> | |||||
<navbar title="代金券" leftClick @leftClick="$utils.navigateBack" color="#fff" /> | |||||
<view class="page-content"> | |||||
<!-- 代金券详情 --> | |||||
<view class="coupon"> | |||||
<voucherCard :data="voucherDetail" :readonly="true"></voucherCard> | |||||
</view> | |||||
<view class="card info"> | |||||
<view class="info-header">代金券核销</view> | |||||
<view class="flex flex-column info-content"> | |||||
<image class="info-qr" :src="voucherDetail.qrCodeImgUrl" mode="widthFix"></image> | |||||
<view class="info-desc">{{ `有效时间:${voucherDetail.startTime}至${voucherDetail.endTime}` }}</view> | |||||
</view> | |||||
</view> | |||||
</view> | |||||
</view> | |||||
</template> | |||||
<script> | |||||
import voucherCard from '../components/voucher/voucherCard.vue' | |||||
export default { | |||||
components: { | |||||
voucherCard, | |||||
}, | |||||
data() { | |||||
return { | |||||
// todo: fetch | |||||
voucherDetail: { | |||||
id: '001', | |||||
name: '【会员礼】50元代金券', | |||||
startTime: '2025.03.12', | |||||
endTime: '2025.09.12', | |||||
desc: '只可在线下门店使用', | |||||
orderNo: 'da123567', | |||||
qrCodeImgUrl: '../static/verifyOrder/temp-qrcode.png', | |||||
startTime: '2025-03-14', | |||||
endTime: '2025-04-14', | |||||
rights: ['过期退', '随时退'] | |||||
}, | |||||
} | |||||
}, | |||||
onLoad(option) { | |||||
const { id } = option | |||||
// todo: fetch voucher data by voucher id | |||||
}, | |||||
methods: { | |||||
}, | |||||
} | |||||
</script> | |||||
<style scoped lang="scss"> | |||||
$bar-height: 132rpx; | |||||
.page { | |||||
background-color: #F5F5F5; | |||||
/deep/ .nav-bar__view { | |||||
background-image: linear-gradient(#84A73F, #D8FF8F); | |||||
} | |||||
&-header { | |||||
color: #000000; | |||||
font-size: 28rpx; | |||||
margin-top: 24rpx; | |||||
} | |||||
&-content { | |||||
padding: 33rpx 13rpx; | |||||
} | |||||
} | |||||
.coupon { | |||||
padding: 0 13rpx; | |||||
} | |||||
.info { | |||||
margin-top: 26rpx; | |||||
padding: 25rpx 41rpx 108rpx 41rpx; | |||||
&-header { | |||||
color: #000000; | |||||
padding: 0 0 16rpx 7rpx; | |||||
border-bottom: 1rpx dashed #C7C7C7; | |||||
} | |||||
&-qr { | |||||
width: 279rpx; | |||||
height: auto; | |||||
margin-top: 57rpx; | |||||
} | |||||
&-desc { | |||||
color: #999999; | |||||
font-size: 22rpx; | |||||
margin-top: 45rpx; | |||||
} | |||||
} | |||||
</style> |
@ -0,0 +1,129 @@ | |||||
<template> | |||||
<view class="page"> | |||||
<navbar title="代金券" leftClick @leftClick="$utils.navigateBack" color="#fff" /> | |||||
<view class="tabs"> | |||||
<uv-tabs | |||||
:list="tabs" | |||||
@click="onTabChange" | |||||
:customStyle="{ | |||||
backgroundColor: '#FFFFFF', | |||||
}" | |||||
:activeStyle="{ | |||||
color: '#84A73F', | |||||
fontSize: '28rpx', | |||||
whiteSpace: 'nowrap', | |||||
paddingTop: '29rpx', | |||||
paddingBottom: '21rpx', | |||||
}" | |||||
:inactiveStyle="{ | |||||
color: '#000000', | |||||
fontSize: '28rpx', | |||||
whiteSpace: 'nowrap', | |||||
paddingTop: '29rpx', | |||||
paddingBottom: '21rpx', | |||||
}" | |||||
lineHeight="5rpx" | |||||
lineWidth="92rpx" | |||||
lineColor="linear-gradient(to right, #84A73F, #D8FF8F)" | |||||
:scrollable="false" | |||||
></uv-tabs> | |||||
</view> | |||||
<template v-if="current == 0" > | |||||
<view class="list voucher"> | |||||
<voucherCard class="list-item" | |||||
v-for="item in list" | |||||
:key="item.id" | |||||
:data="data" | |||||
></voucherCard> | |||||
</view> | |||||
</template> | |||||
<template v-else-if="current == 1" > | |||||
<view class="list store"> | |||||
<storeCard class="list-item" | |||||
v-for="item in list" | |||||
:key="item.id" | |||||
:data="data" | |||||
></storeCard> | |||||
</view> | |||||
</template> | |||||
</view> | |||||
</template> | |||||
<script> | |||||
import mixinsList from '@/mixins/list.js' | |||||
import voucherCard from '../components/voucher/voucherCard.vue' | |||||
import storeCard from '../components/voucher/storeCard.vue' | |||||
const TAB_AND_API_FIELDS_MAPPING = { | |||||
// todo: 接口对接 | |||||
0: 'fetchVoucher', | |||||
1: 'fetchStore', | |||||
} | |||||
export default { | |||||
mixins : [mixinsList], | |||||
components: { | |||||
voucherCard, | |||||
storeCard, | |||||
}, | |||||
data() { | |||||
return { | |||||
tabs: [{ | |||||
name: "代金券" | |||||
}, { | |||||
name: "可使用门店" | |||||
}], | |||||
current: 0 | |||||
}; | |||||
}, | |||||
computed: { | |||||
mixinsListApi() { | |||||
// todo | |||||
return TAB_AND_API_FIELDS_MAPPING[this.current] | |||||
} | |||||
}, | |||||
methods: { | |||||
onTabChange(e) { | |||||
this.current = e.index | |||||
} | |||||
}, | |||||
} | |||||
</script> | |||||
<style scoped lang="scss"> | |||||
.page { | |||||
background-color: $uni-bg-color; | |||||
min-height: 100vh; | |||||
/deep/ .nav-bar__view { | |||||
background-image: linear-gradient(#84A73F, #D8FF8F); | |||||
} | |||||
} | |||||
.tabs { | |||||
/deep/ .uv-tabs__wrapper__nav__line { | |||||
bottom: 0; | |||||
} | |||||
} | |||||
.list { | |||||
&-item { | |||||
& + & { | |||||
margin-top: 20rpx; | |||||
} | |||||
} | |||||
&.voucher { | |||||
padding: 30rpx 28rpx; | |||||
} | |||||
&.store { | |||||
padding: 29rpx 13rpx; | |||||
} | |||||
} | |||||
</style> |