From 369b82a3d81afe2f0574e2c44fd0a2918516b433 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Thu, 24 Mar 2022 08:47:24 +0800
Subject: [PATCH] 日历部分调整,视频部分调整,专题部分调整

---
 src/components/orgNavBar/index.vue         |   97 +++
 src/components/playVideo/index.vue         |   73 ++
 src/pcLayout/index.vue                     |    4 
 src/pcviews/specialmap/celebrate.vue       |  548 ++++++++++++++++++-
 src/styles/pcpage/calender.scss            |   62 ++
 package-lock.json                          |   23 
 src/components/map/index.vue               |    9 
 src/components/playVideo/index copy.vue    |  197 +++++++
 src/components/map/components/calender.vue |  585 ++++++++++++++++++--
 src/styles/pcpage/dc-ui.scss               |    4 
 public/img/icon/school-celebrate.png       |    0 
 src/pcviews/specialmap/welcome.vue         |    2 
 src/components/leftNav/index.vue           |   45 +
 src/styles/pcpage/index.scss               |    1 
 package.json                               |    3 
 src/store/getters.js                       |    7 
 src/components/map/components/mapPopup.vue |    9 
 src/store/modules/viewer.js                |    4 
 18 files changed, 1,544 insertions(+), 129 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index eef5d35..4bb0bc4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1352,6 +1352,11 @@
         }
       }
     },
+    "@popperjs/core": {
+      "version": "2.11.4",
+      "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.4.tgz",
+      "integrity": "sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg=="
+    },
     "@soda/friendly-errors-webpack-plugin": {
       "version": "1.8.0",
       "resolved": "https://registry.nlark.com/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.8.0.tgz",
@@ -6830,6 +6835,11 @@
       "integrity": "sha1-aXJy45kTVuQMPKxWanTu9oF1ZTE=",
       "dev": true
     },
+    "hls.js": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.1.5.tgz",
+      "integrity": "sha512-mQX5TSNtJEzGo5HPpvcQgCu+BWoKDQM6YYtg/KbgWkmVAcqOCvSTi0SuqG2ZJLXxIzdnFcKU2z7Mrw/YQWhPOA=="
+    },
     "hmac-drbg": {
       "version": "1.0.1",
       "resolved": "https://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz",
@@ -8589,6 +8599,11 @@
       "requires": {
         "minimist": "^1.2.5"
       }
+    },
+    "moment": {
+      "version": "2.29.1",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+      "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
     },
     "move-concurrently": {
       "version": "1.0.1",
@@ -12302,6 +12317,14 @@
       "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
       "dev": true
     },
+    "tippy.js": {
+      "version": "6.3.7",
+      "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz",
+      "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==",
+      "requires": {
+        "@popperjs/core": "^2.9.0"
+      }
+    },
     "tmp": {
       "version": "0.0.33",
       "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz?cache=0&sync_timestamp=1592843137359&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftmp%2Fdownload%2Ftmp-0.0.33.tgz",
diff --git a/package.json b/package.json
index 7470b78..30d1fd8 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,10 @@
         "core-js": "^3.6.5",
         "echarts": "^5.2.1",
         "element-ui": "^2.15.6",
+        "hls.js": "^1.1.5",
         "lodash": "^4.17.21",
+        "moment": "^2.29.1",
+        "tippy.js": "^6.3.7",
         "vue": "^2.6.11",
         "vue-axios": "^3.3.7",
         "vue-router": "^3.5.2",
diff --git a/public/img/icon/school-celebrate.png b/public/img/icon/school-celebrate.png
new file mode 100644
index 0000000..14c49df
--- /dev/null
+++ b/public/img/icon/school-celebrate.png
Binary files differ
diff --git a/src/components/leftNav/index.vue b/src/components/leftNav/index.vue
index 561d102..e643fbc 100644
--- a/src/components/leftNav/index.vue
+++ b/src/components/leftNav/index.vue
@@ -39,7 +39,8 @@
     computed: {
         ...mapGetters([
             'closeMapClick', // 关闭地图点击,防止新增标签误触
-            'addIconsLayerIconPopup' // 传送关闭编辑窗口,刷新标签数据
+            'addIconsLayerIconPopup', // 传送关闭编辑窗口,刷新标签数据
+            'calenderShow'
         ])
     },
     data () {
@@ -77,14 +78,14 @@
                     checked: '/img/leftnav/monitor-checked.png',
                     layer: 'leftMonitorLayer'
                 },
-                // {
-                //     flag: false,
-                //     label: '活动',
-                //     img: '/img/leftnav/activity.png',
-                //     normal: '/img/leftnav/activity.png',
-                //     checked: '/img/leftnav/activity-checked.png',
-                //     layer: 'leftActivityLayer'
-                // },
+                {
+                    flag: false,
+                    label: '活动',
+                    img: '/img/leftnav/activity.png',
+                    normal: '/img/leftnav/activity.png',
+                    checked: '/img/leftnav/activity-checked.png',
+                    layer: 'leftActivityLayer'
+                },
                 // {
                 //     flag: false,
                 //     label: 'AED',
@@ -123,6 +124,19 @@
             if (!this.addIconsLayerIconPopup) {
                 this.reself()
             }
+        },
+        calenderShow: {
+            handler (newData, oldData) {
+                if (newData == false) {
+                    this.leftNavData.forEach(item => {
+                        if (item.label == '活动') {
+                            item.flag = false
+                            item.img = item.normal
+                        }
+                    })
+                }
+            },
+            immediate: true
         }
     },
     methods: {
@@ -196,10 +210,18 @@
             item.flag = !item.flag
             if (item.flag == true) {
                 item.img = item.checked
-                LeftNavLayer[item.layer].show = true
             } else {
                 item.img = item.normal
-                LeftNavLayer[item.layer].show = false
+            }
+
+            if (item.label == '活动') {
+                this.$store.commit('SET_CALENDERSHOW', item.flag)
+            } else {
+                if (item.flag == true) {
+                    LeftNavLayer[item.layer].show = true
+                } else {
+                    LeftNavLayer[item.layer].show = false
+                }
             }
         },
         initialize () {
@@ -484,7 +506,6 @@
                     )
                 ]
             })
-            // console.log(value, "see");
             this.$store.dispatch('setOurDataInPoput', value)
             this.$store.dispatch('pcFlyView', {
                 jd: value.lng,
diff --git a/src/components/map/components/calender.vue b/src/components/map/components/calender.vue
index 763b66d..2e35d8a 100644
--- a/src/components/map/components/calender.vue
+++ b/src/components/map/components/calender.vue
@@ -1,6 +1,15 @@
 <template>
     <div class="calender-box">
-        <div class="header">活动</div>
+        <div class="header">
+            <img class="celebrate deblurring" src="/img/icon/school-celebrate.png" alt />
+            校园活动
+            <img
+                @click="closeCurrent"
+                class="close deblurring"
+                src="/img/navicon/close.png"
+                alt
+            />
+        </div>
         <div class="content">
             <full-calendar ref="fullCalendar" style="height: 100%" :options="calendarOptions"></full-calendar>
         </div>
@@ -16,11 +25,378 @@
 // import '@fullcalendar/core/main.css'
 import '@fullcalendar/daygrid/main.css'
 
+import moment from 'moment'
+import tippy from 'tippy.js'
+import 'tippy.js/dist/tippy.css'
+import 'tippy.js/themes/light-border.css'
+// const getTime = (time) => {
+//     const datetime = new Date(time)
+//     const year = datetime.getFullYear()
+
+//     const month = datetime.getMonth()
+//     const date = datetime.getDate()
+//     const hour = datetime.getHours()
+//     const minute = datetime.getMinutes()
+//     const second = datetime.getSeconds()
+
+//     const result1 = year +
+//         '-' +
+//         ((month + 1) >= 10 ? (month + 1) : '0' + (month + 1)) +
+//         '-' +
+//         ((date + 1) < 10 ? '0' + date : date) +
+//         ' ' +
+//         ((hour + 1) < 10 ? '0' + hour : hour) +
+//         ':' +
+//         ((minute + 1) < 10 ? '0' + minute : minute) +
+//         ':' +
+//         ((second + 1) < 10 ? '0' + second : second)
+
+//     const result2 = year +
+//         '-' +
+//         ((month + 1) >= 10 ? (month + 1) : '0' + (month + 1)) +
+//         '-' +
+//         ((date + 1) < 10 ? '0' + date : date)
+
+//     const result = {
+//         hasTime: result1,
+//         withoutTime: result2
+//     }
+
+//     return result
+// }
+
+const timeEvents = [{
+    id: '92963',
+    title: '文化素质教育讲座:逻辑的现实性意义——大学生为何需要逻辑学?',
+    start: '2022-03-25T18:30:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '本科生院',
+    url2: 'http://today.hit.edu.cn/event/2022/03/23/92963',
+    color: '#337ab7'
+},
+{
+    id: '92944',
+    title: '青年教师交流发展论坛之对话“青椒“第二期',
+    start: '2022-03-23T13:30:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '人事处',
+    url2: 'http://today.hit.edu.cn/event/2022/03/22/92944',
+    color: '#337ab7'
+},
+{
+    id: '92862',
+    title: '国际组织实习项目线上宣讲会预告',
+    start: '2022-03-22T18:30:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '学工处',
+    url2: 'http://today.hit.edu.cn/event/2022/03/20/92862',
+    color: '#337ab7'
+},
+{
+    id: '92769',
+    title: '文化素质教育讲座:物理与创新漫谈',
+    start: '2022-03-20T18:30:00',
+    end: null,
+    location: null,
+    category:
+        '讲座报告',
+    department: '本科生院',
+    url2: 'http://today.hit.edu.cn/event/2022/03/15/92769',
+    color: '#337ab7'
+},
+{
+    id: '92763',
+    title: '马克思主义学院“世界大变局与疫情交织背景下的时代盛会”两会专题讲座预告',
+    start: '2022-03-18T18:30:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '马克思主义学院',
+    url2: 'http://today.hit.edu.cn/event/2022/03/15/92763',
+    color: '#337ab7'
+},
+{
+    id: '92736',
+    title: '青年教师交流发展论坛之对话“青椒”第一期',
+    start: '2022-03-17T12:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '人事处',
+    url2: 'http://today.hit.edu.cn/event/2022/03/14/92736',
+    color: '#337ab7'
+},
+{
+    id: '92733',
+    title: '【因斯图们交流会】仪器学院研究生微沙龙第三十六期活动——关注心理健康',
+    start: '2022-03-16T18:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '仪器科学与工程学院',
+    url2: 'http://today.hit.edu.cn/event/2022/03/14/92733',
+    color: '#337ab7'
+},
+{
+    id: '92653',
+    title: '仪器学院寒假政务实习分享交流会',
+    start: '2022-03-12T18:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '仪器科学与工程学院',
+    url2: 'http://today.hit.edu.cn/event/2022/03/11/92653',
+    color: '#337ab7'
+},
+{
+    id: '92624',
+    title: '文化素质教育讲座:“核”你有约',
+    start: '2022-03-18T18:30:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '本科生院',
+    url2: 'http://today.hit.edu.cn/event/2022/03/10/92624',
+    color: '#337ab7'
+},
+{
+    id: '92500',
+    title: '德累斯顿工业大学硕士团审项目介绍及校友经验分享',
+    start: '2022-03-12T18:30:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '国际合作部',
+    url2: 'http://today.hit.edu.cn/event/2022/03/07/92500',
+    color: '#337ab7'
+},
+{
+    id: '92496',
+    title: '德国亚琛工业大学4+2项目招生宣讲会',
+    start: '2022-03-10T19:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '国际合作部',
+    url2: 'http://today.hit.edu.cn/event/2022/03/07/92496',
+    color: '#337ab7'
+},
+{
+    id: '92358',
+    title: '【生科青年说第3期】博士生郑善亮关于iASPP与内质网Ca2+稳态的研究分享',
+    start: '2022-03-02T18:30:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '生命科学与技术学院',
+    url2: 'http://today.hit.edu.cn/event/2022/03/02/92358',
+    color: '#337ab7'
+},
+{
+    id: '92313',
+    title: '文化素质教育讲座:从物理,到“悟理”——对科技、文化与人生的若干思考',
+    start: '2022-03-02T18:30:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+
+    department: '本科生院',
+    url2: 'http://today.hit.edu.cn/event/2022/02/28/92313',
+    color: '#337ab7'
+},
+{
+    id: '92026',
+    title: '【career讲坛】公职系列“银行校招考情介绍备考指导”讲座',
+    start: '2022-01-18T19:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '学工处',
+    url2: 'http://today.hit.edu.cn/event/2022/01/15/92026',
+    color: '#337ab7'
+}, {
+    id: '91997',
+    title: '伦敦国王学院Kawal Rhode教授线上学术讲座',
+    start: '2022-01-20T18:30:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '医学与健康学院',
+    url2: 'http://today.hit.edu.cn/event/2022/01/11/91997',
+    color: '#337ab7'
+}, {
+    id: '91982',
+    title: '【career讲坛】公职系列“人民银行考情介绍备考指导”讲座',
+    start: '2022-01-11T19:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '学工处',
+    url2: 'http://today.hit.edu.cn/event/2022/01/09/91982',
+    color: '#337ab7'
+}, {
+    id: '91879',
+    title: '“全驱系统方法---诞生背景、优越性及展望”段广仁院士报告通知',
+    start: '2021-12-29T15:30:18',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '科工院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/29/91879',
+    color: '#337ab7'
+}, {
+    id: '91825',
+    title: '【生科青年说第2期】博士生徐珍媚关于G蛋白偶联受体结构与功能的研究分享',
+    start: '2021-12-30T18:30:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '生命科学与技术学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/26/91825',
+    color: '#337ab7'
+},
+
+{
+    id: '91817',
+    title: '美国大学生数学建模竞赛经验分享会(第二期)',
+    start: '2021-12-26T15:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '数学学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/25/91817',
+    color: '#337ab7'
+},
+{
+    id: '91758',
+    title: '第六届国际青年学者神舟论坛机电分论坛学术报告通知',
+    start: '2021-12-23T19:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '机电学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/23/91758',
+    color: '#337ab7'
+},
+{
+    id: '91737',
+    title: '【新百年 睿思无界】哈尔滨工业大学建筑学院2021学术月——专题系列讲座',
+    start: '2021-12-22T19:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '建筑学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/22/91737',
+    color: '#337ab7'
+},
+{
+    id: '91731',
+    title: '第六届国际青年学者神舟论坛化工与化学分论坛学术报告通知',
+    start: '2021-12-26T08:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '化工化学学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/22/91731',
+    color: '#337ab7'
+},
+{
+    id: '91708',
+    title: '【Career讲坛】公职系列“军队文职考情介绍及备考”讲座预告',
+    start: '2021-12-22T18:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '学工处',
+    url2: 'http://today.hit.edu.cn/event/2021/12/21/91708',
+    color: '#337ab7'
+},
+{
+    id: '91696',
+    title: '【新百年 睿思无界】哈尔滨工业大学建筑学院2021学术月——专题系列讲座',
+    start: '2021-12-20T19:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '建筑学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/20/91696',
+    color: '#337ab7'
+}, {
+    id: '91678',
+    title: '预告| 第六届哈尔滨工业大学国际青年学者神舟论坛-电气工程及自动化学院分论坛学术报告通知',
+    start: '2021-12-21T08:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '电气工程及自动化学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/20/91678',
+    color: '#337ab7'
+},
+{
+    id: '91655',
+    title: '【从炘创新讲坛】特邀报告第2期:《数学分析》课程学习的点滴体会(多元积分学部分)',
+    start: '2021-12-20T14:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '数学学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/19/91655',
+    color: '#337ab7'
+}, {
+    id: '91645',
+    title: '哈尔滨工业大学国际青年学者神舟论坛宇航分论坛学术报告会',
+    start: '2021-12-21T14:00:00',
+    end: null,
+    location: null,
+    category: '会议',
+    department: '航天学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/17/91645',
+    color: '#f0ad4e'
+}, {
+    id: '91621',
+    title: '【Career讲坛】公职系列“国考、省考、选调生考情介绍及备考”讲座预告',
+    start: '2021-12-18T15:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '学工处',
+    url2: 'http://today.hit.edu.cn/event/2021/12/17/91621',
+    color: '#337ab7'
+}, {
+    id: '91552',
+    title: '【预告】美国大学生数学建模竞赛经验分享',
+    start: '2021-12-19T15:00:00',
+    end: null,
+    location: null,
+    category: '讲座报告',
+    department: '数学学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/14/91552',
+    color: '#337ab7'
+}, {
+    id: '91548',
+    title: '“炘火•学知”讲师团开展《数学分析》考前知识梳理',
+    start: '2021-12-14T19:00:00',
+    end: null,
+    location: null,
+    category: '其它',
+    department: '数学学院',
+    url2: 'http://today.hit.edu.cn/event/2021/12/14/91548',
+    color: '#996600'
+}]
+
 export default {
     name: 'calender',
+
     components: {
         FullCalendar
     },
+
     data () {
         return {
             calendarOptions: {
@@ -50,9 +426,10 @@
                 eventColor: '#2196f3', // 修改日程背景色
                 timeGridEventMinHeight: '20', // 设置事件的最小高度
                 aspectRatio: '1.5', // 设置日历单元格宽高比
-                displayEventTime: true, // 是否显示事件时间
+                displayEventTime: false, // 是否显示事件时间
                 allDaySlot: false, // 周、日视图时,all-day不显示
                 eventLimit: true, // 设置月日程,与all-day slot 的最大显示数量,超过的通过弹窗展示
+                // eventLimitText: '更多',
                 eventTimeFormat: {
                     hour: 'numeric',
                     minute: '2-digit',
@@ -64,45 +441,72 @@
                     meridiem: false,
                     hour12: false // 设置时间为24小时制
                 },
-                events: [
-                    {
-                        id: 1,
-                        title: '09:30~11:30 小破孩',
-                        start: '2022-03-11', // 事件开始时间必须
-                        end: '2022-03-20', // 事件结束事件,可选
-                        allDay: false, // 是否为全天事件,可选
-                        // color: '#f08f00',
-                        // textColor: '#000',
-                        className: 'read-all-day'
-                    },
-                    {
-                        id: 3,
-                        title: '09:30~11:30 小1破孩',
-                        start: '2022-03-11',
-                        end: '2022-03-20',
-                        color: '#f08f01'
-                    },
-                    {
-                        id: 2,
-                        title: '9:30~14:30 项目会议',
-                        start: '2022-03-21',
-                        end: '2022-03-25',
-                        color: '#6bb377'
-                    }
-                ], // 日程数组
+
+                // 日程函数
+                events (time, callback) {
+                    // const startTime = getTime(time.start).withoutTime
+                    // const endTime = getTime(time.end).withoutTime
+
+                    const events = []
+
+                    timeEvents.forEach(item => {
+                        events.push({
+                            id: item.id,
+                            title: item.title,
+                            start: moment(item.start).format('YYYY-MM-DD HH:mm:ss'), // 事件开始时间必须
+                            // end: item.endTime, // 事件结束事件,可选
+                            // allDay: item.allDay, // 是否为全天事件,可选
+                            color: item.color,
+                            textColor: '#fff'
+                            // className: item.className
+                        })
+                    })
+
+                    callback(events)
+                },
+
+                // [
+                //     {
+                //         id: 1,
+                //         title: '09:30~11:30 小破孩',
+                //         start: '2022-03-11', // 事件开始时间必须
+                //         end: '2022-03-20', // 事件结束事件,可选
+                //         allDay: false, // 是否为全天事件,可选
+                //         // color: '#f08f00',
+                //         // textColor: '#000',
+                //         className: 'read-all-day'
+                //     },
+                //     {
+                //         id: 3,
+                //         title: '09:30~11:30 小1破孩',
+                //         start: '2022-03-11',
+                //         end: '2022-03-20',
+                //         color: '#f08f01'
+                //     },
+                //     {
+                //         id: 2,
+                //         title: '9:30~14:30 项目会议',
+                //         start: '2022-03-21',
+                //         end: '2022-03-25',
+                //         color: '#6bb377'
+                //     }
+                // ]
+
                 // 事件
-                editable: true, // 是否可以进行(拖动、缩放)修改
-                eventStartEditable: true, // Event日程开始时间可以改变,默认为true,若为false,则表示开始结束时间范围不能拉伸,只能拖拽
-                eventDurationEditable: true, // Event日程的开始结束时间距离是否可以改变,默认为true,若为false,则表示开始结束时间范围不能拉伸,只能拖拽
-                selectable: true, // 是否可以选中日历格
-                selectMirror: true,
+                editable: false, // 是否可以进行(拖动、缩放)修改
+                eventStartEditable: false, // Event日程开始时间可以改变,默认为true,若为false,则表示开始结束时间范围不能拉伸,只能拖拽
+                eventDurationEditable: false, // Event日程的开始结束时间距离是否可以改变,默认为true,若为false,则表示开始结束时间范围不能拉伸,只能拖拽
+                selectable: false, // 是否可以选中日历格
+                selectMirror: false,
                 selectMinDistance: 0, // 选中日历格的最小距离
                 weekends: true,
+                weekMode: 'liquid', // 在月视图里显示周的模式,因为每月周数可能不同,所以月视图高度不一定。
                 navLinks: true, // 天链接
                 selectHelper: false,
                 selectEventOverlap: false, // 相同时间段的多个日程视觉上是否允许重叠,默认为true,允许
-                dayMaxEvents: true,
+                dayMaxEvents: false,
                 dateClick: this.handleDateClick, // 日期点击
+                eventMouseEnter: this.handleEventMouseEnter,
                 eventsSet: this.handleEvents, // 事件点击
                 eventClick: this.handleEventClick, // 日程点击信息展示
                 eventDrop: this.handleEventDrop, // 日程拖动事件
@@ -110,21 +514,21 @@
                 select: this.handleDateSelect,
                 customButtons: {
                     prev: { // this overrides the prev button
-                        text: 'PREV',
-                        click: () => {
-                            this.prev()
+                        // text: 'PREV',
+                        click: (e) => {
+                            this.prev(e)
                         }
                     },
                     next: { // this overrides the next button
-                        text: 'PREV',
+                        // text: 'PREV',
                         click: () => {
                             this.next()
                         }
                     },
                     today: {
                         text: '今天',
-                        click: () => {
-                            this.today()
+                        click: (e) => {
+                            this.today(e)
                         }
                     }
                 }
@@ -137,15 +541,16 @@
     },
 
     methods: {
-        prev () {
+
+        prev (e) {
             this.calendarApi.prev()
         },
         // 切换下一个按钮事件
-        next () {
+        next (e) {
             this.calendarApi.next()
         },
         // 点击今天按钮
-        today () {
+        today (e) {
             this.calendarApi.today()
         },
         // 日程保存
@@ -185,27 +590,64 @@
         },
         // 日程事件点击
         handleEvents (info) {
-            console.log('handleEvents.info:', info)
+            // console.log('handleEvents.info:', info)
             // this.currentEvents = events
         },
         handleWeekendsToggle () {
-            console.log('handleWeekendsToggle')
             this.calendarOptions.weekends = !this.calendarOptions.weekends
         },
         // 日期点击
         handleDateClick (selectInfo) {
-            if (confirm('您是否要在【' + selectInfo.dateStr + '】添加一个新的事件?')) {
-                // 父组件直接调用子组件方法
-                this.$refs.eventDialogue.openDialog('add')
-                // 父组件直接修改子组件变量
-                // this.$refs['eventDialogue'].dialogVisible = true
-            }
+
+            // if (confirm('您是否要在【' + selectInfo.dateStr + '】添加一个新的事件?')) {
+            //     // 父组件直接调用子组件方法
+            //     this.$refs.eventDialogue.openDialog('add')
+            //     // 父组件直接修改子组件变量
+            //     // this.$refs['eventDialogue'].dialogVisible = true
+            // }
+
         },
         // 日程点击信息展示
         handleEventClick (info) {
-            console.log('handleEventClick.info:', info)
-            info.el.style.borderColor = 'red'
-            this.$refs.eventDialogue.openDialog('view', info)
+            // console.log('handleEventClick.info:', info)
+            // info.el.style.borderColor = 'red'
+            // this.$refs.eventDialogue.openDialog('view', info)
+        },
+        handleDateSelect (startDate, endDate, allDay, jsEvent, view) {
+            console.log(startDate, endDate, allDay, jsEvent, view)
+        },
+        handleEventMouseEnter (info) {
+            const col = info.event.borderColor
+            const eve = info.event._def.extendedProps
+            const category = info.event._def.extendedProps.category
+
+            tippy(info.el, {
+                // content:"<div style='width: 280px;background-color:#FAFAFA;padding:5px;font-size:14px;z-index:99999'>" +
+                //           "<div style='color: #666666;overflow: hidden;'><span style='display:inline-block;width:6px;height:6px;background-color:#318DDE;border-radius:50%;margin:0 5px;'></span>会议名称:" + info.event.title+"</div>" +
+                //           "<div style='color: #666666;overflow: hidden;'><span style='display:inline-block;width:6px;height:6px;background-color:#318DDE;border-radius:50%;margin:0 5px;'></span>会议类型:"+eve.type+"</div>" +
+                //           "<div style='color: #666666;overflow: hidden;'><span style='display:inline-block;width:6px;height:6px;background-color:#318DDE;border-radius:50%;margin:0 5px;'></span>会议时间:"+eve.times+"</div>" +
+                //           "<div style='color: #666666;overflow: hidden;'><span style='display:inline-block;width:6px;height:6px;background-color:#318DDE;border-radius:50%;margin:0 5px;'></span>会议状态:"+eve.status+"</div>" +
+                //         "</div>",
+                content: `<div style='width: 260px;background-color:#FAFAFA;padding:5px;font-size:14px;z-index:99999;'>
+                  <div style='display:flex;color: #666666;overflow: hidden;' class="${eve.category == 1 ? 'hidden' : ''}">
+                    <div><span style='display:inline-block;width:6px;height:6px;background-color:${col};border-radius:50%;margin:0 5px;'></span>活动名称: </div>
+                    <div style="width:161px;white-space:normal;overflow: auto;table-layout:fixed; word-break: break-all; height:auto;display:inner-block">${info.event.title}</div>
+                  </div>
+       
+                </div>`,
+                //            <div style='color: #666666;overflow: hidden;' class="${eve.category == 1 ? 'hidden' : ''}"><span style='display:inline-block;width:6px;height:6px;background-color:#318DDE;border-radius:50%;margin:0 5px;'></span>会议类型:${eve.type}</div>
+                //   <div style='color: #666666;overflow: hidden;' class="${eve.category == 1 ? 'hidden' : ''}"><span style='display:inline-block;width:6px;height:6px;background-color:#318DDE;border-radius:50%;margin:0 5px;'></span>会议时间:${eve.times}</div>
+                //   <div style='color: #666666;overflow: hidden;' class="${eve.category == 1 ? 'hidden' : ''}"><span style='display:inline-block;width:6px;height:6px;background-color:#318DDE;border-radius:50%;margin:0 5px;'></span>会议状态:${eve.status}</div>
+                //   <div style='color: #666666;overflow: hidden;' class="${eve.category == 0 ? 'hidden' : ''}"><span style='display:inline-block;width:6px;height:6px;background-color:#318DDE;border-radius:50%;margin:0 5px;'></span>年份:${eve.year}</div>
+                //   <div style='color: #666666;overflow: hidden;' class="${eve.category == 0 ? 'hidden' : ''}"><span style='display:inline-block;width:6px;height:6px;background-color:#318DDE;border-radius:50%;margin:0 5px;'></span>领域角色:${eve.depRoleName}</div>
+                //   <div style='color: #666666;overflow: hidden;' class="${eve.category == 0 ? 'hidden' : ''}"><span style='display:inline-block;width:6px;height:6px;background-color:#318DDE;border-radius:50%;margin:0 5px;'></span>姓名:${eve.name}</div>
+                theme: 'light-border', // 主题选取
+                // trigger: 'click', //触发类型
+                interactive: true, // 可交互的
+                placement: 'top-start', // 悬浮框位置
+                allowHTML: true, // 是否允许html文本
+                zIndex: 99999
+            })
         },
         // 日程事件触发
         eventClick (info) {
@@ -214,13 +656,16 @@
         },
         // 日程拖动事件
         handleEventDrop (info) {
-            this.$refs.eventDialogue.eventFormModel.start = info.event.start
-            this.$refs.eventDialogue.eventFormModel.end = info.event.end
+            // this.$refs.eventDialogue.eventFormModel.start = info.event.start
+            // this.$refs.eventDialogue.eventFormModel.end = info.event.end
         },
         // 日程缩放事件
         eventResize (info) {
-            this.$refs.eventDialogue.eventFormModel.start = info.event.start
-            this.$refs.eventDialogue.eventFormModel.end = info.event.end
+            // this.$refs.eventDialogue.eventFormModel.start = info.event.start
+            // this.$refs.eventDialogue.eventFormModel.end = info.event.end
+        },
+        closeCurrent () {
+            this.$store.commit('SET_CALENDERSHOW', false)
         }
     }
 }
@@ -238,13 +683,33 @@
     right: 0;
     bottom: 0;
     margin: auto;
+    border-radius: 10px;
+    overflow: hidden;
+    box-shadow: 0 0 4px 2px #dddddd;
 
     .header {
+        position: relative;
         padding: 0 10px;
         line-height: 40px;
         background: #2196f3;
         color: #fff;
         font-size: 18px;
+        .celebrate {
+            width: 20px;
+            height: 20px;
+            vertical-align: middle;
+        }
+        .close {
+            position: absolute;
+            right: 10px;
+            top: 0;
+            left: auto;
+            bottom: 0;
+            margin: auto;
+            width: 16px;
+            height: 16px;
+            cursor: pointer;
+        }
     }
 
     .content {
@@ -252,9 +717,5 @@
         padding: 0 10px 10px 10px;
         height: calc(100% - 50px);
     }
-}
-.read-all-day {
-    background: red;
-    color: green;
 }
 </style>
diff --git a/src/components/map/components/mapPopup.vue b/src/components/map/components/mapPopup.vue
index e89003f..f9ae8a9 100644
--- a/src/components/map/components/mapPopup.vue
+++ b/src/components/map/components/mapPopup.vue
@@ -219,7 +219,10 @@
                                     />
                                 </div>
                                 <div class="content">
-                                    <video :src="monitorUrl" controls autoplay></video>
+                                    <play-video
+                                        :sourceUrl="monitorUrl"
+                                        @playStatus="changePlayStatus"
+                                    ></play-video>
                                 </div>
                             </div>
                         </div>
@@ -1087,6 +1090,10 @@
             this.$store.commit('SET_MONITORPOPUP', false)
         },
 
+        changePlayStatus (status) { // 获取子组件的播放状态
+            console.log(status)
+        },
+
         audioPlay () {
             if (this.audioFlag == false) {
                 this.audioMsg.text = this.audioSource
diff --git a/src/components/map/index.vue b/src/components/map/index.vue
index f59faf6..77c4c38 100644
--- a/src/components/map/index.vue
+++ b/src/components/map/index.vue
@@ -31,7 +31,7 @@
 
         <dimension />
 
-        <!-- <calender /> -->
+        <calender v-if="calenderShow" />
 
         <left-nav ref="leftNav"></left-nav>
 
@@ -65,8 +65,8 @@
     components: {
         mapPopup,
         campusBuildingSearch,
-        dimension
-        // calender
+        dimension,
+        calender
     },
     data () {
         return {
@@ -158,7 +158,8 @@
             'campusNavFlag',
             'orgNavBarFlag',
             'arcNavBarFlag',
-            'searchPopupFlag'
+            'searchPopupFlag',
+            'calenderShow'
         ])
     },
     mounted () {
diff --git a/src/components/orgNavBar/index.vue b/src/components/orgNavBar/index.vue
index c750100..99e1e32 100644
--- a/src/components/orgNavBar/index.vue
+++ b/src/components/orgNavBar/index.vue
@@ -9,7 +9,13 @@
         </template>
         <template slot="public-box-content">
             <ul>
-                <li v-for="(item, index) in orgNavBarList" :key="index" @click="mapPopup(item)">
+                <li
+                    @mouseover="flickerStart(item, item.navTitle)"
+                    @mouseout="flickerEnd(item, item.navTitle)"
+                    v-for="(item, index) in orgNavBarList"
+                    :key="index"
+                    @click="mapPopup(item)"
+                >
                     <img :src="item.icon" alt />
                     <span>{{ item.navTitle }}</span>
                 </li>
@@ -20,6 +26,8 @@
 
 <script>
 import { mapGetters } from 'vuex'
+
+let currentOrgLayer = null
 
 export default {
     name: 'OrgNavBar',
@@ -47,7 +55,47 @@
             'orgNavBarTitle'
         ])
     },
+    watch: {
+        orgNavBarList: {
+            handler (newData, oldData) {
+                if (newData.length > 0) {
+                    currentOrgLayer = new global.DC.HtmlLayer('currentOrgLayer')
+                    global.viewer.addLayer(currentOrgLayer)
+
+                    newData.forEach((item, index) => {
+                        const divIcon = new global.DC.DivIcon(
+                            new global.DC.Position(Number(item.longitude), Number(item.latitude), 0),
+                            `
+                                <div class="tag-entitys-box">
+                                    <div class="tag-content">
+                                        ${item.navTitle}
+                                    </div>
+                                    <div class="tag-angle-content">
+                                        <img src="https://map.hit.edu.cn/images/tarrow_xq.png">
+                                    </div>
+                                </div>
+                            `
+                        )
+
+                        divIcon.attr.name = item.navTitle
+
+                        currentOrgLayer.addOverlay(divIcon)
+                    })
+                } else {
+                    this.removeLayer()
+                }
+            },
+            immediate: true
+        }
+    },
     methods: {
+        removeLayer () {
+            if (currentOrgLayer != null) {
+                global.viewer.removeLayer(currentOrgLayer)
+                currentOrgLayer = null
+            }
+        },
+
         mapPopup (item) {
             this.$store.commit('CLEAR_ALL', null)
 
@@ -120,6 +168,53 @@
             this.$store.commit('SET_DETAILSPOPUP', false)
             this.$store.commit('SET_PANORAMAPOPUP', false)
             this.$store.commit('SET_MONITORPOPUP', false)
+            this.removeLayer()
+        },
+        flickerStart (param, name) {
+            const layerIcon = currentOrgLayer.getOverlaysByAttr('name', name)
+
+            currentOrgLayer.removeOverlay(layerIcon[0])
+
+            const divIcon = new global.DC.DivIcon(
+                new global.DC.Position(Number(param.longitude), Number(param.latitude), 0),
+                `
+                                <div class="tag-entitys-box layer-entity-animation">
+                                    <div class="tag-content">
+                                        ${param.navTitle}
+                                    </div>
+                                    <div class="tag-angle-content">
+                                        <img src="https://map.hit.edu.cn/images/tarrow_xq.png">
+                                    </div>
+                                </div>
+                            `
+            )
+
+            divIcon.attr.name = param.navTitle
+
+            currentOrgLayer.addOverlay(divIcon)
+        },
+        flickerEnd (param, name) {
+            const layerIcon = currentOrgLayer.getOverlaysByAttr('name', name)
+
+            currentOrgLayer.removeOverlay(layerIcon[0])
+
+            const divIcon = new global.DC.DivIcon(
+                new global.DC.Position(Number(param.longitude), Number(param.latitude), 0),
+                `
+                                <div class="tag-entitys-box">
+                                    <div class="tag-content">
+                                        ${param.navTitle}
+                                    </div>
+                                    <div class="tag-angle-content">
+                                        <img src="https://map.hit.edu.cn/images/tarrow_xq.png">
+                                    </div>
+                                </div>
+                            `
+            )
+
+            divIcon.attr.name = param.navTitle
+
+            currentOrgLayer.addOverlay(divIcon)
         }
     }
 }
diff --git a/src/components/playVideo/index copy.vue b/src/components/playVideo/index copy.vue
new file mode 100644
index 0000000..69eeaa7
--- /dev/null
+++ b/src/components/playVideo/index copy.vue
@@ -0,0 +1,197 @@
+<template>
+    <div class="ali-player">
+        <div class="main">
+            <div class="video-center">
+                <div v-if="!sourceUrls && !loadingVideo" class="tips">请选择视频源</div>
+                <div v-if="waiting" class="tips">获取视频中,请稍等...</div>
+                <div
+                    v-if="!hls"
+                    class="video"
+                    v-loading="loadingVideo"
+                    style="background-color: #0c0b0b"
+                ></div>
+                <video
+                    v-show="hls"
+                    id="publicVideo"
+                    v-loading="loadingVideo"
+                    controls
+                    class="video"
+                    ref="publicVideo"
+                    style="background-color: #0c0b0b"
+                ></video>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import Hls from 'hls.js'
+export default {
+    name: 'playVideo',
+    components: {},
+    props: {
+        sourceUrl: {
+            type: String,
+            default: ''
+        },
+        height: {
+            type: String,
+            default: '550px'
+        }
+    },
+    data () {
+        return {
+            hls: null,
+            sourceUrls: this.sourceUrl, // 如果不赋值,在加载组件时会报错
+            loadingVideo: false,
+            waiting: false,
+            reloadPlayTime: null // 当视频流获取超时定时器
+        }
+    },
+    computed: {
+
+    },
+    watch: {
+        sourceUrl: {
+            handler (newVal, oldVal) {
+                console.log(newVal, 465)
+                if (this.reloadPlayTime) { // 重新播放或者播放新视频时,清空定时器
+                    console.log('清空定时器...')
+                    this.videoPause()
+                    clearTimeout(this.reloadPlayTime)
+                }
+                if (newVal && newVal !== oldVal) {
+                    this.waiting = true
+                    this.sourceUrls = newVal
+                    this.playVideo()
+                }
+            },
+            // 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法
+            immediate: true
+        }
+
+    },
+    created () { },
+    mounted () {
+    },
+    methods: {
+        playVideo () {
+            this.$nextTick(() => {
+                this.loadingVideo = false
+            })
+            if (Hls.isSupported()) {
+                this.hls = new Hls()
+                this.hls.loadSource(this.sourceUrls)
+                this.hls.attachMedia(this.$refs.publicVideo)
+
+                this.hls.on(Hls.Events.MANIFEST_PARSED, (event, data) => {
+                    //                        console.log(event, data);
+                    this.loadingVideo = false
+                    this.waiting = false
+                    this.$emit('playStatus', true) // 当点位存在播放地址时,可以截图
+                    console.log('playing...')
+                    this.$refs.publicVideo.play()
+                    /*  playSetTime = setTimeout(()=>{
+                          clearTimeout(this.reloadPlayTime);
+                      },3000) */
+                    // 当正在播放时,取消定时器
+                })
+                const timerArr = []
+                let delay = 5000
+                this.hls.on(Hls.Events.ERROR, (event, data) => {
+                    delay += 1000
+                    console.log(event, data)
+                    if (data.type === 'networkError') { // 网络故障
+                        console.log('网络故障了...')
+                        this.reloadPlayTime = setTimeout(() => {
+                            this.$message.warning('获取视频失败,请重新播放...')
+                            this.sourceUrls = ''
+                            this.loadingVideo = false
+                            this.waiting = false
+                            this.disabledShot = true
+                            this.$emit('playStatus', false)
+                            this.videoPause()
+                            // 监听出错事件
+                        }, delay)
+                        timerArr.push(this.reloadPlayTime)
+
+                        if (timerArr.length > 1) {
+                            // 当视频播放中无法播放时,会多次执行Hls.Events.ERROR,因此需要处理一下定时器触发问题
+                            for (let i = 1; i < timerArr.length; i++) {
+                                clearTimeout(timerArr[i])
+                                timerArr.splice(i, 1)
+                            }
+                        }
+                        console.log(timerArr)
+                    } else if (data.type === 'mediaError') { // 推流失败
+                        //                            console.log("播放流断了....");
+                    }
+                })
+            } else if (this.$refs.publicVideo.canPlayType('application/vnd.apple.mpegurl')) {
+                /*  this.$refs.video.src = 'https://video-dev.github.io/streams/x36xhzz/x36xhzz.m3u8';
+                  this.$refs.video.addEventListener('loadedmetadata',function() {
+                      this.$refs.video.play();
+                  }); */
+            }
+        },
+        // 停止流
+        videoPause () {
+            if (this.hls) {
+                this.$refs.publicVideo.pause()
+                this.hls.destroy()
+                this.hls = null
+            }
+        }
+    },
+    beforeDestroy () {
+        clearTimeout(this.reloadPlayTime)
+        this.hls = null
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.ali-player {
+    width: 460px;
+    height: 320px;
+    .main {
+        width: 100%;
+        height: 100%;
+        box-sizing: border-box;
+        color: #ffffff;
+        .video-center {
+            position: relative;
+            width: 100%;
+            height: 100%;
+            .name {
+                position: absolute;
+                left: 50%;
+                top: -20px;
+                font-size: 18px;
+                -webkit-transform: translateX(-50%);
+                transform: translateX(-50%);
+            }
+            .tips {
+                position: absolute;
+                top: 50%;
+                left: 50%;
+                -webkit-transform: translate(-50%, -50%);
+                transform: translate(-50%, -50%);
+                z-index: 9999;
+                opacity: 0.79;
+            }
+        }
+    }
+    #publicVideo {
+        width: 100%;
+        height: 100%;
+        object-fit: fill;
+        opacity: 0.79;
+    }
+    .video {
+        width: 100%;
+        height: 100%;
+        opacity: 0.79;
+    }
+}
+</style>
diff --git a/src/components/playVideo/index.vue b/src/components/playVideo/index.vue
new file mode 100644
index 0000000..5810736
--- /dev/null
+++ b/src/components/playVideo/index.vue
@@ -0,0 +1,73 @@
+<template>
+    <div id="video-box">
+        <video id="hlsVideo" ref="hlsVideo" controls preload="true"></video>
+    </div>
+</template>
+
+<script>
+import Hls from 'hls.js'
+export default {
+    name: 'playVideo',
+    data () {
+        return {
+            hls: ''
+        }
+    },
+    methods: {
+        destroyHls: function () {
+            if (this.hls) {
+                this.$refs.hlsVideo.pause()
+                this.hls.destroy()
+                this.hls = null
+            }
+        },
+        loadVideoFn: function () {
+            if (Hls.isSupported()) {
+                this.hls = new Hls()
+                this.hls.loadSource('http://171.34.197.243:786/devimages/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8') // CCTV1直播源
+                this.hls.attachMedia(this.$refs.hlsVideo)
+                this.hls.on(Hls.Events.MANIFEST_PARSED, () => {
+                    console.log('加载成功')
+                    this.$refs.hlsVideo.play()
+                })
+                this.hls.on(Hls.Events.ERROR, (event, data) => {
+                    // console.log(event, data);
+                    // 监听出错事件
+                    console.log('加载失败')
+                })
+            }
+        }
+    },
+    computed: {
+
+    },
+
+    created: function () {
+        const _this = this
+        _this.$once('hook:beforeDestroy', () => {
+            _this.destroyHls()
+        })
+    },
+
+    mounted () {
+        const _this = this
+        _this.loadVideoFn()
+    },
+
+    watch: {
+    },
+
+    components: {
+
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+#hlsVideo {
+    width: 460px;
+    height: 320px;
+    border: none;
+    object-fit: fill;
+}
+</style>
diff --git a/src/pcLayout/index.vue b/src/pcLayout/index.vue
index d8580eb..f13219a 100644
--- a/src/pcLayout/index.vue
+++ b/src/pcLayout/index.vue
@@ -70,8 +70,8 @@
                         <template slot="title">
                             <i class="custom-icon menu-ztdt"></i> 专题地图
                         </template>
-                        <!-- <el-menu-item index="/pcLayout/default/specialmap/celebrate">校区庆</el-menu-item> -->
-                        <el-menu-item index="/pcLayout/default/specialmap/welcome">校区迎新</el-menu-item>
+                        <el-menu-item index="/pcLayout/default/specialmap/welcome?name=校庆">校庆</el-menu-item>
+                        <el-menu-item index="/pcLayout/default/specialmap/welcome?name=校区迎新">校区迎新</el-menu-item>
                     </el-submenu>
 
                     <el-submenu index="tool">
diff --git a/src/pcviews/specialmap/celebrate.vue b/src/pcviews/specialmap/celebrate.vue
index 67cdcee..72995a9 100644
--- a/src/pcviews/specialmap/celebrate.vue
+++ b/src/pcviews/specialmap/celebrate.vue
@@ -1,52 +1,514 @@
-/* * @Author: Morpheus * @Name: 校区庆 * @Date: 2021-11-15 17:14:47 * @Last
-Modified by: Morpheus * @Last Modified time: 2022-01-05 14:05:59 */
+/* * @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>
-    <service-nav-bar
-      :title="title"
-      :arcCode="code"
-      :headerLog="headerLog"
-    ></service-nav-bar>
-  </div>
+    <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 deblurring"
+                            :src="audioImgUrl"
+                            alt
+                        />
+                    </a>
+                    <a href="javascript:void(0);" title="关闭">
+                        <img
+                            @click="closeModel"
+                            class="close-box deblurring"
+                            src="/img/navicon/close.png"
+                            alt
+                        />
+                    </a>
+                </div>
+            </div>
+            <div class="content-box">
+                <div class="img-exhibition">
+                    <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-item>
+                        </el-carousel>
+                    </div>
+                </div>
+                <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>
 </template>
 
 <script>
-import { mapGetters } from "vuex";
+import { getWelcome } from '@/api/pc/public/specialmap'
+import { mapGetters } from 'vuex'
+
+let pathLayer = null
+let pointLayer = null
 
 export default {
-  data() {
-    return {
-      title: "圈存机",
-      code: 6,
-      headerLog: "/img/icon/service-qcj.png",
-    };
-  },
-  created() {
-    if (this.orgNavBarFlag == true) {
-      this.$store.commit("SET_ORGNAVBARTITLE", "");
-      this.$store.commit("SET_ORGNAVBARLIST", []);
-      this.$store.commit("SET_ORGNAVBARFLAG", false);
-    }
-    if (this.arcNavBarFlag == true) {
-      this.$store.commit("SET_ARCNAVBARTITLE", "");
-      this.$store.commit("SET_ARCNAVBARCODE", "");
-      this.$store.commit("SET_ARCNAVBARFLAG", false);
-    }
-  },
-  computed: {
-    ...mapGetters([
-      // 校区内导航的显示关闭
-      "orgNavBarFlag",
-      "arcNavBarFlag",
-    ]),
-  },
-  methods: {
-    closeModel() {
-      this.$store.dispatch("delVisitedViews", this.$route);
-      this.$router.push("/pcLayout/default");
+    data () {
+        return {
+            time: '',
+            sponsor: '',
+            undertake: '',
+            title: '',
+            introduce: '',
+            list: [],
+            pathList: [],
+            pointNameList: [],
+            pointList: [],
+            panoramaUrlOne: '',
+            panoramaUrl: '',
+            audioSource: '',
+            audioFlag: false,
+            audioCourse: false,
+            audioSynth: null,
+            audioMsg: null,
+            panoramaShow: false,
+            audioImgUrl: '/img/icon/start-video.png'
+        }
     },
-  },
-};
+    created () { },
+    mounted () {
+        var that = this
+
+        this.audioSynth = window.speechSynthesis
+
+        this.audioMsg = new window.SpeechSynthesisUtterance()
+
+        this.audioMsg.onend = function () {
+            // this.audioSynth.cancel();
+            that.audioFlag = false
+            that.audioCourse = false
+            that.audioImgUrl = '/img/icon/close-video.png'
+        }
+        this.getData()
+
+        window.onbeforeunload = e => { // 刷新时弹出提示
+            this.audioSynth.cancel()
+        }
+    },
+    computed: {
+        ...mapGetters([
+            // 校区内导航的显示关闭
+            'campusNavFlag',
+            'orgNavBarFlag',
+            'arcNavBarFlag'
+        ])
+    },
+    methods: {
+        getData () {
+            getWelcome({ hdname: '校区迎新' }).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(';')
+
+                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 global.DC.Polyline(item)
+
+            polyline.setStyle({
+                width: 6,
+                arcType: true,
+                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 }
+                }),
+                clampToGround: true
+            })
+
+            pathLayer.addOverlay(polyline)
+        },
+        drawPoint (item, name) {
+            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">
+                            <img src="/img/icon/activity.png">
+                        </div>
+                        <div class="point-title">
+                            ${name}
+                        </div>
+                    </div>
+                `
+            )
+            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 () {
+            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></style>
+<style lang="scss" scope>
+.welcome-container {
+    padding: 10px;
+    position: fixed;
+    top: 132px;
+    left: 132px;
+    width: 480px;
+    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 {
+            .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-box {
+        padding: 0 16px;
+        height: calc(100% - 36px);
+
+        & > div {
+            margin-bottom: 10px;
+        }
+
+        & > div:last-child {
+            margin-bottom: 0px;
+        }
+
+        .text-introduce {
+            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 {
+                height: calc(100% - 36px);
+
+                p {
+                    height: 100%;
+                    text-indent: 2em;
+                    font-size: 16px;
+                    letter-spacing: 2px;
+                    line-height: 24px;
+                    overflow-y: auto;
+                }
+            }
+        }
+
+        .organizer,
+        .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: 300px;
+
+            .content {
+                .el-image {
+                    position: absolute;
+                    top: 0;
+                    left: 0;
+                    right: 0;
+                    bottom: 0;
+                    margin: auto;
+                    // width: 100%;
+                    height: 100%;
+
+                    img {
+                        position: absolute;
+                        top: 0;
+                        left: 0;
+                        right: 0;
+                        bottom: 0;
+                        margin: auto;
+                        width: 100%;
+                        height: 100%;
+                    }
+                }
+            }
+        }
+    }
+}
+</style>
diff --git a/src/pcviews/specialmap/welcome.vue b/src/pcviews/specialmap/welcome.vue
index 72995a9..3834019 100644
--- a/src/pcviews/specialmap/welcome.vue
+++ b/src/pcviews/specialmap/welcome.vue
@@ -136,7 +136,7 @@
     },
     methods: {
         getData () {
-            getWelcome({ hdname: '校区迎新' }).then((res) => {
+            getWelcome({ hdname: this.$route.query.name }).then((res) => {
                 var result = res.data.data
                 this.title = result.hdname
                 this.time = result.time
diff --git a/src/store/getters.js b/src/store/getters.js
index 28da5f1..673170c 100644
--- a/src/store/getters.js
+++ b/src/store/getters.js
@@ -21,8 +21,8 @@
     dimensionData: (state) => state.mobile.dimensionData, // 维度镜头数据
     perspectiveControl: (state) => state.mobile.perspectiveControl, /// 视角控制:高度、角度  ()=>{}
     audioState: (state) => state.mobile.audioState, // 文字转语音状态
-    // areaLayer: (state) => state.mobile.areaLayer, // 
-    // areaLayerSelect: (state) => state.mobile.select, // 
+    // areaLayer: (state) => state.mobile.areaLayer, //
+    // areaLayerSelect: (state) => state.mobile.select, //
 
     isOpenDrawALine: (state) => state.mobile.isOpenDrawALine, // 是否开启路线
     isendPosition: (state) => state.mobile.isendPosition, // 路线导航终点数据改变
@@ -61,6 +61,7 @@
     ...navigation,
     ...search,
     viewerExist: (state) => state.viewer.viewerExist,
+    calenderShow: (state) => state.viewer.calenderShow,
     twoOrThree: (state) => state.viewer.twoOrThree,
     popupBgUrl: (state) => state.popupParams.popupBgUrl,
     pupupQRUrl: (state) => state.popupParams.pupupQRUrl,
@@ -91,4 +92,4 @@
     addIconsLayerIconPopup: (state) => state.popupParams.addIconsLayerIconPopup, // 自定义标签编辑窗口
     addIconsLayerIconPosition: (state) => state.popupParams.addIconsLayerIconPosition // 自定义标签编辑窗口
 }
-export default getters
\ No newline at end of file
+export default getters
diff --git a/src/store/modules/viewer.js b/src/store/modules/viewer.js
index 4e59d2b..f8e2e63 100644
--- a/src/store/modules/viewer.js
+++ b/src/store/modules/viewer.js
@@ -1,6 +1,7 @@
 const viewer = {
     state: {
         viewerExist: false,
+        calenderShow: false,
         visitedViews: [],
         cachedViews: [],
         twoOrThree: '三 维'
@@ -9,6 +10,9 @@
         SET_VIEWEREXIST (state, viewerExist) {
             state.viewerExist = viewerExist
         },
+        SET_CALENDERSHOW (state, calenderShow) {
+            state.calenderShow = calenderShow
+        },
         SET_TWOORTHREE (state, twoOrThree) {
             state.twoOrThree = twoOrThree
         },
diff --git a/src/styles/pcpage/calender.scss b/src/styles/pcpage/calender.scss
new file mode 100644
index 0000000..8bd0478
--- /dev/null
+++ b/src/styles/pcpage/calender.scss
@@ -0,0 +1,62 @@
+.calender-box {
+    .fc-toolbar-chunk {
+        button {
+            background: #2196f3;
+            border-color: #969696;
+            box-shadow: none !important;
+        }
+    }
+
+    .fc .fc-button-primary:disabled {
+        background: #969696;
+        border-color: #969696;
+    }
+
+    .fc .fc-button-primary:hover {
+        background: #116cb2 !important;
+        border-color: #969696 !important;
+    }
+
+    .fc .fc-button-primary:not(:disabled):active,
+    .fc .fc-button-primary:not(:disabled).fc-button-active {
+        background: #116cb2 !important;
+        border-color: #969696 !important;
+    }
+
+    .fc-event-title {
+        text-overflow: ellipsis !important;
+    }
+
+}
+
+
+
+.red-all-day {
+    background: rgb(255, 0, 0);
+    color: white;
+}
+
+.green-all-day {
+    background: rgb(69, 255, 69);
+    color: white;
+}
+
+.yellow-all-day {
+    background: rgb(173, 69, 0);
+    color: white;
+}
+
+.orange-all-day {
+    background: rgb(255, 175, 25);
+    color: white;
+}
+
+.blue-all-day {
+    background: rgb(9, 157, 255);
+    color: white;
+}
+
+.pink-all-day {
+    background: rgb(170, 42, 63);
+    color: white;
+}
\ No newline at end of file
diff --git a/src/styles/pcpage/dc-ui.scss b/src/styles/pcpage/dc-ui.scss
index 2edbdb0..56b2ea2 100644
--- a/src/styles/pcpage/dc-ui.scss
+++ b/src/styles/pcpage/dc-ui.scss
@@ -42,6 +42,10 @@
 
 }
 
+.layer-entity-animation {
+    animation: moveLayerIcon 1s linear infinite;
+}
+
 @keyframes moveLayerIcon {
     0% {
         transform: translateY(0px);
diff --git a/src/styles/pcpage/index.scss b/src/styles/pcpage/index.scss
index e17093b..4f43e47 100644
--- a/src/styles/pcpage/index.scss
+++ b/src/styles/pcpage/index.scss
@@ -1,4 +1,5 @@
 @import './campus-nav.scss';
+@import './calender.scss';
 @import './element-ui.scss';
 @import './dc-ui.scss';
 

--
Gitblit v1.9.3