|  | @@ -0,0 +1,415 @@
 | 
	
		
			
				|  |  | +import { defineComponent, onMounted, reactive } 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 { Button, Cell, Image, List, Popup, Slider, showToast } from 'vant';
 | 
	
		
			
				|  |  | +import iconDownload from './images/icon-download.png';
 | 
	
		
			
				|  |  | +import iconShare from './images/icon-share.png';
 | 
	
		
			
				|  |  | +import iconDelete from './images/icon-delete.png';
 | 
	
		
			
				|  |  | +import iconMember from './images/icon-member.png';
 | 
	
		
			
				|  |  | +import iconZan from './images/icon-zan.png';
 | 
	
		
			
				|  |  | +import iconZanActive from './images/icon-zan-active.png';
 | 
	
		
			
				|  |  | +import iconPlay from './images/icon-play.png';
 | 
	
		
			
				|  |  | +import iconPause from './images/icon-pause.png';
 | 
	
		
			
				|  |  | +import { postMessage } from '@/helpers/native-message';
 | 
	
		
			
				|  |  | +import { browser, getGradeCh, getSecondRPM } from '@/helpers/utils';
 | 
	
		
			
				|  |  | +import { useRoute, useRouter } from 'vue-router';
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  api_userMusicDetail,
 | 
	
		
			
				|  |  | +  api_userMusicRemove,
 | 
	
		
			
				|  |  | +  api_userMusicStarPage
 | 
	
		
			
				|  |  | +} from './api';
 | 
	
		
			
				|  |  | +import MEmpty from '@/components/m-empty';
 | 
	
		
			
				|  |  | +import dayjs from 'dayjs';
 | 
	
		
			
				|  |  | +import { nextTick } from 'process';
 | 
	
		
			
				|  |  | +import MVideo from '@/components/m-video';
 | 
	
		
			
				|  |  | +import ShareModel from './share-model';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +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,
 | 
	
		
			
				|  |  | +      deleteStatus: false,
 | 
	
		
			
				|  |  | +      shareStatus: 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 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(() => {
 | 
	
		
			
				|  |  | +        // audioRef.value.currentTime = val;
 | 
	
		
			
				|  |  | +        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 getStarList = async () => {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        if (state.isClick) return;
 | 
	
		
			
				|  |  | +        state.isClick = true;
 | 
	
		
			
				|  |  | +        const res = await api_userMusicStarPage({
 | 
	
		
			
				|  |  | +          userMusicId: 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 initAudio = () => {
 | 
	
		
			
				|  |  | +      const wavesurfer = 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.once('interaction', () => {
 | 
	
		
			
				|  |  | +        // wavesurfer.play();
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      wavesurfer.once('ready', () => {
 | 
	
		
			
				|  |  | +        state.paused = audioDom.paused;
 | 
	
		
			
				|  |  | +        state.duration = audioDom.duration;
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      wavesurfer.on('finish', () => {
 | 
	
		
			
				|  |  | +        state.paused = true;
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // 播放时监听
 | 
	
		
			
				|  |  | +      audioDom.addEventListener('timeupdate', () => {
 | 
	
		
			
				|  |  | +        state.currentTime = audioDom.currentTime;
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 删除作品
 | 
	
		
			
				|  |  | +    const onDelete = async () => {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        await api_userMusicRemove({ id: state.id });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        setTimeout(() => {
 | 
	
		
			
				|  |  | +          showToast('删除成功');
 | 
	
		
			
				|  |  | +        }, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        setTimeout(() => {
 | 
	
		
			
				|  |  | +          if (browser().isApp) {
 | 
	
		
			
				|  |  | +            postMessage({
 | 
	
		
			
				|  |  | +              api: 'goBack'
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +          } else {
 | 
	
		
			
				|  |  | +            router.back();
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }, 1200);
 | 
	
		
			
				|  |  | +      } catch {
 | 
	
		
			
				|  |  | +        //
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // 下载
 | 
	
		
			
				|  |  | +    const onDownload = () => {
 | 
	
		
			
				|  |  | +      //
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    onMounted(async () => {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        const { data } = await api_userMusicDetail(state.id);
 | 
	
		
			
				|  |  | +        state.musicDetail = data;
 | 
	
		
			
				|  |  | +        getStarList();
 | 
	
		
			
				|  |  | +        // 判断是视频还是音频
 | 
	
		
			
				|  |  | +        if (data.videoFilePath) {
 | 
	
		
			
				|  |  | +          state.playType = 'Video';
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          state.playType = 'Audio';
 | 
	
		
			
				|  |  | +          // 初始化
 | 
	
		
			
				|  |  | +          nextTick(() => {
 | 
	
		
			
				|  |  | +            initAudio();
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      } catch {
 | 
	
		
			
				|  |  | +        //
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    return () => (
 | 
	
		
			
				|  |  | +      <div class={styles.creation}>
 | 
	
		
			
				|  |  | +        <MSticky position="top">
 | 
	
		
			
				|  |  | +          <MHeader
 | 
	
		
			
				|  |  | +            border={false}
 | 
	
		
			
				|  |  | +            isBack={route.query.platformType != 'ANALYSIS'}
 | 
	
		
			
				|  |  | +          />
 | 
	
		
			
				|  |  | +        </MSticky>
 | 
	
		
			
				|  |  | +        <div class={styles.playSection}>
 | 
	
		
			
				|  |  | +          {state.playType === 'Video' && (
 | 
	
		
			
				|  |  | +            <MVideo
 | 
	
		
			
				|  |  | +              src={state.musicDetail.videoUrl}
 | 
	
		
			
				|  |  | +              poster={state.musicDetail.img}
 | 
	
		
			
				|  |  | +            />
 | 
	
		
			
				|  |  | +          )}
 | 
	
		
			
				|  |  | +          {state.playType === 'Audio' && (
 | 
	
		
			
				|  |  | +            <div class={styles.audioSection}>
 | 
	
		
			
				|  |  | +              <div class={styles.audioContainer}>
 | 
	
		
			
				|  |  | +                <div
 | 
	
		
			
				|  |  | +                  id={audioId}
 | 
	
		
			
				|  |  | +                  onClick={(e: MouseEvent) => {
 | 
	
		
			
				|  |  | +                    e.stopPropagation();
 | 
	
		
			
				|  |  | +                  }}></div>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +              <div class={styles.audioBox}>
 | 
	
		
			
				|  |  | +                <div class={styles.audioPan}>
 | 
	
		
			
				|  |  | +                  <Image class={styles.audioImg} src={state.musicDetail.img} />
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +                <i class={styles.audioPoint}></i>
 | 
	
		
			
				|  |  | +                <i class={styles.audioZhen}></i>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              <div
 | 
	
		
			
				|  |  | +                class={[styles.controls]}
 | 
	
		
			
				|  |  | +                onClick={(e: Event) => {
 | 
	
		
			
				|  |  | +                  e.stopPropagation();
 | 
	
		
			
				|  |  | +                }}
 | 
	
		
			
				|  |  | +                onTouchmove={(e: TouchEvent) => {
 | 
	
		
			
				|  |  | +                  // emit('close');
 | 
	
		
			
				|  |  | +                }}>
 | 
	
		
			
				|  |  | +                <div class={styles.actions}>
 | 
	
		
			
				|  |  | +                  <div class={styles.actionBtn} onClick={onToggleAudio}>
 | 
	
		
			
				|  |  | +                    <img src={state.paused ? iconPlay : iconPause} />
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +                <div class={[styles.slider]}>
 | 
	
		
			
				|  |  | +                  <Slider
 | 
	
		
			
				|  |  | +                    step={0.01}
 | 
	
		
			
				|  |  | +                    class={styles.timeProgress}
 | 
	
		
			
				|  |  | +                    v-model={state.currentTime}
 | 
	
		
			
				|  |  | +                    max={state.duration}
 | 
	
		
			
				|  |  | +                    onUpdate:modelValue={val => {
 | 
	
		
			
				|  |  | +                      handleChangeTime(val);
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                    onDragStart={() => {
 | 
	
		
			
				|  |  | +                      state.dragStatus = true;
 | 
	
		
			
				|  |  | +                      console.log('onDragStart');
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                    onDragEnd={() => {
 | 
	
		
			
				|  |  | +                      state.dragStatus = false;
 | 
	
		
			
				|  |  | +                      console.log('onDragEnd');
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                  />
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +                <div class={styles.time}>
 | 
	
		
			
				|  |  | +                  <div>{getSecondRPM(state.currentTime)}</div>
 | 
	
		
			
				|  |  | +                  <span>/</span>
 | 
	
		
			
				|  |  | +                  <div>{getSecondRPM(state.duration)}</div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          )}
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <Cell class={styles.userSection} center>
 | 
	
		
			
				|  |  | +          {{
 | 
	
		
			
				|  |  | +            icon: () => (
 | 
	
		
			
				|  |  | +              <Image class={styles.userLogo} src={state.musicDetail.avatar} />
 | 
	
		
			
				|  |  | +            ),
 | 
	
		
			
				|  |  | +            title: () => (
 | 
	
		
			
				|  |  | +              <div class={styles.userInfo}>
 | 
	
		
			
				|  |  | +                <p class={styles.name}>
 | 
	
		
			
				|  |  | +                  {state.musicDetail.username}
 | 
	
		
			
				|  |  | +                  {state.musicDetail.vipFlag && (
 | 
	
		
			
				|  |  | +                    <img src={iconMember} class={styles.iconMember} />
 | 
	
		
			
				|  |  | +                  )}
 | 
	
		
			
				|  |  | +                </p>
 | 
	
		
			
				|  |  | +                <p class={styles.sub}>
 | 
	
		
			
				|  |  | +                  {state.musicDetail.subjectName}{' '}
 | 
	
		
			
				|  |  | +                  {getGradeCh(state.musicDetail.currentGradeNum)}
 | 
	
		
			
				|  |  | +                </p>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            ),
 | 
	
		
			
				|  |  | +            value: () => (
 | 
	
		
			
				|  |  | +              <div class={styles.zan}>
 | 
	
		
			
				|  |  | +                <img src={iconZanActive} class={styles.iconZan} />
 | 
	
		
			
				|  |  | +                {state.musicDetail.likeNum}
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +          }}
 | 
	
		
			
				|  |  | +        </Cell>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <div class={styles.musicSection}>
 | 
	
		
			
				|  |  | +          <div class={styles.musicName}>
 | 
	
		
			
				|  |  | +            <span class={styles.musicTag}>曲目名称</span>
 | 
	
		
			
				|  |  | +            {state.musicDetail.musicSheetName}
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +          {state.musicDetail.desc && (
 | 
	
		
			
				|  |  | +            <div class={styles.musicDesc}>{state.musicDetail.desc}</div>
 | 
	
		
			
				|  |  | +          )}
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <div class={styles.likeSection}>
 | 
	
		
			
				|  |  | +          <div class={styles.likeTitle}>点赞记录</div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          {state.listState.dataShow ? (
 | 
	
		
			
				|  |  | +            <List
 | 
	
		
			
				|  |  | +              finished={state.listState.finished}
 | 
	
		
			
				|  |  | +              finishedText=" "
 | 
	
		
			
				|  |  | +              class={[styles.container, styles.containerInformation]}
 | 
	
		
			
				|  |  | +              onLoad={getStarList}
 | 
	
		
			
				|  |  | +              immediateCheck={false}>
 | 
	
		
			
				|  |  | +              {state.list.map((item: any) => (
 | 
	
		
			
				|  |  | +                <Cell class={styles.likeItem}>
 | 
	
		
			
				|  |  | +                  {{
 | 
	
		
			
				|  |  | +                    icon: () => (
 | 
	
		
			
				|  |  | +                      <Image src={item.userAvatar} class={styles.userLogo} />
 | 
	
		
			
				|  |  | +                    ),
 | 
	
		
			
				|  |  | +                    title: () => (
 | 
	
		
			
				|  |  | +                      <div class={styles.userInfo}>
 | 
	
		
			
				|  |  | +                        <p class={styles.name}>{item.userName}</p>
 | 
	
		
			
				|  |  | +                        <p class={styles.sub}>
 | 
	
		
			
				|  |  | +                          {item.subjectName} {getGradeCh(item.currentGradeNum)}
 | 
	
		
			
				|  |  | +                        </p>
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    ),
 | 
	
		
			
				|  |  | +                    value: () => (
 | 
	
		
			
				|  |  | +                      <div class={styles.time}>
 | 
	
		
			
				|  |  | +                        {dayjs(item.createTime).format('YYYY-MM-DD HH:mm')}
 | 
	
		
			
				|  |  | +                      </div>
 | 
	
		
			
				|  |  | +                    )
 | 
	
		
			
				|  |  | +                  }}
 | 
	
		
			
				|  |  | +                </Cell>
 | 
	
		
			
				|  |  | +              ))}
 | 
	
		
			
				|  |  | +            </List>
 | 
	
		
			
				|  |  | +          ) : (
 | 
	
		
			
				|  |  | +            <MEmpty description="暂无数据" />
 | 
	
		
			
				|  |  | +          )}
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <MSticky position="bottom">
 | 
	
		
			
				|  |  | +          <div class={styles.bottomSection}>
 | 
	
		
			
				|  |  | +            <div class={styles.bottomShare}>
 | 
	
		
			
				|  |  | +              <p onClick={onDownload}>
 | 
	
		
			
				|  |  | +                <img src={iconDownload} />
 | 
	
		
			
				|  |  | +                <span>下载</span>
 | 
	
		
			
				|  |  | +              </p>
 | 
	
		
			
				|  |  | +              <p onClick={() => (state.shareStatus = true)}>
 | 
	
		
			
				|  |  | +                <img src={iconShare} />
 | 
	
		
			
				|  |  | +                <span>分享</span>
 | 
	
		
			
				|  |  | +              </p>
 | 
	
		
			
				|  |  | +              <p onClick={() => (state.deleteStatus = true)}>
 | 
	
		
			
				|  |  | +                <img src={iconDelete} />
 | 
	
		
			
				|  |  | +                <span>删除</span>
 | 
	
		
			
				|  |  | +              </p>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +            <Button
 | 
	
		
			
				|  |  | +              round
 | 
	
		
			
				|  |  | +              class={styles.btnEdit}
 | 
	
		
			
				|  |  | +              type="primary"
 | 
	
		
			
				|  |  | +              onClick={() => {
 | 
	
		
			
				|  |  | +                router.push({
 | 
	
		
			
				|  |  | +                  path: '/creation-edit',
 | 
	
		
			
				|  |  | +                  query: {
 | 
	
		
			
				|  |  | +                    id: state.id
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +              }}>
 | 
	
		
			
				|  |  | +              编辑
 | 
	
		
			
				|  |  | +            </Button>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </MSticky>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <Popup
 | 
	
		
			
				|  |  | +          v-model:show={state.deleteStatus}
 | 
	
		
			
				|  |  | +          round
 | 
	
		
			
				|  |  | +          class={styles.popupContainer}>
 | 
	
		
			
				|  |  | +          <p class={styles.popupContent}>确定是否删除</p>
 | 
	
		
			
				|  |  | +          <div class={styles.popupBtnGroup}>
 | 
	
		
			
				|  |  | +            <Button round onClick={() => (state.deleteStatus = false)}>
 | 
	
		
			
				|  |  | +              取消
 | 
	
		
			
				|  |  | +            </Button>
 | 
	
		
			
				|  |  | +            <Button round type="primary" onClick={onDelete}>
 | 
	
		
			
				|  |  | +              确定
 | 
	
		
			
				|  |  | +            </Button>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </Popup>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        <Popup
 | 
	
		
			
				|  |  | +          position="bottom"
 | 
	
		
			
				|  |  | +          v-model:show={state.shareStatus}
 | 
	
		
			
				|  |  | +          safeAreaInsetBottom
 | 
	
		
			
				|  |  | +          style={{ background: 'transparent' }}>
 | 
	
		
			
				|  |  | +          <ShareModel
 | 
	
		
			
				|  |  | +            musicDetail={state.musicDetail}
 | 
	
		
			
				|  |  | +            onClose={() => (state.shareStatus = false)}
 | 
	
		
			
				|  |  | +          />
 | 
	
		
			
				|  |  | +        </Popup>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 |