mental-health-student/src/views/Exam/index.vue

277 lines
6.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-container class="container-exam">
<el-header class="header">
<img src="@/assets/images/fenxiang.png" alt="">
<span class="desc">本平台提供专业的自评量表请仔细地阅读每一条根据近期内您的实际感受点击适合您的选项请注意不要漏题答题完成后您将获得一份专业的分析报告</span>
</el-header>
<div class="content">
<el-container>
<el-aside class="aside">
<el-card class="card">
<div class="scale-title">
{{ scaleName }}
</div>
<div class="subject-content">
<div class="subject-title">{{ currentQuestion.questionContent || '' }}</div>
<el-radio-group v-model="currentQuestion.answerId" @change="handleChange">
<el-radio size="large" border :value="item.answerId" v-for="item in currentQuestion.answerList"
:key="item.answerId">
{{ item.answerOption }}
</el-radio>
</el-radio-group>
</div>
<div class="subject-btn">
<el-button round size="large" @click="previous" :disabled="preDisable" style="border: 1px solid #1AB087;">
<el-icon class="el-icon--left">
<ArrowLeft />
</el-icon>上一题
</el-button>
<el-button round v-if="finishNum" size="large" @click="submit" style="border: 1px solid #1AB087;">
提交<el-icon class="el-icon--right">
<ArrowRight />
</el-icon>
</el-button>
<el-button round v-else size="large" @click="next" style="border: 1px solid #1AB087;">
下一题<el-icon class="el-icon--right">
<ArrowRight />
</el-icon>
</el-button>
</div>
</el-card>
</el-aside>
<el-main class="main">
<el-card class="aside-card">
<template #header>
<div class="card-header">
<span>答题卡</span>
</div>
</template>
<div class="answer">
<div v-for="(item, index) in questionList" :key="item">
<el-button circle type="success" v-if="item.answerId" @click="handleAnswer(index)">
{{ index + 1 }}
</el-button>
<el-button v-else circle @click="handleAnswer(index)">{{ index + 1 }}</el-button>
</div>
</div>
<template #footer>
<el-countdown title="剩余时间" :value="timeLeft" value-style="color: #F56C6C;" />
</template>
</el-card>
</el-main>
</el-container>
</div>
</el-container>
</template>
<script setup>
import { ref, computed, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { getAnswerAPI, addAnswerAPI } from '@/apis/user'
const route = useRoute()
const scaleId = route.query.scaleId
const scaleName = route.query.scaleName
const scaleTime = route.query.scaleTime
const recordId = route.query.recordId
const router = useRouter()
const timeLeft = ref(Date.now() + 1000 * 60 * scaleTime)
const questionList = ref([])
const questionNum = ref(0)
const currentQuestion = ref({})
const questionTotal = ref(0)
async function getAnswer() {
const res = await getAnswerAPI(scaleId)
questionList.value = res.data
currentQuestion.value = questionList.value[0]
questionTotal.value = questionList.value.length
}
const preDisable = computed(() => {
return questionNum.value === 0
})
function previous() {
questionNum.value--
if (questionNum.value <= 0) {
questionNum.value = 0
}
currentQuestion.value = questionList.value[questionNum.value]
}
const nextDisable = computed(() => {
return questionNum.value === questionTotal.value
})
const finishNum = computed(() => {
const data = questionList.value.filter(item => item.answerId != null)
return data.length == questionTotal.value
})
function next() {
questionNum.value++
if (questionNum.value >= questionList.value.length) {
questionNum.value = questionList.value.length - 1
}
currentQuestion.value = questionList.value[questionNum.value]
}
function handleAnswer(index) {
questionNum.value = index
currentQuestion.value = questionList.value[questionNum.value]
}
function handleChange() {
setTimeout(() => {
next()
}, 500)
}
onMounted(() => {
getAnswer()
})
async function submit() {
const data = questionList.value.map(item => {
return {
recordId: recordId, answerId: item.answerId, questionId: item.questionId
}
})
const res = await addAnswerAPI({ scaleId, answerList: data })
if (res.code == 200) {
ElMessage({
message: '提交成功',
type: 'success'
})
if (res.data) {
router.push({ path: '/examDetail', query: { data: JSON.stringify(res.data) } })
} else {
router.replace({ path: '/' })
}
} else {
ElMessage({
message: res.msg,
type: 'error'
})
}
}
</script>
<style lang="scss" scoped>
.container-exam {
height: 100vh;
.header {
height: 60px;
color: #41515C;
background-color: #FFF;
text-align: center;
font-size: 18px;
padding-top: 15px;
.desc {
margin-left: 20px;
}
}
.content {
width: 1200px;
margin: 0 auto;
.aside {
padding-top: 20px;
width: 800px;
height: calc(100vh - 90px);
margin: 0 auto;
.card {
height: 100%;
.scale-title {
text-align: center;
font-size: 35px;
font-weight: bold;
line-height: 60px;
}
.subject-btn {
display: flex;
justify-content: space-around;
}
.submit-footer {
text-align: center;
.submit-btn {
width: 200px;
}
}
.subject-content {
margin-left: 50px;
margin-top: 30px;
height: 450px;
max-height: 450px;
.subject-title {
text-align: center;
color: #F56C6C;
font-size: 30px;
font-weight: bold;
}
::v-deep(.el-radio-group) {
display: block;
}
::v-deep(.el-radio) {
display: block;
margin: 30px;
font-size: 25px;
}
::v-deep(.el-radio__label) {
font-size: 20px;
font-weight: bold;
padding-left: 20px;
}
}
}
}
.main {
width: 400px;
padding-top: 20px;
margin: 0 auto;
.aside-card {
width: 100%;
margin: 0 auto;
.answer {
display: grid;
grid-template-columns: repeat(7, 1fr);
.el-button {
margin: 7px;
}
}
}
}
}
}
</style>