import { defineComponent, onMounted, reactive, ref } from 'vue'; import WaveSurfer from 'wavesurfer.js'; import styles from './index.module.less'; import MSticky from '@/components/m-sticky'; import MHeader from '@/components/m-header'; import { Cell, Image, List, Popup, Slider } from 'vant'; import iconMember from './images/icon-member.png'; import iconZan from './images/icon-zan.png'; import iconZanActive from './images/icon-zan-active.png'; import iconZ from './images/icon-z.png'; import iconPlay from './images/icon-play.png'; import iconPause from './images/icon-pause.png'; import { browser, getGradeCh, getSecondRPM } from '@/helpers/utils'; import { onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router'; import { api_openUserMusicDetail, api_openUserMusicPage, api_userMusicStar, api_verification } from './api'; import MEmpty from '@/components/m-empty'; import { nextTick } from 'process'; import MVideo from '@/components/m-video'; import LoginModel from './login-model'; import { removeAuth } from '../student-register/layout/utils'; import { setLogout } from '@/state'; import { storage } from '@/helpers/storage'; import { ACCESS_TOKEN } from '@/store/mutation-types'; export default defineComponent({ name: 'creation-detail', setup() { const route = useRoute(); const router = useRouter(); const audioId = 'a' + +Date.now() + Math.floor(Math.random() * 100); const state = reactive({ id: route.query.id, loginTag: false, // 是否登录标识 loginStatus: false, playType: '' as 'Audio' | 'Video' | '', // 播放类型 musicDetail: {} as any, timer: null as any, paused: true, currentTime: 0, duration: 0.1, loop: false, dragStatus: false, // 是否开始拖动 isClick: false, list: [] as any, listState: { dataShow: true, // 判断是否有数据 loading: false, finished: false }, params: { page: 1, rows: 20 } }); const wavesurfer = ref(); const audioDom = new Audio(); audioDom.controls = true; audioDom.style.width = '100%'; audioDom.className = styles.audio; /** 改变播放时间 */ const handleChangeTime = (val: number) => { state.currentTime = val; clearTimeout(state.timer); state.timer = setTimeout(() => { audioDom.currentTime = val; state.timer = null; }, 60); }; // 切换音频播放 const onToggleAudio = (e: any) => { e.stopPropagation(); if (audioDom.paused) { audioDom.play(); } else { audioDom.pause(); } state.paused = audioDom.paused; }; // 点赞 const onStarChange = async () => { // 是否登录 if (!state.loginTag) { state.loginStatus = true; return; } try { await api_userMusicStar({ userMusicId: state.id, star: !state.musicDetail.starFlag }); state.musicDetail.starFlag = !state.musicDetail.starFlag; if (state.musicDetail.starFlag) { state.musicDetail.likeNum += 1; } else { state.musicDetail.likeNum -= 1; } } catch { // } }; // 获取列表 const getList = async () => { try { if (state.isClick) return; state.isClick = true; const res = await api_openUserMusicPage({ type: 'FORMAL', exclusionId: state.id, ...state.params }); state.listState.loading = false; const result = res.data || {}; // 处理重复请求数据 if (state.list.length > 0 && result.current === 1) { return; } state.list = state.list.concat(result.rows || []); state.listState.finished = result.current >= result.pages; state.params.page = result.current + 1; state.listState.dataShow = state.list.length > 0; state.isClick = false; } catch { state.listState.dataShow = false; state.listState.finished = true; state.isClick = false; } }; const onDetail = (item: any) => { console.log(item, 'item'); router.push({ path: '/shareCreation', query: { id: item.id } }); }; const initAudio = () => { wavesurfer.value = WaveSurfer.create({ container: document.querySelector(`#${audioId}`) as HTMLElement, waveColor: '#fff', progressColor: '#2FA1FD', url: state.musicDetail.videoUrl, cursorWidth: 0, height: 35, width: 'auto', normalize: true, // Set a bar width barWidth: 2, // Optionally, specify the spacing between bars barGap: 2, // And the bar radius barRadius: 4, barHeight: 0.6, autoScroll: true, /** If autoScroll is enabled, keep the cursor in the center of the waveform during playback */ autoCenter: true, hideScrollbar: false, media: audioDom }); wavesurfer.value.once('interaction', () => { // wavesurfer.value.play(); }); wavesurfer.value.once('ready', () => { state.paused = audioDom.paused; state.duration = audioDom.duration; }); wavesurfer.value.on('finish', () => { state.paused = true; }); // 播放时监听 audioDom.addEventListener('timeupdate', () => { state.currentTime = audioDom.currentTime; }); }; const __init = async () => { try { // 判断是否登录 const Authorization = storage.get(ACCESS_TOKEN) || ''; if (Authorization) { const res = await api_verification({ token: Authorization }); console.log(res, 'res'); state.loginTag = res.data; if (!res.data) { removeAuth(); setLogout(); } } const { data } = await api_openUserMusicDetail(state.id); state.musicDetail = data; getList(); // 判断是视频还是音频 if (data.videoFilePath) { state.playType = 'Video'; } else { state.playType = 'Audio'; // 初始化 nextTick(() => { initAudio(); }); } } catch { // } }; onMounted(async () => { __init(); }); onBeforeRouteUpdate((to: any) => { state.id = to.query.id; state.playType = ''; state.params.page = 1; __init(); }); return () => (
{state.musicDetail.username}
{state.musicDetail.vipFlag && (
)}
{state.musicDetail.subjectName}{' '} {getGradeCh(state.musicDetail.currentGradeNum)}