ZhangXianQiang
2024-06-13 c6f680f1c6ef9fa990c654633767b5b3ad4b0aff
src/views/exam/index.vue
@@ -4,8 +4,19 @@
    <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">
          <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>
@@ -44,37 +55,133 @@
              <div class="main-wrapper w-full grow relative my-5">
                <div class="main-content absolute top-0 bottom-0 w-full">
                  <AnswerSingle></AnswerSingle>
                  <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">上一题</el-button>
                    <el-button class="tool-button" @click="prevQuestion">上一题</el-button>
                  </div>
                  <div class="button-item">
                    <el-button class="tool-button" type="primary">下一题</el-button>
                    <el-button class="tool-button" type="primary" @click="nextQuestion">下一题</el-button>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </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, toRefs } 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 AnswerSingle from './components/answer-main/answer-single/index.vue';
import AnswerMultiple from './components/answer-main/answer-multiple/index.vue';
import AnswerTime from './components/answer-time/index.vue';
import { useExamStore } from '@/store/index.js';
const examStore = useExamStore();
const { currentType, currentIndex, activeQuestion, examDetail } = storeToRefs(examStore);
const typeComponent = {
  1: AnswerSingle,
  2: AnswerMultiple,
};
examStore.setActiveQuestion(examDetail.value[0].questionList[0]);
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;
};
</script>
<style lang="scss" scoped>
@@ -122,6 +229,7 @@
  width: 160px;
  height: 40px;
}
.tool-button {
  margin: 0 20px;
}