src/api/index.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exam/components/answer-main/answer-fill/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exam/components/answer-main/answer-single/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exam/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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); }, ); src/views/exam/components/answer-main/answer-fill/index.vue
New file @@ -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> 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 }; }; 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);