| @ -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> | |||||