SPG.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <template>
  2. <Password />
  3. <LoadingLogo :thumb="true" />
  4. <div class="ui-view-layout" :class="{ show: show }">
  5. <div class="scene" ref="scene$"></div>
  6. <!-- <template v-show="sceneUi"> -->
  7. <div v-show="sceneUI">
  8. <UiTags />
  9. <Information />
  10. <BottomControl />
  11. </div>
  12. <!-- </template> -->
  13. </div>
  14. <DesignOption />
  15. <Camera />
  16. </template>
  17. <script setup>
  18. import { useMusicPlayer } from '@/utils/sound'
  19. // import UiTags from '@/components/Tags'
  20. import UiTags from '@/components/Tags'
  21. import DesignOption from './DesignOption'
  22. import Information from '@/components/Information'
  23. import BottomControl from '@/components/Controls/BottomControl'
  24. import Password from '@/components/shared/Password.vue'
  25. import LoadingLogo from '@/components/shared/Loading.vue'
  26. import Camera from '@/components/Camera'
  27. import { createApp } from '@/app'
  28. import { ref, onMounted, computed } from 'vue'
  29. import { useStore } from 'vuex'
  30. import { useApp, getApp } from '@/app'
  31. import browser from '@/utils/browser'
  32. import { useI18n, getLocale } from '@/i18n'
  33. import { Track, startTrack, endTrack } from '@/utils/track.js'
  34. import { nextTick } from 'process'
  35. const { t } = useI18n({ useScope: 'global' })
  36. const musicPlayer = useMusicPlayer()
  37. const store = useStore()
  38. const show = ref(false)
  39. const scene$ = ref(null)
  40. const tours = computed(() => store.getters['tour/tours'])
  41. const isPlay = computed(() => store.getters['tour/isPlay'])
  42. const sceneUI = computed(() => store.getters['sceneUI'])
  43. const mode = computed(() => store.getters['mode'])
  44. onMounted(() => {
  45. const app = createApp({
  46. num: browser.getURLParam('m'),
  47. dom: scene$.value,
  48. lang: getLocale(),
  49. langs: {
  50. en: {
  51. 'model.enter': t('model.enter'),
  52. 'common.about': t('common.about'),
  53. 'common.meter': t('common.meter'),
  54. },
  55. },
  56. useShortcutKeys: true,
  57. })
  58. app.use('MinMap')
  59. app.use('Tag')
  60. // app.use('TourRecorder')
  61. app.use('TourPlayer')
  62. app.TourManager.on('loaded', list => {
  63. store.commit('tour/loaded', list)
  64. })
  65. app.Scene.lock()
  66. app.Scene.on('ready', () => {
  67. endTrack('view-timing', {
  68. eventType: 'time',
  69. time: 'first',
  70. })
  71. show.value = true
  72. })
  73. app.Scene.on('error', data => {
  74. console.error(data)
  75. switch (data.code) {
  76. case 5033:
  77. window.location.replace(`/5033.html?m=` + browser.getURLParam('m') + '&lang=' + (browser.getURLParam('lang') || 'zh'))
  78. break
  79. case 5034:
  80. window.location.replace(`/5034.html?m=` + browser.getURLParam('m') + '&lang=' + (browser.getURLParam('lang') || 'zh'))
  81. break
  82. case 5009:
  83. window.location.replace(`/5034.html?m=` + browser.getURLParam('m') + '&lang=' + (browser.getURLParam('lang') || 'zh'))
  84. break
  85. case 5005:
  86. window.location.replace(`/#/404.html?m=` + browser.getURLParam('m') + '&lang=' + (browser.getURLParam('lang') || 'zh'))
  87. break
  88. }
  89. })
  90. app.Scene.on('loaded', pano => {
  91. store.commit('setPanoId', pano.id)
  92. endTrack('view-timing', {
  93. eventType: 'time',
  94. time: 'all',
  95. })
  96. nextTick(() => {
  97. let map = document.querySelector('.kankan-app div[xui_min_map]')
  98. map.addEventListener('click', () => {
  99. Track('view-button', {
  100. eventType: 'click',
  101. click: 'minimap',
  102. })
  103. })
  104. })
  105. store.commit('setFloorId', pano.floorIndex)
  106. useMusicPlayer()
  107. })
  108. app.store.on('tags', tags => {
  109. store.commit('tag/load', tags)
  110. })
  111. app.store.on('cameras', cameras => {
  112. store.commit('camera/setData', { cameras })
  113. })
  114. app.store.on('metadata', metadata => {
  115. store.commit('scene/load', metadata)
  116. if (!metadata.controls.showMap) {
  117. app.MinMap.hide(true)
  118. }
  119. })
  120. app.Scene.on('panorama.videorenderer.resumerender', () => {
  121. musicPlayer.pause(true)
  122. })
  123. app.Scene.on('panorama.videorenderer.suspendrender', async () => {
  124. let player = await getApp().TourManager.player
  125. if (!player.isPlaying && !isPlay.value) {
  126. musicPlayer.resume()
  127. }
  128. })
  129. app.Camera.on('mode.beforeChange', ({ fromMode, toMode, floorIndex }) => {
  130. if (fromMode) {
  131. store.commit('setFlying', true)
  132. }
  133. })
  134. app.Camera.on('mode.afterChange', ({ toMode, floorIndex }) => {
  135. store.commit('setFlying', false)
  136. })
  137. app.Camera.on('flying.started', pano => {
  138. store.commit('setFlying', true)
  139. })
  140. app.Camera.on('flying.ended', ({ targetPano }) => {
  141. if (mode.value == 'panorama') {
  142. if (targetPano.hasVideo) {
  143. Track('view-pano-type', {
  144. eventType: 'click',
  145. click: 2,
  146. })
  147. } else {
  148. Track('view-pano-type', {
  149. eventType: 'click',
  150. click: 1,
  151. })
  152. }
  153. }
  154. store.commit('setFlying', false)
  155. store.commit('setPanoId', targetPano.id)
  156. })
  157. // app.store.on('tour', async tour => {
  158. // app.TourManager.load(tour)
  159. // store.commit('tour/setData', {
  160. // tours: JSON.parse(
  161. // JSON.stringify(app.TourManager.tours, (key, val) => {
  162. // if (key === 'audio') {
  163. // return null
  164. // } else {
  165. // return val
  166. // }
  167. // })
  168. // ),
  169. // })
  170. // store.commit('tour/setBackUp', {
  171. // tours: JSON.parse(
  172. // JSON.stringify(app.TourManager.tours, (key, val) => {
  173. // if (key === 'audio') {
  174. // return null
  175. // } else {
  176. // return val
  177. // }
  178. // })
  179. // ),
  180. // })
  181. // })
  182. app.store.on('floorcad', floor => store.commit('scene/loadFloorData', floor))
  183. app.render()
  184. })
  185. </script>