Toolbox.Content.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <template>
  2. <ui-editor-toolbox>
  3. <ul class="edit-list">
  4. <li>
  5. <div class="title">
  6. <span>{{ $t('info.toolbox.music') }}</span>
  7. <label @click="onUpload">
  8. <ui-icon :tip="$t('info.toolbox.uploadMusic')" tipH="right" type="uploading" />
  9. </label>
  10. </div>
  11. <div>
  12. <ui-input type="select" :options="musics" width="100%" :placeholder="$t('common.none')" v-model="music" stop-el="i">
  13. <template v-slot:option="{ raw }">
  14. <div :class="{ 'music-user': raw.user }">
  15. <div>{{ raw.label }}</div>
  16. <!-- <div>{{ raw.user ? raw.value : $t(`info.musics.${raw.value}`) }}</div> -->
  17. <span v-show="raw.user" @click.stop="onDeleteUpload(raw)"><i class="iconfont icon-del"></i></span>
  18. </div>
  19. </template>
  20. </ui-input>
  21. </div>
  22. </li>
  23. <li>
  24. <div class="title">
  25. <span>{{ $t('info.toolbox.share') }}</span>
  26. </div>
  27. <div class="between">
  28. <ui-button width="47.5%" ref="copy" :data-clipboard-text="copyLink">{{ $t('info.toolbox.copyLink') }}</ui-button>
  29. <ui-button width="47.5%" @click="onDownloadQrCode">{{ $t('info.toolbox.downLoadCode') }}</ui-button>
  30. </div>
  31. </li>
  32. <li>
  33. <div class="between">
  34. <span>{{ $t('info.toolbox.uploadTime') }}</span>
  35. <label>{{ metadata.createTime }}</label>
  36. </div>
  37. <div class="between">
  38. <span>{{ $t('info.toolbox.shootPoint') }}</span>
  39. <label>{{ metadata.panoCount || 0 }}</label>
  40. </div>
  41. <div class="between">
  42. <span>{{ $t('info.toolbox.boxVideo') }}</span>
  43. <label>{{ metadata.videoCount || 0 }}</label>
  44. </div>
  45. </li>
  46. </ul>
  47. <ui-window v-if="showUpload" :title="$t('info.toolbox.addBackgroundMusic')" :canSubmit="file" @no="onCancel" @ok="onConfirm" :noText="$t('common.cancel')" :okText="$t('common.confirm')">
  48. <template v-slot:content>
  49. <div class="upload-music-box">
  50. <label for="file" :class="{ active: file }">
  51. <span v-if="!file">+ {{ $t('info.toolbox.uploadMusic') }}</span>
  52. <span v-else>{{ file.name }}</span>
  53. </label>
  54. <input type="file" accept=".mp3,.wav" id="file" @change="changeFile" />
  55. <!-- <p class="tips">{{ $t('info.toolbox.uploadTips') }}</p> -->
  56. <p class="tips">{{ $t('limit.formSize', { size: '5MB', form: 'MP3 / WAV' }) }}</p>
  57. </div>
  58. </template>
  59. </ui-window>
  60. </ui-editor-toolbox>
  61. </template>
  62. <script setup>
  63. import ClipboardJS from 'clipboard'
  64. import { ref, computed, onMounted, nextTick } from 'vue'
  65. import { useStore } from 'vuex'
  66. import { Dialog } from '@kankan/components'
  67. import { downloadFile } from '@/utils/download'
  68. import { getApp, getNum } from '@/app'
  69. import { useMusicPlayer } from '@/utils/sound'
  70. import { useI18n } from '@/i18n'
  71. import * as apis from '@/apis/scene-edit.js'
  72. import browser from '@/utils/browser'
  73. const musicPlayer = useMusicPlayer()
  74. const { t } = useI18n({ useScope: 'global' })
  75. const store = useStore()
  76. const metadata = computed(() => store.getters['info/metadata'])
  77. const music = computed({
  78. get() {
  79. if (metadata.value.music) {
  80. // let item = /^0\d$/.test(metadata.value.music) ? metadata.value.music : metadata.value.music == 'none' || metadata.value.music == '' ? 'none' : metadata.value.musicFile
  81. let item = /^0\d$/.test(metadata.value.music) ? metadata.value.music : metadata.value.music == 'none' ? 'none' : metadata.value.musicFile
  82. // let item = /^0\d$/.test(metadata.value.music) ? metadata.value.music : metadata.value.musicFile
  83. return item
  84. } else {
  85. return 'none'
  86. }
  87. },
  88. set(music) {
  89. store.commit('info/update', { music })
  90. musicPlayer.play()
  91. },
  92. })
  93. const musics = computed(() => {
  94. let list = store.getters['info/music']
  95. list.map(i => {
  96. if (i.value == '') {
  97. i.value = 'none'
  98. }
  99. let item = /^0\d$/.test(i.value) ? t(`info.musics.${i.value}`) : i.value == 'none' ? t(`info.musics.${i.value}`) : i.value
  100. i.label = item
  101. })
  102. return list
  103. })
  104. const copy = ref(null)
  105. const file = ref(null)
  106. const showUpload = ref(false)
  107. const copyLink = computed(() => {
  108. let domain = store.getters['scene/whichDept'] == 'HK' ? process.env.VUE_APP_SHOW_HK_URL : process.env.VUE_APP_SHOW_URL
  109. return domain + `index.html?m=${browser.getURLParam('m')}`
  110. })
  111. const onUpload = () => {
  112. if (metadata.value.musicFile) {
  113. Dialog.confirm({
  114. content: `${t('info.toolbox.addTips')}`,
  115. title: t('common.tips'),
  116. okText: t('common.confirm'),
  117. noText: t('common.cancel'),
  118. func: state => {
  119. if (state == 'ok') {
  120. showUpload.value = true
  121. }
  122. },
  123. })
  124. } else {
  125. showUpload.value = true
  126. }
  127. }
  128. const onDeleteUpload = item => {
  129. // store.commit('info/update', { music: '', musicFile: '', files: { music: null } })
  130. console.log(item)
  131. let params = {
  132. musicFile: '',
  133. files: { music: null },
  134. }
  135. if (metadata.value.music == item.value) {
  136. params.music = ''
  137. }
  138. store.commit('info/update', params)
  139. }
  140. const changeFile = e => {
  141. console.log(e.target.files[0])
  142. let fileType = e.target.files[0].name.split('.').pop().toLowerCase()
  143. console.log(fileType)
  144. if (['mp3', 'wav'].indexOf(fileType) == -1) {
  145. Dialog.toast({
  146. content: `${t('limit.formFile', { form: 'MP3 / WAV' })}`, //'仅支持 MP3/WAV 格式的音频',
  147. type: 'error',
  148. })
  149. return
  150. }
  151. if (e.target.files[0].size / 1024 / 1024 > 5) {
  152. Dialog.toast({
  153. // content: e.target.files[0].name + '的大小超过了5MB',
  154. content: `${t('limit.formSize', { form: 'MP3 / WAV', size: '5MB' })}`, //'请上传5MB以内的MP3/WAV文件',
  155. type: 'error',
  156. })
  157. return
  158. }
  159. if (e.target && e.target.files[0]) {
  160. file.value = e.target.files[0]
  161. }
  162. }
  163. const onCancel = e => {
  164. showUpload.value = false
  165. file.value = null
  166. }
  167. const onConfirm = () => {
  168. store.commit('info/update', { music: file.value.name, musicFile: file.value.name, files: { music: file.value } })
  169. nextTick(() => {
  170. musicPlayer.play()
  171. })
  172. onCancel()
  173. }
  174. const onDownloadQrCode = () => {
  175. let a = document.createElement('a')
  176. let link = `/service/scene/edit/down/qrCode?num=${browser.getURLParam('m')}`
  177. a.href = link
  178. a.download = `4DKanKan_share.png`
  179. a.target = '_blank'
  180. a.click()
  181. a.remove()
  182. // downloadFile(getApp().resource.getResourceURL(`downloads/scene/{num}/QRcode/{num}.png`), `4DKanKan_share.png`)
  183. }
  184. onMounted(() => {
  185. var clipboard = new ClipboardJS(copy.value.$el)
  186. clipboard.on('success', function (e) {
  187. e.clearSelection()
  188. Dialog.toast({ content: `${t('info.toolbox.copySuccess')}`, type: 'success' })
  189. })
  190. })
  191. </script>
  192. <style lang="scss" scoped>
  193. .upload-music-box {
  194. width: 400px;
  195. input {
  196. display: none;
  197. }
  198. label {
  199. display: flex;
  200. align-items: center;
  201. justify-content: center;
  202. width: 100%;
  203. height: 34px;
  204. border-radius: 4px;
  205. border: 1px solid rgba(255, 255, 255, 0.2);
  206. color: rgba(255, 255, 255, 0.6);
  207. cursor: pointer;
  208. margin-bottom: 10px;
  209. &.active {
  210. background: rgba(255, 255, 255, 0.1);
  211. color: var(--editor-main-color);
  212. }
  213. &:hover {
  214. border: 1px solid var(--editor-main-color);
  215. color: var(--editor-main-color);
  216. }
  217. span {
  218. width: 80%;
  219. text-align: center;
  220. overflow: hidden;
  221. white-space: nowrap;
  222. text-overflow: ellipsis;
  223. }
  224. }
  225. p {
  226. font-size: 12px;
  227. font-family: MicrosoftYaHei;
  228. color: rgba(255, 255, 255, 0.3);
  229. line-height: 22px;
  230. text-align: center;
  231. }
  232. }
  233. .music-user {
  234. position: relative;
  235. display: flex;
  236. align-items: center;
  237. > div {
  238. width: 100%;
  239. padding-right: 35px;
  240. overflow: hidden;
  241. text-overflow: ellipsis;
  242. white-space: nowrap;
  243. }
  244. span {
  245. position: absolute;
  246. display: block;
  247. top: 50%;
  248. right: 0px;
  249. transform: translateY(-50%);
  250. cursor: pointer;
  251. }
  252. }
  253. </style>