Prechádzať zdrojové kódy

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

黄琪勇 11 mesiacov pred
rodič
commit
afe706e07d

+ 5 - 0
src/helpers/communication.ts

@@ -506,6 +506,11 @@ export const api_finishDelayCheck = (callback: any) => {
 	listenerMessage("finishDelayCheck", callback);
 };
 
+/** 监听延迟检测成功的回调 */
+export const api_remove_finishDelayCheck = (callback: any) => {
+	removeListenerMessage("finishDelayCheck", callback);
+};
+
 /** 监听APP播放进度 */
 export const simple_playProgress = (callback: any) => {
 	listenerMessage("api_playProgress", callback);

+ 26 - 3
src/page-instrument/evaluat-model/index.tsx

@@ -1,16 +1,16 @@
-import { Transition, defineComponent, onMounted, reactive, watch, defineAsyncComponent, computed } from "vue";
+import { Transition, defineComponent, onMounted, reactive, watch, defineAsyncComponent, computed, onUnmounted } from "vue";
 import { connectWebsocket, evaluatingData, handleEndBegin, handleStartBegin, handleStartEvaluat, handleViewReport, startCheckDelay, checkUseEarphone, handleCancelEvaluat } from "/src/view/evaluating";
 import Earphone from "./earphone";
 import styles from "./index.module.less";
 import SoundEffect from "./sound-effect";
-import state, { handleRessetState, resetPlaybackToStart, musicalInstrumentCodeInfo } from "/src/state";
+import state, { handleRessetState, resetPlaybackToStart, musicalInstrumentCodeInfo, clearSelection } from "/src/state";
 import { storeData } from "/src/store";
 import { browser } from "/src/utils";
 import { getNoteByMeasuresSlursStart } from "/src/helpers/formateMusic";
 import { Icon, Popup, showToast, closeToast, showLoadingToast } from "vant";
 import EvaluatResult from "./evaluat-result";
 import EvaluatAudio from "./evaluat-audio";
-import { api_getDeviceDelay, api_openAdjustRecording, api_proxyServiceMessage, api_videoUpdate, getEarphone, api_back, api_startDelayCheck, api_cancelDelayCheck, api_closeDelayCheck, api_finishDelayCheck, api_retryEvaluating } from "/src/helpers/communication";
+import { api_getDeviceDelay, api_openAdjustRecording, api_proxyServiceMessage, api_videoUpdate, getEarphone, api_back, api_startDelayCheck, api_cancelDelayCheck, api_closeDelayCheck, api_finishDelayCheck, api_retryEvaluating, api_remove_finishDelayCheck } from "/src/helpers/communication";
 import EvaluatShare from "./evaluat-share";
 import { Vue3Lottie } from "vue3-lottie";
 import startData from "./data/start.json";
@@ -38,6 +38,7 @@ type TCriteria = "frequency" | "amplitude" | "decibels";
  */
 let actualBeatLength = 0;
 let calculateInfo: any = {};
+let checkErjiTimer: any = null
 
 export default defineComponent({
   name: "evaluat-model",
@@ -125,6 +126,8 @@ export default defineComponent({
 
     /** 校验耳机状态 */
     const checkEarphoneStatus = async (type?: string) => {
+      clearTimeout(checkErjiTimer);
+      checkErjiTimer = null;
       if (type !== "start") {
         // const erji = await checkUseEarphone();
         const res = await getEarphone();
@@ -133,9 +136,16 @@ export default defineComponent({
         evaluatingData.earphoneMode = true;
         evaluatingData.earPhoneType = res?.content?.type || "";
         if (evaluatingData.earPhoneType === "有线耳机") {
+          clearTimeout(checkErjiTimer);
+          checkErjiTimer = null;
           setTimeout(() => {
             evaluatingData.earphoneMode = false;
           }, 3000);
+        } else {
+          // 如果没有佩戴有限耳机,需要持续检测耳机状态
+          checkErjiTimer = setTimeout(() => {
+            checkEarphoneStatus();
+          }, 1000);
         }
       }
       console.log("检测结束,生成数据", evaluatingData.websocketState, evaluatingData.startBegin, evaluatingData.checkEnd);
@@ -357,6 +367,10 @@ export default defineComponent({
     };
 
     const startBtnHandle = async () => {
+      // 选段未完成时,清除选段状态
+      if (state.sectionStatus && state.section.length < 2) {
+        clearSelection();
+      }
       // 如果是异常状态,先等待500ms再执行后续流程
       if (evaluatingData.isErrorState && !state.setting.soundEffect) {
         // console.log('异常流程1')
@@ -431,6 +445,13 @@ export default defineComponent({
       api_finishDelayCheck(handleFinishDelayCheck);
       api_retryEvaluating(handRetryEvaluating);
     });
+    
+    onUnmounted(() => {
+      api_remove_finishDelayCheck(handleFinishDelayCheck);
+			clearTimeout(checkErjiTimer);
+      checkErjiTimer = null;
+		});
+
     return () => (
       <div>
         <div class={styles.operatingBtn}>
@@ -471,6 +492,8 @@ export default defineComponent({
           <Earphone
             earphoneType={evaluatingData.earPhoneType}
             onClose={() => {
+              clearTimeout(checkErjiTimer);
+              checkErjiTimer = null;
               evaluatingData.earphoneMode = false;
               // handlePerformDetection();
               checkEarphoneStatus("start");

+ 2 - 2
src/page-instrument/view-detail/index.tsx

@@ -467,13 +467,13 @@ export default defineComponent({
         }}
       >
         {/* 骨架屏 */}
-        <Transition name="van-fade">
+        {/* <Transition name="van-fade">
           {detailData.skeletonLoading && (
             <div class={styles.skeleton}>
               <Skeleton row={8} />
             </div>
           )}
-        </Transition>
+        </Transition> */}
         {/* 曲目加载错误的缺省 */}
         <EmptyMusic></EmptyMusic>
         {/** 功能按钮 */}

+ 30 - 2
src/state.ts

@@ -229,21 +229,41 @@ export const musicalInstrumentCodeInfo = [
     id: 34
   },
   {
+    name: '陶笛',
+    code: 'Alto Ocarina',
+    id: 34
+  },
+  {
     name: '葫芦丝',
     code: 'Woodwind',
     id: 35
   },
   {
+    name: '葫芦丝',
+    code: 'Hulusi',
+    id: 35
+  },
+  {
     name: '口风琴',
     code: 'Nai',
     id: 36
   },
   {
+    name: '口风琴',
+    code: 'Melodica',
+    id: 36
+  },
+  {
     name: '德式竖笛',
     code: 'Tenor Recorder',
     id: 37
   },
   {
+    name: '德式竖笛',
+    code: 'German Recorder',
+    id: 37
+  },
+  {
     name: '英式竖笛',
     code: 'Baroque Recorder',
     id: 38
@@ -253,6 +273,11 @@ export const musicalInstrumentCodeInfo = [
     code: 'Whistling',
     id: 39
   },
+  {
+    name: '高音陶笛',
+    code: 'Soprano Ocarina',
+    id: 39
+  },
 ]
 
 const state = reactive({
@@ -505,7 +530,7 @@ const state = reactive({
   /** 作词家 */
   musicLyricist: '',
   // 加载条
-  isLoading: false,
+  isLoading: true,
   /** 加载中的文案 */
   loadingText: '音频资源加载中,请稍后…',
   /** 是否是简单的单行谱模式页面 */
@@ -1366,7 +1391,7 @@ const setState = (data: any, index: number) => {
   /**
    * 单曲,指法根据用户当前的乐器来显示,如果没有则取musicSheetSoundList第一个track
    */
-  let musicalCode = !storeData.user?.instrumentId ? data.musicSheetSoundList?.[0]?.track || '' : data.musicSheetSoundList?.find((item: any) => item?.musicalInstrumentId === storeData.user?.instrumentId)?.track || '';
+  let musicalCode = !storeData.user?.instrumentId ? data.musicSheetSoundList?.[0]?.track || '' : data.musicSheetSoundList?.find((item: any) => item?.musicalInstrumentId == storeData.user?.instrumentId)?.track || '';
   const pitchSubject = musicalInstrumentCodeInfo.find((n) => n.code.toLocaleLowerCase() === subjectCode.toLocaleLowerCase())
   const pitchMusical = musicalInstrumentCodeInfo.find((n) => n.code.toLocaleLowerCase() === musicalCode.toLocaleLowerCase())
   state.subjectCodeId = pitchSubject ? pitchSubject.id : 0
@@ -1625,12 +1650,15 @@ export const fillWordColor = () => {
   state.times.forEach((item: any, idx: number) => {
     const svgEl = document.getElementById(`vf-${state.times[idx]?.svgElement?.attrs?.id}`)
     const stemEl = document.getElementById(`vf-${state.times[idx]?.svgElement?.attrs?.id}-stem`)
+    const stemLine = document.getElementById(`vf-${state.times[idx]?.svgElement?.attrs?.id}-lines`)
     if ((item.i === state.activeNoteIndex || item.id === state.times[state.activeNoteIndex].id) && item.svgElement) {
       svgEl?.classList.add('noteActive')
       stemEl?.classList.add('noteActive')
+      stemLine?.classList.add('noteActive')
     } else {
       svgEl?.classList.remove('noteActive')
       stemEl?.classList.remove('noteActive')
+      stemLine?.classList.remove('noteActive')
     }
   })
 

+ 5 - 1
src/style.css

@@ -7,7 +7,11 @@ img {
   -webkit-touch-callout: none;
 }
 body {
-  user-select: none;
+  -webkit-user-select: none; /* Safari */
+  -moz-user-select: none; /* Firefox */
+  -ms-user-select: none; /* Internet Explorer/Edge */
+  user-select: none; /* Non-prefixed version, currently supported by Chrome and Opera,禁用文本选择 */
+  -webkit-touch-callout: none; /* iOS Safari,禁用长按行为 */
 }
 
 :root {

+ 5 - 1
src/view/audio-list/index.tsx

@@ -278,7 +278,11 @@ export default defineComponent({
 			return Promise.all([createAudio(state.beatSong.music), createAudio(state.beatSong.accompany), createAudio(state.beatSong.fanSong), createAudio(state.beatSong.banSong), createAudio(state.beatSong.mingSong)])
 		}
 		onMounted(async () => {
-			state.isLoading = true
+			// 预览的时候不走音频加载逻辑
+			if(state.isPreView){
+				state.isLoading = false;
+				return
+			}			
 			if (state.playMode !== "MIDI") {
 				console.time("音频加载时间")
 				// 处理音源

+ 4 - 1
src/view/evaluating/index.tsx

@@ -626,7 +626,10 @@ const handleAccompanyError = (res?: IPostMessage) => {
         }
         // 关闭节拍器
         closeTick();
-        api_closeDelayCheck({});
+        // socketerrror,才发送关闭延迟检测的消息
+        if (type === "socketError") {
+          api_closeDelayCheck({});
+        }
         evaluatingData.socketErrorStatus = 0;
         evaluatingData.socketErrorPop = type === "socketError" ? true : false;
         evaluatingData.isErrorState = true;

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
src/view/fingering/fingering-img/hulusi-flute/index.json


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
src/view/fingering/fingering-img/pan-flute/index.json


+ 3 - 0
src/view/fingering/index.module.less

@@ -37,6 +37,9 @@
   //   background: linear-gradient(360deg, #FFFFFF 0%, rgba(255, 255, 255, 0) 100%);
   //   z-index: 1;
   // }
+  &.hulusiTop {
+    padding-top: 20px;
+  }
 }
 
 .imgs {

+ 1 - 1
src/view/fingering/index.tsx

@@ -57,7 +57,7 @@ export default defineComponent({
               )}
             </div>
           ) : (
-            <div onClick={() => doubeClick()} class={[styles.fingeringContainer, styles.vertical, state.fingeringInfo.name]}>
+            <div onClick={() => doubeClick()} class={[styles.fingeringContainer, styles.vertical, state.fingeringInfo.name, state.fingeringInfo.name === 'hulusi-flute' ? styles.hulusiTop : '']}>
               <div class={styles.imgs}>
                 <img class="driver-7" src={fingerData.subject?.json?.full} />
                 {rs.map((key: number | string, index: number) => {

+ 3 - 0
src/view/music-score/index.module.less

@@ -28,6 +28,9 @@
             fill: #FFC121;
             stroke: #FFC121;
         }
+        rect {
+            stroke: #FFC121;
+        }
         transform-box: fill-box;
         transform-origin: center;
         // animation: noteAnimate 0.3s linear;

+ 2 - 2
vite.config.ts

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

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov