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