123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- import {
- defineComponent,
- ref,
- reactive,
- onMounted,
- computed,
- watch
- } from 'vue';
- import { useRoute } from 'vue-router';
- import request from '@/helpers/request';
- import MEmpty from '@/components/m-empty';
- import styles from './index.module.less';
- import musicBg from '../../image/music_bg.png';
- import titleIcon1 from '../../image/title_icon1.png';
- import titleIcon2 from '../../image/title_icon2.png';
- import playIcon from '../../image/music_play_icon.png';
- import pauseIcon from '../../image/music_pause_icon.png';
- import emptyIcon from '../../image/ins-empty-icon.png';
- import { NoticeBar } from 'vant';
- import PlayItem from '../play-item';
- export default defineComponent({
- name: 'InstrumentInfo',
- props: {
- id: {
- type: String,
- default: ''
- },
- type: {
- type: String,
- default: ''
- },
- show: {
- type: Boolean,
- default: false
- }
- },
- emits: ['close', 'select'],
- setup(props, { emit }) {
- const route = useRoute();
- const forms = reactive({
- detailId: route.query.detailId,
- loading: false,
- dataInfo: {} as any,
- musicList: [] as any,
- title: ' ',
- playState: 'pause' as 'play' | 'pause',
- showPlayer: false,
- listActive: 0
- });
- /** 选中的item */
- const activeItem = computed(() => {
- return forms.musicList[forms.listActive] || {};
- });
- const getDetail = async () => {
- forms.loading = true;
- try {
- const { data } = await request.get(
- '/edu-app/knowledgeWiki/detail/' + props.id
- );
- data.intros = data.intros.replace(
- /<video/gi,
- '<video class="video-music" style="width: 100% !important;" controlslist="nodownload" poster="https://oss.dayaedu.com/ktqy/1701759849244.png"'
- );
- forms.dataInfo = data || {};
- forms.musicList = data.knowledgeWikiResources.map((item: any) => {
- return {
- id: item.id,
- name: item.name,
- url: item.url
- };
- });
- } catch {}
- forms.loading = false;
- };
- /** 播放曲目 */
- const handlePlay = (item: any) => {
- const index = forms.musicList.findIndex(
- (_item: any) => _item.id === item.id
- );
- if (index > -1) {
- if (forms.listActive === index) {
- forms.playState = forms.playState === 'play' ? 'pause' : 'play';
- } else {
- forms.playState = 'play';
- }
- forms.showPlayer = true;
- forms.listActive = index;
- }
- };
- /** 音频控制 */
- const handleChangeAudio = (
- type: 'play' | 'pause' | 'pre' | 'next' | 'favitor'
- ) => {
- if (type === 'play') {
- forms.playState = 'play';
- } else if (type === 'pause') {
- forms.playState = 'pause';
- } else if (type === 'pre') {
- if (forms.musicList[forms.listActive - 1]) {
- handlePlay(forms.musicList[forms.listActive - 1]);
- }
- } else if (type === 'next') {
- if (forms.musicList[forms.listActive + 1]) {
- handlePlay(forms.musicList[forms.listActive + 1]);
- }
- }
- };
- watch(
- () => props.show,
- val => {
- if (val) {
- // onToggleAudio();
- } else {
- // audioRef.value.pause();
- // data.playState = 'pause';
- handleChangeAudio('pause');
- try {
- // 暂停视频
- const doms = document.querySelectorAll('.video-music');
- if (doms && doms.length > 0) {
- doms.forEach((dom: any) => {
- dom.pause();
- });
- }
- } catch {
- //
- }
- }
- }
- );
- onMounted(async () => {
- await getDetail();
- });
- return () => (
- <div
- class={[styles.knowledgeBg, forms.showPlayer ? styles.wrapBottom : '']}>
- <div class={styles.left}>
- {props.type === 'wiki' && (
- <div class={styles.insTop}>
- <div class={styles.imgSection}>
- <img
- class={styles.img}
- src={forms.dataInfo.avatar || musicBg}
- />
- <div class={styles.pan}>
- <img src={forms.dataInfo.avatar || musicBg} />
- </div>
- </div>
- {/* <div class={styles.songName}>{forms.dataInfo.name || '--'}</div> */}
- <NoticeBar
- text={forms.dataInfo.name}
- color="#000"
- class={styles.songName}
- background="none"
- />
- <div class={styles.songWords}>
- {forms.dataInfo.lyricists && (
- <span>作词:{forms.dataInfo.lyricists}</span>
- )}
- {forms.dataInfo.composers && (
- <span>作曲:{forms.dataInfo.composers}</span>
- )}
- </div>
- </div>
- )}
- {props.type === 'instrument' && (
- <div class={styles.insTop}>
- <img src={forms.dataInfo.avatar} />
- <div class={styles.insName}>{forms.dataInfo.name || ''}</div>
- <div class={styles.insTro}>
- {forms.dataInfo.knowledgeWikiCategoryName || ''}
- </div>
- </div>
- )}
- {props.type === 'musician' && (
- <div class={styles.insTop}>
- <img class={styles.musician} src={forms.dataInfo.avatar} />
- <div class={styles.insName}>{forms.dataInfo.name || ''}</div>
- <div class={styles.insTro}>
- {forms.dataInfo.knowledgeWikiCategoryName || ''}
- </div>
- </div>
- )}
- <div class={styles.insList}>
- {forms.musicList.length ? (
- <>
- {forms.musicList.map((item: any, index: number) => {
- return (
- <div
- class={styles.li}
- onClick={(e: Event) => {
- e.stopPropagation();
- handlePlay(item);
- }}>
- <img class={styles.liBg} src={musicBg} />
- <div class={styles.liName}>{item.name || '--'}</div>
- <img
- class={styles.liPlay}
- src={
- forms.listActive === index &&
- forms.playState === 'play'
- ? pauseIcon
- : playIcon
- }
- />
- </div>
- );
- })}
- </>
- ) : (
- <div class={styles.emptyBox}>
- <img src={emptyIcon} />
- <span>暂无曲目~</span>
- </div>
- )}
- </div>
- </div>
- <div class={styles.right}>
- <div class={styles.title}>
- <img
- class={styles.liBg}
- src={props.type === 'musician' ? titleIcon2 : titleIcon1}
- />
- {props.type === 'wiki'
- ? '乐器简介'
- : props.type === 'instrument'
- ? '名曲故事'
- : props.type === 'musician'
- ? '个人简介'
- : ''}
- </div>
- <div class={styles.desc} v-html={forms.dataInfo.intros}></div>
- {!forms.loading && !forms.dataInfo.intros && (
- <MEmpty description="暂无内容" />
- )}
- </div>
- {forms.musicList.length !== 0 && (
- <PlayItem
- show={forms.showPlayer}
- playState={forms.playState}
- item={activeItem.value}
- onChange={value => handleChangeAudio(value)}
- />
- )}
- </div>
- );
- }
- });
|