dl_mer_uniapp/components/homeIndex/liveBroadcast.vue
2025-03-04 16:03:38 +08:00

605 lines
15 KiB
Vue
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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>
<!-- 小程序直播 -->
<!-- #ifdef MP -->
<!-- liveStatus直播间状态101直播中102未开始103已结束104禁播105暂停106异常107已过期 -->
<view v-if="liveList.length > 0">
<view class="wrapper-count indexList" :style="[boxStyle]">
<view class='title acea-row row-between-wrapper'>
<view class='text line1 tui-skeleton-rect acea-row'>
<image :src="logoUrl"></image>
<text class='label' :style="[titleColor]">{{titleText}}</text>
</view>
<navigator v-if="!merId" :url="moreLink" class="more-btn" hover-class="none">
<view class='more tui-skeleton-rect' :style="[moreColor]">
更多
<text class="iconfont icon-jiantou"></text>
</view>
</navigator>
</view>
<view class='tips mb20'>First new product</view>
<!-- 直播 -->
<block v-if="listStyle == 0">
<view class="live-wrapper mores">
<scroll-view scroll-x="true" style="white-space: nowrap; display: flex">
<view class="item" v-for="(item, index) in liveList" :key="index"
:style="[{'margin-right':dataConfig.contentConfig.val + 'px'},imgStyle]">
<navigator hover-class="none"
:url="'plugin-private://wx2b03c6e691cd7370/pages/live-player-plugin?room_id=' + item.roomId">
<view class="live-top"
:style="'background:' + (item.liveStatus == 101 ? playBg : item.liveStatus != 101 && item.liveStatus != 102 ? endBg : notBg) + ';'"
:class="item.liveStatus == 102 ? 'playRadius' : 'notPlayRadius'">
<view v-if="item.liveReplay">
<text class="iconfont icon-zhibo-huifang"></text>
<text>回放</text>
</view>
<view v-else-if="item.liveStatus == 101">
<text class="iconfont icon-zhibo-zhibozhong"></text>
<text>直播中</text>
</view>
<view v-else-if="item.liveStatus == 103 ">
<text class="iconfont icon-zhibo-yugao"></text>
<text>已结束</text>
</view>
<view v-else-if="item.liveStatus == 102">
<text class="iconfont icon-zhibo-yugao"></text>
<text>预告</text>
</view>
</view>
<view v-if="item.liveStatus == 101 || item.liveStatus == 102" class="broadcast-time">
{{ igetPartTime(item.startTime) }}
</view>
<image :src="item.feedsImgWx" mode="aspectFill"></image>
</navigator>
</view>
</scroll-view>
</view>
</block>
<block v-if="listStyle == 1">
<view class="live-wrapper-a" :style="[gridGap]">
<navigator class="live-item-a" v-for="(item,index) in liveList" :key="index"
:style="[contentStyle]"
:url="'plugin-private://wx2b03c6e691cd7370/pages/live-player-plugin?room_id=' + item.roomId">
<view class="img-box">
<view class="label bggary" v-if="item.liveReplay">
<text class="iconfont icon-zhibo-huifang"></text>
<text>回放</text>
</view>
<view class="label bgred" v-else-if="item.liveStatus==101">
<text class="iconfont icon-zhibo-zhibozhong"></text>
<text>直播中</text>
</view>
<view class="label bggary" v-else-if="item.liveStatus == 103 ">
<text class="iconfont icon-zhibo-yugao"></text>
<text>已结束</text>
</view>
<view class="label bgblue" v-else-if="item.liveStatus == 102">
<view class="txt">预告</view>
<view class="msg">{{ igetPartTime(item.startTime) }}</view>
</view>
<image :src="item.feedsImgWx" mode="aspectFill" :style="[imgStyle]"></image>
</view>
<view class="info">
<view class="title line2">{{item.roomName}}</view>
<view class="people">
<text>{{item.anchorName}}</text>
</view>
<view class="goods-wrapper">
<block v-if="item.broadcast && item.broadcast.length <=3 && item.broadcast.length > 0">
<view class="goods-item" v-for="(goods,index) in item.broadcast" :key="index">
<image :src="goods.coverImg" alt="">
<text class="line1">{{goods.price}}</text>
</view>
</block>
<block v-if="item.broadcast && item.broadcast.length>3">
<view class="goods-item" v-for="(goods,index) in item.broadcast" :key="index"
v-if="index<2">
<image :src="goods.coverImg" alt="">
<text class="line1">¥{{goods.price}}</text>
</view>
<view class="goods-item">
<image :src="item.broadcast[item.broadcast.length-1].goods.coverImg" alt="">
<view class="num">+{{item.broadcast.length}}</view>
</view>
</block>
<block v-if="!item.broadcast || item.broadcast.length == 0">
<view class="empty-goods">暂无商品</view>
</block>
</view>
</view>
</navigator>
</view>
</block>
<block v-if="listStyle == 2">
<view class="live-wrapper-b" :style="[gridGap]">
<navigator class="live-item-b" v-for="(item,index) in liveList" :key="index"
:url="'plugin-private://wx2b03c6e691cd7370/pages/live-player-plugin?room_id=' + item.roomId"
hover-class="none" :style="[contentStyle]">
<view class="img-box">
<view class="label bggary" v-if="item.liveReplay">
<text class="iconfont icon-zhibo-huifang"></text>
<text>回放</text>
</view>
<view class="label bgred" v-else-if="item.liveStatus==101">
<text class="iconfont icon-zhibo-zhibozhong"></text>
<text>直播中</text>
</view>
<view class="label bggary" v-else-if="item.liveStatus == 103 ">
<text class="iconfont icon-zhibo-yugao"></text>
<text>已结束</text>
</view>
<view class="label bgblue" v-else-if="item.liveStatus == 102">
<view class="txt">预告</view>
<view class="msg">{{ igetPartTime(item.startTime) }}</view>
</view>
<image :src="item.feedsImgWx"></image>
</view>
<view class="info">
<view class="title line2">{{item.roomName}}</view>
<view class="people">
<text>{{item.anchorName}}</text>
</view>
</view>
</navigator>
</view>
</block>
</view>
</view>
<!-- #endif -->
</template>
<script>
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import {
liveroomApi
} from '@/api/public.js';
import easyLoadimage from '@/components/base/easy-loadimage.vue';
export default {
name: 'liveBroadcast',
components: {
easyLoadimage
},
props: {
dataConfig: {
type: Object,
default: () => {}
},
//商户id
merId: {
type: String || Number,
default: ''
}
},
data() {
return {
urlDomain: this.$Cache.get("imgHost"),
liveList: [],
bg: '#fff',
endBg: 'linear-gradient(#666666, #999999)',
notBg: 'rgb(26, 163, 246)',
playBg: 'linear-gradient(#FF0000, #FF5400)',
};
},
computed: {
//内容圆角
contentStyle() {
return {
'border-radius': this.dataConfig.contentStyle.val ? this.dataConfig.contentStyle.val + 'px' : '0'
};
},
//样式种类
listStyle() {
return this.dataConfig.tabConfig.tabVal
},
//最外层盒子的样式
boxStyle() {
return {
borderRadius: this.dataConfig.bgStyle.val * 2 + 'rpx',
background: `linear-gradient(${this.dataConfig.bgColor.color[0].item}, ${this.dataConfig.bgColor.color[1].item})`,
margin: this.dataConfig.mbConfig.val * 2 + 'rpx' + ' ' + this.dataConfig.lrConfig.val * 2 + 'rpx' +
' ' + 0,
padding: this.dataConfig.upConfig.val * 2 + 'rpx' + ' ' + '10px' + ' ' + this.dataConfig.downConfig
.val * 2 + 'rpx'
}
},
//内容间距
gridGap() {
return {
'grid-gap': this.dataConfig.contentConfig.val * 2 + 'rpx'
}
},
//文章图片的圆角和高度
imgStyle() {
return {
'border-radius': this.dataConfig.contentStyle.val * 2 + 'rpx',
}
},
//标题图片
logoUrl() {
return this.dataConfig.logoConfig.url
},
//标题
titleText() {
return this.dataConfig.titleConfig.val
},
//标题颜色
titleColor() {
return {
color: this.dataConfig.titleColor.color[0].item
}
},
//更多颜色
moreColor() {
return {
color: this.dataConfig.moreColor.color[0].item
}
},
//更多链接地址
moreLink() {
return this.dataConfig.linkConfig.val
}
},
mounted() {
this.getLiveList();
},
methods: {
getPartTime(val) {
var timearr = val.replace(" ", ":").replace(/:/g, "-").split("-");
var timestr = Number(timearr[1]) + "月" + timearr[2] + "日" + Number(timearr[3]) + ":" + timearr[4];
return timestr;
},
// 直播
getLiveList() {
let that = this;
liveroomApi({
page: 1,
limit: 6
}).then(res => {
res.data.list.map(item => {
this.$set(item, 'broadcast', JSON.parse(item.goodsJson));
})
that.liveList = res.data.list;
}).catch(e => {});
},
}
};
</script>
<style lang="scss" scoped>
@import '@/static/css/diyMain.scss';
.wrapper-count {
padding: 24rpx 20rpx 0;
}
.live-wrapper {
position: relative;
width: 100%;
overflow: hidden;
border-radius: 16rpx;
image {
width: 100%;
height: 400rpx;
}
.live-top {
z-index: 20;
position: absolute;
left: 0;
top: 0;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
width: 180rpx;
height: 54rpx;
border-radius: 16rpx 0px 16rpx 0px;
&.playRadius {
border-radius: 16rpx 0 0 0;
}
&.notPlayRadius {
border-radius: 16rpx 0px 16rpx 0px;
}
image {
width: 30rpx;
height: 30rpx;
margin-right: 10rpx;
/* #ifdef H5 */
display: block;
/* #endif */
}
}
.live-title {
position: absolute;
left: 0;
bottom: 6rpx;
width: 100%;
height: 70rpx;
line-height: 70rpx;
text-align: center;
font-size: 30rpx;
color: #fff;
background: rgba(0, 0, 0, 0.35);
}
&.mores {
width: 100%;
.item {
position: relative;
width: 280rpx;
display: inline-block;
border-radius: 16rpx;
overflow: hidden;
image {
width: 280rpx;
height: 224rpx;
border-radius: 16rpx;
}
.live-title {
height: 40rpx;
line-height: 40rpx;
text-align: center;
font-size: 22rpx;
}
.live-top {
width: 100rpx;
height: 36rpx;
font-size: 22rpx;
image {
width: 20rpx;
height: 20rpx;
}
}
}
}
}
.live-wrapper-a {
display: grid;
grid-template-rows: auto;
grid-template-columns: repeat(1, 1fr);
.live-item-a {
display: flex;
background: #fff;
overflow: hidden;
.img-box {
position: relative;
width: 340rpx;
height: 270rpx;
image {
width: 100%;
height: 100%;
}
}
.info {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 15rpx 20rpx;
.title {
font-size: 30rpx;
color: #333;
}
.people {
display: flex;
align-items: center;
color: #999;
font-size: 24rpx;
margin-top: 10rpx;
}
.goods-wrapper {
display: flex;
.goods-item {
position: relative;
width: 96rpx;
height: 96rpx;
margin-right: 20rpx;
overflow: hidden;
border-radius: 16rpx;
&:last-child {
margin-right: 0;
}
image {
width: 100%;
height: 100%;
border-radius: 16rpx;
}
.bg {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
border-radius: 16rpx;
background: rgba(0, 0, 0, 0.3);
}
text {
font-size: 24rpx;
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 60rpx;
line-height: 70rpx;
color: #fff;
background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.75) 100%);
}
.num {
display: flex;
align-items: center;
justify-content: center;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.3);
color: #fff;
font-size: 28rpx;
}
}
}
.empty-goods {
width: 96rpx;
height: 96rpx;
border-radius: 6rpx;
background-color: #B2B2B2;
color: #fff;
font-size: 20rpx;
text-align: center;
line-height: 96rpx;
}
}
}
&.live-wrapper-c {
.live-item-a {
display: flex;
flex-direction: column;
.img-box {
width: 100%;
border-radius: 8px 8px 0 0;
}
.info {
display: flex;
justify-content: space-between;
align-items: center;
flex-direction: initial;
.left {
width: 69%;
}
.goods-wrapper {
flex: 1;
}
}
}
}
}
.live-wrapper-b {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: auto;
.live-item-b {
background-color: #fff;
overflow: hidden;
margin-bottom: 20rpx;
overflow: hidden;
.img-box {
position: relative;
image {
width: 100%;
height: 274rpx;
}
}
.info {
display: flex;
flex-direction: column;
padding: 20rpx;
.title {
font-size: 30rpx;
color: #333;
}
.people {
display: flex;
margin-top: 10rpx;
color: #999;
font-size: 24rpx;
}
}
}
}
.label {
display: flex;
align-items: center;
justify-content: center;
position: absolute;
left: 0;
top: 0;
border-radius: 16rpx 0px 16rpx 0;
font-size: 24rpx;
color: #fff;
image {
margin-right: 10rpx;
}
text {
font-size: 22rpx;
}
}
.bgred {
width: 132rpx;
height: 38rpx;
background: linear-gradient(270deg, #F5742F 0%, #FF1717 100%)
}
.bggary {
width: 108rpx;
height: 38rpx;
background: linear-gradient(270deg, #999999 0%, #666666 100%)
}
.bgblue {
width: 220rpx;
height: 38rpx;
background: rgba(0, 0, 0, 0.36);
overflow: hidden;
.txt {
position: relative;
left: -6rpx;
display: flex;
align-items: center;
justify-content: center;
width: 38px;
height: 100%;
text-align: center;
background: linear-gradient(270deg, #2FA1F5 0%, #0076FF 100%);
}
}
</style>