TIANYONG преди 7 месеца
родител
ревизия
b1f4ea7b2a
променени са 26 файла, в които са добавени 377 реда и са изтрити 39 реда
  1. 5 0
      src/helpers/communication.ts
  2. 30 0
      src/page-instrument/custom-plugins/work-ealuating/index.module.less
  3. 46 3
      src/page-instrument/custom-plugins/work-ealuating/index.tsx
  4. 65 6
      src/page-instrument/custom-plugins/work-home/index.module.less
  5. 45 7
      src/page-instrument/custom-plugins/work-home/index.tsx
  6. 5 0
      src/page-instrument/custom-plugins/work-index/index.tsx
  7. BIN
      src/page-instrument/evaluat-model/evaluat-result/img/tjzy.png
  8. 6 1
      src/page-instrument/evaluat-model/evaluat-result/index.tsx
  9. 57 5
      src/page-instrument/evaluat-model/index.tsx
  10. 26 0
      src/page-instrument/evaluat-model/submit-nodone/index.module.less
  11. 25 0
      src/page-instrument/evaluat-model/submit-nodone/index.tsx
  12. BIN
      src/page-instrument/header-top/image/submitWorkAgain.png
  13. BIN
      src/page-instrument/header-top/image/submitWorkConfirm.png
  14. BIN
      src/page-instrument/header-top/image/submitWorkNoDoneBg.png
  15. BIN
      src/page-instrument/header-top/image/workCameraBg.png
  16. BIN
      src/page-instrument/header-top/image/workCameraCancel.png
  17. BIN
      src/page-instrument/header-top/image/workCameraConfirm.png
  18. BIN
      src/page-instrument/header-top/image/workDoneBtn.png
  19. BIN
      src/page-instrument/header-top/image/workDonePop.png
  20. BIN
      src/page-instrument/header-top/image/workNoBack.png
  21. BIN
      src/page-instrument/header-top/image/workNoContinue.png
  22. BIN
      src/page-instrument/header-top/image/workNoDoneBg.png
  23. 27 0
      src/page-instrument/header-top/workHomePop/index.module.less
  24. 16 9
      src/page-instrument/header-top/workHomePop/index.tsx
  25. 9 8
      src/page-instrument/view-detail/index.tsx
  26. 15 0
      src/view/evaluating/index.tsx

+ 5 - 0
src/helpers/communication.ts

@@ -111,6 +111,11 @@ export const api_videoUpdate = (callback: CallBack) => {
 	);
 };
 
+/** 保存作业 */
+export const api_workUpdate = (): Promise<IPostMessage | undefined> => {
+	return promisefiyPostMessage({ api: "videoUpdate" });
+};
+
 /** 分享 */
 export const api_shareAchievements = (content: any): Promise<IPostMessage | undefined> => {
 	if (!storeData.isApp) return Promise.resolve({} as any);

+ 30 - 0
src/page-instrument/custom-plugins/work-ealuating/index.module.less

@@ -0,0 +1,30 @@
+.microBox {
+    position: fixed;
+    width: 100vw;
+    height: 100vh;
+    left: 0;
+    top: 0;
+    z-index: 999;
+    background: rgba(0,0,0,0.7);
+    .microBg {
+        position: absolute;
+        left: 50%;
+        top: 20%;
+        height: 60%;
+        transform: translateX(-50%);
+    }
+    .microBtn {
+        position: absolute;
+        bottom: 23.5%;
+        left: 50%;
+        transform: translate(-50%);
+    }
+    .microCancel {
+        width: 11.2vw;
+        margin-right: 2px;
+    }
+    .microConfirm {
+        width: 11.2vw;
+        margin-left: 2px;
+    }
+}

+ 46 - 3
src/page-instrument/custom-plugins/work-ealuating/index.tsx

@@ -5,6 +5,9 @@ import { api_lessonTrainingSubmitTraining } from "../../api";
 import state, { IDifficulty, handleSetSpeed, hanldeDirectSelection, setSection } from "/src/state";
 import { getQuery } from "/src/utils/queryString";
 import { evaluatingData } from "/src/view/evaluating";
+import styles from "./index.module.less";
+import { headImg } from "/src/page-instrument/header-top/image";
+import { api_openCamera } from "/src/helpers/communication";
 
 export default defineComponent({
 	name: "EvaluatingWork",
@@ -23,6 +26,7 @@ export default defineComponent({
 			end: "" as any,
 			evaluateSpeed: 0,
 			score: 0, // 评测作业及格分数
+			openCameraTipDone: false, // 打开摄像头弹窗是否出现过
 		});
 		/** 隐藏评测功能 */
 		const handleHide = () => {
@@ -69,12 +73,24 @@ export default defineComponent({
 				console.log(error);
 			}
 		};
+
+		const openCamera = async () => {
+			evaluatingData.showOpenCameraPop = false
+			const res = await api_openCamera();
+			// 没有授权
+			if (res?.content?.reson) {
+				state.setting.camera = false
+			} else {
+				state.setting.camera = true
+			}
+		}
 		watch(
 			() => evaluatingData.resultData.recordId,
 			() => {
 				// 评测作业,完整评测才调用保存作业接口
 				if (evaluatingData.resulstMode && evaluatingData.resultData.recordId && evaluatingData.isComplete) {
-					addEvaluatingWorkRecored(evaluatingData.resultData);
+					// 评测的提交作业接口改为用户手动点击“提交作业”按钮来提交
+					// addEvaluatingWorkRecored(evaluatingData.resultData);
 					// 完整评测,判断当前的评测分数是否已达标,没有达标,点击返回按钮需要给出弹窗提示
 					if (!state.isWorkDone) {
 						state.isWorkDone = Number(evaluatingData.resultData?.score) >= evaluatingWorkData.score;
@@ -82,14 +98,41 @@ export default defineComponent({
 				}
 			}
 		);
+		watch(
+			() => state.isLoading,
+			(val) => {
+				if (!val && !evaluatingWorkData.openCameraTipDone) {
+					evaluatingWorkData.openCameraTipDone = true
+					// 如果没有打开摄像头,提醒用户打开摄像头
+					if (!state.setting.camera) {
+						evaluatingData.showOpenCameraPop = true
+					}
+				}
+			}
+		);
 		onMounted(() => {
 			handleHide();
 			getWorkData();
 			// verifyMembershipServices();
 		});
 		expose({
-			getWorkData
+			getWorkData,
+			addEvaluatingWorkRecored
 		})		
-		return () => <div></div>;
+		return () => (
+			<>
+				<div></div>
+				{
+					evaluatingData.showOpenCameraPop && 
+					<div class={styles.microBox}>
+						<img class={styles.microBg} src={headImg("workCameraBg.png")} />
+						<div class={styles.microBtn}>
+							<img class={styles.microCancel} src={headImg("workCameraCancel.png")} onClick={() => evaluatingData.showOpenCameraPop = false } />
+							<img class={styles.microConfirm} src={headImg("workCameraConfirm.png")} onClick={() => openCamera() } />
+						</div>
+					</div>						
+				}
+			</>
+		);
 	},
 });

+ 65 - 6
src/page-instrument/custom-plugins/work-home/index.module.less

@@ -1,13 +1,72 @@
 .homework{
     position: fixed;
-    left: 14px;
+    left: 46px;
     top: 64px;
-    background-color: rgba(0, 0, 0, .6);
-    border-radius: 20px;
+    background-color: #C5E6F7;
+    border-radius: 12px;
     font-size: 14px;
-    color: #fff;
-    padding: 5px 8px;
+    color: #080808;
+    width: 106px;
+    text-align: center;
+    padding: 5px 0;
     line-height: 1;
-    font-weight: 300;
     z-index: 100;
+    span {
+        margin-left: 8px;
+    }
+    .blinkDot {
+        position: absolute;
+        left: 8px;
+        top: 50%;
+        transform: translateY(-50%);
+        width: 3px;
+        height: 3px;
+        border-radius: 50%;
+        background: #FF5A56;
+        animation: blink 1s infinite; /* 定义动画,周期 2 秒,永远重复 */
+    }
+    .grayDot {
+        position: absolute;
+        left: 8px;
+        top: 50%;
+        width: 3px;
+        height: 3px;
+        border-radius: 50%;
+        background: #aaaaaa;
+        transform: translateY(-50%);
+    }
+}
+
+@keyframes blink {
+    0% {
+      opacity: 1; /* 完全可见 */
+    }
+    50% {
+      opacity: 0; /* 完全透明 */
+    }
+    100% {
+      opacity: 1; /* 完全可见 */
+    }
+}
+
+.workDonePop {
+    position: fixed;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    background: rgba(0, 0, 0, 0.7);
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    z-index: 999;
+    .doneBg {
+        width: 520px;
+    }
+    .doneBtn {
+        width: 113px;
+        margin-top: -50px;
+        cursor: pointer;
+    }
 }

+ 45 - 7
src/page-instrument/custom-plugins/work-home/index.tsx

@@ -2,7 +2,9 @@ import { defineComponent, onMounted, reactive, watch } from "vue";
 import styles from "./index.module.less";
 // import { verifyMembershipServices } from "../vip-verify";
 import { api_lessonTrainingSubmitTraining, api_lessonTrainingTrainingStudentDetail } from "../../api";
-import state, { handleSetSpeed, hanldeDirectSelection, setSection } from "/src/state";
+import state, { handleSetSpeed, hanldeDirectSelection, setSection, togglePlay } from "/src/state";
+import { getSecondRPM } from "/src/utils";
+import { headImg } from "/src/page-instrument/header-top/image";
 
 export default defineComponent({
 	name: "HomeWork",
@@ -15,14 +17,17 @@ export default defineComponent({
 	emits: ["change"],
 	setup(props, {expose}) {
 		const training = reactive({
-			trainingTimes: "",
-			trainingSpeed: 0,
-			times: 0,
+			trainingTimes: "", // 已经练习的时长,单位分钟
+			trainingSpeed: 0, // 作业规定的速度
+			times: 0, // 作业规定的练习时长,单位分钟
+			trainingTimeSecond: 0, // 实时更新的练习时长,单位秒
 			workRecord: "",
 			isAddOk: 0,
 			starTime: 0,
 			start: "" as any,
 			end: "" as any,
+			timer: null as any, // 定时器
+			showWorkDonePop: false, // 显示需要提交作业弹窗
 		});
 
 		/** 隐藏评测功能 */
@@ -48,6 +53,7 @@ export default defineComponent({
 				}
 				training.times = trainingContent.trainingTimes || 0;
 				training.trainingTimes = (workeData.trainingTimes / 60).toFixed(1) || "0";
+				training.trainingTimeSecond = workeData.trainingTimes || 0;
 				training.trainingSpeed = trainingContent.practiceSpeed;
 				training.start = Number(trainingContent.practiceChapterBegin);
 				training.end = Number(trainingContent.practiceChapterEnd);
@@ -64,6 +70,7 @@ export default defineComponent({
 			const res = await api_lessonTrainingTrainingStudentDetail(props.workeData.id);
 			if (res?.code === 200) {
 				training.trainingTimes = (res.data.trainingTimes / 60).toFixed(1) || "0";
+				training.trainingTimeSecond = res.data.trainingTimes || 0;
 				state.isWorkDone = Number(training.trainingTimes) >= Number(training.times);
 			}
 		};
@@ -82,13 +89,31 @@ export default defineComponent({
 			} catch (error) {}
 		};
 
+		const handleStart = () => {
+			training.timer = setInterval(() => {
+				training.trainingTimeSecond += 1;
+				// 如果播放中,作业从未达标到达标状态,需要暂停播放,并且弹窗提示作业已达标
+				if (!state.isWorkDone && training.trainingTimeSecond >= training.times * 60) {
+					togglePlay("paused")
+					state.isWorkDone = true
+					training.showWorkDonePop = true
+				}
+				// console.log('练习时长',training.trainingTimeSecond)
+			}, 1000);
+		};
+        const handleStop = () => {
+            clearInterval(training.timer)
+        }
+
 		watch(
 			() => state.playState,
 			() => {
 				if (state.playState === "play") {
 					training.starTime = Date.now();
+					handleStart();
 				} else {
 					addHomeworkRecored();
+					handleStop();
 				}
 			}
 		);
@@ -108,9 +133,22 @@ export default defineComponent({
 			getWorkData
 		})
 		return () => (
-			<div class={styles.homework}>
-				{training.trainingTimes} / {training.times} 分钟
-			</div>
+			<>
+				<div class={styles.homework}>
+					<i class={state.playState === "play" ? styles.blinkDot : styles.grayDot}></i>
+					<span>{getSecondRPM(training.trainingTimeSecond)} / {getSecondRPM(training.times*60)}</span>
+				</div>
+				{
+					training.showWorkDonePop && 
+					<div class={styles.workDonePop}>
+						<img class={styles.doneBg} src={headImg("workDonePop.png")} />
+						<img class={styles.doneBtn} src={headImg("workDoneBtn.png")} onClick={() => {
+							training.showWorkDonePop = false
+                			// addHomeworkRecored();
+              			}} />
+					</div>
+				}
+			</>
 		);
 	},
 });

+ 5 - 0
src/page-instrument/custom-plugins/work-index/index.tsx

@@ -34,6 +34,11 @@ export const resetSection = () => {
 	state.workSectionNeedReset = false;
 };
 
+// 手动提交评测作业
+export const selfSubmitWorkHome = () => {
+	workEvaluatRef.value?.addEvaluatingWorkRecored(evaluatingData.resultData);
+}
+
 export default defineComponent({
 	name: "workIndex",
 	setup(props) {

BIN
src/page-instrument/evaluat-model/evaluat-result/img/tjzy.png


+ 6 - 1
src/page-instrument/evaluat-model/evaluat-result/index.tsx

@@ -16,6 +16,7 @@ import iconBadge from "./img/icon-badge.png";
 import yzImg from "./img/yz.png";
 import jzImg from "./img/jz.png";
 import wzxImg from "./img/wzx.png";
+import tjzyImg from "./img/tjzy.png";
 import closeImg from "./img/close.png";
 import { getQuery } from "/src/utils/queryString";
 import { browser, getBehaviorId } from "/src/utils";
@@ -167,7 +168,11 @@ export default defineComponent({
               <div class={styles.tips}>{evaluatingData.resultData.clxtip}</div>
               <div class={styles.ctrls}>
                 <img src={zlycImg} class={[styles.ctrlsBtn, "evaluting-result-2"]} onClick={() => emit("close", "tryagain")} />
-                {evaluatingData.resultData.recordId ? (
+                {
+                  query.workRecord && 
+                  <img src={tjzyImg} class={[styles.ctrlsBtn, "evaluting-result-3", data.saveLoading ? styles.disablued : ""]} onClick={() => emit("close", "submitWork")} />
+                }
+                {evaluatingData.resultData.recordId && !query.workRecord ? (
                   <div class={styles.saveBtn}>
                     <img
                       src={noSaveTips.value ? bczpJzImg : bczpImg}

+ 57 - 5
src/page-instrument/evaluat-model/index.tsx

@@ -10,7 +10,7 @@ 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_remove_cancelDelayCheck, api_closeDelayCheck, api_finishDelayCheck, api_retryEvaluating, api_remove_finishDelayCheck } from "/src/helpers/communication";
+import { api_getDeviceDelay, api_openAdjustRecording, api_proxyServiceMessage, api_videoUpdate, getEarphone, api_back, api_startDelayCheck, api_cancelDelayCheck, api_remove_cancelDelayCheck, api_closeDelayCheck, api_finishDelayCheck, api_retryEvaluating, api_remove_finishDelayCheck, api_workUpdate } from "/src/helpers/communication";
 import EvaluatShare from "./evaluat-share";
 import { Vue3Lottie } from "vue3-lottie";
 import startData from "./data/start.json";
@@ -25,6 +25,8 @@ import Countdown from "./countdown";
 import { IPostMessage } from "/src/utils/native-message";
 import tipErjiBg from "./icons/tip_erji.png"
 import tipErjiBtn from "./icons/tip_btn.png"
+import SubmitNoDonePop from "./submit-nodone";
+import { selfSubmitWorkHome } from "../custom-plugins/work-index";
 
 // const DelayCheck = defineAsyncComponent(() =>
 //   import('./delay-check')
@@ -59,6 +61,7 @@ export default defineComponent({
       evaluatUpdateAudio: false,
       isSaveVideo: state.setting.camera && state.setting.saveToAlbum,
       shareMode: false,
+      showNoDonePop: false, // 提交作业显示未达标确认弹窗
     });
     /**
      * 检测返回
@@ -196,7 +199,7 @@ export default defineComponent({
         // 妙极客的曲子,选择的第一小节,beatLength需要传递fixtime
         if (state.isEvxml && startIndex == 0) {
           actualBeatLength = Math.round((state.times[0].fixtime * 1000) / 1);
-        }
+        }          
         selectTimes = state.times.filter((n: any, index: number) => {
           return index >= startIndex && index <= endIndex;
         });
@@ -329,7 +332,7 @@ export default defineComponent({
     };
 
     /** 评测结果按钮处理 */
-    const handleEvaluatResult = (type: "practise" | "tryagain" | "look" | "share" | "update" | "selfCancel") => {
+    const handleEvaluatResult = (type: "practise" | "tryagain" | "look" | "share" | "update" | "selfCancel" | "submitWork") => {
       if (type === "update") {
         if (state.isAppPlay) {
           evaluatModel.evaluatUpdateAudio = true;
@@ -371,11 +374,56 @@ export default defineComponent({
         // evaluatingData.isBeginMask = true;
         evaluatingData.evaluatings = {};
         state.playState = "paused";
+      } else if (type === "submitWork") {
+        // 作业模式,提交作业,作业没有达标时,提交作业需要弹窗提醒
+        if (!state.isWorkDone) {
+          evaluatModel.showNoDonePop = true;
+          return;
+        } else {
+          submitWorkHome();
+        }
       }
       resetPlaybackToStart();
       evaluatingData.resulstMode = false;
     };
 
+    // 关闭提交作业确认弹窗
+    const handleCloseSubmitPop = (type: "again" | "confirm") => {
+      evaluatModel.showNoDonePop = false;
+      if (type === "again") {
+        handleEvaluatResult("tryagain");
+      } else {
+        submitWorkHome();
+        resetPlaybackToStart();
+        evaluatingData.resulstMode = false;
+      }
+    }
+    // 提交作业
+    const submitWorkHome = async () => {
+      // 分为开了摄像头和没开摄像头的情况
+      if (state.setting.camera) {
+        const res = await api_workUpdate();
+        console.log('提交作业回调',res)
+        if (res) {
+          if (res?.content?.type === "success") {
+            handleSaveResult({
+              id: evaluatingData.resultData?.recordId,
+              videoFilePath: res?.content?.filePath,
+            });
+            // 手动提交评测作业
+            selfSubmitWorkHome();
+          } else if (res?.content?.type === "error") {
+            showToast({
+              message: res.content?.message || "上传失败",
+            });
+          }
+        }
+      } else {
+        // 手动提交评测作业
+        selfSubmitWorkHome();
+      }
+    }
+
     /** 上传音视频 */
     const hanldeUpdateVideoAndAudio = async (update = false) => {
       if (!update) {
@@ -489,11 +537,11 @@ export default defineComponent({
     };
 
     const earPhonePopShow = computed(() => {
-			return evaluatingData.earphoneMode && !state.isLoading && !state.hasDriverPop;
+			return evaluatingData.earphoneMode && !state.isLoading && !state.hasDriverPop && !evaluatingData.showOpenCameraPop;
 		});
 
     const tipErjiPopShow = computed(() => {
-			return evaluatingData.tipErjiShow && !state.isLoading && !state.hasDriverPop;
+			return evaluatingData.tipErjiShow && !state.isLoading && !state.hasDriverPop && !evaluatingData.showOpenCameraPop;
 		});
 
     // watch(
@@ -640,6 +688,10 @@ export default defineComponent({
         <Popup teleport="body" class={["popup-custom", "van-scale"]} transition="van-scale" v-model:show={evaluatModel.shareMode}>
           <EvaluatShare onClose={() => (evaluatModel.shareMode = false)} />
         </Popup>
+        
+        <Popup teleport="body" class={["popup-custom", "van-scale"]} transition="van-scale" v-model:show={evaluatModel.showNoDonePop}>
+          <SubmitNoDonePop onClose={handleCloseSubmitPop} />
+        </Popup>
       </div>
     );
   },

+ 26 - 0
src/page-instrument/evaluat-model/submit-nodone/index.module.less

@@ -0,0 +1,26 @@
+.microBox {
+    position: relative;
+    width: 100vw;
+    height: 100vh;
+    .microBg {
+        position: absolute;
+        left: 50%;
+        top: 50%;
+        width: 520px;
+        transform: translate(-50%,-50%);
+    }
+    .microBtn {
+        position: absolute;
+        bottom: 20%;
+        left: 50%;
+        transform: translate(-50%);
+    }
+    .microCancel {
+        width: 90px;
+        margin-right: 2px;
+    }
+    .microConfirm {
+        width: 90px;
+        margin-left: 2px;
+    }
+}

+ 25 - 0
src/page-instrument/evaluat-model/submit-nodone/index.tsx

@@ -0,0 +1,25 @@
+import { defineComponent } from "vue";
+import styles from "./index.module.less";
+import { headImg } from "/src/page-instrument/header-top/image";
+
+export default defineComponent({
+	name: "submitNoDonePop",
+	props: {
+		tip: {
+			type: String,
+			default: () => ''
+		}
+	},
+	emits: ["close"],
+	setup(props, { emit }) {
+		return () => (
+			<div class={styles.microBox}>
+				<img class={styles.microBg} src={headImg("submitWorkNoDoneBg.png")} />
+				<div class={styles.microBtn}>
+					<img class={styles.microCancel} src={headImg("submitWorkAgain.png")} onClick={() => emit("close", "again")} />
+					<img class={styles.microConfirm} src={headImg("submitWorkConfirm.png")} onClick={() => emit("close", "confirm")} />
+				</div>
+			</div>
+		);
+	},
+});

BIN
src/page-instrument/header-top/image/submitWorkAgain.png


BIN
src/page-instrument/header-top/image/submitWorkConfirm.png


BIN
src/page-instrument/header-top/image/submitWorkNoDoneBg.png


BIN
src/page-instrument/header-top/image/workCameraBg.png


BIN
src/page-instrument/header-top/image/workCameraCancel.png


BIN
src/page-instrument/header-top/image/workCameraConfirm.png


BIN
src/page-instrument/header-top/image/workDoneBtn.png


BIN
src/page-instrument/header-top/image/workDonePop.png


BIN
src/page-instrument/header-top/image/workNoBack.png


BIN
src/page-instrument/header-top/image/workNoContinue.png


BIN
src/page-instrument/header-top/image/workNoDoneBg.png


+ 27 - 0
src/page-instrument/header-top/workHomePop/index.module.less

@@ -51,3 +51,30 @@
         }
     }
 }
+
+.microBox {
+    position: relative;
+    width: 100vw;
+    height: 100vh;
+    .microBg {
+        position: absolute;
+        left: 50%;
+        top: 20%;
+        height: 60%;
+        transform: translateX(-50%);
+    }
+    .microBtn {
+        position: absolute;
+        bottom: 23.5%;
+        left: 50%;
+        transform: translate(-50%);
+    }
+    .microCancel {
+        width: 11.2vw;
+        margin-right: 2px;
+    }
+    .microConfirm {
+        width: 11.2vw;
+        margin-left: 2px;
+    }
+}

+ 16 - 9
src/page-instrument/header-top/workHomePop/index.tsx

@@ -14,15 +14,22 @@ export default defineComponent({
 	emits: ["close"],
 	setup(props, { emit }) {
 		return () => (
-			<div class={styles.popBox}>
-				<img class={styles.boxBg} src={headImg("workHome_bg.png")} />
-				<img class={styles.boxTitle} src={headImg("workHome_icon1.png")} />
-				<div class={styles.boxContent}>
-					<p>本条练习还没达到老师的练习要求,是否继续练习?</p>
-					<div class={styles.boxBtn}>
-						<img class={styles.boxClose} src={headImg("workHome_icon3.png")} onClick={() => emit("close")} />
-						<img class={styles.boxConfirm} src={headImg("workHome_icon2.png")} onClick={() => emit("close", true)} />
-					</div>
+			// <div class={styles.popBox}>
+			// 	<img class={styles.boxBg} src={headImg("workHome_bg.png")} />
+			// 	<img class={styles.boxTitle} src={headImg("workHome_icon1.png")} />
+			// 	<div class={styles.boxContent}>
+			// 		<p>本条练习还没达到老师的练习要求,是否继续练习?</p>
+			// 		<div class={styles.boxBtn}>
+			// 			<img class={styles.boxClose} src={headImg("workHome_icon3.png")} onClick={() => emit("close")} />
+			// 			<img class={styles.boxConfirm} src={headImg("workHome_icon2.png")} onClick={() => emit("close", true)} />
+			// 		</div>
+			// 	</div>
+			// </div>
+			<div class={styles.microBox}>
+				<img class={styles.microBg} src={headImg("workNoDoneBg.png")} />
+				<div class={styles.microBtn}>
+					<img class={styles.microCancel} src={headImg("workNoBack.png")} onClick={() => emit("close")} />
+					<img class={styles.microConfirm} src={headImg("workNoContinue.png")} onClick={() => emit("close", true)} />
 				</div>
 			</div>
 		);

+ 9 - 8
src/page-instrument/view-detail/index.tsx

@@ -127,14 +127,15 @@ export default defineComponent({
         Object.assign(state.setting, settting);
         //state.setting.beatVolume = state.setting.beatVolume || 50
         state.setting.beatVolume = 50;
-        if (state.setting.camera) {
-          const res = await api_openCamera();
-          // 没有授权
-          if (res?.content?.reson) {
-            state.setting.camera = false;
-            store.set("musicscoresetting", state.setting);
-          }
-        }
+        // 默认进来不需要开启摄像头,进入评测页面才需要判断是否开启摄像头
+        // if (state.setting.camera) {
+        //   const res = await api_openCamera();
+        //   // 没有授权
+        //   if (res?.content?.reson) {
+        //     state.setting.camera = false;
+        //     store.set("musicscoresetting", state.setting);
+        //   }
+        // }
       }
     });
 

+ 15 - 0
src/view/evaluating/index.tsx

@@ -34,6 +34,7 @@ import {
   api_cloudChangeSpeed,
   api_startDelayCheck,
   api_closeDelayCheck,
+  api_openCamera,
 } from "/src/helpers/communication";
 import state, { IPlayState, clearSelection, handleStopPlay, onPlay, resetPlaybackToStart, togglePlay, initSetPlayRate, resetBaseRate, scrollViewNote } from "/src/state";
 import { IPostMessage } from "/src/utils/native-message";
@@ -116,6 +117,7 @@ export const evaluatingData = reactive({
   tipErjiShow: false, // 评测提示弹窗
   onceErjiPopShow: false, // 是否已经提示过耳机弹窗,重新进入评测页面,重置该状态为false,手动关掉耳机弹窗,改变该状态为true,本次评测都不在提示耳机状态弹窗
   needCheckErjiStatus: true, // 点击评测模式进入评测模块的需要检测耳机状态,通过返回按钮进入评测模块的,不检测耳机状态
+  showOpenCameraPop: false, // 开启摄像头提示弹窗
 });
 
 const sendOffsetTime = async (offsetTime: number) => {
@@ -760,6 +762,18 @@ export default defineComponent({
       }
     };
 
+    // 打开摄像头
+    const openSetCamera = async () => {
+      if (state.setting.camera) {
+        const res = await api_openCamera();
+        // 没有授权
+        if (res?.content?.reson) {
+          state.setting.camera = false;
+          store.set("musicscoresetting", state.setting);
+        }
+      }
+    }
+
     watch(pageVisibility, (value) => {
       if (value == "hidden" && evaluatingData.startBegin) {
         // handleEndBegin();
@@ -786,6 +800,7 @@ export default defineComponent({
       }
     );
     onMounted(() => {
+      openSetCamera();
       resetPlaybackToStart();
       hanlde_record();
       evaluatingData.resultData = {};