浏览代码

日常开发

林旭祥 9 月之前
父节点
当前提交
e25a65ee56

二进制
src/assets/images/test/ready3.png


+ 12 - 5
src/components/FaceWindow/index.vue

@@ -18,7 +18,7 @@
               <img src="@/assets/images/test/profilePicture.png" />
             </div>
             <div class="name" :class="{ 'name2': faceCheckStu.student_id }">
-              {{ faceCheckStu.student_id ? faceCheckStu.name : "请进行人脸识别" }}
+              {{ faceCheckStu.student_id ? faceCheckStu.name : parameter.gesture ? "请举手看摄像头人脸识别" : "请看摄像头进行人脸识别" }}
             </div>
           </div>
         </div>
@@ -28,10 +28,10 @@
 
 </template>
 <script setup lang="ts">
-
+const router = useRouter();
+const route = useRoute();
 const { proxy } = getCurrentInstance() as any;
 
-
 //父值
 const props = defineProps({
   faceCheckStu: {
@@ -44,9 +44,10 @@ const props = defineProps({
 const data = reactive<any>({
   faceState: false,//人脸识别窗口状态
   direction: "",//动画方向
+  parameter: {},//参数
 });
 
-const { faceState, direction } = toRefs(data);
+const { faceState, direction, parameter } = toRefs(data);
 
 //打开
 const open = (data?: any) => {
@@ -63,7 +64,13 @@ const close = () => {
   faceState.value = false;
 };
 
-onMounted(() => {
+onBeforeMount(() => {
+  parameter.value = route.query;
+  if (parameter.value.gesture == 'true') {
+    parameter.value.gesture = true
+  } else {
+    parameter.value.gesture = false
+  }
 })
 
 //暴露给父组件用

+ 163 - 0
src/components/Header/index.vue

@@ -0,0 +1,163 @@
+<template>
+  <div class="close" @click="confirmExit"></div>
+  <div class="toolList">
+    <div class="li">{{ date }}</div>
+    <div class="li btn speck" @click="speckCancel"></div>
+    <div class="li btn screen" @click="getFullScreen"></div>
+  </div>
+  <div class="logo"> <img src="@/assets/images/logo.png">
+    </img>
+    <div class="title"><i></i><span>{{ dic.project[parameter.project] || "" }}</span></div>
+  </div>
+</template>
+<script setup lang="ts">
+import { initSpeech, speckText, speckCancel, chineseNumber } from '@/utils/speech'
+import dataDictionary from "@/utils/dataDictionary"
+const { proxy } = getCurrentInstance() as any;
+const emit = defineEmits(['confirmExit']);
+const router = useRouter();
+const route = useRoute();
+const dic: any = dataDictionary;
+const data = reactive<any>({
+  timerManager: {},//计时器管理
+  parameter: {},//参数
+  date: "",//当前时间
+});
+const { timerManager, parameter, date } = toRefs(data);
+
+/**
+ * 更新时间
+*/
+const setDate = () => {
+  date.value = proxy?.$utils.getDate();
+  setTimeout(setDate, 1000);
+};
+
+/**
+ * 屏幕模式
+*/
+const getFullScreen = () => {
+  date.value = proxy?.$utils.fullScreen();
+};
+
+/**
+ * 屏幕模式
+*/
+const confirmExit = () => {
+  emit('confirmExit', {});
+};
+
+onBeforeMount(() => {
+  setDate();
+  parameter.value = route.query;
+  let project = parameter.value.project;
+  let area = parameter.value.area;
+  parameter.value.examId = `${project}_${area}`; //项目+区
+  if (parameter.value.gesture == 'true') {
+    parameter.value.gesture = true
+  } else {
+    parameter.value.gesture = false
+  }
+  initSpeech();
+})
+</script>
+<style lang="scss" scoped>
+$topPadding: 5.19rem;
+$waiPadding: 6.51rem;
+
+.logo {
+  position: absolute;
+  left: $waiPadding;
+  top: $topPadding;
+  display: flex;
+  align-items: center;
+
+  img {
+    width: 14.563rem;
+  }
+
+  .title {
+    width: auto;
+    padding: 0 1.2rem 0 0.7rem;
+    height: 3rem;
+    line-height: 3rem;
+    border-radius: 1.5rem;
+    color: #ffffff;
+    font-size: 1.7rem;
+    margin-left: 1rem;
+    background: linear-gradient(180deg, #FFB200 0%, #ED7905 72%);
+    box-shadow: inset 0px 1px 0px 1px rgba(255, 255, 255, 0.5);
+    display: flex;
+    align-items: center;
+
+    i {
+      width: 2.5rem;
+      height: 2.1rem;
+      margin-right: 0.8rem;
+      background-image: url("@/assets/images/test/ai.png");
+      background-position: center;
+      background-repeat: no-repeat;
+      background-size: 100% 100%;
+    }
+  }
+}
+
+.close {
+  width: 3.2rem;
+  height: 3.2rem;
+  position: absolute;
+  right: calc($waiPadding - 3.2rem);
+  top: calc($topPadding / 2 - 3.2rem/4);
+  box-sizing: border-box;
+  border: 1px solid #979797;
+  background-image: url("@/assets/images/common/close.png");
+  background-position: center;
+  background-repeat: no-repeat;
+  background-size: 45% 45%;
+  background-color: rgba(216, 216, 216, 0.8);
+  border-radius: 50%;
+  transition: all 0.5s;
+  cursor: pointer;
+
+  &:hover {
+    transform: rotate(180deg);
+    background-color: rgba(216, 216, 216, 1);
+  }
+}
+
+.toolList {
+
+  position: absolute;
+  right: $waiPadding;
+  top: calc($topPadding / 2);
+  color: #00FFE8;
+  font-size: 1.1rem;
+  display: flex;
+
+  .li {
+    margin-right: 3rem;
+  }
+
+  .btn {
+    width: 1.1rem;
+    height: 1.1rem;
+
+    display: block;
+    cursor: pointer;
+  }
+
+  .speck {
+    background-image: url("@/assets/images/common/speck.png");
+    background-position: center;
+    background-repeat: no-repeat;
+    background-size: 100% auto;
+  }
+
+  .screen {
+    background-image: url("@/assets/images/common/screen.png");
+    background-position: center;
+    background-repeat: no-repeat;
+    background-size: 100% auto;
+  }
+}
+</style>

+ 88 - 20
src/components/MultipleItem/index.vue

@@ -1,25 +1,25 @@
 <template>
-  <div>
-    <div>{{ area }}</div>
-    <div><el-avatar :src="faceCheckStu.logo_url || faceCheckStu.face_pic" @click="getChooseStudent" /></div>
-    <div>{{ faceCheckStu.name }}</div>
-    <div>成绩:{{ currentResultObj.count }} {{ unit }}</div>
-    <div>得分:{{ currentResultObj.score }}</div>
-    <div>
-      <div v-if="['jumprope'].includes(project)">中断</div>
-      <div v-else>犯规</div>
-      <div>{{ currentResultObj.back_num }}</div>
+  <div class="list">
+    <div class="ready" v-if="[4, 5].includes(itemNumber) && examState == 41"><img
+        src="@/assets/images/test/ready3.png" /></div>
+
+    <div class="top-left" @click="getChooseStudent">
+      <div class="top-left-center">
+        <div class="pic" :class="{ 'pic2': faceCheckStu.student_id }" v-if="faceCheckStu.student_id"> <img
+            :src="faceCheckStu.face_pic || faceCheckStu.logo_url" /></div>
+        <div class="pic" v-else>
+          <div>{{ area }}</div>
+          <img src="@/assets/images/test/profilePicture.png" />
+        </div>
+        <div class="name" :class="{ 'name2': faceCheckStu.student_id }">
+          {{ faceCheckStu.student_id ? faceCheckStu.name : "虚伪以待" }}
+        </div>
+      </div>
     </div>
-    <div v-if="backReason.length">
-      <div>违规项</div>
-      <div v-for="(item, index) in backReason" :key="index">{{ item }}</div>
+    <div class="score" v-if="resultId && faceCheckStu.student_id">{{ currentResultObj.count || 0 }}</div>
+    <div class="ready" v-if="[2].includes(itemNumber) && examState == 41"><img src="@/assets/images/test/ready3.png" />
     </div>
-    <div>当前状态:({{ examState == 3 ? "初始化完成" : examState == 40 ? "创建测试" : examState == 41 ? "正在人脸识别"
-      :
-      examState ==
-        43 ? "停止人脸识别" : examState == 42 ? "正在测试" : "离线状态" }})</div>
-    <div @click="getChooseStudent" v-if="examState == 41 || (examState == 43 && !faceCheckStu.student_id)">选择学生</div>
-    <div @click="getRetestFace" v-if="examState == 43">重新识别</div>
+    <!-- <div>当前状态:({{ examState == 3 ? "初始化完成" : examState == 40 ? "创建测试" : examState == 41 ? "正在人脸识别" :examState == 43 ? "停止人脸识别" : examState == 42 ? "正在测试" : "离线状态" }})</div> -->
     <ChooseStudent ref="chooseStudentRef" @returnData="returnStudent" />
   </div>
 </template>
@@ -35,6 +35,10 @@ const emit = defineEmits(['returnData']);
 
 //父值
 const props = defineProps({
+  itemNumber: {
+    type: Number,
+    default: ""
+  },
   area: {
     type: String,
     default: ""
@@ -396,6 +400,7 @@ const getAchievement = (data: any) => {
  * 状态抛给父组件
 */
 watch(() => examState.value, (newVal, oldVal) => {
+  console.log("6666", examState.value)
   emit('returnData', { examState: examState.value, area: area });
 }, { deep: true });
 
@@ -421,4 +426,67 @@ defineExpose({
 })
 </script>
 
-<style scoped lang="scss"></style>
+<style scoped lang="scss">
+.top-left {
+  width: 100%;
+  height: 100%;
+  border-radius: 29px;
+  background: radial-gradient(122% 126% at 97% 6%, #35FFC6 0%, #00FFE8 100%);
+  text-align: center;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+  margin-bottom: 3px;
+
+  .top-left-center {
+    .pic {
+      width: 12vw;
+      height: 12vw;
+      border-radius: 50%;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      overflow: hidden;
+      margin: 0 auto 2vh auto;
+
+      img {
+        width: 100%;
+      }
+    }
+
+
+    .pic2 {
+      box-sizing: border-box;
+      border: 0.44rem solid rgba(26, 41, 58, 0.6315);
+    }
+
+    .name {
+      width: 100%;
+      color: #1A293A;
+      font-size: 2.21rem;
+    }
+
+    .name2 {
+      padding: 0 0.3rem;
+      border-radius: 1.1rem;
+      background: radial-gradient(96% 96% at 2% 32%, #FFFFFF 0%, #FCFDFD 54%, #E1E4E7 100%);
+      box-shadow: inset 0px 1px 0px 2px rgba(255, 255, 255, 0.9046), inset 0px 3px 6px 0px rgba(0, 0, 0, 0.0851);
+    }
+  }
+
+}
+
+.score {
+  font-size: 8.5rem;
+  line-height: 12vw;
+  font-family: 'Saira-BlackItalic';
+  background: #ffffff;
+  box-sizing: border-box;
+  border: 10px solid #13ED84;
+  height: 12vw;
+  text-align: center;
+  border-radius: 29px;
+  box-sizing: content-box;
+}
+</style>

+ 1 - 0
src/types/components.d.ts

@@ -19,6 +19,7 @@ declare module 'vue' {
     ElTable: typeof import('element-plus/es')['ElTable']
     ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
     FaceWindow: typeof import('./../components/FaceWindow/index.vue')['default']
+    Header: typeof import('./../components/Header/index.vue')['default']
     MultipleItem: typeof import('./../components/MultipleItem/index.vue')['default']
     OptionTest: typeof import('./../components/OptionTest/index.vue')['default']
     OptionWindow: typeof import('./../components/OptionWindow/index.vue')['default']

+ 5 - 5
src/views/train/index.vue

@@ -5,10 +5,10 @@
     <div class="close" @click="getExit"></div>
     <div class="menu" :class="projectList.length <= 6 ? 'menu1' : 'menu2'">
       <swiper :slides-per-view="6" :modules="[Grid]" :grid="{
-      fill: projectList.length <= 6 ? 'row' : 'column',
-      rows: projectList.length <= 6 ? 1 : 2,
-    }" :space-between="20" :slides-per-group="12">
-        <swiper-slide v-for="(item, index) in  projectList " :key="index" @click="getOption(item)">
+        fill: projectList.length <= 6 ? 'row' : 'column',
+        rows: projectList.length <= 6 ? 1 : 2,
+      }" :space-between="20" :slides-per-group="12">
+        <swiper-slide v-for="(item, index) in projectList " :key="index" @click="getOption(item)">
           <div class="li">
             <div class="pic"><img :src="'/src/assets/images/train/' + item.key + '.png'"></div>
             <div class="name">
@@ -91,7 +91,7 @@ const getExit = () => {
   router.go(-1);
 };
 
-onMounted(() => {
+onBeforeMount(() => {
   getInitExam();
 })
 

+ 200 - 37
src/views/train/multiple.vue

@@ -1,23 +1,30 @@
 <template>
   <div>
-    <div @click="confirmExit">退出</div>
-    <div style="text-align: center;">{{
-      countdownNumFormat
-    }}</div>
-    <div style="display: flex; justify-content: space-between; margin-bottom: 40px;">
-      <MultipleItem :ref="(el: any) => { multipleItemRef(el, index, item.area) }" v-for="(item, index) in testList"
-        :query="parameter" :area="item.area" :key="index" @returnData="returnData" :examState="examState"
-        :needStart="needStart" />
-    </div>
-    <div>
-      <div v-if="needStart">
-        <div @click="getAgain" v-if="examState == 42 || showTestAgain">再测一次</div>
-        <div @click="getOpenOneTestAndStartFace" v-if="examState < 41">1、开始识别</div>
-        <div @click="getStopFace" v-if="examState == 41">2、停止人脸识别</div>
-        <div @click="getStartOneTest" v-if="examState == 43">3、开始测试</div>
+    <Header @confirmExit="confirmExit"></Header>
+    <div class="main">
+      <transition :enter-active-class="proxy?.animate.dialog.enter" :leave-active-class="proxy?.animate.dialog.leave">
+        <div class="time" v-show="[42].includes(examState)">{{
+          time.countdownNum
+        }}</div>
+      </transition>
+
+      <div class="startBtn">{{ examState }} --- {{ time.ready }}</div>
+      <div class="box">
+        <MultipleItem :ref="(el: any) => { multipleItemRef(el, index, item.area) }" v-for="(item, index) in testList"
+          :query="parameter" :area="item.area" :key="index" :itemNumber="index + 1" @returnData="returnData"
+          :examState="examState" :needStart="needStart" />
       </div>
-      <div v-else>
-        <div @click="getStartOneTest">3、开始测试</div>
+
+      <div>
+        <div v-if="needStart">
+          <div @click="getAgain" v-if="examState == 42 || showTestAgain">再测一次</div>
+          <div @click="getOpenOneTestAndStartFace" v-if="examState < 41">1、开始识别</div>
+          <div @click="getStopFace" v-if="examState == 41">2、停止人脸识别</div>
+          <div @click="getStartOneTest" v-if="examState == 43">3、开始测试</div>
+        </div>
+        <div v-else>
+          <div @click="getReady" v-if="examState == 43" class="startBtn">开始测试</div>
+        </div>
       </div>
     </div>
   </div>
@@ -35,6 +42,7 @@ const data = reactive<any>({
   time: {
     testTime: 60,//时长
     countdownNum: 0,//计时
+    ready: 0,//预备
   },
   userInfo: {},//用户信息
   examState: 0,//当前状态
@@ -100,6 +108,8 @@ const getStartOneTest = () => {
     proxy?.$modal.msgWarning("请选择人员!");
     return false;
   }
+  getClearTimer("readyTimer");
+  time.value.ready = 0;
   examState.value = 42;
   for (let i = 0; i < multipleItemRefList.value.length; i++) {
     if (testList.value[i].examState == 41) {
@@ -110,10 +120,9 @@ const getStartOneTest = () => {
       multipleItemRefList.value[i].getStartOneTest()
     }
   }
+  speckText("哨声");
   //显示再测一次按钮
   showTestAgain.value = true;
-  //停止播报;
-  speckCancel()
   //时间为0的为正计时,大于0的为倒计时
   if (time.value.testTime == 0) {
     getCounting("+");
@@ -184,9 +193,10 @@ const cleanData = () => {
 /**
  * 时间转换
 */
-const countdownNumFormat = computed(() => {
-  return proxy?.$utils.timeFormat(time.value.countdownNum);
-});
+// const countdownNumFormat = computed(() => {
+//   return time.value.countdownNum;
+//   //return proxy?.$utils.timeFormat(time.value.countdownNum);
+// });
 
 /**
  * 倒计时
@@ -215,27 +225,55 @@ const returnData = (data: any) => {
   let index = testList.value.findIndex((item: any) => {
     return item.area == data.area;
   });
-  testList.value[index] = Object.assign(testList.value[index], data);
+  let obj = Object.assign(testList.value[index], data);
+  testList.value[index] = JSON.parse(JSON.stringify(obj));
   console.log("testList.value", testList.value)
-  //测试完成后回退状态
-  if (examState.value == 42) {
+
+  if (examState.value == 0) {
     let flag = false;
     //只监听人脸识别的区
-    let newList = testList.value.filter((item: any) => {
-      return item?.faceCheckStu?.student_id;
-    })
+    let newList = testList.value;
     for (let i = 0; i < newList.length; i++) {
-      if (newList[i] && newList[i].faceCheckStu?.student_id && newList[i].examState == 3) {
+      if (newList[i] && newList[i].examState == 3) {
         flag = true;
-      } else {
-        return false;
       }
     }
     if (flag) {
+      console.log("变更状态:", 3)
       examState.value = 3;
     }
   }
 
+  if (examState.value == 3) {
+    let flag = false;
+    //只监听人脸识别的区
+    let newList = testList.value;
+    for (let i = 0; i < newList.length; i++) {
+      if (newList[i] && newList[i].examState == 40) {
+        flag = true;
+      }
+    }
+    if (flag) {
+      console.log("变更状态:", 40)
+      examState.value = 40;
+    }
+  }
+
+  if (examState.value == 40) {
+    let flag = false;
+    //只监听人脸识别的区
+    let newList = testList.value;
+    for (let i = 0; i < newList.length; i++) {
+      if (newList[i] && newList[i].examState == 41) {
+        flag = true;
+      }
+    }
+    if (flag) {
+      console.log("变更状态:", 41)
+      examState.value = 41;
+    }
+  }
+
   if (examState.value == 41) {
     let flag = false;
     //只监听人脸识别的区
@@ -245,32 +283,35 @@ const returnData = (data: any) => {
     for (let i = 0; i < newList.length; i++) {
       if (newList[i] && newList[i].faceCheckStu?.student_id && newList[i].examState == 43) {
         flag = true;
-      } else {
-        return false;
       }
     }
     if (flag) {
+      console.log("变更状态:", 43)
       examState.value = 43;
+      cleanData();
     }
   }
 
-  if (examState.value == 0) {
+  //测试完成后回退状态
+  if (examState.value == 42) {
     let flag = false;
     //只监听人脸识别的区
     let newList = testList.value.filter((item: any) => {
       return item?.faceCheckStu?.student_id;
     })
     for (let i = 0; i < newList.length; i++) {
-      if (newList[i] && newList[i].faceCheckStu?.student_id && newList[i].examState == 41) {
+      if (newList[i] && newList[i].faceCheckStu?.student_id && newList[i].examState == 3) {
         flag = true;
       } else {
         return false;
       }
     }
     if (flag) {
-      examState.value = 41;
+      console.log("变更状态:", 3)
+      examState.value = 3;
     }
   }
+
   //如果全部状态为0就退出
   if (examState.value >= 0) {
     let flag = false;
@@ -290,6 +331,26 @@ const returnData = (data: any) => {
   }
 };
 
+
+/**
+ * 准备开始
+*/
+const getReady = () => {
+  //停止播报;
+  speckCancel()
+  time.value.ready = 5;
+  speckText(time.value.ready);
+  timerManager.value.readyTimer = setInterval(() => {
+    time.value.ready--;
+    if (time.value.ready < 1) {
+      getClearTimer("readyTimer");
+      getStartOneTest();
+    } else {
+      speckText(time.value.ready);
+    }
+  }, 1000);
+};
+
 onMounted(() => {
   parameter.value = route.query;
   let project = parameter.value.project;
@@ -325,6 +386,12 @@ onMounted(() => {
     multipleItemRefList.value[index]?.getMessage(data);
   });
   initSpeech();
+  setTimeout(() => {
+    //30秒还在0状态就算超时
+    if (examState.value == 0) {
+      getExit();
+    }
+  }, 30000);
 })
 
 onUnmounted(() => {
@@ -332,4 +399,100 @@ onUnmounted(() => {
 })
 </script>
 
-<style scoped lang="scss"></style>
+<style scoped lang="scss">
+$topPadding: 5.19rem;
+$waiPadding: 6.51rem;
+
+.main {
+  width: calc(100% - ($waiPadding * 2));
+  height: 78vh;
+  padding-top: 10rem;
+  margin: 0 auto;
+  display: flex;
+  overflow: hidden;
+  flex-direction: column;
+
+  .time {
+    width: 28vh;
+    height: 28vh;
+    line-height: 28vh;
+    border-radius: 50%;
+    color: #FF9402;
+    font-size: 11vh;
+    text-align: center;
+    background-image: url("@/assets/images/test/time.png");
+    background-position: center;
+    background-repeat: no-repeat;
+    background-size: 100% 100%;
+    position: absolute;
+    right: 50%;
+    top: 0;
+    margin-right: -28vh;
+    font-family: 'Saira-BlackItalic';
+  }
+}
+</style>
+<style lang="scss">
+$topPadding: 5.19rem;
+$waiPadding: 6.51rem;
+
+.box {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: center;
+
+  $listWidth: calc((100% - ($waiPadding * 2)) /5);
+  $listMargin: 4vw;
+
+  .list {
+    width: $listWidth;
+    position: relative;
+
+    .ready {
+      position: absolute;
+
+      img {
+        width: 100%;
+      }
+    }
+
+    &:nth-child(2) {
+      margin-left: calc($listWidth + $listMargin);
+      margin-right: calc($listWidth + $listMargin);
+
+
+      .ready {}
+    }
+
+    &:nth-child(4) {
+      margin-left: calc(($listWidth + $listMargin) /2);
+      margin-right: calc(($listWidth + $listMargin) /2);
+
+      .ready {
+
+        top: -100%;
+      }
+    }
+
+    &:nth-child(5) {
+      margin-left: calc(($listWidth + $listMargin) /2);
+      margin-right: calc(($listWidth + $listMargin) /2);
+
+      .ready {
+        top: -100%;
+      }
+    }
+
+
+  }
+}
+
+.startBtn {
+  width: 200px;
+  height: 2rem;
+  font-size: 2rem;
+  border-radius: 15px;
+  background: radial-gradient(159% 126% at 5% 93%, #8EFFA9 0%, #07FFE7 100%);
+  box-shadow: 3px 6px 4px 1px rgba(0, 0, 0, 0.1874), inset 0px 1px 0px 2px rgba(255, 255, 255, 0.5577);
+}
+</style>

+ 5 - 123
src/views/train/test.vue

@@ -1,16 +1,6 @@
 <template>
   <div class="test">
-    <div class="close" @click="confirmExit"></div>
-
-    <div class="toolList">
-      <div class="li">{{ date }}</div>
-      <div class="li btn speck" @click="speckCancel"></div>
-      <div class="li btn screen" @click="getFullScreen"></div>
-    </div>
-    <div class="logo"> <img src="@/assets/images/logo.png">
-      </img>
-      <div class="title"><i></i><span>{{ dic.project[parameter.project] || "" }}</span></div>
-    </div>
+    <Header @confirmExit="confirmExit"></Header>
     <div class="main">
       <div class="main-left">
         <div class="main-left-top">
@@ -669,13 +659,6 @@ const setDate = () => {
   setTimeout(setDate, 1000);
 };
 
-/**
- * 更新时间
-*/
-const getFullScreen = () => {
-  date.value = proxy?.$utils.fullScreen();
-};
-
 /**
  * 准备开始
 */
@@ -683,11 +666,11 @@ const getReady = () => {
   time.value.ready = 5;
   speckText(time.value.ready);
   timerManager.value.readyTimer = setInterval(() => {
-    if (time.value.ready <= 0) {
+    time.value.ready--;
+    if (time.value.ready < 1) {
       getClearTimer("readyTimer");
       getStartOneTest();
     } else {
-      time.value.ready--;
       speckText(time.value.ready);
     }
   }, 1000);
@@ -703,7 +686,7 @@ watch(() => backReason.value.length, (v) => {
   }, 1500)
 }, { immediate: true });
 
-onMounted(() => {
+onBeforeMount(() => {
   setDate();
   parameter.value = route.query;
   let project = parameter.value.project;
@@ -741,107 +724,6 @@ onUnmounted(() => {
 $topPadding: 5.19rem;
 $waiPadding: 6.51rem;
 
-.logo {
-
-
-  position: absolute;
-  left: $waiPadding;
-  top: $topPadding;
-  display: flex;
-  align-items: center;
-
-  img {
-    width: 14.563rem;
-  }
-
-  .title {
-    width: auto;
-    padding: 0 1.2rem 0 0.7rem;
-    height: 3rem;
-    line-height: 3rem;
-    border-radius: 1.5rem;
-    color: #ffffff;
-    font-size: 1.7rem;
-    margin-left: 1rem;
-    background: linear-gradient(180deg, #FFB200 0%, #ED7905 72%);
-    box-shadow: inset 0px 1px 0px 1px rgba(255, 255, 255, 0.5);
-    display: flex;
-    align-items: center;
-
-    i {
-      width: 2.5rem;
-      height: 2.1rem;
-      margin-right: 0.8rem;
-      background-image: url("@/assets/images/test/ai.png");
-      background-position: center;
-      background-repeat: no-repeat;
-      background-size: 100% 100%;
-    }
-  }
-}
-
-.close {
-  width: 3.2rem;
-  height: 3.2rem;
-  position: absolute;
-  right: calc($waiPadding - 3.2rem);
-  top: calc($topPadding / 2 - 3.2rem/4);
-  box-sizing: border-box;
-  border: 1px solid #979797;
-  background-image: url("@/assets/images/common/close.png");
-  background-position: center;
-  background-repeat: no-repeat;
-  background-size: 45% 45%;
-  background-color: rgba(216, 216, 216, 0.8);
-  border-radius: 50%;
-  transition: all 0.5s;
-  cursor: pointer;
-
-  &:hover {
-    transform: rotate(180deg);
-    background-color: rgba(216, 216, 216, 1);
-  }
-}
-
-.toolList {
-
-  position: absolute;
-  right: $waiPadding;
-  top: calc($topPadding / 2);
-  color: #00FFE8;
-  font-size: 1.1rem;
-  display: flex;
-
-  .li {
-    margin-right: 3rem;
-
-
-
-  }
-
-  .btn {
-    width: 1.1rem;
-    height: 1.1rem;
-
-    display: block;
-    cursor: pointer;
-  }
-
-  .speck {
-    background-image: url("@/assets/images/common/speck.png");
-    background-position: center;
-    background-repeat: no-repeat;
-    background-size: 100% auto;
-  }
-
-  .screen {
-    background-image: url("@/assets/images/common/screen.png");
-    background-position: center;
-    background-repeat: no-repeat;
-    background-size: 100% auto;
-  }
-}
-
 .main {
   width: calc(100% - ($waiPadding * 2));
   height: 78vh;
@@ -913,7 +795,7 @@ $waiPadding: 6.51rem;
       }
 
       .top-right {
-        width: 62%;
+        width: 25vw;
         height: 100%;
         border-radius: 29px;
         opacity: 1;