提交 33707f35 authored 作者: lihuihui's avatar lihuihui

错题集对答题

上级 e36aaa7a
......@@ -28,32 +28,24 @@ export function setRoles(params) {
}
/**
* 获取课程列表
* 获取我的已做试题
*/
export function getCourseList() {
return httpRequest.get('/api/zy/v2/education/courses/list')
export function getMyQuestion(params) {
return httpRequest.get('/api/zy/v2/examination/my-question', { params }, {
headers: { 'Content-Type': 'multipart/form-data' }
})
}
/**
* 获取课程详情
* @param {string} courseId 课程ID
* 获取我的所有试题
*/
export function getCourse(courseId) {
return httpRequest.get(`/api/zy/v2/education/courses/${courseId}`)
export function getAllQuestion(params) {
return httpRequest.get('/api/zy/v2/examination/my-question-all', { params })
}
/**
* 获取课程知识点
* @param {string} courseId 课程ID
*/
export function getCourseTagList(courseId) {
return httpRequest.get(`/api/zy/v2/education/tag/tree/${courseId}`)
}
/**
* 知识点详情
* @param {string} tagId 知识点ID
*/
export function getCourseTag(tagId) {
return httpRequest.get(`/api/zy/v2/education/tag/${tagId}`)
* 缓存错题集
*/
export function setMyCache(params) {
return httpRequest.post('/api/zy/v2/examination/cache-question', params)
}
......@@ -24,6 +24,7 @@
@on-remove="handleRemove"
@on-addCollection="handleAddCollection"
@on-removeCollection="handleRemoveCollection"
@on-goDetails="goDetails(item.num)"
></my-question-list-item>
</template>
<div class="empty" v-else>暂无试题</div>
......@@ -81,6 +82,17 @@ export default {
}
},
methods: {
// 跳详情
goDetails(i) {
this.$router.push({
path: '/my/questions/details',
query: {
type: this.requestParams.type,
qType: this.questionType,
index: i
}
})
},
// 获取试题列表
getMyQuestions() {
this.loaded = false
......
<template>
<div class="my-question-list-item">
<div class="my-question-list-item" @click="goDetails">
<el-checkbox v-model="data.checked"></el-checkbox>
<div class="badge" :class="`questiont-type_${data.question_type}`">{{ questionTypeName }}</div>
<div class="name" v-html="data.question_content"></div>
......@@ -35,6 +35,9 @@ export default {
methods: {
toggleCollection() {
this.data.is_collection ? this.$emit('on-removeCollection', this.data) : this.$emit('on-addCollection', this.data)
},
goDetails() {
this.$emit('on-goDetails')
}
}
}
......
<template>
<div>
<div class="order-num">
<ul>
<template v-for="(item, index) in questionParams.card">
<li :class="isClass(item.answer)" :key="index" @click="goQuestion(index)">
<div class="circle">{{ index + 1 }}</div>
<div class="txt">{{ questionType(item.question_type) }}</div>
</li>
</template>
</ul>
</div>
<ul class="tips-box">
<li>
<div class="circle1"></div>
<div class="txt">答对</div>
</li>
<li>
<div class="circle2"></div>
<div class="txt">答错</div>
</li>
<li>
<div class="circle3"></div>
<div class="txt">未答</div>
</li>
</ul>
</div>
</template>
<script>
export default {
props: {
questionParams: { type: Object, default: () => {} }
},
mounted() {
this.msgCenter.$on('monitoringChanges', this.monitoringChanges)
},
computed: {
questionType() {
return (t) => {
const type = {
1: '单选题',
2: '多选题',
5: '案例题',
6: '判断题'
}
return type[t]
}
},
changeQuestionIndex() {
return this.questionParams.answerRecord
},
isClass() {
return (i) => {
const tClass = {
0: 'stu3',
1: 'stu1',
2: 'stu2'
}
return tClass[parseInt(i)]
}
}
},
methods: {
monitoringChanges(id) {
this.changeCardStatus(id)
this.$forceUpdate()
},
goQuestion(n) {
this.$emit('cardChangeQuention', n)
},
changeCardStatus(id) {
const dataArr1 = this.questionParams.question.rightKey
const dataArr2 = this.questionParams.answerRecord[id] ? this.questionParams.answerRecord[id].answer : []
const findData = this.questionParams.card.find(item => { return item.question_id === id })
if (this.scalarArrayEquals(dataArr1, dataArr2)) {
findData.answer = 1
} else {
dataArr2.length !== 0 && (findData.answer = 2)
}
this.$forceUpdate()
},
scalarArrayEquals(arr1, arr2) {
if (Array.isArray(arr1) && Array.isArray(arr2)) {
if (arr1.sort().toString() === arr2.sort().toString()) {
return true
}
}
return false
}
},
watch: {
changeQuestionIndex(newV, oldV) {
this.$forceUpdate()
}
}
}
</script>
<style lang="scss" scoped>
.order-num{
padding-bottom: 90px;
ul{
display: flex;
list-style: none;
padding: 0;
margin: 0;
flex-wrap: wrap;
li{
cursor: pointer;
position: relative;
margin-right: 10px;
margin-bottom: 10px;
.circle{
border-radius: 50px;
width: 24px;
height: 24px;
border: 1px solid #CCCCCC;
font-size: 12px;
color: #666666;
line-height: 24px;
text-align: center;
margin: 0 auto;
box-sizing: border-box;
}
.txt{
font-size: 12px;
margin-top: 5px;
}
&:nth-child(5n+5){
margin-right: 0;
}
&.stu1{
.circle{
border: 2px solid #0FC118;
line-height: 22px;
}
}
&.stu2{
.circle{
border: 2px solid #C01540;
line-height: 22px;
}
}
&.stu3{
.circle{
color: #fff;
background: #999999;
}
}
}
}
}
.flag-tips{
width: 260px;
position: fixed;
bottom: 60px;
right:0;
display: flex;
justify-content: space-around;
padding: 15px 0 10px;
background: #fff;
margin: 0;
list-style: none;
li{
.circle1{
width: 24px;
height: 24px;
background: #EEEEEE;
border: 1px solid #CCCCCC;
border-radius: 50%;
}
.circle1{
width: 24px;
height: 24px;
border: 1px solid #CCCCCC;
border-radius: 50%;
}
.circle2{
width: 24px;
height: 24px;
border: 1px solid #CCCCCC;
border-radius: 50%;
}
.circle3{
width: 24px;
height: 24px;
border: 2px solid #0FC118;
border-radius: 50%;
}
.circle4{
position: relative;
width: 24px;
height: 24px;
border: 1px solid #CCCCCC;
border-radius: 50%;
&::after{
content: '';
position: absolute;
top: -1px;
right: -1px;
width: 4px;
height: 4px;
background: #C01540;
border-radius: 50%;
}
}
.txt{
margin-top: 5px;
font-size: 12px;
color: #CCCCCC;
line-height: 17px;
}
}
}
.flag-tips{
width: 260px;
position: fixed;
bottom: 60px;
right:0;
display: flex;
justify-content: space-around;
padding: 15px 0 10px;
background: #fff;
margin: 0;
list-style: none;
li{
.circle1{
width: 24px;
height: 24px;
background: #999;
border: 1px solid #999;
border-radius: 50%;
}
.circle2{
width: 24px;
height: 24px;
border: 1px solid #CCCCCC;
border-radius: 50%;
}
.circle3{
width: 24px;
height: 24px;
border: 2px solid #0FC118;
background: rgba(15, 193, 24, 0.1);
border-radius: 50%;
}
.circle4{
position: relative;
width: 24px;
height: 24px;
border: 1px solid #CCCCCC;
border-radius: 50%;
&::after{
content: '';
position: absolute;
top: -1px;
right: -1px;
width: 4px;
height: 4px;
background: #C01540;
border-radius: 50%;
}
}
.txt{
margin-top: 5px;
font-size: 12px;
color: #CCCCCC;
line-height: 17px;
}
}
}
.tips-box{
width: 260px;
position: fixed;
bottom: 60px;
right:0;
display: flex;
justify-content: space-around;
padding: 15px 0 10px;
background: #fff;
margin: 0;
list-style: none;
li{
&:nth-child(2){
margin: 0 50px;
}
.circle1{
width: 24px;
height: 24px;
background: #fff;
border: 2px solid #0FC118;
border-radius: 50%;
box-sizing: border-box;
}
.circle2{
width: 24px;
height: 24px;
border: 2px solid #C01540;
border-radius: 50%;
box-sizing: border-box;
}
.circle3{
width: 24px;
height: 24px;
background: #999999;
border-radius: 50%;
}
.circle4{
position: relative;
width: 24px;
height: 24px;
border: 1px solid #CCCCCC;
border-radius: 50%;
&::after{
content: '';
position: absolute;
top: -1px;
right: -1px;
width: 4px;
height: 4px;
background: #C01540;
border-radius: 50%;
}
}
.txt{
margin-top: 5px;
font-size: 12px;
color: #CCCCCC;
line-height: 17px;
}
}
}
</style>
差异被折叠。
<template>
<div>
<exam-topic :requestParam="$route.query" @goExamResult="goExamResult"></exam-topic>
</div>
</template>
<script>
export default {
mounted() {
},
methods: {
goExamResult(e) {
this.$router.replace({
path: '/mock/result',
query: e
})
}
},
metaInfo () {
return {
title: '答题',
meta: [
// { vmid: 'description', name: 'description', content: this.description }
]
}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div>
<exam-end @cardChange="cardChange"></exam-end>
</div>
</template>
<script>
export default {
data() {
return {
questionsData: null,
requestData: null
}
},
metaInfo () {
return {
title: '成绩报告',
meta: [
// { vmid: 'description', name: 'description', content: this.description }
]
}
},
methods: {
cardChange(e) {
this.$router.push({
path: '/exam/answer',
query: e
})
}
}
}
</script>
<style lang="scss" scoped>
</style>
......@@ -110,11 +110,6 @@ export default {
let sec = parseInt(time)
clearInterval(this.time.clearTime)
this.time.clearTime = setInterval(() => {
// if (this.requestParam.course_id) {
// this.time.examTimeText = this.secondToDate(sec)
// sec++
// } else {
// }
if (this.$route.query.id) {
this.time.examTimeText = '00:00:00'
return false
......
<template>
<div class="comp-x">
<div class="mock-box">
<div class="top-tit">
<div class="left">考试时间:90分钟</div>
<!-- <div class="right">总分100分</div> -->
</div>
<div class="top-tit">
<div class="left">考试通过:80分</div>
<div class="right">总分:100分</div>
</div>
<div class="top-tit">
<div class="left new-w">试题类型:</div>
<div class="txt">单项选择题、多项选择题、判断题和
案例题,全部为客观题</div>
</div>
<div class="intr">考试说明:</div>
<div class="answer-type">
<div class="tit">1.模考目的:</div>
<div class="type">
<p>考核道路运输企业主要负责人和安全生产管理人员对安全生产管理知识掌握程度</p>
<!-- <p>单选题共1题</p>
<p>单选题共1题</p> -->
</div>
</div>
<div class="answer-type">
<div class="tit">2.考核范围:</div>
<div class="type">
<p>道路运输安全生产相关法律法规及标准规范、道路运输企业安全生产主体责任、道路运输企业安全管理知识、道路运输安全生产务实务等内容</p>
<!-- <p>单选题共1题</p>
<p>单选题共1题</p> -->
</div>
</div>
<div class="answer-type">
<div class="tit">3.模考试卷:</div>
<div class="type">
<p>道路运输安全生产相关法律法规及标准规范、道路运输企业安全生产主体责任、道路运输企业安全管理知识、道路运输安全生产务实务等内容</p>
<!-- <p>单选题共1题</p>
<p>单选题共1题</p> -->
</div>
</div>
<div class="role-tit">选择角色:</div>
<div class="describe">请认真选择角色,选定后,真题实战题型会针对角色为您匹配最准确的题型!</div>
<div class="sele-role">
<div @click="changeActive(1)" :class="roleChange == 1 ? 'btn active' : 'btn'">
<i></i>
<div class="txt">管理人员</div>
</div>
<div @click="changeActive(2)" :class="roleChange == 2 ? 'btn active' : 'btn'">
<i></i>
<div class="txt">安全人员</div>
</div>
</div>
<div class="new-btit">试卷组卷比例见下表:</div>
<img src="../../assets/images/table.png" alt="" class="table">
<div class="start-exam">
<div class="b" @click="setRole">开始考试</div>
</div>
<div class="exam_submit" v-if="isExamPop">
<div class="pop">
<div class="tit">真题实战</div>
<div class="txt">您上次未做完试题</div>
<div class="btn_box">
<div class="btn" @click="goAbilityExam(1)">重新答题</div>
<div class="btn btn2" @click="goAbilityExam(0)">继续答题</div>
</div>
</div>
</div>
<div class="exam_submit" v-if="isExamPopTo">
<div class="pop">
<div class="tit">真题实战</div>
<div class="txt">考试还未结束确定退出考试?</div>
<div class="btn_box">
<div class="btn" @click="isExamPopTo = false">退出考试</div>
<div class="btn btn2" @click="goAbilityExam(0)">继续考试</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import * as api from '@/api/courseExam.js'
import * as apiMy from '@/api/account.js'
export default {
metaInfo () {
return {
title: '真题实战'
}
},
data() {
return {
roleChange: 1,
isExamPop: false,
isExamPopTo: false
}
},
mounted() {
apiMy.getUser().then(res => {
const userRole = parseInt(res.student_info.role)
if (parseInt(userRole) !== 0) {
this.roleChange = userRole
}
})
if (window.localStorage.isExamEnd === 'true') {
this.abilityExam()
}
},
methods: {
changeActive(e) {
this.roleChange = e
},
abilityExam() {
const param = {
type: 2
}
api.getExamStatus(param).then(res => {
if (parseInt(res.status) === 0 || parseInt(res.status) === 3) {
this.isExamPopTo = true
}
})
},
goAbilityExam(n) {
window.localStorage.isExamEnd = true
this.$router.push({
path: '/mock/answer',
query: {
type: 2,
is_create: n,
papersUrl: 'zy/v2/examination/examination-papers'
}
})
},
setRole() {
// if (this.$store.state.isVip) {
// const param = {
// type: 2
// }
// api.setRole({ role: this.roleChange }).then(res => {
// if (res.code === 0) {
// api.getExamStatus(param).then(res => {
// if (parseInt(res.status) === 0 || parseInt(res.status === 3)) {
// this.isExamPop = true
// } else {
// this.goAbilityExam(1)
// }
// })
// }
// })
// return false
// }
// this.$router.push({
// path: '/payPage'
// })
const param = {
type: 2
}
api.setRole({ role: this.roleChange }).then(res => {
if (res.code === 0) {
api.getExamStatus(param).then(res => {
if (res.status === '0' || res.status === 0 || res.status === '3' || res.status === 3) {
this.isExamPop = true
} else {
this.goAbilityExam(1)
}
})
}
})
}
},
beforeMount() {
// 检测是否是付费用户
this.$store.dispatch('checkIsVip')
}
}
</script>
<style lang="scss" scoped>
.comp-x{
padding-bottom: env(safe-area-inset-bottom);
}
.mock-box{
padding: 0 0.4rem 1rem 0.4rem;
}
.top-tit{
padding-top: .3rem;
// border-bottom: 0.01rem solid #EEE;
display: flex;
// line-height: 1.1rem;
div{
font-weight: bold;
font-size: .3rem;
color: #222;
line-height: 100%;
}
.new-w{
width: 2.5rem;
}
.txt{
font-weight: normal;
line-height: .4rem;
}
.right{
margin-left: auto;
}
}
.intr{
line-height: .6rem;
font-weight: bold;
font-size: .3rem;
color: #222;
}
.answer-type{
padding-bottom: .2rem;
display: flex;
.tit{
font-size: .26rem;
color: #222;
line-height: .4rem;
}
p{
line-height: 100%;
font-size: .26rem;
color: #222;
line-height: .4rem;
width: 5rem;
// font-weight: bold;
// margin-bottom: .2rem;
}
}
.role-tit{
line-height: 100%;
font-size: .3rem;
color: #222;
font-weight: bold;
margin: .4rem 0 .18rem 0;
}
.describe{
font-size: .26rem;
color: #222;
}
.sele-role{
width: 5.09rem;
margin: .4rem auto 0 auto;
display: flex;
.btn:nth-child(2){
margin-left: auto;
}
.btn{
width: 1.76rem;
height: .8rem;
border: 0.01rem solid #F47885;
display: flex;
justify-content: center;
border-radius: .1rem;
align-items: center;
.txt{
font-size: .26rem;
color: #222;
font-weight: bold;
}
i{
width: .28rem;
height: .28rem;
margin-right: .1rem;
background: url('../../assets/images/radio2.png');
background-size: 100% 100%;
}
}
.btn.active{
background:#F47885;
.txt{
color: #fff;
}
i{
background: url('../../assets/images/radio.png');
background-size: 100% 100%;
}
}
}
.start-exam{
position: fixed;
bottom: 0;
left: 0;
width:7.5rem;
height:1rem;
background:rgba(255,255,255,1);
box-shadow:0 0 .06 0px rgba(0,0,0,0.05);
padding-bottom: env(safe-area-inset-bottom);
.b{
width:6.7rem;
height:.7rem;
background:#C62245;
border-radius:.12rem;
margin: .15rem auto;
text-align: center;
line-height: .7rem;
color: #fff;
font-size: .3rem;
}
}
.exam_submit{
position: fixed;
top: 0;
left: 0;
z-index: 999999;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.6);
.pop{
width: 5.9rem;
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%,-50%);
background:rgba(255,255,255,1);
border-radius:.12rem;
padding: 0.4rem 0;
.tit{
font-weight:bold;
color:rgba(34,34,34,1);
font-size:.3rem;
text-align: center;
line-height: 100%;
}
.txt{
color:rgba(34,34,34,1);
font-size:.3rem;
text-align: center;
line-height: 100%;
margin-top: .8rem;
}
.btn_box{
padding:0 0.2rem;
display: flex;
margin-top: .8rem;
.btn{
width:2.6rem;
height:.7rem;
background:#C62245;
border-radius:.12rem;
text-align: center;
line-height: .7rem;
color: #fff;
font-size: .3rem;
}
.btn2{
margin-left: auto;
}
}
}
}
.new-btit{
font-size: .3rem;
color: #222;
line-height: 100%;
margin-top: .4rem;
font-weight: bold;
}
.table{
width: 6.79rem;
margin: 0.2rem auto;
display: block;
}
</style>
差异被折叠。
......@@ -121,5 +121,10 @@ export default [
path: '/mock/exam',
component: () => import(/* webpackChunkName: "course-learn" */ '@/pages/mockExam/exam/index')
},
/* 错题收藏全部列表详情 */
{
path: '/my/questions/details',
component: () => import(/* webpackChunkName: "course-learn" */ '@/pages/my/questions/questionDetails')
},
...viewerRoutes
]
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论