|
@@ -5,28 +5,46 @@
|
|
|
<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>
|
|
|
+ }}</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>
|
|
|
- <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 class="testBox" :class="{ 'overlap': ![0, 3, 40, 41].includes(examState) }">
|
|
|
+ <div class="row" v-for="(items, indexs) in testListArr " :key="indexs">
|
|
|
+ <MultipleItem :ref="(el: any) => { multipleItemRef(el, item.itemNumber, item.area) }"
|
|
|
+ v-for="(item, index) in items" :query="parameter" :area="item.area" :key="index"
|
|
|
+ :itemNumber="item.itemNumber" @returnData="returnData" :examState="examState" :needStart="needStart" />
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div class="footerBtn">
|
|
|
+ <template v-if="needStart">
|
|
|
+ <div @click="getAgain" v-if="examState == 42 || showTestAgain">再测一次</div>
|
|
|
+ <div @click="getOpenOneTestAndStartFace" v-if="examState < 41">开始识别</div>
|
|
|
+ <div @click="getStopFace" v-if="examState == 41">停止人脸识别</div>
|
|
|
+ <div @click="getStartOneTest" v-if="examState == 43">开始测试</div>
|
|
|
+ </template>
|
|
|
+ <template v-else>
|
|
|
+ <div @click="getReady" v-if="examState == 43" class="startBtn">开始测试</div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ <!--倒计时开始-->
|
|
|
+ <div>
|
|
|
+ <transition :enter-active-class="proxy?.animate.mask.enter" :leave-active-class="proxy?.animate.mask.leave">
|
|
|
+ <div class="mask" v-show="examState == 43 && time.ready"></div>
|
|
|
+ </transition>
|
|
|
+ <transition :enter-active-class="proxy?.animate.face.enter" :leave-active-class="proxy?.animate.face.leave2">
|
|
|
+ <div class="confirmDiaBg" v-show="examState == 43 && time.ready">
|
|
|
+ <div class="confirmDiaWindow">
|
|
|
+ <div class="confirmDiaWindow-con">
|
|
|
+ <div class="readyBox">
|
|
|
+ <div class="value">{{ time.ready }}</div>
|
|
|
+ <div class="lable">倒计时</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </transition>
|
|
|
+ </div>
|
|
|
+ <!--倒计时结束-->
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -57,7 +75,7 @@ const { timerManager, parameter, time, userInfo, examState, needStart, showTestA
|
|
|
* 创建组件实例
|
|
|
*/
|
|
|
const multipleItemRef = (el: any, index: number, area: any) => {
|
|
|
- multipleItemRefList.value[index] = el;
|
|
|
+ multipleItemRefList.value[index - 1] = el;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -338,6 +356,12 @@ const returnData = (data: any) => {
|
|
|
const getReady = () => {
|
|
|
//停止播报;
|
|
|
speckCancel()
|
|
|
+ //正在识别的停止识别
|
|
|
+ for (let i = 0; i < multipleItemRefList.value.length; i++) {
|
|
|
+ if (testList.value[i].examState == 41) {
|
|
|
+ multipleItemRefList.value[i].getStopFace()
|
|
|
+ }
|
|
|
+ }
|
|
|
time.value.ready = 5;
|
|
|
speckText(time.value.ready);
|
|
|
timerManager.value.readyTimer = setInterval(() => {
|
|
@@ -351,6 +375,24 @@ const getReady = () => {
|
|
|
}, 1000);
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * 将测试列表转为多行
|
|
|
+*/
|
|
|
+const testListArr = computed(() => {
|
|
|
+ let list: any = [];
|
|
|
+ let num = 3;
|
|
|
+ let myLength = Math.ceil(testList.value.length / num);
|
|
|
+ for (let i = 0; i < myLength; i++) {
|
|
|
+ list[i] = [];
|
|
|
+ for (let j = 0; j < testList.value.length; j++) {
|
|
|
+ if (j >= i * num && j < (i + 1) * num) {
|
|
|
+ list[i].push(testList.value[j])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+});
|
|
|
+
|
|
|
onMounted(() => {
|
|
|
parameter.value = route.query;
|
|
|
let project = parameter.value.project;
|
|
@@ -367,9 +409,10 @@ onMounted(() => {
|
|
|
} else {
|
|
|
parameter.value.gesture = false
|
|
|
}
|
|
|
- testList.value = parameter.value.area.split(',').map((item: any) => {
|
|
|
+ testList.value = parameter.value.area.split(',').map((item: any, index: number) => {
|
|
|
let obj = {
|
|
|
- area: item
|
|
|
+ area: item,
|
|
|
+ itemNumber: index + 1
|
|
|
}
|
|
|
return obj;
|
|
|
});
|
|
@@ -387,11 +430,11 @@ onMounted(() => {
|
|
|
});
|
|
|
initSpeech();
|
|
|
setTimeout(() => {
|
|
|
- //30秒还在0状态就算超时
|
|
|
+ //10秒还在0状态就算超时
|
|
|
if (examState.value == 0) {
|
|
|
getExit();
|
|
|
}
|
|
|
- }, 30000);
|
|
|
+ }, 10000);
|
|
|
})
|
|
|
|
|
|
onUnmounted(() => {
|
|
@@ -405,7 +448,7 @@ $waiPadding: 6.51rem;
|
|
|
|
|
|
.main {
|
|
|
width: calc(100% - ($waiPadding * 2));
|
|
|
- height: 78vh;
|
|
|
+ height: 76vh;
|
|
|
padding-top: 10rem;
|
|
|
margin: 0 auto;
|
|
|
display: flex;
|
|
@@ -427,72 +470,183 @@ $waiPadding: 6.51rem;
|
|
|
position: absolute;
|
|
|
right: 50%;
|
|
|
top: 0;
|
|
|
- margin-right: -28vh;
|
|
|
+ margin-right: -24vw;
|
|
|
font-family: 'Saira-BlackItalic';
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.footerBtn {
|
|
|
+ width: 100%;
|
|
|
+ padding: 0 calc(13.02rem /2);
|
|
|
+ box-sizing: border-box;
|
|
|
+ position: fixed;
|
|
|
+ bottom: 3vh;
|
|
|
+ display: flex;
|
|
|
+ justify-content: end;
|
|
|
+}
|
|
|
</style>
|
|
|
<style lang="scss">
|
|
|
$topPadding: 5.19rem;
|
|
|
$waiPadding: 6.51rem;
|
|
|
|
|
|
-.box {
|
|
|
+.testBox {
|
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
|
- justify-content: center;
|
|
|
+ align-items: center;
|
|
|
|
|
|
- $listWidth: calc((100% - ($waiPadding * 2)) /5);
|
|
|
- $listMargin: 4vw;
|
|
|
|
|
|
- .list {
|
|
|
- width: $listWidth;
|
|
|
- position: relative;
|
|
|
|
|
|
- .ready {
|
|
|
- position: absolute;
|
|
|
+ .row {
|
|
|
+ width: 100%;
|
|
|
+ height: 35vh;
|
|
|
+ display: flex;
|
|
|
+ $listMargin: 10vw;
|
|
|
+ $listWidth: calc((100% - $listMargin) / 5);
|
|
|
|
|
|
- img {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- &:nth-child(2) {
|
|
|
- margin-left: calc($listWidth + $listMargin);
|
|
|
- margin-right: calc($listWidth + $listMargin);
|
|
|
+ .list {
|
|
|
+ width: $listWidth;
|
|
|
+ position: relative;
|
|
|
|
|
|
+ .ready {
|
|
|
+ position: absolute;
|
|
|
|
|
|
- .ready {}
|
|
|
+ img {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- &:nth-child(4) {
|
|
|
- margin-left: calc(($listWidth + $listMargin) /2);
|
|
|
- margin-right: calc(($listWidth + $listMargin) /2);
|
|
|
+ &:nth-child(1) {
|
|
|
+ justify-content: space-between;
|
|
|
+ }
|
|
|
|
|
|
- .ready {
|
|
|
+ &:nth-child(2) {
|
|
|
+ justify-content: space-evenly;
|
|
|
|
|
|
- top: -100%;
|
|
|
+ .list {
|
|
|
+ margin-left: calc($listMargin/4);
|
|
|
+ margin-right: calc($listMargin/4);
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- &:nth-child(5) {
|
|
|
- margin-left: calc(($listWidth + $listMargin) /2);
|
|
|
- margin-right: calc(($listWidth + $listMargin) /2);
|
|
|
+}
|
|
|
|
|
|
- .ready {
|
|
|
- top: -100%;
|
|
|
- }
|
|
|
- }
|
|
|
+.overlap {
|
|
|
+ .row {
|
|
|
+ transition: all 0.5s;
|
|
|
|
|
|
+ &:nth-child(1) {
|
|
|
+ margin-top: 5vh;
|
|
|
+ }
|
|
|
|
|
|
+ &:nth-child(2) {
|
|
|
+ margin-top: -21vh;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.startBtn {
|
|
|
- width: 200px;
|
|
|
- height: 2rem;
|
|
|
- font-size: 2rem;
|
|
|
- border-radius: 15px;
|
|
|
+ width: 14.6vw;
|
|
|
+ height: 6.1vh;
|
|
|
+ line-height: 6.1vh;
|
|
|
+ font-size: 3vh;
|
|
|
+ color: #1A293A;
|
|
|
+ text-align: center;
|
|
|
+ border-radius: 1vh;
|
|
|
+ cursor: pointer;
|
|
|
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);
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ background: #8EFFA9;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.mask {
|
|
|
+ position: fixed;
|
|
|
+ height: 100vh;
|
|
|
+ width: 100vw;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ background: rgba(0, 0, 0, 0.3);
|
|
|
+ z-index: 998;
|
|
|
+}
|
|
|
+
|
|
|
+.confirmDiaBg {
|
|
|
+ width: 100%;
|
|
|
+ height: 100vh;
|
|
|
+ position: fixed;
|
|
|
+ left: 0;
|
|
|
+ top: 0;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ z-index: 999;
|
|
|
+
|
|
|
+ .confirmDiaWindow {
|
|
|
+ width: 23.5%;
|
|
|
+ height: 43.4%;
|
|
|
+ border-radius: 29px;
|
|
|
+ opacity: 1;
|
|
|
+ background: radial-gradient(122% 126% at 97% 6%, #35FFC6 0%, #00FFE8 100%);
|
|
|
+ text-align: center;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ position: fixed;
|
|
|
+
|
|
|
+ .confirmDiaWindow-con {
|
|
|
+ .pic {
|
|
|
+ width: 22.3vh;
|
|
|
+ height: 22.3vh;
|
|
|
+ border-radius: 50%;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ overflow: hidden;
|
|
|
+ position: relative;
|
|
|
+ margin: 0 auto 2vh auto;
|
|
|
+
|
|
|
+ .shine {
|
|
|
+ position: absolute;
|
|
|
+ left: -5vh;
|
|
|
+ top: 0;
|
|
|
+ width: 5vh;
|
|
|
+ height: 22.3vh;
|
|
|
+ animation: shineani 3s infinite;
|
|
|
+ -webkit-animation: shineani 3s infinite;
|
|
|
+ z-index: 1;
|
|
|
+
|
|
|
+ img {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|