235 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Vue
		
	
	
| <template>
 | ||
|   <view>
 | ||
|     <!-- md卡片:竖向,一行放两个,图上内容下 -->
 | ||
|     <view v-if="size === 'md'" class="md-goods-card ss-flex-col" :style="[elStyles]" @tap="onClick">
 | ||
|       <view class="icon-box ss-flex">
 | ||
|         <image class="icon" :src="state.liveStatus[data.status].img"></image>
 | ||
|         <view class="title ss-m-l-16">{{ state.liveStatus[data.status].title }}</view>
 | ||
|       </view>
 | ||
|       <img class="md-img-box" :src="sheep.$url.cdn(data.feeds_img)" referrerpolicy="no-referrer">
 | ||
|       <view class="md-goods-content">
 | ||
|         <view class="md-goods-title ss-line-1" :style="[{ color: titleColor }]">
 | ||
|           {{ data.name }}
 | ||
|         </view>
 | ||
|         <view class="md-goods-subtitle ss-m-t-14 ss-line-1" :style="[{ color: subTitleColor }]">
 | ||
|           主播:{{ data.anchor_name }}
 | ||
|         </view>
 | ||
|       </view>
 | ||
|     </view>
 | ||
|     <!-- sl卡片:竖向型,一行放一个,图片上内容下边 -->
 | ||
|     <view v-if="size === 'sl'" class="sl-goods-card ss-flex-col" :style="[elStyles]" @tap="onClick">
 | ||
|       <view class="icon-box ss-flex">
 | ||
|         <image class="icon" :src="state.liveStatus[data.status].img"></image>
 | ||
|         <view class="title ss-m-l-16">{{ state.liveStatus[data.status].title }}</view>
 | ||
|       </view>
 | ||
|       <img class="sl-img-box" :src="sheep.$url.cdn(data.feeds_img)" referrerpolicy="no-referrer">
 | ||
|       <view class="sl-goods-content">
 | ||
|         <view class="sl-goods-title ss-line-1" :style="[{ color: titleColor }]">
 | ||
|           {{ data.name }}
 | ||
|         </view>
 | ||
|         <view class="sl-goods-subtitle ss-m-t-14 ss-line-1" :style="[{ color: subTitleColor }]">
 | ||
|           主播:{{ data.anchor_name }}
 | ||
|         </view>
 | ||
|       </view>
 | ||
|     </view>
 | ||
|   </view>
 | ||
| </template>
 | ||
| <script setup>
 | ||
|   import { computed, reactive } from 'vue';
 | ||
|   import sheep from '@/sheep';
 | ||
|   /**
 | ||
|    * 直播卡片
 | ||
|    *
 | ||
|    * @property {String} img 											- 图片
 | ||
|    * @property {String} title 										- 标题
 | ||
|    * @property {Number} titleWidth = 0								- 标题宽度,默认0,单位rpx
 | ||
|    * @property {String} skuText 										- 规格
 | ||
|    * @property {String | Number} score 								- 积分
 | ||
|    * @property {String | Number} price 								- 价格
 | ||
|    * @property {String | Number} originalPrice 						- 单购价
 | ||
|    * @property {String} priceColor 									- 价格颜色
 | ||
|    * @property {Number | String} num									- 数量
 | ||
|    *
 | ||
|    */
 | ||
|   const props = defineProps({
 | ||
|     goodsFields: {
 | ||
|       type: [Array, Object],
 | ||
|       default() {
 | ||
|         return {};
 | ||
|       },
 | ||
|     },
 | ||
|     tagStyle: {
 | ||
|       type: Object,
 | ||
|       default: {},
 | ||
|     },
 | ||
|     data: {
 | ||
|       type: Object,
 | ||
|       default: {},
 | ||
|     },
 | ||
|     size: {
 | ||
|       type: String,
 | ||
|       default: 'sl',
 | ||
|     },
 | ||
|     background: {
 | ||
|       type: String,
 | ||
|       default: '',
 | ||
|     },
 | ||
|     topRadius: {
 | ||
|       type: Number,
 | ||
|       default: 0,
 | ||
|     },
 | ||
|     bottomRadius: {
 | ||
|       type: Number,
 | ||
|       default: 0,
 | ||
|     },
 | ||
|     titleColor: {
 | ||
|       type: String,
 | ||
|       default: '#333',
 | ||
|     },
 | ||
|     subTitleColor: {
 | ||
|       type: String,
 | ||
|       default: '#999999',
 | ||
|     },
 | ||
|   });
 | ||
|   // 组件样式
 | ||
|   const elStyles = computed(() => {
 | ||
|     return {
 | ||
|       background: props.background,
 | ||
|       'border-top-left-radius': props.topRadius + 'px',
 | ||
|       'border-top-right-radius': props.topRadius + 'px',
 | ||
|       'border-bottom-left-radius': props.bottomRadius + 'px',
 | ||
|       'border-bottom-right-radius': props.bottomRadius + 'px',
 | ||
|     };
 | ||
|   });
 | ||
|   const state = reactive({
 | ||
|     liveStatus: {
 | ||
|       101: {
 | ||
|         img: sheep.$url.static('/static/img/shop/app/mplive/living.png'),
 | ||
|         title: '直播中',
 | ||
|       },
 | ||
|       102: {
 | ||
|         img: sheep.$url.static('/static/img/shop/app/mplive/start.png'),
 | ||
|         title: '未开始',
 | ||
|       },
 | ||
|       103: {
 | ||
|         img: sheep.$url.static('/static/img/shop/app/mplive/ended.png'),
 | ||
|         title: '已结束',
 | ||
|       },
 | ||
|     },
 | ||
|   });
 | ||
|   const emits = defineEmits(['click', 'getHeight']);
 | ||
|   const onClick = () => {
 | ||
|     emits('click');
 | ||
|   };
 | ||
| </script>
 | ||
| 
 | ||
| <style lang="scss" scoped>
 | ||
|   // md
 | ||
|   .md-goods-card {
 | ||
|     overflow: hidden;
 | ||
|     width: 100%;
 | ||
|     height: 424rpx;
 | ||
|     position: relative;
 | ||
|     z-index: 1;
 | ||
|     background-color: $white;
 | ||
|     .icon-box {
 | ||
|       position: absolute;
 | ||
|       left: 20rpx;
 | ||
|       top: 10rpx;
 | ||
|       width: 136rpx;
 | ||
|       height: 40rpx;
 | ||
|       background: rgba(#000000, 0.5);
 | ||
|       border-radius: 20rpx;
 | ||
|       z-index: 1;
 | ||
|       .icon {
 | ||
|         width: 40rpx;
 | ||
|         height: 40rpx;
 | ||
|         border-radius: 20rpx 0px 20rpx 20rpx;
 | ||
|       }
 | ||
|       .title {
 | ||
|         font-size: 24rpx;
 | ||
|         font-weight: 500;
 | ||
|         color: #ffffff;
 | ||
|       }
 | ||
|     }
 | ||
|     .md-goods-content {
 | ||
|       position: absolute;
 | ||
|       left: 0;
 | ||
|       bottom: 0;
 | ||
|       padding: 20rpx;
 | ||
|       width: 100%;
 | ||
|       background: linear-gradient(360deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.02) 100%);
 | ||
|     }
 | ||
| 
 | ||
|     .md-img-box {
 | ||
|       width: 100%;
 | ||
|       height: 100%;
 | ||
|       object-fit: cover;
 | ||
|     }
 | ||
| 
 | ||
|     .md-goods-title {
 | ||
|       font-size: 26rpx;
 | ||
|       color: #333;
 | ||
|       width: 100%;
 | ||
|     }
 | ||
|     .md-goods-subtitle {
 | ||
|       font-size: 24rpx;
 | ||
|       font-weight: 400;
 | ||
|       color: #999999;
 | ||
|     }
 | ||
|   }
 | ||
|   .sl-goods-card {
 | ||
|     overflow: hidden;
 | ||
|     position: relative;
 | ||
|     z-index: 1;
 | ||
|     width: 100%;
 | ||
|     height: 400rpx;
 | ||
|     background-color: $white;
 | ||
|     .icon-box {
 | ||
|       position: absolute;
 | ||
|       left: 20rpx;
 | ||
|       top: 10rpx;
 | ||
|       width: 136rpx;
 | ||
|       height: 40rpx;
 | ||
|       background: rgba(#000000, 0.5);
 | ||
|       border-radius: 20rpx;
 | ||
|       z-index: 1;
 | ||
|       .icon {
 | ||
|         width: 40rpx;
 | ||
|         height: 40rpx;
 | ||
|         border-radius: 20rpx 0px 20rpx 20rpx;
 | ||
|       }
 | ||
|       .title {
 | ||
|         font-size: 24rpx;
 | ||
|         font-weight: 500;
 | ||
|         color: #ffffff;
 | ||
|       }
 | ||
|     }
 | ||
|     .sl-goods-content {
 | ||
|       position: absolute;
 | ||
|       left: 0;
 | ||
|       bottom: 0;
 | ||
|       padding: 20rpx;
 | ||
|       width: 100%;
 | ||
|       background: linear-gradient(360deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.02) 100%);
 | ||
|     }
 | ||
| 
 | ||
|     .sl-img-box {
 | ||
|       width: 100%;
 | ||
|       height: 100%;
 | ||
|       object-fit: cover;
 | ||
|     }
 | ||
| 
 | ||
|     .sl-goods-title {
 | ||
|       font-size: 26rpx;
 | ||
|       color: #333;
 | ||
|       width: 100%;
 | ||
|     }
 | ||
|     .sl-goods-subtitle {
 | ||
|       font-size: 24rpx;
 | ||
|       font-weight: 400;
 | ||
|       color: #999999;
 | ||
|     }
 | ||
|   }
 | ||
| </style>
 |