lilishop-uniapp/pages/promotion/lives.vue

379 lines
9.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="box">
<u-navbar class="navbar">
<view class="slot-wrap">
<u-search placeholder="搜索直播间" @custom="searchLive" @clear="clear" @search="searchLive" v-model="keyword"></u-search>
</view>
</u-navbar>
<!-- 轮播图 -->
<u-swiper @click="clickSwiper" class="swiper" :effect3d="true" :list="swiperImg">
</u-swiper>
<u-tabs :is-scroll="false" @change="changeTabs" :current="current" :active-color="activeColor" inactive-color="#606266" ref="tabs" :list="tabs"></u-tabs>
<div class="wrapper">
<!-- 直播中 全部 直播回放 -->
<div class="live-item" :class="{'invalid':item.status == 'END'}" v-for="(item,index) in liveList" :key="index" @click="handleLivePlayer(item)">
<div class="live-cover-img">
<div class="tips">
<div class="live-box">
<image class="live-gif" src="./static/live.gif"></image>
</div>
<span>{{item.status == 'END' ? '已结束' : item.status =='NEW' ? '未开始' : '直播中'}}</span>
</div>
<div class="bg"></div>
<u-image width="326" height="354" :src="item.shareImg" />
</div>
<div class="live-goods">
<div class="live-goods-name">
{{item.name}}
</div>
<div class="live-store">
<span class="wes">lilishop</span>
</div>
<div class="live-goods-list">
<div class="live-goods-item">
<u-image border-radius="20" :src="item.roomGoodsList ? item.roomGoodsList[0] : ''" height="140"></u-image>
</div>
<div class="live-goods-item">
<u-image border-radius="20" :src="item.roomGoodsList ? item.roomGoodsList[1] : ''" height="140"></u-image>
</div>
</div>
</div>
</div>
<u-loadmore v-if="liveList.length > 10" bg-color="#f8f8f8" :status="status" />
</div>
</div>
</template>
<script>
import { getLiveList } from "@/api/promotions.js";
export default {
data() {
return {
status: "loadmore",
activeColor: this.$lightColor,
current: 0, // 当前tabs索引
keyword: "", //搜索直播间
// 标签栏
tabs: [
{
name: "直播中",
},
{
name: "全部",
},
],
// 导航栏的配置
background: {
background: "#ff9f28",
},
// 直播间params
params: [
{
pageNumber: 1,
pageSize: 10,
status: "START",
},
{
pageNumber: 1,
pageSize: 4,
},
],
// 推荐直播间Params
recommendParams: {
pageNumber: 1,
pageSize: 3,
recommend: 0,
},
// 直播间列表
liveList: [],
// 推荐直播间列表
recommendLiveList: [],
//轮播图滚动的图片
swiperImg: [
{
image:
"https://lilishop-oss.oss-cn-beijing.aliyuncs.com/48d789cb9c864b7b87c1c0f70996c3e8.jpeg",
},
],
};
},
onShow() {
this.params[this.current].pageNumber = 1;
this.liveList = [];
this.getLives();
this.getRecommendLives();
},
onReachBottom() {
this.params[this.current].pageNumber++;
this.getLives();
},
methods: {
/**
* 点击标签栏切换
*/
changeTabs(index) {
this.current = index;
this.init();
},
/**
* 初始化直播间
*/
init() {
this.liveList = [];
this.status = "loadmore";
this.getLives();
},
/**
* 清除搜索内容
*/
clear() {
delete this.params[this.current].name;
this.init();
},
/**
* 点击顶部推荐直播间
*/
clickSwiper(val) {
console.log(this.swiperImg[val]);
this.handleLivePlayer(this.swiperImg[val]);
},
/**
* 搜索直播间
*/
searchLive(val) {
this.params[this.current].pageNumber = 1;
this.params[this.current].name = val;
this.init();
},
/**
* 获取推荐直播间
*/
async getRecommendLives() {
this.status = "loading";
let recommendLives = await getLiveList(this.recommendParams);
if (recommendLives.data.success) {
// 推荐直播间
if (recommendLives.data.result.records.length ) {
this.status = "loadmore";
this.recommendLives = recommendLives.data.result.records;
} else {
this.status = "noMore";
}
/**
* 如果推荐直播间没有的情况下
* 1.获取直播间第一个图片
* 2.如果没有直播间设置一个默认图片
*/
if (!this.recommendLives.length) {
if (this.liveList[0].shareImg) {
this.$set(this, "swiperImg", [
{
image: this.liveList[0].shareImg,
roomId: this.liveList[0].roomId,
},
]);
}
} else {
this.recommendLives.forEach((item) => {
this.$set(this, "swiperImg", [
{ image: item.shareImg, roomId: item.roomId },
]);
});
}
}
},
/**
* 获取直播间
*/
async getLives() {
this.status = "loading";
let res = await getLiveList(this.params[this.current]);
// 直播间
if (res.data.success) {
if (res.data.result.records.length ) {
this.status = "loadmore";
this.liveList.push(...res.data.result.records);
} else {
this.status = "noMore";
}
res.data.result.total >
this.params[this.current].pageNumber *
this.params[this.current].pageSize
? (this.status = "loadmore")
: (this.status = "noMore");
this.liveList.forEach((item) => {
if (item.roomGoodsList) {
item.roomGoodsList = JSON.parse(item.roomGoodsList);
}
});
}
},
/**
* 进入直播间
*/
handleLivePlayer(val) {
// #ifdef MP-WEIXIN
let roomId = val.roomId; // 填写具体的房间号,可通过下面【获取直播房间列表】 API 获取
let customParams = encodeURIComponent(
JSON.stringify({ path: "pages/index/index", pid: 1 })
); // 开发者在直播间页面路径上携带自定义参数后续可以在分享卡片链接和跳转至商详页时获取详见【获取自定义参数】、【直播间到商详页面携带参数】章节上限600个字符超过部分会被截断
uni.navigateTo({
url:
"plugin-private://wx2b03c6e691cd7370/pages/live-player-plugin?room_id=" +
roomId +
"&custom_params=" +
customParams,
});
// #endif
// #ifndef MP-WEIXIN
uni.showToast({
title: "请从微信小程序中预览直播功能",
duration: 2000,
icon: "none",
});
// #endif
},
},
};
</script>
<style lang="scss" scoped>
.slot-wrap {
display: flex;
align-items: center;
/* 如果您想让slot内容占满整个导航栏的宽度 */
flex: 1;
/* 如果您想让slot内容与导航栏左右有空隙 */
/* padding: 0 30rpx; */
}
.invalid {
filter: grayscale(1);
}
.wrapper {
padding: 0 24rpx;
}
.live-item {
display: flex;
overflow: hidden;
border-radius: 20rpx;
flex-wrap: wrap;
background: #fff;
margin: 20rpx 0;
}
.live-cover-img {
position: relative;
}
.swiper {
margin: 20rpx 0;
}
.live-goods {
position: relative;
flex: 1;
padding: 16rpx 24rpx 24rpx;
}
.live-goods-name {
height: 84rpx;
font-weight: bold;
font-size: 30rpx;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.live-store {
display: flex;
align-items: center;
margin: 20rpx 0;
overflow: hidden;
width: calc(100% - 50rpx);
}
.live-gif {
width: 20rpx;
height: 20rpx;
}
.live-box {
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
width: 40rpx;
margin-right: 10rpx;
height: 40rpx;
background: linear-gradient(90deg, #ff6b35, #ff9f28, #ffcc03);
}
.live-goods-list {
display: flex;
align-items: center;
justify-content: space-between;
> .live-goods-item {
flex: 1;
}
> .live-goods-item:nth-of-type(1) {
padding-right: 38rpx;
}
}
.live-icon,
.zan {
position: absolute;
width: 80rpx;
height: 80rpx;
z-index: 9;
}
.tips {
display: flex;
position: absolute;
z-index: 9;
align-items: center;
top: 20rpx;
right: 0;
padding: 4rpx 12rpx 4rpx 0;
font-size: 24rpx;
border-radius: 100px;
color: #fff;
background: rgba(0, 0, 0, 0.46);
}
.live-icon {
right: 0;
top: 104rpx;
}
.zan {
bottom: 0;
right: 0;
width: 100rpx;
height: 100rpx;
}
.bg {
position: absolute;
bottom: 4rpx;
width: 100%;
height: 100rpx;
z-index: 8;
background-image: -webkit-gradient(
linear,
left bottom,
left top,
from(rgba(0, 0, 0, 0.25)),
color-stop(82%, transparent)
);
background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.25), transparent 82%);
border-bottom-left-radius: 20rpx;
}
</style>