import queryString from "query-string"; import { Skeleton } from "vant"; import { computed, defineComponent, nextTick, onBeforeMount, onMounted, reactive, Transition, watch } from "vue"; import { useRoute } from "vue-router"; import { formateTimes } from "../../helpers/formateMusic"; import Metronome, { metronomeData } from "../../helpers/metronome"; import state, { isRhythmicExercises } from "../../state"; import { storeData } from "../../store"; import { setGlobalData } from "../../utils"; import AudioList from "../../view/audio-list"; import MusicScore, { resetMusicScore } from "../../view/music-score"; import { sysMusicScoreAccompanimentQueryPage, sysMusicScoreCategoriesQueryTree } from "../api"; import EvaluatModel from "../evaluat-model"; import HeaderTop from "../header-top"; import styles from "./index.module.less"; import { api_setStatusBarVisibility, isSpecialShapedScreen } from "/src/helpers/communication"; import { getQuery } from "/src/utils/queryString"; import Evaluating, { evaluatingData } from "/src/view/evaluating"; import MeasureSpeed from "/src/view/plugins/measure-speed"; import Selection from "/src/view/selection"; import { mappingVoicePart, subjectFingering } from "/src/view/fingering/fingering-config"; import Fingering from "/src/view/fingering"; //特殊教材分类id const classids = [1, 30, 97]; // [大雅金唐, 竖笛教程, 声部训练] export default defineComponent({ name: "music-list", setup() { const route = useRoute(); const query: any = { ...getQuery(), ...route.query, }; const paramsId = route.params.id as string; const detailData = reactive({ isLoading: true, paddingLeft: "", }); const getAPPData = async () => { const screenData = await isSpecialShapedScreen(); if (screenData?.content) { // console.log("🚀 ~ screenData:", screenData.content); const { isSpecialShapedScreen, notchHeight } = screenData.content; if (isSpecialShapedScreen) { detailData.paddingLeft = 25 + "px"; } } }; onBeforeMount(() => { getAPPData(); }); // console.log(route.params, query) /** 获取曲谱数据 */ const getMusicInfo = (res: any) => { const index = query["part-index"] ? parseInt(query["part-index"] as string) : 0; const musicInfo = res.data[index]; // console.log("🚀 ~ musicInfo:", musicInfo); setState(musicInfo, index); setCustom(); detailData.isLoading = false; }; const getCategorId = (arr: any[], key = "sysMusicScoreCategoriesList"): any[] => { const list = []; if (!Array.isArray(arr)) return []; for (let i = 0; i < arr.length; i++) { list.push(arr[i].id); if (Array.isArray(arr[i][key])) { list.push(...getCategorId(arr[i][key])); } } return list; }; const getIds = (arr: any[], key = "sysMusicScoreCategoriesList"): any[] => { if (!Array.isArray(arr)) return []; const ids = []; for (let i = 0; i < arr.length; i++) { if (classids.includes(arr[i].id)) { ids.push(arr[i].id, ...getCategorId(arr[i][key])); } else { ids.push(...getIds(arr[i][key])); } } return ids; }; /** 获取分类数据 */ const getCategory = (res: any) => { console.log("特殊曲谱分类ids:"); console.log(getIds(res.data).toString()); }; const setState = (data: any, index: number) => { state.detailId = data.id; state.xmlUrl = data.xmlUrl; state.partIndex = index; state.subjectId = data.subjectId; state.categoriesId = data.categoriesId; state.categoriesName = data.categoriesName; state.enableEvaluation = data.enableEvaluation; state.examSongId = data.examSongId + ""; state.examSongName = data.examSongName; // 解析扩展字段 if (data.extConfigJson) { try { state.extConfigJson = JSON.parse(data.extConfigJson as string); } catch (error) { console.error("解析扩展字段错误:", error); } } state.isOpenMetronome = !data.isOpenMetronome; state.needTick = data.isOpenMetronome; state.isShowFingering = data.isShowFingering; state.music = data.isOpenMetronome ? data.mp3Url : data.metronomeMp3Url; state.accompany = data.isOpenMetronome ? data.url : data.metronomeUrl; state.midiUrl = data.midiUrl; state.parentCategoriesId = data.parentCategoriesId; state.playMode = data.playMode; state.originSpeed = state.speed = data.speed; state.track = data.track; state.isOpenPrepare = true; // 映射声部ID state.subjectId = mappingVoicePart(state.subjectId, "GYM"); // 是否打击乐 state.isPercussion = state.subjectId == 23 || state.subjectId == 113 || state.subjectId == 121 || isRhythmicExercises(); // 设置指法 state.fingeringInfo = subjectFingering(state.subjectId); }; const setCustom = () => { if (state.extConfigJson.multitrack) { setGlobalData("multitrack", state.extConfigJson.multitrack); } }; onBeforeMount(() => { api_setStatusBarVisibility(); }); onMounted(() => { (window as any).appName = "gym"; Promise.all([sysMusicScoreCategoriesQueryTree(storeData.platformType === "WEB"), sysMusicScoreAccompanimentQueryPage(paramsId)]).then((values) => { getCategory(values[0]); getMusicInfo(values[1]); }); }); /** 渲染完成 */ const handleRendered = (osmd: any) => { state.musicRendered = true; state.osmd = osmd; state.times = formateTimes(osmd); console.log("🚀 ~ state.times:", state.times); try { metronomeData.metro = new Metronome(); metronomeData.metro.init(state.times); } catch (error) {} }; /** 指法配置 */ const fingerConfig = computed(() => { if (state.setting.displayFingering && state.fingeringInfo?.name) { if (state.fingeringInfo.direction === "transverse") { return { container: { paddingBottom: state.fingeringInfo.height, }, fingerBox: { height: state.fingeringInfo.height, }, }; } else { return { container: { paddingRight: state.fingeringInfo.width, }, fingerBox: { position: "absolute", width: state.fingeringInfo.width, height: "100%", right: 0, top: 0, }, }; } } return { container: {}, fingerBox: {}, }; }); watch( () => state.setting.displayFingering, () => { if (state.fingeringInfo.direction === "vertical") { if (state.setting.displayFingering) { document.getElementById("musicAndSelection")?.style.removeProperty("--music-zoom"); } else { nextTick(() => { resetMusicScore(); }); } } } ); return () => (
{!state.musicRendered && (
)}
{state.musicRendered && }
{/* 曲谱渲染 */} {!detailData.isLoading && } {/* 播放 */} {!detailData.isLoading && } {/* 评测 */} {state.modeType === "evaluating" && ( <> {evaluatingData.rendered && } )} {/* 指法 */} {state.setting.displayFingering && state.fingeringInfo?.name && (
)}
{/* 公用的插件 */}
{state.musicRendered && ( <> )}
); }, });