1539 lines
53 KiB
Vue
1539 lines
53 KiB
Vue
|
|
<template>
|
|||
|
|
<view class="whole">
|
|||
|
|
<view id="video-content-box" preload="auto" playsinline webkit-playsinline>
|
|||
|
|
<!-- <video id="player-container-id" width="414" height="270" preload="auto" playsinline webkit-playsinline>
|
|||
|
|
</video> -->
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="topBox">
|
|||
|
|
<view class="flex1">
|
|||
|
|
<view class="backBox flex2">
|
|||
|
|
<view class="back flex1" @click="toBack('back')"><up-icon name="arrow-left" size="18" color="#333" /></view>
|
|||
|
|
<zb-popover placement="bottom-start" :options="actions" @select="selectPop">
|
|||
|
|
<view class="home"><up-icon name="list-dot" size="20" color="#333" /></view>
|
|||
|
|
</zb-popover>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="cover">
|
|||
|
|
<up-avatar :src="liveInfo.cover_img" size="22"></up-avatar>
|
|||
|
|
<span> {{liveInfo.name}}</span>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
|
|||
|
|
<view class="rank" @click="openRank">
|
|||
|
|
<image style="width: 22px;height: 22px;" src="/static/image/rank.png" mode="aspectFit"></image>
|
|||
|
|
<span> 邀请排行榜</span>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="stbox" v-if="liveInfo.time_status == 1">
|
|||
|
|
<video v-if="liveInfo.warm_img.indexOf('.mp4') >= 0" :src="liveInfo.warm_img" class="img" :autoplay="true" :muted="true" :loop="true" :controls="false" object-fit="fill"></video>
|
|||
|
|
<img class="img" :src="liveInfo.warm_img" />
|
|||
|
|
|
|||
|
|
<view class="box">
|
|||
|
|
<up-avatar size="100" :src="liveInfo.cover_img" />
|
|||
|
|
<view class="tit">{{ liveInfo.name }}</view>
|
|||
|
|
<view class="time">{{ parseTime(liveInfo.live_start_time) }}直播</view>
|
|||
|
|
<!-- <up-button plain round @click="toOther">看看其他直播吧</up-button> -->
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="stbox" v-if="liveInfo.time_status == 2 && !isPlay">
|
|||
|
|
<video v-if="liveInfo.warm_img.indexOf('.mp4') >= 0" :src="liveInfo.warm_img" class="img" :autoplay="true" :muted="true" :loop="true" :controls="false" object-fit="fill"></video>
|
|||
|
|
<img class="img" :src="liveInfo.warm_img" />
|
|||
|
|
|
|||
|
|
<view class="box">
|
|||
|
|
<image style="width: 80px;height: 80px;" src="/static/image/wait.png" mode="aspectFit"></image>
|
|||
|
|
<view class="text">主播暂时离开,马上回来...</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="stbox" v-else-if="liveInfo.time_status == 3">
|
|||
|
|
<video v-if="liveInfo.warm_img.indexOf('.mp4') >= 0" :src="liveInfo.warm_img" class="img" :autoplay="true" :muted="true" :loop="true" :controls="false" object-fit="fill"></video>
|
|||
|
|
<img class="img" :src="liveInfo.warm_img" />
|
|||
|
|
|
|||
|
|
<view class="box">
|
|||
|
|
<up-avatar size="100" :src="liveInfo.cover_img" />
|
|||
|
|
<view class="tit">直播已结束</view>
|
|||
|
|
<!-- <up-button plain round @click="toOther">看看其他直播吧</up-button> -->
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view :class="showGood ? 'fadeIn' : 'fadeOut'" class="spBox" @click="toGroup">
|
|||
|
|
<view class="face_img">
|
|||
|
|
<img :src="curGroup.face_img" class="img" />
|
|||
|
|
<view class="close" @click.stop="showGood = false">
|
|||
|
|
<up-icon name="close" size="12" color="#fff"></up-icon>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="tit">{{curGroup.title}}</view>
|
|||
|
|
<view class="price">
|
|||
|
|
<view class="icon">¥</view>
|
|||
|
|
<text v-if="curGroup.max_price === curGroup.min_price">{{curGroup.min_price}}</text>
|
|||
|
|
<text v-else>{{curGroup.min_price * 1}}~{{curGroup.max_price * 1}}</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="btn flex1" @click.stop="toPay(curGroup.id)">立即购买</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="msgBox" id="msgBox">
|
|||
|
|
<view class="scrollBox" id="scrollBox">
|
|||
|
|
<view class="row" v-for="(it, i) in messageList" :key="i" :id="'item' + i">
|
|||
|
|
<text v-if="it.name">{{it.name}}</text>{{it.text}}
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="btmBox flex2">
|
|||
|
|
<view class="inpBox">
|
|||
|
|
<input v-model="keyValue" id="sendInput" :focus="sendFocus" type="text" class="inpt" placeholder="说点什么..." @confirm="sendBarrage" confirm-type="send" />
|
|||
|
|
<view class="more flex1" @click="showMore = true">
|
|||
|
|
<text class="iconfont icon-more"></text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="iconBox flex2">
|
|||
|
|
<view class="icon flex1" @click="showGroups = true">
|
|||
|
|
<image class="img" src="/static/image/cart.png" mode="aspectFit"></image>
|
|||
|
|
</view>
|
|||
|
|
<view class="icon flex1" v-if="userId == 7280430 || userId == 7438380 || userId == 7280144 || userId == 242927" @click="showError = true">
|
|||
|
|
<image class="img" src="/static/image/zan.png" mode="aspectFit"></image>
|
|||
|
|
</view>
|
|||
|
|
<view class="icon flex1" @click="toShare">
|
|||
|
|
<image class="img" src="/static/image/share.png" mode="aspectFit"></image>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<up-popup :show="showRank" :round="10" mode="bottom" @close="showRank = false" closeable>
|
|||
|
|
<view class="topTitle">邀请榜单</view>
|
|||
|
|
<view class="listbox">
|
|||
|
|
<view class="rankbox">
|
|||
|
|
<view v-if="rankloading" class="loadbox">
|
|||
|
|
<up-loading-icon text="加载中..." textSize="14"></up-loading-icon>
|
|||
|
|
</view>
|
|||
|
|
<view class="row flex2" v-for="(item, index) in rankList" :key="item.id">
|
|||
|
|
<view class="box" v-if="item.user">
|
|||
|
|
<view class="sort flex1" :class="'sort' + index">{{index + 1}}</view>
|
|||
|
|
<up-avatar shape="square" size="30" :src="item.user.avatar" />
|
|||
|
|
<text> {{item.user.nickname}}</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="num">{{item.invite_count}}位</view>
|
|||
|
|
</view>
|
|||
|
|
<view v-if="rankList.length === 0 && !rankloading">
|
|||
|
|
<up-empty mode="list" icon="https://ct-upimg.yx090.com/g.ii090/images/sprite/empty/data.png" text="暂无数据"></up-empty>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="topname" @click="showInvite = true">
|
|||
|
|
<up-avatar size="25" :src="myAvatar" />
|
|||
|
|
<view class="box">
|
|||
|
|
<view class="name">{{nickname}}</view>
|
|||
|
|
<view class="desc">已邀请{{inviteList.length}}人</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<up-popup :show="showInvite" :round="10" mode="bottom" @close="showInvite = false" closeable>
|
|||
|
|
<view class="topTitle">我的邀请</view>
|
|||
|
|
<view class="listbox">
|
|||
|
|
<up-list height="100%">
|
|||
|
|
<up-list-item v-for="(item, index) in inviteList" :key="index">
|
|||
|
|
<up-cell v-if="item.invitee_user" :title="item.invitee_user.nickname">
|
|||
|
|
<template #icon>
|
|||
|
|
<up-avatar shape="square" size="30" :src="item.invitee_user.avatar" customStyle="margin: -3px 5px -3px 0"></up-avatar>
|
|||
|
|
</template>
|
|||
|
|
</up-cell>
|
|||
|
|
</up-list-item>
|
|||
|
|
</up-list>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<up-popup :show="showCoupon" :round="10" mode="bottom" @close="showCoupon = false" closeable>
|
|||
|
|
<view class="topTitle">我的优惠券</view>
|
|||
|
|
<view class="listbox">
|
|||
|
|
<view class="couponbox" v-if="myCoupon.length !== 0">
|
|||
|
|
<view class="coupon-box" v-for="(item, index) in myCoupon" :key="index">
|
|||
|
|
<view class="oneBox">
|
|||
|
|
<view class="coupon-left" :class="item.status == 1 ? 'textColor1' : 'textColor2'">
|
|||
|
|
<text class="sign">¥<text class="money">{{item.amount}}</text></text>
|
|||
|
|
<view class="title" v-if="item.full_amount * 100 > 0">满{{item.full_amount}}元可用</view>
|
|||
|
|
<view class="title" v-else-if="item.type == 51">抵扣金额</view>
|
|||
|
|
<view class="title" v-else>无门槛</view>
|
|||
|
|
<view class="vipTag" v-if="item.type == 12">会员优惠券</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="coupon-right">
|
|||
|
|
<view class="birth" v-if="item.source_type == 'birth'">生日优惠券</view>
|
|||
|
|
<view v-if="item.use_type == 20 || item.use_type === 31" class="text chang" :class="item.status == 1 ? 'textColor' : 'textColor2'">仅该团购可用:{{item.extend.title}}</view>
|
|||
|
|
<view v-else-if="item.use_type == 21 && item.type === 50" class="text" :class="item.status == 1 ? 'textColor' : 'textColor2'">
|
|||
|
|
{{item.extend && item.extend.title || '积分商品可用'}}
|
|||
|
|
<view class="red_label">
|
|||
|
|
<view class="red_col red_col1">积分实物兑换</view>
|
|||
|
|
<view class="red_col red_col2">抵扣券</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view v-else-if="item.type === 51" class="text" :class="item.status == 1 ? 'textColor' : 'textColor2'">
|
|||
|
|
{{item.extend && item.extend.title || '实物商品可用'}}
|
|||
|
|
<view class="red_label">
|
|||
|
|
<view class="red_col red_col1">实物商品兑换</view>
|
|||
|
|
<view class="red_col red_col2">抵扣券</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view v-else-if="item.use_type === 40 || item.use_type === 41" class="text" :class="item.status == 1 ? 'textColor' : 'textColor2'">
|
|||
|
|
<text>指定团购分类可用</text>
|
|||
|
|
</view>
|
|||
|
|
<view v-else class="text" :class="item.status == 1 ? 'textColor' : 'textColor2'">
|
|||
|
|
<text v-if="Number(item.amount) < 3">全场通用</text>
|
|||
|
|
<text v-else>部分团可用</text>
|
|||
|
|
</view>
|
|||
|
|
<view v-if="item.shop_groups && (item.use_type === 40 || item.use_type === 41)">
|
|||
|
|
<view class="solid" :class="item.status == 1 ? 'red' : ''" v-for="it in item.shop_groups" :key="it.id">{{it.name}}</view>
|
|||
|
|
</view>
|
|||
|
|
<text class="time">{{item.finish_time.substring(0, 16)}}前有效</text>
|
|||
|
|
<view class="tips">福利款、活动产品、跨境产品不能使用且不能叠加</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view v-if="item.status == 2" class="cannot one" :style="{backgroundImage: 'url(' + sp2 + ')'}"></view>
|
|||
|
|
<view v-if="item.status == 3" class="cannot two" :style="{backgroundImage: 'url(' + sp2 + ')'}"></view>
|
|||
|
|
<view v-if="item.status == 4" class="cannot three"></view>
|
|||
|
|
|
|||
|
|
<view class="tag" v-if="item.is_transfer">
|
|||
|
|
<up-tag size="mini" type="warning" text="好友赠送"></up-tag>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="twoBox" v-if="item.status == 1">
|
|||
|
|
<view class="coupon-btn" @click="gotoHome(item)">立即使用</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view style="height: 1px;"></view>
|
|||
|
|
</view>
|
|||
|
|
<template v-if="!couponloading && !myCoupon.length">
|
|||
|
|
<up-empty mode="coupon" icon="https://ct-upimg.yx090.com/g.ii090/images/sprite/empty/coupon.png" text="暂无优惠券"></up-empty>
|
|||
|
|
</template>
|
|||
|
|
<view v-if="couponloading" class="loadbox">
|
|||
|
|
<up-loading-icon text="加载中..." textSize="14"></up-loading-icon>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<up-popup :show="showMore" :round="10" mode="bottom" @close="showMore = false" closeable>
|
|||
|
|
<view class="topTitle">更多</view>
|
|||
|
|
<view class="morebox">
|
|||
|
|
<view class="row flex1" v-for="it in moreList" :key="it.id" @click="handleMore(it.id)">
|
|||
|
|
<view class="icon"><up-icon :name="it.icon" size="28" :color="Color"></up-icon></view>
|
|||
|
|
<text>{{it.name}}</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<up-popup :show="showGroups" :round="10" mode="bottom" @close="showGroups = false" closeable :z-index="190">
|
|||
|
|
<view class="topTitle flex2">
|
|||
|
|
<text>团购列表</text>
|
|||
|
|
<view class="iconBox">
|
|||
|
|
<view class="icon" @click="handleMore(3)"><up-icon name="shopping-cart-fill" size="20" color="#555"></up-icon>购物车</view>
|
|||
|
|
<view class="icon" @click="handleMore(2)"><up-icon name="file-text-fill" size="20" color="#555"></up-icon>订单</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="listbox">
|
|||
|
|
<view class="groupBox">
|
|||
|
|
<view class="item" v-for="(item, index) in groupsList" :key="item.id" @click="toGoods(item.id)">
|
|||
|
|
<view class="faceImg">
|
|||
|
|
<image :src="item.face_img" mode="aspectFill" class="image"></image>
|
|||
|
|
<view class="out" v-if="item.sold_status === 2">
|
|||
|
|
<img src="https://ct-upimg.yx090.com/ju8hn6/shop/image/2024/01/16/Cr6cRRhhqYNhScigxIyumyV9hXXMI3vKvsE1jgt0.png" class="out_img" />
|
|||
|
|
</view>
|
|||
|
|
<view class="out" v-else-if="item.sold_status === 0">
|
|||
|
|
<img src="https://ct-upimg.yx090.com/ju8hn6/shop/image/2024/08/21/QBhUheeYWSJ3OGM27fkAufJAlFSA8GBhWjpY5oNy.png" class="out_img" />
|
|||
|
|
</view>
|
|||
|
|
<view class="out" v-else-if="item.total_stock === 0">
|
|||
|
|
<img src="https://ct-upimg.yx090.com/ju8hn6/shop/image/2024/08/21/pMTv6QiZZEpSqkJmk7hMcbEzIuNzMyp7YVBbe42H.png" class="out_img" />
|
|||
|
|
</view>
|
|||
|
|
<view class="zhibo" v-if="item.id == curGroup.id">
|
|||
|
|
<text class="iconfont icon-zhibozhong"></text>
|
|||
|
|
<text> 讲解中</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="info">
|
|||
|
|
<view class="box">
|
|||
|
|
<view class="name">{{item.title}}</view>
|
|||
|
|
<view class="desc">{{item.characteristic}}</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="price flex2">
|
|||
|
|
<view>
|
|||
|
|
<text v-if="parseFloat(item.min_price) == parseFloat(item.max_price)">¥{{item.min_price}}</text>
|
|||
|
|
<text v-else>¥{{item.min_price * 1}}~{{item.max_price}}</text>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="cart flex1" @click.stop="toPay(item.id)">
|
|||
|
|
<up-icon name="shopping-cart" color="#fff" size="20" />
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<template v-if="!groupsList.length">
|
|||
|
|
<up-empty mode="coupon" icon="https://ct-upimg.yx090.com/g.ii090/images/sprite/empty/data.png" text="暂无团购"></up-empty>
|
|||
|
|
</template>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
|
|||
|
|
<view v-if="showCouGift" class="dialogbox">
|
|||
|
|
<view class="rect">
|
|||
|
|
<image class="img" src="/static/image/dialog.png" mode="widthFix"></image>
|
|||
|
|
<view class="box">
|
|||
|
|
<view class="coupon">
|
|||
|
|
<view class="left">
|
|||
|
|
<view class="sign"><text>¥</text>{{curCoupon.amount}}</view>
|
|||
|
|
<view class="title" v-if="curCoupon.use_type === 30 || curCoupon.use_type === 31">满{{curCoupon.full_amount}}元可用</view>
|
|||
|
|
<view class="title" v-else>无门槛</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="right">
|
|||
|
|
<text v-if="curCoupon.use_type == 20 || curCoupon.use_type === 31">指定团购可用</text>
|
|||
|
|
<text v-if="curCoupon.use_type == 40 || curCoupon.use_type === 41">指定团购分类可用</text>
|
|||
|
|
<text v-else>全场通用</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<!-- <view class="desc">小象八宝粥团购可用</view> -->
|
|||
|
|
<view class="btn flex1" @click="receiveCoupon">立即领取({{timeNum}})</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="close" @click="closeCoupon">
|
|||
|
|
<up-icon name="close-circle" color="#fff" size="26" />
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<!-- 客服 -->
|
|||
|
|
<call-center :show="showService" @close="showService = false" :type="1" />
|
|||
|
|
|
|||
|
|
<!-- 客服 -->
|
|||
|
|
<live-share :show="showShare" @close="showShare = false" :id="liveId" :userId="userId" :info="liveInfo"></live-share>
|
|||
|
|
|
|||
|
|
<!-- 商品详情 -->
|
|||
|
|
<group-detail :show="showDetail" :id="groupId" @close="showDetail = false" :live_id="liveId" :streamer_id="streamerId" @back="showlivePay = true"></group-detail>
|
|||
|
|
|
|||
|
|
<direct-pay
|
|||
|
|
:show="showMorePay"
|
|||
|
|
@close="showMorePay = false"
|
|||
|
|
:sourceId="source_id"
|
|||
|
|
:sourceType="source_type"
|
|||
|
|
:show_stock="show_stock"
|
|||
|
|
:groupId="groupId"
|
|||
|
|
:skus_1="skus_1"
|
|||
|
|
:goodId="goodId"
|
|||
|
|
:live_id="liveId"
|
|||
|
|
:streamer_id="streamerId">
|
|||
|
|
</direct-pay>
|
|||
|
|
|
|||
|
|
<view class="bagBox" @click="openBless()" v-if="showBag">
|
|||
|
|
<image src="https://ct-upimg.yx090.com/ju8hn6/shop/image/2025/08/07/0wBdpTq2EEgLUZskqv0VPhIcJZJqxPPFffPGpMJ6.png" mode="aspectFill"></image>
|
|||
|
|
<view class="box">
|
|||
|
|
<up-count-down :time="downTime" format="mm:ss" />
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<!-- 福袋 -->
|
|||
|
|
<up-popup :show="showBless" :round="10" mode="bottom" @close="showBless = false" closeable>
|
|||
|
|
<view class="bleBox">
|
|||
|
|
<view class="title"><up-count-down :time="downTime" format="mm:ss后开奖" /></view>
|
|||
|
|
<view class="tit">{{blessInfo.name}}</view>
|
|||
|
|
<view class="text">{{blessInfo.num}}个名额</view>
|
|||
|
|
<image src="https://ct-upimg.yx090.com/ju8hn6/shop/image/2025/08/06/VeQDyrVh1hWLad6vISAzz1qWwz7Aqitc6P1oumcY.png" mode="aspectFill"></image>
|
|||
|
|
<view class="txt" v-if="blessInfo.myLotteryLog">已参与</view>
|
|||
|
|
<view class="txt" v-else>
|
|||
|
|
<text v-if="blessInfo.config && blessInfo.config.conditionType == 2">输入指定评论参与抽奖:{{blessInfo.config.conditionData.join('|')}}</text>
|
|||
|
|
<text v-else>输入任意评价参与抽奖</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="btn flex1 hui" v-if="blessInfo.myLotteryLog">参与成功,等待主播开奖</view>
|
|||
|
|
<view class="btn flex1" v-else @touchend.prevent="toComment"><up-icon name="edit-pen" color="#fff" size="28"></up-icon>发表评论后参与</view>
|
|||
|
|
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<!-- 福袋中奖 -->
|
|||
|
|
<up-popup :show="showLottery" :round="10" mode="bottom" @close="showLottery = false" closeable>
|
|||
|
|
<view class="lotBox">
|
|||
|
|
<image class="img" src="https://ct-upimg.yx090.com/ju8hn6/shop/image/2025/08/07/4F9fwjpL74jHcdFBE1jGJerkszR7VZyz8Q2sjJw0.png" mode="widthFix"></image>
|
|||
|
|
<view class="title">恭喜中奖</view>
|
|||
|
|
<view class="box flex1">
|
|||
|
|
<view class="score" v-if="lottery.reward_type == 4">{{lottery.type_value}}<text>积分</text></view>
|
|||
|
|
|
|||
|
|
<view class="BBox" v-else-if="lottery.reward_type == 3">
|
|||
|
|
<view class="itm">
|
|||
|
|
<image :src="lottery.extend.face_img" mode="aspectFill"></image>
|
|||
|
|
<view class="tit">{{lottery.extend.title}}</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="dec">超高折扣商品</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="couBox" v-else-if="lottery.reward_type == 2">
|
|||
|
|
<view class="itm">
|
|||
|
|
<view class="sign flex">
|
|||
|
|
<view class="num">¥<text class="money">{{lottery.amount * 1}}</text></view>
|
|||
|
|
<text v-if="lottery.full_amount * 1 > 0">满{{lottery.full_amount * 1}}可用</text>
|
|||
|
|
<text v-else>无门槛</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="mid">
|
|||
|
|
<view v-if="(lottery.use_type == 20 || lottery.use_type === 31) && lottery.extend" class="text">指定团购可用:{{lottery.extend.title}}</view>
|
|||
|
|
<view v-else-if="lottery.use_type === 40 || lottery.use_type === 41" class="text">指定团购分类可用</view>
|
|||
|
|
<view v-else class="text">
|
|||
|
|
<text v-if="Number(lottery.amount) < 3">全场通用</text>
|
|||
|
|
<text v-else>部分团可用</text>
|
|||
|
|
</view>
|
|||
|
|
<view v-if="lottery.shop_groups && (lottery.use_type === 40 || lottery.use_type === 41)">
|
|||
|
|
<view class="solid red" v-for="it in lottery.shop_groups" :key="it.id">{{it.name}}</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<text class="time" v-if="lottery.finish_time">{{lottery.finish_time.substring(0, 16)}}前有效</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="btn flex1" v-if="lottery.reward_type == 4">已发放至您账户<br />可在“我的-积分"查看</view>
|
|||
|
|
<view class="btn flex1" v-else>已发放至您账户<br />可在“我的-优惠券"查看</view>
|
|||
|
|
<view class="desc" @click="viewLotteryLogs">查看中奖记录 ></view>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<up-popup :show="showFail" :round="10" mode="bottom" @close="showFail = false" closeable>
|
|||
|
|
<view class="failBox">
|
|||
|
|
<image class="img" src="https://ct-upimg.yx090.com/ju8hn6/shop/image/2025/08/07/4F9fwjpL74jHcdFBE1jGJerkszR7VZyz8Q2sjJw0.png" mode="widthFix"></image>
|
|||
|
|
<view class="title">很遗憾未中奖</view>
|
|||
|
|
|
|||
|
|
<view class="btn flex1">下次再来</view>
|
|||
|
|
<view class="desc" @click="viewLotteryLogs">查看中奖记录 ></view>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<up-popup :show="showPlayer" :round="10" mode="bottom">
|
|||
|
|
<view class="playBox">
|
|||
|
|
<view class="title">
|
|||
|
|
<view class="close flex1" @click="showPlayer = false"><up-icon name="arrow-left" color="#953315" size="20" /></view>
|
|||
|
|
<text>{{lotteryLogs.length}}人中奖</text>
|
|||
|
|
</view>
|
|||
|
|
<view class="box">
|
|||
|
|
<view class="row flex2" v-for="it in lotteryLogs" :key="it.id">
|
|||
|
|
<view class="name" v-if="it.user">
|
|||
|
|
<image class="img" :src="it.user.avatar" mode="aspectFill"></image>
|
|||
|
|
<text> {{it.user.nickname}}</text>
|
|||
|
|
</view>
|
|||
|
|
<view v-if="it.reward_type == 2">
|
|||
|
|
<text v-if="it.user_coupon.full_amount * 100 > 0">满{{it.user_coupon.full_amount * 1}}减{{it.user_coupon.amount * 1}}优惠券</text>
|
|||
|
|
<text v-else>{{it.user_coupon.amount}}元无门槛优惠券</text>
|
|||
|
|
</view>
|
|||
|
|
<view v-else-if="it.reward_type == 3">实物商品抵扣券</view>
|
|||
|
|
<view v-else-if="it.reward_type == 4">{{it.prize.type_value}}积分</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<up-popup :show="showMyPrize" :round="10" mode="bottom" @close="showMyPrize = false" closeable>
|
|||
|
|
<view class="playBox">
|
|||
|
|
<view class="topTitle">我的奖励</view>
|
|||
|
|
<view class="box">
|
|||
|
|
<view class="row flex2" v-for="it in lotteryLogs" :key="it.id">
|
|||
|
|
<view class="name" v-if="it.user">
|
|||
|
|
<image class="img" :src="it.user.avatar" mode="aspectFill"></image>
|
|||
|
|
<view style="padding-left: 3px;text-align: left;">
|
|||
|
|
<text>{{it.user.nickname}}</text>
|
|||
|
|
<view v-if="(it.reward_type == 2 || it.reward_type == 3) && it.user_coupon && it.user_coupon.status != 1">
|
|||
|
|
<text class="minitag">{{Status[it.user_coupon.status]}}</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view class="right" @click="toCoupon(it)">
|
|||
|
|
<view v-if="it.reward_type == 2">
|
|||
|
|
<view style="display: flex;align-items: center;justify-content: flex-end;">
|
|||
|
|
<text class="iconfont icon-youhuiquan"></text>
|
|||
|
|
<view v-if="it.user_coupon.use_type == 20 || it.user_coupon.use_type === 31" class="text">仅该团购可用:{{it.user_coupon.extend.title}}</view>
|
|||
|
|
<view v-else-if="it.user_coupon.type === 51" class="text">
|
|||
|
|
{{it.user_coupon.extend && it.user_coupon.extend.title || '实物商品可用'}}
|
|||
|
|
<view class="red_label">
|
|||
|
|
<view class="red_col red_col1">实物商品兑换</view>
|
|||
|
|
<view class="red_col red_col2">抵扣券</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<view v-else-if="it.user_coupon.use_type === 40 || it.user_coupon.use_type === 41" class="text">
|
|||
|
|
<text>指定团购分类可用</text>
|
|||
|
|
</view>
|
|||
|
|
<view v-else class="text">
|
|||
|
|
<text v-if="Number(it.user_coupon.amount) < 3">全场通用券</text>
|
|||
|
|
<text v-else>部分团可用</text>
|
|||
|
|
</view>
|
|||
|
|
<view v-if="it.user_coupon.shop_groups && (it.user_coupon.use_type === 40 || it.user_coupon.use_type === 41)">
|
|||
|
|
<view class="solid red" v-for="itm in it.user_coupon.shop_groups" :key="itm.user_coupon.id">{{itm.name}}</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view v-else-if="it.reward_type == 3"><text class="iconfont icon-youhuiquan"></text>实物商品抵扣券</view>
|
|||
|
|
<view v-else-if="it.reward_type == 4">{{it.prize.type_value}}积分</view>
|
|||
|
|
<view class="time">{{it.created_at}}</view>
|
|||
|
|
</view>
|
|||
|
|
<view v-if="(it.reward_type == 2 || it.reward_type == 3) && it.user_coupon && it.user_coupon.status == 1">
|
|||
|
|
<up-icon name="arrow-right" size="16" color="#888" />
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
<up-empty v-if="!lotteryLogs.length" mode="data" icon="https://ct-upimg.yx090.com/g.ii090/images/sprite/empty/data.png" text="暂无数据"></up-empty>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<up-popup :show="showError" :round="10" mode="bottom" @close="showError = false" closeable>
|
|||
|
|
<view style="height: 70vh;background-color: #fff;overflow: auto;">
|
|||
|
|
<view v-for="(it, i) in errorList" :key="i">{{it.text}}</view>
|
|||
|
|
<up-button @click="errorList = []">清空</up-button>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
|
|||
|
|
<!-- 订单支付页 -->
|
|||
|
|
<up-popup :show="showlivePay" :round="10" mode="bottom" @close="showlivePay = false" closeable>
|
|||
|
|
<view style="padding: 24rpx 0;text-align: center;">订单支付</view>
|
|||
|
|
<view style="height: 70vh;background-color: #f5f5f5;overflow: auto;">
|
|||
|
|
<live-pay :show="showlivePay" :live_id="liveId" :streamer_id="streamerId" :address="addr"></live-pay>
|
|||
|
|
</view>
|
|||
|
|
</up-popup>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import { reactive, toRefs, watch, ref, nextTick } from 'vue'
|
|||
|
|
import { get, post } from '@/api/request.js'
|
|||
|
|
// import TCPlayer from 'tcplayer.js';
|
|||
|
|
// import 'tcplayer.js/dist/tcplayer.min.css';
|
|||
|
|
import TencentCloudChat from '@tencentcloud/chat'
|
|||
|
|
import TIMUploadPlugin from 'tim-upload-plugin'
|
|||
|
|
import wx from 'weixin-js-sdk'
|
|||
|
|
import { showToast, judgeShop, userBind } from '@/components/common.js'
|
|||
|
|
import callCenter from '@/components/callCenter/index.vue'
|
|||
|
|
import zbPopover from '@/components/Popover/index.vue'
|
|||
|
|
import liveShare from '@/components/live/share.vue'
|
|||
|
|
import groupDetail from '@/components/groups/detail.vue'
|
|||
|
|
import directPay from '@/components/sku/directPay.vue'
|
|||
|
|
import dayjs from 'dayjs'
|
|||
|
|
import { sp2 } from '@/components/img.js'
|
|||
|
|
import livePay from '../pay/index.vue'
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
components: {
|
|||
|
|
callCenter, zbPopover, liveShare, groupDetail, directPay, livePay
|
|||
|
|
},
|
|||
|
|
setup() {
|
|||
|
|
const data = reactive({
|
|||
|
|
sp2: sp2,
|
|||
|
|
liveId: 0,
|
|||
|
|
Color: uni.getStorageSync('theme_color'),
|
|||
|
|
player: null,
|
|||
|
|
liveInfo: {},
|
|||
|
|
curGroup: {},
|
|||
|
|
showGood: false,
|
|||
|
|
keyValue: '',
|
|||
|
|
sendFocus: false,
|
|||
|
|
userId: 0,
|
|||
|
|
userSign: '',
|
|||
|
|
chat: null,
|
|||
|
|
messageList: [],
|
|||
|
|
showRank: false,
|
|||
|
|
rankList: [],
|
|||
|
|
rankloading: [],
|
|||
|
|
inviteList: [],
|
|||
|
|
showInvite: false,
|
|||
|
|
myAvatar: uni.getStorageSync('avatar'),
|
|||
|
|
nickname: uni.getStorageSync('nickname'),
|
|||
|
|
showCoupon: false,
|
|||
|
|
myCoupon: [],
|
|||
|
|
couponloading: false,
|
|||
|
|
shop_id: uni.getStorageSync('shop_id'),
|
|||
|
|
groupsMark: {},
|
|||
|
|
groupsList: [],
|
|||
|
|
couponMark: {},
|
|||
|
|
couponList: [],
|
|||
|
|
showMore: false,
|
|||
|
|
moreList: [
|
|||
|
|
{ id: 1, name: '优惠券', icon: 'red-packet-fill' },
|
|||
|
|
{ id: 2, name: '订单', icon: 'file-text-fill' },
|
|||
|
|
{ id: 3, name: '购物车', icon: 'shopping-cart-fill' },
|
|||
|
|
{ id: 4, name: '奖励', icon: 'gift-fill' },
|
|||
|
|
{ id: 5, name: '投诉', icon: 'info-circle-fill' }
|
|||
|
|
],
|
|||
|
|
actions: [
|
|||
|
|
{ id: 0, text: '首页', icon: 'home-fill' },
|
|||
|
|
{ id: 1, text: '联系团长', icon: 'chat-fill' },
|
|||
|
|
{ id: 2, text: '搜索团购', icon: 'bag-fill' },
|
|||
|
|
{ id: 3, text: '收藏与浏览', icon: 'heart-fill' },
|
|||
|
|
{ id: 4, text: '购物车', icon: 'shopping-cart-fill' }
|
|||
|
|
],
|
|||
|
|
Status: {
|
|||
|
|
'2': '已使用',
|
|||
|
|
'3': '已过期',
|
|||
|
|
'4': '已失效',
|
|||
|
|
'5': '已转赠'
|
|||
|
|
},
|
|||
|
|
isPlay: false,
|
|||
|
|
showGroups: false,
|
|||
|
|
streamerId: '',
|
|||
|
|
intoView: '',
|
|||
|
|
showCouGift: false,
|
|||
|
|
timeInterval: null,
|
|||
|
|
curCoupon: {},
|
|||
|
|
timeNum: 10,
|
|||
|
|
showService: false,
|
|||
|
|
showShare: false,
|
|||
|
|
groupId: 0,
|
|||
|
|
showDetail: false,
|
|||
|
|
show_stock: 0,
|
|||
|
|
source_id: 0,
|
|||
|
|
source_type: 'normal',
|
|||
|
|
showMorePay: false,
|
|||
|
|
goodId: 0,
|
|||
|
|
downTime: 60000,
|
|||
|
|
showBless: false,
|
|||
|
|
showLottery: false,
|
|||
|
|
showPlayer: false,
|
|||
|
|
blessId: 0,
|
|||
|
|
blessInfo: {},
|
|||
|
|
showBag: false,
|
|||
|
|
showFail: false,
|
|||
|
|
lottery: {},
|
|||
|
|
lotteryLogs: [],
|
|||
|
|
showMyPrize: false,
|
|||
|
|
showError: false,
|
|||
|
|
errorList: [],
|
|||
|
|
is_paused: false,
|
|||
|
|
showlivePay: false,
|
|||
|
|
addr: {}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
function creatVideoDom() {
|
|||
|
|
const video = document.createElement("video")
|
|||
|
|
video.setAttribute("id", "player-container-id");
|
|||
|
|
video.setAttribute("style", "height: 100vh;width: 100%;");
|
|||
|
|
video.setAttribute('playsinline', true);
|
|||
|
|
video.setAttribute('webkit-playsinline', true) // video的属性
|
|||
|
|
// video.setAttribute("preload", "auto");
|
|||
|
|
// video.setAttribute("x5-video-player-type", "h5");
|
|||
|
|
// video.setAttribute("x5-video-player-fullscreen", true);
|
|||
|
|
// video.setAttribute("show-center-play-btn", false);
|
|||
|
|
// video.setAttribute("x5-playsinline", '');
|
|||
|
|
// video.setAttribute("x5-video-orientation", 'portrait');
|
|||
|
|
document.getElementById("video-content-box").appendChild(video);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function getLiveInfo(from) {
|
|||
|
|
data.errorList.push({text: 'getLiveInfo:-----' + from})
|
|||
|
|
await get('/api/v1/live/customer/liveDetail/' + data.liveId).then(async(res) => {
|
|||
|
|
data.liveInfo = res
|
|||
|
|
data.isPlay = false
|
|||
|
|
// time_status 1 未开始 2进行中 3已结束
|
|||
|
|
if(res.time_status == 2) {
|
|||
|
|
for (let index = 0; index < res.streamers.length; index++) {
|
|||
|
|
let item = res.streamers[index]
|
|||
|
|
if(item.pivot.live_status == 1) {
|
|||
|
|
data.isPlay = true
|
|||
|
|
data.streamerId = item.id
|
|||
|
|
getPullUrl('getLiveInfo')
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uni.setNavigationBarTitle({
|
|||
|
|
title: res.name
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
data.show_stock = res.shop.show_stock
|
|||
|
|
|
|||
|
|
// 直播团购
|
|||
|
|
if(res.shop_group_goods && res.shop_group_goods.length) {
|
|||
|
|
data.groupsList = []
|
|||
|
|
data.curGroup = {}
|
|||
|
|
res.shop_group_goods.forEach((it, i) => {
|
|||
|
|
data.groupsMark[it.id] = i
|
|||
|
|
if(it.pivot && it.pivot.status == 1) {
|
|||
|
|
data.curGroup = it
|
|||
|
|
data.showGood = true
|
|||
|
|
} else {
|
|||
|
|
data.groupsList.push(it)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
if(data.curGroup.id) {
|
|||
|
|
data.groupsList.unshift(data.curGroup)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 优惠券
|
|||
|
|
if(res.shop_coupons && res.shop_coupons.length) {
|
|||
|
|
data.couponList = res.shop_coupons
|
|||
|
|
res.shop_coupons.forEach((it, i) => {
|
|||
|
|
data.couponMark[it.id] = i
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(res.live_bags && res.live_bags.length) {
|
|||
|
|
for(let i = 0; i < res.live_bags.length; i++) {
|
|||
|
|
if(res.live_bags[i].activity_status == 30 && res.live_bags[i].end_time && dayjs().isBefore(dayjs(res.live_bags[i].end_time))) {
|
|||
|
|
data.blessId = res.live_bags[i].id
|
|||
|
|
getBlessInfo()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function regetPull() {
|
|||
|
|
get('/api/v1/live/customer/liveDetail/' + data.liveId).then(async(res) => {
|
|||
|
|
data.liveInfo = res
|
|||
|
|
data.isPlay = false
|
|||
|
|
// time_status 1 未开始 2进行中 3已结束
|
|||
|
|
if(res.time_status == 2) {
|
|||
|
|
for (let index = 0; index < res.streamers.length; index++) {
|
|||
|
|
let item = res.streamers[index]
|
|||
|
|
if(item.pivot.live_status == 1) {
|
|||
|
|
data.isPlay = true
|
|||
|
|
data.streamerId = item.id
|
|||
|
|
getPullUrl('regetPull')
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function getPullUrl(from) {
|
|||
|
|
data.errorList.push({text: 'getPullUrl11:-----' + from + '--id:' + data.liveId})
|
|||
|
|
await get('/api/v1/live/customer/getPullUrl', {liveId: data.liveId}).then(async(res) => {
|
|||
|
|
data.player = TCPlayer('player-container-id', {
|
|||
|
|
sources: [{
|
|||
|
|
src: res.pullUrl, // 播放地址
|
|||
|
|
}],
|
|||
|
|
playsinline: true,
|
|||
|
|
'webkit-playsinline': true,
|
|||
|
|
licenseUrl: res.licenseUrl, // license 地址,必传。参考准备工作部分,在视立方控制台申请 license 后可获得 licenseUrl
|
|||
|
|
autoplay: true,
|
|||
|
|
muted: false,
|
|||
|
|
// bigPlayButton: false,
|
|||
|
|
// controlBar: {
|
|||
|
|
// progressControl: false,
|
|||
|
|
// playToggle: false
|
|||
|
|
// },
|
|||
|
|
languages:{
|
|||
|
|
"zh-cn":{
|
|||
|
|
"A network error caused the media download to fail part-way.": "播放错误,请刷新页面重试"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
data.is_paused = false
|
|||
|
|
// data.player.play()
|
|||
|
|
|
|||
|
|
data.player.on('error', function(error) {
|
|||
|
|
console.log('播放错误', error)
|
|||
|
|
data.errorList.push({text: '播放错误:' + JSON.stringify(error)})
|
|||
|
|
refreshPlayer()
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
data.player.on('pause', function(error) {
|
|||
|
|
console.log('暂停时触发', error)
|
|||
|
|
data.is_paused = true
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function refreshPlayer() {
|
|||
|
|
if(data.player) {
|
|||
|
|
data.player.dispose()
|
|||
|
|
data.player = null
|
|||
|
|
}
|
|||
|
|
const div = document.getElementById('video-content-box')
|
|||
|
|
if(div) {
|
|||
|
|
div.replaceChildren()
|
|||
|
|
}
|
|||
|
|
creatVideoDom()
|
|||
|
|
getLiveInfo()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function getUserSign() {
|
|||
|
|
await get('/api/v1/live/liveIm/getUserSign').then((res) => {
|
|||
|
|
data.userId = res.userId + ''
|
|||
|
|
data.userSign = res.userSign
|
|||
|
|
initIM()
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function initIM() {
|
|||
|
|
data.chat = TencentCloudChat.create({
|
|||
|
|
SDKAppID: '1600089204'
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
data.chat.setLogLevel(1) // 普通级别,日志量较多,接入时建议使用
|
|||
|
|
// data.chat.setLogLevel(1); // release级别,SDK 输出关键信息,生产环境时建议使用
|
|||
|
|
data.chat.registerPlugin({'tim-upload-plugin': TIMUploadPlugin})
|
|||
|
|
|
|||
|
|
// 登录 Chat
|
|||
|
|
let options = {
|
|||
|
|
userID: data.userId,
|
|||
|
|
userSig: data.userSign
|
|||
|
|
}
|
|||
|
|
let promise = data.chat.login(options)
|
|||
|
|
promise.then(function(imResponse) {
|
|||
|
|
console.log(imResponse.data) // 登录成功
|
|||
|
|
if (imResponse.data.repeatLogin === true) {
|
|||
|
|
// 标识账号已登录,本次登录操作为重复登录。
|
|||
|
|
console.log(imResponse.data.errorInfo)
|
|||
|
|
}
|
|||
|
|
}).catch(function(imError) {
|
|||
|
|
console.warn('login error:', imError) // 登录失败的相关信息
|
|||
|
|
data.errorList.push({text: 'login error:' + JSON.stringify(imError)})
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
getHistoryMsg()
|
|||
|
|
|
|||
|
|
setInterval(() => {
|
|||
|
|
// getOnLineNum()
|
|||
|
|
}, 10000)
|
|||
|
|
|
|||
|
|
data.chat.on(TencentCloudChat.EVENT.SDK_READY, function(event) {
|
|||
|
|
// 收到离线消息和会话列表同步完毕通知,接入侧可以调用 sendMessage 等需要鉴权的接口
|
|||
|
|
// event.name - TencentCloudChat.EVENT.SDK_READY
|
|||
|
|
console.log('ready事件', event.name)
|
|||
|
|
let promise1 = data.chat.joinGroup({
|
|||
|
|
groupID: data.liveInfo.group_id,
|
|||
|
|
applyMessage: data.nickname + ''
|
|||
|
|
});
|
|||
|
|
promise1.then(function(imResponse) {
|
|||
|
|
switch (imResponse.data.status) {
|
|||
|
|
case TencentCloudChat.TYPES.JOIN_STATUS_WAIT_APPROVAL: // 等待管理员同意
|
|||
|
|
console.log('等待管理员同意');
|
|||
|
|
break;
|
|||
|
|
case TencentCloudChat.TYPES.JOIN_STATUS_SUCCESS: //
|
|||
|
|
console.log('加群成功', imResponse); // 加入的群组资料
|
|||
|
|
data.messageList.push({
|
|||
|
|
name: data.nickname,
|
|||
|
|
text: '进入了直播间'
|
|||
|
|
})
|
|||
|
|
setTimeout(() => {
|
|||
|
|
sendJoinGroup()
|
|||
|
|
}, 500)
|
|||
|
|
break;
|
|||
|
|
case TencentCloudChat.TYPES.JOIN_STATUS_ALREADY_IN_GROUP: // 已经在群中
|
|||
|
|
console.log('已经在群中');
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}).catch(function(imError){
|
|||
|
|
console.warn('加群失败', JSON.stringify(imError)); // 申请加群失败的相关信息
|
|||
|
|
data.errorList.push({text: '加群失败' + JSON.stringify(imError)})
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 收到推送的单聊、群聊、群提示、群系统通知的新消息
|
|||
|
|
data.chat.on(TencentCloudChat.EVENT.MESSAGE_RECEIVED, function(event) {
|
|||
|
|
// event.name - TencentCloudChat.EVENT.MESSAGE_RECEIVED
|
|||
|
|
// event.data - 存储 Message 对象的数组 - [Message]
|
|||
|
|
console.log('新消息', event, event.data)
|
|||
|
|
const List = event.data; // 数组类型,包含多个 Message 对象
|
|||
|
|
List.forEach((item) => {
|
|||
|
|
if(item.type === TencentCloudChat.TYPES.MSG_TEXT) { // 处理文本消息
|
|||
|
|
console.log(item.payload.text)
|
|||
|
|
if(item.payload && item.payload.text) {
|
|||
|
|
data.messageList.push({
|
|||
|
|
name: item.cloudCustomData || '',
|
|||
|
|
text: item.payload.text
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
} else if(item.type === TencentCloudChat.TYPES.MSG_GRP_SYS_NOTICE) { // 群系统通知消息
|
|||
|
|
|
|||
|
|
} else if(item.type === TencentCloudChat.TYPES.MSG_GRP_TIP) { // 群提示消息
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 监听群属性更新,(更新界面讲解商品、发放的优惠券)
|
|||
|
|
data.chat.on(TencentCloudChat.EVENT.GROUP_ATTRIBUTES_UPDATED, function(event) {
|
|||
|
|
let groupID = event.data.groupID // 群组ID
|
|||
|
|
let attr = event.data.groupAttributes // 更新后的群属性
|
|||
|
|
console.log('群属性更新', groupID, attr)
|
|||
|
|
data.errorList.push({text: '群属性更新:' + JSON.stringify(attr)})
|
|||
|
|
// 监听讲解商品
|
|||
|
|
if(attr.shopGroupGoodsId === '0') {
|
|||
|
|
data.showGood = false
|
|||
|
|
setTimeout(async() => {
|
|||
|
|
data.curGroup = {}
|
|||
|
|
}, 500)
|
|||
|
|
} else if(attr.shopGroupGoodsId && attr.shopGroupGoodsId !== data.curGroup.id) {
|
|||
|
|
data.showGood = false
|
|||
|
|
setTimeout(async() => {
|
|||
|
|
await reGetMarkInfo()
|
|||
|
|
let i = data.groupsMark[attr.shopGroupGoodsId]
|
|||
|
|
data.curGroup = data.groupsList[i]
|
|||
|
|
data.showGood = true
|
|||
|
|
}, 500)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 监听发放优惠券
|
|||
|
|
if(attr.shopCouponId) {
|
|||
|
|
get('/api/v1/live/customer/liveDetail/' + data.liveId).then((ress) => {
|
|||
|
|
data.couponList = ress.shop_coupons
|
|||
|
|
ress.shop_coupons.forEach((it, i) => {
|
|||
|
|
data.couponMark[it.id] = i
|
|||
|
|
})
|
|||
|
|
get('/api/v1/live/liveReward/liveCouponList', {live_id: data.liveId}).then((res) => {
|
|||
|
|
let flag = true
|
|||
|
|
for(let i = 0; i < res.data.length; i++) {
|
|||
|
|
let item = res.data[i]
|
|||
|
|
if(item.shop_coupon_id == attr.shopCouponId) {
|
|||
|
|
flag = false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(flag) {
|
|||
|
|
let i = data.couponMark[attr.shopCouponId]
|
|||
|
|
data.curCoupon = data.couponList[i]
|
|||
|
|
console.log(data.curCoupon)
|
|||
|
|
data.showCouGift = true
|
|||
|
|
data.timeNum = 20
|
|||
|
|
data.timeInterval = setInterval(() => {
|
|||
|
|
data.timeNum -= 1
|
|||
|
|
}, 1000)
|
|||
|
|
} else {
|
|||
|
|
console.log('已领取过当前优惠券')
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 监听直播状态,1直播中,2已结束直播,3直播暂停
|
|||
|
|
if(attr.liveStatus) {
|
|||
|
|
if(attr.liveStatus == 1) {
|
|||
|
|
if(data.player) {
|
|||
|
|
data.player.dispose()
|
|||
|
|
data.player = null
|
|||
|
|
}
|
|||
|
|
const div = document.getElementById('video-content-box')
|
|||
|
|
if(div) {
|
|||
|
|
div.replaceChildren()
|
|||
|
|
}
|
|||
|
|
creatVideoDom()
|
|||
|
|
setTimeout(() => {
|
|||
|
|
regetPull()
|
|||
|
|
}, 200)
|
|||
|
|
} else if(attr.liveStatus == 2) {
|
|||
|
|
data.player.unload()
|
|||
|
|
data.player = null
|
|||
|
|
data.liveInfo.time_status = 3
|
|||
|
|
} else if(attr.liveStatus == 3) {
|
|||
|
|
data.player.pause()
|
|||
|
|
data.isPlay = false
|
|||
|
|
data.liveInfo.time_status = 2
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 监听福袋发放、开奖
|
|||
|
|
if(attr.liveBag && attr.liveBag * 1 > 0) {
|
|||
|
|
data.blessId = attr.liveBag
|
|||
|
|
getBlessInfo()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(attr.liveBag && attr.liveBag * 1 == 0) {
|
|||
|
|
if(data.blessInfo.myLotteryLog) {
|
|||
|
|
data.showBless = false
|
|||
|
|
get('/api/v1/liveBag/lotteryLogs', {activity_id: data.blessId, is_my: 1, reward_type: '2,3,4'}).then((res) => {
|
|||
|
|
if(res.data.length) {
|
|||
|
|
if(res.data[0].reward_type == 2) {
|
|||
|
|
data.lottery = {
|
|||
|
|
reward_type: 2,
|
|||
|
|
...res.data[0].user_coupon
|
|||
|
|
}
|
|||
|
|
} else if(res.data[0].reward_type == 3) {
|
|||
|
|
data.lottery = {
|
|||
|
|
reward_type: 3,
|
|||
|
|
...res.data[0].user_coupon
|
|||
|
|
}
|
|||
|
|
} else if(res.data[0].reward_type == 4) {
|
|||
|
|
data.lottery = {
|
|||
|
|
reward_type: 4,
|
|||
|
|
type_value: res.data[0].prize.type_value
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
data.showLottery = true
|
|||
|
|
data.showBag = false
|
|||
|
|
} else {
|
|||
|
|
// 未中奖
|
|||
|
|
data.showFail = true
|
|||
|
|
data.showBag = false
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
} else {
|
|||
|
|
// 未参与抽奖
|
|||
|
|
data.showBag = false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 监听群组列表更新
|
|||
|
|
data.chat.on(TencentCloudChat.EVENT.GROUP_LIST_UPDATED, function(event) {
|
|||
|
|
console.log('群组列表更新', event.data)
|
|||
|
|
// event.data.forEach((item) => {
|
|||
|
|
// if(item.lastMessage && item.lastMessage.cloudCustomData && item.lastMessage.cloudCustomData.indexOf('mark') != -1) {
|
|||
|
|
// let nickname = item.lastMessage.cloudCustomData.replace('mark', '')
|
|||
|
|
// data.messageList.push({
|
|||
|
|
// name: nickname,
|
|||
|
|
// text: item.lastMessage.payload.text
|
|||
|
|
// })
|
|||
|
|
// }
|
|||
|
|
// })
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getOnLineNum() {
|
|||
|
|
let promise = data.chat.getGroupOnlineMemberCount(data.liveInfo.group_id)
|
|||
|
|
promise.then(function(imResponse) {
|
|||
|
|
console.log('在线人数:' + data.liveInfo.group_id, imResponse.data.memberCount, )
|
|||
|
|
}).catch(function(imError) {
|
|||
|
|
console.warn('获取在线人数错误:', imError)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
let promise1 = data.chat.getGroupMemberList({ groupID: data.liveInfo.group_id, count: 15, offset: 0 }); // 从 0 开始拉取 15 个群成员
|
|||
|
|
promise1.then(function(imResponse) {
|
|||
|
|
console.log(imResponse.data.memberList); // 群成员列表
|
|||
|
|
}).catch(function(imError) {
|
|||
|
|
console.warn('getGroupMemberList error:', imError);
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function reGetMarkInfo() {
|
|||
|
|
await get('/api/v1/live/customer/liveDetail/' + data.liveId).then((res) => {
|
|||
|
|
if(res.shop_group_goods && res.shop_group_goods.length) {
|
|||
|
|
let obj = {}
|
|||
|
|
data.groupsList = []
|
|||
|
|
for (var i = 0; i < res.shop_group_goods.length; i++) {
|
|||
|
|
let it = res.shop_group_goods[i]
|
|||
|
|
if(it.pivot && it.pivot.status == 1) {
|
|||
|
|
obj = it
|
|||
|
|
} else {
|
|||
|
|
data.groupsList.push(it)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(obj.id) {
|
|||
|
|
data.groupsList.unshift(obj)
|
|||
|
|
}
|
|||
|
|
data.groupsList.forEach((it, i) => {
|
|||
|
|
data.groupsMark[it.id] = i
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 优惠券
|
|||
|
|
if(res.shop_coupons && res.shop_coupons.length) {
|
|||
|
|
data.couponList = res.shop_coupons
|
|||
|
|
res.shop_coupons.forEach((it, i) => {
|
|||
|
|
data.couponMark[it.id] = i
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function sendJoinGroup() {
|
|||
|
|
let message = data.chat.createTextMessage({
|
|||
|
|
to: data.liveInfo.group_id,
|
|||
|
|
conversationType: TencentCloudChat.TYPES.CONV_GROUP,
|
|||
|
|
payload: {
|
|||
|
|
text: '进入了直播间'
|
|||
|
|
},
|
|||
|
|
cloudCustomData: data.nickname
|
|||
|
|
})
|
|||
|
|
let promise2 = data.chat.sendMessage(message)
|
|||
|
|
promise2.then(function(imResponse) {
|
|||
|
|
console.log('进入了直播间', imResponse)
|
|||
|
|
}).catch(function(imError) {
|
|||
|
|
console.warn('发送失败', imError)
|
|||
|
|
data.errorList.push({text: '进入直播间失败:' + JSON.stringify(imError)})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function getBlessInfo() {
|
|||
|
|
await get('/api/v1/liveBag/' + data.blessId).then((res) => {
|
|||
|
|
data.blessInfo = res.data
|
|||
|
|
data.blessInfo.num = res.data.activity_prizes && res.data.activity_prizes[0].remaining_quantity
|
|||
|
|
if(res.data.activity_status == 30 && res.data.end_time && dayjs().isBefore(dayjs(res.data.end_time))) {
|
|||
|
|
data.downTime = dayjs(res.data.end_time).diff(dayjs())
|
|||
|
|
console.log(data.downTime)
|
|||
|
|
data.showBag = true
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function parseTime(time) {
|
|||
|
|
let tt1 = time.split(' ')[0]
|
|||
|
|
let tt2 = time.split(' ')[1]
|
|||
|
|
let txt = tt1.split('-')[1] + '月' + tt1.split('-')[2] + '日 ' + tt2.slice(0, 5)
|
|||
|
|
return txt
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function toOther() {
|
|||
|
|
uni.setStorageSync('msg_index', 3)
|
|||
|
|
uni.switchTab({ url: '/pages/message/index' })
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function toGroup() {
|
|||
|
|
// uni.navigateTo({
|
|||
|
|
// url: '/pages/groups/index?id=' + data.curGroup.id + '&at=live&live_id=' + data.liveId + '&streamer_id=' + data.streamerId
|
|||
|
|
// })
|
|||
|
|
data.groupId = data.curGroup.id
|
|||
|
|
data.showDetail = true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function toGoods(id) {
|
|||
|
|
// uni.navigateTo({
|
|||
|
|
// url: '/pages/groups/index?id=' + id + '&at=live&live_id=' + data.liveId + '&streamer_id=' + data.streamerId
|
|||
|
|
// })
|
|||
|
|
data.groupId = id
|
|||
|
|
data.showDetail = true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function toPay(id) {
|
|||
|
|
uni.showLoading({
|
|||
|
|
title: '加载中',
|
|||
|
|
mask: true
|
|||
|
|
})
|
|||
|
|
get(`/api/v1/goods/group/detail/${id}`).then((res) => {
|
|||
|
|
if(res.data.group_goods.length == 1 && res.data.total_stock * 1 > 0 && res.data.sold_status == 1) {
|
|||
|
|
data.goodId = res.data.group_goods[0].id
|
|||
|
|
data.showMorePay = true
|
|||
|
|
} else {
|
|||
|
|
toGoods(id)
|
|||
|
|
}
|
|||
|
|
uni.hideLoading()
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function sendBarrage() {
|
|||
|
|
if(!data.keyValue) {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
let message = data.chat.createTextMessage({
|
|||
|
|
to: data.liveInfo.group_id,
|
|||
|
|
conversationType: TencentCloudChat.TYPES.CONV_GROUP,
|
|||
|
|
payload: {
|
|||
|
|
text: data.keyValue
|
|||
|
|
},
|
|||
|
|
cloudCustomData: data.nickname + ':'
|
|||
|
|
})
|
|||
|
|
// 发送消息
|
|||
|
|
let promise = data.chat.sendMessage(message)
|
|||
|
|
promise.then(function(imResponse) {
|
|||
|
|
data.messageList.push({
|
|||
|
|
name: data.nickname + ':',
|
|||
|
|
text: data.keyValue
|
|||
|
|
})
|
|||
|
|
// 未参与
|
|||
|
|
if(!data.blessInfo.myLotteryLog) {
|
|||
|
|
if(data.blessId && data.blessInfo.config && (data.blessInfo.config.conditionType == 1 || (data.blessInfo.config.conditionType == 2 && data.blessInfo.config.conditionData.indexOf(data.keyValue) >= 0))) {
|
|||
|
|
post(`/api/v1/liveBag/join`, {activity_id: data.blessId}).then(async(res) => {
|
|||
|
|
await getBlessInfo()
|
|||
|
|
data.showBless = true
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
data.keyValue = ''
|
|||
|
|
}).catch(function(imError) {
|
|||
|
|
// 发送失败
|
|||
|
|
console.warn('发送失败', imError)
|
|||
|
|
data.errorList.push({text: '发送失败:' + JSON.stringify(imError)})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function openRank() {
|
|||
|
|
data.showRank = true
|
|||
|
|
getRankList()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getRankList() {
|
|||
|
|
data.rankloading = true
|
|||
|
|
let params = {
|
|||
|
|
page: 1,
|
|||
|
|
pageSize: 100,
|
|||
|
|
live_id: data.liveId,
|
|||
|
|
with_user: 1
|
|||
|
|
}
|
|||
|
|
get('/api/v1/live/customer/inviteRecord', params).then((res) => {
|
|||
|
|
data.rankList = res.data
|
|||
|
|
data.inviteList = res.userRecord
|
|||
|
|
data.rankloading = false
|
|||
|
|
}).catch(() => {
|
|||
|
|
data.rankloading = false
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function bindInvite(user_id) {
|
|||
|
|
let params = {
|
|||
|
|
live_id: data.liveId,
|
|||
|
|
user_id: user_id
|
|||
|
|
}
|
|||
|
|
post('/api/v1/live/customer/saveInviteRecord', params).then((res) => {
|
|||
|
|
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function updateShare() {
|
|||
|
|
let shopId = uni.getStorageSync('shop_id')
|
|||
|
|
let params = {
|
|||
|
|
shop_id: uni.getStorageSync('shop_id'),
|
|||
|
|
url: window.location.href.split('#')[0],
|
|||
|
|
js_api_list: ['updateAppMessageShareData', 'updateTimelineShareData', 'onMenuShareAppMessage', 'onMenuShareTimeline']
|
|||
|
|
}
|
|||
|
|
post('/api/v1/live/liveIm/config', params).then(res => {
|
|||
|
|
let config = res.data
|
|||
|
|
wx.config({
|
|||
|
|
beta: true,
|
|||
|
|
debug: false,
|
|||
|
|
appId: config.appId,
|
|||
|
|
timestamp: config.timestamp,
|
|||
|
|
nonceStr: config.nonceStr,
|
|||
|
|
signature: config.signature,
|
|||
|
|
jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'onMenuShareAppMessage', 'onMenuShareTimeline']
|
|||
|
|
})
|
|||
|
|
wx.ready(() => {
|
|||
|
|
wx.updateAppMessageShareData({
|
|||
|
|
title: data.liveInfo.name,
|
|||
|
|
desc: data.liveInfo.brief || `快来看看我的直播吧`,
|
|||
|
|
link: `${window.location.origin}/web#/pages/live/index?live_id=${data.liveId}&user_id=${data.userId}&shopId=${shopId}`,
|
|||
|
|
imgUrl: data.liveInfo.cover_img,
|
|||
|
|
success: function() {
|
|||
|
|
console.log('分享成功');
|
|||
|
|
},
|
|||
|
|
fail: function(err) {
|
|||
|
|
console.log('分享失败', JSON.stringify(err));
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
wx.updateTimelineShareData({
|
|||
|
|
title: data.liveInfo.name,
|
|||
|
|
link: `${window.location.origin}/web#/pages/live/index?live_id=${data.liveId}&user_id=${data.userId}&shopId=${shopId}`,
|
|||
|
|
imgUrl: data.liveInfo.cover_img,
|
|||
|
|
success: function(){
|
|||
|
|
console.log('到朋友圈');
|
|||
|
|
},
|
|||
|
|
fail: function(err) {
|
|||
|
|
console.log('分享朋友圈失败', JSON.stringify(err));
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
wx.error(function(res){
|
|||
|
|
console.log('wx错误', res)
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function toZan() {
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function toShare() {
|
|||
|
|
data.showShare = true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function openCoupon() {
|
|||
|
|
data.showCoupon = true
|
|||
|
|
getMyCoupon()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getMyCoupon() {
|
|||
|
|
data.couponloading = true
|
|||
|
|
let params = {
|
|||
|
|
live_id: data.liveId
|
|||
|
|
}
|
|||
|
|
get('/api/v1/live/liveReward/liveCouponList', params).then((res) => {
|
|||
|
|
data.myCoupon = res.data
|
|||
|
|
data.couponloading = false
|
|||
|
|
}).catch(() => {
|
|||
|
|
data.couponloading = false
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function handleMore(id) {
|
|||
|
|
if(id == 1) {
|
|||
|
|
data.showMore = false
|
|||
|
|
openCoupon()
|
|||
|
|
} else if(id == 2) {
|
|||
|
|
data.showMore = false
|
|||
|
|
uni.navigateTo({
|
|||
|
|
url: '/pages/order/list/index'
|
|||
|
|
})
|
|||
|
|
} else if(id == 3) {
|
|||
|
|
data.showMore = false
|
|||
|
|
uni.switchTab({
|
|||
|
|
url: '/pages/cart/index'
|
|||
|
|
})
|
|||
|
|
} else if(id == 4) {
|
|||
|
|
data.showMore = false
|
|||
|
|
viewMyLottery()
|
|||
|
|
} else if(id == 5) {
|
|||
|
|
data.showMore = false
|
|||
|
|
uni.navigateTo({
|
|||
|
|
url: '/pages/mine/msg/select'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function viewMyLottery() {
|
|||
|
|
get('/api/v1/liveBag/lotteryLogs', {live_id: data.liveId, is_my: 1, reward_type: '2,3,4'}).then((res) => {
|
|||
|
|
data.lotteryLogs = res.data
|
|||
|
|
data.showMyPrize = true
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function closeCoupon() {
|
|||
|
|
data.showCouGift = false
|
|||
|
|
data.timeInterval = null
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function receiveCoupon() {
|
|||
|
|
post('/api/v1/userCoupon/normal/receive', {shop_coupon_id: data.curCoupon.id}).then((res) => {
|
|||
|
|
showToast('领取成功', 'success')
|
|||
|
|
closeCoupon()
|
|||
|
|
}).catch((err) => {
|
|||
|
|
showToast(err)
|
|||
|
|
closeCoupon()
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function selectPop(e) {
|
|||
|
|
if(e.id == 0) {
|
|||
|
|
toBack('home')
|
|||
|
|
} else if(e.id == 1) {
|
|||
|
|
data.showService = true
|
|||
|
|
} else if(e.id == 2) {
|
|||
|
|
toPage('/pages/search/index', 1)
|
|||
|
|
} else if(e.id == 3) {
|
|||
|
|
toPage('/pages/mine/collection/index', 1)
|
|||
|
|
} else if(e.id == 4) {
|
|||
|
|
toPage('/pages/cart/index')
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const toBack = (val) => {
|
|||
|
|
let pages = getCurrentPages()
|
|||
|
|
let pagesLength = pages.length
|
|||
|
|
if(val == 'back') {
|
|||
|
|
if(pagesLength > 1) {
|
|||
|
|
uni.navigateBack({ delta: 1 })
|
|||
|
|
} else {
|
|||
|
|
uni.switchTab({
|
|||
|
|
url: '/pages/index/index'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
uni.switchTab({
|
|||
|
|
url: '/pages/index/index'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getHistoryMsg() {
|
|||
|
|
let params = {
|
|||
|
|
group_id: data.liveInfo.group_id,
|
|||
|
|
page: 1,
|
|||
|
|
pageSize: 20
|
|||
|
|
}
|
|||
|
|
get('/api/v1/live/liveIm/messageList', params).then((res) => {
|
|||
|
|
for (let i = res.data.length - 1; i >= 0; i--) {
|
|||
|
|
let item = res.data[i]
|
|||
|
|
if(item.msg_body && item.msg_body[0] && item.msg_body[0].MsgContent && item.msg_body[0].MsgContent.Text != '进入了直播间' && item.user) {
|
|||
|
|
data.messageList.push({
|
|||
|
|
name: item.user.nickname + ':',
|
|||
|
|
text: item.msg_body[0].MsgContent.Text
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function openBless() {
|
|||
|
|
if(data.blessInfo.activity_status == 30) {
|
|||
|
|
if(data.blessInfo && data.blessInfo.activity_status == 30 && data.blessInfo.end_time && dayjs().isBefore(dayjs(data.blessInfo.end_time))) {
|
|||
|
|
data.downTime = dayjs(data.blessInfo.end_time).diff(dayjs())
|
|||
|
|
data.showBless = true
|
|||
|
|
}
|
|||
|
|
} else if(data.blessInfo.activity_status == 40) {
|
|||
|
|
data.downTime = '00:00'
|
|||
|
|
data.showBless = true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function viewLotteryLogs() {
|
|||
|
|
get('/api/v1/liveBag/lotteryLogs', {activity_id: data.blessId, is_my: 0, reward_type: '2,3,4'}).then((res) => {
|
|||
|
|
data.lotteryLogs = res.data
|
|||
|
|
data.showPlayer = true
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
function toComment() {
|
|||
|
|
if(data.blessInfo.config && data.blessInfo.config.conditionType == 2) {
|
|||
|
|
data.keyValue = data.blessInfo.config.conditionData[0]
|
|||
|
|
}
|
|||
|
|
data.showBless = false
|
|||
|
|
data.sendFocus = true
|
|||
|
|
setTimeout(() => {
|
|||
|
|
data.sendFocus = false
|
|||
|
|
}, 1000)
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function toCoupon(row) {
|
|||
|
|
if((row.reward_type == 2 || row.reward_type == 3) && row.user_coupon && row.user_coupon.status == 1) {
|
|||
|
|
let item = row.user_coupon
|
|||
|
|
if((item.use_type === 20 || item.use_type === 31) && item.extend && item.extend.id) {
|
|||
|
|
uni.navigateTo({
|
|||
|
|
url: '/pages/groups/index?id=' + item.extend.id
|
|||
|
|
})
|
|||
|
|
} else if(item.use_type === 21 && item.type === 50) {
|
|||
|
|
uni.navigateTo({
|
|||
|
|
url: '/pages/mine/scoreShop/good?id=' + item.shop_coupon_id
|
|||
|
|
})
|
|||
|
|
} else if(item.type === 51) {
|
|||
|
|
uni.navigateTo({
|
|||
|
|
url: '/pages/vip/wheel/good?id=' + item.id
|
|||
|
|
})
|
|||
|
|
} else {
|
|||
|
|
uni.switchTab({
|
|||
|
|
url: '/pages/index/index'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
watch(() => data.messageList, (val) => {
|
|||
|
|
setTimeout(() => {
|
|||
|
|
let msgDom = document.getElementById('msgBox')
|
|||
|
|
let scrollDom = document.getElementById('scrollBox')
|
|||
|
|
console.log(scrollDom.scrollHeight)
|
|||
|
|
msgDom.scrollTop = scrollDom.scrollHeight + 30
|
|||
|
|
}, 100)
|
|||
|
|
|
|||
|
|
}, {
|
|||
|
|
deep: true
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
watch(() => data.timeNum, (val) => {
|
|||
|
|
if(val == 0) {
|
|||
|
|
closeCoupon()
|
|||
|
|
}
|
|||
|
|
}, {
|
|||
|
|
deep: true
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
const address = ref(null)
|
|||
|
|
watch(address, (newValue, oldValue) => {
|
|||
|
|
console.log('0.0---live')
|
|||
|
|
data.addr = newValue
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
address,
|
|||
|
|
judgeShop,
|
|||
|
|
...toRefs(data),
|
|||
|
|
creatVideoDom,
|
|||
|
|
getLiveInfo,
|
|||
|
|
getPullUrl,
|
|||
|
|
parseTime,
|
|||
|
|
toOther,
|
|||
|
|
toGroup,
|
|||
|
|
sendBarrage,
|
|||
|
|
getUserSign,
|
|||
|
|
initIM,
|
|||
|
|
openRank,
|
|||
|
|
getRankList,
|
|||
|
|
bindInvite,
|
|||
|
|
updateShare,
|
|||
|
|
openCoupon,
|
|||
|
|
handleMore,
|
|||
|
|
toShare,
|
|||
|
|
toZan,
|
|||
|
|
toGoods,
|
|||
|
|
closeCoupon,
|
|||
|
|
receiveCoupon,
|
|||
|
|
sendJoinGroup,
|
|||
|
|
selectPop,
|
|||
|
|
toBack,
|
|||
|
|
regetPull,
|
|||
|
|
getHistoryMsg,
|
|||
|
|
toPay,
|
|||
|
|
getBlessInfo,
|
|||
|
|
openBless,
|
|||
|
|
viewLotteryLogs,
|
|||
|
|
viewMyLottery,
|
|||
|
|
userBind,
|
|||
|
|
toComment,
|
|||
|
|
toCoupon,
|
|||
|
|
reGetMarkInfo,
|
|||
|
|
refreshPlayer,
|
|||
|
|
getOnLineNum
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
async onLoad(options) {
|
|||
|
|
// await this.judgeShop()
|
|||
|
|
this.liveId = options.live_id
|
|||
|
|
this.errorList.push({text: 'onLoad:进入了onLoad'})
|
|||
|
|
setTimeout(async() => {
|
|||
|
|
this.creatVideoDom()
|
|||
|
|
await this.getLiveInfo('onLoad')
|
|||
|
|
await this.getUserSign()
|
|||
|
|
this.updateShare()
|
|||
|
|
}, 200)
|
|||
|
|
if(options.user_id) {
|
|||
|
|
this.bindInvite(options.user_id)
|
|||
|
|
this.userBind({from: options.user_id})
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
onShow() {
|
|||
|
|
this.errorList.push({text: '触发onShow'})
|
|||
|
|
const _this = this
|
|||
|
|
if(this.is_paused) {
|
|||
|
|
nextTick(() => {
|
|||
|
|
_this.refreshPlayer()
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
onUnload() {
|
|||
|
|
console.log('0.0')
|
|||
|
|
this.errorList.push({text: 'onUnload:进入了onUnload'})
|
|||
|
|
uni.setStorageSync('liveId', this.liveId)
|
|||
|
|
if(this.player) {
|
|||
|
|
this.player.dispose()
|
|||
|
|
this.player = null
|
|||
|
|
}
|
|||
|
|
if(this.chat) {
|
|||
|
|
this.chat.logout()
|
|||
|
|
this.chat.destroy()
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
onHide() {
|
|||
|
|
uni.setStorageSync('liveId', this.liveId)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="scss" scoped>
|
|||
|
|
@import "./index.scss";
|
|||
|
|
|
|||
|
|
::v-deep .whole .vjs-control-bar {
|
|||
|
|
display: none !important;
|
|||
|
|
}
|
|||
|
|
.payDialog{
|
|||
|
|
position: fixed;
|
|||
|
|
left: 0;
|
|||
|
|
height: 0;
|
|||
|
|
overflow: hidden;
|
|||
|
|
bottom: 0;
|
|||
|
|
z-index: 300;
|
|||
|
|
&.show{
|
|||
|
|
height: calc(70vh + 40px);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|