123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- <template>
- <ui-editor-toolbox>
- <ul class="edit-list">
- <li>
- <div class="title">
- <span>{{ $t('info.toolbox.music') }}</span>
- <label @click="onUpload">
- <ui-icon :tip="$t('info.toolbox.uploadMusic')" tipH="right" type="uploading" />
- </label>
- </div>
- <div>
- <ui-input type="select" :options="musics" width="100%" :placeholder="$t('common.none')" v-model="music" stop-el="i">
- <template v-slot:option="{ raw }">
- <div :class="{ 'music-user': raw.user }">
- <div>{{ raw.label }}</div>
- <!-- <div>{{ raw.user ? raw.value : $t(`info.musics.${raw.value}`) }}</div> -->
- <span v-show="raw.user" @click.stop="onDeleteUpload(raw)"><i class="iconfont icon-del"></i></span>
- </div>
- </template>
- </ui-input>
- </div>
- </li>
- <li>
- <div class="title">
- <span>{{ $t('info.toolbox.share') }}</span>
- </div>
- <div class="between">
- <ui-button width="47.5%" ref="copy" :data-clipboard-text="copyLink">{{ $t('info.toolbox.copyLink') }}</ui-button>
- <ui-button width="47.5%" @click="onDownloadQrCode">{{ $t('info.toolbox.downLoadCode') }}</ui-button>
- </div>
- </li>
- <li>
- <div class="between">
- <span>{{ $t('info.toolbox.uploadTime') }}</span>
- <label>{{ metadata.createTime }}</label>
- </div>
- <div class="between">
- <span>{{ $t('info.toolbox.shootPoint') }}</span>
- <label>{{ metadata.panoCount || 0 }}</label>
- </div>
- <div class="between">
- <span>{{ $t('info.toolbox.boxVideo') }}</span>
- <label>{{ metadata.videoCount || 0 }}</label>
- </div>
- </li>
- </ul>
- <ui-window v-if="showUpload" :title="$t('info.toolbox.addBackgroundMusic')" :canSubmit="file" @no="onCancel" @ok="onConfirm" :noText="$t('common.cancel')" :okText="$t('common.confirm')">
- <template v-slot:content>
- <div class="upload-music-box">
- <label for="file" :class="{ active: file }">
- <span v-if="!file">+ {{ $t('info.toolbox.uploadMusic') }}</span>
- <span v-else>{{ file.name }}</span>
- </label>
- <input type="file" accept=".mp3,.wav" id="file" @change="changeFile" />
- <!-- <p class="tips">{{ $t('info.toolbox.uploadTips') }}</p> -->
- <p class="tips">{{ $t('limit.formSize', { size: '5MB', form: 'MP3 / WAV' }) }}</p>
- </div>
- </template>
- </ui-window>
- </ui-editor-toolbox>
- </template>
- <script setup>
- import ClipboardJS from 'clipboard'
- import { ref, computed, onMounted, nextTick } from 'vue'
- import { useStore } from 'vuex'
- import { Dialog } from '@kankan/components'
- import { downloadFile } from '@/utils/download'
- import { getApp, getNum } from '@/app'
- import { useMusicPlayer } from '@/utils/sound'
- import { useI18n } from '@/i18n'
- import * as apis from '@/apis/scene-edit.js'
- import browser from '@/utils/browser'
- const musicPlayer = useMusicPlayer()
- const { t } = useI18n({ useScope: 'global' })
- const store = useStore()
- const metadata = computed(() => store.getters['info/metadata'])
- const music = computed({
- get() {
- if (metadata.value.music) {
- // let item = /^0\d$/.test(metadata.value.music) ? metadata.value.music : metadata.value.music == 'none' || metadata.value.music == '' ? 'none' : metadata.value.musicFile
- let item = /^0\d$/.test(metadata.value.music) ? metadata.value.music : metadata.value.music == 'none' ? 'none' : metadata.value.musicFile
- // let item = /^0\d$/.test(metadata.value.music) ? metadata.value.music : metadata.value.musicFile
- return item
- } else {
- return 'none'
- }
- },
- set(music) {
- store.commit('info/update', { music })
- musicPlayer.play()
- },
- })
- const musics = computed(() => {
- let list = store.getters['info/music']
- list.map(i => {
- if (i.value == '') {
- i.value = 'none'
- }
- let item = /^0\d$/.test(i.value) ? t(`info.musics.${i.value}`) : i.value == 'none' ? t(`info.musics.${i.value}`) : i.value
- i.label = item
- })
- return list
- })
- const copy = ref(null)
- const file = ref(null)
- const showUpload = ref(false)
- const copyLink = computed(() => {
- let domain = store.getters['scene/whichDept'] == 'HK' ? process.env.VUE_APP_SHOW_HK_URL : process.env.VUE_APP_SHOW_URL
- return domain + `index.html?m=${browser.getURLParam('m')}`
- })
- const onUpload = () => {
- if (metadata.value.musicFile) {
- Dialog.confirm({
- content: `${t('info.toolbox.addTips')}`,
- title: t('common.tips'),
- okText: t('common.confirm'),
- noText: t('common.cancel'),
- func: state => {
- if (state == 'ok') {
- showUpload.value = true
- }
- },
- })
- } else {
- showUpload.value = true
- }
- }
- const onDeleteUpload = item => {
- // store.commit('info/update', { music: '', musicFile: '', files: { music: null } })
- console.log(item)
- let params = {
- musicFile: '',
- files: { music: null },
- }
- if (metadata.value.music == item.value) {
- params.music = ''
- }
- store.commit('info/update', params)
- }
- const changeFile = e => {
- console.log(e.target.files[0])
- let fileType = e.target.files[0].name.split('.').pop().toLowerCase()
- console.log(fileType)
- if (['mp3', 'wav'].indexOf(fileType) == -1) {
- Dialog.toast({
- content: `${t('limit.formFile', { form: 'MP3 / WAV' })}`, //'仅支持 MP3/WAV 格式的音频',
- type: 'error',
- })
- return
- }
- if (e.target.files[0].size / 1024 / 1024 > 5) {
- Dialog.toast({
- // content: e.target.files[0].name + '的大小超过了5MB',
- content: `${t('limit.formSize', { form: 'MP3 / WAV', size: '5MB' })}`, //'请上传5MB以内的MP3/WAV文件',
- type: 'error',
- })
- return
- }
- if (e.target && e.target.files[0]) {
- file.value = e.target.files[0]
- }
- }
- const onCancel = e => {
- showUpload.value = false
- file.value = null
- }
- const onConfirm = () => {
- store.commit('info/update', { music: file.value.name, musicFile: file.value.name, files: { music: file.value } })
- nextTick(() => {
- musicPlayer.play()
- })
- onCancel()
- }
- const onDownloadQrCode = () => {
- let a = document.createElement('a')
- let link = `/service/scene/edit/down/qrCode?num=${browser.getURLParam('m')}`
- a.href = link
- a.download = `4DKanKan_share.png`
- a.target = '_blank'
- a.click()
- a.remove()
- // downloadFile(getApp().resource.getResourceURL(`downloads/scene/{num}/QRcode/{num}.png`), `4DKanKan_share.png`)
- }
- onMounted(() => {
- var clipboard = new ClipboardJS(copy.value.$el)
- clipboard.on('success', function (e) {
- e.clearSelection()
- Dialog.toast({ content: `${t('info.toolbox.copySuccess')}`, type: 'success' })
- })
- })
- </script>
- <style lang="scss" scoped>
- .upload-music-box {
- width: 400px;
- input {
- display: none;
- }
- label {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 100%;
- height: 34px;
- border-radius: 4px;
- border: 1px solid rgba(255, 255, 255, 0.2);
- color: rgba(255, 255, 255, 0.6);
- cursor: pointer;
- margin-bottom: 10px;
- &.active {
- background: rgba(255, 255, 255, 0.1);
- color: var(--editor-main-color);
- }
- &:hover {
- border: 1px solid var(--editor-main-color);
- color: var(--editor-main-color);
- }
- span {
- width: 80%;
- text-align: center;
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- }
- }
- p {
- font-size: 12px;
- font-family: MicrosoftYaHei;
- color: rgba(255, 255, 255, 0.3);
- line-height: 22px;
- text-align: center;
- }
- }
- .music-user {
- position: relative;
- display: flex;
- align-items: center;
- > div {
- width: 100%;
- padding-right: 35px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- span {
- position: absolute;
- display: block;
- top: 50%;
- right: 0px;
- transform: translateY(-50%);
- cursor: pointer;
- }
- }
- </style>
|