Huanyuyuehui/pages/short_video/nvueSwiper/index.nvue

1561 lines
41 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="shortVideo" @click="showManage = false">
<!--
注意:这是 H5、微信小程序界面请勿和 new_index.nvue、index.nvue 混用
1. new_index.nvue、index.nvue这两个是App页面
2. 另外data.js 是上一版本留下的假数据,这一版改成了 URL 请求了(如不需要可以删除,也可作为后端请求参考)
3. 请各位大神多多留手,我已经把请求内存开到最大了
4. 视频 id 切记是字符串类型
-->
<!-- 头部导航 -->
<!-- 头部导航 -->
<view v-if="!isUser" class="header">
<!-- #ifdef H5 -->
<view class="tool-bar">
<view class='iconfont icon-xiangzuo' @tap='goBack'></view>
</view>
<!-- #endif -->
<view class="items" @click.stop="navTap(2)">
<text class="tName" :class="currentNav==2?'on':''">关注</text>
</view>
<view class="items" @click.stop="navTap(1)">
<text class="tName" :class="currentNav==1?'on':''">推荐</text>
</view>
</view>
<swiper :style="'width: '+ windowWidth +'px; height: '+ windowHeight +'px;'" :vertical="true" @animationfinish="animationfinish" @change="change" :current="k" :indicator-dots="false">
<swiper-item v-for="(list,index) in dataList">
<view v-if="max > index">
<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.community_id+''+index"
:loop="true"
:muted="list.isplay"
:autoplay="index == k && isRoutine"
:controls="false"
:http-cache="true"
:custom-cache="false"
:page-gesture="false"
:show-fullscreen-btn="false"
:show-loading="false"
:show-center-play-btn="false"
:enable-progress-gesture="false"
:src="list.video_link"
@ended="ended"
@play="play(index)"
@click="tapVideoHover(list.state,$event)"
@waiting="waiting(index)"
:style="'width: '+ windowWidth +'px; height: '+ windowHeight +'px;z-index: -1;'"
></video>
</view>
<!-- 播放状态pause 的时候就会暂停 -->
<view class="videoHover" @click="tapVideoHover(list.state,$event)" :style="'width: '+ windowWidth +'px; height: '+ windowHeight +'px;'">
<image v-if="list.state=='pause'" class="playState" src="../static/img/index/play.png"></image>
</view>
<!--审核状态-->
<view v-if="list.status==-1 || list.status==0 || list.status==-2" class="video-status">
<view v-if="list.status == -1 || list.status == -2" class="status-title">
<image class="image" src="../static/img/index/video-failed.png"></image>
<text class="title">{{list.status == -1 ? '审核未通过' : '已下架'}},内容仅自己可见</text>
</view>
<view v-else class="status-title">
<image class="image" src="../static/img/index/video-review.png"></image>
<text class="title">正在审核,内容仅自己可见</text>
</view>
<view class="status_info">
<text class="refusal">{{(list.status == -1 || list.status == -2) ? list.refusal : '发布的内容审核通过后,将在首页展示!'}}</text>
</view>
</view>
<view>
<!-- 最底下的文字部分 -->
<view class="content">
<view class="cart">
<text class="cartName">@{{list.author && list.author.nickname}}</text>
</view>
<view class="words" :style="'width: '+ (windowWidth - 120) +'px;'">
<view v-if="list.isMore || list.content.length<=15">
<text class="info">{{list.content}}</text>
<view class="close">
<text v-if="list.isMore" class="more" @click="moreTap(list)">收起</text>
</view>
</view>
<view class="wordsCon" v-else>
<text class="info">{{list.content.slice(0,15)}}...</text>
<text class="more" @click.stop="moreTap(list)">展开</text>
</view>
</view>
<view v-if="list.relevance.length == 1 && k===index" class="product">
<scroll-view scroll-x="true" style="white-space: nowrap; display: flex;" scroll-with-animation show-scrollbar="true">
<view class="product-item" v-for="(goods,idx) in list.relevance" :key="idx" v-if="goods.spu">
<view v-if="goods.spu" class="item-count acea-row" @click="goDetail(goods.spu)">
<view class="picture">
<image :src="goods.spu.image"></image>
</view>
<view class="product-text">
<view class="name line1">{{goods.spu.store_name}}</view>
<view class="product-price">
<view class="price">¥<text>{{goods.spu.price}}</text></view>
<view class="buy-btn">购买</view>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
<view v-else-if="list.relevance.length > 1 && k===index" class="product">
<swiper
:autoplay="true"
:circular="circular"
:interval="interval"
:duration="duration"
:loop="true"
next-margin="20rpx"
previous-margin="20rpx"
>
<block v-for="(goods,idx) in list.relevance" :key="idx" v-if="goods.spu">
<swiper-item class="swiper-item">
<view class="swiper-count">
<view v-if="goods.spu" class="item-count acea-row" @click="goDetail(goods.spu)">
<view class="picture">
<image :src="goods.spu.image"></image>
</view>
<view class="product-text">
<view class="name line1">{{goods.spu.store_name}}</view>
<view class="product-price">
<view class="price">¥<text>{{goods.spu.price}}</text></view>
<view class="buy-btn">购买</view>
</view>
</view>
</view>
</view>
</swiper-item>
</block>
</swiper>
</view>
<navigator v-if="list.topic" hover-class="none" class="product_cate" :url="'/pages/plantGrass/plant_search_list/index?id='+list.topic.topic_id">
<view>
<text class="icon">#</text><text class="text">{{list.topic.topic_name}}</text>
</view>
</navigator>
</view>
<view class="userInfo">
<!-- 1.头像 -->
<navigator v-if="list.author && userInfo.uid != list.author.uid" hover-class="none" :url="'/pages/plantGrass/plant_user/index?id='+list.uid" class="pictrue">
<image class="userAvatar" :src="list.author&&list.author.avatar || '/static/images/f.png'" mode="aspectFill"></image>
<view v-if="!list.is_fans || !userInfo.uid" class="guanzhu" @click.stop="followAuthor(list)"><text class="iconfont icon-shangpinshuliang-jia"></text></view>
<view v-else class="yiguanzhu"><text class="iconfont"></text></view>
</navigator>
<!-- 2.点赞 -->
<view @click="cLike(list);" style="margin-top: 5px;" :class="{'likeNumActive':list.relevance_id}">
<text class="iconfont icon-shipindianzan-yidian" :class="{'likeNumActive':list.relevance_id}"></text>
<text class="info-text">{{list.count_start > 0 ? list.count_start : '点赞'}}</text>
</view>
<!-- 3.评论 -->
<view v-if="community_reply_status == 1 && list.status == 1" class="comment" @click="toComment(list,index)" style="margin-top: 18px;">
<text class="iconfont icon-pinglun2"></text>
<text class="info-text">{{list.count_reply>0 ? list.count_reply : '评论'}}</text>
</view>
<!-- 4.分享 -->
<view v-if="list.status == 1" @click="listenerActionSheet" style="margin-top: 17px;">
<text class="iconfont icon-fenxiang3"></text>
<text class="info-text">分享</text>
</view>
<!-- 5.自己的视频 -->
<view v-if="list.author && userInfo.uid == list.author.uid && isUser" style="margin-top: 17px;">
<view class="video-my">
<view class="video-dian" @click.stop="showManage = !showManage">
<text class="dian"></text>
<text class="dian"></text>
<text class="dian"></text>
</view>
<view class="manage" v-show="showManage">
<navigator hover-class="none" :url="'/pages/plantGrass/plant_release/index?id='+list.community_id+'&type=2'" class="items">
<image class="image" src="../static/img/index/video-edit.png"></image>
<text>编辑</text>
</navigator>
<view class="items" @click.stop="deleteTopic(list)">
<image class="image" src="../static/img/index/video-delete.png"></image>
<text>删除</text>
</view>
</view>
</view>
</view>
<!-- 提到的商品 -->
<view v-if="list.relevance.length>0 && k === index" @click="openMore(list)" class="mention" style="opacity: 0.9; margin-top: 18px;">
<image src="../static/img/index/collection.png"></image>
<text class="count">{{list.relevance.length}}</text>
</view>
</view>
</view>
</view>
</swiper-item>
</swiper>
<view class="noVideo acea-row row-center-wrapper" v-if="!dataList.length && !loadVideo">
<view>
<image :src="imgHost+'/static/no-video.png'" class="pictrue"></image>
<text class="tips">暂无短视频内容哦~</text>
</view>
</view>
<comment
ref="comments"
:bottom="0"
:isShow="showComment"
:userInfo="userInfo"
@successFul="pinlunFun"
@close="closeScrollview"
></comment>
<!-- 他提到的宝贝弹窗 -->
<mentioned ref="mentioned" @close="closePopup" :list="moreList" :uid="authorUid"></mentioned>
<image v-if="H5ShareBox" class="shareImg" :src="imgHost + '/static/images/share-info.png'" @click="H5ShareBox = false"></image>
<!-- 分享按钮 -->
<view class="generate-posters acea-row row-middle" :class="posters ? 'on' : ''">
<!-- #ifndef MP -->
<button class="item" :class="weixinStatus ? 'item3' : ''" hover-class='none' v-if="weixinStatus === true" @click="H5ShareBox = true">
<view class="iconfont icon-weixin3"></view>
<view class="">发送给朋友</view>
</button>
<!-- #endif -->
<!-- #ifdef MP -->
<button class="item" :class="weixinStatus ? 'item3' : ''" open-type="share" hover-class='none' @click="goFriend">
<view class="iconfont icon-weixin3"></view>
<view class="">发送给朋友</view>
</button>
<!-- #endif -->
<button class="item" :class="weixinStatus ? 'item3' : ''" hover-class='none' @click="goPoster">
<view class="iconfont icon-haibao"></view>
<view class="">生成海报</view>
</button>
</view>
<view class="mask" v-if="posters" @click="listenerActionClose"></view>
<!-- 海报展示 -->
<view class='mask' v-if="posterImageStatus"></view>
<view class='poster-pop' v-if="posterImageStatus">
<image src='/static/images/poster-close.png' class='close' @click="posterImageClose"></image>
<image :src='posterImage' class="image"></image>
<!-- #ifndef H5 -->
<view class="keep" @click="savePosterPath">保存到相册</view>
<!-- #endif -->
</view>
<canvas class="canvas" canvas-id='myCanvas' v-if="canvasStatus"></canvas>
</view>
</template>
<script>
const app = getApp();
import { toLogin } from '@/libs/login.js';
import { mapGetters } from 'vuex';
import { configMap } from '@/utils';
import comment from '@/components/comment.vue';
import mentioned from '@/components/mentioned.vue';
import { HTTP_REQUEST_URL } from '@/config/app';
import { videoList, myVideoList, graphicStartApi, followAuthorApi, getVideoCode, deletePlantApi, focusArticleLst } from '@/api/community.js';
import { getUserInfo, imgToBase } from '@/api/user.js';
import ClipboardJS from "@/plugin/clipboard/clipboard.js";
export default {
components:{
comment,
mentioned,
},
computed: configMap({community_reply_status:0},mapGetters(['isLogin', 'uid'])),
data() {
return {
imgHost: HTTP_REQUEST_URL,
videoID:0,
pinlunNum:0,
windowWidth: 0,
windowHeight: 0,
platform: "",
deleteHeight: 0,
dataList: [],
shareItem: null,
k: 0,
max: 2,
oldVideo: "",
voice: "",
timeout: "",
authorUid: 0,
current: 0,
// 引入评论 - 参数
heightNum: 1.3,
// 双击点赞参数
touchNum: 0,
aixinLeft: 0,
aixinTop: 0,
Rotate: 0,
currentNav:1,
limit: 6,
page: 1,
oldCurrent: 1,
H5ShareBox: false,
showComment: false,
loadVideo: true,
loadend: false,
userInfo: {},
moreList: [],
posters: false,
weixinStatus: false,
showManage: false,
isUser: false,
isSatrt: 0,
userUid: 0,
posterImageStatus: false,
storeImage: '', //海报产品图
PromotionCode: '', //二维码图片
canvasStatus: false, //海报绘图标签
posterImage: '', //海报路径
posterbackgd: '../static/img/index/posterbackgd.png',
avatar: '/static/images/f.png',
codeImg: "",
autoplay: false,
circular: true,
interval: 3000,
duration: 500,
actionSheetHidden: false,
// #ifdef MP
isRoutine: true,
// #endif
// #ifndef MP
isRoutine: false,
// #endif
}
},
watch:{
k(new_k,old_k){
const max = new_k+2;
if(this.max < max){
this.max = max;
}
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].community_id + '' + old_k)
// 2.0版本已经去掉了下面这一句,视频不用暂停,只需要把声音禁止就行
uni.createVideoContext(this.dataList[old_k].community_id + '' + old_k, this).pause() //如果视频暂停那么旧视频停止这里的this.dataList[old_k].id + '' + old_k后面加 old_k 是为了每一个视频的 id 值不同,这样就可以大程度的避免串音问题
console.log('已经暂停 --> 第' + (old_k + 1) + '个视频~') //提示
// #ifdef MP
this.dataList[new_k].state = 'play'
this.dataList[new_k].isplay = false
this.dataList[new_k].playIng = true
setTimeout(() => {
uni.createVideoContext(this.dataList[new_k].community_id + '' + new_k, this).play()
}, 250)
this.videoShare(this.dataList[new_k])
// #endif
}
},
onLoad(options) {
this.getOptions(options);
this.videoID = options.id;
this.isUser = options.user==1 ? true : false;
this.userUid = options.uid ? options.uid : 0;
this.isSatrt = options.tab == 1 ? 1 : 0;
this.get() //刚进入页面加载数据
if(this.isLogin){
this.getUserInfo();
this.downloadFilePromotionCode(this.videoID);
}
// #ifdef H5
this.setOpenShare();
// #endif
},
onShow(){},
onHide(){
this.dataList[this.k].state = 'pause';//界面隐藏也要停止播放视频
uni.createVideoContext(this.dataList[this.k].community_id+''+this.k,this).pause();//暂停以后继续播放
},
onReady: function() {
this.windowWidth = uni.getSystemInfoSync().windowWidth
this.windowHeight = uni.getSystemInfoSync().windowHeight
},
//发送给朋友
onShareAppMessage(res) {
let uid = this.uid?this.uid:0;
return {
title: this.shareItem.title || '',
path: '/pages/short_video/nvueSwiper/index?id='+this.shareItem.community_id+'&pid='+uid,
imageUrl: this.shareItem.image[0] || '' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
}
},
//分享到朋友圈
onShareTimeline(res) {
return {
title: this.shareItem.title || '',
query:{
id: this.shareItem.community_id,
pid: this.uid
},//页面参数
imageUrl: this.shareItem.image[0] || '' //分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径.支持PNG及JPG。显示图片长宽比是 5:4
}
},
methods: {
//#ifdef MP
videoShare(item){
this.shareItem = item;
if(item && item.status == 1){
uni.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage','shareTimeline'],
})
}else{
uni.hideShareMenu()
}
},
// #endif
//#ifdef H5
goBack: function() {
uni.navigateBack();
},
//#endif
navTap(n) {
this.currentNav = n;
this.dataList.forEach(item=>{
item.state = 'pause';
})
this.k = 0;
this.page = 1;
this.loadVideo = true;
this.loadend = false;
this.dataList = [];
n == 1 ? this.get() : this.getFocusList()
},
/**
* 获取个人用户信息
*/
getUserInfo: function() {
let that = this;
getUserInfo().then(res => {
that.userInfo = res.data;
});
},
// 关注作者
followAuthor: function(item) {
if (this.isLogin === false) {
toLogin()
}else{
let status = 1
followAuthorApi(item.uid,{status:status}).then(res => {
if (res.status === 200) {
item.is_fans = true
}
this.$util.Tips({
title: res.message
});
}).catch(err=>{
return uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
});
}
},
// 删除话题
deleteTopic(item){
let that = this;
uni.showModal({
content: '确定要删除该话题么?',
success: function(res) {
if(res.confirm) {
deletePlantApi(item.community_id).then(res => {
if (res.status === 200) {
that.$util.Tips({
title: res.message
});
setTimeout(function() {
uni.redirectTo({
url: '/pages/plantGrass/plant_user/index?id='+item.uid
})
}, 1000);
}
})
} else if(res.cancel) {
console.log('用户点击取消');
}
}
});
},
play(k){
console.log(' 播放了',k)
this.dataList[k].isplay = false
this.dataList[k].playIng = true
this.dataList[k].state = 'play'
this.dataList[k].loading = false
},
waiting(k){
console.log('视频缓冲了', k)
this.dataList[k].loading = true
},
pinlunFun(e){
this.pinlunNum = e;
this.dataList.forEach(item=>{
if(item.community_id == this.videoID){
item.count_reply = item.count_reply+1;
}
})
},
getOptions(options){
let that = this;
// #ifdef MP
if (options.scene) {
let value = that.$util.getUrlParams(decodeURIComponent(options.scene));
//记录推广人uid
if (value.pid) app.globalData.spid = value.pid;
}
// #endif
if (options.pid) app.globalData.spid = options.pid;
},
// #ifdef H5
// 微信分享;
setOpenShare: function() {
let that = this;
let uid = this.uid?this.uid:0;
if (that.$wechat.isWeixin()) {
let data = this.dataList[0];
let configAppMessage = {
desc: data.content,
title: data.title,
link: location.href+'?pid='+uid+'&id='+this.videoID,
imgUrl: data.image
};
that.$wechat.wechatEvevt(['updateAppMessageShareData', 'updateTimelineShareData',
'onMenuShareAppMessage', 'onMenuShareTimeline'
],
configAppMessage);
}
},
// #endif
moreTap(item){
item.isMore = !item.isMore;
},
moveHandle(){},
closeScrollview(){
// 点击评论里面的叉叉,就会关闭评论
this.showComment = false
},
toComment(item,index){
// 注意点击评论之后会执行这里
/*
1先加载缓冲
2获取当前视频 ID 信息
3????????重要????????
- 一定要记得看 index.vue 里面
uni.setStorageSync("user",this.peopleList[i]);
这个东西,用于存储当前用户信息。在 插件里面会使用到这个东西,
记得写一下。
4打开评论
*/
this.showComment = true
this.$refs.comments.getData(item,index);
},
ended(){
// 1.播放当前视频结束时触发,自动切换下一个视频
// this.current = this.k+1
},
//点击播放&&暂停
tapVideoHover(state,event){
// 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].community_id+''+this.k,this).play();//暂停以后继续播放
}
if(this.dataList[this.k].state == 'pause'){
uni.createVideoContext(this.dataList[this.k].community_id+''+this.k,this).pause();//暂停以后继续播放
}
}
this.touchNum = 0;
},200)
},
change(event){
this.k = event.detail.current;
this.posterImage = false;
if(this.isLogin && this.dataList[this.k]){
this.downloadFilePromotionCode(this.dataList[this.k]['community_id']);
}
},
animationfinish(event){
// 1.这里进行判断,如果是最后一个视频就进入 get() 方法加载视频进入列表
if(this.k == this.dataList.length - 1){
this.loadVideo = true;
this.currentNav == 1 ? this.GET() : this.getFocusList()
}
},
//每一组结束时新的请求
GET(){
let that = this
if(!that.loadVideo) return
if(that.loadend) return
that.loadVideo = true
that.isUser ?
myVideoList(that.userUid,{
page: that.page,
limit: that.limit,
is_star: that.isSatrt,
community_id: that.videoID
}).then(res=>{
that.videoData(res.data.list)
that.loadVideo = false
that.loadend = res.data.list.length < that.limit
}).catch(err=>{
return uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
}) :
videoList({
page: that.page,
limit: that.limit,
id: that.videoID
}).then(res=>{
that.loadVideo = false
that.videoData(res.data.list)
that.loadend = res.data.list.length < that.limit
}).catch(err=>{
return uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
})
},
get(){
let that = this
// 1.这里引入后端请求数据
that.isUser ?
myVideoList(that.userUid,{
page: that.page,
limit: that.limit,
is_star: that.isSatrt,
community_id: that.videoID
}).then(res=>{
that.page = that.page + 1;
that.videoData(res.data.list)
}).catch(err=>{
return uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
}) :
videoList({
page: that.page,
limit: that.limit,
id: that.videoID
}).then(res=>{
that.page = that.page + 1;
that.videoData(res.data.list)
}).catch(err=>{
return uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
})
},
getFocusList(){
let that = this;
if(!that.loadVideo) return
if(that.loadend) return
that.loadVideo = true
focusArticleLst({
page: that.page,
limit: that.limit,
}).then(res=>{
that.loadVideo = false
that.loadend = res.data.list.length < that.limit
that.page = that.page + 1;
that.videoData(res.data.list)
}).catch(err=>{
return uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
})
},
videoData(list){
if(list.length == 0)return
let that = this;
var msg = list
// 2.这里把视频添加到视频列表
for (let i = 0; i < msg.length; i++) {
msg[i]['isMore'] = false
msg[i]['playIng'] = false
msg[i]['state'] = 'pause'
msg[i]['isplay'] = true
msg[i]['loading'] = false
that.dataList.push(msg[i])
//#ifndef H5
if(i == 0 && that.k == 0){
this.dataList[0].isplay = false
this.dataList[0].playIng = true
this.dataList[0].state = 'play'
this.dataList[0].loading = false
uni.createVideoContext(that.dataList[0].community_id+''+0,that).play()
}
//#endif
}
//#ifdef MP
if(this.k==0){
this.videoShare(this.dataList[0]);
}
// #endif
// #ifdef H5
if (that.isLogin) {
that.setOpenShare(that.videoID);
}
// #endif
},
share(){
this.H5ShareBox = true;
},
/**
* 分享打开
*
*/
listenerActionSheet: function() {
if (this.isLogin === false) {
toLogin()
} else {
// #ifdef H5
if (this.$wechat.isWeixin() === true) {
this.weixinStatus = true;
}
// #endif
this.posters = true;
}
},
// 分享关闭
listenerActionClose: function() {
this.posters = false;
},
//隐藏海报
posterImageClose: function() {
this.posterImageStatus = false
},
// 小程序关闭分享弹窗;
goFriend: function() {
this.posters = false;
},
/* 获取产品分销二维码
* @param function successFn 下载完成回调
*
*/
downloadFilePromotionCode: function(id) {
let that = this;
let type;
// #ifndef MP
type = 'wechat'
// #endif
// #ifdef MP
type = 'routine'
// #endif
getVideoCode(id, {
type: type
}).then(async res => {
that.codeImg = res.data.url
}).catch(err => {
that.$set(that, 'PromotionCode', '');
});
},
/*
* 保存到手机相册
*/
// #ifdef MP
savePosterPath: function() {
let that = this;
uni.getSetting({
success(res) {
if (!res.authSetting['scope.writePhotosAlbum']) {
uni.authorize({
scope: 'scope.writePhotosAlbum',
success() {
uni.saveImageToPhotosAlbum({
filePath: that.posterImage,
success: function(res) {
that.posterImageClose();
that.$util.Tips({
title: '保存成功',
icon: 'success'
});
},
fail: function(res) {
that.$util.Tips({
title: '保存失败'
});
}
})
}
})
} else {
uni.saveImageToPhotosAlbum({
filePath: that.posterImage,
success: function(res) {
that.posterImageClose();
that.$util.Tips({
title: '保存成功',
icon: 'success'
});
},
fail: function(res) {
that.$util.Tips({
title: '保存失败'
});
},
})
}
}
})
},
// #endif
/**
* 生成海报
*/
async goPoster() {
if(!this.isLogin){
}
if (this.posterImage) {
this.posterImageStatus = true
this.posters = false
return
}
let that = this;
let arr2
that.posters = false;
that.$set(that, 'canvasStatus', true);
uni.showLoading({
title: '海报生成中',
mask: true
});
// #ifdef MP || APP-PLUS
if(that.dataList[that.k].author.avatar){
arr2 = [that.posterbackgd,await that.fileStoreImage(that.dataList[that.k].image[0]), await that.fileStoreImage(
that.codeImg), await that.fileStoreImage(that.dataList[that.k].author.avatar)];
}else{
arr2 = [that.posterbackgd,await that.fileStoreImage(that.dataList[that.k].image[0]), await that.fileStoreImage(
that.codeImg), that.avatar];
}
// #endif
// #ifdef H5
if(that.dataList[that.k].author.avatar){
arr2 = [that.posterbackgd,await that.imgToBase(that.dataList[that.k].image[0]), await that.imgToBase(that.codeImg), await that.imgToBase(that.dataList[that.k].author.avatar)];
}else{
arr2 = [that.posterbackgd,await that.imgToBase(that.dataList[that.k].image[0]), await that.imgToBase(that.codeImg), that.avatar];
}
// #endif
//生成推广海报
that.$util.videoPosterCanvas(arr2, that.dataList[that.k].content, that.dataList[that.k].author.nickname, function(tempFilePath) {
that.$set(that, 'posterImage', tempFilePath);
that.$set(that, 'posterImageStatus', true);
that.$set(that, 'actionSheetHidden', !that.actionSheetHidden);
that.$set(that, 'canvasStatus', false);
}, (err) => {
that.$set(that, 'canvasStatus', false);
});
},
//图片转符合安全域名路径
fileStoreImage(url) {
let that = this;
// #ifdef MP || APP-PLUS
let ishttps = url.split('//')[0] == 'https:'
if (!ishttps) {
url = 'https://'+url.split('//')[1]
}
// #endif
return new Promise((resolve, reject) => {
uni.downloadFile({
url: url,
success: function(res) {
resolve(res.tempFilePath);
},
fail: function() {
return that.$util.Tips({
title: ''
});
}
});
})
},
/*
* 保存到手机相册
*/
// #ifdef MP
savePosterPath: function() {
let that = this;
uni.getSetting({
success(res) {
if (!res.authSetting['scope.writePhotosAlbum']) {
uni.authorize({
scope: 'scope.writePhotosAlbum',
success() {
uni.saveImageToPhotosAlbum({
filePath: that.posterImage,
success: function(res) {
that.posterImageClose();
that.$util.Tips({
title: '保存成功',
icon: 'success'
});
},
fail: function(res) {
that.$util.Tips({
title: '保存失败'
});
}
})
}
})
} else {
uni.saveImageToPhotosAlbum({
filePath: that.posterImage,
success: function(res) {
that.posterImageClose();
that.$util.Tips({
title: '保存成功',
icon: 'success'
});
},
fail: function(res) {
that.$util.Tips({
title: '保存失败'
});
},
})
}
}
})
},
// #endif
async imgToBase(url) {
let res = await imgToBase({
image: url
})
return res.data.image
},
cLike(item){
if(this.isLogin){
let status = item.relevance_id ? 0 : 1
graphicStartApi(item.community_id,{status: status}).then(res=>{
if(item.relevance_id){
item.count_start--;
item.count_start = item.count_start == 0 ? 0 : item.count_start
item.relevance_id = false
}else{
item.count_start++;
item.relevance_id = true
}
}).catch(err=>{
return uni.showToast({
title: err,
icon: 'none',
duration: 2000
});
})
}else{
toLogin()
}
},
/*查看提到的宝贝*/
openMore(item){
this.$refs.mentioned.showPopup()
this.moreList = item.relevance;
this.authorUid = item.uid
},
closePopup(){
this.$refs.mentioned.closePopup()
},
goDetail(item){
if (item.product_type === 1) {
uni.navigateTo({
url: `/pages/activity/goods_seckill_details/index?id=${item.product_id}&time=${item.stop_time}&spid=${this.uid}`
})
} else if (item.product_type === 2) {
uni.navigateTo({
url: `/pages/activity/presell_details/index?id=${item.activity_id}&spid=${this.uid}`
})
} else if (item.product_type === 0) {
uni.navigateTo({
url: `/pages/goods_details/index?id=${item.product_id}&spid=${this.uid}`
})
}else if (item.product_type === 4) {
uni.navigateTo({
url: `/pages/activity/combination_details/index?id=${item.activity_id}&spid=${this.uid}`
})
}else if (item.product_type === 40) {
uni.navigateTo({
url: `/pages/activity/combination_status/index?id=${item.activity_id}&spid=${this.uid}`
})
}
}
}
}
</script>
<style lang="scss" scoped>
.header {
position: fixed;
z-index: 9;
width: 750rpx;
height: 86rpx;
flex-direction: row;
justify-content: center;
align-items: center;
top: 20rpx;
.tool-bar{
position: absolute;
left: 0;
top: 0;
width: 60rpx;
height: 86rpx;
display: flex;
justify-content: center;
.icon-xiangzuo {
margin-right: 40rpx;
margin-left: 20rpx;
font-size: 26rpx;
color: #fff;
}
}
.items {
margin: 0 30rpx;
.tName {
color: #ffffff;
font-size: 32rpx;
&.on{
font-size: 38rpx;
}
}
}
}
.shareImg{
z-index: 1000;
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.shortVideo,.container {background: linear-gradient(180deg, rgba(0,0,0,.8) 0%, #000000 100%);}
.item {
position: relative;
}
.video-status{
width: 690rpx;
position: absolute;
left: 30rpx;
background: #000;
border-radius: 10rpx;
top: 60rpx;
padding: 30rpx;
.status-title{
flex-direction: row;
align-items: center;
.title{
margin-left: 20rpx;
color: #ffffff;
font-size: 28rpx;
}
}
.refusal{
color: #ffffff;
font-size: 22rpx;
margin: 15rpx 0 0 48rpx;
}
.image{
width: 28rpx;
height: 28rpx;
}
}
.videoHover{
position: absolute;
top: 0;
left: 0;
flex: 1;
justify-content: center;
align-items: center;
}
.playState{
width: 160rpx;
height: 160rpx;
opacity: 0.2;
}
.userInfo{
position: absolute;
bottom:60rpx;
right: 20rpx;
flex-direction: column;
text-align: center;
.pictrue{
flex-direction: column;
justify-content: center;
align-items: center;
position: relative;
// margin-bottom: 18rpx;
image{
width: 92rpx;
height: 92rpx;
}
.guanzhu{
width: 42rpx;
height: 42rpx;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
background: #E93323;
border-radius: 100%;
position: relative;
top: -20rpx;
left: 26rpx;
.iconfont{
font-size: 20rpx;
}
}
.yiguanzhu{
width: 42rpx;
height: 42rpx;
}
}
.mention{
width: 92rpx;
height: 92rpx;
position: relative;
image{
width: 58rpx;
height: 58rpx;
position: absolute;
right: 16rpx;
}
.count{
width: 30rpx;
height: 30rpx;
line-height: 30rpx;
background: #fff;
border-radius: 100%;
display: flex;
align-items: center;
justify-content: center;
color: #E93323;
position: absolute;
right: 8rpx;
top: -12rpx;
font-size: 20rpx;
}
}
.iconfont{
color: #ffffff;
&.likeNumActive{
color: #E93323;
}
}
}
.icon-shipindianzan-yidian{
font-size: 64rpx;
}
.icon-pinglun2{
font-size: 59rpx;
}
.icon-fenxiang3{
font-size: 58rpx;
}
.info-text{
margin-top: 10rpx;
color: #ffffff;
}
.userAvatar{
border-radius: 500%;
border-style: solid;
border-width: 2px;
border-color: #ffffff;
width : 80rpx;
height: 80rpx;
display: block;
}
.video-dian{
position: relative;
width: 66rpx;
height: 66rpx;
align-items: center;
justify-content: center;
flex-direction: row;
left: 12rpx;
.dian{
width: 13rpx;
height: 13rpx;
background-color: #fff;
border-radius: 100%;
margin-right: 10rpx;
&:last-child{
margin-right: 0;
}
}
}
.manage{
width: 210rpx;
background: #ffffff;
box-shadow: 0 2rpx 15rpx rgba(0, 0, 0, 0.1);
padding: 0 15rpx;
position: absolute;
bottom: -50rpx;
right: 110rpx;
z-index: 90;
border-radius: 16rpx;
&::before{
content: "";
display: inline-block;
width: 26rpx;
height: 26rpx;
background: #ffffff;
transform: rotate(140deg);
position: absolute;
top: 60rpx;
right: -14rpx;
box-shadow: -1rpx -1rpx 1rpx rgba(0, 0, 0, 0.05);
}
.items{
border-bottom: 1px solid #EEEEEE;
color: #282828;
font-size: 26rpx;
padding: 20rpx 0;
display: flex;
align-items: center;
flex-direction: row;
&:last-child{
border-bottom: none;
}
.image{
width: 32rpx;
height: 32rpx;
margin: 0 16rpx 0;
}
}
}
.likeNumActive{
color: #E93323;
}
.content{
width: 590rpx;
position: absolute;
bottom: 30rpx;
bottom: calc(30rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
bottom: calc(30rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
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{
height: 48rpx;
flex-direction:row;
.cartName{
font-size: 24rpx;
color: #fff;
}
}
}
.canvas {
z-index: 300;
width: 750px;
height: 1036px;
}
.poster-pop {
width: 600rpx;
/*#ifdef H5*/
height: 820rpx;
/*#endif*/
/*#ifndef H5*/
height: 910rpx;
/*#endif*/
position: fixed;
left: 50%;
transform: translateX(-50%);
z-index: 399;
top: 50%;
margin-top: -410rpx;
border-radius: 30rpx;
}
.poster-pop .image {
width: 100%;
height: 100%;
display: block;
border-radius: 16rpx;
}
.poster-pop .close {
width: 46rpx;
height: 75rpx;
position: fixed;
right: 0;
top: -73rpx;
display: block;
}
.poster-pop .keep {
text-align: center;
width: 600rpx;
height: 70rpx;
line-height: 70rpx;
border-radius: 43rpx;
background: #E93323;
color: #ffffff;
font-size: 25rpx;
margin-top: 40rpx;
}
.mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.6);
z-index: 9;
}
.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: #ffffff;
font-weight: 400;
}
}
.product{
display: block;
margin-top: 27rpx;
.product-item{
display: inline-block;
width: 444rpx;
height: 136rpx;
background: rgba(0,0,0,.55);
border-radius: 12rpx;
padding: 16rpx 15rpx;
margin-right: 30rpx;
}
/deep/uni-swiper,/deep/swiper{
display: block;
// width: 500rpx!important;
height: 136rpx!important;
.swiper-count{
display: block;
width: 444rpx!important;
height: 136rpx!important;
background: rgba(0,0,0,.55);
border-radius: 12rpx;
padding: 16rpx 15rpx;
}
.swiper-item{
display: block;
width: 480rpx!important;
}
}
.item-count{
width: 414rpx;
flex-direction: row;
justify-content: space-between;
border-radius: 12rpx;
.picture{
width: 104rpx;
height: 104rpx;
border-radius: 10rpx;
image{
width: 104rpx;
height: 104rpx;
border-radius: 10rpx;
}
}
.product-text{
width: 266rpx;
justify-content: space-between;
.name{
display: inline-block;
width: 266rpx;
}
.product-price{
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
.price{
display: flex;
flex-direction: row;
align-items: end;
text{
font-size: 34rpx;
}
}
.buy-btn{
width: 89rpx;
height: 36rpx;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
border-radius: 26rpx;
background: #E93323;
font-size: 20rpx;
}
}
}
}
}
.product_cate{
margin: 20rpx 0;
flex-direction: row;
>view{
display: inline-block;
flex-direction: row;
align-items: center;
border-radius: 30rpx;
padding: 0 25rpx;
line-height: 40rpx;
border-radius: 29rpx;
border: 1px solid #ffffff;
.text{
font-size: 24rpx;
}
.icon{
display: inline-block;
font-size: 26rpx;
font-weight: bold;
position: relative;
top: 2rpx;
margin-right: 8rpx;
}
}
}
.generate-posters {
width: 100%;
height: 170rpx;
background-color: #fff;
position: fixed;
left: 0;
bottom: 0;
z-index: 388;
transform: translate3d(0, 100%, 0);
transition: all 0.3s cubic-bezier(0.25, 0.5, 0.5, 0.9);
border-top: 1px solid #eee;
align-content: center;
align-items: center;
flex-direction: row;
}
.generate-posters.on {
transform: translate3d(0, 0, 0);
}
.generate-posters .item {
/* #ifdef H5 */
flex: 100%;
/* #endif */
/* #ifndef H5 */
flex: 33.33%;
/* #endif */
text-align: center;
font-size: 30rpx;
&.item3{
flex: 33.33%;
}
}
.generate-posters .item .iconfont {
font-size: 80rpx;
color: #5eae72;
}
.generate-posters .item .iconfont.icon-haibao {
color: #5391f1;
}
.mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.6);
z-index: 9;
}
.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;
}
}
</style>