You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1333 lines
35 KiB
1333 lines
35 KiB
<template>
|
|
<view class="shortVideo">
|
|
<!--
|
|
注意:这是 H5、微信小程序界面,请勿和 new_index.nvue、index.nvue 混用
|
|
|
|
1. new_index.nvue、index.nvue这两个是App页面
|
|
|
|
2. 另外:data.js 是上一版本留下的假数据,这一版改成了 URL 请求了(如不需要可以删除,也可作为后端请求参考)
|
|
|
|
3. 请各位大神多多留手,我已经把请求内存开到最大了
|
|
|
|
4. 视频 id 切记是字符串类型
|
|
-->
|
|
<!-- <view class="footer acea-row row-around row-middle">
|
|
<text class="items" @click="goIndex">首页</text>
|
|
<text class="items on">视频</text>
|
|
<view class="items" @click="goCarts"><text>购物车</text>
|
|
<uni-badge v-if="cartNum>0" class="uni-badge-left-margin" type='error' :text="cartNum" />
|
|
</view>
|
|
<text class="items" @click="goUser">我的</text>
|
|
</view> -->
|
|
<view class="header">
|
|
<view>
|
|
<!-- #ifdef MP -->
|
|
<view :style="{height:getHeight.barTop+'px'}"></view>
|
|
<view class="sys-title" :style="{height:getHeight.barHeight+'px'}" v-if="dataList[k]">
|
|
<view v-if="dataList.length && dataList[k].desc.length>=8">{{dataList[k].desc.slice(0,8)}}...</view>
|
|
<view v-else>{{dataList[k].desc}}</view>
|
|
<image src="../static/img/index/f.png" @click="returnPage"></image>
|
|
</view>
|
|
<!-- #endif -->
|
|
<!-- #ifndef MP -->
|
|
<view class="sys-title on" v-if="dataList[k]">
|
|
<view v-if="dataList.length && dataList[k].desc.length>=8">{{dataList[k].desc.slice(0,8)}}...</view>
|
|
<view v-else>{{dataList[k].desc}}</view>
|
|
<image src="../static/img/index/f.png" @click="returnPage"></image>
|
|
</view>
|
|
<!-- #endif -->
|
|
</view>
|
|
</view>
|
|
<view class="noVideo acea-row row-center-wrapper" v-if="!dataList.length">
|
|
<view>
|
|
<image :src="imgHost+'/statics/images/no-video.png'" class="pictrue"></image>
|
|
<text class="tips">暂无短视频内容哦~</text>
|
|
</view>
|
|
</view>
|
|
<image v-if="isShowAixin" src="../static/img/index/aixining.png"
|
|
:style="'position: fixed; margin-left: '+ aixinLeft +'px; margin-top: '+ aixinTop +'px; width: 70px; height: 65px; transform: rotate('+ Rotate +'deg);'">
|
|
</image>
|
|
<swiper :style="'width: '+ windowWidth +'px; height: '+ (windowHeight) +'px; background-color: #000000;'"
|
|
:vertical="true" @animationfinish="animationfinish" previous-margin="0rpx" @change="change" :current="k"
|
|
:indicator-dots="false">
|
|
<swiper-item v-for="(list,index) in dataList">
|
|
<view v-if="Math.abs(k-index)<=1">
|
|
<view>
|
|
<!--
|
|
1.v-if:用于控制视频在节点的渲染数
|
|
2.muted的默认值是 false,代表默认是禁音视频的
|
|
3.http-cache默认开启视频缓存
|
|
4.poster(封面(方案一)):这里的封面默认处理存储在阿里云的视频
|
|
5.show-loading:这里默认去掉播放转圈的标志
|
|
v-if="Math.abs(k-index)<=1"
|
|
-->
|
|
<video :id="list.id+''+index" :loop="true" :muted="list.isplay" :controls="false"
|
|
:http-cache="true" :page-gesture="false" :show-fullscreen-btn="false" :show-loading="false"
|
|
:show-center-play-btn="false" :enable-progress-gesture="false" :src="list.video_url"
|
|
@ended="ended" @click="tapVideoHover(list.state,$event)"
|
|
:style="'width: '+ windowWidth +'px; height: '+ windowHeight +'px; background-color: #000000; z-index: -1;'"
|
|
:poster="list.video_url+'?x-oss-process=video/snapshot,t_100,f_jpg'"></video>
|
|
<!--
|
|
1.这里是封面(方案二):这里的封面可以自定义。
|
|
2.也在代码中做了批注,两种方案可以共存,不会相互影响。
|
|
-->
|
|
<image v-if="!list.playIng" :src="list.video_url+'?x-oss-process=video/snapshot,t_100,f_jpg'"
|
|
:style="'width: '+ windowWidth +'px; height: '+ windowHeight +'px; position: absolute;'"
|
|
mode="aspectFit"></image>
|
|
</view>
|
|
<!-- 播放状态:pause 的时候就会暂停 -->
|
|
<view class="videoHover" @click="tapVideoHover(list.state,$event)" @touchstart="touchstartHover"
|
|
:style="'width: '+ windowWidth +'px; height: '+ windowHeight +'px;'">
|
|
<image v-if="list.state=='pause'" class="playState" src="../static/img/index/play.png"></image>
|
|
</view>
|
|
<view class="userInfo">
|
|
<!-- 1.头像 -->
|
|
<view class="pictrue">
|
|
<image @click="tozuozhe(list)" class="userAvatar" :style="list.is_live?'border-width:0':''"
|
|
:src="list.type_image" mode="aspectFill"></image>
|
|
<!-- #ifdef MP -->
|
|
<view class="live" v-if="list.is_live" @click="goLive"></view>
|
|
<!-- #endif -->
|
|
</view>
|
|
<!-- 2.点赞 -->
|
|
<view @click="cLike(list);" class="likes">
|
|
<image v-if="list.is_like" src="../static/img/index/xin.png"></image>
|
|
<image v-if="!list.is_like" src="../static/img/index/xin-2.png"></image>
|
|
<text :class="{'likeNumActive':list.is_like}">{{list.like_num>0?list.like_num:'点赞'}}</text>
|
|
</view>
|
|
<!-- 收藏 -->
|
|
<view @click="cCollect(list)" class="collects">
|
|
<image v-if="list.is_collect" src="../static/img/index/collection02.png"></image>
|
|
<image v-if="!list.is_collect" src="../static/img/index/collection01.png"></image>
|
|
<text :class="{'likeNumActive':list.is_collect}">{{list.collect_num>0?list.collect_num:'收藏'}}</text>
|
|
</view>
|
|
<!-- 3.评论 -->
|
|
<view class="comment" @click="toComment(list)" style="opacity: 0.9; margin-top: 18px;">
|
|
<image src="../static/img/index/evaluate.png"></image>
|
|
<text>{{list.comment_num>0?list.comment_num:'抢首评'}}</text>
|
|
</view>
|
|
<!-- 4.分享 -->
|
|
<!-- #ifdef H5 -->
|
|
<view @click="share(list.id)" class="shares" v-if="$wechat.isWeixin()">
|
|
<image src="../static/img/index/we-chat.png"></image>
|
|
<text>分享</text>
|
|
</view>
|
|
<view @click="getId(list.id)" class="shares copy-data"
|
|
:data-clipboard-text="imgHost+'/pages/short_video/nvueSwiper/index?id='+ list.id" v-else>
|
|
<image src="../static/img/index/we-chat.png"></image>
|
|
<text>分享</text>
|
|
</view>
|
|
<!-- #endif -->
|
|
<!-- #ifdef MP -->
|
|
<button open-type="share" hover-class="none"
|
|
style="margin-top: 17px;background-color: transparent;position: relative;height: 85rpx;"
|
|
@click="getId(list.id)">
|
|
<image src="../static/img/index/we-chat.png"
|
|
style="width: 62rpx; height: 48rpx; position: absolute; right: 5px;"></image>
|
|
<text
|
|
style="color: #FFFFFF; font-size: 12px; text-align: center;position: absolute;top:52rpx;right: 24rpx;">分享</text>
|
|
</button>
|
|
<!-- <button class="item" open-type="share" hover-class="none">
|
|
<view class="pictrue">
|
|
<image src="../../static/images/weixin.png"></image>
|
|
</view>
|
|
<view class="">分享给好友</view>
|
|
</button> -->
|
|
<!-- #endif -->
|
|
</view>
|
|
<!-- 最底下的文字部分 -->
|
|
<view class="content">
|
|
<!-- <view class="cart" @click="goCart(list)" v-if="list.product_num>0">
|
|
<image class="cartPic" src="../static/img/index/shopping-car.png"></image>
|
|
<text class="cartName">购物</text>
|
|
<text class="line"></text>
|
|
<text class="cartName">视频款请点击这里购买</text>
|
|
</view> -->
|
|
<view class="timeCon" :style="'width: '+ (windowWidth - 90) +'px;'">
|
|
<text class="userName line1"
|
|
:style="'max-width: '+ (windowWidth-160) +'px;'">@{{list.type_name}}</text>
|
|
<!-- <text class="time">.{{list.date}}</text> -->
|
|
</view>
|
|
<view class="words" :style="'width: '+ (windowWidth - 120) +'px;'">
|
|
<view v-if="list.isMore || list.desc.length<=33">
|
|
<text class="info">{{list.desc}}</text>
|
|
<!-- <view class="close">
|
|
<text v-if="list.isMore" class="more" @click="moreTap(list)">收起</text>
|
|
<image v-if="list.isMore" class="imgClose" src="../static/img/index/drop-down.png">
|
|
</image>
|
|
</view> -->
|
|
</view>
|
|
<view class="wordsCon" v-else>
|
|
<text class="info">{{list.desc.slice(0,33)}}...</text>
|
|
<!-- <text class="more" @click="moreTap(list)">更多</text>
|
|
<image class="img" src="../static/img/index/drop-down.png"></image> -->
|
|
</view>
|
|
</view>
|
|
<view class="goodsList" v-if="goodsList.length">
|
|
<scroll-view scroll-x="true" class="scroll">
|
|
<view class="scroll-item" v-for="(goodsItem,goodsIndex) in goodsList" :key="goodsIndex">
|
|
<view class="title">
|
|
<image src="../static/img/index/shopping-car.png"></image>
|
|
<view>商品热卖中</view>
|
|
</view>
|
|
<view class="item" @click="goDetails(goodsItem)">
|
|
<view class="pictrue">
|
|
<image :src="goodsItem.image"></image>
|
|
</view>
|
|
<view class="text">
|
|
<view class="textCon">
|
|
<view class="line1" v-if="goodsItem.store_name.length>=11">{{goodsItem.store_name.slice(0,11)}}...</view>
|
|
<view class="line1" v-else>{{goodsItem.store_name}}</view>
|
|
<view class="discount" v-if="goodsItem.promotions.title">{{goodsItem.promotions.title}}</view>
|
|
</view>
|
|
<baseMoney :money="goodsItem.price" color='#333' symbolSize="20" integerSize="36"
|
|
decimalSize="20" weight></baseMoney>
|
|
</view>
|
|
<view class="bnt">购买</view>
|
|
</view>
|
|
</view>
|
|
</scroll-view>
|
|
</view>
|
|
<view class="goodsCart">
|
|
<view class="pictrue" @click="goCart(list)" v-if="list.product_num>0">
|
|
<image src="../static/img/index/goodsCart.png"></image>
|
|
<uni-badge v-if="goodsCount>0" class="uni-badge-left-margin" :text="goodsCount" />
|
|
</view>
|
|
<view class="text" @click="navTap(1)" v-if="recommend">
|
|
<view class="lable">#</view>
|
|
<view class="see">大家都在看</view>
|
|
<view class="line"></view>
|
|
<view class="title" v-if="recommend && recommend.length>=10">{{recommend.slice(0,10)}}...</view>
|
|
<view class="title" v-else>{{recommend}}</view>
|
|
<view class="jumpLook">查看</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</swiper-item>
|
|
</swiper>
|
|
<uni-popup type="bottom" ref="pinglun" @touchmove.stop.prevent="moveHandle">
|
|
<view
|
|
:style="'width: '+ windowWidth +'px;background-color: #fff; border-top-left-radius: 16px; border-top-right-radius: 16px;'">
|
|
<!--
|
|
注意:
|
|
deleteIOSHeight
|
|
deleteAndroidHeight
|
|
这两个参数用于控制评论等的高度
|
|
-->
|
|
<douyin-scrollview v-if="isComment" ref="comments" :Width="windowWidth" :Height="(boxStyle.height/1.23)"
|
|
:deleteIOSHeight="36" :deleteAndroidHeight="15" :pinlunNum="pinlunNum" :videoID="videoID"
|
|
@closeScrollview="closeScrollview" @pinlunFun="pinlunFun"></douyin-scrollview>
|
|
</view>
|
|
</uni-popup>
|
|
<uni-popup type="bottom" ref="pinglunGoods" @touchmove.stop.prevent="moveHandle">
|
|
<view
|
|
:style="'width: '+ windowWidth +'px; background-color: #F5F5F5; border-top-left-radius: 16px; border-top-right-radius: 16px;'">
|
|
<goodsList ref="goodsLists" :Width="windowWidth" :Height="(boxStyle.height/1.18)" @closeGoodsList="closeGoodsList"></goodsList>
|
|
</view>
|
|
</uni-popup>
|
|
<image v-if="H5ShareBox" class="shareImg" :src="imgHost + '/statics/images/share-info.png'"
|
|
@click="H5ShareBox = false"></image>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
const app = getApp();
|
|
// import userList from '../new_index/data.js'//这个是假数据
|
|
import {
|
|
toLogin
|
|
} from '@/libs/login.js';
|
|
import {
|
|
mapGetters
|
|
} from 'vuex';
|
|
/*
|
|
引入评论组件
|
|
*/
|
|
import douyinScrollview from '../components/douyin-scrollview/douyin-scrollview.vue'
|
|
import goodsList from '../components/goodsList/index.vue'
|
|
import {
|
|
HTTP_REQUEST_URL
|
|
} from '@/config/app';
|
|
import {
|
|
videoList,
|
|
markeVideo,
|
|
videoProduct,
|
|
videoInfo
|
|
} from '@/api/short-video.js';
|
|
import {
|
|
getCartCounts,
|
|
} from '@/api/order.js';
|
|
import ClipboardJS from "@/plugin/clipboard/clipboard.js";
|
|
export default {
|
|
components: {
|
|
douyinScrollview,
|
|
goodsList
|
|
},
|
|
computed: mapGetters(['isLogin', 'uid', 'cartNum']),
|
|
data() {
|
|
return {
|
|
// #ifdef MP
|
|
getHeight: this.$util.getWXStatusHeight(),
|
|
// #endif
|
|
imgHost: HTTP_REQUEST_URL,
|
|
videoID: 0, //视频id
|
|
pinlunNum: 0,
|
|
windowWidth: 0,
|
|
windowHeight: 0,
|
|
platform: "",
|
|
deleteHeight: 0,
|
|
isComment: 0,
|
|
dataList: [],
|
|
k: 0,
|
|
oldVideo: "",
|
|
voice: "",
|
|
timeout: "",
|
|
current: 0,
|
|
boxStyle: { //视频,图片封面样式🌟💗
|
|
'height': 0,
|
|
'width': 0,
|
|
},
|
|
// 引入评论 - 参数
|
|
heightNum: 1.3,
|
|
// 双击点赞参数
|
|
touchNum: 0,
|
|
aixinLeft: 0,
|
|
aixinTop: 0,
|
|
isShowAixin: false,
|
|
Rotate: 0,
|
|
currentNav: 1,
|
|
limit: 3,
|
|
page: 1,
|
|
oldCurrent: 1,
|
|
H5ShareBox: false,
|
|
goodsList: [],
|
|
goodsCount: 0,
|
|
recommend:''
|
|
}
|
|
},
|
|
watch: {
|
|
currentNav(news, old) {
|
|
this.oldCurrent = old;
|
|
},
|
|
k(k, old_k) {
|
|
if (this.oldCurrent != this.currentNav) {
|
|
this.oldCurrent = this.currentNav
|
|
return false
|
|
}
|
|
this.dataList[old_k].playIng = false //如果视频暂停,就加载封面
|
|
this.dataList[old_k].isplay = true
|
|
this.dataList[old_k].state = 'pause'
|
|
console.log('预留第' + (old_k + 1) + '个视频:' + this.dataList[old_k].id + '' + old_k)
|
|
// 2.0版本已经去掉了下面这一句,视频不用暂停,只需要把声音禁止就行
|
|
uni.createVideoContext(this.dataList[old_k].id + '' + old_k, this)
|
|
.stop() //如果视频暂停,那么旧视频停止,这里的this.dataList[old_k].id + '' + old_k,后面加 old_k 是为了每一个视频的 id 值不同,这样就可以大程度的避免串音问题
|
|
console.log('已经暂停 --> 第' + (old_k + 1) + '个视频~') //提示
|
|
this.dataList[k].state = 'play'
|
|
setTimeout(() => {
|
|
uni.createVideoContext(this.dataList[k].id + '' + k, this).play()
|
|
setTimeout(() => {
|
|
this.dataList[k].isplay = false
|
|
this.dataList[k].playIng = true
|
|
}, 50)
|
|
}, 250)
|
|
var p = k + 1;
|
|
// console.log('预加载第' + (p + 1) + '个视频:' + this.dataList[p].id+''+p)
|
|
}
|
|
},
|
|
onLoad(options) {
|
|
this.videoID = options.id || 0;
|
|
this.getOptions(options);
|
|
this.platform = uni.getSystemInfoSync().platform
|
|
var model = uni.getSystemInfoSync().model
|
|
if (this.platform == 'ios' && (model !== 'iPhone6' || model !== 'iPhone6s' || model !== 'iPhone7' || model !==
|
|
'iPhone8')) {
|
|
this.deleteHeight = 0 //有 tabbar的 修改这里可以改变视频高度
|
|
}
|
|
this.windowWidth = uni.getSystemInfoSync().windowWidth
|
|
this.windowHeight = uni.getSystemInfoSync().windowHeight
|
|
this.boxStyle.width = this.windowWidth + 'px' //给宽度加px
|
|
this.boxStyle.height = this.windowHeight - this.deleteHeight; //有 tabbar的 修改这里可以改变视频高度
|
|
this.get() //刚进入页面加载数据
|
|
if (this.isLogin) {
|
|
this.getCartNum()
|
|
}
|
|
},
|
|
onShow() {
|
|
if (this.dataList.length !== 0) {
|
|
this.dataList[this.k].state = 'play';
|
|
uni.createVideoContext(this.dataList[this.k].id + '' + this.k, this).play()
|
|
}
|
|
},
|
|
onHide() {
|
|
this.dataList[this.k].state = 'pause'; //界面隐藏也要停止播放视频
|
|
uni.createVideoContext(this.dataList[this.k].id + '' + this.k, this).pause(); //暂停以后继续播放
|
|
console.log('到后台');
|
|
},
|
|
onReady: function() {
|
|
// #ifdef H5
|
|
this.$nextTick(function() {
|
|
const clipboard = new ClipboardJS(".copy-data");
|
|
clipboard.on("success", () => {
|
|
this.$util.Tips({
|
|
title: '复制成功'
|
|
});
|
|
});
|
|
});
|
|
// #endif
|
|
},
|
|
// #ifdef MP
|
|
onShareAppMessage: function() {
|
|
let uid = this.uid ? this.uid : 0;
|
|
let data = this.dataList[this.k];
|
|
this.cShare(this.videoID);
|
|
return {
|
|
title: data.type_name || '',
|
|
imageUrl: data.image || '',
|
|
path: '/pages/short_video/nvueSwiper/index?spid=' + uid + '&id=' + this.videoID
|
|
};
|
|
},
|
|
// #endif
|
|
methods: {
|
|
// 返回上一页
|
|
returnPage(){
|
|
uni.switchTab({
|
|
url: '/pages/index/index'
|
|
});
|
|
},
|
|
goDetails(item){
|
|
uni.navigateTo({
|
|
url: `/pages/goods_details/index?id=${item.id}`
|
|
});
|
|
},
|
|
productList(id){
|
|
videoProduct(id).then(res=>{
|
|
this.goodsCount = res.data.count;
|
|
this.goodsList = res.data.list;
|
|
}).catch(err=>{
|
|
uni.showToast({
|
|
title: err,
|
|
icon: 'none',
|
|
duration: 2000
|
|
});
|
|
})
|
|
},
|
|
getVideoInfo(id){
|
|
videoInfo(id).then(res=>{
|
|
this.recommend = res.data.recommend.desc;
|
|
this.videoID = res.data.recommend.id;
|
|
}).catch(err=>{
|
|
uni.showToast({
|
|
title: err,
|
|
icon: 'none',
|
|
duration: 2000
|
|
});
|
|
})
|
|
},
|
|
getCartNum: function() {
|
|
getCartCounts().then(res => {
|
|
this.$store.commit('indexData/setCartNum', res.data.count +'')
|
|
});
|
|
},
|
|
goIndex() {
|
|
uni.switchTab({
|
|
url: '/pages/index/index'
|
|
})
|
|
},
|
|
goCarts() {
|
|
uni.switchTab({
|
|
url: '/pages/order_addcart/order_addcart'
|
|
})
|
|
},
|
|
goUser() {
|
|
uni.switchTab({
|
|
url: '/pages/user/index'
|
|
})
|
|
},
|
|
|
|
goLive() {
|
|
uni.navigateTo({
|
|
url: `/pages/columnGoods/live_list/index`
|
|
});
|
|
},
|
|
tozuozhe(item) {
|
|
if (item.type == 0) {
|
|
uni.reLaunch({
|
|
url: `/pages/index/index`
|
|
});
|
|
} else {
|
|
uni.reLaunch({
|
|
url: `/pages/store_cate/store_cate?id=` + item.relation_id
|
|
});
|
|
}
|
|
},
|
|
getOptions(options) {
|
|
let that = this;
|
|
// #ifdef MP
|
|
if (options.scene) {
|
|
let value = that.$util.getUrlParams(decodeURIComponent(options.scene));
|
|
//记录推广人uid
|
|
if (value.spid) app.globalData.spid = value.spid;
|
|
if (value.id) that.videoID = value.id || 0;
|
|
}
|
|
// #endif
|
|
if (options.spid) app.globalData.spid = options.spid;
|
|
},
|
|
// #ifdef H5
|
|
// 微信分享;
|
|
setOpenShare: function(id) {
|
|
let that = this;
|
|
let uid = this.uid ? this.uid : 0;
|
|
let href = location.href;
|
|
if (that.$wechat.isWeixin()) {
|
|
let data = this.dataList[that.k];
|
|
let configAppMessage = {
|
|
desc: data.desc,
|
|
title: data.type_name,
|
|
link: href.indexOf('?') === -1 ? href + '?spid=' + uid + '&id=' + id : href + '&spid=' +
|
|
uid + '&id=' + id,
|
|
imgUrl: data.image,
|
|
success:function(res){
|
|
that.cShare(id);
|
|
}
|
|
};
|
|
that.$wechat.wechatEvevt(['updateAppMessageShareData', 'updateTimelineShareData',
|
|
'onMenuShareAppMessage',
|
|
'onMenuShareTimeline'
|
|
],
|
|
configAppMessage);
|
|
}
|
|
},
|
|
// #endif
|
|
goCart(item) {
|
|
if (this.isLogin === false) {
|
|
// #ifndef MP
|
|
return toLogin();
|
|
// #endif
|
|
// #ifdef MP
|
|
uni.showToast({
|
|
title: '请登录',
|
|
icon: 'none',
|
|
duration: 1000
|
|
});
|
|
return
|
|
// #endif
|
|
}
|
|
// uni.showToast({
|
|
// title: '加载中...',
|
|
// icon: 'none',
|
|
// position: 'bottom',
|
|
// duration: 300
|
|
// })
|
|
// #ifdef H5
|
|
uni.setStorageSync("videoID", parseInt(item.id));
|
|
// #endif
|
|
// #ifdef MP
|
|
this.$refs.goodsLists.productList(item.id, 1);
|
|
// #endif
|
|
this.$refs.pinglunGoods.open('bottom')
|
|
},
|
|
navTap(n) {
|
|
this.currentNav = n;
|
|
this.timeout = "";
|
|
this.k = 0;
|
|
this.page = 1;
|
|
this.dataList = [];
|
|
this.get();
|
|
},
|
|
moreTap(item) {
|
|
item.isMore = !item.isMore;
|
|
},
|
|
moveHandle() {},
|
|
closeScrollview() {
|
|
// 点击评论里面的叉叉,就会关闭评论
|
|
this.$refs.pinglun.close();
|
|
this.isComment = false
|
|
},
|
|
closeGoodsList(){
|
|
this.$refs.pinglunGoods.close();
|
|
},
|
|
pinlunFun(e,videoID) {
|
|
this.pinlunNum = e;
|
|
this.dataList.forEach(item => {
|
|
if (item.id == videoID) {
|
|
item.comment_num = e;
|
|
}
|
|
})
|
|
// this.isComment = false
|
|
},
|
|
toComment(item) {
|
|
this.isComment = true
|
|
console.log('我被点了')
|
|
// 注意点击评论之后会执行这里
|
|
/*
|
|
(1)先加载缓冲
|
|
(2)获取当前视频 ID 信息
|
|
(3)🌟🌟🌟🌟重要🌟🌟🌟🌟
|
|
- 一定要记得看 index.vue 里面
|
|
uni.setStorageSync("user",this.peopleList[i]);
|
|
这个东西,用于存储当前用户信息。在 插件里面会使用到这个东西,
|
|
记得写一下。
|
|
|
|
(4)打开评论
|
|
*/
|
|
uni.showToast({
|
|
title: '加载中...',
|
|
icon: 'none',
|
|
position: 'bottom',
|
|
duration: 300
|
|
})
|
|
this.$nextTick(e => {
|
|
this.pinlunNum = item.comment_num;
|
|
// #ifdef H5
|
|
this.videoID = parseInt(item.id);
|
|
// #endif
|
|
// #ifdef MP
|
|
this.$refs.comments.getnewpinlun(item.id, 1);
|
|
// #endif
|
|
this.$refs.pinglun.open('bottom')
|
|
})
|
|
|
|
},
|
|
ended() {
|
|
// 1.播放当前视频结束时触发,自动切换下一个视频
|
|
// this.current = this.k+1
|
|
},
|
|
// 双击点赞效果
|
|
touchstartHover(event) {
|
|
if (this.touchNum >= 1) {
|
|
// console.log('双击 -- X坐标:'+ event.touches[0].screenX);
|
|
// console.log('双击 -- Y坐标:'+ event.touches[0].screenY);
|
|
this.aixinLeft = event.touches[0].screenX - 50;
|
|
this.aixinTop = event.touches[0].screenY - 50;
|
|
this.isShowAixin = true;
|
|
let max = 40;
|
|
let min = -40;
|
|
this.Rotate = Math.floor(Math.random() * (max - min + 1)) + min;
|
|
setTimeout(() => {
|
|
this.isShowAixin = false;
|
|
}, 700)
|
|
}
|
|
},
|
|
//点击播放&&暂停
|
|
tapVideoHover(state, event) {
|
|
this.dataList[this.k].isShowimage = false
|
|
this.dataList[this.k].isShowProgressBarTime = false
|
|
this.ProgressBarOpacity = 0.5
|
|
this.dotWidth = 0
|
|
console.log('state--', state);
|
|
// 1.启用双击点赞 --- start
|
|
this.touchNum++;
|
|
setTimeout(() => {
|
|
if (this.touchNum == 1) {
|
|
if (state == 'play' || state == 'continue') {
|
|
this.dataList[this.k].state = 'pause';
|
|
} else {
|
|
this.dataList[this.k].state = 'continue';
|
|
}
|
|
if (this.dataList[this.k].state == 'continue') {
|
|
uni.createVideoContext(this.dataList[this.k].id + '' + this.k, this).play(); //暂停以后继续播放
|
|
}
|
|
if (this.dataList[this.k].state == 'pause') {
|
|
uni.createVideoContext(this.dataList[this.k].id + '' + this.k, this)
|
|
.pause(); //暂停以后继续播放
|
|
}
|
|
}
|
|
if (this.touchNum >= 2) {
|
|
// this.doubleLike();
|
|
}
|
|
this.touchNum = 0;
|
|
}, 200)
|
|
// --------------- ending
|
|
// 2. 不启用双击点赞 start
|
|
// if(state=='play'||state=='continue'){
|
|
// this.dataList[this.k].state = 'pause';
|
|
// }else{
|
|
// this.dataList[this.k].state = 'continue';
|
|
// }
|
|
// if(this.dataList[this.k].state == 'continue'){
|
|
// uni.createVideoContext(this.dataList[this.k].id+''+this.k,this).play();//暂停以后继续播放
|
|
// }
|
|
// if(this.dataList[this.k].state == 'pause'){
|
|
// uni.createVideoContext(this.dataList[this.k].id+''+this.k,this).pause();//暂停以后继续播放
|
|
// }
|
|
// --------------- ending
|
|
},
|
|
doubleLike() {
|
|
if (this.dataList[this.k].is_like == false) {
|
|
this.dataList[this.k].like_num += 1;
|
|
this.dataList[this.k].is_like = true;
|
|
}
|
|
/*
|
|
点赞
|
|
*/
|
|
},
|
|
change(event) {
|
|
this.k = event.detail.current
|
|
this.productList(this.dataList[this.k].id);
|
|
this.getVideoInfo(this.dataList[this.k].id);
|
|
},
|
|
animationfinish(event) {
|
|
// 1.这里进行判断,如果是最后一个视频就进入 get() 方法加载视频进入列表
|
|
if (this.k == this.dataList.length - 1) {
|
|
this.GET()
|
|
}
|
|
},
|
|
//每一组结束时新的请求
|
|
GET() {
|
|
videoList({
|
|
page: this.page,
|
|
limit: this.limit,
|
|
order_type: this.currentNav,
|
|
id: (this.page > 1 || this.currentNav == 2)? 0 : this.videoID
|
|
}).then(res => {
|
|
this.page = this.page + 1;
|
|
var msg = res.data
|
|
// 2.这里把视频添加到视频列表
|
|
for (let i = 0; i < msg.length; i++) {
|
|
this.dataList.push(msg[i])
|
|
}
|
|
}).catch(err => {
|
|
return uni.showToast({
|
|
title: err,
|
|
icon: 'none',
|
|
duration: 2000
|
|
});
|
|
})
|
|
},
|
|
get() {
|
|
// 1.这里引入后端请求数据
|
|
videoList({
|
|
page: this.page,
|
|
limit: this.limit,
|
|
order_type: this.currentNav,
|
|
id: (this.page > 1)?0:this.videoID
|
|
}).then(res => {
|
|
this.page = this.page + 1;
|
|
var msg = res.data
|
|
// 2.这里把视频添加到视频列表
|
|
for (let i = 0; i < msg.length; i++) {
|
|
this.dataList.push(msg[i])
|
|
}
|
|
// #ifdef H5
|
|
if (this.isLogin) {
|
|
this.setOpenShare(this.videoID);
|
|
}
|
|
// #endif
|
|
this.productList(this.dataList[this.k].id);
|
|
this.getVideoInfo(this.dataList[this.k].id);
|
|
// 3.播放当前视频
|
|
setTimeout(() => {
|
|
this.dataList[this.k].isplay = false
|
|
this.dataList[this.k].state = 'play'
|
|
// uni.createVideoContext(this.dataList[0].id,this).seek(0)
|
|
// uni.createVideoContext(this.dataList[0].id,this).play()
|
|
uni.createVideoContext(this.dataList[this.k].id + '' + this.k, this).seek(0)
|
|
uni.createVideoContext(this.dataList[this.k].id + '' + this.k, this).play()
|
|
this.dataList[this.k].playIng = true
|
|
}, 200)
|
|
// start - 预加载开始
|
|
var p = this.k
|
|
++p
|
|
if(this.dataList[p].id){
|
|
setTimeout(() => {
|
|
uni.createVideoContext(this.dataList[p].id + '' + p, this).play()
|
|
}, 20)
|
|
clearTimeout(this.timeout)
|
|
this.timeout = setTimeout(() => {
|
|
uni.createVideoContext(this.dataList[p].id + '' + p, this).seek(0)
|
|
uni.createVideoContext(this.dataList[p].id + '' + p, this).pause()
|
|
console.log('预加载第' + (p + 1) + '个视频:' + this.dataList[p].id + '' + p)
|
|
}, 1500)
|
|
}
|
|
// end - 预加载结束
|
|
}).catch(err => {
|
|
return uni.showToast({
|
|
title: err,
|
|
icon: 'none',
|
|
duration: 2000
|
|
});
|
|
})
|
|
},
|
|
cShare(id){
|
|
markeVideo('share',id).then(res=>{}).catch(err=>{
|
|
return uni.showToast({
|
|
title: err,
|
|
icon: 'none',
|
|
duration: 2000
|
|
});
|
|
})
|
|
},
|
|
getId(id) {
|
|
this.videoID = id;
|
|
// #ifdef H5
|
|
this.cShare(id);
|
|
// #endif
|
|
},
|
|
share(id) {
|
|
this.H5ShareBox = true;
|
|
// #ifdef H5
|
|
if (this.isLogin) {
|
|
this.setOpenShare(id);
|
|
}
|
|
// #endif
|
|
},
|
|
cLike(item) {
|
|
markeVideo('like', item.id).then(res => {
|
|
this.dataList[this.k].is_like = !this.dataList[this.k].is_like
|
|
const video = this.dataList[this.k];
|
|
item.is_like ? video.like_num += 1 : video.like_num -= 1;
|
|
}).catch(err => {
|
|
return uni.showToast({
|
|
title: err,
|
|
icon: 'none',
|
|
duration: 2000
|
|
});
|
|
})
|
|
},
|
|
cCollect(item) {
|
|
markeVideo('collect', item.id).then(res => {
|
|
this.dataList[this.k].is_collect = !this.dataList[this.k].is_collect
|
|
const video = this.dataList[this.k];
|
|
item.is_collect ? video.collect_num += 1 : video.collect_num -= 1;
|
|
}).catch(err => {
|
|
return uni.showToast({
|
|
title: err,
|
|
icon: 'none',
|
|
duration: 2000
|
|
});
|
|
})
|
|
},
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.goodsCart{
|
|
flex-direction: row;
|
|
align-items: center;
|
|
margin-top: 48rpx;
|
|
.pictrue{
|
|
position: relative;
|
|
width: 72rpx;
|
|
image{
|
|
width: 72rpx;
|
|
height: 72rpx;
|
|
}
|
|
.uni-badge-left-margin{
|
|
position: absolute;
|
|
right: -14rpx;
|
|
top:-10rpx;
|
|
}
|
|
/deep/.uni-badge--error{
|
|
background-color: #fff;
|
|
color: #E93323;
|
|
font-size: 22rpx;
|
|
}
|
|
}
|
|
.text{
|
|
width: 580rpx;
|
|
height: 72rpx;
|
|
background: rgba(255,255,255,0.15);
|
|
border-radius: 200rpx;
|
|
border: 4rpx solid rgba(255,255,255,0.1);
|
|
flex-direction: row;
|
|
justify-content: center;
|
|
align-items: center;
|
|
margin-left: 34rpx;
|
|
backdrop-filter: blur(10px);
|
|
.lable{
|
|
width: 32rpx;
|
|
height: 32rpx;
|
|
background: linear-gradient(90deg, #E93323 0%, #FF7931 100%);
|
|
border-radius: 50%;
|
|
text-align: center;
|
|
line-height: 32rpx;
|
|
}
|
|
.see{
|
|
font-size: 22rpx;
|
|
color: #E93323;
|
|
margin-left: 16rpx;
|
|
}
|
|
.line{
|
|
width: 1rpx;
|
|
height: 16rpx;
|
|
background: rgba(255,255,255,0.6);
|
|
margin: 0 12rpx;
|
|
}
|
|
.title{
|
|
width: 238rpx;
|
|
font-size: 22rpx;
|
|
}
|
|
.jumpLook{
|
|
font-size: 22rpx;
|
|
margin-left: 42rpx;
|
|
}
|
|
}
|
|
}
|
|
.goodsList{
|
|
margin-top: 20rpx;
|
|
.scroll{
|
|
white-space: nowrap;
|
|
.scroll-item {
|
|
display: inline-block;
|
|
width: 440rpx;
|
|
height: 180rpx;
|
|
background-color: #FFE9EA;
|
|
border-radius: 16rpx;
|
|
margin-right: 24rpx;
|
|
.title{
|
|
font-size: 22rpx;
|
|
font-weight: 500;
|
|
color: #E93323;
|
|
width: 100%;
|
|
height: 48rpx;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
padding: 0 12rpx;
|
|
|
|
image{
|
|
width: 24rpx;
|
|
height: 24rpx;
|
|
margin-right: 4rpx;
|
|
}
|
|
}
|
|
.item{
|
|
width: 100%;
|
|
background-color: #fff;
|
|
border-radius: 16rpx;
|
|
padding: 14rpx;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
position: relative;
|
|
.pictrue{
|
|
width: 104rpx;
|
|
height: 104rpx;
|
|
border-radius: 16rpx;
|
|
background-color: #ccc;
|
|
margin-right: 12rpx;
|
|
image{
|
|
width: 100%;
|
|
height: 100%;
|
|
border-radius: 16rpx;
|
|
}
|
|
}
|
|
.text{
|
|
width: 290rpx;
|
|
font-size: 24rpx;
|
|
color: #333;
|
|
.textCon{
|
|
height: 66rpx;
|
|
}
|
|
.discount{
|
|
font-weight: 400;
|
|
color: #E93323;
|
|
font-size: 20rpx;
|
|
margin-bottom: 6rpx;
|
|
}
|
|
}
|
|
.bnt{
|
|
width: 96rpx;
|
|
height: 48rpx;
|
|
background: linear-gradient(90deg, #E93323 0%, #FF7931 100%);
|
|
border-radius: 26rpx;
|
|
text-align: center;
|
|
line-height: 48rpx;
|
|
position: absolute;
|
|
right: 10rpx;
|
|
bottom: 14rpx;
|
|
font-size: 24rpx;
|
|
color: #fff;
|
|
font-weight: 500;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.shares{
|
|
opacity: 0.9;
|
|
margin-top: 17px;
|
|
image{
|
|
width: 60rpx;
|
|
height: 60rpx;
|
|
position: absolute;
|
|
left: 50%;
|
|
margin-left: -30rpx;
|
|
}
|
|
text{
|
|
color: #FFFFFF;
|
|
margin-top: 5px;
|
|
font-size: 11px;
|
|
text-align: center;
|
|
margin-top: 34px;
|
|
}
|
|
}
|
|
.comment{
|
|
image{
|
|
width: 60rpx;
|
|
height: 60rpx;
|
|
position: absolute;
|
|
left: 50%;
|
|
margin-left: -30rpx;
|
|
}
|
|
text{
|
|
color: #FFFFFF;
|
|
font-size: 11px;
|
|
font-weight: 400;
|
|
text-align: center;
|
|
margin-top: 34px;
|
|
}
|
|
}
|
|
.likes{
|
|
opacity: 0.9;
|
|
margin-top: 5px;
|
|
image{
|
|
width: 60rpx;
|
|
height: 60rpx;
|
|
position: absolute;
|
|
left: 50%;
|
|
margin-left: -30rpx;
|
|
}
|
|
text{
|
|
color: #FFFFFF;
|
|
font-size: 11px;
|
|
text-align: center;
|
|
margin-top: 34px;
|
|
font-weight: 400;
|
|
}
|
|
}
|
|
.collects{
|
|
opacity: 0.9;
|
|
margin-top: 18px;
|
|
image{
|
|
width: 60rpx;
|
|
height: 60rpx;
|
|
position: absolute;
|
|
left: 50%;
|
|
margin-left: -30rpx;
|
|
}
|
|
text{
|
|
color: #FFFFFF;
|
|
margin-top: 5px;
|
|
font-size: 11px;
|
|
text-align: center;
|
|
margin-top: 34px;
|
|
font-weight: 400;
|
|
}
|
|
}
|
|
.shortVideo {
|
|
height: 100vh;
|
|
background-color: #000000;
|
|
}
|
|
|
|
.shareImg {
|
|
z-index: 1000;
|
|
position: fixed;
|
|
left: 0;
|
|
top: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
|
|
.container {
|
|
background-color: #000000;
|
|
}
|
|
|
|
.item {
|
|
/* width : 750rpx; */
|
|
background-color: #000000;
|
|
position: relative;
|
|
}
|
|
|
|
.videoHover {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
flex: 1;
|
|
background-color: rgba(0, 0, 0, 0.1);
|
|
justify-content: center;
|
|
align-items: center;
|
|
|
|
/* border-style: dashed;
|
|
border-color: #DD524D;
|
|
border-width: 1px; */
|
|
}
|
|
|
|
.playState {
|
|
width: 160rpx;
|
|
height: 160rpx;
|
|
opacity: 0.2;
|
|
}
|
|
|
|
.userInfo {
|
|
position: absolute;
|
|
bottom: 102px;
|
|
right: 10px;
|
|
flex-direction: column;
|
|
|
|
.pictrue {
|
|
width: 96rpx;
|
|
height: 96rpx;
|
|
margin-bottom: 15px;
|
|
flex-direction: column;
|
|
justify-content: center;
|
|
align-items: center;
|
|
position: relative;
|
|
|
|
image{
|
|
width: 100%;
|
|
height: 100%;
|
|
border:1px solid #fff;
|
|
border-radius: 100%;
|
|
}
|
|
|
|
.live {
|
|
width: 96rpx;
|
|
height: 96rpx;
|
|
background: url('../static/img/index/live-avatar.png') no-repeat;
|
|
background-size: 100% 100%;
|
|
position: absolute;
|
|
top: 2rpx;
|
|
left: 2rpx;
|
|
}
|
|
}
|
|
}
|
|
|
|
.likeIco,
|
|
.shareIco,
|
|
.commentIco {
|
|
width: 60rpx;
|
|
height: 60rpx;
|
|
margin-top: 15px;
|
|
}
|
|
|
|
.likeNum,
|
|
.commentNum,
|
|
.shareTex {
|
|
color: #ffffff;
|
|
font-size: 30rpx;
|
|
text-align: center;
|
|
margin: 5px;
|
|
}
|
|
|
|
.likeNumActive {
|
|
color: red;
|
|
}
|
|
|
|
.noVideo {
|
|
position: fixed;
|
|
top: 400rpx;
|
|
z-index: 9;
|
|
width: 750rpx;
|
|
flex-direction: row;
|
|
justify-content: center;
|
|
|
|
.pictrue {
|
|
width: 414rpx;
|
|
height: 256rpx;
|
|
}
|
|
|
|
.tips {
|
|
text-align: center;
|
|
margin-top: 14rpx;
|
|
font-size: 26rpx;
|
|
color: #999;
|
|
}
|
|
}
|
|
|
|
.footer {
|
|
flex-direction: row;
|
|
background-color: #161616;
|
|
height: 118rpx;
|
|
position: fixed;
|
|
bottom: 0;
|
|
z-index: 9;
|
|
width: 750rpx;
|
|
line-height: 100rpx;
|
|
|
|
.items {
|
|
position: relative;
|
|
color: #999999;
|
|
font-size: 30rpx;
|
|
|
|
.cart {
|
|
color: #999999;
|
|
font-size: 30rpx;
|
|
}
|
|
|
|
&.on {
|
|
color: #fff;
|
|
}
|
|
|
|
.uni-badge-left-margin{
|
|
position: absolute;
|
|
/* #ifdef MP */
|
|
right: -15px;
|
|
top: -8px;
|
|
/* #endif */
|
|
/* #ifdef H5 */
|
|
right: -11px;
|
|
top: 8px;
|
|
/* #endif */
|
|
}
|
|
/deep/.uni-badge{
|
|
border: 1px solid #e93323;
|
|
background-color: #e93323;
|
|
}
|
|
|
|
.cartNum {
|
|
position: absolute;
|
|
height: 28rpx;
|
|
background: #E93323;
|
|
border-radius: 15rpx;
|
|
color: #fff;
|
|
line-height: 27rpx;
|
|
padding: 0 8rpx 0 4rpx;
|
|
right: -10px;
|
|
top: 14px;
|
|
font-size: 22rpx;
|
|
display: block;
|
|
}
|
|
}
|
|
}
|
|
|
|
.header {
|
|
position: fixed;
|
|
z-index: 9;
|
|
width: 750rpx;
|
|
flex-direction: row;
|
|
justify-content: center;
|
|
color: #FFFFFF;
|
|
.sys-title{
|
|
width: 750rpx;
|
|
position: relative;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
justify-content: center;
|
|
&.on{
|
|
height: 110rpx;
|
|
}
|
|
|
|
image{
|
|
position: absolute;
|
|
top:50%;
|
|
left:20rpx;
|
|
width: 40rpx;
|
|
height: 40rpx;
|
|
margin-top: -20rpx;
|
|
}
|
|
}
|
|
}
|
|
|
|
.content {
|
|
width: 590rpx;
|
|
z-index: 99;
|
|
position: absolute;
|
|
bottom: 30px;
|
|
/* justify-content: center; */
|
|
padding: 15rpx 0;
|
|
flex-direction: column;
|
|
justify-content: flex-start;
|
|
color: #ffffff;
|
|
left: 50%;
|
|
margin-left: -345rpx;
|
|
|
|
.time {
|
|
font-size: 24rpx;
|
|
color: rgba(255, 255, 255, 0.5);
|
|
margin-left: 12rpx;
|
|
}
|
|
|
|
.cart {
|
|
background: rgba(153, 153, 153, 0.3);
|
|
width: 376rpx;
|
|
height: 48rpx;
|
|
border-radius: 4rpx;
|
|
margin-bottom: 22rpx;
|
|
flex-direction: row;
|
|
justify-content: center;
|
|
align-items: center;
|
|
|
|
.cartPic {
|
|
width: 36rpx;
|
|
height: 36rpx;
|
|
margin-right: 14rpx;
|
|
}
|
|
|
|
.cartName {
|
|
font-size: 24rpx;
|
|
color: #fff;
|
|
}
|
|
|
|
.line {
|
|
width: 2rpx;
|
|
height: 22rpx;
|
|
background-color: rgba(255, 255, 255, 0.3);
|
|
margin: 0 12rpx;
|
|
}
|
|
}
|
|
}
|
|
|
|
.timeCon {
|
|
flex-direction: row;
|
|
align-items: center;
|
|
|
|
.userName {
|
|
font-size: 32rpx;
|
|
color: #ffffff;
|
|
font-weight: 500;
|
|
}
|
|
}
|
|
|
|
.words {
|
|
margin-top: 12rpx;
|
|
|
|
.close {
|
|
display: flex;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
justify-content: flex-end;
|
|
margin-right: 20rpx;
|
|
|
|
.imgClose {
|
|
width: 18rpx;
|
|
height: 10rpx;
|
|
margin-left: 10rpx;
|
|
}
|
|
}
|
|
|
|
.wordsCon {
|
|
position: relative;
|
|
|
|
.more {
|
|
position: absolute;
|
|
bottom: 0;
|
|
right: 40rpx;
|
|
font-size: 26rpx;
|
|
}
|
|
|
|
.img {
|
|
width: 18rpx;
|
|
height: 10rpx;
|
|
margin-left: 4rpx;
|
|
position: absolute;
|
|
bottom: 7rpx;
|
|
right: 15rpx;
|
|
}
|
|
}
|
|
|
|
.info {
|
|
color: #fff;
|
|
font-size: 28rpx;
|
|
}
|
|
|
|
.more {
|
|
font-size: 26rpx;
|
|
color: #AAAAAA;
|
|
font-weight: 400;
|
|
}
|
|
}
|
|
|
|
.root {
|
|
background-color: #000000;
|
|
}
|
|
</style>
|
|
|