Your Name 2 years ago
parent
commit
1a18f16b25

BIN
public/images/封面2.jpg View File


BIN
public/map/map.jpg View File


+ 1
- 1
src/components/CoverBtn.vue View File

@@ -37,7 +37,7 @@ import { computed, ref } from 'vue';
37 37
 <style lang="less" scoped>
38 38
 .cover-btn {
39 39
   position: absolute;
40
-  // background: rgba(255, 0, 0, 0.5);
40
+  background: rgba(255, 0, 0, 0.5);
41 41
   z-index: 10;
42 42
 }
43 43
 </style>

+ 221
- 0
src/components/CoverMap.vue View File

@@ -0,0 +1,221 @@
1
+<template>
2
+  <div class="cover-map">
3
+    <img :src="image" @load="onLoad" alt="" />
4
+    
5
+    <CoverBtn
6
+      v-for="(it, inx) in posList"
7
+      :key="it.name"
8
+      :center="btnCenters[inx]"
9
+      :width="60"
10
+      :height="20"
11
+      @click="() => onClick(it)"
12
+    >
13
+      <div v-if="it.mapGesture" class="gesture3" :class="{ hidden: gestureHide }" :style="getGestureStyle(60, 20)">
14
+        <i class="iconfont icon-cc-pointer-right"></i>
15
+      </div>
16
+    </CoverBtn>
17
+    
18
+    <AudioVue :audio="scenicSpots.audio" ref="audioRef" @play="playing = true" @stop="playing = false" />
19
+
20
+    <div v-if="show" class="map-info-box" :class="{ show }" @click.stop="show = false">
21
+      <div class="map-info-container" @click.stop="">
22
+        <img class="thumb" :src="scenicSpots.thumb2" alt="">
23
+        <div class="head">
24
+          <div>{{ scenicSpots.name }}</div>
25
+          <div>
26
+            <span @click="onClickAudio">
27
+              <i class="iconfont icon-playcircle" v-if="!playing"></i>
28
+              <i class="iconfont icon-pausecircle" v-else></i>
29
+            </span>
30
+            <span @click="onClickLoc"><i class="iconfont icon-map"></i></span>            
31
+          </div>
32
+        </div>
33
+        <div class="body">{{ scenicSpots.desc }}</div>  
34
+      </div>      
35
+      <div class="action" @click.stop="show = false">
36
+        <i class="iconfont icon-roundclose"></i>
37
+      </div>
38
+    </div>
39
+  </div>
40
+
41
+</template>
42
+
43
+<script setup>
44
+  import { ref } from 'vue';
45
+  import { resources } from '@/utils/resources';
46
+  import CoverBtn from './CoverBtn.vue';
47
+  import AudioVue from './Audio.vue';
48
+
49
+  const posList = resources.filter(x => x.mapBtnPos);
50
+  
51
+  const props = defineProps({
52
+    image: String,
53
+  });
54
+  
55
+  const show = ref(false);  
56
+  const gestureHide = ref(false);
57
+  const scenicSpots = ref({});
58
+  const audioRef = ref();
59
+  const playing = ref(false);
60
+  const btnCenters = ref([]);
61
+
62
+  const getGestureStyle = (width, height) => {
63
+    return {
64
+      left: `${width / 3}px`,
65
+      top: `${-1.6 * height}px`
66
+    }
67
+  };
68
+  
69
+  const onClick = it => {
70
+    scenicSpots.value = it;
71
+    show.value = true;
72
+    gestureHide.value = true;
73
+    stopAudio();
74
+  }
75
+  const onClickAudio = () => audioRef.value.toggle();
76
+  const stopAudio = () => {
77
+    if (playing.value) {
78
+      audioRef.value.toggle();
79
+      playing.value = false;
80
+    }
81
+  }
82
+  const onClickLoc = () => {
83
+    if (wx) {
84
+      wx.openLocation({
85
+        latitude: scenicSpots.value.mapPos[1], // 纬度,浮点数,范围为90 ~ -90
86
+        longitude: scenicSpots.value.mapPos[0], // 经度,浮点数,范围为180 ~ -180。
87
+        name: scenicSpots.value.name, // 位置名
88
+        address: '', // 地址详情说明
89
+        scale: 15, // 地图缩放级别,整型值,范围从1~28。默认为最大
90
+        infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转
91
+      });
92
+    }
93
+  }
94
+
95
+  const onLoad = e => {
96
+    const { width, height, naturalHeight, naturalWidth } = e.target;
97
+    const xRate = width / naturalWidth;
98
+    const yRate = height / naturalHeight;
99
+
100
+    btnCenters.value = posList.map(item => {
101
+      const pos = item.mapBtnPos;
102
+      return [xRate * pos[0], yRate * pos[1]];
103
+    });
104
+  }
105
+
106
+</script>
107
+
108
+<style lang="less" scoped>
109
+  .cover-map {
110
+    position: relative;
111
+
112
+    & > img {
113
+      display: block;
114
+      width: 100vw;
115
+    }
116
+
117
+    .map-info-box {
118
+      position: absolute;
119
+      left: 0;
120
+      top: 0;
121
+      width: 100%;
122
+      height: 100%;
123
+      z-index: 50;
124
+      background: transparent;
125
+      opacity: 0;
126
+      transition: opacity .6s ease-in-out;
127
+
128
+      &.show {
129
+        opacity: 1;
130
+      }
131
+
132
+      @space: 40px;
133
+
134
+      .map-info-container {
135
+        margin: calc(@space / 2) auto;
136
+        width: calc(100% - @space * 2);
137
+        height: calc(100% - @space * 2);
138
+        // padding: 1em;
139
+        border: 1em solid #fff;
140
+        border-radius: 8px;
141
+        box-shadow:2px 2px 3px #aaaaaa;
142
+        box-sizing: border-box;
143
+        background: #fff;
144
+        overflow-y: auto;
145
+        overflow-x: hidden;
146
+
147
+        .thumb {
148
+          width: 100%;
149
+        }
150
+
151
+        .head {
152
+          box-sizing: border-box;
153
+          padding: 1em 0;
154
+          border-bottom: 1px solid #f5f5f5;
155
+          display: flex;
156
+          justify-content: space-between;
157
+
158
+          .iconfont {
159
+            display: inline-block;
160
+            font-size: 24px;
161
+            padding: 0 4px;
162
+          }
163
+
164
+          & > div {
165
+            flex: none;
166
+          }
167
+        }
168
+
169
+        .body {
170
+          box-sizing: border-box;
171
+          padding: 1em 0;
172
+          line-height: 1.6em;
173
+          text-indent: 2em;
174
+        }
175
+      }
176
+
177
+      @actSize: 36px;
178
+      .action {
179
+        width: @actSize;
180
+        height: @actSize;
181
+        margin: auto;
182
+        border-radius: 50%;
183
+        background: #f1f1f1;
184
+        box-shadow:2px 2px 3px #aaaaaa;
185
+        display: flex;
186
+        align-items: center;
187
+
188
+        .iconfont {
189
+          font-size: @actSize;
190
+          color: #444;
191
+        }
192
+      }
193
+    }
194
+
195
+    
196
+    .gesture3 {
197
+      position: absolute;
198
+      z-index: 9;
199
+      animation: gestureAnimation3 1.6s ease-in-out infinite;
200
+
201
+      .iconfont {
202
+        font-size: 24px;
203
+      }
204
+
205
+      &.hidden {
206
+        display: none;
207
+      }
208
+    }
209
+
210
+    @keyframes gestureAnimation3 {
211
+      from {
212
+        opacity: 0;
213
+        transform: translateY(0) rotate(90deg);
214
+      }
215
+      to {
216
+        opacity: 1;
217
+        transform: translateY(12px) rotate(90deg);
218
+      }
219
+    }
220
+  }
221
+</style>

+ 2
- 1
src/components/CustMap.vue View File

@@ -148,7 +148,8 @@
148 148
       center,
149 149
       zooms,
150 150
       zoom: zooms[0],
151
-      // dragEnable: false, // 禁止拖动
151
+      dragEnable: false, // 禁止拖动
152
+      zoomEnable: false,
152 153
     });
153 154
 
154 155
     // 获取左上角经纬度

+ 3
- 1
src/components/Image.vue View File

@@ -3,7 +3,8 @@
3 3
     <img :src="resource.image" @load="onLoad" alt="" v-if="!isMap" />
4 4
 
5 5
     <!-- 导航地图 -->
6
-    <CustMap v-else :amap-key="resource.amap.key" :image="resource.image" />
6
+    <!-- <CustMap v-else :amap-key="resource.amap.key" :image="resource.image" /> -->
7
+    <CoverMap v-else :image="resource.image" />
7 8
 
8 9
     <!-- 配音 -->
9 10
     <ScenicAudio
@@ -38,6 +39,7 @@ import { computed, ref, watch } from "vue";
38 39
 import ScenicAudio from "./ScenicAudio.vue";
39 40
 import ScenicDetail from "./ScenicDetail.vue";
40 41
 import CustMap from "./CustMap.vue";
42
+import CoverMap from "./CoverMap.vue";
41 43
 import CoverBtn from "./CoverBtn.vue";
42 44
 
43 45
 const props = defineProps({

+ 17
- 0
src/components/InfoBox.vue View File

@@ -0,0 +1,17 @@
1
+<template>
2
+  <OverLay :visible="visible" @close="emit('close')">
3
+    1234
4
+  </OverLay>
5
+</template>
6
+
7
+<script setup>
8
+  import { ref } from 'vue';
9
+  import OverLay from './OverLay.vue';
10
+  
11
+  const props = defineProps({
12
+    visible: Boolean,
13
+  });
14
+  
15
+  const emit = defineEmits(['close']);
16
+  
17
+</script>

+ 120
- 0
src/components/OverLay.vue View File

@@ -0,0 +1,120 @@
1
+<template>
2
+  <Teleport to="body">
3
+    <div class="overlay" :class="{ hidden: !visible }">
4
+      <div v-if="mask" class="mask"></div>
5
+
6
+      <div class="container" @click.stop="onClickMask">
7
+        <div class="content">
8
+          <slot></slot>
9
+        </div>
10
+        <div class="close" @click="emit('close')">
11
+          <i class="iconfont icon-roundclose"></i>
12
+        </div>
13
+      </div>
14
+
15
+    </div>
16
+  </Teleport>
17
+</template>
18
+
19
+<script setup>
20
+  import { watch } from 'vue';
21
+  const props = defineProps({
22
+    visible: Boolean,
23
+    showClose: {
24
+      type: Boolean,
25
+      default: true,
26
+    },
27
+    mask: Boolean,
28
+    closeOnMask: {
29
+      type: Boolean,
30
+      default: true,
31
+    },
32
+  });
33
+
34
+  const emit = defineEmits(['close']);
35
+
36
+  const onClickMask = () => {
37
+    console.debug('click mask');
38
+    if (props.closeOnMask) {
39
+      emit('close');
40
+    }
41
+  }
42
+
43
+  const origin = document.body.style.overflow;
44
+  watch(() => props.visible, (val) => {
45
+    if (val) {
46
+      document.body.style.overflow = 'hidden';
47
+    } else {
48
+      document.body.style.overflow = origin;
49
+    }
50
+  }, { immediate: true });
51
+</script>
52
+
53
+<style lang="less" scoped>
54
+  .overlay {
55
+    position: fixed;
56
+    top: 0;
57
+    left: 0;
58
+    width: 100vw;
59
+    height: 100vh;
60
+    overflow: hidden;
61
+    z-index: 2000;
62
+    opacity: 1;
63
+    will-change: opacity;
64
+    transition: opacity .1s ease-out;
65
+
66
+    &.hidden {
67
+      opacity: 0;
68
+    }
69
+
70
+    .mask {
71
+      position: absolute;
72
+      top: 0;
73
+      left: 0;
74
+      width: 100%;
75
+      height: 100%;
76
+      background: rgba(0, 0, 0, .5);
77
+      z-index: 0;
78
+    }
79
+
80
+    .container {
81
+      position: relative;
82
+      width: 100%;
83
+      height: 100%;
84
+      display: flex;
85
+      flex-direction: column;
86
+      justify-content: center;
87
+      align-items: center;
88
+      z-index: 1;
89
+
90
+      .content {
91
+        flex: none;
92
+        border: 1em solid #fff;
93
+        border-radius: 8px;
94
+        box-shadow:2px 2px 3px #aaaaaa;
95
+        box-sizing: border-box;
96
+        background: #fff;
97
+        overflow-y: auto;
98
+        overflow-x: hidden;
99
+      }
100
+
101
+      .close {
102
+        flex: none;
103
+        margin-top: 1em;
104
+        width: 36px;
105
+        height: 36px;
106
+        border-radius: 50%;
107
+        background: #f1f1f1;
108
+        box-shadow:2px 2px 3px #aaaaaa;
109
+        display: flex;
110
+        align-items: center;
111
+
112
+        .iconfont {
113
+          font-size: 36px;
114
+          color: #444;
115
+        }
116
+      }
117
+    }
118
+
119
+  }
120
+</style>

+ 1
- 1
src/main.js View File

@@ -9,7 +9,7 @@ import wxsdk from './utils/wx'
9 9
 const { share } = wxsdk(location.href)
10 10
 
11 11
 const app = createApp(App);
12
-app.use(VueViewer)
12
+app.use(VueViewer);
13 13
 app.use(store);
14 14
 app.mount('#app');
15 15
 

+ 49
- 22
src/utils/resources.js View File

@@ -17,21 +17,28 @@ export const resources = [
17 17
     image: './images/封面2.jpg',
18 18
   },
19 19
   {
20
-    image: borders[0],
21
-    hidden: true,
22
-  },
23
-  {
24
-    image: borders[1],
25
-    hidden: true,
26
-  },
27
-  {
28
-    image: borders[2],
29
-    hidden: true,
30
-  },
31
-  {
32
-    image: borders[3],
33
-    hidden: true,
34
-  },
20
+    type: 'map',
21
+    image: './map/map.jpg',
22
+    // amap: {
23
+    //   key: AMAP_KEY,
24
+    // },
25
+  },
26
+  // {
27
+  //   image: borders[0],
28
+  //   hidden: true,
29
+  // },
30
+  // {
31
+  //   image: borders[1],
32
+  //   hidden: true,
33
+  // },
34
+  // {
35
+  //   image: borders[2],
36
+  //   hidden: true,
37
+  // },
38
+  // {
39
+  //   image: borders[3],
40
+  //   hidden: true,
41
+  // },
35 42
   {
36 43
     name: '文德桥',
37 44
     showGesture: true,
@@ -42,6 +49,7 @@ export const resources = [
42 49
     playBtnPos: [373, 858],
43 50
     virtaulPos: [118.80256, 31.961141],  // 地图位置, 数据是假的,只是为了映射地图图片上的点
44 51
     mapPos: [118.789301, 32.019248],
52
+    mapBtnPos: [1142, 1396],
45 53
     audio: './audios/1文德桥.mp3',
46 54
     desc: `文德桥位于江苏省南京市秦淮区夫子庙泮池西侧,地处夫子庙秦淮风光带,始建于明朝万历年间,后历代均有修葺,相传为李白醉酒捞月之地,后世为以示纪念,在桥旁辟建得月台。“文德桥”的“文德”二字取自儒家思想“文章道德天下第一”。由于这座桥正处在地球的子午线上,所以每逢农历十一月十五日子时,皓月当空,水中月亮正好被这座桥分为东西两边各一半,这一奇观被称为“文德分月”,又称为“文德桥半边月”。`,
47 55
   },
@@ -54,6 +62,7 @@ export const resources = [
54 62
     playBtnPos: [375, 882],
55 63
     virtaulPos: [118.800714, 31.968786],
56 64
     mapPos: [118.78712, 32.07729],
65
+    mapBtnPos: [972, 538],
57 66
     audio: './audios/2玄武湖后湖印月.mp3',
58 67
     desc: `“地拥金陵势,城回江水流。当时百万户,夹道起朱楼。亡国生春草,王宫没古丘。空余后湖月,波上对瀛州。” “后湖”是玄武湖的另一个名字,湖边赏月的李白沉浸在对历史的凭吊之中,写下了《金陵三首》,这首诗是《金陵三首》的第二篇,著名的“后湖映月”景观正是取自这首诗。一轮明月映照着波光粼粼的玄武湖,这美不胜收的场景,至今依然令南京人趋之若鹜。`,
59 68
   },
@@ -66,6 +75,8 @@ export const resources = [
66 75
     playBtnPos: [376, 752],
67 76
     virtaulPos: [118.793289, 31.971917],
68 77
     mapPos: [118.750487, 32.110156],
78
+    mapBtnPos: [261, 181],
79
+    mapGesture: true,
69 80
     audio: './audios/3南京长江大桥.mp3',
70 81
     desc: `南京长江大桥位于南京市鼓楼区下关和浦口区桥北之间,是长江上第一座由中国自行设计和建造的双层式铁路、公路两用桥梁,具有极大的经济意义、政治意义和战略意义,有“争气桥”之称。大桥由正桥、南北桥头堡和南北引桥组成,正桥分上下两层,上层为公路桥,正桥长1577米,4车道的宽度,车行道宽15米,可容4辆大型汽车并行,两侧人行道各宽2.25米。下层为铁路桥,全长6772米,宽14米,铺设双轨,两列火车可同时对开。正桥长1576米,其余为引桥,公路引桥长3012米,宽19.5米。`,
71 82
   },
@@ -78,6 +89,7 @@ export const resources = [
78 89
     playBtnPos: [325, 988],
79 90
     virtaulPos: [118.797495, 31.971298],
80 91
     mapPos: [118.748536, 32.0944],
92
+    mapBtnPos: [652, 257],
81 93
     audio: './audios/4阅江楼.mp3',
82 94
     desc: `阅江楼景区位于南京城西北狮子山巅,濒临长江。明洪武七年(1374年),明太祖朱元璋欲修未成,现建筑为2001年9月竣工景观;因明初文学家宋濂所撰《阅江楼记》而闻名,是江南四大名楼和中国十大历史文化名楼之一,有“江南第一楼”之称。阅江楼隐喻阅江揽胜之意,主楼通高52米,外观4层暗有3层,共7层,碧瓦朱楹、彤扉彩盈,具有鲜明的古典皇家气派,为典型的明代皇家建筑风格,总建筑面积约5000平方米。`,
83 95
   },
@@ -90,6 +102,7 @@ export const resources = [
90 102
     playBtnPos: [276, 865],
91 103
     virtaulPos: [118.801529, 31.962706],
92 104
     mapPos: [118.782483, 32.017197],
105
+    mapBtnPos: [1048, 1230],
93 106
     audio: './audios/5秦淮河.mp3',
94 107
     desc: `秦淮河是南京古老文明的摇篮。十里秦淮沿河两岸自东吴以来便一直是繁华的商业区的居民地,六朝时成为名门望族聚居之地,商贾云集,文人荟萃,儒学鼎盛。隋唐以后,渐趋衰落,却引来无数文人骚客来此凭吊,到了宋代逐渐复苏为江南文教中心。明清两代,是十里秦淮的鼎盛时期。清未民初,内秦淮河日渐式微,繁华不再。直至1949年后,南京对秦淮河进行了大规模的疏浚治理,重点开发了秦淮风光带。2010年4月,夫子庙秦淮风光带被评为国家5A级旅游景区,2021年10月,夫子庙秦淮风光带入选首批国家级夜间文化和旅游消费集聚区。`,
95 108
   },
@@ -102,6 +115,7 @@ export const resources = [
102 115
     playBtnPos: [427, 839],
103 116
     virtaulPos: [118.805348, 31.96034],
104 117
     mapPos: [118.78964, 32.018653],
118
+    mapBtnPos: [1404, 1488],
105 119
     audio: './audios/6乌衣巷.mp3',
106 120
     desc: `乌衣巷位于南京市秦淮区秦淮河上文德桥旁的南岸,地处夫子庙秦淮风光带核心地带,是中国历史最悠久最著名的古巷,当时中国世家大族居住之地,三国时是吴国戍守石头城部队营房所在地。乌衣巷是晋代王谢两家豪门大族的宅第,两族子弟都喜欢穿乌衣以显身份尊贵,因此得名。乌衣巷门庭若市,冠盖云集,走出了王羲之、王献之,及山水诗派鼻祖谢灵运等文化巨匠。1997年,秦淮区人民政府恢复了乌衣巷,并重建了具有民族风格的王谢古居纪念馆。历经千年的沧桑,如今的乌衣巷已不复昔日的繁华,没有豪门士族的觥筹交错,取而代之的是游人探访王谢华堂踪迹。`,
107 121
   },
@@ -114,6 +128,7 @@ export const resources = [
114 128
     playBtnPos: [426, 765],
115 129
     virtaulPos: [118.800499, 31.971954],
116 130
     mapPos: [118.817183, 32.146767],
131
+    mapBtnPos: [939, 177],
117 132
     audio: './audios/7燕子矶.mp3',
118 133
     desc: `燕子矶位于江苏省南京市栖霞区江边的直渎山上,三面悬绝,突兀江上,如燕子般欲展翅飞掠江面,故得名燕子矶。直渎山并不高,只有四十多米,却地势险要,燕子矶雄踞山上,总扼大江,在古代是渡江的绝佳渡口和扼守古都南京的军事重地。燕子矶因其独特的地理位置和重要性,被称为万里长江第一矶,位列长江三矶之首。`,
119 134
   },
@@ -126,6 +141,7 @@ export const resources = [
126 141
     playBtnPos: [376, 769],
127 142
     virtaulPos: [118.80346, 31.972609],
128 143
     mapPos: [118.967661, 32.155476],
144
+    mapBtnPos: [1228, 115],
129 145
     audio: './audios/8栖霞山.mp3',
130 146
     desc: `栖霞山,位于南京市栖霞区,古称摄山,南朝时山中建有“栖霞精舍”,因此得名。栖霞山被誉为“金陵第一明秀山”,是国家AAAA级旅游景区、中国四大赏枫胜地之一。历史上曾有五王十四帝登临栖霞山,其中乾隆六下江南,五次驻跸栖霞山。栖霞山素有“六朝胜迹”之称,在明代被列为“金陵四十八景”之一,有“一座栖霞山,半部金陵史”的美誉。栖霞山历史古迹遗址80多处,荟萃了宗教文化、帝王文化、绿色文化、民俗文化、地质文化、石刻文化、茶文化。千年古刹、佛学“三论宗”祖庭、佛教“四大丛林”之一的古栖霞寺就座落在栖霞山西麓。`,
131 147
   },
@@ -138,6 +154,7 @@ export const resources = [
138 154
     playBtnPos: [375, 1050],
139 155
     virtaulPos: [118.799555, 31.963617],
140 156
     mapPos: [118.77531, 32.03433],
157
+    mapBtnPos: [853, 1117],
141 158
     audio: './audios/9朝天宫.mp3',
142 159
     desc: `朝天宫位于南京市秦淮区水西门内,是江南地区现存建筑等级最高、规模最大、保存最为完整的明清官式古建筑群落 ,素有“金陵第一胜迹”之美誉。朝天宫东为府学,中为文庙,西为卞壸祠。朝天宫之名,由明太祖朱元璋下诏御赐,取“朝拜上天”、“朝见天子”之意,是明代皇室贵族焚香祈福的道场和节庆前文武百官演习朝拜天子礼仪的场所。朝天宫与神乐观同为明朝最高等级的皇家道观。朝天宫是典型的明清殿宇式建筑,其建筑格局、样式、营造技术等是研究中国古代建筑,特别是研究明清建筑重要而难得的实物资料,具有极高的历史、艺术和科学价值。`,
143 160
   },
@@ -150,6 +167,7 @@ export const resources = [
150 167
     playBtnPos: [108, 780],
151 168
     virtaulPos: [118.798224, 31.969951],
152 169
     mapPos: [118.794014, 32.077864],
170
+    mapBtnPos: [730, 406],
153 171
     audio: './audios/10玄武湖梁洲.mp3',
154 172
     desc: `梁洲是玄武湖五洲之一,面积8.81公顷,曾名老洲、旧洲、祖洲、莲花洲和美洲,是玄武湖开辟最早的一个洲,为昭明太子编《文选》的读书处,有“梁园”之称,故称梁洲。此洲擅全湖之胜,开明代后湖黄册库之滥觞。洲上人文荟萃,分布着湖神庙遗址、明代黄册库历史文化展馆、览胜楼、闻鸡亭、友谊厅、金陵盆景园等景点。每年一度的玄武湖菊展在此举行,有“梁洲秋菊”之美称。`,
155 173
   },
@@ -162,6 +180,7 @@ export const resources = [
162 180
     playBtnPos: [418, 715],
163 181
     virtaulPos: [118.794791, 31.969405],
164 182
     mapPos: [118.796622, 32.062437],
183
+    mapBtnPos: [400, 468],
165 184
     audio: './audios/11玄武湖台城.mp3',
166 185
     desc: `台城位于南京市玄武区北极阁北麓、玄武湖以南,是从解放门向西延伸出的一段明城墙,这段城墙下设有南京明城垣史博物馆。这段城墙以条石为城基,城基之上用明初烧制的城砖包砌,长253.15米、高20.16米,西端宽9.8米,东端宽10.3米。明太祖朱元璋筑应天府城时,原计划将这段城墙向西修至鼓楼岗并与石头城相接,明朝洪武十九年“新筑后湖城”,这一段城墙便遭废弃。明代后多将这段城墙附会为东晋至南陈时期的台城,并讹传。`,
167 186
   },
@@ -174,6 +193,7 @@ export const resources = [
174 193
     playBtnPos: [328, 874],
175 194
     virtaulPos: [118.80419, 31.96966],
176 195
     mapPos: [118.847882, 32.071012],
196
+    mapBtnPos: [1300, 430],
177 197
     audio: './audios/12紫金山.mp3',
178 198
     desc: `钟山风景名胜区位于江苏省南京市玄武区紫金山,简称钟山风景区,是中国著名的风景游览胜地、首批国家级风景名胜区、首批国家5A级旅游景区、国家森林公园、国家文明风景名胜区、中国旅游胜地四十佳,自古被誉为江南四大名山,有钟山龙蟠的美誉。钟山因山顶常有紫云萦绕,又得名紫金山。紫金山中世界文化遗产1处,全国重点文物保护单位15处,江苏省文物保护单位和市级文物保护单位共31处,“中山伟陵”是金陵新四十景之一。`,
179 199
   },
@@ -186,6 +206,7 @@ export const resources = [
186 206
     playBtnPos: [378, 920],
187 207
     virtaulPos: [118.795993, 31.966611],
188 208
     mapPos: [118.756291, 32.04818],
209
+    mapBtnPos: [521, 785],
189 210
     audio: './audios/13石头城.mp3',
190 211
     desc: `清凉山古名石头山、石首山、石头城,有“六朝胜迹”之称,园内众多的名胜古迹和历史文化遗址,形成了深厚的历史文化底蕴。诸葛亮曾称金陵形势为“虎踞龙蟠”,虎踞就指今清凉山。战国时楚威王于此置金陵邑,山存有城,名石城山。三国时,东吴改筑石头城,亦名石头山。南唐时曾建避暑行宫于山上。北宋时更名清凉山,后沿用。清代时候的清凉山环境优雅,香烟缭绕,漫山古木参天,浓荫蔽日,清凉寺、扫叶楼等掩映在绿树之中。清“金陵四十八景”中,清凉山占有两个:“石城霁雪”、“清凉问佛”。`,
191 212
   },
@@ -198,6 +219,7 @@ export const resources = [
198 219
     playBtnPos: [588, 827],
199 220
     virtaulPos: [118.794147, 31.962925],
200 221
     mapPos: [118.762613, 32.035341],
222
+    mapBtnPos: [337, 1199],
201 223
     audio: './audios/14莫愁湖公园.mp3',
202 224
     desc: `莫愁湖公园,位于南京市建邺区外秦淮河西侧,是一座具有1500年悠久历史的古典名园,也是南京市著名的历史文化名片,自古有“金陵第一名胜”、“金陵四十八景之首”等美誉。公园区现有规划用地面积约51.04公顷,其中陆地18.71公顷,湖面32.33公顷,绿化覆盖率达70%以上。海棠、荷花、龙舟及红木文化为景区四大传统特色,每年均会依托四大文化特色举办多彩的园事花事活动,取得了一定知名度和影响力,深受广大市民游客好评。`,
203 225
   },
@@ -210,6 +232,7 @@ export const resources = [
210 232
     playBtnPos: [157, 828],
211 233
     virtaulPos: [118.793933, 31.963544],
212 234
     mapPos: [118.768765, 32.028598],
235
+    mapBtnPos: [314, 1127],
213 236
     audio: './audios/15赏心亭.mp3',
214 237
     desc: `赏心亭位于南京市秦淮区水西门广场西侧外,是一处历史名胜,宋代的金陵胜迹,历代文人均有登临怀古。赏心亭始建于宋代,曾是南京水西门内一处名胜,曾数毁数建。陆游和辛弃疾等古代文学大家都曾登临览胜,赋诗填词。在历史考证和现场调查的基础上,经过专家论证,并参照《营造法式》等宋代建筑书籍和现存宋代建筑的建造手法,在水西门西广场复建赏心亭,建筑风格延续秦淮风光带的明清建筑风格,采用宋代官式风格,八角歇山顶,灰筒瓦屋面。`,
215 238
   },
@@ -222,6 +245,7 @@ export const resources = [
222 245
     playBtnPos: [258, 906],
223 246
     virtaulPos: [118.797152, 31.959684],
224 247
     mapPos: [118.78147, 32.01086],
248
+    mapBtnPos: [632, 1559],
225 249
     audio: './audios/16长干里.mp3',
226 250
     desc: `长干里位于南京市秦淮区内秦淮河以南至雨花台以北,是中国古代著名的地名,是江南佛教圣地,素有“佛陀里”之美誉。长干里地势高亢,雨花台陈于前,秦淮河卫其后,大江护其西,又是秦淮河的入江通道,战略地位十分重要。南京城市的雏形——越城就位于此。范蠡之所以选择在此筑越城,就是看到这块地方物产丰富,交通便利,商业繁荣,人中密集,同时,这里有山水卫护,攻守皆宜。秦、汉、六朝时期,长干里是南京最繁华的地方,是著名的商业区和货物集散地。`,
227 251
   },
@@ -234,6 +258,7 @@ export const resources = [
234 258
     playBtnPos: [369, 940],
235 259
     virtaulPos: [118.802001, 31.959284],
236 260
     mapPos: [118.782965, 32.009248],
261
+    mapBtnPos: [1089, 1604],
237 262
     audio: './audios/17报恩寺.mp3',
238 263
     desc: `大报恩寺遗址公园位于南京市秦淮区中华门外(长干里附近),北邻外秦淮河,南接雨花台,东至1865园区,西至雨花路,是“规格最高、规模最大、保存最完整”的中国古代寺庙遗址。遗址公园中保护性展示了大报恩寺遗址中的千年地宫和珍贵画廊,以及从地宫中出土的石函、铁函、七宝阿育王塔、金棺银椁等世界级国宝,是夫子庙秦淮风光带重要组成部分。`,
239 264
   },
@@ -246,6 +271,7 @@ export const resources = [
246 271
     playBtnPos: [538, 977],
247 272
     virtaulPos: [118.79801, 31.960886],
248 273
     mapPos: [118.769413, 32.014398],
274
+    mapBtnPos: [706, 1426],
249 275
     audio: './audios/18凤凰台.mp3',
250 276
     desc: `凤凰台位于南京市秦淮区长干里西北侧凤凰山上。杜牧《清明》诗中的杏花村就在附近,“竹林七贤”之一阮籍的衣冠冢也坐落于此。建成的古凤凰台景区占地2.2万平方米,主体建筑凤凰楼高25米,建筑面积1500平方米,远望则巍峨壮观,近观则雕梁彩绘。登高远眺,东接河西新区,西枕长江浪波,南抱三山葱茏,北临万家灯火,大江风貌尽收眼底,是一处叹为观止的胜地。`,
251 277
   },
@@ -258,6 +284,7 @@ export const resources = [
258 284
     playBtnPos: [418, 889],
259 285
     virtaulPos: [118.804576, 31.963216],
260 286
     mapPos: [118.794033, 32.022665],
287
+    mapBtnPos: [1339, 1164],
261 288
     audio: './audios/19桃叶渡.mp3',
262 289
     desc: `桃叶渡是南京古名胜之一,位列于金陵四十八景内。在原渡口处立有“桃叶渡碑”,并建有“桃叶渡亭”,从六朝到明清,桃叶渡处均为繁华地段,河舫竞立,灯船萧鼓。传说东晋书法家王献之有个爱妾叫“桃叶”,她往来于秦淮两岸时,王献之放心不下,常常都亲自在渡口迎送,并为之作《桃叶歌》:“桃叶复桃叶,渡江不用楫;但渡无所苦,我自迎接汝。”从此渡口名声大噪久而久之南浦渡也就被称呼为桃叶渡了。`,
263 290
   },
@@ -270,6 +297,7 @@ export const resources = [
270 297
     playBtnPos: [378, 1045],
271 298
     virtaulPos: [118.793933, 31.960194],
272 299
     mapPos: [118.781951, 31.997942],
300
+    mapBtnPos: [329, 1508],
273 301
     audio: './audios/20雨花台.mp3',
274 302
     desc: `雨花台最早记载于公元前1147年,泰伯在这一带传礼授农,南梁天监六年,城南门外高座寺的云光法师常在此设坛说法,感动上苍竟落花如雨,唐朝时改名为雨花台,并沿用至今。雨花台是新民主主义革命时期中国共产党人和爱国志士最集中的殉难地,新中国成立后,党和政府决定在此兴建雨花台烈士陵园,这里是中国新民主主义革命的纪念圣地。雨花台现为首批全国廉政教育基地、全国百家红色旅游经典景区和江苏省首批党性教育现场教学基地。`,
275 303
   },
@@ -282,6 +310,7 @@ export const resources = [
282 310
     playBtnPos: [378, 822],
283 311
     virtaulPos: [118.796165, 31.95739],
284 312
     mapPos: [118.74728, 31.896331],
313
+    mapBtnPos: [529, 1817],
285 314
     audio: './audios/21牛首山.mp3',
286 315
     desc: `牛首山,是中国佛教名山,文化底蕴深厚,是佛教牛头禅宗的开教处和发祥地。山周围有感应泉、虎跑泉、白龟池、兜率岩、文殊洞、辟支洞、含虚阁、地涌泉、饮马池等自然景观,及宏觉寺、弘觉寺塔、郑和墓和抗金故垒等人文景观。牛首山属于宁镇丘陵西段南支,山高248米,因东西双峰对峙形似牛角而得名,风景宜人,有“春牛首”之称。清乾隆年间“牛首烟岚”列入金陵四十八景中。`,
287 316
   },
@@ -294,6 +323,7 @@ export const resources = [
294 323
     playBtnPos: [306, 985],
295 324
     virtaulPos: [118.800971, 31.957136],
296 325
     mapPos: [118.91752, 31.46876],
326
+    mapBtnPos: [976, 1846],
297 327
     audio: './audios/22石臼湖.mp3',
298 328
     desc: `石臼湖,位于江苏省南京市溧水区、高淳区和安徽省马鞍山市当涂县、博望区三区一县交界,是古丹阳湖的一部分,最大面积200多平方公里,湖泊具有灌溉、蓄洪、航运和养殖等多种功能。湖区物产资源丰富,其中以银鱼、螃蟹、野鸭等“三珍”最为出名。石臼湖被人们赞誉为“日出一斗金,夜出一斗银”。但由于无节制捕捞,最晚在21世纪初,银鱼等珍贵品种已经消失。“石臼渔歌”是新金陵四十景之一。`,
299 329
   },
@@ -306,6 +336,7 @@ export const resources = [
306 336
     playBtnPos: [639, 816],
307 337
     virtaulPos: [118.803589, 31.958155],
308 338
     mapPos: [118.839137, 31.955481],
339
+    mapBtnPos: [1242, 1729],
309 340
     audio: './audios/23东山.mp3',
310 341
     desc: `东山亦名土山,高62.1米,东晋丞相谢安受命抗御前秦符坚百万南侵之师,谢安一面派名将率8万精兵迎战,一面与家人、朋友至东山别墅“围棋睹墅”安定民心。淝水一战击溃符坚大军,创以少胜多之范例。东山留有“东山别墅”遗址。东山历史上多林木,且“山多蔷薇,春来作花,灿如云锦,故游迹胜矣”。`,
311 342
   },
@@ -318,6 +349,7 @@ export const resources = [
318 349
     playBtnPos: [205, 768],
319 350
     virtaulPos: [118.796422, 31.961796],
320 351
     mapPos: [118.785171, 32.021043],
352
+    mapBtnPos: [568, 1320],
321 353
     audio: './audios/24瞻园.mp3',
322 354
     desc: `瞻园位于江苏省南京市秦淮区夫子庙秦淮风光带核心区,是南京现存历史最久的明代古典园林、“江南四大名园”之一。其历史可追溯至明太祖朱元璋称帝前的吴王府,后赐予中山王徐达的府邸花园,素以假山著称,以欧阳修诗“瞻望玉堂,如在天上”而命名,明代被称为“南都第一园”。现为全国重点文物保护单位、国家AAAAA级旅游景区。`,
323 355
   },
@@ -330,6 +362,7 @@ export const resources = [
330 362
     playBtnPos: [367, 1107],
331 363
     virtaulPos: [118.796207, 31.963908],
332 364
     mapPos: [118.767671, 32.053006],
365
+    mapBtnPos: [540, 1084],
333 366
     audio: './audios/25随园.mp3',
334 367
     desc: `随园位于南京五台山余脉小仓山一带,原为曹雪芹祖上林园,是著名的私家江南园林,清代江南的三大名园之一,现地面主体建筑均已不存,仅存遗址。清乾隆十三年,袁枚购得此园,名之为“随园”,死后即葬于随园。随园在太平天国时期被夷为平地,片橼无存。后太平军开荒种粮,拆毁随园,将园中珍宝运走,天下名园成为了农庄。1923年7月,金陵女子大学校址永久移至随园,随园原为江苏省文物保护单位。`,
335 368
   },
@@ -342,16 +375,10 @@ export const resources = [
342 375
     playBtnPos: [376, 939],
343 376
     virtaulPos: [118.797752, 31.965983],
344 377
     mapPos: [118.794237, 32.058407],
378
+    mapBtnPos: [693, 853],
345 379
     audio: './audios/26南京世界文学客厅.mp3',
346 380
     desc: `南京世界文学客厅位于南京紫金山入城余脉、古鸡笼山下东南角,由一座3000平方米的院落改造而成。1500多年前,这里是中国历史上第一座文学馆所在地,而今是南京文学空间网络建设的中心和枢纽,承担了南京文学空间城市空间建设引领性的作用,打造“文学之都”的城市客厅、交流展示中心、文学创新活动的试验场,展示南京的文学文脉和作为天下文枢的独特地位,链接全市文学空间与地标,建立数据共享系统,促进文学互动展示体验与文学创作创新。`,
347 381
   },
348
-  {
349
-    type: 'map',
350
-    image: './map/map.png',
351
-    amap: {
352
-      key: AMAP_KEY,
353
-    },
354
-  },
355 382
   {
356 383
     image: './images/27末尾.jpg',
357 384
     links: [