| 
									
										
										
										
											2025-01-28 15:25:35 +08:00
										 |  |  |  | <template> | 
					
						
							|  |  |  |  |   <div | 
					
						
							|  |  |  |  |     class="video-play video-wrap h100" | 
					
						
							|  |  |  |  |     v-if="isPlay && ![5, 6].includes(detail.status)" | 
					
						
							|  |  |  |  |   > | 
					
						
							|  |  |  |  |     <!-- <svg-icon | 
					
						
							|  |  |  |  |       class="arrow-left" | 
					
						
							|  |  |  |  |       icon-class="arrow-left" | 
					
						
							|  |  |  |  |       @click="onClickLeft" | 
					
						
							|  |  |  |  |     ></svg-icon> --> | 
					
						
							|  |  |  |  |     <div class="h100"> | 
					
						
							|  |  |  |  |       <div class="videoRef"></div> | 
					
						
							|  |  |  |  |     </div> | 
					
						
							|  |  |  |  |     <div class="footer"> | 
					
						
							|  |  |  |  |       <div class="flex intro"> | 
					
						
							|  |  |  |  |         <div class="left-content"> | 
					
						
							|  |  |  |  |           <CarItem | 
					
						
							|  |  |  |  |             v-if="detail.cartList && detail.cartList.length" | 
					
						
							|  |  |  |  |             :item="detail.cartList[0]" | 
					
						
							|  |  |  |  |           ></CarItem> | 
					
						
							|  |  |  |  |           <div class="live-stream" v-if="detail.upcomingLive"> | 
					
						
							|  |  |  |  |             <div class="title"> | 
					
						
							|  |  |  |  |               <h3>{{ detail.upcomingLive.title }}</h3> | 
					
						
							|  |  |  |  |               <p>{{ detail.upcomingLive.startTime }}直播</p> | 
					
						
							|  |  |  |  |             </div> | 
					
						
							|  |  |  |  |             <button | 
					
						
							|  |  |  |  |               @click="setSubLiveVideo" | 
					
						
							|  |  |  |  |               :disabled="disableSub || detail.upcomingLive.isSubscribe !== 2" | 
					
						
							|  |  |  |  |             > | 
					
						
							|  |  |  |  |               {{ detail.upcomingLive.isSubscribe === 1 ? "已预约" : "预约" }} | 
					
						
							|  |  |  |  |             </button> | 
					
						
							|  |  |  |  |           </div> | 
					
						
							|  |  |  |  |           <p class="text"> | 
					
						
							|  |  |  |  |             {{ detail.viewPoint }} | 
					
						
							|  |  |  |  |           </p> | 
					
						
							|  |  |  |  |         </div> | 
					
						
							|  |  |  |  |         <ul> | 
					
						
							|  |  |  |  |           <li class="photo"> | 
					
						
							|  |  |  |  |             <img class="avatar" :src="detail.advisor?.avatar" /> | 
					
						
							|  |  |  |  |             <img | 
					
						
							|  |  |  |  |               src="@/assets/images/chat/living.gif" | 
					
						
							|  |  |  |  |               class="svg-icon" | 
					
						
							|  |  |  |  |               alt="" | 
					
						
							|  |  |  |  |               srcset="" | 
					
						
							|  |  |  |  |               v-if="detail.isLiving === 1" | 
					
						
							|  |  |  |  |             /> | 
					
						
							|  |  |  |  |           </li> | 
					
						
							|  |  |  |  |           <li @click="showChat"> | 
					
						
							|  |  |  |  |             <svg-icon icon-class="chat"></svg-icon> | 
					
						
							|  |  |  |  |             <p>{{ detail.commentCount ? detail.commentCount : "评论" }}</p> | 
					
						
							|  |  |  |  |           </li> | 
					
						
							|  |  |  |  |           <li @click="setVideoFavor"> | 
					
						
							|  |  |  |  |             <svg-icon | 
					
						
							|  |  |  |  |               :icon-class="isFavor === 1 ? 'live-active' : 'live'" | 
					
						
							|  |  |  |  |             ></svg-icon> | 
					
						
							|  |  |  |  |             <p>{{ favorNum ? favorNum : "点赞" }}</p> | 
					
						
							|  |  |  |  |           </li> | 
					
						
							|  |  |  |  |           <li @click="toShare"> | 
					
						
							|  |  |  |  |             <svg-icon icon-class="share1"></svg-icon> | 
					
						
							|  |  |  |  |             <p>转发</p> | 
					
						
							|  |  |  |  |           </li> | 
					
						
							|  |  |  |  |           <li | 
					
						
							|  |  |  |  |             @click="showCarList" | 
					
						
							|  |  |  |  |             v-if="detail.cartList && detail.cartList.length > 1" | 
					
						
							|  |  |  |  |             class="car" | 
					
						
							|  |  |  |  |           > | 
					
						
							|  |  |  |  |             <svg-icon icon-class="car"></svg-icon> | 
					
						
							|  |  |  |  |             <span>{{ detail.cartList.length }}</span> | 
					
						
							|  |  |  |  |           </li> | 
					
						
							|  |  |  |  |         </ul> | 
					
						
							|  |  |  |  |       </div> | 
					
						
							|  |  |  |  |       <div | 
					
						
							|  |  |  |  |         class="flex compilations" | 
					
						
							|  |  |  |  |         @click="showSerialList" | 
					
						
							|  |  |  |  |         v-if="detail.serial" | 
					
						
							|  |  |  |  |       > | 
					
						
							|  |  |  |  |         <svg-icon class="hj" icon-class="hj"></svg-icon> | 
					
						
							|  |  |  |  |         <p>合集- {{ detail.serial?.name }}</p> | 
					
						
							|  |  |  |  |         <svg-icon class="arrow-right" icon-class="arrow-right"></svg-icon> | 
					
						
							|  |  |  |  |       </div> | 
					
						
							|  |  |  |  |     </div> | 
					
						
							|  |  |  |  |   </div> | 
					
						
							|  |  |  |  |   <NoLookTip v-if="[5, 6].includes(detail.status)" text="该视频已下架" /> | 
					
						
							|  |  |  |  |   <NoLookTip v-else-if="noAuth" text="暂无服务权限,请联系小助理开通" /> | 
					
						
							|  |  |  |  |   <Share ref="shareRef" :detail="detail" /> | 
					
						
							|  |  |  |  |   <van-overlay :show="showGuide" @click="showGuide = false"> | 
					
						
							|  |  |  |  |     <img src="@/assets/images/guide1.png" /> | 
					
						
							|  |  |  |  |     <p>点击右上角进行分享,点击屏幕关闭分享指引</p> | 
					
						
							|  |  |  |  |   </van-overlay> | 
					
						
							|  |  |  |  |   <SerialList | 
					
						
							|  |  |  |  |     ref="serialListRef" | 
					
						
							|  |  |  |  |     :id="detail.serial?.id" | 
					
						
							|  |  |  |  |     :title="detail.serial?.name" | 
					
						
							|  |  |  |  |     :remark="detail.serial?.remark" | 
					
						
							|  |  |  |  |   /> | 
					
						
							|  |  |  |  |   <ChatFrame | 
					
						
							|  |  |  |  |     ref="chatFrameRef" | 
					
						
							|  |  |  |  |     :detail="detail" | 
					
						
							|  |  |  |  |     :commentCount="detail.commentCount" | 
					
						
							|  |  |  |  |   /> | 
					
						
							|  |  |  |  |   <CarList | 
					
						
							|  |  |  |  |     v-if="detail.cartList && detail.cartList.length > 1" | 
					
						
							|  |  |  |  |     ref="cartListRef" | 
					
						
							|  |  |  |  |     :list="detail.cartList || []" | 
					
						
							|  |  |  |  |   /> | 
					
						
							|  |  |  |  |   <van-dialog | 
					
						
							|  |  |  |  |     v-model:show="showCodeDialog" | 
					
						
							|  |  |  |  |     title="观看权限提示" | 
					
						
							|  |  |  |  |     show-cancel-button | 
					
						
							|  |  |  |  |     @confirm="getLiveLimit" | 
					
						
							|  |  |  |  |     @cancel="toBack" | 
					
						
							|  |  |  |  |   > | 
					
						
							|  |  |  |  |     <div class="code-content"> | 
					
						
							|  |  |  |  |       <p class="tip-text">当前短视频需输入邀请码才可观看</p> | 
					
						
							|  |  |  |  |       <van-field v-model.trim="code" placeholder="请输入邀请码" /> | 
					
						
							|  |  |  |  |     </div> | 
					
						
							|  |  |  |  |   </van-dialog> | 
					
						
							|  |  |  |  | </template> | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | <script setup> | 
					
						
							|  |  |  |  | import { ref, computed, watch, nextTick } from "vue"; | 
					
						
							|  |  |  |  | import { useRouter, useRoute } from "vue-router"; | 
					
						
							|  |  |  |  | import { showToast, showDialog } from "vant"; | 
					
						
							|  |  |  |  | import { | 
					
						
							|  |  |  |  |   queryVideoDetail, | 
					
						
							|  |  |  |  |   videoFavor, | 
					
						
							|  |  |  |  |   queryLimitCheck, | 
					
						
							|  |  |  |  |   videoRecord, | 
					
						
							|  |  |  |  |   shareSave, | 
					
						
							|  |  |  |  | } from "@/api/shortVideo"; | 
					
						
							|  |  |  |  | import { subLiveVideo } from "@/api/video"; | 
					
						
							|  |  |  |  | import useShortVideoPlay from "@/hooks/useShortVideoPlay"; | 
					
						
							|  |  |  |  | import Share from "@/components/Share"; | 
					
						
							|  |  |  |  | import SerialList from "./components/SerialList"; | 
					
						
							|  |  |  |  | import ChatFrame from "./components/ChatFrame"; | 
					
						
							|  |  |  |  | import CarList from "./components/CarList"; | 
					
						
							|  |  |  |  | import CarItem from "./components/CarItem"; | 
					
						
							|  |  |  |  | import { useStore } from "vuex"; | 
					
						
							|  |  |  |  | import NoLookTip from "@/components/NoLookTip.vue"; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const router = useRouter(); | 
					
						
							|  |  |  |  | const route = useRoute(); | 
					
						
							|  |  |  |  | const store = useStore(); | 
					
						
							|  |  |  |  | // const onClickLeft = () => {
 | 
					
						
							|  |  |  |  | //   router.back();
 | 
					
						
							|  |  |  |  | // };
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const serialListRef = ref(); | 
					
						
							|  |  |  |  | const showSerialList = () => { | 
					
						
							|  |  |  |  |   serialListRef.value.show = true; | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const detail = ref({}); | 
					
						
							|  |  |  |  | const favorNum = ref(0); | 
					
						
							|  |  |  |  | const isFavor = ref(2); | 
					
						
							|  |  |  |  | const isPlay = ref(false); // 当直播限制需要验证码登录的时候,验证码校验通过才能播放
 | 
					
						
							|  |  |  |  | const noAuth = ref(false); | 
					
						
							|  |  |  |  | const { playVideo } = useShortVideoPlay(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 之前是否已经进行邀请码校验且通过校验
 | 
					
						
							|  |  |  |  | const codeVerify = localStorage.getItem( | 
					
						
							|  |  |  |  |   `${store.state.userInfo.account}-shotVideoPlay-${route.query.id}-code` | 
					
						
							|  |  |  |  | ); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const showCodeDialog = computed(() => { | 
					
						
							|  |  |  |  |   if (detail.value.limitType === 3 && !isPlay.value && !codeVerify) { | 
					
						
							|  |  |  |  |     // 邀请码
 | 
					
						
							|  |  |  |  |     return true; | 
					
						
							|  |  |  |  |   } else { | 
					
						
							|  |  |  |  |     return false; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | watch( | 
					
						
							|  |  |  |  |   () => isPlay.value, | 
					
						
							|  |  |  |  |   () => { | 
					
						
							|  |  |  |  |     if (detail.value.status !== 5) { | 
					
						
							|  |  |  |  |       nextTick(() => { | 
					
						
							|  |  |  |  |         playVideo({ | 
					
						
							|  |  |  |  |           detail: detail.value, | 
					
						
							|  |  |  |  |           videoEl: document.querySelector(".videoRef"), | 
					
						
							|  |  |  |  |         }); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | ); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const getVideoDetail = async () => { | 
					
						
							|  |  |  |  |   let ret = await queryVideoDetail({ | 
					
						
							|  |  |  |  |     id: route.query.id, | 
					
						
							|  |  |  |  |     saleUserId: route.query.saleUserId, | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  |   if (ret.code === 0) { | 
					
						
							|  |  |  |  |     document.title = ret.data.title; | 
					
						
							|  |  |  |  |     detail.value = ret.data; | 
					
						
							|  |  |  |  |     favorNum.value = detail.value.favorCount; | 
					
						
							|  |  |  |  |     isFavor.value = detail.value.isFavor; | 
					
						
							|  |  |  |  |     // limitType	直播限制 1不限制 2手机号 3邀请码 4微信授权 5产品专属直播 6 权限号
 | 
					
						
							|  |  |  |  |     if ( | 
					
						
							|  |  |  |  |       [1].includes(ret.data.limitType) || | 
					
						
							|  |  |  |  |       (ret.data.limitType === 3 && codeVerify) || | 
					
						
							|  |  |  |  |       (ret.data.limitType === 2 && store.state.token) | 
					
						
							|  |  |  |  |     ) { | 
					
						
							|  |  |  |  |       isPlay.value = true; | 
					
						
							|  |  |  |  |     } else if (ret.data.limitType === 6) { | 
					
						
							|  |  |  |  |       const authResultVo = ret.data.authResultVo || {}; | 
					
						
							|  |  |  |  |       isPlay.value = !!authResultVo.auth; | 
					
						
							|  |  |  |  |       noAuth.value = !authResultVo.auth; | 
					
						
							|  |  |  |  |       if (authResultVo.auth) { | 
					
						
							|  |  |  |  |         if (authResultVo.riskUrl) { | 
					
						
							|  |  |  |  |           showDialog({ | 
					
						
							|  |  |  |  |             title: "提示", | 
					
						
							|  |  |  |  |             message: `您当前订单尚未完成风险测评,无法查看产品服务内容,请点击完成风险测评`, | 
					
						
							|  |  |  |  |             confirmButtonText: "去测评", | 
					
						
							|  |  |  |  |           }) | 
					
						
							|  |  |  |  |             .then(() => { | 
					
						
							|  |  |  |  |               location.href = | 
					
						
							|  |  |  |  |                 authResultVo.riskUrl + | 
					
						
							|  |  |  |  |                 `&callbackUrl=${encodeURIComponent(location.href)}`; | 
					
						
							|  |  |  |  |             }) | 
					
						
							|  |  |  |  |             .catch(() => { | 
					
						
							|  |  |  |  |               router.go(-1); | 
					
						
							|  |  |  |  |             }); | 
					
						
							|  |  |  |  |         } else if (authResultVo.contractUrl) { | 
					
						
							|  |  |  |  |           showDialog({ | 
					
						
							|  |  |  |  |             title: "提示", | 
					
						
							|  |  |  |  |             message: `您当前订单尚未完成合同签署,无法查看产品服务内容,请点击完成合同签署`, | 
					
						
							|  |  |  |  |             confirmButtonText: "去签署", | 
					
						
							|  |  |  |  |           }) | 
					
						
							|  |  |  |  |             .then(() => { | 
					
						
							|  |  |  |  |               location.href = | 
					
						
							|  |  |  |  |                 authResultVo.contractUrl + | 
					
						
							|  |  |  |  |                 `&contractCallbackUrl=${encodeURIComponent(location.href)}`; | 
					
						
							|  |  |  |  |             }) | 
					
						
							|  |  |  |  |             .catch(() => { | 
					
						
							|  |  |  |  |               router.go(-1); | 
					
						
							|  |  |  |  |             }); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | getVideoDetail(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const code = ref(""); | 
					
						
							|  |  |  |  | const getLiveLimit = async () => { | 
					
						
							|  |  |  |  |   let ret = await queryLimitCheck({ | 
					
						
							|  |  |  |  |     videoId: route.query.id, | 
					
						
							|  |  |  |  |     code: code.value, | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  |   if (ret.code === 0) { | 
					
						
							|  |  |  |  |     if (ret.data.result) { | 
					
						
							|  |  |  |  |       // 检验通过
 | 
					
						
							|  |  |  |  |       localStorage.setItem( | 
					
						
							|  |  |  |  |         `${store.state.userInfo.account}-shotVideoPlay-${route.query.id}-code`, | 
					
						
							|  |  |  |  |         true | 
					
						
							|  |  |  |  |       ); | 
					
						
							|  |  |  |  |       isPlay.value = true; | 
					
						
							|  |  |  |  |     } else { | 
					
						
							|  |  |  |  |       showToast("邀请码输入错误!"); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const setVideoFavor = async () => { | 
					
						
							|  |  |  |  |   // 点赞
 | 
					
						
							|  |  |  |  |   let ret = await videoFavor({ | 
					
						
							|  |  |  |  |     option: isFavor.value === 1 ? 2 : 1, | 
					
						
							|  |  |  |  |     videoId: route.query.id, | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  |   if (ret.code === 0) { | 
					
						
							|  |  |  |  |     favorNum.value = ret.data.count; | 
					
						
							|  |  |  |  |     isFavor.value = isFavor.value === 1 ? 2 : 1; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const shareRef = ref(); | 
					
						
							|  |  |  |  | const showGuide = ref(false); | 
					
						
							|  |  |  |  | const toShare = () => { | 
					
						
							|  |  |  |  |   shareSave({ id: route.query.id }); | 
					
						
							|  |  |  |  |   if ( | 
					
						
							|  |  |  |  |     typeof WeixinJSBridge === "object" && | 
					
						
							|  |  |  |  |     typeof window.WeixinJSBridge.invoke === "function" | 
					
						
							|  |  |  |  |   ) { | 
					
						
							|  |  |  |  |     showGuide.value = true; | 
					
						
							|  |  |  |  |   } else { | 
					
						
							|  |  |  |  |     shareRef.value.showPopup = true; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const cartListRef = ref(); | 
					
						
							|  |  |  |  | const showCarList = () => { | 
					
						
							|  |  |  |  |   cartListRef.value.show = true; | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const chatFrameRef = ref(); | 
					
						
							|  |  |  |  | const showChat = () => { | 
					
						
							|  |  |  |  |   chatFrameRef.value.show = true; | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const setVideoRecord = () => { | 
					
						
							|  |  |  |  |   videoRecord({ | 
					
						
							|  |  |  |  |     list: [ | 
					
						
							|  |  |  |  |       { | 
					
						
							|  |  |  |  |         videoId: route.query.id, | 
					
						
							|  |  |  |  |       }, | 
					
						
							|  |  |  |  |     ], | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | setVideoRecord(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const disableSub = ref(false); | 
					
						
							|  |  |  |  | const setSubLiveVideo = async () => { | 
					
						
							|  |  |  |  |   if (disableSub.value) return; | 
					
						
							|  |  |  |  |   disableSub.value = true; | 
					
						
							|  |  |  |  |   let ret = await subLiveVideo({ | 
					
						
							|  |  |  |  |     id: detail.value.upcomingLive.videoId, | 
					
						
							|  |  |  |  |     option: detail.value.upcomingLive.isSubscribe === 1 ? 2 : 1, | 
					
						
							|  |  |  |  |     saleUserId: route.query.saleUserId, | 
					
						
							|  |  |  |  |   }).catch(() => { | 
					
						
							|  |  |  |  |     disableSub.value = false; | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  |   disableSub.value = false; | 
					
						
							|  |  |  |  |   if (ret.code === 0) { | 
					
						
							|  |  |  |  |     showToast( | 
					
						
							|  |  |  |  |       detail.value.upcomingLive.isSubscribe === 1 ? "已取消预约" : "预约成功!" | 
					
						
							|  |  |  |  |     ); | 
					
						
							|  |  |  |  |     detail.value.upcomingLive.isSubscribe = | 
					
						
							|  |  |  |  |       detail.value.upcomingLive.isSubscribe === 1 ? 2 : 1; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | const toBack = () => { | 
					
						
							|  |  |  |  |   if (route.query.sdk) { | 
					
						
							| 
									
										
										
										
											2025-02-11 21:47:01 +08:00
										 |  |  |  |     console.log("sdk返回"); | 
					
						
							| 
									
										
										
										
											2025-01-28 15:25:35 +08:00
										 |  |  |  |   } else { | 
					
						
							|  |  |  |  |     router.go(-1); | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | }; | 
					
						
							|  |  |  |  | </script> | 
					
						
							|  |  |  |  | <style scoped lang="scss"> | 
					
						
							|  |  |  |  | .h100 { | 
					
						
							|  |  |  |  |   height: 100%; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | .video-play { | 
					
						
							|  |  |  |  |   position: relative; | 
					
						
							|  |  |  |  |   padding-top: var(--statusbar-height); | 
					
						
							|  |  |  |  |   box-sizing: border-box; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | .arrow-left { | 
					
						
							|  |  |  |  |   position: absolute; | 
					
						
							|  |  |  |  |   left: 32px; | 
					
						
							|  |  |  |  |   top: 32px; | 
					
						
							|  |  |  |  |   color: #fff; | 
					
						
							|  |  |  |  |   font-size: 40px; | 
					
						
							|  |  |  |  |   z-index: 10; | 
					
						
							|  |  |  |  |   margin-top: var(--statusbar-height); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | .video-wrap { | 
					
						
							|  |  |  |  |   background: rgba(0, 0, 0, 0.4); | 
					
						
							|  |  |  |  |   video { | 
					
						
							|  |  |  |  |     display: block; | 
					
						
							|  |  |  |  |     height: 100%; | 
					
						
							|  |  |  |  |     width: 100%; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | .footer { | 
					
						
							|  |  |  |  |   position: absolute; | 
					
						
							|  |  |  |  |   left: 32px; | 
					
						
							|  |  |  |  |   right: 32px; | 
					
						
							|  |  |  |  |   bottom: 100px; | 
					
						
							|  |  |  |  |   .flex { | 
					
						
							|  |  |  |  |     display: flex; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   .live-stream { | 
					
						
							|  |  |  |  |     display: flex; | 
					
						
							|  |  |  |  |     align-items: center; | 
					
						
							|  |  |  |  |     justify-content: space-between; | 
					
						
							|  |  |  |  |     background: url(../../assets/images/short-subscribe-bg.png) no-repeat center; | 
					
						
							|  |  |  |  |     background-size: cover; | 
					
						
							|  |  |  |  |     border-radius: 8px; | 
					
						
							|  |  |  |  |     margin-bottom: 16px; | 
					
						
							|  |  |  |  |     color: #fff; | 
					
						
							|  |  |  |  |     padding: 24px; | 
					
						
							|  |  |  |  |     width: 460px; | 
					
						
							|  |  |  |  |     .title { | 
					
						
							|  |  |  |  |       flex: 1; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     h3 { | 
					
						
							|  |  |  |  |       font-size: 32px; | 
					
						
							|  |  |  |  |       text-align: left; | 
					
						
							|  |  |  |  |       display: -webkit-box; | 
					
						
							|  |  |  |  |       -webkit-box-orient: vertical; | 
					
						
							|  |  |  |  |       overflow: hidden; | 
					
						
							|  |  |  |  |       -webkit-line-clamp: 1; | 
					
						
							|  |  |  |  |       margin-bottom: 20px; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     p { | 
					
						
							|  |  |  |  |       font-size: 24px; | 
					
						
							|  |  |  |  |       text-align: left; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     button { | 
					
						
							|  |  |  |  |       background: #fff; | 
					
						
							|  |  |  |  |       height: 56px; | 
					
						
							|  |  |  |  |       font-size: 24px; | 
					
						
							|  |  |  |  |       color: #000; | 
					
						
							|  |  |  |  |       width: 100px; | 
					
						
							|  |  |  |  |       border-radius: 28px; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   .compilations { | 
					
						
							|  |  |  |  |     justify-content: space-between; | 
					
						
							|  |  |  |  |     align-items: center; | 
					
						
							|  |  |  |  |     background: rgba(0, 0, 0, 0.5); | 
					
						
							|  |  |  |  |     border-radius: 8px; | 
					
						
							|  |  |  |  |     margin-bottom: 16px; | 
					
						
							|  |  |  |  |     color: #fff; | 
					
						
							|  |  |  |  |     padding: 18px 8px 18px 20px; | 
					
						
							|  |  |  |  |     p { | 
					
						
							|  |  |  |  |       font-weight: 400; | 
					
						
							|  |  |  |  |       font-size: 28px; | 
					
						
							|  |  |  |  |       color: #ffffff; | 
					
						
							|  |  |  |  |       line-height: 28px; | 
					
						
							|  |  |  |  |       flex: 1; | 
					
						
							|  |  |  |  |       text-align: left; | 
					
						
							|  |  |  |  |       margin: 0 16px; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     .hj, | 
					
						
							|  |  |  |  |     .arrow { | 
					
						
							|  |  |  |  |       font-size: 32px; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   .intro { | 
					
						
							|  |  |  |  |     align-items: flex-end; | 
					
						
							|  |  |  |  |     margin-bottom: 24px; | 
					
						
							|  |  |  |  |     justify-content: space-between; | 
					
						
							|  |  |  |  |     .left-content { | 
					
						
							|  |  |  |  |       flex: 1; | 
					
						
							|  |  |  |  |       padding-right: 20px; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     .text { | 
					
						
							|  |  |  |  |       font-weight: 400; | 
					
						
							|  |  |  |  |       font-size: 32px; | 
					
						
							|  |  |  |  |       color: #ffffff; | 
					
						
							|  |  |  |  |       line-height: 44px; | 
					
						
							|  |  |  |  |       display: -webkit-box; | 
					
						
							|  |  |  |  |       -webkit-box-orient: vertical; | 
					
						
							|  |  |  |  |       overflow: hidden; | 
					
						
							|  |  |  |  |       -webkit-line-clamp: 2; | 
					
						
							|  |  |  |  |       margin: 0 10px; | 
					
						
							|  |  |  |  |       text-align: left; | 
					
						
							|  |  |  |  |       margin-right: 80px; | 
					
						
							|  |  |  |  |       flex: 1; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     li { | 
					
						
							|  |  |  |  |       margin-top: 30px; | 
					
						
							|  |  |  |  |       .svg-icon { | 
					
						
							|  |  |  |  |         font-size: 72px; | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |       p { | 
					
						
							|  |  |  |  |         font-weight: 400; | 
					
						
							|  |  |  |  |         font-size: 24px; | 
					
						
							|  |  |  |  |         color: #ffffff; | 
					
						
							|  |  |  |  |         text-align: center; | 
					
						
							|  |  |  |  |         line-height: 24px; | 
					
						
							|  |  |  |  |         padding-top: 10px; | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | .videoRef { | 
					
						
							|  |  |  |  |   width: 100%; | 
					
						
							|  |  |  |  |   height: 100%; | 
					
						
							|  |  |  |  |   ::v-deep(.video-js) { | 
					
						
							|  |  |  |  |     width: 100%; | 
					
						
							|  |  |  |  |     height: 100%; | 
					
						
							|  |  |  |  |     font-size: 18px; | 
					
						
							|  |  |  |  |     .vjs-tech { | 
					
						
							|  |  |  |  |       position: relative; | 
					
						
							|  |  |  |  |       display: block; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     .vjs-control-bar { | 
					
						
							|  |  |  |  |       margin-bottom: 40px; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | .arrow-right { | 
					
						
							|  |  |  |  |   font-size: 28px; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | .photo { | 
					
						
							|  |  |  |  |   position: relative; | 
					
						
							|  |  |  |  |   margin-bottom: 60px; | 
					
						
							|  |  |  |  |   .avatar { | 
					
						
							|  |  |  |  |     width: 80px; | 
					
						
							|  |  |  |  |     height: 80px; | 
					
						
							|  |  |  |  |     border-radius: 50%; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  |   .svg-icon { | 
					
						
							|  |  |  |  |     width: 30px; | 
					
						
							|  |  |  |  |     position: absolute; | 
					
						
							|  |  |  |  |     font-size: 28px !important; | 
					
						
							|  |  |  |  |     bottom: 0; | 
					
						
							|  |  |  |  |     right: 0; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | .car { | 
					
						
							|  |  |  |  |   position: relative; | 
					
						
							|  |  |  |  |   span { | 
					
						
							|  |  |  |  |     position: absolute; | 
					
						
							|  |  |  |  |     top: 0; | 
					
						
							|  |  |  |  |     right: 20px; | 
					
						
							|  |  |  |  |     min-width: 20px; | 
					
						
							|  |  |  |  |     transform: translateX(18px) translateY(-50%); | 
					
						
							|  |  |  |  |     display: flex; | 
					
						
							|  |  |  |  |     align-items: center; | 
					
						
							|  |  |  |  |     justify-content: center; | 
					
						
							|  |  |  |  |     padding: 4px; | 
					
						
							|  |  |  |  |     flex-direction: column; | 
					
						
							|  |  |  |  |     border-radius: 13px 13px 13px 4px; | 
					
						
							|  |  |  |  |     background: linear-gradient( | 
					
						
							|  |  |  |  |       128deg, | 
					
						
							|  |  |  |  |       #fff2dc -25.5%, | 
					
						
							|  |  |  |  |       #ffd9a7 89.14%, | 
					
						
							|  |  |  |  |       #605a52 89.14% | 
					
						
							|  |  |  |  |     ); | 
					
						
							|  |  |  |  |     color: rgb(142, 81, 5); | 
					
						
							|  |  |  |  |     font-size: 18px; | 
					
						
							|  |  |  |  |     font-style: normal; | 
					
						
							|  |  |  |  |     font-weight: 500; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | .container-mask { | 
					
						
							|  |  |  |  |   img { | 
					
						
							|  |  |  |  |     width: 182px; | 
					
						
							|  |  |  |  |     height: 182px; | 
					
						
							|  |  |  |  |     margin: 359px auto 55.8px; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   p { | 
					
						
							|  |  |  |  |     color: rgb(51, 51, 51); | 
					
						
							|  |  |  |  |     font-family: "PingFang SC"; | 
					
						
							|  |  |  |  |     font-size: 35px; | 
					
						
							|  |  |  |  |     font-style: normal; | 
					
						
							|  |  |  |  |     font-weight: 400; | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | </style> |