提交 b0b6c0f4 authored 作者: lihuihui's avatar lihuihui

Merge branch 'master' of https://gitlab.ezijing.com/ezijing/x-learn

# Conflicts: # src/pages/exam/courseExam/chapter/index.vue
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
</div> </div>
<div class="right"> <div class="right">
<question-numbers <question-numbers
:status="status"
:page="currentGroupPage" :page="currentGroupPage"
:data="currentQuestionGroup" :data="currentQuestionGroup"
:list="numberGroups.length ? numberGroups : questionGroups" :list="numberGroups.length ? numberGroups : questionGroups"
...@@ -66,6 +67,7 @@ import questionNumbers from '@/components/exam/questionNumbers' ...@@ -66,6 +67,7 @@ import questionNumbers from '@/components/exam/questionNumbers'
export default { export default {
components: { questionList, questionNumbers }, components: { questionList, questionNumbers },
props: { props: {
status: { type: Number, default: 1 }, // 1:答题;2:查看;3:批阅
title: { type: String }, title: { type: String },
hasMark: { type: Boolean, default: true }, // 标记 hasMark: { type: Boolean, default: true }, // 标记
hasCollect: { type: Boolean, default: true }, // 收藏 hasCollect: { type: Boolean, default: true }, // 收藏
...@@ -136,11 +138,8 @@ export default { ...@@ -136,11 +138,8 @@ export default {
} }
}, },
groups: { groups: {
immediate: true,
handler(groups) { handler(groups) {
if (groups.length) { this.questionGroups = groups
this.questionGroups = groups
}
} }
}, },
groupPage(value) { groupPage(value) {
...@@ -259,7 +258,7 @@ export default { ...@@ -259,7 +258,7 @@ export default {
}, },
// 组装试题数据 // 组装试题数据
genQuestions(data) { genQuestions(data) {
const { questions, answers = {} } = data const { questions, answers = {}, score_items: scores = {} } = data
if (!questions) return [] if (!questions) return []
this.questionGroups = questions.question_items.reduce((result, question) => { this.questionGroups = questions.question_items.reduce((result, question) => {
if (question.question_list.length) { if (question.question_list.length) {
...@@ -267,6 +266,8 @@ export default { ...@@ -267,6 +266,8 @@ export default {
list = list.map(item => { list = list.map(item => {
let userAnswers = [] let userAnswers = []
let sign = false let sign = false
let scoreItem = {}
// 答案
if (answers) { if (answers) {
// 大题答案包含所有小题答案 // 大题答案包含所有小题答案
const bigQuestionAnswer = answers[question.question_item_id] const bigQuestionAnswer = answers[question.question_item_id]
...@@ -277,7 +278,20 @@ export default { ...@@ -277,7 +278,20 @@ export default {
sign = questionAnswer.sign || false sign = questionAnswer.sign || false
} }
} }
return { ...item, user_answer: userAnswers, sign } // 分数与结果
if (scores) {
const bigQuestionScore = scores[question.question_item_id]
if (bigQuestionScore) {
// 小题分数
scoreItem = bigQuestionScore[item.id] || {}
if (userAnswers.length) {
scoreItem.answer = scoreItem.is_right ? 1 : 2
} else {
scoreItem.answer = 0
}
}
}
return { ...scoreItem, ...item, user_answer: userAnswers, sign }
}) })
result.push(Object.assign({}, question, { question_list: list })) result.push(Object.assign({}, question, { question_list: list }))
}) })
......
...@@ -52,8 +52,8 @@ export default { ...@@ -52,8 +52,8 @@ export default {
position: relative; position: relative;
} }
.question-list-hd { .question-list-hd {
position: sticky; // position: sticky;
top: 0; // top: 0;
display: flex; display: flex;
align-items: center; align-items: center;
height: 45px; height: 45px;
......
...@@ -52,10 +52,10 @@ ...@@ -52,10 +52,10 @@
</div> </div>
</template> </template>
<template v-else> <template v-else>
<!-- <div class="answer-item"> <div class="answer-item" v-if="data.comment">
<div class="answer-item-label">老师点评:</div> <div class="answer-item-label">老师点评:</div>
<div class="answer-item-content">{{ correctAnswerText }}</div> <div class="answer-item-content">{{ data.comment }}</div>
</div> --> </div>
</template> </template>
<div class="answer-item" v-if="data.question_analysis"> <div class="answer-item" v-if="data.question_analysis">
<div class="answer-item-label">解析:</div> <div class="answer-item-label">解析:</div>
......
...@@ -3,10 +3,13 @@ ...@@ -3,10 +3,13 @@
<el-collapse-item :title="item.name" :name="item.id" v-for="item in currentList" :key="item.id"> <el-collapse-item :title="item.name" :name="item.id" v-for="item in currentList" :key="item.id">
<ul v-if="item.id === '1'"> <ul v-if="item.id === '1'">
<li class="meterial-item" v-for="subItem in item.children" :key="subItem.id"> <li class="meterial-item" v-for="subItem in item.children" :key="subItem.id">
<p>{{subItem.file_name}}</p><i class="el-icon-download" @click="handleDownload(subItem)"></i> <p>
<a :href="subItem.file_url" target="_blank">{{ subItem.file_name }}</a>
</p>
<i class="el-icon-download" @click="handleDownload(subItem)"></i>
</li> </li>
</ul> </ul>
<u v-else> <ul v-else>
<li v-for="subItem in item.children" :key="subItem.id" @click="handleClick(subItem)"> <li v-for="subItem in item.children" :key="subItem.id" @click="handleClick(subItem)">
<div class="name">{{ subItem.name }}</div> <div class="name">{{ subItem.name }}</div>
<div class="duration">{{ subItem.duration }}</div> <div class="duration">{{ subItem.duration }}</div>
...@@ -26,7 +29,7 @@ ...@@ -26,7 +29,7 @@
</template> </template>
</div> </div>
</li> </li>
</u> </ul>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
</template> </template>
...@@ -116,14 +119,14 @@ li { ...@@ -116,14 +119,14 @@ li {
color: #999; color: #999;
} }
} }
li.meterial-item{ li.meterial-item {
display:flex; display: flex;
p{ p {
flex:1; flex: 1;
} }
i{ i {
padding:10px; padding: 10px;
font-size:20px; font-size: 20px;
} }
} }
</style> </style>
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<div class="tit">{{ item.title }}</div> <div class="tit">{{ item.title }}</div>
<ul> <ul>
<template v-for="(cItem, index) in item.question_list"> <template v-for="(cItem, index) in item.question_list">
<li @click="goQuestion(cItem.id)" :class="`stu${cItem.cardStust}`" :key="cItem.id ">{{ index + 1 }}</li> <li @click="goQuestion(cItem.id)" :class="`stu${cItem.cardStust}`" :key="cItem.id">{{ index + 1 }}</li>
</template> </template>
</ul> </ul>
</div> </div>
...@@ -76,13 +76,13 @@ export default { ...@@ -76,13 +76,13 @@ export default {
this.data.questions.question_items.forEach(list => { this.data.questions.question_items.forEach(list => {
list.question_list = list.question_list.reduce((a, b) => { list.question_list = list.question_list.reduce((a, b) => {
return a.concat(b) return a.concat(b)
}) }, [])
list.question_list.map(item => { list.question_list.map(item => {
if (!this.data.answers[list.question_item_id][item.id].answer.length) { if (!this.data.answers[list.question_item_id][item.id].answer.length) {
item.cardStust = 3 item.cardStust = 3
return item return item
} else { } else {
this.data.score_items[list.question_item_id][item.id].is_right ? item.cardStust = 1 : item.cardStust = 2 this.data.score_items[list.question_item_id][item.id].is_right ? (item.cardStust = 1) : (item.cardStust = 2)
return item return item
} }
}) })
...@@ -97,10 +97,10 @@ export default { ...@@ -97,10 +97,10 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.card-box{ .card-box {
position: relative; position: relative;
height: 100%; height: 100%;
.tips-box{ .tips-box {
display: flex; display: flex;
justify-content: center; justify-content: center;
padding: 15px 0 10px; padding: 15px 0 10px;
...@@ -108,57 +108,57 @@ export default { ...@@ -108,57 +108,57 @@ export default {
margin: 0; margin: 0;
list-style: none; list-style: none;
border-bottom: 1px solid #ccc; border-bottom: 1px solid #ccc;
li{ li {
&:nth-child(2){ &:nth-child(2) {
margin: 0 50px; margin: 0 50px;
} }
.circle1{ .circle1 {
width: 24px; width: 24px;
height: 24px; height: 24px;
background: #fff; background: #fff;
border: 2px solid #0FC118; border: 2px solid #0fc118;
border-radius: 50%; border-radius: 50%;
box-sizing: border-box; box-sizing: border-box;
} }
.circle2{ .circle2 {
width: 24px; width: 24px;
height: 24px; height: 24px;
border: 2px solid #C01540; border: 2px solid #c01540;
border-radius: 50%; border-radius: 50%;
box-sizing: border-box; box-sizing: border-box;
} }
.circle3{ .circle3 {
width: 24px; width: 24px;
height: 24px; height: 24px;
background: #999999; background: #999999;
border-radius: 50%; border-radius: 50%;
} }
.circle4{ .circle4 {
position: relative; position: relative;
width: 24px; width: 24px;
height: 24px; height: 24px;
border: 1px solid #CCCCCC; border: 1px solid #cccccc;
border-radius: 50%; border-radius: 50%;
&::after{ &::after {
content: ''; content: '';
position: absolute; position: absolute;
top: -1px; top: -1px;
right: -1px; right: -1px;
width: 4px; width: 4px;
height: 4px; height: 4px;
background: #C01540; background: #c01540;
border-radius: 50%; border-radius: 50%;
} }
} }
.txt{ .txt {
margin-top: 5px; margin-top: 5px;
font-size: 12px; font-size: 12px;
color: #CCCCCC; color: #cccccc;
line-height: 17px; line-height: 17px;
} }
} }
} }
.order-num{ .order-num {
height: 420px; height: 420px;
overflow-y: scroll; overflow-y: scroll;
padding-left: 30px; padding-left: 30px;
...@@ -167,27 +167,27 @@ export default { ...@@ -167,27 +167,27 @@ export default {
display: none; display: none;
} }
// padding-bottom: 90px; // padding-bottom: 90px;
.tit{ .tit {
font-size: 12px; font-size: 12px;
color: #999999; color: #999999;
line-height: 17px; line-height: 17px;
margin-bottom: 12px; margin-bottom: 12px;
margin-top: 30px; margin-top: 30px;
} }
ul{ ul {
display: flex; display: flex;
list-style: none; list-style: none;
padding: 0; padding: 0;
margin: 0; margin: 0;
flex-wrap: wrap; flex-wrap: wrap;
li{ li {
box-sizing: border-box; box-sizing: border-box;
cursor: pointer; cursor: pointer;
position: relative; position: relative;
border-radius: 50px; border-radius: 50px;
width: 24px; width: 24px;
height: 24px; height: 24px;
border: 1px solid #CCCCCC; border: 1px solid #cccccc;
font-size: 12px; font-size: 12px;
color: #666666; color: #666666;
line-height: 24px; line-height: 24px;
...@@ -197,22 +197,22 @@ export default { ...@@ -197,22 +197,22 @@ export default {
// &:nth-child(5n+5){ // &:nth-child(5n+5){
// margin-right: 0; // margin-right: 0;
// } // }
&.stu1{ &.stu1 {
border: 2px solid #0FC118; border: 2px solid #0fc118;
line-height: 22px; line-height: 22px;
} }
&.stu2{ &.stu2 {
border: 2px solid #C01540; border: 2px solid #c01540;
line-height: 22px; line-height: 22px;
} }
&.stu3{ &.stu3 {
color: #fff; color: #fff;
background: #999999; background: #999999;
} }
} }
} }
} }
.btn-box{ .btn-box {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 0; left: 0;
...@@ -222,26 +222,26 @@ export default { ...@@ -222,26 +222,26 @@ export default {
align-items: center; align-items: center;
height: 60px; height: 60px;
background: #fff; background: #fff;
.btn{ .btn {
width: 116px; width: 116px;
height: 40px; height: 40px;
text-align: center; text-align: center;
line-height: 40px; line-height: 40px;
border-radius: 4px; border-radius: 4px;
cursor: pointer; cursor: pointer;
&:nth-child(1){ &:nth-child(1) {
border: 1px solid #CCCCCC; border: 1px solid #cccccc;
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
color: #999999; color: #999999;
box-sizing: border-box; box-sizing: border-box;
} }
&:nth-child(2){ &:nth-child(2) {
background: #C01540; background: #c01540;
border-radius: 4px; border-radius: 4px;
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
color: #FFFFFF; color: #ffffff;
margin-left: 30px; margin-left: 30px;
} }
} }
......
<template> <template>
<exam-card <exam-card
title="课后练习" title="课后练习"
:hasMark="hasMark"
:status="status"
:data="data" :data="data"
:hasCountdown="false" :hasCountdown="false"
@submit="handleSubmit" @submit="handleSubmit"
...@@ -15,6 +17,8 @@ export default { ...@@ -15,6 +17,8 @@ export default {
components: { ExamCard }, components: { ExamCard },
data() { data() {
return { return {
status: 1, // 考试状态
hasMark: true,
data: {} data: {}
} }
}, },
...@@ -35,6 +39,12 @@ export default { ...@@ -35,6 +39,12 @@ export default {
} }
api.getCourseQuestion(param).then(response => { api.getCourseQuestion(param).then(response => {
this.data = JSON.parse(response.data).sheet this.data = JSON.parse(response.data).sheet
// 已提交
const isSubmited = ['1', '2'].includes(this.data.status)
if (isSubmited) {
this.status = 2
this.hasMark = false
}
}) })
}, },
// 返回 // 返回
...@@ -79,7 +89,7 @@ export default { ...@@ -79,7 +89,7 @@ export default {
} }
answers[group.question_item_id][item.id] = { answers[group.question_item_id][item.id] = {
sign: item.sign ? item.sign : false, sign: item.sign ? item.sign : false,
answers: item.user_answer answer: item.user_answer
} }
}) })
}) })
......
...@@ -57,8 +57,7 @@ export default { ...@@ -57,8 +57,7 @@ export default {
return `width: ${this.accuracy}%` return `width: ${this.accuracy}%`
} }
}, },
mounted() { mounted() {},
},
methods: { methods: {
goPage(param) { goPage(param) {
const urlParam = this.$route.query const urlParam = this.$route.query
...@@ -76,24 +75,20 @@ export default { ...@@ -76,24 +75,20 @@ export default {
course_id: this.$route.query.course_id, course_id: this.$route.query.course_id,
chapter_id: this.$route.query.chapter_id chapter_id: this.$route.query.chapter_id
} }
api api.getCourseQuestion(param).then(response => {
.getCourseQuestion(param) const data = JSON.parse(response.data)
.then(response => { this.data = data
const data = JSON.parse(response.data) this.accuracy = (parseInt(data.sheet.score) / parseInt(data.sheet.questions.total_score)) * 100
this.data = data })
this.accuracy = parseInt(data.sheet.score) / parseInt(data.sheet.questions.total_score) * 100
})
.finally(() => {
})
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.result-box{ .result-box {
width: 100%; width: 100%;
display: flex; display: flex;
.card-left{ .card-left {
position: relative; position: relative;
box-sizing: border-box; box-sizing: border-box;
padding: 10px 30px 20px; padding: 10px 30px 20px;
...@@ -102,13 +97,13 @@ export default { ...@@ -102,13 +97,13 @@ export default {
margin-right: 10px; margin-right: 10px;
height: 560px; height: 560px;
border-radius: 8px; border-radius: 8px;
.title{ .title {
font-size: 18px; font-size: 18px;
color: #222222; color: #222222;
line-height: 45px; line-height: 45px;
border-bottom: 1px solid #ccc; border-bottom: 1px solid #ccc;
} }
.chart-box{ .chart-box {
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 50%; left: 50%;
...@@ -116,63 +111,63 @@ export default { ...@@ -116,63 +111,63 @@ export default {
width: 148px; width: 148px;
// margin: 26px auto 0; // margin: 26px auto 0;
} }
.assess{ .assess {
font-size: 18px; font-size: 18px;
color: #222222; color: #222222;
line-height: 45px; line-height: 45px;
border-bottom: 1px solid #ccc; border-bottom: 1px solid #ccc;
} }
.assess-box{ .assess-box {
padding-top: 27px; padding-top: 27px;
.prog{ .prog {
width: 350px; width: 350px;
margin: 0 auto; margin: 0 auto;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
.line-box{ .line-box {
width: 300px; width: 300px;
width: 300px; width: 300px;
height: 10px; height: 10px;
background: #F9F9F9; background: #f9f9f9;
border-radius: 5px; border-radius: 5px;
.line{ .line {
width: 80%; width: 80%;
height: 10px; height: 10px;
background: linear-gradient(90deg, #F47C46 0%, #F22F48 100%); background: linear-gradient(90deg, #f47c46 0%, #f22f48 100%);
border-radius: 5px; border-radius: 5px;
} }
} }
.icon{ .icon {
width: 41px; width: 41px;
height: 38px; height: 38px;
background: url(@/assets/images/res-icon.png); background: url(@/assets/images/res-icon.png);
background-size: 100% 100%; background-size: 100% 100%;
} }
} }
.text{ .text {
font-size: 14px; font-size: 14px;
color: #222222; color: #222222;
line-height: 20px; line-height: 20px;
text-align: center; text-align: center;
margin: 50px 0 68px 0; margin: 50px 0 68px 0;
} }
.btn{ .btn {
cursor: pointer; cursor: pointer;
text-align: center; text-align: center;
line-height: 40px; line-height: 40px;
width: 144px; width: 144px;
height: 40px; height: 40px;
background: #C01540; background: #c01540;
border-radius: 4px; border-radius: 4px;
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
color: #FFFFFF; color: #ffffff;
margin: 0 auto; margin: 0 auto;
} }
} }
} }
.card-right{ .card-right {
box-sizing: border-box; box-sizing: border-box;
flex: 1; flex: 1;
background: #fff; background: #fff;
......
<template> <template>
<exam-card <exam-card
:title="title" :title="title"
:status="2"
:groups="questionGroups" :groups="questionGroups"
:numberGroups="numberGroups" :numberGroups="numberGroups"
:hasMark="false" :hasMark="false"
...@@ -121,6 +122,9 @@ export default { ...@@ -121,6 +122,9 @@ export default {
} }
return api.getAllQuestion(param).then(response => { return api.getAllQuestion(param).then(response => {
this.allQuestionList = response.list this.allQuestionList = response.list
if (!this.allQuestionList.length) {
this.handleBack()
}
}) })
}, },
// 清空 // 清空
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
<div> <div>
<exam-card <exam-card
title="模拟考试" title="模拟考试"
:hasMark="hasMark"
:status="status"
:hasSubmitBtn="!!!this.$route.query.id" :hasSubmitBtn="!!!this.$route.query.id"
:hasCountdown="!!!this.$route.query.id" :hasCountdown="!!!this.$route.query.id"
:data="data" :data="data"
...@@ -19,9 +21,10 @@ export default { ...@@ -19,9 +21,10 @@ export default {
components: { ExamCard }, components: { ExamCard },
data() { data() {
return { return {
data: { status: 1, // 考试状态
cacheAnswerTime: null // 缓存题计时器 hasMark: true,
} data: {},
cacheAnswerTime: null // 缓存题计时器
} }
}, },
computed: { computed: {
...@@ -57,6 +60,9 @@ export default { ...@@ -57,6 +60,9 @@ export default {
this.cacheAnswerTime = setInterval(() => { this.cacheAnswerTime = setInterval(() => {
this.submitExam(0) this.submitExam(0)
}, 3000) }, 3000)
} else {
this.status = 2
this.hasMark = false
} }
}) })
}, },
......
...@@ -37,9 +37,13 @@ export default { ...@@ -37,9 +37,13 @@ export default {
}) })
}, },
startExam(item) { startExam(item) {
if (item.status === 0 || item.status === 3) { if ([0, 3].includes(item.status)) {
this.open(item) this.open(item)
} else if ([1, 2].includes(item.status)) {
// 已完成
this.$router.push({ path: '/testExam/result', query: { exam_id: item.id } })
} else { } else {
// 未做
this.$router.push({ path: '/testExam/exam', query: { exam_id: item.id, is_create: 0 } }) this.$router.push({ path: '/testExam/exam', query: { exam_id: item.id, is_create: 0 } })
} }
}, },
...@@ -65,8 +69,6 @@ export default { ...@@ -65,8 +69,6 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.exam-list {
}
.exam-item { .exam-item {
display: inline-block; display: inline-block;
width: 300px; width: 300px;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<div> <div>
<exam-card <exam-card
title="批阅考卷" title="批阅考卷"
:status="3"
:hasSubmitBtn="false" :hasSubmitBtn="false"
:hasCountdown="false" :hasCountdown="false"
:hasCollect="false" :hasCollect="false"
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<div> <div>
<exam-card <exam-card
title="批阅考卷" title="批阅考卷"
:status="3"
:hasSubmitBtn="false" :hasSubmitBtn="false"
:hasCountdown="false" :hasCountdown="false"
:hasCollect="false" :hasCollect="false"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论