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.

661 lines
16 KiB

<template>
<view class="cotainer">
<!-- 全屏播放 -->
<view class="playvideo" v-if="playvideo" @click="playvideo=false,isfull=false">
<view class="playvideowrap">
<video ref="videos" id="videos" :autoplay="true" @play="playFullScreen"
:src="info.video?info.video.url:''" play-btn-position="center"></video>
<view class="closevideo" @click="playvideo=false,isfull=false">X</view>
</view>
</view>
<view class="playvideo" v-if="playimg" @click="playimg=false">
<view class="playvideowrap">
<view v-if="imgInfo.length>0 && !showVorImage" class="imgwrap">
<movable-area scale-area class="movable-area" style="height: 380rpx;width:100%">
<movable-view style="height: 380rpx;width:100%" class="movable-view" direction="all" scale="true" scale-min="1" scale-max="4"
:scale-value="1">
<u-swiper :height='380' bgColor="transparent" :border-radius="0" :list="imgInfo" :autoplay="false"></u-swiper>
</movable-view>
</movable-area>
<view class="closevideo" @click="playimg=false">X</view>
</view>
</view>
</view>
<!-- 跳转二维码 -->
<view class="playvideo" v-if="showQrCode">
<view class="playvideowrap">
<view class="qrcode">
<image :show-menu-by-longpress="true" :src="qrCode" mode=""></image>
<view>长按保存二维码</view>
<view class="closevideo" @click="showQrCode=false">X</view>
</view>
</view>
</view>
<view class="navBarBox">
<image class="navBarBox-top" :src="require('@/static/home-top.png')" mode=""></image>
<!-- 状态栏占位 -->
<view class="statusBar" :style="{paddingTop: navBarTop+'px'}"></view>
<!-- 真正的导航栏内容 -->
<view class="navBar">
<!-- 轮播切换 -->
<view style="display: flex;" class="video-content">
<view class="video-content-left">
<view v-if="info.video&&showVorImage" class="videowrap" @click="playvideo=true,isfull=true">
<view class="videowrap-mask"></view>
<view class="videowrap-play"></view>
<image :src="info.video_image.url"></image>
</view>
<view v-if="imgInfo.length>0 && !showVorImage" class="imgwrap">
<u-swiper @click="playimg=true" :height="340" bgColor="transparent" :border-radius="0"
:list="imgInfo" :autoplay="false"></u-swiper>
</view>
<view class="video-content-left-change" v-if="info.video && imgInfo.length>0">
<view @click="showVorImage=true">
<image :src="require('@/packages/static/detail-camera.png')"></image>1
</view>
<view @click="showVorImage=false">
<image :src="require('@/packages/static/detail-photo.png')"></image>
{{imgInfo.length}}
</view>
</view>
</view>
</view>
</view>
</view>
<view class="detail">
<view class="detail-info">
<view class="detail-info-title">{{info.name}}</view>
<view class="detail-info-map">
<view>
<u-icon name="map" size="32"></u-icon>
<view>
<span>详细地址:</span>
<span>{{info.address?info.address:'-'}}</span>
</view>
</view>
<view>
<u-icon name="clock" size="32"></u-icon>
<view>
<span>开放时间:</span>
<span>{{info.time?info.time:'-'}}</span>
</view>
</view>
</view>
<view class="detail-info-go">
<view class="detail-info-go-left" @click="toMap">
<image :src="require('@/packages/static/detail-go.png')" mode=""></image>
<text>开始前往</text>
</view>
<view class="detail-info-go-right" @click="toWx(info)" v-if="info.iswx===1">
<image :src="require('@/packages/static/detail-book.png')" mode=""></image>
<text>去预约</text>
</view>
</view>
</view>
<!-- vr -->
<view class="detail-vr" v-if="vrInfo.length>0">
<view class="detail-vr-title">
<image :src="require('@/packages/static/detail-vr.png')" mode=""></image>
</view>
<view class="detail-vr-swiper" v-if="vrInfo.length==1" style="margin-left: -25rpx;">
<view @click="toVr(vrInfo[0].url)" class="detail-vr-swiper-item" style="width:490rpx;margin: 0 auto;position: relative;margin-top:20rpx">
<view class="detail-vr-swiper-item-img">
<image :src="vrInfo[0].image.url" mode=""></image>
</view>
<view class="detail-vr-swiper-item-title">
<image :src="require('@/packages/static/detail-icon.png')" mode=""></image>
<text>{{vrInfo[0].name}}</text>
</view>
</view>
</view>
<swiper v-else class="detail-vr-swiper" :current="currentIndex" next-margin="140rpx" @change="swierChange"
circular :autoplay="false">
<swiper-item v-for="(item,index) in vrInfo" :key="index">
<view @click="toVr(item.url)" class="detail-vr-swiper-item"
:class="currentIndex===index?'detail-vr-swiper-active':''">
<view class="detail-vr-swiper-item-img">
<image :src="item.image.url" mode=""></image>
</view>
<view class="detail-vr-swiper-item-title">
<image :src="require('@/packages/static/detail-icon.png')" mode=""></image>
<text>{{item.name}}</text>
</view>
</view>
</swiper-item>
</swiper>
</view>
<view class="detail-content">
<image class="detail-content-top" src="../static/detail-top.png" mode=""></image>
<image class="detail-content-bottom" src="../static/detail-bottom.png" mode=""></image>
<view class="detail-content-title">
场馆基础信息
</view>
<view class="detail-content-content">
<rich-text v-if='showContent' :nodes="info.content?info.content:' '"></rich-text>
</view>
</view>
<view class="detail-btn" @click="toQus(info.id)">
<image src="../static/detail-btn.png" mode=""></image>
</view>
</view>
<tabbar :currentPage="4"></tabbar>
</view>
</template>
<script>
import tabbar from '@/components/tabbar/tabbar.vue'
import {
toMapAPP,
shareInfo
} from "@/common/util.js"
export default {
components: {
tabbar,
},
data() {
return {
navBarTop: 0,
currentIndex: 0,
info: {},
vrInfo: [],
imgInfo: [],
showContent: false,
showVorImage: true,
isfull: false,
playvideo: false,
playimg: false,
qrCode:'',
showQrCode:false,
}
},
onShareAppMessage() {
return shareInfo
},
onShareTimeline(){
return shareInfo
},
onReady() {
},
onLoad(option) {
const MenuButton = uni.getMenuButtonBoundingClientRect()
this.navBarTop = MenuButton.top //左侧文字与右侧胶囊对齐
this.getDetail(option.id)
},
methods: {
playFullScreen() {
let videoContext = uni.createVideoContext('videos', this)
videoContext.requestFullScreen()
},
async getDetail(id) {
const res = await this.$u.api.pointDetail({
id: id
})
if(res.points.config && res.points.config.length>0){
res.points.config.map(item=>{
if(item.key==='address'){
res.points.address = item.value
}
if(item.key==='time'){
res.points.time = item.value
}
})
}
this.info = res.points
this.showVorImage = this.info.video?true:false
this.vrInfo = res.points.point_content.length > 0 ? res.points.point_content : []
if (res.points.point_image.length > 0) {
res.points.point_image.map(item => {
this.imgInfo.push(item.image.url)
})
}
// this.imgInfo = res.points.point_image.length > 0 ? res.points.point_image : []
this.showContent = true
},
swierChange(e) {
this.currentIndex = e.detail.current
},
toWx(info) {
if (!info.iswx) {
return
}
let path = info.path ? info.path : ''
// 跳转到其他小程序
if(info.appid){
uni.navigateToMiniProgram({
appId: info.appid, // 目标小程序的 AppID
path: path, // 目标小程序的页面路径
extraData: { // 需要传递的参数
},
success(res) {
// 成功跳转到其他小程序的回调函数
console.log('成功跳转到其他小程序');
},
fail(err) {
// 跳转失败的回调函数
console.log('跳转失败', err);
}
});
}else{
if(!info.qrcode){
return
}
this.qrCode = info.qrcode.url
this.showQrCode = true
// uni.navigateTo({
// url: '/packages/vr/vr?link=' + path
// })
}
},
toVr(link) {
uni.navigateTo({
url: '/packages/vr/vr?link=' + link
})
},
toMap() {
toMapAPP(this.info.lat, this.info.lng, this.info.name)
},
toQus(id){
uni.navigateTo({
url:'/packages/question/question?id='+id
})
},
}
}
</script>
<style lang="scss">
.cotainer {
background: #f3efea;
width: 100vw;
padding-bottom: 135rpx;
height: 100vh;
width: 100vw;
overflow: scroll;
.playvideo {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 11;
background-color: rgba(0, 0, 0, 0.6);
&>.playvideowrap {
width: 95%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
video {
width: 100%
}
::v-deep .u-indicator-item-round.u-indicator-item-round-active {
background-color: #bf3022;
}
.closevideo {
color: #fff;
width: 50rpx;
height: 50rpx;
border: 1px solid #fff;
border-radius: 50rpx;
position: absolute;
text-align: center;
line-height: 50rpx;
/* display: inline-block; */
right: 0rpx;
top: -25rpx // transform: translate(0,-50%);
}
.qrcode{
width: 450rpx;
position: relative;
margin: 0 auto;
>image{
width:400rpx;height:400rpx;margin: 0 auto;display: block;
}
>view{
color:#fff;
text-align: center;
margin:10rpx;
font-size:32rpx;
}
.closevideo{
z-index: 999;
color: #bc9766;
border: 1px solid #bc9766;
top: -35rpx;
right: -9rpx;
}
}
}
}
.navBarBox {
// height: 299rpx;
padding-bottom: 30rpx;
width: 100%;
position: relative;
border-bottom: 10rpx solid #dbd0ba;
&-top {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0
}
.navBar {
display: flex;
position: relative;
align-items: center;
justify-content: space-between;
padding: 0 30rpx;
.video-content {
width: 668rpx;
height: 380rpx;
margin: 0 auto;
// border:1px solid red;
font-size: 0;
&-left {
width: 668rpx;
height: 380rpx;
position: relative;
& .videowrap {
image {
width: 668rpx;
height: 380rpx;
padding-top: 0;
}
&-mask {
width: 668rpx;
height: 380rpx;
background-color: rgba(0, 0, 0, 0.5);
position: absolute;
z-index: 9;
top: 0;
left: 0;
}
&-play {
background: url(../static/detail-videoplay.png) no-repeat top left;
width: 67rpx;
height: 68rpx;
background-size: 100% 100%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 10;
}
}
& .imgwrap {
::v-deep swiper {
width: 668rpx !important;
height: 380rpx !important;
}
}
// ::v-deep .u-swiper-indicator{
// display: none;
// }
::v-deep .u-indicator-item-round.u-indicator-item-round-active {
background-color: #bf3022;
}
&-change {
padding: 10rpx 30rpx;
border-radius: 20rpx;
background-color: rgba(0, 0, 0, 0.3);
display: flex;
position: absolute;
bottom: 20rpx;
left: 20rpx;
z-index: 10;
&>view {
font-size: 24rpx;
color: #fff;
&:first-child {
margin-right: 10rpx;
border-right: 1px solid #fff;
padding-right: 10rpx
}
image {
width: 23rpx;
height: 21rpx;
padding-right: 10rpx
}
}
}
}
}
}
}
.detail {
margin: 30rpx;
margin-top: 40rpx;
&-info {
background-color: #fff;
padding: 45rpx 25rpx;
border-radius: 10rpx;
&-title {
color: #000;
font-size: 32rpx;
font-weight: bold;
margin-bottom: 30rpx;
}
&-map {
color: #73685c;
font-size: 24rpx;
padding-bottom: 10rpx;
>view {
display: flex;
align-items: flex-start;
margin-bottom: 20rpx;
>view{
display: flex;
span:first-child{
min-width: 120rpx;
}
}
}
}
&-go {
display: flex;
align-items: center;
justify-content: space-between;
margin: 0 20rpx;
padding-top: 30rpx;
border-top: 1px solid #ddd;
>view {
color: #bc9766;
font-size: 24rpx;
display: flex;
align-items: center;
}
&-left {
image {
width: 33rpx;
height: 32rpx;
margin-right: 10rpx;
}
}
&-right {
background-color: #bc9766;
padding: 10rpx 30rpx;
border-radius: 30rpx;
color: #fff !important;
image {
width: 27rpx;
height: 33rpx;
margin-right: 10rpx;
}
}
}
}
&-vr {
background-color: #fff;
padding: 45rpx 25rpx;
border-radius: 10rpx;
margin-top: 30rpx;
padding-right: 0;
padding-bottom: 25rpx;
&-title {
image {
width: 122rpx;
height: 30rpx;
}
}
&-swiper {
// display: flex;
// overflow: auto;
min-height: 530rpx;
position: relative;
&-item {
padding: 25rpx;
margin: 20rpx;
background-color: #fef8e9;
// border-radius: 20rpx;
// margin-bottom:0;
position: absolute;
// height: 200rpx;
// width: 570rpx;
border-radius: 20rpx;
z-index: 5;
top: 0;
// transform: rotateY(40deg) scale(.9);
// transform: ;
&-img {
font-size: 0;
image {
width: 440rpx;
height: 350rpx;
}
}
&-title {
display: flex;
align-items: center;
justify-content: center;
height: 80rpx;
margin-top: 15rpx;
margin-bottom: 0;
image {
width: 43rpx;
height: 43rpx;
margin-right: 10rpx
}
text {
max-width: 350rpx;
}
}
}
&-active {
z-index: 10;
top: 0;
transition: all 0.2s ease-in 0s;
// transform: rotateY(0deg) scale(1);
}
}
}
&-content {
background-color: #fff;
padding: 45rpx 25rpx;
padding-bottom: 50rpx;
border-radius: 10rpx;
margin-top: 30rpx;
position: relative;
&-top {
width: 208rpx;
height: 102rpx;
position: absolute;
left: 0;
top: 34rpx;
}
&-bottom {
width: 226rpx;
height: 46rpx;
position: absolute;
bottom: 0;
right: 0;
}
&-title {
color: #000;
font-size: 32rpx;
font-weight: bold;
margin-bottom: 30rpx;
position: relative;
}
&-content {
margin-top: 40rpx;
line-height: 2;
}
}
&-btn {
image {
width: 322rpx;
height: 89rpx;
margin: 45rpx auto;
display: block;
}
}
}
}
</style>