From f763e0bc88efa373ea0cedfdb1abbdc85046097b Mon Sep 17 00:00:00 2001
From: ZhangXianQiang <1135831638@qq.com>
Date: 星期三, 19 六月 2024 15:25:25 +0800
Subject: [PATCH] feat:考试音频题
---
src/views/exam/index.vue | 236 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 229 insertions(+), 7 deletions(-)
diff --git a/src/views/exam/index.vue b/src/views/exam/index.vue
index cdc820e..090e41e 100644
--- a/src/views/exam/index.vue
+++ b/src/views/exam/index.vue
@@ -1,22 +1,215 @@
<template>
- <div class="exam-container w-screen h-screen relative overflow-hidden">
- <div class="top-bg bg-blue-400"></div>
- <div class="exam-content flex flex-col ">
- <div class="exam-header">
- <div class="title-container">
- 娴嬭瘯娴嬭瘯娴嬭瘯
+ <div class="exam-container w-screen h-screen bg-slate-50 relative overflow-hidden">
+ <div class="top-bg bg-blue-500"></div>
+ <div class="exam-content">
+ <div class="exam-wrapper container mx-auto h-full flex flex-col">
+ <div class="exam-header flex items-center mt-12 mb-10">
+ <div class="title-container text-3xl font-semibold text-white mr-8">
+ 娴嬭瘯娴嬭瘯娴嬭瘯
+ </div>
+ <AnswerTime></AnswerTime>
+
+ <div class="return-container grow flex justify-end">
+ <el-button type="danger" size="large" circle @click="closeClick">
+ <template #icon>
+ <el-icon :size="20">
+ <Close />
+ </el-icon>
+ </template>
+ </el-button>
+ </div>
+ </div>
+
+ <div class="exam-main grow flex justify-between">
+ <!-- 绛旈鍗″尯 -->
+ <div class="answer-wrapper answer-left mr-8 shadow-xl p-4 box-border">
+ <div class="wrapper h-full flex flex-col items-center">
+ <div class="title-wrapper w-full flex justify-between items-center mb-5">
+ <div class="title text-xl font-semibold ">绛旈鍗�</div>
+ <AnswerTag></AnswerTag>
+ </div>
+
+ <div class="progress-wrapper w-full">
+ <AnswerProgress></AnswerProgress>
+ </div>
+
+ <div class="sheet-wrapper w-full grow relative my-5">
+ <div class="sheet-content absolute top-0 bottom-0 w-full">
+ <AnswerSheet></AnswerSheet>
+ </div>
+ </div>
+
+ <div class="submit-wrapper">
+ <el-button type="primary" class="submit-button">鎻愪氦璇曞嵎</el-button>
+ </div>
+
+ </div>
+ </div>
+
+ <!-- 绛旈鍐呭鍖� -->
+ <div class="answer-wrapper answer-right grow shadow-xl p-4">
+ <div class="wrapper h-full flex flex-col">
+ <div class="title-wrapper w-full flex mb-5">
+ <div class="title text-xl font-semibold ">{{ examType[currentType] }} ({{ examStore.getActiveQuestion.score}}鍒�)</div>
+ </div>
+
+ <div class="main-wrapper w-full grow relative my-5">
+ <div class="main-content absolute top-0 bottom-0 w-full">
+ <Transition appear name="fade-transform" mode="out-in">
+ <component :is="typeComponent[currentType]" :key="currentIndex"></component>
+ </Transition>
+ </div>
+ </div>
+
+ <div class="tool-wrapper flex justify-end">
+ <div class="button-container flex items-center">
+ <div class="button-item">
+ <el-button class="tool-button" @click="prevQuestion">涓婁竴棰�</el-button>
+ </div>
+ <div class="button-item">
+ <el-button class="tool-button" type="primary" @click="nextQuestion">涓嬩竴棰�</el-button>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
</div>
</div>
- <div class="exam-main flex-1"></div>
</div>
+
+
+ <!-- 閫�鍑鸿�冭瘯鎻愮ず寮圭獥 -->
+ <el-dialog v-model="dialogVisible" title="娉ㄦ剰" width="500">
+ <div class="dialog-container">
+ <p>璇风‘璁ゆ槸鍚﹂��鍑哄綋鍓嶈�冭瘯</p>
+ <p>褰撳墠鑰冭瘯璇曞嵎浼氳嚜鍔ㄦ彁浜�,鍚庣画灏嗘棤娉曠户缁綔绛�</p>
+ </div>
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+ <el-button type="primary" @click="confirmCancel">
+ 纭畾
+ </el-button>
+ </div>
+ </template>
+ </el-dialog>
</div>
</template>
<script setup>
+import { ref, watchEffect } from 'vue';
+import { storeToRefs } from 'pinia';
+import { Close } from '@element-plus/icons-vue';
+import AnswerTag from './components/answer-tag/index.vue';
+import AnswerProgress from './components/answer-progress/index.vue';
+import AnswerSheet from './components/answer-sheet/index.vue';
+import AnswerTime from './components/answer-time/index.vue';
+import AnswerSingle from './components/answer-main/answer-single/index.vue';
+import AnswerMultiple from './components/answer-main/answer-multiple/index.vue';
+import AnswerAudio from './components/answer-main/answer-audio/index.vue';
+
+import { useExamStore } from '@/store/index.js';
+import { useRouter } from 'vue-router';
+
+const router = useRouter();
+
+const examStore = useExamStore();
+const { currentType, currentIndex, examDetail, examType } = storeToRefs(examStore);
+
+const typeComponent = {
+ 1: AnswerSingle,
+ 2: AnswerMultiple,
+ 3: AnswerAudio,
+};
+
+const dialogVisible = ref(false);
+
+const prevQuestion = () => {
+ currentIndex.value--;
+ checkList();
+};
+
+const nextQuestion = () => {
+ currentIndex.value++;
+ checkList();
+};
+
+const checkList = () => {
+ let tempIndex = 0;
+ const typeQuestion = examDetail.value.find((typeItem, index) => {
+ if (typeItem.questionType === currentType.value) {
+ tempIndex = index;
+ return typeItem;
+ } else {
+ return false;
+ }
+ });
+ if (typeQuestion) {
+ if (currentIndex.value >= typeQuestion.questionList.length) {
+ tempIndex++;
+ if (examDetail.value[tempIndex]) {
+ currentType.value = examDetail.value[tempIndex].questionType;
+ currentIndex.value = 0;
+ } else {
+ currentType.value = typeQuestion.questionType;
+ currentIndex.value = typeQuestion.questionList.length - 1;
+ }
+
+ } else if (currentIndex.value < 0) {
+ tempIndex--;
+ if (examDetail.value[tempIndex]) {
+ currentType.value = examDetail.value[tempIndex].questionType;
+ currentIndex.value = examDetail.value[tempIndex].questionList.length - 1;
+ } else {
+ currentType.value = typeQuestion.questionType;
+ currentIndex.value = 0;
+ }
+ }
+ // findQuestion(currentType.value, currentIndex.value);
+ }
+
+};
+
+const findQuestion = (type, index) => {
+ const typeQuestion = examDetail.value.find(typeItem => typeItem.questionType === type);
+ if (typeQuestion) {
+ const question = typeQuestion.questionList[index];
+ if (question) {
+ examStore.setActiveQuestion(question);
+ }
+ }
+};
+
+const closeClick = () => {
+ dialogVisible.value = true;
+};
+
+const confirmCancel = () => {
+ dialogVisible.value = false;
+ router.back();
+};
+
+watchEffect(() => {
+ let progress = 0;
+ examDetail.value.forEach(item => {
+ item.questionList.forEach(question => {
+ if (question.correct) {
+ progress += 1;
+ }
+ });
+ });
+ examStore.setProgress(progress);
+});
</script>
<style lang="scss" scoped>
+@media (min-width: 1836px) {
+ .container {
+ max-width: 1724px;
+ }
+}
+
.top-bg {
width: 130%;
height: 200px;
@@ -26,8 +219,37 @@
left: 50%;
transform: translateX(-50%);
}
+
.exam-content {
width: 100%;
height: 100%;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+}
+
+.exam-header {
+ width: 100%;
+}
+
+.answer-wrapper {
+ background-color: #fff;
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+}
+
+.answer-left {
+ width: 340px;
+}
+
+.submit-button,
+.tool-button {
+ width: 160px;
+ height: 40px;
+}
+
+.tool-button {
+ margin: 0 20px;
}
</style>
\ No newline at end of file
--
Gitblit v1.8.0