From ca5b635736db32c61ee6e2ff319cff54c824a98d Mon Sep 17 00:00:00 2001
From: ZhangXianQiang <1135831638@qq.com>
Date: 星期一, 01 七月 2024 11:12:23 +0800
Subject: [PATCH] fix:认证问题

---
 src/views/exam/components/answer-main/answer-fill/index.vue   |  108 ++++++++++++++++++++++++++++++++++++
 src/api/index.js                                              |   25 +++++---
 src/views/exam/components/answer-main/answer-single/index.vue |    5 +
 src/views/exam/index.vue                                      |    6 +
 4 files changed, 131 insertions(+), 13 deletions(-)

diff --git a/src/api/index.js b/src/api/index.js
index 6f72f12..8f6294c 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -1,7 +1,5 @@
 import axios from "axios";
-import { useRoute } from "vue-router";
-
-const route = useRoute();
+import { ElMessage } from 'element-plus'
 
 axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
 
@@ -23,11 +21,11 @@
       break;
     case 401:
       console.log("鏈嶅姟鍣ㄨ璇佸け璐�");
-      route.replace('/login');
+      location.href = '/login';
+      
       break;
     case 403:
       console.log("鏈嶅姟鍣ㄦ嫆缁濊闂�");
-      route.replace('/login');
       break;
     case 404:
       console.log("鍦板潃閿欒");
@@ -39,9 +37,14 @@
       console.log("鏈嶅姟鍣ㄦ棤鍝嶅簲");
       break;
     default:
-      console.log(info);
+      console.log("鍏朵粬閿欒");
       break;
   }
+  ElMessage.error({
+    message: info.message || '绯荤粺閿欒锛岃绋嶅悗閲嶈瘯',
+    grouping: true,
+  });
+  return Promise.reject(info);
 };
 
 
@@ -65,13 +68,15 @@
 // response鎷︽埅鍣�
 service.interceptors.response.use(
   (response) => {
-    if (response.status === 200 && response.data.code === 1) return Promise.resolve(response.data);
-    else return Promise.reject(response.data);
+    if (response.status === 200 && response.data.code === 1){
+      return Promise.resolve(response.data);
+    } else {
+      errorHandle(response.data.code, response.data);
+    }
   },
   (error) => {
     const { response } = error;
-    errorHandle(response.status, response.info);
-    return Promise.reject(error);
+    errorHandle(response.status, response);
   },
 );
 
diff --git a/src/views/exam/components/answer-main/answer-fill/index.vue b/src/views/exam/components/answer-main/answer-fill/index.vue
new file mode 100644
index 0000000..0712750
--- /dev/null
+++ b/src/views/exam/components/answer-main/answer-fill/index.vue
@@ -0,0 +1,108 @@
+<template>
+  <div class="answer-container w-full h-full">
+    <el-scrollbar>
+      <ExamInfo class="mb-5" :questionIndex="currentIndex" :activeQuestion="activeQuestion"></ExamInfo>
+
+      <div class="answer-content">
+        <div class="answer-item flex" v-for="item, index in activeQuestion.questionItemList" @click="answerClick(item)"
+          :class="answerState(item)">
+          <div class="answer-icon flex flex-col justify-center items-center flex-shrink-0">{{ item.prefix }}</div>
+          <div class="answer-text text-gray-700">{{ item.content }}</div>
+        </div>
+      </div>
+
+    </el-scrollbar>
+  </div>
+</template>
+
+<script setup>
+import { ref } from 'vue';
+import { storeToRefs } from 'pinia';
+import ExamInfo from '@/components/ExamInfo/index.vue';
+import { useExamStore } from '@/store/index.js';
+const examStore = useExamStore();
+
+const { currentType, currentIndex } = storeToRefs(examStore);
+
+const activeQuestion = ref(examStore.getActiveQuestion);
+
+const answerClick = (item) => {
+  if (item) {
+    if (item.isActive) {
+      item.isActive = !item.isActive;
+    } else {
+      resetAnswer();
+      item.isActive = true;
+    }
+    const answerList = filterAnswer();
+    let temp = '';
+    if(answerList) {
+      temp = answerList.prefix;
+    }
+    examStore.setQuestionAnswer(currentType.value, currentIndex.value, temp);
+  }
+};
+
+const answerState = (item) => {
+  return {
+    active: item.isActive
+  };
+};
+
+const resetAnswer = () => {
+  activeQuestion.value.questionItemList.forEach(item => item.isActive = false);
+};
+
+const filterAnswer = () => {
+  return activeQuestion.value.questionItemList.find(item => item.isActive);
+}
+
+
+</script>
+
+<style lang="scss" scoped>
+.answer-item {
+  max-width: 500px;
+  border-radius: 10px;
+  border: 1px solid #DCDFE6;
+  overflow: hidden;
+  margin-bottom: 20px;
+  cursor: pointer;
+
+  &:last-of-type {
+    margin-bottom: 0;
+  }
+
+  &:hover {
+    border-color: #3680fa;
+
+    .answer-icon {
+      color: #3680fa;
+      border-color: #3680fa;
+    }
+  }
+
+
+  .answer-icon {
+    width: 50px;
+    background-color: #F0F2F5;
+    border-right: 1px solid #ffffff;
+  }
+
+  .answer-text {
+    min-height: 50px;
+    padding: 15px 0;
+    margin: 0 10px;
+  }
+}
+
+.active {
+  border-color: #409EFF !important;
+
+  .answer-icon {
+    color: #ffffff !important;
+    border-color: #409EFF !important;
+    background-color: #409EFF !important;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/exam/components/answer-main/answer-single/index.vue b/src/views/exam/components/answer-main/answer-single/index.vue
index 0712750..8563967 100644
--- a/src/views/exam/components/answer-main/answer-single/index.vue
+++ b/src/views/exam/components/answer-main/answer-single/index.vue
@@ -44,8 +44,11 @@
 };
 
 const answerState = (item) => {
+  if(activeQuestion.value.answer === item.prefix) {
+    item.isActive = true;
+  }
   return {
-    active: item.isActive
+    active: item.isActive || item.prefix === activeQuestion.value.answer
   };
 };
 
diff --git a/src/views/exam/index.vue b/src/views/exam/index.vue
index 871b924..307eea2 100644
--- a/src/views/exam/index.vue
+++ b/src/views/exam/index.vue
@@ -51,7 +51,7 @@
             <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 }}鍒�)
+                  examStore.getActiveQuestion.questionScore }}鍒�)
                 </div>
               </div>
 
@@ -141,6 +141,7 @@
 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 AnswerFill from './components/answer-main/answer-fill/index.vue';
 
 import { useExamStore } from '@/store/index.js';
 import { useRouter } from 'vue-router';
@@ -156,7 +157,8 @@
 const typeComponent = {
   1: AnswerSingle,
   2: AnswerMultiple,
-  6: AnswerAudio,
+  4: AnswerFill,
+  6: AnswerAudio
 };
 
 const quitDialog = ref(false);

--
Gitblit v1.8.0