提交 cbc9a7bb authored 作者: lihuihui's avatar lihuihui
......@@ -85,3 +85,15 @@ export function importStudent(data) {
withCredentials: true
})
}
/**
* 获取试卷详情
*/
export function getPaperDetails(params) {
return httpRequest.get('/api/exam/v1/exam/sheet-detail', { params })
}
/**
* 批改试卷
*/
export function submitPaper(data) {
return httpRequest.post('/api/exam/v1/exam/submit-sheet', data)
}
......@@ -50,7 +50,7 @@
</template>
<script>
import { updateExam } from '../api'
import { updateExam, getExamPaperDetail } from '../api'
import VEditor from '@/components/tinymce/Index.vue'
export default {
components: { VEditor },
......@@ -81,23 +81,32 @@ export default {
end_time() {
return this.exam_time[1]
},
row() {
return JSON.parse(this.$route.query.row)
exam_id() {
return this.$route.query.exam_id
}
},
mounted() {
if (this.$route.query.isEdit === '2' && this.row) {
this.exam_time = [this.row.start_time, this.row.end_time]
this.name = this.row.name
this.config.enabled_before = this.row.config.enabled_before
this.config.enabled_after = this.row.config.enabled_after
this.config.before_login = this.row.config.before_login
this.config.after_login = this.row.config.after_login
this.config.welcome_message = this.row.config.welcome_message
this.config.waiting_message = this.row.config.waiting_message
if (this.$route.query.isEdit === '2' && this.exam_id) {
this.getDetailInfo()
}
},
methods: {
getDetailInfo() {
getExamPaperDetail({ id: this.exam_id }).then(res => {
console.log(res)
const detailList = res.data.exam_info
// this.exam_time = [detailList.start_time, detailList.end_time]
this.name = detailList.name
const config = JSON.parse(detailList.config)
this.config.enabled_before = config.enabled_before
this.config.enabled_after = config.enabled_after
this.config.before_login = config.before_login
this.config.after_login = config.after_login
this.config.welcome_message = config.welcome_message
this.config.waiting_message = config.waiting_message
})
},
// 下一步
nextStep() {
const params = {
name: this.name,
......@@ -124,7 +133,7 @@ export default {
},
saveExamInfo() {
const params = {
id: this.row.exam_id,
id: this.exam_id,
type: 'basic',
name: this.name,
start_time: this.start_time,
......
......@@ -26,7 +26,7 @@
</template>
<script>
import { getExamPaperList, updateExam } from '../api'
import { getExamPaperList, updateExam, getExamPaperDetail } from '../api'
export default {
data() {
return {
......@@ -54,7 +54,10 @@ export default {
this.ExamParerList.push({ label: b.paper_title, key: b.id })
return this.ExamParerList
}, [])
this.getCheckedExam()
// this.getCheckedExam()
if (this.$route.query.exam_id && this.$route.query.isEdit === '2') {
this.getDetailInfo() // 获取详情
}
})
},
lastStep() {
......@@ -80,23 +83,24 @@ export default {
this.$emit('getCheckPaperList', this.checkedArrs)
},
saveExamInfo() {
const params = { id: this.$route.query.id, type: 'paper', exam_paper: this.q.toString() }
const params = { id: this.$route.query.exam_id, type: 'paper', exam_paper: this.q.toString() }
updateExam(params).then(res => {
history.go(-1)
})
},
getCheckedExam() {
if (this.$route.query.papers) {
const papers = JSON.parse(this.$route.query.papers)
getDetailInfo() {
getExamPaperDetail({ id: this.$route.query.exam_id }).then(res => {
const parperList = res.data.exam_info.paper_list
console.log(parperList)
const arr = []
papers.forEach(element => {
parperList.forEach(element => {
const findItem = this.ExamParerList.find(item => {
return item.label === element
return item.label === element.paper_title
}).key
findItem && arr.push(findItem)
})
this.q = arr
}
})
}
},
mounted() {
......
......@@ -95,11 +95,7 @@ export default {
}
}
},
computed: {
row() {
return JSON.parse(this.$route.query.row)
}
},
methods: {
lastStep() {
this.$parent.$parent.lastStep()
......@@ -110,7 +106,7 @@ export default {
},
saveExamInfo() {
const params = {
id: JSON.parse(this.$route.query.row).exam_id,
id: this.$route.query.exam_id,
type: 'config',
config: {
enabled_ip_limit: this.config.enabled_ip_limit,
......@@ -131,7 +127,7 @@ export default {
},
getDetail() {
const params = {
id: JSON.parse(this.$route.query.row).exam_id
id: this.$route.query.exam_id
}
getExamPaperDetail(params).then(res => {
const config = JSON.parse(res.data.exam_info.config)
......@@ -149,7 +145,7 @@ export default {
}
},
mounted() {
if (this.$route.query.isEdit === '2' && JSON.parse(this.$route.query.row)) {
if (this.$route.query.isEdit === '2' && this.$route.query.exam_id) {
this.getDetail()
}
}
......
<template>
<el-card class="container">
<div slot="header" class="clearfix">
<span>{{options.question_item_title}}</span>
</div>
<div class="content">
<template v-for="item in options.question_list">
<div class="sub-content" v-if="item.group_id" :key="item.id">
<div class="title" v-html="item.common_content"></div>
<div class="sub-container">
<question-item v-for="subItem in item.list" :key="subItem.id" :question="{item: subItem, question_item_id, questionType}" :question_item_id="question_item_id" />
</div>
</div>
<question-item v-else :question="{item, question_item_id, questionType}" :question_item_id="question_item_id" :key="item.id" />
</template>
</div>
</el-card>
</template>
<script>
import QuestionItem from './QuestionItem.vue'
export default {
props: {
options: {
type: Object,
default() {
return {}
}
},
question_item_id: {
type: String
}
},
components: { QuestionItem },
data() {
return {}
},
computed: {
questionType() {
return this.options.question_item_type
},
// 选项类型
questionTypeText() {
const map = { 1: '单选题', 2: '多选题', 3: '问答题', 5: '案例题', 6: '判断题', 7: '实操题', 8: '情景题' }
return map[this.questionType]
}
},
created() {
// console.log(this.options)
}
}
</script>
<style lang="scss" scoped>
.container{
background:#fff;
border:1px solid #f3f3f3;
margin-bottom:20px;
border-radius:6px;
::v-deep .el-card__body{
padding:10px 20px;
}
.content{
// border:1px solid #f3f3f3;
padding:10px;
.title{
line-height:40px;
font-size:16px;
}
.sub-container{
border:1px solid #e3e3e3;
padding:15px 15px 0;
border-radius:4px;
}
.sub-content{
margin-bottom:20px;
}
.question-item:last-child{
border:none;
}
}
}
</style>
......@@ -135,7 +135,7 @@ export default {
},
getDetail() {
const params = {
id: JSON.parse(this.$route.query.row).exam_id
id: this.$route.query.exam_id
}
getExamPaperDetail(params).then(res => {
const list = JSON.parse(res.data.exam_info.config).info
......@@ -148,7 +148,7 @@ export default {
},
saveExamInfo() {
const params = {
id: JSON.parse(this.$route.query.row).exam_id,
id: this.$route.query.exam_id,
type: 'student',
config: {
info: {
......@@ -170,7 +170,7 @@ export default {
}
},
mounted() {
if (this.$route.query.isEdit === '2') {
if (this.$route.query.isEdit === '2' && this.$route.query.exam_id) {
this.getDetail()
}
}
......
<template>
<div class="question-item">
<div class="question-item-title" v-html="questionData.content"></div>
<template v-if="questionType === 1 || questionType === 6">
<el-radio-group v-model="questionData.answer[0]" :disabled="true" class="question-item-content" >
<div class="question-item-option" v-for="subItem in questionData.options" :key="subItem.id">
<el-radio :label="subItem.id">{{ subItem.option }}</el-radio>
</div>
</el-radio-group>
</template>
<template v-if="questionType === 2">
<el-checkbox-group v-model="questionData.answer" :disabled="true" class="question-item-content" >
<div class="question-item-option" v-for="subItem in questionData.options" :key="subItem.id">
<el-checkbox :label="subItem.id"> {{ subItem.option }} </el-checkbox>
</div>
</el-checkbox-group>
</template>
<template v-if="questionType === 3">
<div class="SAQ">{{questionData.answer || ''}}</div>
<div style="text-align:right;">
<el-button type="primary" size="mini" plain @click="showComment = !showComment">点击评分</el-button>
</div>
<div class="comment" v-show="showComment">
<div class="comment-top">
<p>本题{{questionData.score}}</p>
<div class="get-score">
学生得分:<el-input-number v-model="questionData.get_score" controls-position="right" :min="0" :max="questionData.score" size="mini"></el-input-number>
</div>
</div>
<el-input type="textarea" placeholder="请输入评语" v-model="comment" rows="3"/>
<div style="text-align:center;padding-top:10px;">
<el-button type="primary" size="mini" @click="handleComment">提交点评</el-button>
</div>
</div>
</template>
<div class="question-item-score">得分:{{questionData.get_score}}分</div>
</div>
</template>
<script>
import { submitPaper } from '../api.js'
export default {
props: {
question: {
type: Object,
default() {
return {}
}
},
question_item_id: {
type: String
}
},
data() {
return {
questionData: {},
showComment: false,
comment: ''
}
},
computed: {
questionType() {
// 1单选,2多选,3简答,5案例题, 6判断, 7实操,8情景
const type = this.questionData.type || this.question.questionType || 1
return parseInt(type)
},
eid() {
return this.$route.query.eid
}
// // 选项类型
// questionTypeText() {
// const map = { 1: '单选题', 2: '多选题', 3: '问答题', 5: '案例题', 6: '判断题', 7: '实操题', 8: '情景题' }
// return map[this.questionType]
// }
},
created() {
this.questionData = JSON.parse(JSON.stringify(this.question.item))
console.log(this.question)
},
methods: {
handleComment() {
console.log(this.question_item_id)
console.log(this.questionData)
this.fetchComment()
},
fetchComment() {
const params = {
sheet_id: this.eid,
question_item_id: this.question_item_id,
question_id: this.questionData.id,
score: this.questionData.get_score,
comment: this.comment
}
submitPaper(params).then(res => {
if (res.code === 0) {
this.$message.success('提交点评成功')
} else {
this.$message.success('提交点评失败')
}
})
}
}
}
</script>
<style lang="scss" scoped>
.question-item{
font-size:14px;
color:#454545;
border-bottom:1px solid #f3f3f3;
margin-bottom:10px;
.question-item-content{
padding-left:10px;
.question-item-option{
padding-top:10px ;
}
}
.SAQ{
min-height:60px;
font-size:14px;
line-height:24px;
color:#888;
border:1px solid #eee;
background:#f3f3f3;
margin:10px 0;
border-radius:6px;
}
.comment{
border:1px solid rgba(192,28,64, .3);
border-radius:4px;
padding:10px;
margin-top:15px;
background:#f9f9f9;
.comment-top{
display: flex;
margin-bottom:10px;
p{
flex:1;
}
}
}
.question-item-score{
color:#777;
padding:10px 0;
}
}
</style>
......@@ -25,6 +25,11 @@ const routes = [
component: () => import('./views/Detail.vue'),
meta: { title: '考试详情' }
},
{
path: 'markingPaper',
component: () => import('./views/MarkingPaper.vue'),
meta: { title: '批阅试卷' }
},
{
path: 'createStudent',
component: () => import('./views/CreateStudent.vue'),
......
......@@ -13,9 +13,7 @@
<el-dropdown-item @click.native="dialogVisible = true" :disabled="this.multipleSelection.length === 0"
>转移考生</el-dropdown-item
>
<el-dropdown-item @click.native="exportDetail" :disabled="this.multipleSelection.length === 0"
>导出明细</el-dropdown-item
>
<el-dropdown-item @click.native="exportDetail">导出明细</el-dropdown-item>
<el-dropdown-item @click.native="delStudent" :disabled="this.multipleSelection.length === 0"
>删除考生</el-dropdown-item
>
......@@ -59,15 +57,15 @@ import {
getTranserList,
transferStudent
} from '../api'
const stuStatus = [
{ id: '1', name: '未开考' },
{ id: '2', name: '已登录' },
{ id: '3', name: '考试中' },
{ id: '4', name: '已中断' },
{ id: '5', name: '已提交' },
{ id: '6', name: '已完成' },
{ id: '7', name: '待批阅' }
]
// const stuStatus = [
// { id: '1', name: '未开考' },
// { id: '2', name: '已登录' },
// { id: '3', name: '考试中' },
// { id: '4', name: '已中断' },
// { id: '5', name: '已提交' },
// { id: '6', name: '已完成' },
// { id: '7', name: '待批阅' }
// ]
export default {
data() {
return {
......@@ -84,7 +82,7 @@ export default {
remote: {
httpRequest: getExamPaperDetail,
params: {
id: this.row.exam_id
id: this.exam_id
}
},
filters: [
......@@ -99,20 +97,32 @@ export default {
type: 'input',
prop: 'school',
label: '学校'
},
{
type: 'select',
prop: 'relation_status',
placeholder: '请选择考生状态',
options: stuStatus,
labelKey: 'name',
valueKey: 'id',
label: '考生状态'
}
// {
// type: 'select',
// prop: 'relation_status',
// placeholder: '请选择考生状态',
// options: stuStatus,
// labelKey: 'name',
// valueKey: 'id',
// label: '考生状态'
// }
],
columns: [
{ type: 'selection', minWidth: '50px', fixed: 'left' },
{ label: '考生状态', prop: 'exam_status' },
{
label: '试卷状态',
prop: 'sheet.status',
computed({ row }) {
if (row.sheet.status === 0) {
return '未提交'
} else if (row.sheet.status === 1) {
return '待批阅'
} else if (row.sheet.status === 2) {
return '已批改'
}
}
},
{ label: '准考证号', prop: 'examinee_number' },
{ label: '身份证号', prop: 'id_number' },
{ label: '电话', prop: 'mobile' },
......@@ -125,12 +135,18 @@ export default {
]
}
},
row() {
return JSON.parse(this.$route.query.row)
exam_id() {
return this.$route.query.exam_id
}
},
methods: {
handleDetail() {},
handleDetail(row) {
console.log(row)
this.$router.push({
path: 'markingPaper',
query: { eid: this.exam_id, sid: row.student_id }
})
},
// 获取选中项
handleSelectionChange(val) {
this.multipleSelection = val
......@@ -138,7 +154,7 @@ export default {
// 复制考试地址
copyExamUrl() {
const copyDom = document.querySelector('#copyInput')
copyDom.value = window.location.origin + '/login/' + this.row.exam_id
copyDom.value = window.location.origin + '/login/' + this.exam_id
copyDom.select() // 选择对象
document.execCommand('Copy')
this.$message({
......@@ -150,19 +166,18 @@ export default {
handleAddStudent() {
this.$router.push({
path: 'createStudent',
query: { id: this.row.exam_id }
query: { id: this.exam_id }
})
},
// 考试信息编辑
editExamInfo() {
this.$router.push({ path: 'baseInfo', query: { row: JSON.stringify(this.row), isEdit: '2' } })
this.$router.push({ path: 'baseInfo', query: { exam_id: this.exam_id, isEdit: '2' } })
},
// 考试试卷编辑
editExam() {
console.log(this.row)
this.$router.push({
path: 'checkPaper',
query: { papers: JSON.stringify(this.row.papers), isEdit: '2', id: this.row.exam_id }
query: { exam_id: this.exam_id, isEdit: '2' }
})
},
// 信息采集编辑
......@@ -170,7 +185,7 @@ export default {
this.$router.push({
path: 'personalInfo',
query: {
row: JSON.stringify(this.row),
exam_id: this.exam_id,
isEdit: '2'
}
})
......@@ -180,7 +195,7 @@ export default {
this.$router.push({
path: 'examSetting',
query: {
row: JSON.stringify(this.row),
exam_id: this.exam_id,
isEdit: '2'
}
})
......@@ -196,7 +211,7 @@ export default {
// 导出明细
exportDetail() {
const params = {
id: this.row.exam_id,
id: this.exam_id,
name: '',
relation_status: '',
school: ''
......@@ -221,7 +236,7 @@ export default {
confirmButtonText: '确定'
}).then(() => {
const studentId = this.multipleSelection.map(item => item.student_id).toString()
const params = { exam_id: this.row.exam_id, students_id: studentId }
const params = { exam_id: this.exam_id, students_id: studentId }
sendMessage(params).then(res => {
this.$message.success('信息发送成功')
})
......@@ -229,7 +244,7 @@ export default {
},
// 获取转移考生列表
getTransferList() {
getTranserList({ exam_id: this.row.exam_id }).then(res => {
getTranserList({ exam_id: this.exam_id }).then(res => {
this.transferList = res.data.list
})
},
......@@ -237,7 +252,7 @@ export default {
transferStudent() {
const params = {
transfer_exam_id: this.transfer_exam_id,
exam_id: this.row.exam_id,
exam_id: this.exam_id,
student_ids: this.multipleSelection.map(item => item.student_id).toString()
}
transferStudent(params).then(res => {
......
......@@ -95,7 +95,7 @@ export default {
this.$router.push({
path: 'examDetail',
query: {
row: JSON.stringify(row)
exam_id: row.exam_id
}
})
},
......
差异被折叠。
......@@ -29,7 +29,8 @@ export default defineConfig(({ mode }) => {
rewrite: path => path.replace(/^\/api\/qbs/, '')
},
'/api/exam': {
target: 'https://x-exam-admin-api.ezijing.com',
// target: 'https://x-exam-admin-api.ezijing.com',
target: 'http://localhost-exam-admin.ezijing.com',
changeOrigin: true,
rewrite: path => path.replace(/^\/api\/exam/, '')
},
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论