<template> <div class="livedControls" :style="{'bottom' : info.openPlayback == 0 && info.playbackUrl && info.playbackUrl[0] && info.liveBroadcastState == 2 ? '40px' : '20px'}"> <!-- 公告层 --> <livedAnnouncement v-if="info.liveNotice && !info.playbackUrl" :liveNotice="info.liveNotice"></livedAnnouncement> <!-- 用户进入通知 --> <div class="userComing userComingAni" v-if="userComing"> <span>{{entryNoticeText}}</span> <span>来了</span> </div> <!-- 评论层 --> <livedIsMsg :guestBookList="guestBookList" :updateVal="updateVal" :isSend="isSend" :liveId="liveId" :info="info" :fixedHeight="getBottom" ></livedIsMsg> <!-- 带货商品层 --> <livedExplainingCommodities v-if="(info.liveBroadcastState==1||info.liveBroadcastState==3)&&list" :updateGoods="updateGoods" :goodsList="list" :isFocusComments="isFocusComments" ></livedExplainingCommodities> <!-- 商品列表弹层 --> <livedGoodsDia :showDia="showDia" :updateVal="updateVal" :goodsList="list" :updateGoods="updateGoods" v-if="list" @changeStatus="changeStatus" ></livedGoodsDia> <!-- 分享弹层 --> <livedShareDia v-if="loadingShare" :showShareDia="showShareDia" @closeShareDia="closeShareDia" :info="info"></livedShareDia> <!-- 底部控制层 --> <div class="control flex" > <template v-if="!isSend"> <div class="goodsImg" @click="showGoodsList" v-if="info.liveBroadcastSales==0"> <img src="../../../static/images/lived/goodsImg.png" alt /> <p class="goodsNum" v-if="list.length>0">{{list.length}}</p> </div> <div class="goodsImg" v-else></div> <div class="iptCopy" v-if="!info.playbackUrl || info.liveBroadcastState==3 || info.liveBroadcastState==1" @click="isLogin">跟主播说点什么...</div> <div class="iptCopy" style="background:none;" v-else></div> <div class="shareIcon" @click="showShare"> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADwElEQVR4Xu2aS6hNURjH//+RgYGRKAMDr1tmFJGBSxmIjGTgKq/rUURi5qKQkhKlLt1IHkl05VUG7r3lkW4MPMIVRXkNFMqAqL++2len45y99mPtc/bu7FWnc2qv9X3f/7fX41trHaLFC1tcP0oAZQ9ocQLlEGjxDlBOguUQKIdAixPI1RCQ1EbyZSPfSW4ASHoGYCqABwC2kBxsBIhcAJB0CsDKCsGfAKwleTNrCHkB0A9gbpXY3wDWkDyTJYQ8AxjWvY3k4awgFAGAad9PcmcWEIoCwLQfJ7nBN4QiATDtl22yJPnDF4iiATDdAwGEdz4gFBGA6bacwXrCo7QQmg5A0iQAJ2osgy5tliusInnLVTHsecMBSBoHYAaAmcG3/R6ZUITlCgbhXML2jTsPkDQdwLrgkzTeeu22kjySxGjmPSBj4ZWa95HsigshMwCSxgDYHnzixpW0fjfJjXEaZwJAkiUsJn5CnGA81b0EoIPkryj2vAKQNA3AAQALojjPsI5trlaQ/ODy4Q2ApIUAzgMY5XLaoOdPAwiPM18GJa0H0N0gYXHcWK5gPeF2vUape4CkGwDs7ee1WK6wjGRvrQBTAZB0BcCSvCqviOsNyYleAUg6CmBzAcRbiAMk270BkGTCDUBRSjtJ20X+V2IPAUnzANSdVHJIZArJV14mQUkjAPQBmJ1DodUhfQcwluRPb8ugpIMAdhRA/BDJtihxRh4CkhYDuBrFaJPr9JGcHzWGOADs4KHZKa5L12mSlRcsrvrRzgMkLQdw1mmtuRX2ktwVN4RIPUDSfQCz4hpvYP1Okj1J/DkBSOoA4Pt66huA5wCeADC4qxOcCZrePwAWpTkXjALgguXSSegGbT4HS6cJfQFgsPpcX1Ktu0GXy/c2J5E0m4lLKIDgAHMowaGlTZj3APSTvOuKLgGAhwAsu0t9QeICEGeba/tu2xz1kgzdg1cDiQngOklbkr0UF4BrNsYcnu4AOEQycY4QA0APyU4vygMjdQFIGg/gbYizj4Hw1FfXEQEkOvV1wQoDEDb7HwvEhwFy+f73PAKATSTNp/cSBuAigKU1PNq/Nk76jCQEwFe7SCFpJ72ZlDAANvtPrvI6h6TN7l5LHQC2vJl45yqSJpgwAMP/2hq2P5rklzTO6rWVtAfA7ornlheY+NdZ+Ku0GQbAgrIZ18a5HSpa4pFZkWSriN0f2tDr8rHGRwnWmQlGMVLkOiWAIr89H7GXPcAHxSLbKHtAkd+ej9jLHuCDYpFtlD2gyG/PR+wt3wP+AsW7I1AzjlUOAAAAAElFTkSuQmCC" alt=""> </div> <div class="heardIcon"> <div class="clickEl" @click="addLike(1)"></div> <img class="like" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADu0lEQVR4Xu2aTYhOURjH//+VspRSksiKKRsjWShT2FE2jK80xAj5CpHkI8nkm8aYwZiGGTORDQsKzcpqZomtmixsWCnZPHpypl5v8957zrnnfrzve596N+99znP+z+8+5957PogmNzZ5/igBlBXQ5ATKIdDkBVA+BMshkHQIiMhiAGsBLAIwx/y+A9DfJwAvSP7w6UdEFgBYDaClIvYvE1vjPyI56RN7qo13BYhIO4AjAFZYCBgCMELytYUvHGOPABiyjV3dvzMAEVkK4DQABeBqrwD01RKbZuxaQp0AiMhmADcAzHXNvMr/Fsmjlf+lGTtKqzUAETkP4FzCxCubvyOpzw4t+dRix+m1AiAiXQBOxgXzuK6Jq4aQYKdkXCGpQzXSYgGIyA4Ag3GBCnr9AkmFXNNsAIwDWFbQBG1ktZKc8HoIisheAL02vRTYR986nb4APgJYWeDkbKUtJPl1OueaQ0BE5gFI9JVlqy4Dvw6SA64AtgAYzkBcFl0MkOxwBXAVwPEs1GXQxzjJ5a4A9NWnr8BGsEmS810BvAWwrhGyB/CH5AxXAC8BbGwQAD9JznIF0ANgX4MA+EJyiSuA0BOUPFmOkWxzBaAfQPoh1AhWc04QORcQkW8B5v5FANhGcsypAtRZRHQeoPOBerYJkq21EoirAJ0F6mywnq2TZJ8XgAaogsi7r/nZrAfMBvCmDtcEfqtmkp+jyjcWgKmCVQbCzDoaCy1xyVtVwFTCIrIJwGidAFhD8r2NVqsKqICgewHPbALn6LOBpO4/WJkTADMctupOjFX07J3aSTpVqTMAA2E7gCfZ5xfZ4y6Sj101eQEwEHYCmHaZyVVEAP8DJO/5xPEGYCDoMlO/T8cB25wgec03XiIABsJuAA99BSRsd47kxSQxEgMwEPborm8SIR5tu0ie8mj3X5MgAAwE3Xy4n1SQZfs7JA9b+ka6BQNgIOwH0B1CWESMbpIHQ/URFICBoOLuhhJYFaeHpEIOZsEBGAiHANwOpvJfoF6SwdcoUwFgIOj5oZuBIDwgmcrCTGoADIRjAK4nhNBPUl+1qViqAAwE3V7TbTYfq7mn5xNsujapAzAQ9HiNHrNxsUGS+rmdqmUCwEDQ8zqXLbN5SjKTfcnMABgIZwBcioEwTHKbJajEbpkCMBDOAqj1/T5K0ucApjeIzAEYCHosrvr01nOSuuyWqeUCwEDQMb4egB5+/kAylwWW3ABkepsjOisBFOVO5KWjrIC8yBel37ICinIn8tJRVkBe5IvS71/x8QxQBHuXTgAAAABJRU5ErkJggg==" alt=""> <p class="heardNum" v-if="likeNum>0">{{likeNumCopy}}</p> <div class="box"> <div class="img" :class="{'imgAni':imgAni}" v-for="(item,index) in imgList" :key="index" > <img :src="item.img" alt /> </div> </div> </div> </template> <template v-else> <div class="sendOut" :style="{'bottom':getBottom+'px'}"> <input class="sendIpt" :adjust-position="false" :focus="getFocus" type="text" @focus="onFocus" @blur="onblur" v-model="sendVal" placeholder="和主播说点什么吧~" /> <div class="send" :class="{'noSendVal':sendVal==''}" @click="toSend">发送</div> </div> </template> </div> </div> </template> <script type="text/ecmascript-6"> import livedAnnouncement from "@/components/livedModel/livedAnnouncement"; import livedIsMsg from "@/components/livedModel/livedIsMsg"; import livedExplainingCommodities from "@/components/livedModel/livedExplainingCommodities"; import livedGoodsDia from "@/components/livedModel/livedGoodsDia"; import livedShareDia from "@/components/livedModel/livedShareDia"; import live from "@/api/live"; export default { props: [ "info", "entryNoticeText", "updateVal", "guestBookList", "likeInfo", "goodsList", "updateGoods" ], name: "", data() { return { liveId: 0, imgList: [], likeNum: 0, iconList: [ // "//img3.imgtn.bdimg.com/it/u=3743111107,1940472030&fm=11&gp=0.jpg", // "//img0.imgtn.bdimg.com/it/u=216605226,3652567530&fm=11&gp=0.jpg", // "//img3.imgtn.bdimg.com/it/u=3743111107,1940472030&fm=11&gp=0.jpg", // "//img2.imgtn.bdimg.com/it/u=1354268575,1268995723&fm=26&gp=0.jpg" ], list: [], num: 0, userComing: false, showDia: false, //显示商品列表弹窗 showShareDia: false, //显示分享弹窗 isSend: false, //显示评论输入框 sendVal: "", //输入内容 getFocus: false, //获取焦点 imgAni: false, //给点赞元素加动画 getBottom:0,//动态绑定输入框位置 loadingShare:false, isClick:true, isFocusComments:false, //是否在评论中,如果在评论中就隐藏掉上屏商品 }; }, components: { livedAnnouncement, livedIsMsg, livedExplainingCommodities, livedGoodsDia, livedShareDia }, computed: { likeNumCopy() { return this.watchMan(this.likeNum); } }, watch: { updateVal(newVal, oldVal) { if (this.likeNum < this.likeInfo.likeNum) { this.getAdd(); } this.likeNum = this.likeInfo.likeNum; if (this.entryNoticeText) { this.userComing = true; setTimeout(() => { this.userComing = false; }, 4600); } else { this.userComing = false; } }, updateGoods() { this.list = this.goodsList; } }, created() {}, onLoad(options) { if(options.params){ let params = JSON.parse(options.params); this.liveId = params.liveId; }else if(options.scene){ var scene = decodeURIComponent(options.scene); //参数二维码传递过来的参数 console.log(scene) let sceneInfo = scene.split(',') console.log('sceneInfo',sceneInfo) this.liveId = sceneInfo[0].split('=')[1] } let _this=this; wx.getStorage({ key: "sessionid", success(res) { _this.loadingShare=true; }, fail(res) { _this.loadingShare=false; } }); // 获取直播配置 this.getLivedConfig(); }, mounted() {}, methods: { // 数量大于1w watchMan(val) { return val - 0 > 10000 ? ((val - 0) / 10000).toFixed(1) + "w" : val; }, // 点赞 addLike(val) { this.imgAni = true; if (val == 1) { // if (this.info.liveBroadcastState < 1) { // this.notAgainLive(); // return; // } this.likeNum++; let query = { liveBroadcastId: this.liveId, clickNum: 1 }; live.addLiveLikeByUser(query).then(res => {}); } setTimeout(() => { this.num++; if (this.num >= 4) { this.num = 0; } this.imgList.push({ img: this.iconList[this.num] }); }, 300); }, // 直播未开始提示 notAgainLive() { wx.showModal({ content: "直播还未开始", confirmColor: "#ff877d", success: function(res) { if (res.confirm) { } else if (res.cancel) { } } }); }, // 接口获取触发点赞 getAdd() { if (this.imgList.length > 20) { this.imgList = []; } for (let i = 0; i < this.iconList.length; i++) { setTimeout(() => { this.addLike(2); }, 200 * i); } }, // 显示商品 showGoodsList() { this.showDia = true; }, changeStatus() { this.showDia = false; }, showShare() { this.loadingShare=true; this.showShareDia = true; }, closeShareDia() { this.showShareDia = false; }, // 是否登录 isLogin() { let _this = this; wx.getStorage({ key: "sessionid", success(res) { _this.toSendOut(); }, fail(res) { console.log("未登录------150"); // 跳转登录页 let backUrl = "/lived/main"; let query = { liveId: _this.liveId, fromType: "mini" }; let url = `/pages/login/main?back=${backUrl}¶ms=${JSON.stringify( query )}`; wx.navigateTo({ url: url }); } }); }, // 发送评论 toSendOut() { this.isSend = true; this.getFocus = true; }, // 失焦点 onblur() { this.imgAni = false; setTimeout(() => { this.isSend = false; this.sendVal = ""; this.isFocusComments = false; }, 300); }, // 获取焦点 onFocus(e){ this.isFocusComments = true; this.getBottom=(e.mp.detail.height-10); }, // 点击发送留言 toSend() { if(this.isClick){ this.isClick=false; setTimeout(() => { this.isClick=true; },300); console.log("点击按钮-------------------200"); if (this.sendVal == "") { this.getFocus = true; } else { let query = { guestbookType: "1", guestbookContent: this.sendVal, liveBroadcastId: Number(this.liveId) }; this.$emit("toSendMsg", query); } } }, getLivedConfig(){ let configCode="LIVE_LIKE_ICON"; live.getConfigValueByConfigCode({configCode}).then(res=>{ if(res.data.code==200){ let newArr=res.data.data; this.iconList=JSON.parse(newArr); } }) } } }; </script> <style lang="scss" scoped> .flex { display: flex; } .livedControls { position: fixed; left: 0; width: 100vw; z-index: 2; .userComing { margin-bottom: 10px; background: rgba(#000, 0.4); color: #fff; font-size: 16px; height: 26px; line-height: 26px; border-radius: 26px; padding: 0 8px; display: inline-block; } .userComingAni { animation: userComingAni 4.7s linear; } @keyframes userComingAni { 0% { transform: translateX(150vw); opacity: 0.3; } 30% { transform: translateX(12px); opacity: 1; } 80% { transform: translateX(12px); opacity: 1; } 100% { transform: translateX(-150vw); opacity: 0; } } .control { height: 40px; align-items: center; justify-content: space-around; padding: 0 12px; .goodsImg { width: 30px; height: 30px; position: relative; img { width: 30px; height: 30px; position: absolute; top: 0; left: 0; z-index: -1; } .goodsNum { color: #fff; font-size: 14px; text-align: center; margin-top: 10px; } } .iptCopy { margin: 0 10px; width: 50vw; background: rgba(#000, 0.4); color: #999; font-size: 16px; height: 38px; border-radius: 38px; line-height: 38px; text-indent: 1em; } .shareIcon, .heardIcon{ position: relative; width: 50px; height: 30px; display: flex; justify-content: center; align-items: center; img{ width: 32px; height: 32px; } } .heardIcon { .clickEl{ position: absolute; top: 0; left: 0; right: 0; bottom: 0; z-index: 99; } .like { position: absolute; top: 0; left: 50%; margin-left: -16px; } .heardNum { text-align: center; transform: translateY(-20px); background: rgba(#e60012, 0.5); border-radius: 8px; padding: 0 2px; font-size: 12px; color: #fff; min-width: 30px; } .box { width: 100px; height: 260px; position: absolute; overflow: hidden; bottom: 0; right: -30px; pointer-events: none; .img { position: absolute; bottom: 0; left: 50%; margin-left: -20px; width: 40px; height: 40px; opacity: 0; border-radius: 50%; overflow: hidden; display: flex; align-items: center; justify-content: center; img { width: 40px; height: 40px; } } .imgAni { animation: moveImg 1.5s linear 0.1s; } @keyframes moveImg { 0% { opacity: 1; } 20% { transform: translateY(-40px) translateX(-5px) scale(1); } 40% { transform: translateY(-80px) translateX(0) scale(1); } 60% { transform: translateY(-120px) translateX(0) scale(1); } 80% { transform: translateY(-160px) translateX(5px) scale(1); } 100% { opacity: 0; transform: translateY(-200px) translateX(0) scale(1); } } } } .sendOut { position: absolute; bottom: 0; display: flex; align-items: center; justify-content: space-between; background: rgba(#000, 0.4); width: 96vw; height: 40px; border-radius: 40px; line-height: 40px; font-size: 16px; .sendIpt { width: 70vw; color: white; margin-left: 10px; } .send { color: #fff; height: 30px; width: 70px; text-align: center; line-height: 30px; border-radius: 30px; background: linear-gradient(to right, #ff877d, #fb566d); margin-right: 6px; } .noSendVal { background: #ababa9; } } } } </style>