import { computed, defineComponent, nextTick, onMounted, onUnmounted, reactive, ref, watch } 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, CellGroup, Checkbox, Dialog, Icon, Image, Popup, RadioGroup, Sticky, Tag, Radio, Toast, Picker } from 'vant' import qs from 'query-string' import styles from './index.module.less' // import Item from '../list/item' import { useRect } from '@vant/use' import { Vue3Lottie } from 'vue3-lottie' import { getRandomKey, musicBuy } from '../music' import { getOssUploadUrl, state } from '@/state' // import { useEventTracking } from '@/helpers/hooks' import ColSticky from '@/components/col-sticky' import { browser, getHttpOrigin, moneyFormat } from '@/helpers/utils' import { orderStatus } from '@/views/order-detail/orderStatus' import iconShare from '@/views/music/album/icon_share.svg' import iconAlbum from './images/icon_album.png' import iconAlbum2 from './images/icon_album2.png' import iconDownload from './images/icon_download.png' import iconChange from './images/icon-change.png' import iconAddCourse from './images/icon-add-course.png' import iconRemoveCourse from './images/icon-remove-course.png' import AstronautJSON from './animate/bigLoad.json' import ColShare from '@/components/col-share' import iconCollect from './images/icon_collect.png' import iconCollectActive from './images/icon_collect_active.png' import iconListen from './images/icon_listen.png' import emtpy from './images/emtpy.png' import activeButtonIcon from '@common/images/icon_checkbox.png' import inactiveButtonIcon from '@common/images/icon_checkbox_default.png' import staffDetafult from './images/staff-default.png' import firstDefault from './images/first-default.png' import fixedDefault from './images/fixed-default.png' import Plyr from 'plyr' import 'plyr/dist/plyr.css' import Download from './download' import { getInstrumentName } from '@/constant/instruments' import { svgtopng } from '@/tenant/music/music-detail/formatSvgToImg' import { useThrottleFn } from '@vueuse/core' import { formatXML, getCustomInfo, onlyVisible } from '@/tenant/music/music-detail/instrument' export const getAssetsHomeFile = (fileName: string) => { const path = `../component/images/${fileName}` const modules = import.meta.globEager('../component/images/*') return modules[path].default } export default defineComponent({ name: 'MusicDetail', setup() { const behaviorId = ref(getRandomKey()) localStorage.setItem('behaviorId', behaviorId.value) const router = useRouter() const route = useRoute() const loading = ref(false) const aId = Number(route.query.activityId) || 0 const studentActivityId = ref(aId) const isError = ref(false) const headers = ref(null) const footers = ref(null) const heightInfo = ref('0') const musicDetail = ref(null) const audioFileUrl = ref('') const showImg = ref([] as any) const firstList = ref>([]) const fixedList = ref>([]) const staffList = ref>([]) const musicPdfUrl = ref('') const staffData = reactive({ // open: false, // iframeSrc: '', // musicXml: '', // instrumentName: '', // iframeRef: null as any, // partIndex: 0, // partXmlIndex: 0, // tempPartList: [] as any[], // partList: [] as any[], // xmlPartList: [] as any[] musicId: route.query.id as any, isConcert: false, // 是否合奏 details: {} as any, list: [], // 列表数据 open: false, closed: true, audioReady: false, iframeSrc: "", musicXml: "", instrumentName: "", iframeRef: null as any, imgs: [] as any, musicPdfUrl: "", // 当前声轨PDF partList: [] as any[], partNames: [] as string[], selectedPartName: "" as any, selectedPartIndex: 0, isComberRender: false, // 是否合并谱显示 metronomeUrl: "", // 合奏使用链接 metronomeMp3Url: "", // 独奏使用链接 }) const defaultImgs = ref({ first: false, fixed: false, staff: false }) const downloadStatus = ref(false) const staff = reactive({ status: false, radio: 'staff' // staff first fixed }) const colors: any = { FREE: { color: '#01B84F', text: '免费' }, VIP: { color: '#CD863E', text: '会员' }, CHARGE: { color: '#3591CE', text: '点播' } } // 更改预览状态 const onChangeStaff = (type: string) => { staff.radio = type staff.status = false if (type == 'first') { loading.value = false const tempPdf = musicDetail.value?.firstPdfUrl initIframe(tempPdf, 'first', staffData.musicXml) } else if (type == 'fixed') { loading.value = false const tempPdf = musicDetail.value?.jianPdfUrl console.log(tempPdf, 'tempPdf') initIframe(tempPdf, 'fixed', staffData.musicXml) } else { loading.value = false const tempPdf = musicDetail.value?.musicPdfUrl initIframe(tempPdf, 'staff', staffData.musicXml) } } const initIframe = (tempPdf: string, staff: string, xml: string) => { if (tempPdf) { musicPdfUrl.value = tempPdf renderStaff() } else { musicPdfUrl.value = '' // 为了处理,之前是使用pdf渲染,现在又用osmd,iframe没有重新加载 if ( !staffData.iframeSrc || staffData.iframeSrc.indexOf('pdf/web') !== -1 ) { renderStaff() } else { resetRenderPage(staff, xml) } } } watch( () => staff.radio, (val: string) => { if (val == 'first') { showImg.value = firstList.value } else if (val == 'fixed') { showImg.value = fixedList.value } else { showImg.value = staffList.value } } ) const FetchList = async (id?: any) => { if (loading.value) { return } loading.value = true isError.value = false try { const { data } = await request.get(state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student' + '/musicSheet/cbsDetail/' + route.query.id) musicDetail.value = data staffData.details = data // const res = await request.get(`/music/sheet/detail/${route.query.id}`, { // prefix: // state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student' // }) // musicDetail.value = res.data // const background = res.data.background // audioFileUrl.value = // background && background.length > 0 ? background[0].audioFileUrl : '' // // const arrImgs = res.data.musicImg ? res.data.musicImg.split(',') : [] // showImg.value = res.data.musicImg ? res.data.musicImg.split(',') : [] // firstList.value = res.data.firstTone // ? res.data.firstTone.split(',') // : [] // fixedList.value = res.data.fixedTone // ? res.data.fixedTone.split(',') // : [] // staffList.value = res.data.musicImg ? res.data.musicImg.split(',') : [] // // 初始化默认数据是否有值 // if (firstList.value.length > 0) { // defaultImgs.value.first = true // } // if (fixedList.value.length > 0) { // defaultImgs.value.fixed = true // } // if (staffList.value.length > 0) { // defaultImgs.value.staff = true // } await toDetail(data) nextTick(async () => { if ( (staffData.isConcert && staffData.metronomeUrl) || (!staffData.isConcert && staffData.metronomeMp3Url) ) { initAudio(); } else { renderStaff(); } }); // if (res.data.auditStatus === 'DOING') { // Dialog.confirm({ // message: '曲目审核中', // showConfirmButton: true, // showCancelButton: false, // confirmButtonColor: 'var(--van-primary)' // }).then(() => { // if (browser().isApp) { // postMessage({ api: 'goBack' }) // } else { // router.back() // } // }) // } } catch (error) { isError.value = true } loading.value = false } const player = ref(null) const audio = ref(null) const freeRate = ref(0) const initAudio = async () => { const controls = [ 'play-large', 'play', 'progress', 'captions', // 'fullscreen', 'duration' ] player.value = new Plyr(audio.value, { controls: controls }) const config = await request.get( '/api-student/sysConfig/queryByParamNameList', { params: { paramNames: 'music_sheet_free_rate' } } ) freeRate.value = config.data[0]?.paramValue || 0 player.value.on('timeupdate', () => { // 允许播放时间 const players = player.value const playTime = (players.duration * freeRate.value) / 100 || 0 // 时间,不能播放 if (players.currentTime >= playTime && !buyState.value.play) { players.stop() // players.pause() } }) } const showLoading = async (e: any) => { if (e.data?.api === 'musicStaffRender') { const osmdImg = e.data.osmdImg showImg.value = [] const imgs: any = [] for (let i = 0; i < osmdImg.length; i++) { const img = await svgtopng( osmdImg[i].img, osmdImg[i].width, osmdImg[i].height ) imgs.push(img) } showImg.value = imgs loading.value = e.data.loading } } onMounted(async () => { postMessage({ api: 'setStatusBarTextColor', content: { statusBarTextColor: true } }) await FetchList() const { height } = useRect(headers as any) const footer = useRect(footers as any) heightInfo.value = height + footer.height // // 初始化音频 // if (audioFileUrl.value) { // initAudio() // } window.addEventListener('message', showLoading) }) onUnmounted(() => { postMessage({ api: 'setStatusBarTextColor', content: { statusBarTextColor: false } }) window.removeEventListener('message', showLoading) }) const toggleFavorite = async () => { /** * 酷乐秀老师端 收藏曲目 music/sheet/favorite/id?providerType=?? 添加参数 * @ApiModelProperty("曲目评测来源 TENANT 机构 PLATFORM 平台") * private String providerType; * 表示收藏的是机构曲目,还是平台曲目, */ let apiUrl = '', providerType = '' if (browser().isTeacher) { providerType = state.projectType === 'tenant' ? 'TENANT' : 'PLATFORM' } apiUrl = `/music/sheet/favorite/${musicDetail.value?.bizId}` try { await request.post(apiUrl, { requestType: 'form', data: { providerType }, prefix: state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student' }) musicDetail.value.favorite = musicDetail.value?.favorite ? 0 : 1 musicDetail.value.favoriteCount = musicDetail.value?.favorite ? musicDetail.value.favoriteCount + 1 : musicDetail.value.favoriteCount - 1 < 0 ? 0 : musicDetail.value.favoriteCount - 1 setTimeout(() => { Toast(musicDetail.value?.favorite ? '收藏成功' : '取消收藏成功') }, 100) } catch (error) { // } } const onAddCourse = async () => { try { const res = await request.post('/api-teacher/courseCourseware/submit', { data: { musicSheetId: musicDetail.value.bizId, clientType: 'TEACHER', userId: state.user.data?.userId } }) // console.log(res) setTimeout(() => { musicDetail.value.coursewareId = res.data.id || '' Toast('已将曲目添加到课件') musicDetail.value.coursewareStatus = 1 }, 100) } catch { // } } const removeCourse = async () => { Dialog.confirm({ title: '提示', message: '您是否确定移出课件', confirmButtonColor: '#269a93', cancelButtonText: '取消', confirmButtonText: '确定' }).then(async () => { try { await request.post( '/api-teacher/courseCourseware/remove/' + musicDetail.value.coursewareId, { data: {} } ) setTimeout(() => { Toast('移出成功') musicDetail.value.coursewareStatus = 0 }, 100) } catch { // } }) } const onBuy = async () => { const music = musicDetail.value orderStatus.orderObject.orderType = 'MUSIC' orderStatus.orderObject.orderName = music.name orderStatus.orderObject.orderDesc = music.name orderStatus.orderObject.actualPrice = music.musicPrice orderStatus.orderObject.recomUserId = route.query.recomUserId || 0 orderStatus.orderObject.activityId = route.query.activityId || 0 orderStatus.orderObject.orderNo = '' orderStatus.orderObject.orderList = [ { orderType: 'MUSIC', goodsName: music.name, actualPrice: music.musicPrice, ...music } ] const res = await request.post('/api-student/userOrder/getPendingOrder', { data: { goodType: 'MUSIC', bizId: music.id } }) const result = res.data if (result) { Dialog.confirm({ title: '提示', message: '您有一个未支付的订单,是否继续支付?', confirmButtonColor: '#269a93', cancelButtonText: '取消订单', confirmButtonText: '继续支付' }) .then(async () => { orderStatus.orderObject.orderNo = result.orderNo orderStatus.orderObject.actualPrice = result.actualPrice orderStatus.orderObject.discountPrice = result.discountPrice orderStatus.orderObject.paymentConfig = { ...result.paymentConfig, paymentVendor: result.paymentVendor, paymentVersion: result.paymentVersion } routerTo() }) .catch(() => { Dialog.close() // 只用取消订单,不用做其它处理 cancelPayment(result.orderNo) }) } else { routerTo() } } const routerTo = () => { const music = musicDetail.value router.push({ path: '/orderDetail', query: { orderType: 'MUSIC', musicId: music.id } }) } const cancelPayment = async (orderNo: string) => { try { await request.post('/api-student/userOrder/orderCancel', { data: { orderNo } }) } catch {} } const paymentType = computed(() => { let paymentType = musicDetail.value?.paymentType if (typeof paymentType === 'string') { paymentType = paymentType.split(',') return paymentType } return [] }) const buyState = computed(() => { const music = musicDetail.value return { hasTenantAlbum: route.query?.tenantAlbumId ? true : false, // 是否从专辑来的 play: music.play ? true : false, // 是否可以播放 free: music?.paymentType.includes('FREE'), charge: music?.paymentType.includes('CHARGE'), vip: music?.paymentType.includes('VIP'), buy: music?.orderStatus === 'PAID' // 是否已买 } }) const shareStatus = ref(false) const shareUrl = ref('') const shareDiscount = ref(0) const partColumns = ref([]); // console.log(data) const onShare = async () => { try { const res = await request.post('/api-teacher/open/musicShareProfit', { data: { bizId: musicDetail.value?.bizId, userId: state.user.data?.userId } }) let url = location.origin + `/teacher/#/shareMusic?id=${musicDetail.value?.bizId}&recomUserId=${state.user.data?.userId}&userType=${state.platformType}` // 判断是否有活动 if (res.data.discount === 1) { url += `&activityId=${res.data.activityId}` } shareDiscount.value = res.data.discount || 0 console.log(url) shareUrl.value = url shareStatus.value = true return } catch {} } /** 渲染五线谱 */ const sortList = { 长笛: 1, 单簧管: 2, 中音单簧管: 3, 低音单簧管: 4, 高音萨克斯风: 5, 中音萨克斯风: 6, 次中音萨克斯风: 7, 低音萨克斯风: 8, 小号: 9, 长号: 10, 圆号: 11, 大号: 12, 上低音号: 13 } const instrumentSort = (list: Array) => { list.sort((a, b) => { return ( (sortList[getInstrumentName(a.track)] || 20) - (sortList[getInstrumentName(b.track)] || 20) ) }) return list } const getPartNames = async (xmlUrl: string) => { const partNames: string[] = []; try { const res = await umiRequest.get(xmlUrl, { mode: "cors" }); const xml: any = new DOMParser().parseFromString(res, "text/xml"); for (const item of xml.getElementsByTagName("part-name")) { if (item.textContent) { partNames.push(item.textContent?.trim()); } } } catch (error) {} return partNames; }; // 根据当前选中的声部和曲目筛选出对应的声轨 function filterSoundCodes(musicalInstruments: any) { // 老师端,加上乐器id const instrumentIds = 1005 // appState.instrumentId || appState.user?.instrumentId || route.query.instrumentId if (instrumentIds) { const { code } = musicalInstruments.find((item: any) => { return instrumentIds == item.id }) || {} return code } return null } // 根据当前选中的声部和曲目筛选出对应的声轨 function filterSoundInfo(musicalInstruments: any) { if(musicalInstruments.length <= 0) return null // 老师端,加上乐器id const instrumentIds = 1005 //appState.instrumentId || appState.user?.instrumentId || route.query.instrumentId if (instrumentIds) { const item = musicalInstruments.find((item: any) => { return instrumentIds == item.musicalInstrumentId && item.audioPlayType == 'PLAY' }) || null return item } return null } const toDetail = async (row) => { const partNames = await getPartNames(row.xmlFileUrl); staffData.partNames = partNames; let partList = staffData.list || []; partList = partList.filter( (item: any) => !item.track?.toLocaleUpperCase()?.includes("COMMON") ); partColumns.value = partList.map((item: any, index: number) => { const xmlIndex = staffData.partNames.filter((text: string) => text.toLocaleUpperCase() !== "COMMON").findIndex( (name: any) => name.trim() === item.track ); const defaultIndex = row.musicSheetType !== "SINGLE" && row.isScoreRender ? index + 1 : index return { text: getInstrumentName(item.track as string), name: getInstrumentName(item.track as string), // true track: item.track, musicPdfUrl: item.soundMusicPdfUrl, xmlIndex, value: defaultIndex, }; }); staffData.details = row || {}; staffData.musicXml = staffData.details?.xmlFileUrl; staffData.isComberRender = staffData.details?.isScoreRender; let defaultShowStaff if(staffData.details?.musicalInstruments) { const soundCodes = filterSoundCodes(staffData.details?.musicalInstruments) if (soundCodes) { const soundCodesArr = soundCodes.split(",").map((code: string) => { return code .toLowerCase() .replace(/^\d+|\d+$/g, "") .trim() }) defaultShowStaff = partColumns.value.find((item: any) => soundCodesArr.includes( item.track && item.track .toLowerCase() .replace(/^\d+|\d+$/g, "") .trim() ) ) if(defaultShowStaff) { staffData.selectedPartIndex = defaultShowStaff.value } } } if (row.musicSheetType === "SINGLE") { staffData.musicPdfUrl = row.musicPdfUrl; // 生成的图片 // staffData.imgs = row.musicImg ? row.musicImg.split(',') : []; } else { // 初始化数据 // 是否显示总谱 if (staffData.isComberRender) { partColumns.value.unshift({ text: "总谱", value: 0, xmlIndex: 999, track: "", name: "总谱", }); // 如果是总谱则默认选中,否则选择 console.log(defaultShowStaff, 'defaultShowStaff') staffData.selectedPartIndex = row.defaultScoreRender? 0 : defaultShowStaff ? defaultShowStaff.value : 1 if(row.defaultScoreRender) { staffData.musicPdfUrl = row.musicPdfUrl; } else { staffData.musicPdfUrl = defaultShowStaff.musicPdfUrl; } } else { const item = partColumns.value.find((item: any) => item.value === staffData.selectedPartIndex) console.log(item, partColumns.value, staffData.selectedPartIndex, 'selectedPartIndex') if (item) { staffData.musicPdfUrl = item.musicPdfUrl; } else { staffData.musicPdfUrl = ""; } } } // 通过isScoreRender判断是否合并渲染 // 多声轨, 不是单声部多声轨, 不是老师布置作业选择曲谱 if (row.musicSheetType === "SINGLE") { staffData.isConcert = false; const musicSheetSoundList = staffData.details?.musicSheetSoundList || [] const songs = filterSoundInfo(musicSheetSoundList) if(songs) { staffData.metronomeMp3Url = songs.audioFileUrl } else { // 为了处理节奏练习 if(musicSheetSoundList.length > 0) { console.log(musicSheetSoundList, 'musicSheetSoundList') staffData.metronomeMp3Url = musicSheetSoundList[0].audioFileUrl } } } else { staffData.isConcert = true; const { audioFileUrl } = row.musicSheetAccompanimentList.find((item: any) => item.audioPlayType == 'PLAY') staffData.metronomeUrl = audioFileUrl } } const getPreViewCloud = (musicId: string, partIndex: number) => { const Authorization = sessionStorage.getItem("Authorization") || ""; const musicScorePath = "/klx-music-score/"; const musicScoreUrl = getHttpOrigin() + musicScorePath; // const musicScoreUrl = "https://test.gym.lexiaoya.cn" + musicScorePath; // const musicScoreUrl = 'http://192.168.3.68:3000/instrument.html'; let href = `${musicScoreUrl}?t=${Date.now()}#/?id=${musicId}&Authorization=${Authorization}&part-index=${partIndex}&isPreView=true&zoom=0.5&downPng=A4`; // // 老师端加上systemType=teacher const browserInfo = browser() href += ('&systemType=' +( browserInfo.isStudent ? `student` : 'teacher')); // if (location.pathname.includes("accompany-teacher")) { // href += `&systemType=teacher`; // } return href }; const renderStaff = async () => { // try { // if (staffData.musicPdfUrl) { // // staffData.iframeSrc = // // "/pdf/web/viewer.html?file=" + // // encodeURIComponent(staffData.musicPdfUrl); // // https://cdn.oss.dayaedu.com/daya202409/UOFW4q5.pdf // // https://cdn.oss.dayaedu.com/daya202409/UOFVK2A.pdf // // https://cdn.oss.dayaedu.com/daya202409/UODQffO.pdf // staffData.iframeSrc = `${getHttpOrigin()}${ // location.pathname // }pdf/web/viewer.html?file=${encodeURIComponent( // staffData.musicPdfUrl // )}`; // } else { // staffData.iframeSrc = getPreViewCloud( // staffData.musicId, // currentColumn.value.xmlIndex // ); // // staffData.iframeSrc = `/osmd/index.html`; // // staffData.iframeSrc = `${getHttpOrigin()}${location.pathname}osmd/index.html`; // } // } catch (error) { // // // } try { nextTick(() => { if (musicPdfUrl.value) { const url = `${location.origin}${ location.pathname }pdf/web/viewer-pdf.html?file=${encodeURIComponent( musicPdfUrl.value )}&t=${Date.now()}` const iframeRef = document.querySelector('#staffIframeRef') as any iframeRef.contentWindow.location.replace(url) staffData.iframeSrc = url } else { // const url = `${location.origin}${ // location.pathname // }osmd/index.html?t=${new Date().getTime()}` // // const url = `${location.origin}/osmd/index.html` // const iframeRef = document.querySelector('#staffIframeRef') as any // iframeRef.contentWindow.location.replace( // `${location.origin}${location.pathname}osmd/index.html` // ) // staffData.iframeSrc = url staffData.iframeSrc = getPreViewCloud( // staffData.musicId, // currentColumn.value.xmlIndex // ); // // staffData.iframeSrc = `/osmd/index.html`; // // staffData.iframeSrc = `${getHttpOrigin()}${location.pathname}osmd/index.html`; } }) } catch (error) { // } } const musicIframeLoad = async () => { const iframeRef: any = document.getElementById('staffIframeRef') if (iframeRef && iframeRef.contentWindow.renderXml) { const res = await umiRequest.get(staffData.musicXml, { mode: 'cors' }) const parseXmlInfo = getCustomInfo(res) const xml = formatXML(parseXmlInfo.parsedXML) const currentXml = onlyVisible(xml, staffData.partXmlIndex) iframeRef.contentWindow.renderXml(currentXml, 0, staff.radio) // iframeRef.contentWindow.renderXml( // staffData.musicXml, // staffData.partXmlIndex // ) } } const resetRender = async () => { const iframeRef: any = document.getElementById('staffIframeRef') if (iframeRef && iframeRef.contentWindow.renderXml) { loading.value = true // iframeRef.contentWindow.resetRender(staffData.partXmlIndex) const res = await umiRequest.get(staffData.musicXml, { mode: 'cors' }) const parseXmlInfo = getCustomInfo(res) const xml = formatXML(parseXmlInfo.parsedXML) const currentXml = onlyVisible(xml, staffData.partXmlIndex) iframeRef.contentWindow.renderXml(currentXml, 0) staffData.instrumentName = getInstrumentName( staffData.partList[staffData.partIndex]?.track ) } } const resetRenderPage = async (type: string, xmlUrl: string) => { const iframeRef: any = document.getElementById('staffIframeRef') if (iframeRef && iframeRef.contentWindow.renderXml) { loading.value = true const res = await umiRequest.get(staffData.musicXml, { mode: 'cors' }) const parseXmlInfo = getCustomInfo(res) const xml = formatXML(parseXmlInfo.parsedXML) const currentXml = onlyVisible(xml, staffData.partXmlIndex) iframeRef.contentWindow.resetRenderPage(type, currentXml) } } // const partColumns = computed(() => { // return staffData.partList.map((item: any, index: number) => { // const instrumentName = // musicDetail.value?.musicSheetType === 'CONCERT' // ? getInstrumentName(item.track) // : '' // return { // text: item.track + (instrumentName ? `(${instrumentName})` : ''), // value: index, // instrumentName, // musicPdfUrl: item.musicPdfUrl, // firstPdfUrl: item.firstPdfUrl, // jianPdfUrl: item.jianPdfUrl, // xmlValue: item.index, // track: item.track // } // }) // }) return () => { return (
(
分享
) }} />
( ), title: () => (

handleGotoMusicScore(musicDetail.value)} > {musicDetail.value?.name}

{paymentType.value.map( tag => tag && ( {colors[tag].text} ) )} {musicDetail.value?.exquisiteFlag === 1 && ( )} {musicDetail.value?.albumNums > 0 && ( )} { if ( browser().isApp && musicDetail.value?.sourceType === 'TEACHER' && state.platformType === 'STUDENT' ) { router.push({ path: '/teacherHome', query: { teacherId: musicDetail.value?.userId, tabs: 'music' } }) } }} > {musicDetail.value?.userName || '游客' + (musicDetail.value?.userId || '')}

), value: () => ( <> { if (musicDetail.value?.coursewareStatus) { removeCourse() } else { onAddCourse() } }} > {musicDetail.value?.coursewareStatus ? '移出课件' : '添加课件'} toggleFavorite()} > 收藏 ) }} />
{ router.push({ path: '/look-album-list', query: { id: musicDetail.value?.bizId, musicSubject: musicDetail.value?.musicSubject } }) }} > 专辑
{/* {musicDetail.value?.notation ? ( { staff.status = true }} style={{ display: musicDetail.value?.musicSheetType !== 'CONCERT' ? '' : 'none' }} > 转谱 ) : null} */}
{ if (musicDetail.value?.musicSheetType === 'CONCERT') { staffData.open = true } }} > 切换乐器
{musicDetail.value?.notation ? (
{ staff.status = true }} > 转谱
) : null}
{ if (musicPdfUrl.value) { const songName = musicDetail.value?.name + (staffData.instrumentName ? `(${staffData.instrumentName})` : '') promisefiyPostMessage({ api: 'downloadFile', content: { downloadUrl: musicPdfUrl.value, fileName: songName } }) return } if (showImg.value.length > 0) { downloadStatus.value = true } else { Toast('暂无图片') } }} > 下载
{staffData.details.id ? ( <> {staffData.musicPdfUrl ? ( <> {loading.value && ( <>

加载中...

)} ) : ( <>

{staffData.details?.name && ( <> {staffData.details?.name} {/* {staffData.isConcert && currentColumn.value?.name ? `(${ currentColumn.value ?.name || "" })` : ""} */} )}

{loading.value && ( <>

加载中...

)} )} ) : null} {/* {musicDetail.value?.musicSheetType === 'CONCERT' || musicPdfUrl.value || !defaultImgs.value[staff.radio] ? ( <> {musicPdfUrl.value ? ( ) : ( <>

{(musicDetail.value?.name ? musicDetail.value?.name : '') + (staffData.instrumentName ? `(${staffData.instrumentName})` : '')}

{loading.value && (
)} )} ) : ( <>

{(musicDetail.value?.name ? musicDetail.value?.name : '') + (staffData.instrumentName ? `(${staffData.instrumentName})` : '')}

{showImg.value.length > 0 ? (
) : loading.value ? ( <>

加载中...

) : (

暂无乐谱预览图

)} )} */}
{musicDetail.value?.bizId && (
{audioFileUrl.value && ( <> {!buyState.value.play && freeRate.value != 100 && freeRate.value != 0 && (
每首曲目可试听{freeRate.value}%
)}
)}
{/* 判断是否是免费的,或者已经购买过,是否从专辑过来的 */} {buyState.value.play || (state.platformType === 'TEACHER' && buyState.value.hasTenantAlbum) ? ( ) : (
{/* 只有,有点播类型的才显示价格 */} {buyState.value.charge && (
点播价: ¥ {moneyFormat(musicDetail.value?.musicPrice)}
)}
{/* 判断是否是需要收费的 */} {buyState.value.charge && ( )} {/* 判断是否有会员的 */} {buyState.value.vip && ( )}
)}
)}
{shareDiscount.value === 1 && (
专属优惠
)}

{musicDetail.value?.name}

作曲人:{musicDetail.value?.composer}

{downloadStatus.value && ( )}
选择转换曲谱
onChangeStaff('staff')} > {{ icon: () => ( ), title: () => 五线谱, value: () => ( {{ icon: (props: any) => ( ) }} ) }} onChangeStaff('first')} > {{ icon: () => ( ), title: () => 简谱-首调, value: () => ( {{ icon: (props: any) => ( ) }} ) }} onChangeStaff('fixed')} > {{ icon: () => ( ), title: () => 简谱-固定调, value: () => ( {{ icon: (props: any) => ( ) }} ) }}
{ staffData.open = false staffData.partIndex = value.value staffData.partXmlIndex = value.xmlValue staffData.instrumentName = value.instrumentName showImg.value = [] nextTick(() => { let tempPdf = value?.musicPdfUrl if (musicDetail.value?.musicSheetType !== 'CONCERT') { // tempPdf = '' if (staff.radio === 'first') { tempPdf = value?.firstPdfUrl } else if (staff.radio === 'fixed') { tempPdf = value?.jianPdfUrl } else if (staff.radio === 'staff') { tempPdf = value?.musicPdfUrl } } if (tempPdf) { musicPdfUrl.value = tempPdf renderStaff() } else { musicPdfUrl.value = '' loading.value = true // 为了处理,之前是使用pdf渲染,现在又用osmd,iframe没有重新加载 if (staffData.iframeSrc.indexOf('pdf/web') !== -1) { renderStaff() } else { resetRender() } } }) }} onCancel={() => (staffData.open = false)} />
) } } })