import { computed, defineComponent, nextTick, onMounted, reactive, ref } from 'vue' import umiRequest from 'umi-request' import { useRoute, useRouter } from 'vue-router' import request from '@/helpers/request' import ColHeader from '@/components/col-header' import { postMessage, promisefiyPostMessage } from '@/helpers/native-message' import { Button, Cell, Dialog, Icon, Image, Popup, Sticky, Tag, Toast } from 'vant' import styles from './index.module.less' // import Item from '../list/item' import { useRect } from '@vant/use' import { Vue3Lottie } from 'vue3-lottie' import { getRandomKey } from '@/views/music/music' import { getOssUploadUrl, state } from '@/state' import { useEventTracking } from '@/helpers/hooks' import ColSticky from '@/components/col-sticky' import { browser, moneyFormat } from '@/helpers/utils' import { orderStatus } from '@/views/order-detail/orderStatus' import iconAlbum from '@/views/music/component/images/icon_album.png' import iconDownload from '@/views/music/music-detail/images/icon_download.png' import AstronautJSON from '@/views/music/music-detail/animate/bigLoad.json' import ColShare from '@/components/col-share' import iconCollect from '@/views/music/music-detail/images/icon_collect.png' import iconCollectActive from '@/views/music/music-detail/images/icon_collect_active.png' import iconListen from '@/views/music/music-detail/images/icon_listen.png' import iconTeacher from '@common/images/icon_teacher.png' import { addMusicTitle, addWatermark, convasToImg, imgToCanvas } from '@/views/music/music-detail/imageFunction' import Plyr from 'plyr' import 'plyr/dist/plyr.css' import icon_exquisite from '@/views/music/component/images/icon_exquisite.png' import icon_album_active from '@/views/music/component/images/icon_album_active.png' import wx_bg from '../images/wx_bg.png' import { initJumpNativePage, shareCall } from '../share' import qs from 'query-string' export default defineComponent({ name: 'MusicDetail', setup() { localStorage.setItem('behaviorId', getRandomKey()) const route = useRoute() const loading = ref(false) const isError = ref(false) const headers = ref(null) const footers = ref(null) const heightInfo = ref('0') const musicDetail = ref(null) const showImg = ref('') const accompanyUrl = ref('') const wxStatus = ref(false) const tmpUrl = `${location.origin}/student/#/music-detail?${qs.stringify( route.query )}` const jumpUrl = ref(tmpUrl) const colors: any = { FREE: { color: '#01B84F', text: '免费' }, VIP: { color: '#CD863E', text: '会员' }, CHARGE: { color: '#3591CE', text: '点播' } } const FetchList = async (id?: any) => { if (loading.value) { return } loading.value = true isError.value = false try { const search = route.query const res = await request.post(`/open/musicShareProfit`, { prefix: '/api-teacher', requestType: 'json', data: { bizId: search.id, userId: search.recomUserId } }) musicDetail.value = res.data.musicSheet showImg.value = musicDetail.value?.musicImg || '' if (!showImg.value) { setAccompanyUrl() window.addEventListener( 'message', async e => { // 给图片设置背景色 const tempCanvas = await imgToCanvas(e.data) const img = convasToImg(tempCanvas) // 开始上传图片 uploadFunction(img) }, false ) } } catch (error) { isError.value = true } loading.value = false } const base64ToBlob = data => { const arr = data.split(','), mime = arr[0].match(/:(.*?);/)[1] const bstr = atob(arr[1]) let n = bstr.length const u8arr = new Uint8Array(n) while (n--) { u8arr[n] = bstr.charCodeAt(n) } return new Blob([u8arr], { type: mime }) } const uploadFunction = async file => { try { const formData = new FormData() const fileName = new Date().getTime() + musicDetail.value?.musicSheetName.replaceAll(' ', '_') + '.png' const keyTime = new Date().getTime() + fileName const obj = { filename: fileName, bucketName: 'cloud-coach', postData: { filename: fileName, acl: 'public-read', key: keyTime, unknowValueField: [] } } const res = await request.post(state.platformApi + '/getUploadSign', { data: obj }) Toast.loading({ message: '加载中...', forbidClick: true, loadingType: 'spinner', duration: 0 }) const dataObj = { policy: res.data.policy, signature: res.data.signature, key: keyTime, KSSAccessKeyId: res.data.kssAccessKeyId, acl: 'public-read', name: fileName } for (const key in dataObj) { formData.append(key, dataObj[key]) } const files = base64ToBlob(file) formData.append('file', files, fileName) const ossUploadUrl = state.ossUploadUrl + 'cloud-coach' await umiRequest(ossUploadUrl, { method: 'POST', data: formData }) Toast.clear() const imgurl = getOssUploadUrl('cloud-coach') + keyTime await request.post(state.platformApi + '/open/music/sheet/img', { data: { musicSheetId: musicDetail.value.id, musicImg: imgurl } }) showImg.value = imgurl } catch (e) { console.log(e) } } const setAccompanyUrl = () => { const url = 'http://dev.colexiu.com' const music = musicDetail.value let subjectId = '' if (music.background && music.background.length > 0) { subjectId = music.background[0].id } accompanyUrl.value = url + `/accompany/colxiu-website.html?id=${music.id}&part-index=${subjectId}` } const player = ref(null) const audio = ref(null) const freeRate = ref(0) const initAudio = async () => { const config = await request.get( state.platformApi + '/sysConfig/queryByParamNameList', { params: { paramNames: 'music_sheet_free_rate' } } ) freeRate.value = config.data[0]?.paramValue || 0 const controls = [ // 'play-large', 'play', 'progress', // 'captions', // 'fullscreen', 'duration' ] player.value = new Plyr(audio.value, { controls: controls }) player.value.on('timeupdate', () => { // 允许播放时间 const players = player.value const playTime = (players.duration * freeRate.value) / 100 || 0 // 时间,是否购买,是否免费 if ( players.currentTime >= playTime && musicDetail.value?.orderStatus !== 'PAID' && !paymentType.value.includes('FREE') ) { // players.stop() players.pause() } }) } onMounted(async () => { initJumpNativePage(jumpUrl.value) await FetchList() const { height } = useRect(headers as any) const footer = useRect(footers as any) heightInfo.value = height + footer.height // 初始化音频 if (musicDetail.value?.audioFileUrl) { initAudio() } }) const paymentType = computed(() => { let paymentType = musicDetail.value?.paymentType if (typeof paymentType === 'string') { paymentType = paymentType.split(',') return paymentType } return [] }) const onShare = () => { console.log(browser().weixin) if (browser().weixin) { wxStatus.value = true return } // 尝试拉起app shareCall(jumpUrl.value) // 不管有没有拉起app则都跳转到下载app setTimeout(() => { window.location.href = location.origin + '/student/#/download' }, 3000) } return () => { return (
( ), title: () => (

{musicDetail.value?.musicSheetName}

{paymentType.value.map(tag => ( {colors[tag].text} ))} {musicDetail.value?.exquisiteFlag === 1 && ( )} {musicDetail.value?.albumNums > 0 && ( )} {musicDetail.value?.composer}

), value: () => ( onShare()}> 下载曲谱 ) }} />