mrr.sj.front/pages/coupon/myCoupon.vue

552 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="content">
<!-- 顶部渐变背景作为固定区域的背景 -->
<view class="fixed-top-bg"></view>
<!-- 固定在顶部的区域导航栏 + 标签栏 -->
<view class="fixed-top-container">
<!-- 导航栏 -->
<view class="nav-bar">
<view class="nav-bar-l" @click="goBack">
<image class="nav-bar-l-img"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/a52cd5ad-a26f-4426-ad59-e2d481fe0e92.png"
mode="widthFix"></image>
</view>
<view class="nav-bar-c">
<view class="nav-bar-c-text">我的优惠券</view>
</view>
<view class="nav-bar-r">
<view class="nav-bar-r-text" @click="gotoCouponHistory()">历史记录</view>
</view>
</view>
<view class="coupon-title">
<view class="coupon-tab" @click="selectd(0)">
<view class="coupon-tab-text" :class="{ active: isselect === 0 }">全部优惠券</view>
<image class="tab-line-img" v-if="isselect === 0"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/b304a532-2c5d-467b-b7f7-f30f58cdc7ec.png">
</image>
</view>
<view class="coupon-tab" @click="selectd(1)">
<view class="coupon-tab-text" :class="{ active: isselect === 1 }">即将到期</view>
<image class="tab-line-img" v-if="isselect === 1"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/b304a532-2c5d-467b-b7f7-f30f58cdc7ec.png">
</image>
</view>
</view>
</view>
<view class="list-coupon-container">
<!-- 已领取的优惠券 -->
<view class="list-coupon" v-if="isselectd && !timesout">
<!-- 已领取标题 -->
<view class="collectd-title">
<image class="collectd-title-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/71c747be-b80c-496e-aeab-821a7dddcfc2.png"
mode="widthFix"></image>
<view class="collectd-title-text">已领取的优惠券</view>
</view>
<!-- 空状态提示 -->
<view v-if="filterCollectedList.length === 0" class="empty-tip">
<view class="empty-text">暂无已领取的优惠券</view>
</view>
<!-- 已领取优惠券卡片列表(使用组件) -->
<CouponCard v-for="(item, index) in showCollectedList" :key="'collected-' + index" :coupon="item"
@action="(status) => handleAvailableAction(status, item)" />
<!-- 展开/收起按钮(仅已领取优惠券使用) -->
<view v-if="filterCollectedList.length > 4" class="expand-btn" @click="toggleExpand">
<view class="expand-text">{{ isExpanded ? '收起全部' : '展开全部' }}</view>
<image class="expand-icon"
:src="isExpanded ? 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/fe418cfb-99c5-43ca-8ffd-5c656fb1cd06.png' : 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/169e99f5-8181-43d9-b290-f0526690ff83.png'"
mode="widthFix"></image>
</view>
</view>
<!-- 更多可领优惠券(无展开/收起) -->
<view class="list-coupon" v-if="!timesout">
<!-- 可领取标题 -->
<view class="collectd-title">
<image class="collectd-title-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/71c747be-b80c-496e-aeab-821a7dddcfc2.png"
mode="widthFix"></image>
<view class="collectd-title-text">更多可领优惠券</view>
</view>
<!-- 空状态提示 -->
<view v-if="availableCouponList.length === 0" class="empty-tip">
<view class="empty-text">暂无可领取的优惠券</view>
</view>
<!-- 可领取优惠券卡片列表(使用组件) -->
<CouponCard v-for="(item, index) in formattedAvailableList" :key="'available-' + index" :coupon="item"
@action="(status) => handleAvailableAction(status, item)" />
</view>
<view class="no-data" v-if="collectedCouponList.length<0">
<image class="no-data-img"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/035b7613-338b-4a71-9975-291cec794f89.png"
mode="widthFix"></image>
</view>
<view class="daoqi" v-if="isselect==1">
<CouponCard class="daoqi-list" v-for="(item, index) in formattedAvailableLis"
:key="'available-' + index" :coupon="item"
@action="(status) => handleAvailableAction(status, item)" />
</view>
</view>
</view>
</template>
<script>
import CouponCard from './components/couponCard.vue';
export default {
components: {
CouponCard
},
data() {
return {
timesout: false,
statusBarHeight: 0,
isselectd: true,
isselect: 0, // 默认选中全部优惠券
isExpanded: false, // 已领取优惠券是否展开
// 已领取优惠券列表
collectedCouponList: [{
denomination: 20,
condition: '满150元可用',
name: '平台|新人专享券',
expireTime: '有效期至2025.08.21 10:10',
tagType: 'new',
status: 'available'
},
{
denomination: 45,
condition: '满300元可用',
name: '平台|新人专享券',
expireTime: '有效期至2025.08.21 10:10',
tagType: 'new',
status: 'available'
},
{
denomination: 330,
condition: '满5650元可用',
name: '平台|新人专享券',
expireTime: '有效期至2025.08.21 10:10',
tagType: 'soon',
status: 'available'
},
{
denomination: 20,
condition: '满150元可用',
name: '平台|新人专享券',
expireTime: '有效期至2025.04.21 23:10',
tagType: 'expire',
status: 'available'
},
{
denomination: 10,
condition: '满99元可用',
name: '平台|满减券',
expireTime: '有效期至2025.09.10 23:59',
tagType: 'new',
status: 'available'
},
{
denomination: 50,
condition: '满500元可用',
name: '平台|满减券',
expireTime: '有效期至2025.08.30 12:00',
tagType: 'new',
status: 'available'
}
],
// 更多可领优惠券列表
availableCouponList: [{
denomination: 20,
condition: '满150元可用',
name: '平台|新人专享券',
expireTime: '有效期至2025.08.21 10:10',
tagType: 'new' // 用于图标
},
{
denomination: 330,
condition: '满5650元可用',
name: '平台|新人专享券',
expireTime: '有效期至2025.08.21 10:10',
tagType: 'new'
},
{
denomination: 888,
condition: '满9999元可用',
name: '平台|新人专享券',
expireTime: '有效期至2025.08.21 10:10',
tagType: 'new'
}
],
timeoutdatalist: [{
denomination: 20,
condition: '满150元可用',
name: '平台|新人专享券',
expireTime: '还剩09:59:59过期',
tagType: 'new' // 用于图标
},
{
denomination: 20,
condition: '满150元可用',
name: '平台|新人专享券',
expireTime: '还剩09:59:59过期',
tagType: 'new' // 用于图标
},
{
denomination: 20,
condition: '满150元可用',
name: '平台|新人专享券',
expireTime: '还剩09:59:59过期',
tagType: 'expired' // 用于图标
},
]
}
},
computed: {
// 已领取优惠券筛选后列表(根据标签)
filterCollectedList() {
if (this.isselect === 0) {
return this.collectedCouponList
} else {
// 即将到期逻辑交由后端处理,这里暂时返回空(可根据后端返回字段调整)
return []
}
},
// 已领取优惠券实际展示列表默认前4个展开后显示全部
showCollectedList() {
const list = this.filterCollectedList
const rawList = this.isExpanded ? list : list.slice(0, 4)
// 映射为组件所需格式
return rawList.map(item => this.formatCollectedCoupon(item))
},
// 可领取列表映射为组件格式
formattedAvailableList() {
return this.availableCouponList.map(item => this.formatAvailableCoupon(item))
},
formattedAvailableLis() {
return this.timeoutdatalist.map(item => this.formatAvailableCoupon(item))
},
},
methods: {
// 将已领取优惠券原始数据转换为组件 coupon 对象
formatCollectedCoupon(item) {
const [platform, tag] = item.name.split('|')
let status = ''
if (item.status === 'available') status = 'use'
else if (item.status === 'expired') status = 'expired'
else if (item.status === 'used') status = 'used'
else status = 'use' // 默认
return {
amount: item.denomination,
condition: item.condition,
platform: platform || '平台',
tag: tag || '优惠券',
expiry: item.expireTime,
status: status,
isNew: item.tagType === 'new',
isExpiringSoon: item.tagType === 'soon' || item.tagType === 'expire'
}
},
// 将可领取优惠券原始数据转换为组件 coupon 对象
formatAvailableCoupon(item) {
const [platform, tag] = item.name.split('|')
return {
amount: item.denomination,
condition: item.condition,
platform: platform || '平台',
tag: tag || '优惠券',
expiry: item.expireTime,
status: 'receive', // 可领取
isNew: item.tagType === 'new', // 根据需要设置,默认 true 也可以
isExpiringSoon: false
}
},
// 处理已领取卡片的点击(立即使用/已过期/已使用)
handleAvailableAction(status, clickedItem) {
if (status === 'receive') {
console.log('领取优惠券', clickedItem);
uni.showToast({
title: '领取成功',
icon: 'success'
});
const originItem = this.availableCouponList.find(item =>
item.denomination === clickedItem.amount &&
item.condition === clickedItem.condition &&
item.name === `${clickedItem.platform}|${clickedItem.tag}`
);
if (originItem) {
const index = this.availableCouponList.indexOf(originItem);
this.availableCouponList.splice(index, 1);
this.collectedCouponList.unshift({
...originItem,
tagType: 'new', // 标记为新领取
status: 'available'
});
}
} else if (status === 'use') {
console.log('使用优惠券', clickedItem);
uni.navigateTo({
url: '/pages/coupon/couponDetail'
});
}
},
toggleExpand() {
this.isExpanded = !this.isExpanded
},
selectd(i) {
this.isselect = i
console.log(this.isselect, '选中项');
// 切换标签时重置为收起状态
// this.isExpanded = false
// this.isselectd=false
if (i == 1) {
this.timesout = true
} else {
this.timesout = false
}
},
gotoCouponHistory() {
uni.navigateTo({
url: '/pages/coupon/couponHistory',
fail(err) {
console.error('跳转失败', err)
}
})
},
goBack() {
uni.navigateBack({
delta: 1
})
},
},
onLoad() {
// 移除定时器启动逻辑
},
onUnload() {},
onHide() {
// 移除定时器暂停逻辑
},
onShow() {
const systemInfo = uni.getWindowInfo()
const statusBarHeight = systemInfo.statusBarHeight;
this.statusBarHeight = statusBarHeight
console.log('刘海/状态栏高度:', statusBarHeight + 'px');
},
onPullDownRefresh() {
}
}
</script>
<style scoped>
.nav-bar-l {
margin-top: 200rpx;
}
/* 全局容器 */
.content {
position: relative;
width: 750rpx;
min-height: 100vh;
background-color: #f5f5f5;
/* 预留固定区域高度,避免内容被遮挡 */
padding-top: 200rpx;
box-sizing: border-box;
}
/* 固定区域的渐变背景(和原背景样式一致) */
.fixed-top-bg {
position: fixed;
top: 0;
left: 0;
z-index: 99;
width: 750rpx;
height: 260rpx;
background: linear-gradient(180deg, #FFEAE6 0%, #FFFBF9 100%);
}
/* 固定在顶部的容器:导航栏+标签栏 */
.fixed-top-container {
position: fixed;
top: 0;
left: 0;
z-index: 100;
width: 750rpx;
height: 200rpx;
padding: 0 30rpx;
box-sizing: border-box;
}
/* 导航栏样式 */
.nav-bar {
display: flex;
align-items: flex-end;
padding-top: 60rpx;
/* 适配状态栏高度 */
height: 140rpx;
box-sizing: border-box;
}
.nav-bar-l-img {
width: 18rpx;
height: 35.74rpx;
}
.nav-bar-c {
margin-left: 24rpx;
margin-bottom: 5rpx;
}
.nav-bar-c-text {
font-family: AlimamaShuHeiTi, AlimamaShuHeiTi;
font-weight: bold;
font-size: 40rpx;
color: #000000;
}
.nav-bar-r {
margin-left: auto;
margin-bottom: 8rpx;
}
.nav-bar-r-text {
font-family: PingFangSC, PingFang SC;
font-size: 30rpx;
color: #666666;
}
.list-coupon .coupon-card {
margin-bottom: 20rpx;
}
/* 标签栏样式 */
.coupon-title {
display: flex;
height: 60rpx;
align-items: center;
margin-top: 37rpx;
}
.coupon-tab {
display: flex;
flex-direction: column;
align-items: center;
margin-right: 40rpx;
}
.coupon-tab-text {
font-family: PingFangSC, PingFang SC;
font-size: 30rpx;
color: #666666;
margin-bottom: 8rpx;
width: 150rpx;
text-align: center;
}
.coupon-tab-text.active {
font-weight: 600;
color: #333333;
}
.tab-line-img {
width: 53rpx;
height: 6rpx;
}
/* 优惠券列表外层容器 */
.list-coupon-container {
position: relative;
z-index: 2;
margin-top: 50rpx;
}
/* 优惠券列表容器(复用样式) */
.list-coupon {
width: 750rpx;
background: #FFFFFF;
border-radius: 40rpx;
margin-bottom: 10rpx;
margin-top: 10rpx;
padding: 30rpx;
box-sizing: border-box;
}
/* 空状态样式 */
.empty-tip {
text-align: center;
padding: 60rpx 0;
color: #999;
font-size: 28rpx;
}
.empty-text {
font-size: 28rpx;
color: #999999;
}
/* 标题样式 */
.collectd-title {
display: flex;
align-items: center;
margin-bottom: 20rpx;
}
.collectd-title-icon {
width: 41rpx;
margin-right: 8rpx;
}
.collectd-title-text {
font-family: PingFangSC, PingFang SC;
font-weight: 500;
font-size: 28rpx;
color: #333333;
}
/* 展开/收起按钮 */
.expand-btn {
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto;
padding: 12rpx 45rpx 12rpx 20rpx;
border: 1rpx solid #eee;
border-radius: 40rpx;
width: 161rpx;
}
.expand-text {
font-size: 28rpx;
color: #666;
margin-right: 10rpx;
}
.expand-icon {
width: 30rpx;
height: 30rpx;
}
.no-data-img {
width: 430rpx;
margin: 299rpx 0 0 160rpx;
}
.daoqi {
margin: 80rpx 0 0rpx 30rpx;
}
.daoqi-list {
margin-bottom: 20rpx;
}
</style>