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

552 lines
15 KiB
Vue
Raw Normal View History

2026-03-24 11:45:13 +08:00
<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>