Files
palc-newyear2024/src/components/Question.vue

309 lines
7.6 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.
<script setup name="Question">
import gsap from "gsap";
import { Toast, Progress } from "vant";
import { data } from "@/data";
import { debounceTap, FYShuffle, mostValue, judgeBigScreen } from "@/plugins";
import { useMainStore } from "@/store";
import { subAnswer } from "@/api";
import { computed } from "vue";
// 页面配置初始化
const emit = defineEmits(["hide", "showResult", "QuestionPage"]);
const userStore = useMainStore();
const props = defineProps({
questionId: {
default: 0,
required: true,
}
})
// 当前题目
const currentId = ref(props.questionId); //当前id 0~11
const questionList = ref(data); //随机打乱题库
const isChecked = ref(false)
const checkedOption = ref('')
// 答题事件
const answerFn = (item, event) => {
let e = event.target.parentElement;
debounceTap(e, () => {
gsap.set('.answer-box', { pointerEvents: 'none' })
isChecked.value = true
checkedOption.value = item
console.log('checkedOption', checkedOption.value);
if (item.result) {
gsap.set('.create-btn', { display: 'block' })
} else {
gsap.set('.return-btn', { display: 'block' })
}
})
}
// 下一题
const nextQuestion = (event) => {
let e = event.target;
debounceTap(e, () => {
gsap.to('.question-box', {
duration: 0.5, autoAlpha: 0, scale: 0.3, onComplete: () => {
emit('hide')
}
})
})
}
// 查看结果事件
const viewResult = (event) => {
let e = event.target;
debounceTap(e, () => {
// 更新海报id
userStore.posterId = currentId.value + 1
gsap.set('.question-box', { pointerEvents: 'none' })
Toast('答题结束')
Toast.loading({
message: '结果生成中',
duration: 0,
forbidClick: true,
})
if (import.meta.env.VITE_MODE != "dev") {
// 提交完成记录
subAnswer({}, userStore.token).then((res) => {
console.log("key:", res);
if (res.code == 0) {
userStore.updateDrawKey(res.data);
}
setTimeout(() => {
Toast.clear()
gsap.to('.QuestionPage', {
duration: 0.5, autoAlpha: 0, onComplete: () => {
emit("showResult", { action: "showResult" });
}
})
}, 1000)
});
} else {
setTimeout(() => {
Toast.clear()
gsap.to('.QuestionPage', {
duration: 0.5, autoAlpha: 0, onComplete: () => {
emit("showResult", { pid: currentId.value });
}
})
}, 1000)
}
})
}
onMounted(() => {
gsap.from('.question-bg', { duration: 0.5, autoAlpha: 0, })
gsap.from('.question-box', { duration: 0.5, scale: 0.4, autoAlpha: 0, })
});
const getClass = (item) => {
if (isChecked.value) {
if (checkedOption.value.aid == item.aid) {
return item.result ? 'correct' : 'incorrect'
}
}
}
</script>
<template>
<div class="QuestionPage" @touchmove.prevent>
<div class="question-bg"></div>
<div class="question-container">
<div class="question-box">
<!-- 问题序号 -->
<div class="qa-question-box">
<!-- 问题 -->
<div class="question">
<div class="question-text" v-for="item in questionList[currentId].question" :key="item">
{{ item }}
</div>
</div>
<!-- 选项 -->
<div class="answer-box">
<div class="answer" :class="getClass(item)" v-for="item in questionList[currentId].answer" :key="item.aid">
<div class="answer-text">
{{ item.aid }}.{{ item.text }}
</div>
<div class="result-icon" v-if="isChecked && (item.aid == checkedOption.aid)">
<div :class="item.result ? 'icon-correct' : 'icon-incorrect'"></div>
</div>
<!-- 可点击区域 -->
<div class="click-area" @click="answerFn(item, $event)"></div>
</div>
</div>
<div class="question-tips" v-for="(t, i) in questionList[currentId].tips" :key="i">
<div v-if='questionList[currentId].tips.length == 1'>
{{ isChecked ? `${['回答错误!', '回答正确!'][checkedOption.result]}` : `提示:${t}` }}
</div>
<div v-else>
{{ isChecked ? `${i==0?['回答错误', '回答正确'][checkedOption.result]:''}` : `${i==0?'提示':''}${t}` }}
</div>
</div>
</div>
<div class="return-btn" @click="nextQuestion($event)"></div>
<div class="create-btn" @click="viewResult($event)"></div>
<div class="qa-megaphone"></div>
</div>
<div class="question-gold-icon-1"></div>
</div>
</div>
</template>
<style lang='scss' scope>
.QuestionPage {
@include pos(100%, 1624px, 0px, 0px);
overflow: hidden;
.question-bg {
@include pos(750px, 1624px, 0px, 0px);
// transform: translateY(-50%);
@include bg_pos("index/bg.jpg");
}
.question-container {
@include pos(750px, 1624px, 0px, 0px);
@include flexCen();
background-color: rgba($color: #000000, $alpha: 0.3);
.question-box {
@include pos(721px, 857px, 20px, 340px);
@include bg_pos("qa/paper.png");
.qa-question-box {
@include pos(563px, 660px, 74px, 106px);
display: flex;
flex-direction: column;
justify-content: space-around;
// justify-content: flex-start;
align-items: center;
// 问题样式
.question {
.question-text {
font-family: 'HarmonyOS_Sans_SC_Regular';
font-size: 34px;
color: #9e4b00;
line-height: 50px;
text-align: justify;
}
}
// 选项样式
.answer-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
height: 200px;
// 选项通用样式
.answer {
@include box(350px, 65px);
position: relative;
border-radius: 32.5px;
display: flex;
justify-content: center;
align-items: center;
border: 1px solid #fff;
color: #9e4b00;
background-color: #fff2b9;
font-weight: 700;
.answer-text {
font-size: 30px;
@include flexCen()
}
.click-area {
@include pos(350px, 65px, 0px, 0px);
border-radius: 32.5px;
}
.result-icon {
@include box(49px, 45px);
margin-left: 20px;
.icon-correct {
@include box(100%, 100%);
@include bg_pos("qa/correct.png");
}
.icon-incorrect {
@include box(49px, 45px);
@include bg_pos("qa/incorrect.png");
}
}
}
.correct {
color: #d42122;
}
.incorrect {
color: #fff2b9;
background-color: #d42122;
}
}
.question-tips {
font-size: 25px;
width: 100%;
font-family: 'HarmonyOS_Sans_SC_Regular';
color: #ab7133;
text-align: center;
padding: 5px;
}
}
}
.return-btn {
@include pos(363px, 113px, 179px, 887px);
@include bg_pos("qa/cls-btn.png");
display: none;
}
.create-btn {
@include pos(363px, 113px, 179px, 887px);
@include bg_pos("qa/create-btn.png");
display: none;
}
.qa-megaphone {
@include pos(171px, 208px, 562px, 512px);
@include bg_pos("qa/megaphone.png");
pointer-events: none;
}
}
}
</style>