|
@@ -1,4 +1,11 @@
|
|
|
-import { defineComponent, nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
|
|
|
+import {
|
|
|
+ defineComponent,
|
|
|
+ nextTick,
|
|
|
+ onMounted,
|
|
|
+ onUnmounted,
|
|
|
+ reactive,
|
|
|
+ ref
|
|
|
+} from 'vue';
|
|
|
import styles from './index.module.less';
|
|
|
import TheSearch from '/src/components/TheSearch';
|
|
|
import recommendTitle from './images/reommon_title.png';
|
|
@@ -10,11 +17,11 @@ import { useRouter } from 'vue-router';
|
|
|
import { api_musicSheetQueryByTag } from './api';
|
|
|
import { api_musicSheetPage } from '../xiaoku-ai/api';
|
|
|
import TheEmpty from '/src/components/TheEmpty';
|
|
|
-import titleBg from './images/title-bg.png'
|
|
|
+import titleBg from './images/title-bg.png';
|
|
|
import { vaildMusicScoreUrl } from '/src/utils/urlUtils';
|
|
|
import PreviewWindow from '../preview-window';
|
|
|
import { useUserStore } from '/src/store/modules/users';
|
|
|
-import {state as baseState} from '/src/state';
|
|
|
+import { state as baseState } from '/src/state';
|
|
|
import { exitFullscreen, fscreen } from '/src/utils';
|
|
|
|
|
|
export const formatUsedNum = (num: number) => {
|
|
@@ -37,6 +44,7 @@ export default defineComponent({
|
|
|
RECOMMEND: [] as any,
|
|
|
isSearch: false, // 是否点击搜索
|
|
|
keyword: null as any,
|
|
|
+ detailLoading: false,
|
|
|
list: [] as any,
|
|
|
loading: false as any,
|
|
|
finshed: false,
|
|
@@ -46,28 +54,32 @@ export default defineComponent({
|
|
|
previewParams: {
|
|
|
type: '',
|
|
|
src: ''
|
|
|
- } as any,
|
|
|
+ } as any
|
|
|
});
|
|
|
|
|
|
-
|
|
|
-
|
|
|
/** 获取三个模块 */
|
|
|
const getDetail = async () => {
|
|
|
+ state.detailLoading = true;
|
|
|
try {
|
|
|
- const { data } = await api_musicSheetQueryByTag();
|
|
|
+ const { data } = await api_musicSheetQueryByTag({ rows: 48 });
|
|
|
state.RECOMMEND = data.RECOMMEND || [];
|
|
|
state.HOT = data.HOT || [];
|
|
|
state.NEW = data.NEW || [];
|
|
|
} catch {
|
|
|
//
|
|
|
}
|
|
|
+ state.detailLoading = false;
|
|
|
};
|
|
|
|
|
|
/** 获取更多 */
|
|
|
const getList = async () => {
|
|
|
state.loading = true;
|
|
|
try {
|
|
|
- const { data } = await api_musicSheetPage({ keyword: state.keyword, page: state.page, rows: state.rows });
|
|
|
+ const { data } = await api_musicSheetPage({
|
|
|
+ keyword: state.keyword,
|
|
|
+ page: state.page,
|
|
|
+ rows: state.rows
|
|
|
+ });
|
|
|
const result = data.rows || [];
|
|
|
result.forEach((item: any) => {
|
|
|
if (item.musicSheetName) {
|
|
@@ -103,7 +115,7 @@ export default defineComponent({
|
|
|
}
|
|
|
});
|
|
|
obv.observe(spinRef.value);
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
// 查看更多
|
|
|
const onMore = (type?: '' | 'RECOMMEND' | 'NEW' | 'HOT') => {
|
|
@@ -119,20 +131,11 @@ export default defineComponent({
|
|
|
const onDetail = (item: any) => {
|
|
|
// 默认进页面显示对应的曲谱
|
|
|
let lineType = item.scoreType || 'FIRST';
|
|
|
- // if (data.showMusicImg === 'first') {
|
|
|
- // lineType = 'firstTone';
|
|
|
- // } else if (data.showMusicImg === 'fixed') {
|
|
|
- // lineType = 'fixedTone';
|
|
|
- // } else if (data.showMusicImg === 'staff') {
|
|
|
- // lineType = 'staff';
|
|
|
- // }
|
|
|
let src = `${vaildMusicScoreUrl()}/instrument?v=${+new Date()}&platform=pc&id=${
|
|
|
item.id
|
|
|
}&Authorization=${
|
|
|
userStore.getToken
|
|
|
- }&musicRenderType=${lineType}&showGuide=true&part-index=${
|
|
|
- 0
|
|
|
- }`;
|
|
|
+ }&musicRenderType=${lineType}&showGuide=true&part-index=${0}`;
|
|
|
|
|
|
if (window.matchMedia('(display-mode: standalone)').matches) {
|
|
|
baseState.application = window.matchMedia(
|
|
@@ -147,14 +150,14 @@ export default defineComponent({
|
|
|
} else {
|
|
|
window.open(src, +new Date() + '');
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
const iframeHandle = (ev: MessageEvent) => {
|
|
|
if (ev.data?.api === 'onAttendToggleMenu') {
|
|
|
- exitFullscreen()
|
|
|
+ exitFullscreen();
|
|
|
state.previewModal = !state.previewModal;
|
|
|
}
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
onMounted(() => {
|
|
|
getDetail();
|
|
@@ -163,8 +166,8 @@ export default defineComponent({
|
|
|
});
|
|
|
|
|
|
onUnmounted(() => {
|
|
|
- window.removeEventListener('message', iframeHandle)
|
|
|
- })
|
|
|
+ window.removeEventListener('message', iframeHandle);
|
|
|
+ });
|
|
|
return () => (
|
|
|
<div class={styles.list}>
|
|
|
<h2 class={styles.topTitle}>
|
|
@@ -176,60 +179,67 @@ export default defineComponent({
|
|
|
round
|
|
|
class={styles.searchInput}
|
|
|
onSearch={val => {
|
|
|
- if(val && val.trim()) {
|
|
|
+ if (val && val.trim()) {
|
|
|
state.isSearch = true;
|
|
|
- state.keyword = val.trim()
|
|
|
+ state.keyword = val.trim();
|
|
|
state.loading = true;
|
|
|
state.finshed = false;
|
|
|
- state.list = []
|
|
|
+ state.list = [];
|
|
|
getList();
|
|
|
nextTick(() => {
|
|
|
- __initSpin()
|
|
|
- })
|
|
|
+ __initSpin();
|
|
|
+ });
|
|
|
} else {
|
|
|
state.isSearch = false;
|
|
|
}
|
|
|
}}
|
|
|
/>
|
|
|
|
|
|
- <div class={styles.moreMusic} onClick={() => onMore()}>全部曲目</div>
|
|
|
+ <div class={styles.moreMusic} onClick={() => onMore()}>
|
|
|
+ 全部曲目
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
{state.isSearch ? (
|
|
|
<div class={styles.searchContainer}>
|
|
|
<NScrollbar>
|
|
|
- <div class={styles.sectionContainer}>
|
|
|
- {state.list.map((item: any) => (
|
|
|
- <div class={styles.sectionItem}>
|
|
|
- <div class={styles.img} style={{ marginLeft: 0 }}>
|
|
|
- <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
- </div>
|
|
|
- <div class={styles.infos}>
|
|
|
- <div
|
|
|
- class={styles.topName}
|
|
|
- v-html={item.musicNameReg}></div>
|
|
|
- <div class={styles.types}>
|
|
|
- <div class={styles.hot}>
|
|
|
- <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
- </div>
|
|
|
- {item.audioPlayTypes?.includes('SING') && (
|
|
|
- <div class={styles.sing}>演唱</div>
|
|
|
- )}
|
|
|
- {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
- <div class={styles.song}>演奏</div>
|
|
|
- )}
|
|
|
+ <div class={styles.sectionContainer}>
|
|
|
+ {state.list.map((item: any) => (
|
|
|
+ <div
|
|
|
+ class={styles.sectionItem}
|
|
|
+ onClick={() => onDetail(item)}>
|
|
|
+ <div class={styles.img} style={{ marginLeft: 0 }}>
|
|
|
+ <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.infos}>
|
|
|
+ <div
|
|
|
+ class={styles.topName}
|
|
|
+ v-html={item.musicNameReg}></div>
|
|
|
+ <div class={styles.types}>
|
|
|
+ <div class={styles.hot}>
|
|
|
+ <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
+ </div>
|
|
|
+ {item.audioPlayTypes?.includes('SING') && (
|
|
|
+ <div class={styles.sing}>演唱</div>
|
|
|
+ )}
|
|
|
+ {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
+ <div class={styles.song}>演奏</div>
|
|
|
+ )}
|
|
|
|
|
|
- <div class={styles.author}>{item.composer}</div>
|
|
|
+ <div class={styles.author}>{item.composer}</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </div>
|
|
|
- <div
|
|
|
- ref={spinRef}
|
|
|
- class={[styles.loadingWrap, state.finshed && styles.showLoading]}>
|
|
|
- <NSpin show={true}></NSpin>
|
|
|
- </div>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ ref={spinRef}
|
|
|
+ class={[
|
|
|
+ styles.loadingWrap,
|
|
|
+ state.finshed && styles.showLoading
|
|
|
+ ]}>
|
|
|
+ <NSpin show={true}></NSpin>
|
|
|
+ </div>
|
|
|
</NScrollbar>
|
|
|
|
|
|
{!state.loading && state.list.length === 0 && (
|
|
@@ -244,150 +254,160 @@ export default defineComponent({
|
|
|
<div class={styles.sectionTitle}>
|
|
|
<img src={recommendTitle} class={styles.imgTitle} />
|
|
|
|
|
|
- <div class={styles.moreBtn} onClick={() => onMore("RECOMMEND")}>更多</div>
|
|
|
+ <div class={styles.moreBtn} onClick={() => onMore('RECOMMEND')}>
|
|
|
+ 更多
|
|
|
+ </div>
|
|
|
</div>
|
|
|
|
|
|
- <NScrollbar>
|
|
|
- {state.RECOMMEND.map((item: any, index: number) => (
|
|
|
- <div
|
|
|
- class={styles.item}
|
|
|
- onClick={() => {
|
|
|
- onDetail(item)
|
|
|
- }}>
|
|
|
+ <NSpin show={state.detailLoading}>
|
|
|
+ <NScrollbar>
|
|
|
+ {state.RECOMMEND.map((item: any, index: number) => (
|
|
|
<div
|
|
|
- class={[
|
|
|
- styles.num,
|
|
|
- index === 0 ? styles.num1 : '',
|
|
|
- index === 1 ? styles.num2 : '',
|
|
|
- index === 2 ? styles.num3 : ''
|
|
|
- ]}>
|
|
|
- {(index + 1).toString().padStart(2, '0')}
|
|
|
- </div>
|
|
|
- <div class={styles.img}>
|
|
|
- <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
- </div>
|
|
|
- <div class={styles.infos}>
|
|
|
- <div class={styles.topName}>
|
|
|
- <TheNoticeBar text={item.musicSheetName} />
|
|
|
+ class={styles.item}
|
|
|
+ onClick={() => {
|
|
|
+ onDetail(item);
|
|
|
+ }}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.num,
|
|
|
+ index === 0 ? styles.num1 : '',
|
|
|
+ index === 1 ? styles.num2 : '',
|
|
|
+ index === 2 ? styles.num3 : ''
|
|
|
+ ]}>
|
|
|
+ {(index + 1).toString().padStart(2, '0')}
|
|
|
</div>
|
|
|
- <div class={styles.types}>
|
|
|
- <div class={styles.hot}>
|
|
|
- <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
+ <div class={styles.img}>
|
|
|
+ <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.infos}>
|
|
|
+ <div class={styles.topName}>
|
|
|
+ <TheNoticeBar text={item.musicSheetName} />
|
|
|
</div>
|
|
|
- {item.audioPlayTypes?.includes('SING') && (
|
|
|
- <div class={styles.sing}>演唱</div>
|
|
|
- )}
|
|
|
- {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
- <div class={styles.song}>演奏</div>
|
|
|
- )}
|
|
|
+ <div class={styles.types}>
|
|
|
+ <div class={styles.hot}>
|
|
|
+ <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
+ </div>
|
|
|
+ {item.audioPlayTypes?.includes('SING') && (
|
|
|
+ <div class={styles.sing}>演唱</div>
|
|
|
+ )}
|
|
|
+ {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
+ <div class={styles.song}>演奏</div>
|
|
|
+ )}
|
|
|
|
|
|
- <div class={styles.author}>{item.composer}</div>
|
|
|
+ <div class={styles.author}>{item.composer}</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </NScrollbar>
|
|
|
+ ))}
|
|
|
+ </NScrollbar>
|
|
|
+ </NSpin>
|
|
|
</div>
|
|
|
<div class={[styles.section, styles.hotSection]}>
|
|
|
<div class={styles.sectionTitle}>
|
|
|
<img src={hotTitle} class={styles.imgTitle} />
|
|
|
- <div class={styles.moreBtn} onClick={() => onMore("HOT")}>更多</div>
|
|
|
+ <div class={styles.moreBtn} onClick={() => onMore('HOT')}>
|
|
|
+ 更多
|
|
|
+ </div>
|
|
|
</div>
|
|
|
-
|
|
|
- <NScrollbar>
|
|
|
- {state.HOT.map((item: any, index: number) => (
|
|
|
- <div
|
|
|
- class={styles.item}
|
|
|
- onClick={() => {
|
|
|
- onDetail(item);
|
|
|
- }}>
|
|
|
+ <NSpin show={state.detailLoading}>
|
|
|
+ <NScrollbar>
|
|
|
+ {state.HOT.map((item: any, index: number) => (
|
|
|
<div
|
|
|
- class={[
|
|
|
- styles.num,
|
|
|
- index === 0 ? styles.num1 : '',
|
|
|
- index === 1 ? styles.num2 : '',
|
|
|
- index === 2 ? styles.num3 : ''
|
|
|
- ]}>
|
|
|
- {(index + 1).toString().padStart(2, '0')}
|
|
|
- </div>
|
|
|
- <div class={styles.img}>
|
|
|
- <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
- </div>
|
|
|
- <div class={styles.infos}>
|
|
|
- <div class={styles.topName}>
|
|
|
- <TheNoticeBar text={item.musicSheetName} />
|
|
|
+ class={styles.item}
|
|
|
+ onClick={() => {
|
|
|
+ onDetail(item);
|
|
|
+ }}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.num,
|
|
|
+ index === 0 ? styles.num1 : '',
|
|
|
+ index === 1 ? styles.num2 : '',
|
|
|
+ index === 2 ? styles.num3 : ''
|
|
|
+ ]}>
|
|
|
+ {(index + 1).toString().padStart(2, '0')}
|
|
|
</div>
|
|
|
- <div class={styles.types}>
|
|
|
- <div class={styles.hot}>
|
|
|
- <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
+ <div class={styles.img}>
|
|
|
+ <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.infos}>
|
|
|
+ <div class={styles.topName}>
|
|
|
+ <TheNoticeBar text={item.musicSheetName} />
|
|
|
</div>
|
|
|
- {item.audioPlayTypes?.includes('SING') && (
|
|
|
- <div class={styles.sing}>演唱</div>
|
|
|
- )}
|
|
|
- {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
- <div class={styles.song}>演奏</div>
|
|
|
- )}
|
|
|
+ <div class={styles.types}>
|
|
|
+ <div class={styles.hot}>
|
|
|
+ <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
+ </div>
|
|
|
+ {item.audioPlayTypes?.includes('SING') && (
|
|
|
+ <div class={styles.sing}>演唱</div>
|
|
|
+ )}
|
|
|
+ {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
+ <div class={styles.song}>演奏</div>
|
|
|
+ )}
|
|
|
|
|
|
- <div class={styles.author}>{item.composer}</div>
|
|
|
+ <div class={styles.author}>{item.composer}</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </NScrollbar>
|
|
|
+ ))}
|
|
|
+ </NScrollbar>
|
|
|
+ </NSpin>
|
|
|
</div>
|
|
|
<div class={[styles.section, styles.newSection]}>
|
|
|
<div class={styles.sectionTitle}>
|
|
|
<img src={newTitle} class={styles.imgTitle} />
|
|
|
|
|
|
- <div class={styles.moreBtn} onClick={() => onMore("NEW")}>更多</div>
|
|
|
+ <div class={styles.moreBtn} onClick={() => onMore('NEW')}>
|
|
|
+ 更多
|
|
|
+ </div>
|
|
|
</div>
|
|
|
-
|
|
|
- <NScrollbar>
|
|
|
- {state.NEW.map((item: any, index: number) => (
|
|
|
- <div
|
|
|
- class={styles.item}
|
|
|
- onClick={() => {
|
|
|
- onDetail(item)
|
|
|
- }}>
|
|
|
+ <NSpin show={state.detailLoading}>
|
|
|
+ <NScrollbar>
|
|
|
+ {state.NEW.map((item: any, index: number) => (
|
|
|
<div
|
|
|
- class={[
|
|
|
- styles.num,
|
|
|
- index === 0 ? styles.num1 : '',
|
|
|
- index === 1 ? styles.num2 : '',
|
|
|
- index === 2 ? styles.num3 : ''
|
|
|
- ]}>
|
|
|
- {(index + 1).toString().padStart(2, '0')}
|
|
|
- </div>
|
|
|
- <div class={styles.img}>
|
|
|
- <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
- </div>
|
|
|
- <div class={styles.infos}>
|
|
|
- <div class={styles.topName}>
|
|
|
- <TheNoticeBar text={item.musicSheetName} />
|
|
|
+ class={styles.item}
|
|
|
+ onClick={() => {
|
|
|
+ onDetail(item);
|
|
|
+ }}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.num,
|
|
|
+ index === 0 ? styles.num1 : '',
|
|
|
+ index === 1 ? styles.num2 : '',
|
|
|
+ index === 2 ? styles.num3 : ''
|
|
|
+ ]}>
|
|
|
+ {(index + 1).toString().padStart(2, '0')}
|
|
|
</div>
|
|
|
- <div class={styles.types}>
|
|
|
- <div class={styles.hot}>
|
|
|
- <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
+ <div class={styles.img}>
|
|
|
+ <img referrerpolicy="no-referrer" src={item.titleImg} />
|
|
|
+ </div>
|
|
|
+ <div class={styles.infos}>
|
|
|
+ <div class={styles.topName}>
|
|
|
+ <TheNoticeBar text={item.musicSheetName} />
|
|
|
</div>
|
|
|
- {item.audioPlayTypes?.includes('SING') && (
|
|
|
- <div class={styles.sing}>演唱</div>
|
|
|
- )}
|
|
|
- {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
- <div class={styles.song}>演奏</div>
|
|
|
- )}
|
|
|
+ <div class={styles.types}>
|
|
|
+ <div class={styles.hot}>
|
|
|
+ <span>{formatUsedNum(item.usedNum)}</span>
|
|
|
+ </div>
|
|
|
+ {item.audioPlayTypes?.includes('SING') && (
|
|
|
+ <div class={styles.sing}>演唱</div>
|
|
|
+ )}
|
|
|
+ {item.audioPlayTypes?.includes('PLAY') && (
|
|
|
+ <div class={styles.song}>演奏</div>
|
|
|
+ )}
|
|
|
|
|
|
- <div class={styles.author}>{item.composer}</div>
|
|
|
+ <div class={styles.author}>{item.composer}</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </NScrollbar>
|
|
|
+ ))}
|
|
|
+ </NScrollbar>
|
|
|
+ </NSpin>
|
|
|
</div>
|
|
|
</div>
|
|
|
)}
|
|
|
|
|
|
- {/* 应用内预览*/}
|
|
|
- <PreviewWindow
|
|
|
+ {/* 应用内预览*/}
|
|
|
+ <PreviewWindow
|
|
|
v-model:show={state.previewModal}
|
|
|
type="music"
|
|
|
params={state.previewParams}
|