提交 01bcb2cb authored 作者: 王鹏飞's avatar 王鹏飞

bug fixes

上级 84211d17
...@@ -88,7 +88,7 @@ export default { ...@@ -88,7 +88,7 @@ export default {
// 已添加的试题总分 // 已添加的试题总分
addedQuestionsScore() { addedQuestionsScore() {
return this.addedQuestions.reduce((total, item) => { return this.addedQuestions.reduce((total, item) => {
return total + parseInt(item.score) return total + parseFloat(item.score)
}, 0) }, 0)
} }
}, },
......
...@@ -63,12 +63,7 @@ ...@@ -63,12 +63,7 @@
<el-table-column align="center" label="每题分值" width="140"> <el-table-column align="center" label="每题分值" width="140">
<template slot-scope="{ row }"> <template slot-scope="{ row }">
<el-input-number <el-input-number v-model="row.question_score" :min="0" :max="30" style="width: 100%"></el-input-number>
v-model="row.question_score"
:min="0"
step-strictly
style="width: 100%"
></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
...@@ -157,7 +152,6 @@ export default { ...@@ -157,7 +152,6 @@ export default {
question_num: '', question_num: '',
question_score: '', question_score: '',
question_categories: [], question_categories: [],
edit: true,
max_question_num: 0 max_question_num: 0
} }
return { return {
...@@ -185,13 +179,11 @@ export default { ...@@ -185,13 +179,11 @@ export default {
computed: { computed: {
// 试题数量总数 // 试题数量总数
questionTotalNum() { questionTotalNum() {
return this.getQuestionTotalNumberByProp('question_num') return this.getQuestionTotalNumber(this.questionList)
}, },
// 试题总分 // 试题总分
questionTotalScore() { questionTotalScore() {
return this.questionList.reduce((result, item) => { return this.getQuestionTotalScoreNumber(this.questionList)
return result + parseInt(item.question_score) * parseInt(item.question_num)
}, 0)
}, },
// 试题情况 // 试题情况
totalQuestionList() { totalQuestionList() {
...@@ -214,15 +206,15 @@ export default { ...@@ -214,15 +206,15 @@ export default {
return { return {
question_difficulty: item.value, question_difficulty: item.value,
question_difficulty_name: item.label, question_difficulty_name: item.label,
question_num: this.getQuestionTotalNumberByProp('question_num', currentDifficultyQuestionList), question_num: this.getQuestionTotalNumber(currentDifficultyQuestionList),
question_score: this.getQuestionTotalNumberByProp('question_score', currentDifficultyQuestionList) question_score: this.getQuestionTotalScoreNumber(currentDifficultyQuestionList)
} }
}) })
const temp = { const temp = {
question_type: item.question_type, question_type: item.question_type,
question_type_name: this.questionTypeMap.find(type => type.value === item.question_type)?.label, question_type_name: this.questionTypeMap.find(type => type.value === item.question_type)?.label,
question_num: this.getQuestionTotalNumberByProp('question_num', currentTypeQuestionList), question_num: this.getQuestionTotalNumber(currentTypeQuestionList),
question_score: this.getQuestionTotalNumberByProp('question_score', currentTypeQuestionList), question_score: this.getQuestionTotalScoreNumber(currentTypeQuestionList),
children: questionDifficultyList.filter(item => item.question_num) // 难度列表 children: questionDifficultyList.filter(item => item.question_num) // 难度列表
} }
result.push(temp) result.push(temp)
...@@ -232,9 +224,16 @@ export default { ...@@ -232,9 +224,16 @@ export default {
} }
}, },
methods: { methods: {
getQuestionTotalNumberByProp(prop, list = this.questionList) { // 获取试题数量
getQuestionTotalNumber(list = this.questionList) {
return list.reduce((result, item) => {
return result + parseFloat(item.question_num)
}, 0)
},
// 获取试题分数
getQuestionTotalScoreNumber(list = this.questionList) {
return list.reduce((result, item) => { return list.reduce((result, item) => {
return result + parseInt(item[prop]) return result + parseFloat(item.question_score) * parseFloat(item.question_num)
}, 0) }, 0)
}, },
// 新增 // 新增
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
<el-form-item label="试题类型">{{ data.question_type_name }}</el-form-item> <el-form-item label="试题类型">{{ data.question_type_name }}</el-form-item>
<el-form-item label="数量">{{ data.total }}</el-form-item> <el-form-item label="数量">{{ data.total }}</el-form-item>
<el-form-item label="每道试题分值" prop="score"> <el-form-item label="每道试题分值" prop="score">
<el-input-number v-model="form.score" :min="0" step-strictly :controls="false" /> <el-input-number v-model="form.score" :min="0" :controls="false" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
......
...@@ -16,10 +16,10 @@ ...@@ -16,10 +16,10 @@
</template> </template>
</template> </template>
<question-list <question-list
:list="questions" :list="currentQuestions"
:disableScore="data.paper_type === 2" :disableScore="data.paper_type === 2"
style="margin-top: 20px" style="margin-top: 20px"
v-if="questions.length" v-if="currentQuestions.length"
> >
<template v-slot:selection="item" v-if="data.paper_type === 1"> <template v-slot:selection="item" v-if="data.paper_type === 1">
<el-checkbox @change="handleSelectionChange(arguments[0], item)"></el-checkbox> <el-checkbox @change="handleSelectionChange(arguments[0], item)"></el-checkbox>
...@@ -30,9 +30,25 @@ ...@@ -30,9 +30,25 @@
</el-col> </el-col>
<!-- 试题序号 --> <!-- 试题序号 -->
<el-col :span="6" class="is-sticky"> <el-col :span="6" class="is-sticky">
<question-num :list="questions"> <question-num :list="currentQuestions">
<template #footer v-if="data.paper_type === 1"> <template #header>
<el-button type="primary" @click="handleSubmit">保存试卷</el-button> <div class="score">
<el-tooltip>
<div slot="content">所有试题总分</div>
<span class="question-total-number">{{ questionsTotalScore }}</span>
</el-tooltip>
<i>/</i>
<el-tooltip>
<div slot="content">试卷总分</div>
<span class="paper-total-score">{{ data.paper_total_score }}</span>
</el-tooltip>
<em></em>
</div>
</template>
<template #footer>
<template v-if="data.paper_type === 1">
<el-button type="primary" @click="handleSubmit">保存试卷</el-button>
</template>
</template> </template>
</question-num> </question-num>
</el-col> </el-col>
...@@ -81,6 +97,23 @@ export default { ...@@ -81,6 +97,23 @@ export default {
} }
} }
}, },
computed: {
// 有序试题列表
currentQuestions() {
// 试题类型map 1单选 2多选 6判断 3问答 5案例 8情景 7实操
// 试题展示顺序
const arr = [1, 2, 6, 3, 5, 8, 7]
return arr.reduce((result, item) => {
return result.concat(this.questions.filter(question => question.question_type === item))
}, [])
},
// 已添加的试题总分
questionsTotalScore() {
return this.questions.reduce((total, item) => {
return total + parseFloat(item.score)
}, 0)
}
},
methods: { methods: {
// 增加试题 // 增加试题
showSelectQuestion() { showSelectQuestion() {
...@@ -109,13 +142,28 @@ export default { ...@@ -109,13 +142,28 @@ export default {
}) })
} }
}) })
// 试题分数为0
for (const item of rules) {
if (!item.score) {
this.$message.error('存在分值为0分的试题,无法保存')
const scoreEl = document.querySelector('#score_' + item.id)
const top = scoreEl.getBoundingClientRect().top
// 滚动到该区域
window.scrollTo(0, top + document.documentElement.scrollTop - 86)
// 光标聚焦
const scoreInput = scoreEl.querySelector('input')
scoreInput.focus()
scoreInput.select()
return
}
}
const parmas = { id: this.data.id, rules } const parmas = { id: this.data.id, rules }
updatePaperRules(parmas).then(res => { updatePaperRules(parmas).then(res => {
this.$message.success('保存成功') this.$message.success('保存成功')
this.$emit('update') this.$emit('update')
}) })
}, },
// 更新详情数据 // 选题组卷更新试题
handleUpdate(list) { handleUpdate(list) {
this.questions = list this.questions = list
} }
...@@ -129,4 +177,19 @@ export default { ...@@ -129,4 +177,19 @@ export default {
top: 84px; top: 84px;
z-index: 100; z-index: 100;
} }
.score {
display: flex;
align-items: flex-end;
justify-content: center;
font-size: 40px;
line-height: 1;
margin-bottom: 20px;
color: #ccc;
em {
font-size: 14px;
}
}
.question-total-number {
color: var(--main-color);
}
</style> </style>
<template> <template>
<el-card style="margin-bottom: 20px" shadow="hover" :id="`question_index_${index}`"> <el-card style="margin-bottom: 20px" shadow="hover" :id="`question_${data.id}`">
<div class="question-item"> <div class="question-item">
<div class="question-item-selection"> <div class="question-item-selection">
<slot name="selection"></slot> <slot name="selection"></slot>
...@@ -9,11 +9,10 @@ ...@@ -9,11 +9,10 @@
<div class="question-item-hd-top"> <div class="question-item-hd-top">
<div class="question-index">{{ index }}</div> <div class="question-index">{{ index }}</div>
<div class="question-type">{{ questionTypeText }}</div> <div class="question-type">{{ questionTypeText }}</div>
<div class="question-score"> <div class="question-score" :id="`score_${data.id}`">
<p>分数:</p> <p>分数:</p>
<el-input-number <el-input-number
v-model="data.score" v-model="data.score"
step-strictly
:controls="false" :controls="false"
:min="0" :min="0"
:disabled="disableScore || hasChildren" :disabled="disableScore || hasChildren"
......
<template> <template>
<app-card> <app-card>
<div class="question-num"> <div class="question-num">
<div class="question-num-hd">
<slot name="header"></slot>
</div>
<div class="question-num-bd"> <div class="question-num-bd">
<ul> <dl v-for="item in questionGroups" :key="item.question_type">
<li :class="className" v-for="(item, index) in list" :key="index" @click="handleClick(index)"> <dt>{{ item.question_type_name }}</dt>
{{ index + 1 }} <dd>
</li> <ul>
</ul> <li
v-for="(item, index) in item.children"
:class="genClass(item)"
:key="index"
@click="handleClick(item)"
>
{{ index + 1 }}
</li>
</ul>
</dd>
</dl>
</div> </div>
<div class="question-num-ft"> <div class="question-num-ft">
<slot name="footer"></slot> <slot name="footer"></slot>
...@@ -23,23 +36,37 @@ export default { ...@@ -23,23 +36,37 @@ export default {
} }
}, },
data() { data() {
return { return {}
indexList: [],
currentIndex: 0 // 当前点击题号
}
}, },
computed: { computed: {
className() { questionGroups() {
return {} const map = { 1: '单选题', 2: '多选题', 3: '问答题', 5: '案例题', 6: '判断题', 7: '实操题', 8: '情景题' }
return this.list.reduce((result, item) => {
const temp = {
question_type: item.question_type,
question_type_name: map[item.question_type],
children: [{ ...item }]
}
const index = result.findIndex(item2 => item2.question_type === item.question_type)
if (index !== -1) {
result[index].children.push(item)
} else {
result.push(temp)
}
return result
}, [])
} }
}, },
methods: { methods: {
handleClick(index) { genClass(item) {
const qItemEl = document.querySelector(`#question_index_${index + 1}`) return {
'is-error': !item.score
}
},
handleClick(item) {
const qItemEl = document.querySelector(`#question_${item.id}`)
const top = qItemEl.getBoundingClientRect().top const top = qItemEl.getBoundingClientRect().top
window.scrollTo(0, top + document.documentElement.scrollTop - 84) window.scrollTo(0, top + document.documentElement.scrollTop - 84)
this.currentIndex = index
this.$emit('indexClick', `${index + 1}`)
} }
} }
} }
...@@ -47,6 +74,9 @@ export default { ...@@ -47,6 +74,9 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.question-num { .question-num {
display: flex;
flex-direction: column;
max-height: calc(100vh - 168px);
ul { ul {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
...@@ -61,18 +91,28 @@ export default { ...@@ -61,18 +91,28 @@ export default {
color: #666; color: #666;
cursor: pointer; cursor: pointer;
margin: 10px 5px; margin: 10px 5px;
} &:hover {
.dotItem { background-color: #ccc;
background-color: rgb(243, 190, 190); }
&.is-error {
border-color: var(--main-color);
}
} }
} }
} }
.question-num-hd {
margin-bottom: 20px;
border-bottom: 1px solid #eee;
}
.question-num-bd { .question-num-bd {
flex: 1;
overflow-y: auto; overflow-y: auto;
max-height: calc(100vh - 220px);
} }
.question-num-ft { .question-num-ft {
margin-top: 20px; position: sticky;
bottom: 0;
background-color: #fff;
padding: 20px 0;
text-align: center; text-align: center;
} }
</style> </style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论