You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

572 lines
14 KiB

2 years ago
<template>
<div class="body">
2 years ago
<!-- <div class="bkg">
2 years ago
<u-image :lazy-load="false" :show-loading="false" mode="aspectFill" height="100vh" width="100vw"
:src="require('../../static/xtdk/answer-bg.png')"></u-image>
<u-image class="bg-bottom" :lazy-load="false" :show-loading="false" mode="aspectFill"
:src="require('../../static/xtdk/index-bg-bottom.png')"></u-image>
2 years ago
</div> -->
<div class="bottom">
2 years ago
</div>
2 years ago
<div class="container" :class="{'container_has':changebottom}">
2 years ago
<!-- <div class="container__bkg">
<u-image :lazy-load="false" :show-loading="false" width="100%" height="100%" mode="scaleToFill"
src="//cdn.langye.net/h5hssnx/answer-container-bkg.png"></u-image>
</div> -->
<div class="title">
(答题{{(now+1)}}/{{answers.length}})
</div>
<transition name="answering" enter-active-class="fade-in" leave-to-class="fade-out">
<div :style="{ 'display': progress !== 1 ? 'none' : '' }" v-show="progress === 1">
<div class="question">
{{ questionTitle }}
</div>
<div class="answers">
<!-- -->
2 years ago
<div class="answers__item" :class="{ 'answers__item-active': index === flag,'unclickable': flag>-1}" v-for="(item, index) in questionAnswers"
2 years ago
@click="$u.throttle(() => answer(item, index))"
>
<div class="answers__item--num" :class="{ 'answers__item--num-active': index === flag }">
{{num(item.myindex)}}</div>
<div class="answers__item--text" :class="{ 'answers__item--text-active': index === flag }">
{{item.title}}</div>
</div>
</div>
2 years ago
<!-- <div v-if="answers.length>0" class="answers_correct">{{ correctAnswer }}</div> -->
2 years ago
</div>
</transition>
<transition name="answer-result" enter-active-class="fade-in" leave-to-class="fade-out">
<div :style="{ 'display': progress !== 2 ? 'none' : '' }" class="answers correct"
v-show="progress === 2">
<template v-if="isCorrect">
<div class="answers__img">
<u-image :show-loading="false" mode="widthFix" :width="137" :height="261"
:src="require('@/static/xtdk/answer-correct.png')"></u-image>
</div>
<div class="answers__text">
恭喜你答对了
2 years ago
</div>
<div class="answers__text">
正确答案{{ correctAnswer }}
2 years ago
</div>
</template>
<template v-else>
<div class="answers__img">
<u-image :show-loading="false" mode="heightFix" :width="137" :height="261"
:src="require('@/static/xtdk/answer-wrong.png')"></u-image>
</div>
2 years ago
<div class="answers__text">
2 years ago
再接再厉
2 years ago
</div>
<div class="answers__text">
正确答案{{ correctAnswer }}
2 years ago
</div>
</template>
<div class="answers__btn" @click="$u.throttle(next)">
<u-image :show-loading="false" mode="widthFix" :width="342" :height="96"
:src="require('@/static/xtdk/answer-next-btn.png')"></u-image>
</div>
</div>
</transition>
<transition name="answer-end" enter-active-class="fade-in" leave-to-class="fade-out">
<div :style="{ 'display': progress !== 3 ? 'none' : '' }" class="answers correct"
v-show="progress === 3">
<div class="answers__img">
<u-image mode="widthFix" :width="answerImgWidth" :src="answerImg"></u-image>
</div>
<template>
<template v-if="isCorrect">
<div class="answers__text">
恭喜你答对了
2 years ago
</div>
<div class="answers__text">
正确答案{{ correctAnswer }}
2 years ago
</div>
</template>
2 years ago
<template v-else>
2 years ago
2 years ago
<div class="answers__text">
2 years ago
再接再厉
2 years ago
</div>
<div class="answers__text">
正确答案{{ correctAnswer }}
2 years ago
</div>
</template>
</template>
<template>
<template v-if="!isTotalEnd">
<!-- <div class="answers__text answers__result">
打卡成功已完成<span>{{ totalDone }}</span>个红色场馆的打卡
完成{{ detail.points ? detail.points.length : 0}}家红色场馆打卡即可获得<span>荣誉证书</span>
</div> -->
<div class="answers__btn" @click="$u.throttle(toMap)">
<u-image mode="widthFix" :width="342"
:src="require('@/static/xtdk/answer-home-btn.png')"></u-image>
</div>
</template>
<template v-else>
<!-- <div class="answers__text answers__result">
打卡成功已完成所有红色场馆的打卡 <br>快来生成你的证书吧!
</div> -->
<div class="answers__btn" @click="$u.throttle(toCertificate)">
<u-image mode="widthFix" :width="342"
:src="require('@/static/xtdk/answer-certificate-btn.png')"></u-image>
</div>
</template>
</template>
</div>
</transition>
</div>
</div>
</template>
<script>
export default {
data() {
return {
isTotalEnd: false, //是否完成所有打卡
detail: {},
now: 0,
nowAnswer: {},
answers: [],
myAnswers: [], //回答答案数组
isCorrect: false,
progress: 1, //1答题中2答案3结束
flag: -1, //显示active index
2 years ago
correctAnswer:'',
signInfo:'',
changebottom:false
2 years ago
};
},
methods: {
async getDetail() {
const res = await this.$u.api.getPoints()
this.detail = res
},
async getQuestions(id) {
const res = await this.$u.api.getQuestions({
point_id: id
})
this.answers = res.questions
},
2 years ago
answer(item, index) {
this.correctAnswer = ''
2 years ago
this.flag = index
this.myAnswers.push({
question_id: this.answers[this.now].id,
answer_ids: item.id
})
this.isCorrect = !!item.is_correct
let correct = this.answers[this.now]?.options?.find(i => i.is_correct)
2 years ago
this.correctAnswer = `${this.num(correct?.myindex)}${correct?.title}`
2 years ago
setTimeout(() => {
2 years ago
this.progress = this.now === (this.answers?.length - 1) ? 3 : 2
this.changebottom = true
// this.correctAnswer = ''
2 years ago
if (this.progress === 3) {
this.isTotalEnd = this.detail.points?.length == this.totalDone
this.$u.api.saveQuiz({
point_id: this.$route.query?.id ? this.$route.query.id : this.vuex_point_id,
answers: this.myAnswers
})
}
2 years ago
}, 500)
2 years ago
},
next() {
this.now++
this.flag = -1
2 years ago
this.progress = 1
this.changebottom = false
2 years ago
},
toMap() {
uni.navigateTo({
url: '/pages/map/map'
})
},
2 years ago
async getPoster () {
const res = await this.$u.api.getPoster({
user_id: this.vuex_user.id,
type: 2
})
this.signInfo = res
},
async toCertificate() {
await this.getPoster()
if (!this.signInfo?.upload) {
uni.navigateTo({
url: '/pages/sign/sign'
})
}else{
uni.navigateTo({
url: '/pages/certificate/certificate'
})
}
},
2 years ago
},
computed: {
answerImgWidth() {
if (this.isTotalEnd) {
return 137
}
if (this.isCorrect) {
return 137
}
return 137
},
answerImg() {
2 years ago
// if (this.isTotalEnd) {
// return require('@/static/xtdk/answer-correct.png')
// }
2 years ago
if (this.isCorrect) {
return require('@/static/xtdk/answer-correct.png')
}
return require('@/static/xtdk/answer-wrong.png')
},
totalDone() {
if (this.detail && this.detail.points) {
let id = this.$route.query?.id ? this.$route.query.id : this.vuex_point_id
let point = this.detail.points.find(i => i.id == id)
return point?.has_answer > 0 ? this.detail.point_answer_total : this.detail.point_answer_total + 1
}
return 1
},
// correctAnswer() {
// let correct = this.answers[this.now]?.options?.find(i => i.is_correct)
// return `${this.num(correct?.myindex)}、${correct?.title}`
// },
questionTitle() {
return this.answers[this.now]?.title
},
questionAnswers() {
return this.answers[this.now]?.options?.sort((a, b) => {
return a.myindex - b.myindex
})
},
num() {
return function(index) {
let map = new Map([
[1, 'A'],
[2, 'B'],
[3, 'C'],
[4, 'D'],
[5, 'E'],
[6, 'F'],
[7, 'G'],
[8, 'H'],
[9, 'I'],
])
return map.get(index)
}
},
containerTitle() {
return function(number) {
let chineseNumber = "";
let chineseDigits = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
let chineseUnits = ["", "十", "百", "千", "万", "亿"];
if (number === 0) {
return chineseDigits[0];
}
let digits = [];
while (number > 0) {
digits.push(number % 10);
number = Math.floor(number / 10);
}
let unitIndex = 0;
for (let i = 0; i < digits.length; i++) {
let digit = digits[i];
let unit = chineseUnits[unitIndex];
if (digit === 0) {
if (unit === "万" || unit === "亿") {
chineseNumber = chineseUnits[unitIndex] + chineseNumber;
unitIndex++;
}
continue;
}
chineseNumber = chineseDigits[digit] + unit + chineseNumber;
unitIndex++;
if (unitIndex === 5) {
unitIndex = 1;
}
}
return `${chineseNumber}`;
}
}
},
onLoad(option) {
this.getQuestions(option.id);
this.getDetail();
}
}
</script>
<style lang="scss">
.body {
2 years ago
// padding: 100rpx 20rpx 0 20rpx;
background: url(../../static/xtdk/answer-bg.png) no-repeat top left;
background-size: 100% 100%;
background-color: #fdd5d6;
height: 100vh;
width: 100vw;
overflow: scroll;
}
.bottom{
height: 628rpx;
width: 100vw;
background: url(../../static/xtdk/index-bg-bottom.png) no-repeat top left;
background-size: 100% 100%;
position: absolute;
bottom: 0;
left: 0;
2 years ago
}
.bkg {
z-index: -1;
position: absolute;
top: 0;
left: 0;
}
.container {
2 years ago
min-height: 690rpx;
2 years ago
// padding-bottom: 96rpx;
// position: relative;
position: relative;
z-index:2;
width:90%;
background-color: #f9f6f6;
border-radius:40rpx;
margin:0 auto;
box-shadow: 0px 0px 20px -10px #d22425;
2 years ago
margin-top:40rpx;
2 years ago
padding-bottom:51rpx;
&__bkg {
z-index: 0;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
& .title {
// width: 51%;
// text-align: center;
// font-size: 50rpx;
// font-weight: 400;
// color: #FFFFFF;
// padding: 15rpx 0rpx;
// z-index: 1;
// position: relative;
display: flex;
justify-content: space-between;
background-color: red;
padding:30rpx;
border-radius: 40rpx 40rpx 0 0 ;
border: 1px solid #d22425;
background-color: #d22425;
color:#fff;
border-bottom:none
}
& .question {
font-weight: 500;
color: #333333;
font-size: 35rpx;
margin-top: 40rpx;
padding: 0 51rpx;
z-index: 1;
position: relative;
}
& .correct {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
& .answers_correct{
margin:0 51rpx;
border-left:3px solid #d22425;
padding-left:15rpx;
color:#333333;
font-size: 28rpx;
2 years ago
}
2 years ago
& .answers {
2 years ago
& .unclickable{
pointer-events: none;
}
2 years ago
// margin-top: 30rpx;
padding: 51rpx;
// padding-bottom:60rpx;
z-index: 1;
position: relative;
&__item {
display: flex;
// justify-content: space-between;
align-items: flex-start;
align-items: center;
padding:20rpx;
background-color: #fff;
border:4rpx solid #fff;
border-radius: 20rpx;
color:#666666;
&-active{
border:4rpx solid #d22425;
}
&+div {
margin-top: 34rpx;
}
&--num {
// font-weight: 500;
// color: #666666;
// font-size: 32rpx;
// text-align: center;
// width: 60rpx;
// height: 60rpx;
// line-height: 60rpx;
// background: #fff;
// border: 1px solid #F85352;
// border-radius: 50%;
// transition: all 0.2s;
// margin-right: 13rpx;
display: inline-block;
width:40rpx;
height:40rpx;
border:2px solid #999;
color:#999;
text-align: center;
line-height: 40rpx;
border-radius: 10rpx;
margin-right:10rpx;
&-active {
background: #d22425;
border:2px solid #d22425;
color: #fff;
}
}
&--text {
// line-height: 60rpx;
// flex: 1;
// font-weight: 500;
// font-size: 32rpx;
// color: #666;
// background: #fff;
// border: 1px solid #F85352;
// border-radius: 0 20rpx 20rpx 20rpx;
// transition: all 0.2s;
// padding: 0 54rpx;
// &-active {
// background: #F85352;
// color: #fff;
// }
}
}
&__text {
font-size: 32rpx;
font-weight: 500;
color: #666666;
2 years ago
margin-top: 30rpx;
// margin-bottom: 20rpx;
2 years ago
text-align: center;
//line-height: 135rpx;
&>span {
font-size: 34rpx;
color: #C52A34;
}
2 years ago
}
&__btn{
margin-top:30rpx;
margin-bottom:50rpx;
2 years ago
}
&__result {
color: #666666;
font-weight: 500;
font-size: 20rpx;
line-height: 36rpx;
word-break: break-word;
padding: 0 calc(127rpx - 51rpx);
padding-top: 38rpx;
}
}
}
2 years ago
.container_has{
background-image:url(../../static/xtdk/answer-bg-bottom.png);
background-color: #fff;
background-position: bottom left;
background-size: 100% 130rpx;
background-repeat:no-repeat;
}
2 years ago
.fade-in {
animation: fade-in .5s cubic-bezier(0.39, 0.575, 0.565, 1) both;
}
@keyframes fade-in {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.fade-out {
animation: fade-out .4s ease-out both;
}
@keyframes fade-out {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
</style>