|
@@ -28,8 +28,8 @@ import {
|
|
|
import TheSearch from '/src/components/TheSearch';
|
|
|
import { IMusicItem } from './type';
|
|
|
import icon_arrow from './images/icon_arrow.png';
|
|
|
-import icon_play from './images/icon_play.png';
|
|
|
-import icon_pause from './images/icon_pause.png';
|
|
|
+// import icon_play from './images/icon_play.png';
|
|
|
+// import icon_pause from './images/icon_pause.png';
|
|
|
import icon_goXiaoku from './images/icon_goXiaoku.png';
|
|
|
import icon_favitor from '/src/common/images/icon-collect-default.png';
|
|
|
import icon_favitorActive from '/src/common/images/icon-collect-active.png';
|
|
@@ -44,8 +44,8 @@ import { useCatchStore } from '/src/store/modules/catchData';
|
|
|
import {
|
|
|
api_materialFavorite,
|
|
|
api_materialFavoriteStatus,
|
|
|
- api_musicSheetPage,
|
|
|
- api_subjectList
|
|
|
+ api_musicSheetPage
|
|
|
+ // api_subjectList
|
|
|
} from '../xiaoku-ai/api';
|
|
|
import { useUserStore } from '/src/store/modules/users';
|
|
|
import Musicguide from '@/custom-plugins/guide-page/music-guide';
|
|
@@ -53,7 +53,9 @@ import TheEmpty from '/src/components/TheEmpty';
|
|
|
import { modalClickMask, state } from '/src/state';
|
|
|
import { useResizeObserver } from '@vueuse/core';
|
|
|
import { vaildMusicScoreUrl } from '/src/utils/urlUtils';
|
|
|
-import { getInstrumentName, sortMusical, trackToCode } from '/src/utils';
|
|
|
+import { getInstrumentName, sortMusical } from '/src/utils';
|
|
|
+import { audioPlayType } from '/src/utils/contants';
|
|
|
+import CCascader from '/src/components/CCascader';
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'XiaokuMusic',
|
|
@@ -67,6 +69,7 @@ export default defineComponent({
|
|
|
rows: 20,
|
|
|
status: true,
|
|
|
name: '', // 关键词
|
|
|
+ audioPlayTypes: '',
|
|
|
musicSheetCategoriesId: route.query.id || ''
|
|
|
});
|
|
|
const data = reactive({
|
|
@@ -75,6 +78,8 @@ export default defineComponent({
|
|
|
reshing: false,
|
|
|
tags: [] as any[],
|
|
|
tagIndex: 0,
|
|
|
+ musicalInstrumentId: '',
|
|
|
+ musicSubject: '',
|
|
|
list: [] as unknown as IMusicItem[],
|
|
|
listActive: 0,
|
|
|
musicInstrumentIndex: 0,
|
|
@@ -84,31 +89,54 @@ export default defineComponent({
|
|
|
showPreivew: false,
|
|
|
previewUrl: '',
|
|
|
showCloseBtn: true,
|
|
|
+ audioPlayTypeList: [] as any,
|
|
|
iframeSrc: '',
|
|
|
showMusicImg: 'staff' as 'staff' | 'first' | 'fixed', // 显示哪种曲谱
|
|
|
trackList: [] as any, // 可筛选的分轨信息
|
|
|
showTransBtn: true, // 是否显示转谱按钮
|
|
|
- trackName: '切换声轨' as any // 分轨名字
|
|
|
+ trackName: '切换声部' as any // 分轨名字
|
|
|
});
|
|
|
+ const subjects = ref('');
|
|
|
const showGuide = ref(false);
|
|
|
const userStore = useUserStore();
|
|
|
let musicsrc = '';
|
|
|
+ const formatParentCurrentValue = (list: any) => {
|
|
|
+ for (const item of list) {
|
|
|
+ if (item.instruments && item.instruments.length > 0) {
|
|
|
+ item.instruments.forEach((child: any) => {
|
|
|
+ child.columnName = '乐器';
|
|
|
+ });
|
|
|
+ item.children = item.instruments;
|
|
|
+ formatParentCurrentValue(item.instruments);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
const getSubjects = async () => {
|
|
|
// const res = await api_subjectList();
|
|
|
// if (Array.isArray(res?.data)) {
|
|
|
- const tempSubjectList = catchStore.getSubjectInstruments;
|
|
|
+ const tempSubjectList = catchStore.getSubjectList;
|
|
|
const subjectList = sessionStorage.getItem('musicSubjectList')
|
|
|
? JSON.parse(sessionStorage.getItem('musicSubjectList') as any)
|
|
|
: [];
|
|
|
const resultList: any[] = [];
|
|
|
+ console.log(tempSubjectList, subjectList, 'subjectList');
|
|
|
tempSubjectList.forEach((item: any) => {
|
|
|
const hasItem = subjectList.find((s: any) => s.id === item.id);
|
|
|
if (hasItem) {
|
|
|
resultList.push(item);
|
|
|
}
|
|
|
});
|
|
|
+ // data.tags = [
|
|
|
+ // { name: '全部', id: 0, value: 0, label: '全部' },
|
|
|
+ // ...resultList
|
|
|
+ // ];
|
|
|
+ formatParentCurrentValue(resultList);
|
|
|
data.tags = [
|
|
|
- { name: '全部', id: 0, value: 0, label: '全部' },
|
|
|
+ {
|
|
|
+ columnName: '声部',
|
|
|
+ name: '全部声部',
|
|
|
+ id: ''
|
|
|
+ },
|
|
|
...resultList
|
|
|
];
|
|
|
// }
|
|
@@ -117,10 +145,16 @@ export default defineComponent({
|
|
|
data.loading = true;
|
|
|
let res = {} as any;
|
|
|
try {
|
|
|
+ const { audioPlayTypes, ...result } = forms;
|
|
|
res = await api_musicSheetPage({
|
|
|
- ...forms,
|
|
|
- // musicSubject: data.tagIndex ? data.tagIndex : ''
|
|
|
- musicalInstrumentId: data.tagIndex ? data.tagIndex : ''
|
|
|
+ ...result,
|
|
|
+ audioPlayTypes: audioPlayTypes
|
|
|
+ ? audioPlayTypes === 'PLAY_SING'
|
|
|
+ ? ['PLAY', 'SING']
|
|
|
+ : [audioPlayTypes]
|
|
|
+ : [],
|
|
|
+ musicSubject: data.musicSubject,
|
|
|
+ musicalInstrumentId: data.musicalInstrumentId
|
|
|
});
|
|
|
} catch (error) {
|
|
|
console.log(error);
|
|
@@ -133,8 +167,21 @@ export default defineComponent({
|
|
|
}
|
|
|
|
|
|
if (res?.code === 200 && Array.isArray(res?.data?.rows)) {
|
|
|
+ console.log(res?.data?.rows);
|
|
|
+ const tempResult = res?.data?.rows || [];
|
|
|
+ tempResult.forEach((item: any) => {
|
|
|
+ item.audioPlayTypeArray = item.audioPlayTypes
|
|
|
+ ? item.audioPlayTypes.split(',')
|
|
|
+ : [];
|
|
|
+ });
|
|
|
data.list = [...data.list, ...res.data.rows];
|
|
|
data.finshed = res.data.rows.length < forms.rows;
|
|
|
+
|
|
|
+ // 是否显示总谱
|
|
|
+ const selectMusic = data.list[data.listActive];
|
|
|
+ if (selectMusic && selectMusic.isScoreRender && data.listActive === 0) {
|
|
|
+ data.musicInstrumentIndex = 999;
|
|
|
+ }
|
|
|
} else {
|
|
|
data.finshed = true;
|
|
|
}
|
|
@@ -170,6 +217,15 @@ export default defineComponent({
|
|
|
};
|
|
|
|
|
|
onMounted(async () => {
|
|
|
+ // 场景
|
|
|
+ const tempAudio = Object.keys(audioPlayType).map(key => {
|
|
|
+ return {
|
|
|
+ value: key,
|
|
|
+ label: audioPlayType[key]
|
|
|
+ };
|
|
|
+ });
|
|
|
+ data.audioPlayTypeList = [{ label: '全部', value: '' }, ...tempAudio];
|
|
|
+
|
|
|
// 获取声部列表
|
|
|
await catchStore.getSubjects();
|
|
|
// musicList-container
|
|
@@ -195,6 +251,8 @@ export default defineComponent({
|
|
|
});
|
|
|
obv.observe(spinRef.value);
|
|
|
analyzeXml();
|
|
|
+
|
|
|
+ musicIframeLoad();
|
|
|
window.addEventListener('message', iframeHandle);
|
|
|
});
|
|
|
onUnmounted(() => {
|
|
@@ -288,7 +346,7 @@ export default defineComponent({
|
|
|
return temp;
|
|
|
});
|
|
|
|
|
|
- // 根据musicSheetType返回的值,判断是否显示切换声轨按钮
|
|
|
+ // 根据musicSheetType返回的值,判断是否显示切换声部按钮
|
|
|
const isEnsemble = computed(() => {
|
|
|
// const details: any = data.list[data.listActive];
|
|
|
// const musics: any = details?.musicalInstruments;
|
|
@@ -348,6 +406,8 @@ export default defineComponent({
|
|
|
}&modelType=practise&modeType=json&Authorization=${token}&isPreView=true&part-index=${
|
|
|
data.musicInstrumentIndex
|
|
|
}&musicRenderType=${musicRenderType}`;
|
|
|
+
|
|
|
+ console.log(data.iframeSrc, 'iframeSrc');
|
|
|
};
|
|
|
|
|
|
/** 音频控制 */
|
|
@@ -399,20 +459,6 @@ export default defineComponent({
|
|
|
}
|
|
|
return action;
|
|
|
});
|
|
|
- // const _actions = [
|
|
|
- // {
|
|
|
- // value: 'staff',
|
|
|
- // label: '五线谱'
|
|
|
- // },
|
|
|
- // {
|
|
|
- // value: 'first',
|
|
|
- // label: '首调'
|
|
|
- // },
|
|
|
- // {
|
|
|
- // value: 'fixed',
|
|
|
- // label: '固定调'
|
|
|
- // }
|
|
|
- // ];
|
|
|
|
|
|
// 解析xml,获取分轨信息
|
|
|
const analyzeXml = async () => {
|
|
@@ -517,6 +563,20 @@ export default defineComponent({
|
|
|
.filter((item: any) => item.canselect)
|
|
|
.sort((a: any, b: any) => a.sortId - b.sortId);
|
|
|
data.trackList = arr;
|
|
|
+
|
|
|
+ // 是否显示总谱
|
|
|
+ const selectMusic = data.list[data.listActive];
|
|
|
+ if (selectMusic) {
|
|
|
+ selectMusic.isScoreRender &&
|
|
|
+ data.trackList.unshift({
|
|
|
+ label: '总谱',
|
|
|
+ value: 999,
|
|
|
+ sortId: 0,
|
|
|
+ canselect: true,
|
|
|
+ track: 999
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
// let track = arr.find(
|
|
|
// (item: any) => item.value === data.musicInstrumentIndex
|
|
|
// )?.track;
|
|
@@ -563,25 +623,25 @@ export default defineComponent({
|
|
|
analyzeXml();
|
|
|
}
|
|
|
);
|
|
|
- watch(
|
|
|
- () => data.musicInstrumentIndex,
|
|
|
- async () => {
|
|
|
- data.trackName =
|
|
|
- data.trackList.find(
|
|
|
- (item: any) => item.value === data.musicInstrumentIndex
|
|
|
- )?.label || '切换声轨';
|
|
|
- musicIframeLoad();
|
|
|
- }
|
|
|
- );
|
|
|
+ // watch(
|
|
|
+ // () => data.musicInstrumentIndex,
|
|
|
+ // async () => {
|
|
|
+ // data.trackName =
|
|
|
+ // data.trackList.find(
|
|
|
+ // (item: any) => item.value === data.musicInstrumentIndex
|
|
|
+ // )?.label || '切换声部';
|
|
|
+ // musicIframeLoad();
|
|
|
+ // }
|
|
|
+ // );
|
|
|
// 合奏曲谱转换时,更新曲谱信息
|
|
|
- watch(
|
|
|
- () => data.showMusicImg,
|
|
|
- () => {
|
|
|
- if (isEnsemble.value) {
|
|
|
- musicIframeLoad();
|
|
|
- }
|
|
|
- }
|
|
|
- );
|
|
|
+ // watch(
|
|
|
+ // () => data.showMusicImg,
|
|
|
+ // () => {
|
|
|
+ // if (isEnsemble.value) {
|
|
|
+ // musicIframeLoad();
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // );
|
|
|
|
|
|
const musicImg = computed(() => {
|
|
|
let imgs: any = [];
|
|
@@ -618,11 +678,39 @@ export default defineComponent({
|
|
|
<div class={[styles.wrap, data.showPlayer ? styles.wrapBottom : '']}>
|
|
|
<div class={styles.content}>
|
|
|
<div class={styles.tools}>
|
|
|
- <NSpace
|
|
|
- style={{ width: '100%' }}
|
|
|
- size={[24, 12]}
|
|
|
- wrapItem={false}>
|
|
|
- <div
|
|
|
+ <NSpace style={{ width: '100%' }} size={[12, 6]} wrapItem={false}>
|
|
|
+ {data.audioPlayTypeList.map((item: any) => (
|
|
|
+ <NButton
|
|
|
+ round
|
|
|
+ textColor={
|
|
|
+ forms.audioPlayTypes === item.value ? '#fff' : '#000'
|
|
|
+ }
|
|
|
+ color={
|
|
|
+ forms.audioPlayTypes === item.value ? '#198CFE' : '#fff'
|
|
|
+ }
|
|
|
+ type={
|
|
|
+ forms.audioPlayTypes === item.value
|
|
|
+ ? 'primary'
|
|
|
+ : 'default'
|
|
|
+ }
|
|
|
+ onClick={() => {
|
|
|
+ forms.audioPlayTypes = item.value || '';
|
|
|
+ if (item.value === 'SING') {
|
|
|
+ data.musicalInstrumentId = '';
|
|
|
+ data.musicSubject = '';
|
|
|
+ }
|
|
|
+
|
|
|
+ data.reshing = true;
|
|
|
+ document
|
|
|
+ .querySelector('.musicList-container')
|
|
|
+ ?.scroll(0, 0);
|
|
|
+ handleGetList();
|
|
|
+ }}>
|
|
|
+ {item.label}
|
|
|
+ </NButton>
|
|
|
+ ))}
|
|
|
+
|
|
|
+ {/* <div
|
|
|
{...{
|
|
|
id: 'music-0'
|
|
|
}}>
|
|
@@ -642,7 +730,7 @@ export default defineComponent({
|
|
|
data.reshing = true;
|
|
|
document
|
|
|
.querySelector('.musicList-container')
|
|
|
- .scroll(0, 0);
|
|
|
+ ?.scroll(0, 0);
|
|
|
handleGetList();
|
|
|
}}
|
|
|
key={item.value}
|
|
@@ -690,7 +778,7 @@ export default defineComponent({
|
|
|
data.reshing = true;
|
|
|
document
|
|
|
.querySelector('.musicList-container')
|
|
|
- .scroll(0, 0);
|
|
|
+ ?.scroll(0, 0);
|
|
|
handleGetList();
|
|
|
}}>
|
|
|
{item.name}
|
|
@@ -698,22 +786,46 @@ export default defineComponent({
|
|
|
)
|
|
|
)}
|
|
|
</NSpace>
|
|
|
- </div>
|
|
|
+ </div> */}
|
|
|
</NSpace>
|
|
|
- <TheSearch
|
|
|
- style={{ marginLeft: 'auto' }}
|
|
|
- round
|
|
|
- border={false}
|
|
|
- onSearch={val => {
|
|
|
- forms.name = val;
|
|
|
- data.reshing = true;
|
|
|
- handleGetList();
|
|
|
- }}
|
|
|
- />
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.contentWrap}>
|
|
|
<div class={[styles.musicList, 'musicList-container']}>
|
|
|
+ <div class={styles.searchSection}>
|
|
|
+ {forms.audioPlayTypes !== 'SING' && (
|
|
|
+ <CCascader
|
|
|
+ placeholder="全部乐器"
|
|
|
+ arrowType="small"
|
|
|
+ childShowAllCheck={false}
|
|
|
+ class={styles.instrumentSection}
|
|
|
+ v-model:value={subjects.value}
|
|
|
+ options={data.tags}
|
|
|
+ onMoreId={(val: any) => {
|
|
|
+ if (data.loading) return;
|
|
|
+ data.musicalInstrumentId = val.childId;
|
|
|
+ data.musicSubject = val.parentId;
|
|
|
+ data.reshing = true;
|
|
|
+ document
|
|
|
+ .querySelector('.musicList-container')
|
|
|
+ ?.scroll(0, 0);
|
|
|
+ handleGetList();
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+
|
|
|
+ <TheSearch
|
|
|
+ style={{ marginLeft: 'auto' }}
|
|
|
+ round
|
|
|
+ border={false}
|
|
|
+ onSearch={val => {
|
|
|
+ if (data.loading) return;
|
|
|
+ forms.name = val;
|
|
|
+ data.reshing = true;
|
|
|
+ handleGetList();
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
<div class={[styles.wrapList, 'music-wrap-list']}>
|
|
|
{data.list.map((item: IMusicItem, index) => {
|
|
|
return (
|
|
@@ -723,8 +835,17 @@ export default defineComponent({
|
|
|
styles.item,
|
|
|
data.listActive === index && styles.active
|
|
|
]}
|
|
|
- onClick={() => {
|
|
|
+ onClick={async () => {
|
|
|
handleChange(item);
|
|
|
+ await analyzeXml();
|
|
|
+ // 是否显示总谱
|
|
|
+ const selectMusic = data.list[data.listActive];
|
|
|
+ console.log(selectMusic, 'selected music');
|
|
|
+ if (selectMusic && selectMusic.isScoreRender) {
|
|
|
+ data.musicInstrumentIndex = 999;
|
|
|
+ } else {
|
|
|
+ data.musicInstrumentIndex = 0;
|
|
|
+ }
|
|
|
musicIframeLoad();
|
|
|
}}>
|
|
|
<div class={styles.img}>
|
|
@@ -750,9 +871,27 @@ export default defineComponent({
|
|
|
<div class={styles.titleName}>
|
|
|
<TheNoticeBar text={item.musicSheetName} />
|
|
|
</div>
|
|
|
- <div class={styles.titleDes}>{item.composer}</div>
|
|
|
+ <div class={styles.titleDes}>
|
|
|
+ {item.audioPlayTypeArray?.includes('PLAY') && (
|
|
|
+ <span
|
|
|
+ class={[styles.iconType, styles.iconPlay]}>
|
|
|
+ 演奏
|
|
|
+ </span>
|
|
|
+ )}
|
|
|
+
|
|
|
+ {item.audioPlayTypeArray?.includes('SING') && (
|
|
|
+ <span
|
|
|
+ class={[styles.iconType, styles.iconSing]}>
|
|
|
+ 演唱
|
|
|
+ </span>
|
|
|
+ )}
|
|
|
+
|
|
|
+ <span class={styles.composer}>
|
|
|
+ {item.composer}
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- {index == 0 ? (
|
|
|
+ {/* {index == 0 ? (
|
|
|
<NButton
|
|
|
color="#259CFE"
|
|
|
textColor="#fff"
|
|
@@ -809,7 +948,7 @@ export default defineComponent({
|
|
|
}
|
|
|
/>
|
|
|
</NButton>
|
|
|
- )}
|
|
|
+ )} */}
|
|
|
|
|
|
<img class={styles.arrow} src={icon_arrow} />
|
|
|
</div>
|
|
@@ -860,13 +999,17 @@ export default defineComponent({
|
|
|
} else if (data.showMusicImg === 'staff') {
|
|
|
lineType = 'staff';
|
|
|
}
|
|
|
- const src = `${vaildMusicScoreUrl()}/instrument?v=${+new Date()}&platform=pc&showGuide=true&id=${
|
|
|
+ let src = `${vaildMusicScoreUrl()}/instrument?v=${+new Date()}&platform=pc&id=${
|
|
|
activeItem.value.id
|
|
|
}&Authorization=${
|
|
|
user.getToken
|
|
|
}&musicRenderType=${lineType}&showGuide=true&part-index=${
|
|
|
data.musicInstrumentIndex
|
|
|
}`;
|
|
|
+
|
|
|
+ if (data.musicalInstrumentId) {
|
|
|
+ src += '&instrumentId=' + data.musicalInstrumentId;
|
|
|
+ }
|
|
|
if (
|
|
|
window.matchMedia('(display-mode: standalone)').matches
|
|
|
) {
|
|
@@ -892,6 +1035,13 @@ export default defineComponent({
|
|
|
onUpdate:value={async (val: any) => {
|
|
|
await analyzeXml();
|
|
|
//
|
|
|
+
|
|
|
+ data.trackName =
|
|
|
+ data.trackList.find(
|
|
|
+ (item: any) =>
|
|
|
+ item.value === data.musicInstrumentIndex
|
|
|
+ )?.label || '切换声部';
|
|
|
+ musicIframeLoad();
|
|
|
}}
|
|
|
// key={item.id}
|
|
|
class={[styles.popSelect]}>
|
|
@@ -910,6 +1060,9 @@ export default defineComponent({
|
|
|
onUpdate:value={async (val: any) => {
|
|
|
data.showMusicImg = val;
|
|
|
// musicIframeLoad();
|
|
|
+ if (isEnsemble.value) {
|
|
|
+ musicIframeLoad();
|
|
|
+ }
|
|
|
}}
|
|
|
// key={item.id}
|
|
|
class={[styles.popTrans]}>
|
|
@@ -938,7 +1091,9 @@ export default defineComponent({
|
|
|
// opacity: loading.value ? 0 : 1
|
|
|
}}
|
|
|
src={data.iframeSrc}
|
|
|
- onLoad={musicIframeLoad}></iframe>
|
|
|
+ onLoad={() => {
|
|
|
+ // musicIframeLoad();
|
|
|
+ }}></iframe>
|
|
|
) : (
|
|
|
<>
|
|
|
{/* <TransitionGroup name="van-fade"> */}
|