瀏覽代碼

单元测验选段

skyblued 2 年之前
父節點
當前提交
1c55b2ce8a

+ 16 - 0
colexiu-report.html

@@ -36,6 +36,22 @@
       document.getElementById('loading').className = ''
     }
   })
+  // 获取token
+  const instance = window.ORCHESTRA || window.webkit?.messageHandlers?.ORCHESTRA
+    if (instance) {
+      const sendData = { api: 'getToken', content: { uuid: '' + Date.now() + Math.floor(Math.random() * 1000000) } }
+      function setToken(evt) {
+        window.removeEventListener('message', setToken)
+        try {
+          const data = JSON.parse(evt.data)
+          const token = `${data.content.tokenType} ${data.content.accessToken}`
+          sessionStorage.setItem('Authorization', token)
+          console.log("🚀 ~ token", token)
+        } catch (error) { }
+      }
+      window.addEventListener('message', setToken)
+      instance.postMessage(JSON.stringify(sendData))
+    }
   </script>
   <style>
     #loading{

+ 19 - 0
index.html

@@ -18,6 +18,25 @@
         }
       })
     }
+    // 获取token
+    const instance = window.ORCHESTRA || window.webkit?.messageHandlers?.ORCHESTRA
+    if (instance) {
+      const sendData = { api: 'getToken', content: { uuid: '' + Date.now() + Math.floor(Math.random() * 1000000) } }
+      function setToken(evt) {
+        window.removeEventListener('message', setToken)
+        try {
+          const data = JSON.parse(evt.data)
+          console.log("🚀 ~ data", data)
+          if (data.api === 'getToken') {
+            const token = `${data.content.tokenType} ${data.content.accessToken}`
+            sessionStorage.setItem('Authorization', token)
+          }
+
+        } catch (error) { }
+      }
+      window.addEventListener('message', setToken)
+      instance.postMessage(JSON.stringify(sendData))
+    }
   </script>
   <style>
     #lottieWeb {

+ 7 - 7
src/helpers/native-message.ts

@@ -39,12 +39,12 @@ export interface IPostMessage {
  * 劫持postMessage
  */
 
-const originalPostMessage = window.postMessage
+// const originalPostMessage = window.postMessage
 
-window.postMessage = (message: IPostMessage) => {
-  // console.log('通过劫持', message)
-  originalPostMessage(message, '*')
-}
+// window.postMessage = (message: IPostMessage) => {
+//   // console.log('通过劫持', message)
+//   originalPostMessage(message, '*')
+// }
 
 /**
  *
@@ -66,7 +66,7 @@ const browserInfo = browser()
 if (browserInfo.isApp) {
   window.addEventListener('message', (evt) => {
     try {
-      console.log('message', evt.data)
+      console.log('app回调', evt.data)
       const data = evt.data ? (typeof evt.data === 'object' ? evt.data : JSON.parse(evt.data)) : {}
       const uuid = data.content?.uuid || data.uuid
       // console.log(uuid, data.content, 'uuid')
@@ -112,7 +112,7 @@ export const postMessage = (data: IPostMessage, callback?: CallBack) => {
     const uuid = getRandomKey()
     calls[uuid] = callback || loop
     data.content = data.content ? { ...data.content, uuid } : { uuid }
-    console.log('send:', JSON.stringify(data))
+    console.log('h5发送:', JSON.stringify(data))
     instance.postMessage(JSON.stringify(data))
   }
 }

+ 1 - 1
src/pages/detail/helpers.ts

@@ -651,7 +651,7 @@ export const getIndex = (times: any[], currentTime: Number) => {
     // 限制不超过此范围
     const startSection = state.befireSection || state.section[0]
     index = Math.min(Math.max(index, startSection.i), state.section[1].i)
-    console.log('endIndex', index)
+    // console.log('endIndex', index)
   }
   return index
 }

+ 6 - 14
src/pages/detail/runtime.ts

@@ -32,6 +32,7 @@ import { postMessage, listenerMessage, promisefiyPostMessage } from '/src/helper
 import EventEmitter from 'eventemitter3'
 import { useClientType, useOriginSearch } from '/src/subpages/colexiu/uses'
 import { evaluatPlayerStop } from '/src/subpages/colexiu/buttons/evaluating'
+import { unitTestData } from '/src/subpages/colexiu/unitTest'
 
 export const event = new EventEmitter()
 
@@ -400,7 +401,6 @@ export const refreshPlayer = async (ctime?: number) => {
     }
     const nextTime = () => {
       if (detailState.sectionStatus && detailState.section.length === 2) {
-        // console.log("state.currentTimeNum >= detailState.section[0].time", state.currentTimeNum, detailState.section[0].time)
         if (currentTimeNum >= detailState.section[0].time) {
           detailState.sectionFlash = false
         }
@@ -410,12 +410,6 @@ export const refreshPlayer = async (ctime?: number) => {
             ? detailState.section[1].endtime
             : nextNote.time
           : state.durationNum
-        // console.table({
-        //   currentTimeNum,
-        //   isNext: (browserInfo.xiaomi ? 0.2 : 0.08) >= time,
-        //   time,
-        //   nextNote
-        // })
         return currentTimeNum + (browserInfo.xiaomi ? 0.2 : 0.08) >= time
       }
       return false
@@ -425,13 +419,16 @@ export const refreshPlayer = async (ctime?: number) => {
       // console.log("isNext", detailState.section[1], detailState.section[1].endtime, currentTimeNum)
       state.audiosInstance.setMute(true)
       state.osmd.cursor.hide()
-      // resetPlayStatus()
       if (detailState.activeDetail?.isAppPlay) {
         pause()
       } else {
         await state.audiosInstance.pause()
       }
-      // setCurrentTime(detailState.section[0].sourceStartTime || detailState.section[0].time)
+      // 如果是单元测验 和课后训练直接结束
+      if (unitTestData.isSelectMeasureMode){
+        event.emit('ended')
+        return
+      }
       setSectionModeCurrentTime()
       clearAccelerateRefreshPlayer()
       setTimeout(() => setPlayState(), 1000)
@@ -644,7 +641,6 @@ export const getFirsrNoteByMeasureListIndex = (index: number, tie = true) => {
 }
 
 export const setSectionModeCurrentTime = () => {
-  console.log(detailState.needTick, 'setSectionModeCurrentTime')
   if (detailState.needTick) {
     setCurrentTime(detailState.section[0].sourceStartTime || detailState.section[0].time)
   } else {
@@ -659,12 +655,9 @@ export const setSectionModeCurrentTime = () => {
 }
 
 export const setPlayerView = () => {
-  // console.log(detailState.sectionStatus, 'detailState.sectionStatus')
-  // console.log(detailState.needTick)
   if (detailState.sectionStatus) {
     syncStepIndex(getIndex(detailState.times, state.currentTimeNum))
     if (detailState.section.length === 2) {
-      // setCurrentTime(detailState.section[0].sourceStartTime || detailState.section[0].time)
       setSectionModeCurrentTime()
     } else {
       detailState.section = []
@@ -772,7 +765,6 @@ const onTickDestroy = () => {
 
 export const setTick = (stop: () => void, speed?: number) => {
   // 节拍时间是固定的无需调整
-  // console.log('ticking')
   const mixStop = () => {
     stop()
     event.emit('tickEnd')

+ 2 - 2
src/pages/detail/section-box/index.tsx

@@ -10,6 +10,7 @@ import styles from './index.module.less'
 import classNames from 'classnames'
 import { modelType } from '/src/subpages/colexiu/buttons'
 import { restPromptData } from '/src/helpers/restPrompt'
+import { unitTestData } from '/src/subpages/colexiu/unitTest'
 
 const sectionRef: Ref = ref(null)
 
@@ -166,7 +167,6 @@ export default defineComponent({
     },
     setSection(evt: MouseEvent) {
       const activeNote = getActtiveNoteByTimes(evt)
-      console.log('🚀 ~ activeNote', activeNote)
       if (activeNote && state.section.length < 2) {
         const sectionLength = state.section.length
         if (sectionLength === 0) {
@@ -282,7 +282,7 @@ export default defineComponent({
                     left: formatZoom(boundingBox.x) + 'px',
                     height: formatZoom(boundingBox.height) + 'px',
                     width: formatZoom(boundingBox.width) + 'px',
-                    background: state.sectionStatus
+                    background: unitTestData.isSelectMeasureMode && state.sectionStatus
                       ? `${
                           item?.noteElement?.sourceMeasure?.MeasureNumberXML <
                             state.section[0]?.noteElement?.sourceMeasure?.MeasureNumberXML ||

+ 1 - 1
src/subpages/colexiu/App.tsx

@@ -1,4 +1,4 @@
-import { defineComponent, onBeforeUnmount, onMounted, onUnmounted } from 'vue'
+import { defineComponent, onMounted } from 'vue'
 import '../../vue-tsx-shim.d'
 import '../../app.d'
 import { useRoute } from 'vue-router'

+ 89 - 104
src/subpages/colexiu/buttons/evaluating.tsx

@@ -1,5 +1,5 @@
 import { Button, Toast } from 'vant'
-import { defineComponent, Directive, onBeforeUnmount, onMounted, Ref, ref, Teleport } from 'vue'
+import { defineComponent, onBeforeUnmount, onMounted, Ref, ref, Teleport, Transition } from 'vue'
 import '@dotlottie/player-component'
 import detailState from '/src/pages/detail/state'
 import SettingState from '/src/pages/detail/setting-state'
@@ -10,21 +10,20 @@ import {
   promisefiyPostMessage,
   removeListenerMessage,
 } from '/src/helpers/native-message'
-import { browser, getRequestHostname } from '/src/helpers/utils'
+import { browser } from '/src/helpers/utils'
 import runtime, * as RuntimeUtils from '/src/pages/detail/runtime'
 import { getBoundingBoxByverticalNote, getNoteByMeasuresSlursStart, getParentNote } from '/src/pages/detail/helpers'
-import { useClientType, useOriginSearch } from '../uses'
+import { handleCheckEvaluatStatus, useClientType, useOriginSearch } from '../uses'
 import { startButtonShow } from './index'
 import { getLeveByScoreMeasure } from '/src/pages/detail/evaluating/helper'
 import Evaluating, { evaluatingShow } from '../popups/evaluating'
 // @ts-ignore
-import iconStartEvaluating from './dotlotties/StartEvaluating.png'
-import iconRecord from './dotlotties/iconRecord.png'
-// @ts-ignore
 import styles from './index.module.less'
 import { Vue3Lottie } from 'vue3-lottie'
 import startData from './data/start.json'
 import startingData from './data/starting.json'
+import { unitTestData } from '../unitTest'
+import iconEvaluatingStart from './icons/icon-evaluatingStart.png'
 
 let backtime = 0
 
@@ -34,22 +33,7 @@ const playStatus: Ref<'connecting' | 'play' | 'stop'> = ref('stop')
 const endloading = ref(false)
 const connentLoading = ref(false)
 const playUrl: Ref<string> = ref('')
-
 const endResult = ref(null)
-
-export const animate: Directive = {
-  mounted: (el: HTMLElement) => {
-    el.addEventListener('click', (evt: Event) => {
-      let element = evt.target as HTMLElement
-      element.classList.add(...['animate__animated', 'animate__tada'])
-    })
-    el.addEventListener('animationend', (evt: Event) => {
-      let element = evt.target as HTMLElement
-      element.classList.remove(...['animate__animated', 'animate__tada'])
-    })
-  },
-}
-
 const browserInfo = browser()
 
 /**
@@ -73,12 +57,24 @@ const formatTimes = () => {
   let dontEvaluatingMode = false
   let skip = false
   const datas = []
-  for (let index = 0; index < detailState.times.length; index++) {
-    const item = detailState.times[index]
+  let times = detailState.times
+  if (unitTestData.isSelectMeasureMode) {
+    const startIndex = detailState.times.findIndex(
+      (n: any) => n.NoteToGraphicalNoteObjectId == detailState.section[0].NoteToGraphicalNoteObjectId
+    )
+    const endIndex = detailState.times.findIndex(
+      (n: any) => n.NoteToGraphicalNoteObjectId == detailState.section[1].NoteToGraphicalNoteObjectId
+    )
+    times = detailState.times.filter((n: any, index: number) => {
+      return index >= startIndex && index <= endIndex
+    })
+    console.log("🚀 ~ times", times)
+  }
+  // let measureIndex = -1
+  for (let index = 0; index < times.length; index++) {
+    const item = times[index]
     const note = getNoteByMeasuresSlursStart(item)
-    // console.log(item.nodeElement)
     const rate = runtime.speed / detailState.baseSpeed //1
-    // const fixtime = 0
     const start = difftime + (item.sourceRelativeTime || item.relativeTime)
     const end = difftime + (item.sourceRelaEndtime || item.relaEndtime)
     const isStaccato =
@@ -97,15 +93,15 @@ const formatTimes = () => {
       dontEvaluatingMode = true
     }
     const nextNote = detailState.times[index + 1]
-    // console.log("noteinfo", note.noteElement.isRestFlag && !!note.stave && !!nextNote)
     if (skip && (note.stave || !note.noteElement.isRestFlag || (nextNote && !nextNote.noteElement.isRestFlag))) {
       skip = false
     }
     if (note.noteElement.isRestFlag && !!note.stave && !!nextNote && nextNote.noteElement.isRestFlag) {
       skip = true
     }
-    // console.log(note.measureOpenIndex, item.measureOpenIndex, note)
-    // console.log("skip", skip)
+    // if (note.measureOpenIndex != measureIndex){
+    //   measureIndex++
+    // }
     const data = {
       timeStamp: (start * 1000) / rate,
       duration: ((end * 1000) / rate - (start * 1000) / rate) * noteRate,
@@ -113,17 +109,16 @@ const formatTimes = () => {
       nextFrequency: formatPitch(item.noteElement?.pitch?.nextFrequency),
       prevFrequency: formatPitch(item.noteElement?.pitch?.prevFrequency),
       // 重复的情况index会自然累加,render的index是谱面渲染的index
-      measureIndex: note.measureOpenIndex,
+      measureIndex: note.measureOpenIndex, //note.measureOpenIndex,
       measureRenderIndex: note.noteElement.sourceMeasure.measureListIndex,
-      // dontEvaluating: ListenMode,
       dontEvaluating: ListenMode || dontEvaluatingMode || item.skipMode,
-      musicalNotesIndex: item.i,
+      musicalNotesIndex: index,//item.i,
       denominator: note.noteElement?.Length.denominator,
       isOrnament: !!note?.voiceEntry?.ornamentContainer,
     }
     datas.push(data)
   }
-  // console.log("🚀 ~ datas", datas)
+  console.log("🚀 ~ datas", datas)
   return datas
 }
 const connect = async () => {
@@ -134,7 +129,6 @@ const connect = async () => {
 
   const content = {
     musicXmlInfos: formatTimes(),
-    // id: search.id,
     subjectId: detailState.subjectId,
     detailId: detailState.activeDetail?.id,
     examSongId: search.id,
@@ -204,64 +198,48 @@ const sendOffsetTime = (offsetTime: number) => {
 
 const cancelTheEvaluation = () => {
   const search = useOriginSearch()
+  postMessage({ api: 'endEvaluating', content: { musicScoreId: search.id } })
+  playStatus.value = 'stop'
+  RuntimeUtils.pause()
   RuntimeUtils.resetPlayStatus()
   RuntimeUtils.clearIntervalTimeline()
   RuntimeUtils.setCurrentTime(0)
-  playStatus.value = 'stop'
-  postMessage(
-    {
-      api: 'endEvaluating',
-      content: {
-        musicScoreId: search.id,
-      },
-    },
-    (evt) => {
-      evaluating.value = false
-      // RuntimeUtils.setCaptureMode()
-      Toast.clear()
-    }
-  )
+  Toast.clear()
 }
 
-const stopPlay = (show: boolean = true) => {
+const stopPlay = () => {
   console.log('调用stopPlay')
-  if (show) {
-    // Toast({
-    //   duration: 0,
-    //   message: '评分中...',
-    //   type: 'loading',
-    // })
+  if (!connentLoading.value) {
+    cancelTheEvaluation()
   }
   startButtonShow.value = true
-  cancelTheEvaluation()
+  connentLoading.value = false
+  evaluating.value = false
 }
 export const evaluatStopPlay = stopPlay
 
 const startPlay = () => {
   console.log('连接服务成功,开始播放', new Date().getTime() - runtime.clickTime)
-  // synced = false
   if (!SettingState.eva.mute) {
     RuntimeUtils.changeAllMode()
   } else {
     RuntimeUtils.changeMode('background')
   }
   startButtonShow.value = false
-  // RuntimeUtils.changeSpeed(90)
   RuntimeUtils.setPlayState()
 }
 
 const setPlayer = async () => {
-  console.log('调用setPlayer')
+  // 连接中,禁止重复连接
+  if (connentLoading.value) return
   runtime.clickTime = new Date().getTime()
   RuntimeUtils.resetPlayStatus()
-  runtime.evaluatingTips = false
   if (detailState.isPauseRecording) {
     evaluating.value = false
     startPlay()
     return
   }
   detailState.evaluatings = {}
-  RuntimeUtils.setCurrentTime(0)
   const hint = Toast({
     duration: 0,
     message: '服务连接中...',
@@ -294,16 +272,6 @@ const togglePlay = () => {
   }
 }
 
-const cancelEvaluating = (data?: IPostMessage) => {
-  // this.starting = false
-  if (data?.content.reson) {
-    // Toast.fail({
-    //   message: data?.content?.reson,
-    // })
-    stopPlay()
-  }
-}
-
 const timeupdate = () => {
   console.log('播放事件被触发', playUrl.value, evaluating.value)
   if (playUrl.value) {
@@ -361,6 +329,12 @@ const playerStop = () => {
 export const evaluatPlayerStop = playerStop
 
 const endevent = (evt: Event) => {
+  // 如果是单元测验和课后训练 播放结束
+  if (unitTestData.isSelectMeasureMode && playStatus.value === 'play') {
+    playerStop()
+    canSubmit.value = true
+    return
+  }
   if ((evt.target as HTMLAudioElement)?.src === playUrl.value && playStatus.value === 'play') {
     playerStop()
     canSubmit.value = true
@@ -371,7 +345,8 @@ const endevent = (evt: Event) => {
   }
 }
 
-const start = () => {
+/**正式开始评测 */
+const evaluatStart = () => {
   playStatus.value = 'play'
   if (detailState.isPauseRecording) {
     postMessage(
@@ -425,7 +400,7 @@ const submitEvaluationScore = async (data: any) => {
           musicId: search.id || '',
           unitId: search.unitId || '',
           questionId: search.questionId || '',
-          score: canSubmit.value ? ((endResult.value as any)?.score || 0) : 0,
+          score: canSubmit.value ? (endResult.value as any)?.score || 0 : 0,
         }),
       },
     })
@@ -436,10 +411,11 @@ const submitEvaluationScore = async (data: any) => {
 /** 活动使用,只有在全部评测完成后才能提交,避免只是一小节就高分的情况 */
 const canSubmit = ref(false)
 
-
+/**接受websocket返回的信息 */
 const sendResult = (evt?: IPostMessage) => {
-  console.log('评测返回', evt?.content)
-  if (evt?.content) {
+  const { body, header } = evt?.content || {}
+  console.log('评测返回', { body, header })
+  if (body && header) {
     const data = evt?.content?.body
     if (evt?.content.header.commond === 'overall') {
       // console.log(evt)
@@ -518,37 +494,38 @@ const cloudMetronome = (evt: any) => {
 
 export default defineComponent({
   name: 'ColexiuButtonEvaluating',
-  directives: { animate },
   setup(props, { expose }) {
     onMounted(async () => {
-      runtime.evaluatingTips = true
-      detailState.section = []
-      detailState.sectionStatus = false
+      console.log('进入评测模块')
+      handleCheckEvaluatStatus()
+      // 如果为单元测验和课后训练,不清楚选段数据
+      if (!unitTestData.isSelectMeasureMode) {
+        detailState.section = []
+        detailState.sectionStatus = false
+      }
       RuntimeUtils.changeAllMode()
       playUrl.value = runtime.songs.background || (runtime.songs.music as string)
       runtime.audiosInstance?.audios[playUrl.value]?.addEventListener('play', timeupdate)
       runtime.audiosInstance?.audios[playUrl.value]?.addEventListener('timeupdate', onProgress)
-      RuntimeUtils.event.on('next-click', playerStop)
+      // RuntimeUtils.event.on('next-click', playerStop)
       RuntimeUtils.event.on('ended', endevent)
       listenerMessage('sendResult', sendResult)
-      listenerMessage('cancelEvaluating', cancelEvaluating)
+      // listenerMessage('cancelEvaluating', cancelTheEvaluation)
       listenerMessage('cloudTimeUpdae', onProgress)
       RuntimeUtils.event.on('tickDestroy', cloudMetronome)
-      RuntimeUtils.event.on('tickEnd', start)
-      await RuntimeUtils.pause()
-      RuntimeUtils.setCurrentTime(0)
+      RuntimeUtils.event.on('tickEnd', evaluatStart)
     })
 
     onBeforeUnmount(() => {
       runtime.audiosInstance?.audios[playUrl.value]?.removeEventListener('play', timeupdate)
       runtime.audiosInstance?.audios[playUrl.value]?.removeEventListener('timeupdate', onProgress)
-      RuntimeUtils.event.off('next-click', playerStop)
+      // RuntimeUtils.event.off('next-click', playerStop)
       RuntimeUtils.event.off('ended', endevent)
       RuntimeUtils.event.off('tickDestroy', cloudMetronome)
       removeListenerMessage('sendResult', sendResult)
-      removeListenerMessage('cancelEvaluating', cancelEvaluating)
+      // removeListenerMessage('cancelEvaluating', cancelTheEvaluation)
       removeListenerMessage('cloudTimeUpdae', onProgress)
-      RuntimeUtils.event.off('tickEnd', start)
+      RuntimeUtils.event.off('tickEnd', evaluatStart)
     })
 
     expose({
@@ -565,30 +542,38 @@ export default defineComponent({
 
     return () => {
       return (
-        <>
-          {/* 评测 */}
+        <Teleport to="body" key="StartEvaluating">
+          {/* 评测完成结果显示 */}
           <Evaluating data={endResult.value} />
 
+          <Transition name="finish">
+            {startButtonShow.value && (
+              <div
+                style={{ backgroundImage: `url(${iconEvaluatingStart})` }}
+                class={[styles.evaluatStartBtn]}
+                onClick={() => {
+                  setPlayer()
+                }}
+              ></div>
+            )}
+          </Transition>
+
           {!evaluating.value ? (
-            <Teleport to="body" key="StartEvaluating">
-              <div class={styles.dialogueBox}>
-                <div class={styles.dialogue}>
-                  <div>
-                    演奏前请调整好乐器,保证最佳演奏状态。<span class={styles.triangle}></span>
-                  </div>
+            <div class={styles.dialogueBox}>
+              <div class={styles.dialogue}>
+                <div>
+                  演奏前请调整好乐器,保证最佳演奏状态。<span class={styles.triangle}></span>
                 </div>
-                <Vue3Lottie class={styles.dialogueIcon} animationData={startData}></Vue3Lottie>
               </div>
-            </Teleport>
+              <Vue3Lottie class={styles.dialogueIcon} animationData={startData}></Vue3Lottie>
+            </div>
           ) : (
-            <Teleport to="body" key="Recording">
-              <div class={styles.dialogueBox}>
-                <div class={styles.inRadio}>收音中...</div>
-                <Vue3Lottie class={styles.inRadioIcon} animationData={startingData}></Vue3Lottie>
-              </div>
-            </Teleport>
+            <div class={styles.dialogueBox}>
+              <div class={styles.inRadio}>收音中...</div>
+              <Vue3Lottie class={styles.inRadioIcon} animationData={startingData}></Vue3Lottie>
+            </div>
           )}
-        </>
+        </Teleport>
       )
     }
   },

+ 14 - 4
src/subpages/colexiu/buttons/index.module.less

@@ -16,9 +16,9 @@
   box-sizing: border-box;
   padding: 0 16px;
   background: #fff;
-  transition: transform .3s ease-out;
+  transition: transform 0.3s ease-out;
 }
-.outUp{
+.outUp {
   transform: translateY(-100%);
 }
 
@@ -75,7 +75,7 @@
       display: block;
     }
     :global {
-      .van-button__text{
+      .van-button__text {
         display: flex;
         align-items: center;
         flex-direction: column;
@@ -111,6 +111,16 @@
   transform: translate(-50%, -50%);
   font-size: 12px;
 }
+.evaluatStartBtn {
+  position: fixed;
+  top: calc(50% - 37.5px);
+  left: calc(50% - 37.5px);
+  width: 75px;
+  height: 75px;
+  background-size: 100%;
+  background-position: center;
+  z-index: 10;
+}
 
 .icon {
   width: 100%;
@@ -204,7 +214,7 @@
     color: var(--primary-color);
     background: #ffe8b1;
     border-radius: 10px;
-    border: .5px solid #ffffff;
+    border: 0.5px solid #ffffff;
     right: 0;
     top: 0;
   }

+ 33 - 62
src/subpages/colexiu/buttons/index.tsx

@@ -7,11 +7,11 @@ import detailState from '/src/pages/detail/state'
 import SettingState from '/src/pages/detail/setting-state'
 import appState from '/src/state'
 import FloatWraper from './float-wraper'
-import Evaluating from './evaluating'
+import Evaluating, { evaluatStopPlay } from './evaluating'
 import iconTitle from '../popups/evaluating/icons/title.svg'
 import iconCancel from '../popups/evaluating/icons/cancel.svg'
 import iconConfirm from '../popups/evaluating/icons/confirm.svg'
-import { useClientType, useMenu, useOriginSearch, useWiredHeadsetCheck, useReload } from '../uses'
+import { useClientType, useMenu, useOriginSearch, useReload } from '../uses'
 import { permissionPopup } from '../popups/permission/permission'
 import { open as openMusicList } from '../music-list'
 import { postMessage } from '/src/helpers/native-message'
@@ -27,8 +27,10 @@ import iconEvaluatingEnd from './icons/icon-evaluatingEnd.png'
 import store from 'store'
 import styles from './index.module.less'
 import { sendBackRecordTotalTime } from '../App'
+import { unitTestData } from '../unitTest'
 export const confirmShow: Ref<boolean> = ref(false)
 
+/**评测开始按钮状态 */
 export const startButtonShow = ref(true)
 
 export const evaluatingRef: Ref<any> = ref({})
@@ -42,19 +44,6 @@ export const openSuggestPopup = () => {
   openSuggestPopupFn()
 }
 
-export const animate: Directive = {
-  mounted: (el: HTMLElement) => {
-    el.addEventListener('click', (evt: Event) => {
-      let element = evt.target as HTMLElement
-      element.classList.add(...['animate__animated', 'animate__tada'])
-    })
-    el.addEventListener('animationend', (evt: Event) => {
-      let element = evt.target as HTMLElement
-      element.classList.remove(...['animate__animated', 'animate__tada'])
-    })
-  },
-}
-
 /**
  * 前置验证是否在APP中并且已经付费
  * @param cb 回调函数 {status} 验证状态
@@ -99,17 +88,7 @@ const back: () => void = () => {
     api: 'back',
   })
 }
-const startEvaluat = () => {
-  console.log('开始评测')
-  runtime.evaluatingStatus = true
-  RuntimeUtils.setCurrentTime(0)
-  // beforeCheck((status) => {
-  //   if (status) {
-  //     RuntimeUtils.setCurrentTime(0)
-  //     runtime.evaluatingStatus = true
-  //   }
-  // })
-}
+
 export type IModelType = 'practice' | 'evaluation' | 'follow' | 'init'
 export const modelType = ref<IModelType>('init')
 export const onChangeModelType = (type: IModelType) => {
@@ -117,7 +96,7 @@ export const onChangeModelType = (type: IModelType) => {
   if (type === 'evaluation') {
     RuntimeUtils.changeSpeed(detailState.activeDetail?.originalSpeed, false)
     // 评测模式
-    startEvaluat()
+    runtime.evaluatingStatus = true
   } else {
     const speeds = store.get('speeds') || {}
     const search = useOriginSearch()
@@ -127,14 +106,11 @@ export const onChangeModelType = (type: IModelType) => {
       RuntimeUtils.changeSpeed(speeds[search.id as any])
     }
   }
-  nextTick(() => {
-    modelType.value = type
-  })
+  modelType.value = type
 }
 
 export default defineComponent({
   name: 'Colexiu-Buttons',
-  directives: { animate },
   props: {
     onSetMusicScoreType: {
       type: Function,
@@ -145,7 +121,6 @@ export default defineComponent({
   setup(props, { emit }) {
     const search = useOriginSearch()
     const route = { query: search }
-    const [wiredStatus] = useWiredHeadsetCheck()
     const speedRef = ref()
     const [show] = useMenu()
     const camera = ref(false)
@@ -202,10 +177,7 @@ export default defineComponent({
       return (
         <div
           onClick={(e: Event) => e.stopPropagation()}
-          class={[
-            styles.container,
-            show.value ? '' : styles.outUp,
-          ]}
+          class={[styles.container, show.value ? '' : styles.outUp]}
           style={route.query.headerHeight ? { height: '1rem', paddingTop: '0.25rem' } : ''}
         >
           <div class={styles.leftButton}>
@@ -220,7 +192,7 @@ export default defineComponent({
 
           <div class={styles.centerButton}>
             <Transition name="finish">
-              {wiredStatus.value && !evaluatingRef.value?.connentLoading && !startButtonShow.value && (
+              {!startButtonShow.value && (
                 <Button
                   style={{ backgroundImage: `url(${iconEvaluatingEnd})` }}
                   class={[styles.button, styles.finish]}
@@ -257,12 +229,7 @@ export default defineComponent({
                   }
                   if (modelType.value === 'evaluation') {
                     runtime.evaluatingStatus = false
-                    if (
-                      evaluatingRef.value?.playStatus.value === 'play' ||
-                      evaluatingRef.value?.playStatus.value === 'connecting'
-                    ) {
-                      evaluatingRef.value?.cancelTheEvaluation()
-                    }
+                    evaluatStopPlay()
                   }
                   modelType.value = 'init'
                 }}
@@ -303,7 +270,7 @@ export default defineComponent({
                     {
                       <Cell center title="摄像头">
                         <div style="display:flex;justify-content: flex-end;">
-                          <Switch  v-model={SettingState.sett.camera} {...switchProps}>
+                          <Switch v-model={SettingState.sett.camera} {...switchProps}>
                             off
                           </Switch>
                         </div>
@@ -324,7 +291,7 @@ export default defineComponent({
                   </CellGroup>
                 </Popover>
 
-                <Evaluating ref={evaluatingRef} key="lianxi" />
+                <Evaluating ref={evaluatingRef} />
               </>
             )}
 
@@ -339,21 +306,26 @@ export default defineComponent({
                   <ButtonIcon key="music" name={runtime.mode === 'music' ? 'music' : 'accompaniment'} />
                   <span>{runtime.mode === 'background' ? '伴奏' : '原声'}</span>
                 </Button>
-                <Button
-                  data-step="m3"
-                  class={[styles.button, styles.hasText]}
-                  onClick={RuntimeUtils.sectionChange}
-                  disabled={runtime.evaluatingStatus || runtime.playState === 'play'}
-                >
-                  <ButtonIcon
-                    key="section"
-                    name={
-                      'section' +
-                      (detailState.section.length && detailState.section.length <= 2 ? detailState.section.length : '')
-                    }
-                  />
-                  <span>选段</span>
-                </Button>
+                {/* 如果为单元测试和课后训练 */}
+                {unitTestData.isSelectMeasureMode ? null : (
+                  <Button
+                    data-step="m3"
+                    class={[styles.button, styles.hasText]}
+                    onClick={RuntimeUtils.sectionChange}
+                    disabled={runtime.evaluatingStatus || runtime.playState === 'play'}
+                  >
+                    <ButtonIcon
+                      key="section"
+                      name={
+                        'section' +
+                        (detailState.section.length && detailState.section.length <= 2
+                          ? detailState.section.length
+                          : '')
+                      }
+                    />
+                    <span>选段</span>
+                  </Button>
+                )}
                 <Button
                   data-step="m4"
                   class={[styles.button, styles.hasText]}
@@ -410,6 +382,7 @@ export default defineComponent({
                 class={styles.toggleMusicType}
                 placement="bottom-end"
                 show={musicTypeShow.value}
+                // @ts-ignore
                 onUpdate:show={(val: boolean) => {
                   if (
                     runtime.playState === 'play' ||
@@ -477,8 +450,6 @@ export default defineComponent({
                 </Popups>
               </>
             )}
-
-            
           </div>
 
           <FloatWraper />

+ 1 - 14
src/subpages/colexiu/buttons/player.tsx

@@ -5,7 +5,7 @@ import { Button } from 'vant'
 import { evaluatingRef, startButtonShow } from './'
 import ButtonIcon from './icon'
 import { useMenu, useWiredHeadsetCheck } from '../uses'
-import iconEvaluatingStart from './icons/icon-evaluatingStart.png'
+
 import styles from './index.module.less'
 
 export default defineComponent({
@@ -55,19 +55,6 @@ export default defineComponent({
       return (
         <Teleport to="body">
           <div class={styles.player} id="globalPlayer">
-            <Transition name="start" duration={300}>
-              {wiredStatus.value && !evaluatingRef.value?.connentLoading && startButtonShow.value && (
-                <Button
-                  style={{ backgroundImage: `url(${iconEvaluatingStart})` }}
-                  class={[styles.button, styles.start]}
-                  onClick={() => {
-                    startButtonShow.value = false
-                    evaluatingRef.value?.togglePlay?.()
-                  }}
-                >
-                </Button>
-              )}
-            </Transition>
             {!runtime.evaluatingStatus && (
               <>
                 {(runtime.playState === 'pause' || runtime.playState === 'suspend') &&

+ 12 - 12
src/subpages/colexiu/index.tsx

@@ -25,11 +25,11 @@ import ButtonsPlayer from './buttons/player'
 import Permission from './popups/permission'
 import MusicList from './music-list'
 import TickPopup from '/src/pages/detail/tick-popup'
-import SoundEffect from './popups/sound-effect'
+import SoundEffect, { soundEffectShow } from './popups/sound-effect'
 import HelperPopup from './popups/helper'
 import { OpenSheetMusicDisplay, PageFormat } from '/osmd-extended/src'
 import Fingering from './fingering'
-import { Skeleton, Toast } from 'vant'
+import { Popup, Skeleton, Toast } from 'vant'
 import Empty from '/src/components/empty'
 import formatId from './fingering/format-id'
 import { browser } from '/src/helpers/utils'
@@ -169,7 +169,6 @@ export default defineComponent({
       console.time('获取数据')
       runtime.osmd = osmd
       // 设置速度
-      console.log(store.get('speeds22'))
       //@ts-ignore
       const saveSpeed = (store.get('speeds') || {})[search.id]
       const bpm = (osmd as any).bpm || osmd.Sheet.userStartTempoInBPM
@@ -237,19 +236,18 @@ export default defineComponent({
         }
       }
       RuntimeUtils.setAudioInit()
+      const _modelType: IModelType = route.query.modelType as IModelType
+      if (_modelType) {
+        modelType.value = _modelType
+      }
       renderLoading.value = false
       try {
         restPromptMain(detailState.times)
       } catch (error) {}
 
-      if (compulsionEvaluating.value) {
-        runtime.evaluatingStatus = true
-        modelType.value = 'evaluation'
-      }
-
       // 如果进来为评测模式,直接设置成评测模式
-      const _modelType: IModelType = route.query.modelType as IModelType
       if (_modelType && _modelType == 'evaluation') {
+        runtime.evaluatingStatus = true
         nextTick(() => {
           onChangeModelType(_modelType)
         })
@@ -362,8 +360,7 @@ export default defineComponent({
             {/* 节拍器弹窗 */}
             <TickPopup score={score.value} />
             <Permission />
-            {/* 效音 */}
-            <SoundEffect />
+
             {/* 投屏帮助 */}
             <HelperPopup />
             {/** 曲目列表 */}
@@ -396,8 +393,11 @@ export default defineComponent({
               </div>
             )}
           </div>
+          {/* 效音 */}
+          <Transition name="van-slide-up">{soundEffectShow.value && <SoundEffect />}</Transition>
+
           {/* 单元测验选段 */}
-          {/* {!renderLoading.value && <UnitTest />} */}
+          {!renderLoading.value && <UnitTest />}
         </>
       )
     }

+ 1 - 9
src/subpages/colexiu/main.ts

@@ -9,18 +9,10 @@ import './app.css'
 import '../../base.css'
 import App from './App'
 import router from './router'
-import { promisefiyPostMessage } from '/src/helpers/native-message'
-// 获取token
-promisefiyPostMessage({ api: 'getToken' }).then((res: any) => {
-  // console.log('获取token', res)
-  if (res?.content?.accessToken) {
-    sessionStorage.setItem('Authorization', res.content.tokenType + ' ' + res.content.accessToken)
-  }
-})
+
 appState.clintNmae = 'colexiu'
 ;(window as any).DYEnvironment = 'colexiu'
 
 document.body.style.setProperty('--osdm-zoom', '' + formatZoom())
 
-close()
 createApp(App).use(router).mount('#app')

+ 2 - 2
src/subpages/colexiu/popups/evaluating/content.tsx

@@ -73,7 +73,7 @@ export default defineComponent({
   setup(props, { emit }) {
     const route = useRoute()
     /** 是否是单元测试 */
-    const isUnitTest = route.query.unitId
+    const isUnitTest = route.query.unitId ? true : false
     const search = useOriginSearch()
     const shareShow = ref(false)
     const shareLoadedPngData = ref('')
@@ -151,7 +151,7 @@ export default defineComponent({
               '/colexiu-report.html?source=evaluation&musicId=' +
               search.id +
               '&id=' +
-              data.value?.recordId || '',
+              data.value?.recordIdStr || '',
           orientation: 0,
           isHideTitle: true, // 此处兼容安卓,意思为隐藏全部头部
           statusBarTextColor: false,

+ 3 - 2
src/subpages/colexiu/popups/evaluating/index.tsx

@@ -19,6 +19,8 @@ export type ResultContent = {
   intonation: number
   playTime: number
   recordId: number
+  /** 评测记录ID */
+  recordIdStr: string
   /* 分数 */
   score: number
 }
@@ -36,10 +38,9 @@ export default defineComponent({
   setup(props) {
     const confirmShow = ref<boolean>(false)
 
+    //
     const isSaveVideo = SettingState.sett.camera && SettingState.eva.save
 
-    console.log(SettingState.sett.camera, SettingState.eva.save)
-
     const sendUploadMessage = (res?: IPostMessage) => {
       postMessage({
         api: 'proxyServiceMessage',

+ 27 - 6
src/subpages/colexiu/popups/follow/index.tsx

@@ -10,6 +10,7 @@ import { setStepIndex } from '/src/pages/detail/helpers'
 import state, { refreshView, setCurrentTime } from '/src/pages/detail/runtime'
 import detailState from '/src/pages/detail/state'
 import iconFollwBtn from './icons/icon-follwBtn.png'
+import { unitTestData } from '/src/subpages/colexiu/unitTest/index'
 // 显示或隐藏播放按钮
 const togglePlayer = (show: boolean = false) => {
   let globalPlayer: HTMLElement = document.querySelector('#globalPlayer')!
@@ -17,11 +18,12 @@ const togglePlayer = (show: boolean = false) => {
     globalPlayer.style.display = show ? '' : 'none'
   }
 }
-
 const data = reactive({
   list: [] as any, // 频率列表
   index: 0,
   start: false,
+  times: [] as any[], // 音符列表
+  endIndex: 0, // 如果为选段结束的小节
 })
 const [isOpen, changeOpen] = useToggle(true)
 const noteFrequency = ref(0)
@@ -84,14 +86,29 @@ const onClear = () => {
   })
 }
 
+/** 获取默认开始的音符 */
+const getDefaultIndex = () => {
+  if (unitTestData.isSelectMeasureMode) {
+    data.endIndex = detailState.times.findIndex(
+      (n: any) => n.NoteToGraphicalNoteObjectId == detailState.section[1].NoteToGraphicalNoteObjectId
+    )
+    const index = detailState.times.findIndex(
+      (n: any) => n.NoteToGraphicalNoteObjectId == detailState.section[0].NoteToGraphicalNoteObjectId
+    )
+    return index > -1 ? index : 0
+  }
+  return 0
+}
+
 // 开始
 const handleStart = () => {
   onClear()
   data.start = true
   openToggleRecord(true)
-  data.index = 0
+  data.index = getDefaultIndex()
   data.list = []
-  state.osmd.cursor.reset()
+  setStepIndex(state.osmd, data.index)
+  // state.osmd.cursor.reset()
   getNoteIndex()
   refreshView()
 }
@@ -99,8 +116,9 @@ const handleStart = () => {
 const handleEnd = () => {
   data.start = false
   openToggleRecord(false)
-  data.index = 0
-  state.osmd.cursor.reset()
+  data.index = getDefaultIndex()
+  setStepIndex(state.osmd, data.index)
+  // state.osmd.cursor.reset()
   getNoteIndex()
 }
 
@@ -133,6 +151,10 @@ const getNoteIndex = (): any => {
 }
 let checking = false
 const onFollowTime = (evt?: IPostMessage) => {
+  if (unitTestData.isSelectMeasureMode && data.index >= data.endIndex) {
+    handleEnd()
+    return
+  }
   const frequency: number = evt?.content?.frequency
   audioFrequency.value = frequency
   data.list.push(frequency)
@@ -176,7 +198,6 @@ export default defineComponent({
   setup(props, { expose }) {
     onMounted(() => {
       togglePlayer()
-      console.log('开始监听')
       listenerMessage('cloudFollowTime', onFollowTime)
     })
     onUnmounted(() => {

+ 7 - 3
src/subpages/colexiu/popups/sound-effect/index.module.less

@@ -1,11 +1,15 @@
 .box {
-  position: relative;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100vw;
   height: 100vh;
   background-image: url('./icons/bg-sound-effect.png');
   background-size: 100% 100%;
   background-repeat: no-repeat;
   padding-top: 25px;
   box-sizing: border-box;
+  z-index: 1000;
 }
 .button {
   position: absolute;
@@ -81,8 +85,8 @@
   position: absolute;
   bottom: 0;
   left: 26px;
-  width: 210Px;
-  height: 188Px;
+  width: 100px;
+  height: 100px;
 }
 .wrap {
   display: flex;

+ 60 - 91
src/subpages/colexiu/popups/sound-effect/index.tsx

@@ -15,11 +15,12 @@ import iconSound from './icons/icon-sound.png'
 import getScore from '/src/pages/detail/tuning-popup/data'
 import { getAllNodes } from '/src/pages/detail/helpers'
 import { storeKeys } from '/src/constant/store-keys'
+import contentSound from './sound.svg'
 
 // 检测状态
 const checkStatus: Ref<'checking' | 'success' | 'fail'> = ref('checking')
 // 待检测的频率
-const checkFrequency = ref(0)
+const checkFrequency = ref(417.19244620530856)
 // 当前显示的3个点状态
 const dotIcons: Ref<string[]> = ref([iconWhite, iconWhite, iconWhite])
 // 当前检测状态 -1 0 1
@@ -27,13 +28,7 @@ const trend = ref(-1)
 // 上次检查正确时间
 const time = ref(0)
 
-/**
- * 渲染完成后开始校音
- * @param osdm OSMD实例
- */
-const useStart = (osdm: OpenSheetMusicDisplay) => {
-  const notes = getAllNodes(osdm)
-  checkFrequency.value = notes[0].frequency
+const useStart = () => {
   postMessage({
     api: 'proxyServiceMessage',
     content: {
@@ -47,19 +42,13 @@ const useStart = (osdm: OpenSheetMusicDisplay) => {
       },
     },
   })
-  postMessage(
-    {
-      api: 'startSoundCheck',
-    },
-    () => {
-      checkStatus.value = 'checking'
-
-      try {
-        localStorage.setItem(storeKeys.lastCheckTime, '' + new Date().valueOf())
-      } catch(e) {}
-      return
-    }
-  )
+  postMessage({ api: 'startSoundCheck' }, () => {
+    checkStatus.value = 'checking'
+    try {
+      localStorage.setItem(storeKeys.lastCheckTime, '' + new Date().valueOf())
+    } catch (e) {}
+    return
+  })
 }
 
 /**
@@ -95,6 +84,7 @@ const useLister = () => {
     }
   }
   onMounted(() => {
+    useStart()
     listenerMessage('sendResult', onSendResult)
   })
   onBeforeUnmount(() => {
@@ -106,16 +96,13 @@ export const soundEffectShow = ref<boolean>(false)
 //效音组件
 export default defineComponent({
   name: 'ColexiuSoundEffect',
-  emits: ['success', 'close', 'pass', 'fail'],
-  setup(props, { emit }) {
-    const open = ref<boolean>(false)
+  setup() {
     const show = ref<boolean>(false)
     const onSelect = (val: any) => {
       if (val.text === '关闭校音') {
         // 关闭全局校音
         SettingState.sett.tuning = false
       }
-      emit('pass')
       soundEffectShow.value = false
     }
 
@@ -124,16 +111,8 @@ export default defineComponent({
     /**
      * 监听状态触发方法
      */
-    watch([soundEffectShow, checkStatus], () => {
-      if (checkStatus.value === 'success') {
-        emit('success')
-      }
-      if (checkStatus.value === 'fail') {
-        emit('fail')
-      }
+    watch(soundEffectShow, () => {
       if (soundEffectShow.value === false) {
-        open.value = false
-        emit('close')
         useEnd()
       }
     })
@@ -141,65 +120,55 @@ export default defineComponent({
       const data = getScore(2)
       const score = data?.xml || ''
       return (
-        <Popup
-          position="bottom"
-          v-model:show={soundEffectShow.value}
-          onOpen={() => (open.value = true)}
-          onClosed={() => (open.value = false)}
-          teleport="body"
-        >
-          <div class={styles.box}>
-            <img class={styles.iconSound} src={iconSound} />
-            <div class={styles.wrap}>
-              <div class={styles.staff}>
-                {open.value && (
-                  <MusicSheet
-                  isSoundEffect={true}
-                    opotions={{
-                      stretchLastSystemLine: true,
-                      drawMetronomeMarks: false,
-                      drawPartAbbreviations: false,
-                      drawPartNames: false,
-                      drawSlurs: false,
-                      drawTimeSignatures: false,
-                      followCursor: false,
-                    }}
-                    score={score}
-                    showSection={false}
-                    onRerender={useStart}
-                  />
-                )}
-              </div>
-              <div class={styles.des}>
-                请演奏 <span style={{ color: 'var(--primary-color)' }}>{data.text}</span>直到绿灯全部亮起
-              </div>
-              <div class={styles.lampWrap}>
-                {dotIcons.value.map((item, index) => (
-                  <div class={styles.lamp} key={index}>
-                    <img class={[checkStatus.value === 'checking' && styles.flickerAnimate]} src={item} />
-                  </div>
-                ))}
-              </div>
+        <div class={styles.box}>
+          <img class={styles.iconSound} src={iconSound} />
+          <div class={styles.wrap}>
+            <div class={styles.staff}>
+              <img src={contentSound} />
+              {/* <MusicSheet
+                isSoundEffect={true}
+                opotions={{
+                  stretchLastSystemLine: true,
+                  drawMetronomeMarks: false,
+                  drawPartAbbreviations: false,
+                  drawPartNames: false,
+                  drawSlurs: false,
+                  drawTimeSignatures: false,
+                  followCursor: false,
+                }}
+                score={score}
+                showSection={false}
+                onRerender={useStart}
+              /> */}
+            </div>
+            <div class={styles.des}>
+              请演奏 <span style={{ color: 'var(--primary-color)' }}>{data.text}</span>直到绿灯全部亮起
+            </div>
+            <div class={styles.lampWrap}>
+              {dotIcons.value.map((item, index) => (
+                <div class={styles.lamp} key={index}>
+                  <img class={[checkStatus.value === 'checking' && styles.flickerAnimate]} src={item} />
+                </div>
+              ))}
             </div>
-            <img class={styles.bottom} src={iconBottom} />
-            <Button class={styles.button} icon={iconBack} onClick={() => (soundEffectShow.value = false)} />
-
-            <Popover
-              class={styles.skepItems}
-              v-model:show={show.value}
-              actions={[{ text: '跳过本次' }, { text: '关闭校音' }]}
-              onSelect={(val) => onSelect(val)}
-              showArrow={false}
-              vSlots={{
-                reference: () => (
-                  <Button class={styles.skepBtn} icon={iconArrow} iconPosition="right">
-                    跳过本次
-                  </Button>
-                ),
-              }}
-            ></Popover>
           </div>
-        </Popup>
+          <img class={styles.bottom} src={iconBottom} />
+          <Button class={styles.button} icon={iconBack} onClick={() => (soundEffectShow.value = false)} />
+
+          <Popover
+            class={styles.skepItems}
+            v-model:show={show.value}
+            actions={[{ text: '跳过本次' }, { text: '关闭校音' }]}
+            onSelect={(val) => onSelect(val)}
+            vSlots={{
+              reference: () => (
+                <Button class={styles.skepBtn} icon={iconArrow} iconPosition="right">
+                  跳过本次
+                </Button>
+              ),
+            }}
+          ></Popover>
+        </div>
       )
     }
   },

File diff suppressed because it is too large
+ 11 - 0
src/subpages/colexiu/popups/sound-effect/sound.svg


+ 23 - 21
src/subpages/colexiu/unitTest/index.tsx

@@ -1,4 +1,4 @@
-import { defineComponent, onMounted, ref } from 'vue'
+import { defineComponent, onMounted, reactive, ref } from 'vue'
 import { useOriginSearch } from '../uses'
 import request from '/src/helpers/request'
 import SettingState from '/src/pages/detail/setting-state'
@@ -10,9 +10,9 @@ interface IquestionExtendsInfo {
   /** 评测难度 */
   difficulty: 'ONE' | 'TWO' | 'THREE' | '1' | '2' | '3' | ''
   /** 开始小节 */
-  start: string
+  start: string | number
   /** 结束小节 */
-  end: string
+  end: string | number
 }
 const difficultyData: { [_: string]: any } = {
   ONE: 'BEGINNER',
@@ -23,8 +23,10 @@ const difficultyData: { [_: string]: any } = {
   '3': 'PERFORMER',
 }
 
-/** 是否是选段模式 */
-export const isSelctMeasureMode = ref(false)
+export const unitTestData = reactive({
+  /** 是否是选段模式 */
+  isSelectMeasureMode: false,
+})
 
 export default defineComponent({
   name: 'unitTest',
@@ -46,37 +48,37 @@ export default defineComponent({
       try {
         const res: any = await request.get(`/examinationQuestion/detail?examinationQuestionId=${search.questionId}`)
         questionExtendsInfo.value = JSON.parse(res?.data?.questionExtendsInfo) || {}
+        questionExtendsInfo.value.start = Number(questionExtendsInfo.value.start)
+        questionExtendsInfo.value.end = Number(questionExtendsInfo.value.end)
       } catch (error) {
         console.error('解析单元测验曲谱题目失败', error)
       }
-
-      // 设置评测难度
-      if (difficultyData[questionExtendsInfo.value.difficulty]) {
-        SettingState.eva.difficulty = difficultyData[questionExtendsInfo.value.difficulty]
-      }
-      if (questionExtendsInfo.value.start && questionExtendsInfo.value.end) {
-      }
-      console.log('🚀 ~ questionExtendsInfo', questionExtendsInfo.value)
     }
 
     /**设置小节 */
     const setSection = () => {
-      const startNote = state.times.find(
-        (n: any) => n.si === 0 && n.noteElement.sourceMeasure.MeasureNumberXML == questionExtendsInfo.value.start
+      const startNotes = state.times.filter(
+        (n: any) => n.noteElement.sourceMeasure.MeasureNumberXML == questionExtendsInfo.value.start
       )
-      const endNote = state.times.find(
-        (n: any) => n.si === 0 && n.noteElement.sourceMeasure.MeasureNumberXML == questionExtendsInfo.value.end
+      const endNotes = state.times.filter(
+        (n: any) => n.noteElement.sourceMeasure.MeasureNumberXML == questionExtendsInfo.value.end
       )
-      console.log('🚀 ~ activeNote', startNote, endNote)
+      const startNote = startNotes[0]
+      const endNote = endNotes[endNotes.length - 1]
+      //   console.log('🚀 ~ activeNote', startNote, endNote, questionExtendsInfo.value.end)
       if (startNote && endNote) {
+        unitTestData.isSelectMeasureMode = true
+        // 设置小节
+        state.sectionStatus = true
         state.section = [startNote, endNote]
-        Toast.clear()
-        isSelctMeasureMode.value = true
+        // 设置评测难度
+        if (difficultyData[questionExtendsInfo.value.difficulty]) {
+          SettingState.eva.difficulty = difficultyData[questionExtendsInfo.value.difficulty]
+        }
       }
     }
     onMounted(async () => {
       await getUnitData()
-      sectionChange()
       setSection()
     })
     return () => <div></div>

+ 57 - 50
src/subpages/colexiu/uses/use-evaluat.ts

@@ -1,4 +1,4 @@
-import { onBeforeUnmount, onMounted, ref, watch } from 'vue'
+import { nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'
 import dayjs from 'dayjs'
 import { IPostMessage, listenerMessage, postMessage, removeListenerMessage } from '/src/helpers/native-message'
 import runtime, * as RuntimeUtils from '/src/pages/detail/runtime'
@@ -12,16 +12,15 @@ import { Toast } from 'vant'
 
 /** 打开校音或者距离上一次校音超过一天 */
 const soundNeedShow = () => {
-  if (runtime.evaluatingStatus && !permissionPopup.show) {
+  if (runtime.evaluatingStatus) {
     let time: number = -1
     const timeString = localStorage.getItem(storeKeys.lastCheckTime)
     try {
       const date = dayjs(parseFloat(timeString || '0'))
-      // console.log('date', date, date.isValid(), dayjs(new Date().valueOf()))
       if (date.isValid()) {
         time = Math.abs(date.diff(dayjs(new Date().valueOf()), 'day'))
       }
-    } catch(e) {}
+    } catch (e) {}
     // console.log(time, timeString)
     if (SettingState.sett.tuning || time > 0 || !timeString) {
       soundEffectShow.value = true
@@ -42,72 +41,80 @@ const setWiredStatus = (res?: IPostMessage) => {
     permissionPopup.show = false
   }
 }
+/**
+ * 开启评测模式后,需要效验 耳机,效音
+ */
+export const handleCheckEvaluatStatus = () => {
+  // 是否需要效音
+  soundNeedShow()
+  // 检测耳机状态
+  // postMessage({ api: 'isWiredHeadsetOn' }, setWiredStatus)
+  postMessage({ api: 'isWiredHeadsetOn' }, (evt) => {
+    // console.log('🚀 ~ 耳机状态', evt)
+    permissionPopup.active = 'earphone'
+    permissionPopup.show = !evt?.content.checkIsWired
+  })
+}
 
 /**
  * 监听评测状态打开
  */
 export const useWiredHeadsetCheck = () => {
   const wiredStatus = ref(false)
-  watch(
-    () => runtime.evaluatingStatus,
-    () => {
-      postMessage(
-        {
-          api: 'isWiredHeadsetOn',
-        },
-        setWiredStatus
-      )
-    }
-  )
+  // watch(
+  //   () => runtime.evaluatingStatus,
+  //   () => {
+  //     if (!runtime.evaluatingStatus) return
+  //     postMessage(
+  //       {
+  //         api: 'isWiredHeadsetOn',
+  //       },
+  //       setWiredStatus
+  //     )
+  //   }
+  // )
 
-  watch(
-    () => permissionPopup.show,
-    () => {
-      // if (!permissionPopup.show) {
-
-      //   // wiredStatus.value = true
-      // }
-      soundNeedShow()
-    }
-  )
+  // watch(
+  //   () => permissionPopup.show,
+  //   () => {
+  //     soundNeedShow()
+  //   }
+  // )
 
   /** 监听评测状态,退出评测模式停止播放,清除提示信息 */
-  watch(
-    [() => runtime.evaluatingStatus],
-    () => {
-      Toast.clear()
-      if (!runtime.evaluatingStatus) {
-        runtime.evaluatingTips = false
-        RuntimeUtils.pause()
-        RuntimeUtils.setCurrentTime(0)
-      }
+  watch([() => runtime.evaluatingStatus], () => {
+    // Toast.clear()
+    // if (!runtime.evaluatingStatus) {
+    //   runtime.evaluatingTips = false
+    //   RuntimeUtils.pause()
+    //   RuntimeUtils.setCurrentTime(0)
+    // }
 
-      if (SettingState.sett.fingering) {
-        RuntimeUtils.event.emit('settingFingeringChange')
-      }
-      // console.log('settingFingeringChange', 11, runtime.evaluatingStatus)
+    if (SettingState.sett.fingering) {
+      // RuntimeUtils.event.emit('settingFingeringChange')
     }
-  )
+    // console.log('settingFingeringChange', 11, runtime.evaluatingStatus)
+  })
 
   /** 监听耳机状态啊 */
   watch(
     [() => runtime.evaluatingStatus, () => permissionPopup.show, () => soundEffectShow.value],
     ([evaluatingStatus, permissionShow, soundEffectShow]) => {
-      wiredStatus.value = evaluatingStatus && !permissionShow && !soundEffectShow
-      if (!runtime.evaluatingStatus) {
-        detailState.evaluatings = {}
-        evaluatingShow.value = false
-      }
+      // wiredStatus.value = evaluatingStatus && !permissionShow && !soundEffectShow
+      // if (!runtime.evaluatingStatus) {
+      //   detailState.evaluatings = {}
+      //   evaluatingShow.value = false
+      // }
     }
   )
 
-  onMounted(() => {
-    listenerMessage('listenerWiredStatus', setWiredStatus)
-  })
+  // onMounted(() => {
+  //   listenerMessage('listenerWiredStatus', setWiredStatus)
+  // })
 
-  onBeforeUnmount(() => {
-    removeListenerMessage('listenerWiredStatus', setWiredStatus)
-  })
+  // onBeforeUnmount(() => {
+  //   removeListenerMessage('listenerWiredStatus', setWiredStatus)
+  // })
 
   return [wiredStatus]
 }

+ 7 - 6
src/subpages/colexiu/uses/use-fee.ts

@@ -11,6 +11,7 @@ import { useClientType, useOriginSearch } from '.'
 const browserInfo = browser()
 
 /**
+ * 效验是否开通会员
  * @param type VIP收费或者单曲收费类型
  * @param status 订单状态
  * @param play 后端验证是否可以播放
@@ -82,11 +83,11 @@ export const useFee = (type?: string, status?: OrderStatus) => {
     
   }
 
-  runtime.audiosInstance.event.on('timeupdate', onTimeUpdate)
-  listenerMessage('cloudTimeUpdae', onTimeUpdate)
+  // runtime.audiosInstance.event.on('timeupdate', onTimeUpdate)
+  // listenerMessage('cloudTimeUpdae', onTimeUpdate)
 
-  onBeforeUnmount(() => {
-    runtime.audiosInstance.event.off('timeupdate', onTimeUpdate)
-    removeListenerMessage('cloudTimeUpdae', onTimeUpdate)
-  })
+  // onBeforeUnmount(() => {
+  //   runtime.audiosInstance.event.off('timeupdate', onTimeUpdate)
+  //   removeListenerMessage('cloudTimeUpdae', onTimeUpdate)
+  // })
 }

Some files were not shown because too many files changed in this diff