瀏覽代碼

Merge branch 'feature-tianyong-newVersion' of http://git.dayaedu.com/liushengqiang/music-score into kt-dev

TIANYONG 1 年之前
父節點
當前提交
0bfd498cc3

+ 12 - 0
src/helpers/formateMusic.ts

@@ -969,6 +969,18 @@ export const formateTimes = (osmd: OpenSheetMusicDisplay) => {
 			
 			
 			activeVerticalMeasureList = [note.sourceMeasure?.verticalMeasureList?.[0]] || [];
 			activeVerticalMeasureList = [note.sourceMeasure?.verticalMeasureList?.[0]] || [];
 
 
+			/**
+			 * TODO:多分轨合并的小节,音符可能没有id,此时就去其它分轨找
+			 */
+			const vmLength = note.sourceMeasure?.verticalMeasureList?.length
+			let currentVmIndex = 0;
+			let hasSvgElement = activeVerticalMeasureList[0]?.vfVoices['1']?.tickables[staveNoteIndex];
+			while (!hasSvgElement && vmLength > 1 && currentVmIndex <= vmLength - 1) {
+				currentVmIndex += 1;
+				activeVerticalMeasureList = [note.sourceMeasure?.verticalMeasureList?.[currentVmIndex]] || [];
+				hasSvgElement = activeVerticalMeasureList[0]?.vfVoices['1']?.tickables[staveNoteIndex];
+			}
+
 			const { realValue } = iterator.currentTimeStamp;
 			const { realValue } = iterator.currentTimeStamp;
 			const { RealValue: vRealValue, Denominator: vDenominator } = formatDuration(
 			const { RealValue: vRealValue, Denominator: vDenominator } = formatDuration(
 				iterator.currentMeasure.activeTimeSignature,
 				iterator.currentMeasure.activeTimeSignature,

+ 48 - 0
src/page-instrument/evaluat-model/evaluat-result/index.module.less

@@ -177,6 +177,54 @@
     }
     }
 }
 }
 
 
+.saveBtn {
+    position: relative;
+}
+.noSaveTip {
+    background: rgba(0,0,0,0.7);
+    font-size: 13Px;
+    border-radius: 8Px;
+    display: flex;
+    align-items: center;
+    padding: 8Px 12Px;
+    position: absolute;
+    left: 50%;
+    top: -45Px;
+    transform: translateX(-50%);
+    z-index: 1;
+    color: #fff;
+    width: auto;
+    word-break: keep-all;
+    > i {
+      display: inline-block;
+      min-width: 12Px;
+      width: 12Px;
+      height: 12Px;
+      background-image: url('./icons/close_icon.png');
+      background-size: 100% 100%;
+      background-position: center center;
+      background-repeat: no-repeat;
+      margin-left: 16Px;
+      cursor: pointer;
+    }
+    span {
+      word-break: keep-all;
+      width: max-content;
+    }
+    .arrowIcon {
+      position: absolute;
+      left: 50%;
+      bottom: -8PX;
+      transform: translateX(-50%);
+      width: 0;
+      height: 0;
+      border-top: 8PX solid rgba(0,0,0,0.7);
+      border-right: 8PX solid transparent;
+      border-left: 8PX solid transparent;  
+      z-index: 2;      
+    }
+}
+
 :global {
 :global {
     .savePopoverClose {
     .savePopoverClose {
         &.van-popover {
         &.van-popover {

+ 29 - 25
src/page-instrument/evaluat-model/evaluat-result/index.tsx

@@ -1,4 +1,4 @@
-import { defineComponent, onMounted, reactive, watch } from "vue";
+import { defineComponent, onMounted, reactive, watch, computed } from "vue";
 import { Popover } from "vant";
 import { Popover } from "vant";
 import styles from "./index.module.less";
 import styles from "./index.module.less";
 import state from "/src/state";
 import state from "/src/state";
@@ -79,6 +79,16 @@ export default defineComponent({
       emit("close", "update");
       emit("close", "update");
     };
     };
 
 
+    // 播放倍率不等于1,或者是选段评测,APP暂时不支持保存演奏,需要给出提示
+    const noSaveTips = computed(() => {
+      let tipContent = '';
+      const rate = state.basePlayRate * state.originAudioPlayRate; // 播放倍率
+      if (query.workRecord || state.section.length === 2 || state.isAppPlay || rate != 1 || !state.accompany) {
+        tipContent = query.workRecord ? '评测作业暂不支持保存作品噢~' : (!state.accompany || state.isAppPlay) ? '该曲目暂不支持保存作品噢~' : state.section.length === 2 ? '选段后暂不支持保存作品噢~' : rate != 1 ? '调速后暂不支持保存作品噢~' : '';
+      }
+      return tipContent
+    })
+
     onMounted(() => {
     onMounted(() => {
       if (!evaluatingData.isErrorState) {
       if (!evaluatingData.isErrorState) {
         handleAddRecord();
         handleAddRecord();
@@ -112,12 +122,12 @@ export default defineComponent({
                 {evaluatingData.resultData.score > 79 && <img class={styles.badge} src={iconBadge} />}
                 {evaluatingData.resultData.score > 79 && <img class={styles.badge} src={iconBadge} />}
                 <div class={[styles.text, evaluatingData.resultData.score > 79 && styles.badgeText]}>
                 <div class={[styles.text, evaluatingData.resultData.score > 79 && styles.badgeText]}>
                   <div class={[styles.scoreSection, "evaluting-result-1"]}>
                   <div class={[styles.scoreSection, "evaluting-result-1"]}>
-                    <div class={styles.num}>{evaluatingData.resultData.score}00</div>
+                    <div class={styles.num}>{evaluatingData.resultData.score}</div>
                     <div class={styles.score}>分</div>
                     <div class={styles.score}>分</div>
                     <div class={styles.level}>
                     <div class={styles.level}>
                       <div>{level[evaluatingData.resultData.heardLevel]}</div>
                       <div>{level[evaluatingData.resultData.heardLevel]}</div>
                       <span>|</span>
                       <span>|</span>
-                      <div>速度{evaluatingData.resultData.speed}</div>
+                      <div>速度{evaluatingData.resultData.speed || state.speed}</div>
                     </div>
                     </div>
                   </div>
                   </div>
                 </div>
                 </div>
@@ -156,28 +166,22 @@ export default defineComponent({
               <div class={styles.ctrls}>
               <div class={styles.ctrls}>
                 <img src={zlycImg} class={[styles.ctrlsBtn, "evaluting-result-2"]} onClick={() => emit("close", "tryagain")} />
                 <img src={zlycImg} class={[styles.ctrlsBtn, "evaluting-result-2"]} onClick={() => emit("close", "tryagain")} />
                 {!state.isHideEvaluatReportSaveBtn && evaluatingData.resultData.recordId ? (
                 {!state.isHideEvaluatReportSaveBtn && evaluatingData.resultData.recordId ? (
-                  <img src={bczpImg} class={[styles.ctrlsBtn, "evaluting-result-3"]} onClick={debounce(saveResult, 300)} />
-                ) : (
-                  <Popover
-                    class={"savePopoverClose"}
-                    placement={"top"}
-                    v-model:show={data.showPopover}
-                    v-slots={{
-                      reference: () => <img src={bczpJzImg} class={[styles.ctrlsBtn, "evaluting-result-3"]} />,
-                    }}
-                    theme="dark"
-                  >
-                    <div class={"popoverClose"}>
-                      <div>该曲目暂不支持保存作品噢~</div>
-                      <img
-                        src={closeImg}
-                        onClick={() => {
-                          data.showPopover = false;
-                        }}
-                      />
-                    </div>
-                  </Popover>
-                )}
+                  <div class={styles.saveBtn}>
+                    <img src={noSaveTips.value ? bczpJzImg : bczpImg} class={[styles.ctrlsBtn, "evaluting-result-3"]} onClick={() => {
+                      if (!noSaveTips.value) {
+                        debounce(saveResult, 300)
+                      }
+                    }} />
+                    {
+                      noSaveTips.value && state.noSavePopShow ? 
+                      <div class={[styles.noSaveTip]}>
+                        <span class={styles.arrowIcon}></span>
+                        <span>{noSaveTips.value}</span>
+                        <i onClick={() => state.noSavePopShow = false}></i>
+                      </div> : null                   
+                    }
+                  </div>
+                ) : null }
                 <img src={ckzpImg} class={[styles.ctrlsBtn, "evaluting-result-4", data.saveLoading ? styles.disablued : ""]} onClick={() => emit("close", "look")} />
                 <img src={ckzpImg} class={[styles.ctrlsBtn, "evaluting-result-4", data.saveLoading ? styles.disablued : ""]} onClick={() => emit("close", "look")} />
               </div>
               </div>
             </div>
             </div>

+ 1 - 1
src/page-instrument/header-top/index.tsx

@@ -80,7 +80,7 @@ export const headTopData = reactive({
       state.playIngSpeed = state.originSpeed;
       state.playIngSpeed = state.originSpeed;
       handleStartEvaluat();
       handleStartEvaluat();
       // 开发模式,把此处打开
       // 开发模式,把此处打开
-      //state.modeType = "evaluating";
+      // state.modeType = "evaluating";
       // evaluatingData.rendered = true;
       // evaluatingData.rendered = true;
       // evaluatingData.soundEffectMode = true;
       // evaluatingData.soundEffectMode = true;
     } else if (value === "follow") {
     } else if (value === "follow") {

+ 3 - 3
src/page-instrument/simple-detail/index.tsx

@@ -45,7 +45,7 @@ export default defineComponent({
 				console.log('拖动的进度')
 				console.log('拖动的进度')
 				if (state.playState === 'paused') {
 				if (state.playState === 'paused') {
 					detailData.currentTime = resInfo?.content?.currentTime ? resInfo?.content?.currentTime : detailData.currentTime;
 					detailData.currentTime = resInfo?.content?.currentTime ? resInfo?.content?.currentTime : detailData.currentTime;
-					handlePlaying();
+					handlePlaying(true);
 				}
 				}
 			}
 			}
 			// 播放进度
 			// 播放进度
@@ -126,13 +126,13 @@ export default defineComponent({
 		/**
 		/**
 		 * 播放一直触发的事件
 		 * 播放一直触发的事件
 		 */
 		 */
-		const handlePlaying = () => {
+		const handlePlaying = (skipNote?: boolean) => {
 			//detailData.currentTime += 0.03
 			//detailData.currentTime += 0.03
 			const currentTime = detailData.currentTime;
 			const currentTime = detailData.currentTime;
 			// console.log('👀~播放进度',currentTime)
 			// console.log('👀~播放进度',currentTime)
 			let item = getNote(currentTime);
 			let item = getNote(currentTime);
 			if (item) {
 			if (item) {
-				gotoNext(item);
+				gotoNext(item, skipNote);
 			}
 			}
 			state.activeNoteIndex = item?.i || 0
 			state.activeNoteIndex = item?.i || 0
 			// 一行谱,需要滚动小节
 			// 一行谱,需要滚动小节

+ 3 - 0
src/state.ts

@@ -511,6 +511,8 @@ const state = reactive({
   basePlayRate: 1,
   basePlayRate: 1,
   /** 引导页显示状态 */
   /** 引导页显示状态 */
   hasDriverPop: false,
   hasDriverPop: false,
+  /** 播放倍率不等于1,或者是选段评测,APP暂时不支持保存演奏,需要给出提示 */
+  noSavePopShow: true,
 });
 });
 const browserInfo = browser();
 const browserInfo = browser();
 let offset_duration = 0;
 let offset_duration = 0;
@@ -1222,6 +1224,7 @@ export const isRhythmicExercises = () => {
 /** 重置状态 */
 /** 重置状态 */
 export const handleRessetState = () => {
 export const handleRessetState = () => {
   // 切换模式,清除选段
   // 切换模式,清除选段
+  state.noSavePopShow = true;
   clearSelection();
   clearSelection();
   skipNotePlay(0, true);
   skipNotePlay(0, true);
   resetBaseRate();
   resetBaseRate();

+ 3 - 2
src/view/evaluating/index.tsx

@@ -35,7 +35,7 @@ import {
   api_startDelayCheck,
   api_startDelayCheck,
   api_closeDelayCheck,
   api_closeDelayCheck,
 } from "/src/helpers/communication";
 } from "/src/helpers/communication";
-import state, { IPlayState, clearSelection, handleStopPlay, onPlay, resetPlaybackToStart, togglePlay } from "/src/state";
+import state, { IPlayState, clearSelection, handleStopPlay, onPlay, resetPlaybackToStart, togglePlay, initSetPlayRate } from "/src/state";
 import { IPostMessage } from "/src/utils/native-message";
 import { IPostMessage } from "/src/utils/native-message";
 import { usePageVisibility } from "@vant/use";
 import { usePageVisibility } from "@vant/use";
 import { browser } from "/src/utils";
 import { browser } from "/src/utils";
@@ -351,7 +351,6 @@ export const handleStartBegin = async (preTimes?: number) => {
 	evaluatingData.evaluatings = {};
 	evaluatingData.evaluatings = {};
 	evaluatingData.resultData = {};
 	evaluatingData.resultData = {};
 	evaluatingData.backtime = 0;
 	evaluatingData.backtime = 0;
-	resetPlaybackToStart();
 	evaluatingData.isAudioPlayEnd = false;
 	evaluatingData.isAudioPlayEnd = false;
 	const res = await startEvaluating(evaluatingData.contentData);
 	const res = await startEvaluating(evaluatingData.contentData);
 	if (res?.api !== "startEvaluating") {
 	if (res?.api !== "startEvaluating") {
@@ -364,6 +363,8 @@ export const handleStartBegin = async (preTimes?: number) => {
 		evaluatingData.startBegin = false;
 		evaluatingData.startBegin = false;
 		return;
 		return;
 	}
 	}
+  initSetPlayRate();
+	resetPlaybackToStart();
 	evaluatingData.startBegin = true;
 	evaluatingData.startBegin = true;
 	if (evaluatingData.isDisabledPlayMusic) {
 	if (evaluatingData.isDisabledPlayMusic) {
 		evaluatingData.isBeginMask = true
 		evaluatingData.isBeginMask = true

+ 5 - 1
src/view/music-score/index.tsx

@@ -138,7 +138,11 @@ export default defineComponent({
 			osmd.EngravingRules.DYMusicScoreId = state.examSongId || ''
 			osmd.EngravingRules.DYMusicScoreId = state.examSongId || ''
 			osmd.EngravingRules.DYCustomRepeatCount = state.maxLyricNum || 0;
 			osmd.EngravingRules.DYCustomRepeatCount = state.maxLyricNum || 0;
 			await osmd.load(musicData.score);
 			await osmd.load(musicData.score);
-			osmd.zoom = state.isSimplePage ? 0.6 : state.zoom;
+			// 对外暴露 一行谱时候 缩小谱面
+			if(state.isSimplePage){
+				state.zoom = 0.6
+			}
+			osmd.zoom = state.zoom;
 			osmd.render();
 			osmd.render();
 			console.log("🚀 ~ osmd:", osmd)
 			console.log("🚀 ~ osmd:", osmd)
 			emit("rendered", osmd);
 			emit("rendered", osmd);

+ 2 - 2
vite.config.ts

@@ -76,8 +76,8 @@ export default defineConfig({
         // target: "https://kt.colexiu.com",
         // target: "https://kt.colexiu.com",
         // target: "https://test.lexiaoya.cn",
         // target: "https://test.lexiaoya.cn",
         // target: "https://kt.colexiu.com",
         // target: "https://kt.colexiu.com",
-        // target: "https://dev.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
-        target: "https://dev.kt.colexiu.com",
+        target: "https://dev.resource.colexiu.com", // 内容平台开发环境,内容平台开发,需在url链接上加上isCbs=true
+        // target: "https://dev.kt.colexiu.com",
         //target: "https://mec.colexiu.com",
         //target: "https://mec.colexiu.com",
         changeOrigin: true,
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/instrument/, ""),
         rewrite: (path) => path.replace(/^\/instrument/, ""),