1
mayisheng
2022-08-15 81f54040c2cb65537c6c6e1db8358a39a57dea0d
src/pcviews/specialmap/welcome.vue
@@ -1,164 +1,294 @@
/*
 * @Author: Morpheus
 * @Name: 社区迎新
 * @Date: 2021-11-15 17:14:47
 * @Last Modified by: Morpheus
 * @Last Modified time: 2022-01-13 17:39:35
 */
/* * @Author: Morpheus * @Name: 校区迎新 * @Date: 2021-11-15 17:14:47 * @Last
Modified by: Morpheus * @Last Modified time: 2022-01-26 10:51:24 */
<template>
    <div>
        <div class="welcome-container">
            <div class="header">
                <div class="title">
                    {{ title }}
                    <a href="javascript:void(0);" title="全景浏览">
                        <img
                            @click="panoramaPlay"
                            class="panorama-control deblurring"
                            src="/img/icon/panorama.png"
                            alt
                        />
                    </a>
                    <a href="javascript:void(0);" title="语音介绍">
                         <img @click="audioPlay"
                         class="audio-control"
                         src="/img/navicon/audio.png"
                         alt="">
                        <img
                            @click="audioPlay"
                            class="audio-control deblurring"
                            :src="audioImgUrl"
                            alt
                        />
                    </a>
                    <a href="javascript:void(0);" title="关闭">
                        <img @click="closeMapPopupBox"
                         class="close-box"
                         src="/img/navicon/close.png"
                         alt="">
                        <img
                            @click="closeModel"
                            class="close-box deblurring"
                            src="/img/navicon/close.png"
                            alt
                        />
                    </a>
                </div>
            </div>
            <div class="content-box">
                <div class="text-introduce">
                    <div class="title">
                        相关介绍:
                    </div>
                    <div class="content">
                        <p v-text="introduce">
                        </p>
                    </div>
                </div>
                <div class="organizer">
                    主办:{{}}
                </div>
                <div class="undertake">
                    承办:{{}}
                </div>
                <div class="img-exhibition">
                    <div class="title">
                        相关图片:
                    </div>
                    <div class="content">
                        <el-carousel :interval="5000"
                                     arrow="always"
                                     height="300px">
                            <el-carousel-item v-for="item in list"
                                              :key="item">
                                <el-image :src="item"
                                          :preview-src-list="[item]">
                                </el-image>
                        <el-carousel :interval="5000" arrow="always" height="300px">
                            <el-carousel-item v-for="item in list" :key="item">
                                <el-image :src="item" :preview-src-list="[item]"></el-image>
                            </el-carousel-item>
                        </el-carousel>
                    </div>
                </div>
                <div class="operating-btn">
                    <ul>
                        <li>全景</li>
                        <li>视频</li>
                    </ul>
                <div class="organizer">主办:{{ sponsor }}</div>
                <div class="undertake">承办:{{ undertake }}</div>
                <div class="time-box">时间:{{ time }}</div>
                <div class="text-introduce">
                    <div class="title">相关介绍:</div>
                    <div class="content">
                        <p v-text="introduce"></p>
                    </div>
                </div>
                <div class="panorama-box" v-show="panoramaShow">
                    <div class="title">
                        全景浏览
                        <a href="javascript:void(0);" title="关闭">
                            <img
                                @click="(panoramaShow = false), (panoramaUrl = '')"
                                class="close-box"
                                src="/img/navicon/close.png"
                                alt
                            />
                        </a>
                    </div>
                    <div class="content">
                        <iframe
                            style="width: 100%; height: 100%"
                            :src="panoramaUrl"
                            frameborder="0"
                        ></iframe>
                    </div>
                </div>
            </div>
        </div>
        <div v-show="layerList.length > 0" class="layer-manage-container">
            <div class="header">图层管理</div>
            <ul class="content">
                <li v-for="(item, index) in layerList" :key="index">
                    {{item.name}}:
                    <el-switch v-model="item.flag" @change="switchChange(item)"></el-switch>
                </li>
            </ul>
        </div>
    </div>
</template>
<script>
import { getWelcome } from '@/api/pc/public/specialmap'
import { mapGetters } from 'vuex'
let pathLayer = null
let pointLayer = null
let special = []
export default {
    data () {
        return {
            data: [],
            url: '',
            layerList: [],
            time: '',
            num: 0,
            sponsor: '',
            undertake: '',
            title: '',
            introduce: '',
            list: [],
            pathList: [],
            pointNameList: [],
            pointList: [],
            DC: null,
            pathLayer: null,
            pointLayer: null
            panoramaUrlOne: '',
            panoramaUrl: '',
            audioSource: '',
            audioFlag: false,
            audioCourse: false,
            audioSynth: null,
            audioMsg: null,
            panoramaShow: false,
            audioImgUrl: '/img/icon/start-video.png',
            urlDataName: null
        }
    },
    created () {
    },
    created () { },
    mounted () {
        this.DC = global.DC
        getWelcome({ hdname: '社区迎新' }).then((res) => {
            var result = res.data.data
            this.title = result.hdname
            this.introduce = result.context
            this.list = result.tpurl.split(',')
            this.pointNameList = result.addressname.split(',')
            this.pointList = result.address.split(';')
        var that = this
            this.list.forEach((item, index) => {
                var a = index + 1
                this.data.push(a)
            })
        this.audioSynth = window.speechSynthesis
            var a = result.lx.split(';')
        this.audioMsg = new window.SpeechSynthesisUtterance()
            a.forEach(item => {
                var b = item.split('(')
                var c = b[1].substr(0, b[1].length - 1)
                var d = c.split(',')
                var j = []
                d.forEach(it => {
                    var e = it.split(' ')
                    var f = e.join(',')
                    j.push(f)
                })
                var k = j.join(';')
                this.pathList.push(k)
            })
        this.audioMsg.onend = function () {
            // this.audioSynth.cancel();
            that.audioFlag = false
            that.audioCourse = false
            that.audioImgUrl = '/img/icon/close-video.png'
        }
            this.pathLayer = new this.DC.VectorLayer('pathLayer')
            this.viewer.addLayer(this.pathLayer)
            this.pointLayer = new this.DC.HtmlLayer('pointLayer')
            this.viewer.addLayer(this.pointLayer)
            this.pathList.forEach(item => {
                this.drawPolyline(item)
            })
            this.pointList.forEach((item, index) => {
                this.drawPoint(item.split(','), this.pointNameList[index])
            })
        })
        window.onbeforeunload = e => { // 刷新时弹出提示
            this.audioSynth.cancel()
        }
    },
    watch: {
        $route: {
            immediate: true,
            handler (newData, oldData) {
                if (this.urlDataName == null) {
                    this.urlDataName = this.$route.query.name
                    this.getData()
                } else if (newData.query.name != this.urlDataName) {
                    if (special.length > 0) {
                        special.forEach(item => {
                            global.viewer.imageryLayers.remove(
                                item.layer
                            )
                        })
                    }
                    special = []
                    this.audioSynth.cancel()
                    global.viewer.removeLayer(pathLayer)
                    global.viewer.removeLayer(pointLayer)
                    this.urlDataName = this.$route.query.name
                    this.getData()
                }
                // if (this.$route.query.type) {//需要监听的参数
                //     this.type = this.$route.query.type
                // }
            }
        }
    },
    computed: {
        ...mapGetters([
            'viewer',
            // 社区内导航的显示关闭
            // 校区内导航的显示关闭
            'campusNavFlag',
            'orgNavBarFlag',
            'arcNavBarFlag'
        ])
    },
    methods: {
        switchChange (item) {
            if (item.flag == true) {
                this.addArcgisLayer(item.url, item.name)
            } else {
                this.removeArcgisLayer(item.name)
            }
        },
        addArcgisLayer (url, name) {
            var layer = global.viewer.imageryLayers.addImageryProvider(
                new global.DC.Namespace.Cesium.ArcGisMapServerImageryProvider({
                    url: url
                })
            )
            special.push({
                layer,
                name
            })
        },
        removeArcgisLayer (name) {
            special.forEach((item, index) => {
                if (item.name == name) {
                    global.viewer.imageryLayers.remove(
                        item.layer
                    )
                    special.splice(index, 1)
                }
            })
        },
        getData () {
            getWelcome({ hdname: this.urlDataName }).then((res) => {
                var result = res.data.data
                this.title = result.hdname
                this.time = result.time
                this.sponsor = result.sponsor
                this.undertake = result.undertake
                this.panoramaUrl = result.panoramaurl
                this.panoramaUrlOne = result.panoramaurl
                this.introduce = result.context
                this.audioSource = result.context
                this.audioPlay()
                this.list = result.tpurl.split(',')
                this.pointNameList = result.addressname.split(',')
                this.pointList = result.address.split(';')
                this.layerList = []
                if (result.mapname != '' && result.mapname != null && result.mapname != undefined) {
                    var mapname = result.mapname.split(',')
                    var url = result.url.split(',')
                    mapname.forEach((item, index) => {
                        this.layerList.push({ flag: false, name: item, url: url[index] })
                    })
                    this.layerList[0].flag = true
                    this.addArcgisLayer(this.layerList[0].url, this.layerList[0].name)
                }
                var a = result.lx.split(';')
                a.forEach((item) => {
                    var b = item.split('(')
                    var c = b[1].substr(0, b[1].length - 1)
                    var d = c.split(',')
                    var j = []
                    d.forEach((it) => {
                        var e = it.split(' ')
                        var f = e.join(',')
                        j.push(f)
                    })
                    var k = j.join(';')
                    this.pathList.push(k)
                })
                pathLayer = new global.DC.VectorLayer('pathLayer')
                global.viewer.addLayer(pathLayer)
                pointLayer = new global.DC.HtmlLayer('pointLayer')
                global.viewer.addLayer(pointLayer)
                this.pathList.forEach((item) => {
                    this.drawPolyline(item)
                })
                this.pointList.forEach((item, index) => {
                    this.drawPoint(item.split(','), this.pointNameList[index])
                })
                if (this.pointList.length > 0) {
                    this.$store.dispatch('pcMoveView', {
                        viewer: global.viewer,
                        jd: +this.pointList[0].split(',')[0] - 0.0005,
                        wd: this.pointList[0].split(',')[1]
                    })
                } else {
                    this.$store.dispatch('pcMoveView', {
                        viewer: global.viewer,
                        jd: +this.pathList[0].split(';')[0].split(',')[0] - 0.0005,
                        wd: this.pathList[0].split(';')[0].split(',')[1]
                    })
                }
            })
        },
        drawPolyline (item) {
            const polyline = new this.DC.Polyline(item)
            const polyline = new global.DC.Polyline(item)
            polyline.setStyle({
                width: 6,
                arcType: true,
                material: new this.DC.PolylineImageTrailMaterialProperty({
                    color: new this.DC.Color(255, 0, 0),
                material: new global.DC.PolylineImageTrailMaterialProperty({
                    color: global.DC.Namespace.Cesium.Color.fromBytes(10, 255, 10),
                    speed: 60,
                    image: '/img/icon/right.png',
                    repeat: { x: 320, y: 1 }
@@ -166,12 +296,11 @@
                clampToGround: true
            })
            this.pathLayer.addOverlay(polyline)
            pathLayer.addOverlay(polyline)
        },
        drawPoint (item, name) {
            console.log(item, name)
            const divIcon = new this.DC.DivIcon(
                new this.DC.Position(Number(item[0]), Number(item[1]), 0),
            const divIcon = new global.DC.DivIcon(
                new global.DC.Position(Number(item[0]), Number(item[1]), 0),
                `
                    <div class="point-entitys-box">
                        <div class="point-logo">
@@ -183,40 +312,105 @@
                    </div>
                `
            )
            this.pointLayer.addOverlay(divIcon)
            pointLayer.addOverlay(divIcon)
        },
        audioPlay () {
            if (this.audioFlag == false) {
                this.audioMsg.text = this.audioSource
                this.audioSynth.speak(this.audioMsg)
                this.audioFlag = true
                this.audioCourse = true
                this.audioImgUrl = '/img/icon/start-video.png'
            } else {
                if (this.audioCourse == true) {
                    this.audioSynth.pause()
                    this.audioCourse = false
                    this.audioImgUrl = '/img/icon/close-video.png'
                } else {
                    this.audioSynth.resume()
                    this.audioCourse = true
                    this.audioImgUrl = '/img/icon/start-video.png'
                }
            }
        },
        closeModel () {
            if (special.length > 0) {
                special.forEach(item => {
                    global.viewer.imageryLayers.remove(
                        item.layer
                    )
                })
            }
            special = []
            global.viewer.removeLayer(pathLayer)
            global.viewer.removeLayer(pointLayer)
            this.audioSynth.cancel()
            this.audioFlag = false
            this.audioCourse = false
            this.$store.dispatch('delVisitedViews', this.$route)
            this.$router.push('/pcLayout/default')
        },
        panoramaPlay () {
            this.panoramaShow = true
            this.panoramaUrl = this.panoramaUrlOne
        }
    },
    destroyed () {
        this.audioSynth.cancel()
        global.viewer.removeLayer(pathLayer)
        global.viewer.removeLayer(pointLayer)
        // console.log("关闭", "see1");
    }
}
</script>
<style lang='scss' scope>
<style lang="scss" scope>
.welcome-container {
    padding: 10px;
    position: fixed;
    top: 132px;
    left: 132px;
    width: 480px;
    height: 620px;
    background: #2196f3;
    height: 720px;
    background: rgba(40, 187, 240, 0.7);
    border-radius: 10px;
    color: #fff;
    border: 1px solid #29baf1;
    box-shadow: 0 0 10px 2px #29baf1;
    .header {
        margin-bottom: 10px;
        height: 36px;
        line-height: 36px;
        text-align: center;
        position: relative;
        background: #29baf1;
        .title {
            .audio-control {
            .panorama-control {
                position: absolute;
                top: 0;
                right: 34px;
                right: 56px;
                bottom: 0;
                left: auto;
                margin: auto;
                width: 20px;
                height: 20px;
                width: 16px;
                height: 16px;
                cursor: pointer;
            }
            .audio-control {
                position: absolute;
                top: 0;
                right: 32px;
                bottom: 0;
                left: auto;
                margin: auto;
                width: 16px;
                height: 16px;
                cursor: pointer;
            }
@@ -235,13 +429,38 @@
    }
    .content-box {
        padding: 0 16px;
        height: calc(100% - 36px);
        & > div {
            margin-bottom: 10px;
        }
        & > div:last-child {
            margin-bottom: 0px;
        }
        .text-introduce {
            height: calc(100% - 408px);
            height: calc(100% - 458px);
            .title {
                position: relative;
                padding-left: 24px;
                height: 36px;
                line-height: 36px;
                &::before {
                    position: absolute;
                    top: 12px;
                    left: 0;
                    width: 0;
                    height: 6px;
                    border: 6px solid #fff;
                    box-sizing: border-box;
                    box-shadow: 0px 0px 4px 1px #fff;
                    border-radius: 50%;
                    content: '';
                }
            }
            .content {
@@ -259,18 +478,103 @@
        }
        .organizer,
        .undertake {
        .undertake,
        .time-box {
            padding-left: 24px;
            position: relative;
            height: 36px;
            line-height: 36px;
            &::before {
                position: absolute;
                top: 12px;
                left: 0px;
                width: 0;
                height: 6px;
                border: 6px solid #fff;
                box-sizing: border-box;
                box-shadow: 0px 0px 4px 1px #fff;
                border-radius: 50%;
                content: '';
            }
        }
        .panorama-box {
            padding: 10px;
            margin: auto !important;
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            z-index: 10;
            width: 560px;
            height: 406px;
            background: rgba(40, 187, 240, 0.7);
            border-radius: 10px;
            color: #fff;
            border: 1px solid #29baf1;
            box-shadow: 0 0 10px 2px #29baf1;
            .title {
                margin-bottom: 10px;
                height: 36px;
                line-height: 36px;
                text-align: center;
                position: relative;
                background: #29baf1;
                .panorama-control {
                    position: absolute;
                    top: 0;
                    right: 56px;
                    bottom: 0;
                    left: auto;
                    margin: auto;
                    width: 16px;
                    height: 16px;
                    cursor: pointer;
                }
                .audio-control {
                    position: absolute;
                    top: 0;
                    right: 32px;
                    bottom: 0;
                    left: auto;
                    margin: auto;
                    width: 16px;
                    height: 16px;
                    cursor: pointer;
                }
                .close-box {
                    position: absolute;
                    top: 0;
                    right: 8px;
                    bottom: 0;
                    left: auto;
                    margin: auto;
                    width: 16px;
                    height: 16px;
                    cursor: pointer;
                }
            }
            .content {
                padding: 0 10px;
                height: calc(100% - 46px);
                .iframe {
                    width: 100%;
                    height: 100%;
                }
            }
        }
        .img-exhibition {
            height: 336px;
            .title {
                height: 36px;
                line-height: 36px;
            }
            height: 300px;
            .content {
                .el-image {
@@ -298,4 +602,28 @@
        }
    }
}
.layer-manage-container {
    padding: 0 10px 10px 10px;
    position: fixed;
    right: 10px;
    bottom: 240px;
    width: 120px;
    background: rgba(40, 187, 240, 0.7);
    border-radius: 10px;
    color: #fff;
    border: 1px solid #29baf1;
    box-shadow: 0 0 10px 2px #29baf1;
    .header {
        line-height: 36px;
        text-align: center;
    }
    .content {
        max-height: calc(180px - 36px);
        overflow-y: auto;
        text-align: center;
    }
}
</style>