vue+vant制作一个做题页面(包含选择题,判断题,填空题,简答题)

  • 作者简介:一名后端开发人员,每天分享后端开发以及人工智能相关技术,行业前沿信息,面试宝典。
  • 座右铭:未来是不可确定的,慢慢来是最快的。
  • 个人主页极客李华-CSDN博客
  • 合作方式:私聊+
  • 这个专栏内容:BAT等大厂常见后端java开发面试题详细讲解,更新数目100道常见大厂java后端开发面试题。
  • 我的CSDN社区:https://bbs.csdn.net/forums/99eb3042821a4432868bb5bfc4d513a8
  • 微信公众号,抖音,b站等平台统一叫做:极客李华,加入微信公众号领取各种编程资料,加入抖音,b站学习面试技巧,职业规划

vue+vant制作一个做题页面(包含选择题,判断题,填空题,简答题)

本文讲解如何结合vue+vant制作一个做题页面里面包含选择题,判断题,填空题,简答题,还包含计算成绩的功能。

如果大家觉得有用的话,可以关注我下面的微信公众号,极客李华,我会在里面更新更多行业资讯,企业面试内容,编程资源,如何写出可以让大厂面试官眼前一亮的简历等内容,让大家更好学习编程,我的抖音,B站也叫极客李华。大家喜欢也可以关注一下

代码讲解

效果展示
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

完整代码如下:

<template>
	<div>
		<!-- 标题栏 -->
		<van-nav-bar title="题目测试" left-text="返回" left-arrow @click-left="onClickLeft" />

		<!-- 题目列表 -->
		<van-list v-if="questions.length > 0">
			<div class="question-card" v-for="(question, index) in questions" :key="question.id">
				<van-card
						  :title="index + 1 + '. ' + question.content"
						  :class="{ 'bg-red': showAnswer[question.id] && selectedAnswers[question.id] !== question.answer }">
					<!-- 根据题目类型进行渲染 -->
					<template v-if="question.questionType === '选择题'" #desc>
						<van-radio-group v-model="selectedAnswers[question.id]">
							<van-radio :name="'A'">A.{{ question.optionA }}</van-radio>
							<van-radio :name="'B'">B.{{ question.optionB }}</van-radio>
							<van-radio :name="'C'">C.{{ question.optionC }}</van-radio>
							<van-radio :name="'D'">D.{{ question.optionD }}</van-radio>
						</van-radio-group>
            <!-- 显示正确答案 -->
        <p class="answer" v-if="question && showAnswer[question.id]">正确答案:<span class="correct">{{ question.answer }}</span></p>
					</template>

					<template v-else-if="question.questionType === '判断题'" #desc>
						<van-radio-group v-model="selectedAnswers[question.id]" :direction="isVertical ? 'vertical' : 'horizontal'">
							<van-radio :name="'true'">正确</van-radio>
							<van-radio :name="'false'">错误</van-radio>
						</van-radio-group>
            <!-- 显示正确答案 -->
        <p class="answer" v-if="question && showAnswer[question.id]">正确答案:<span class="correct">{{ question.answer }}</span></p>
					</template>

					<template v-else-if="question.questionType === '简答题'" #desc>
						<van-field v-model="selectedAnswers[question.id]" :rows="3" placeholder="请输入简答题答案" />
            <!-- 显示正确答案 -->
        <p class="answer" v-if="question && showAnswer[question.id]">正确答案:<span class="correct">{{ question.answer }}</span></p>
					</template>

					<template v-else-if="question.questionType === '填空题'" #desc>
						<van-field
								   v-model="selectedAnswers[question.id]"
								   label-width="80px"
								   placeholder="请输入填空题答案">
							<template #label>请填写答案:</template>
						</van-field>
            <!-- 显示正确答案 -->
        <p class="answer" v-if="question && showAnswer[question.id]">正确答案:<span class="correct">{{ question.answer }}</span></p>
					</template>        					
				</van-card>
			</div>
		</van-list>

		<!-- 无数据占位符 -->
		<van-empty v-else />

		<!-- 提交答案按钮 -->
		<van-button ref="submitButton" block type="primary" :disabled="isSubmitting" @click="onSubmit">{{ submitBtnText }}</van-button>
	</div>
</template>

<script>
	import axios from "axios";
	import { showDialog } from 'vant';
	export default {
	  data() {
	    return {
	      questions: [], // 题目列表
	      selectedAnswers: {}, // 用户选择的答案
	      showAnswer: {}, // 是否显示答案
	      isVertical: false, // 是否垂直布局选项(主要用于选择题)
	      currentQuestionIndex: 0, // 当前问题的索引
	      totalScore: 0, // 总分数
	      isSubmitting: false, // 是否正在提交答案
	    };
	  },
	  computed: {
	    submitBtnText() {
	      return this.isSubmitting ? '正在提交' : '提交'
	    }
	  },
	  methods: {
	    // 返回按钮点击事件处理函数
	    onClickLeft() {
	      this.$router.push("/my");
	    },
	
	    // 提交答案的代码
	    onSubmit() {
	      let totalCount = Object.keys(this.selectedAnswers).length;
	      let correctCount = 0;
	      let score = 0;
	
	      // 禁用提交按钮
	      this.isSubmitting = true
	
	      // 计算总得分
	      for (const question of this.questions) {
	        const userAnswer = this.selectedAnswers[question.id];
	        if (userAnswer === question.answer) {
	          correctCount++;
	          score += question.score;
	        }
	        // 显示正确答案
	        this.showAnswer[question.id] = true;
	      }
	      this.totalScore = score;
	
	      // 使用vant-ui组件弹出对话框显示结果
	  const message = `你选择了 ${totalCount} 道题,答对了 ${correctCount} 道题。总得分:${this.totalScore} 分。`;
	
	  showDialog({
	    title: "考试结束啦>_<",
	    message: message,
	  }).then(() => {
	    // on close
	  });
	
	  // 禁用提交按钮
	  this.isSubmitting = true
	  
	  // 显示正确答案
	  for (const question of this.questions) {
	    this.showAnswer[question.id] = true;
	  }
    // console.log("正确答案集合")
    // for (let i = 0; i < this.questions.length; ++ i){
    //   console.log(this.questions[i].answer)
    // }

    console.log("用户选择的正确答案集合")
    console.log(this.selectedAnswers)
	},
	
	
	// 获取问题分数
	getQuestionScore(questionId) {
	  const userAnswer = this.selectedAnswers[questionId];
	  const question = this.questions.find((q) => q.id === questionId);
	  return userAnswer === question.answer ? question.score : 0;
	},
	
	// 显示当前问题
	showQuestion() {
	  // 获取当前问题
	  const question = this.questions[this.currentQuestionIndex];
	
	  // 根据题目类型渲染问题
	  switch (question.questionType) {
	    case "选择题":
	      this.isVertical = false;
	      break;
	    case "判断题":
	      this.isVertical = true;
	      break;
	  }
	
	  // 显示问题并将提交按钮重新启用
	  this.$refs.submitButton.disable = false;
	},
	},
	mounted() {
	// 获取题目列表
	axios
	.get("http://localhost:8083/questions")
	.then((res) => {
	this.questions = res.data.data;
	
	    // 对问题数据进行按题目类型排序
	    this.questions.sort((a, b) => {
	      const typeOrder = { "选择题": 0, "判断题": 1, "填空题": 2, "简答题": 3 };
	      return typeOrder[a.questionType] - typeOrder[b.questionType];
	    });
	
	    // 显示第一个问题
	    this.showQuestion();
	  })
	  .catch((error) => {
	    console.log(error);
	  });
	},
	};
</script>

<style>
	.answer {
	color: red;
	margin-bottom: 0;
	}
	.correct {
	color: green;
	}
</style>

如果大家觉得有用的话,可以关注我下面的微信公众号,极客李华,我会在里面更新更多行业资讯,企业面试内容,编程资源,如何写出可以让大厂面试官眼前一亮的简历等内容,让大家更好学习编程,我的抖音,B站也叫极客李华。大家喜欢也可以关注一下

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客李华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值