142 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Vue
		
	
	
| <!-- 拼团活动参团记录卡片 -->
 | |
| <template>
 | |
|   <view v-if="state.list.length > 0" class="groupon-list detail-card ss-p-x-20">
 | |
|     <view class="join-activity ss-flex ss-row-between ss-m-t-30">
 | |
|       <!-- todo: 接口缺少总数 -->
 | |
|       <view class="">已有{{ state.list.length }}人参与活动</view>
 | |
|       <text class="cicon-forward"></text>
 | |
|     </view>
 | |
|     <view
 | |
|       v-for="(record, index) in state.list"
 | |
|       @tap="sheep.$router.go('/pages/activity/groupon/detail', { id: record.id })"
 | |
|       :key="index"
 | |
|       class="ss-m-t-40 ss-flex ss-row-between border-bottom ss-p-b-30"
 | |
|     >
 | |
|       <view class="ss-flex ss-col-center">
 | |
|         <image :src="sheep.$url.cdn(record.avatar)" class="user-avatar"></image>
 | |
|         <view class="user-nickname ss-m-l-20 ss-line-1">{{ record.nickname }}</view>
 | |
|       </view>
 | |
|       <view class="ss-flex ss-col-center">
 | |
|         <view class="ss-flex-col ss-col-bottom ss-m-r-20">
 | |
|           <view class="title ss-flex ss-m-b-14">
 | |
|             还差
 | |
|             <view class="num">{{ record.userSize - record.userCount }}人</view>
 | |
|             成团
 | |
|           </view>
 | |
|           <view class="end-time">{{ endTime(record.expireTime) }}</view>
 | |
|         </view>
 | |
|         <view class="">
 | |
|           <button class="ss-reset-button go-btn" @tap.stop="onJoinGroupon(record)"> 去参团 </button>
 | |
|         </view>
 | |
|       </view>
 | |
|     </view>
 | |
|   </view>
 | |
| </template>
 | |
| 
 | |
| <script setup>
 | |
|   import { onMounted, reactive } from 'vue';
 | |
|   import sheep from '@/sheep';
 | |
|   import { useDurationTime } from '@/sheep/hooks/useGoods';
 | |
|   import CombinationApi from "@/sheep/api/promotion/combination";
 | |
| 
 | |
|   const props = defineProps({
 | |
|     modelValue: {
 | |
|       type: Object,
 | |
|       default() {},
 | |
|     },
 | |
|   });
 | |
|   const state = reactive({
 | |
|     list: [],
 | |
|   });
 | |
| 
 | |
|   // 去参团
 | |
|   const emits = defineEmits(['join']);
 | |
|   function onJoinGroupon(record) {
 | |
|     emits('join', record);
 | |
|   }
 | |
| 
 | |
|   // 结束时间或状态
 | |
|   function endTime(time) {
 | |
|     const durationTime = useDurationTime(time);
 | |
| 
 | |
|     if (durationTime.ms <= 0) {
 | |
|       return '该团已解散';
 | |
|     }
 | |
| 
 | |
|     let timeText = '剩余 ';
 | |
|     timeText += `${durationTime.h}时`;
 | |
|     timeText += `${durationTime.m}分`;
 | |
|     timeText += `${durationTime.s}秒`;
 | |
|     return timeText;
 | |
|   }
 | |
| 
 | |
|   // 初始化
 | |
|   onMounted(async () => {
 | |
|     // 查询参团记录
 | |
|     // status = 0 表示未成团
 | |
|     const { data } = await CombinationApi.getHeadCombinationRecordList(props.modelValue.id, 0 , 10);
 | |
|     state.list = data;
 | |
|   });
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
|   .detail-card {
 | |
|     background-color: $white;
 | |
|     margin: 14rpx 20rpx;
 | |
|     border-radius: 10rpx;
 | |
|     overflow: hidden;
 | |
|   }
 | |
|   .groupon-list {
 | |
|     .join-activity {
 | |
|       font-size: 28rpx;
 | |
|       font-weight: 500;
 | |
|       color: #999999;
 | |
| 
 | |
|       .cicon-forward {
 | |
|         font-weight: 400;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     .user-avatar {
 | |
|       width: 60rpx;
 | |
|       height: 60rpx;
 | |
|       background: #ececec;
 | |
|       border-radius: 60rpx;
 | |
|     }
 | |
| 
 | |
|     .user-nickname {
 | |
|       font-size: 28rpx;
 | |
|       font-weight: 500;
 | |
|       color: #333333;
 | |
|       width: 160rpx;
 | |
|     }
 | |
| 
 | |
|     .title {
 | |
|       font-size: 24rpx;
 | |
|       font-weight: 500;
 | |
|       color: #666666;
 | |
| 
 | |
|       .num {
 | |
|         color: #ff6000;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     .end-time {
 | |
|       font-size: 24rpx;
 | |
|       font-weight: 500;
 | |
|       color: #999999;
 | |
|     }
 | |
| 
 | |
|     .go-btn {
 | |
|       width: 140rpx;
 | |
|       height: 60rpx;
 | |
|       background: linear-gradient(90deg, #ff6000 0%, #fe832a 100%);
 | |
|       border-radius: 30rpx;
 | |
|       color: #fff;
 | |
|       font-weight: 500;
 | |
|       font-size: 26rpx;
 | |
|       line-height: normal;
 | |
|     }
 | |
|   }
 | |
| </style>
 |