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

updates

上级 47c73abe
...@@ -32,3 +32,10 @@ export function uploadFile(data) { ...@@ -32,3 +32,10 @@ export function uploadFile(data) {
export function getAllProjects() { export function getAllProjects() {
return httpRequest.get('/api/qbs/admin/v1/projects') return httpRequest.get('/api/qbs/admin/v1/projects')
} }
/**
* 获取试卷分类
*/
export function getQuestionCategory(params) {
return httpRequest.get(`/api/qbs/admin/v1/question-category/tree/${params.project_prefix}`, { params })
}
...@@ -163,7 +163,7 @@ export default { ...@@ -163,7 +163,7 @@ export default {
.then(res => { .then(res => {
const { data = {} } = res || {} const { data = {} } = res || {}
this.page.total = parseInt(data.total || 0) this.page.total = parseInt(data.total || 0)
this.dataList = callback ? callback(data) : data.list this.dataList = callback ? callback(data) : data.list || data.data
}) })
.catch(() => { .catch(() => {
this.page.total = 0 this.page.total = 0
......
<template>
<el-cascader
clearable
:options="options"
:props="defaultProps"
v-on="$listeners"
@change="handleChange"
></el-cascader>
</template>
<script>
import { getQuestionCategory } from '@/api/base.js'
export default {
data() {
return {
options: [],
defaultProps: {
label: 'category_name',
value: 'id',
checkStrictly: true
}
}
},
computed: {
activeProject() {
return this.$store.state.activeProject || {}
}
},
beforeMount() {
this.getQuestionCategory()
},
methods: {
getQuestionCategory() {
getQuestionCategory({ project_prefix: this.activeProject.tag }).then(res => {
// 移除空数组
const options = JSON.parse(JSON.stringify(res.data).replaceAll(',"children":[]', ''))
this.options = options
})
},
handleChange(value = []) {
const lastValue = value[value.length - 1]
this.$emit('input', lastValue)
}
}
}
</script>
<style></style>
...@@ -38,7 +38,7 @@ export default { ...@@ -38,7 +38,7 @@ export default {
name: '试卷中心', name: '试卷中心',
path: '/paper', path: '/paper',
icon: 'el-icon-toilet-paper', icon: 'el-icon-toilet-paper',
children: [{ name: '我的试卷库', path: '/paper/list' }] children: [{ name: '我的试卷库', path: '/paper' }]
}, },
{ {
name: '考试中心', name: '考试中心',
......
...@@ -10,17 +10,33 @@ export function getKnowledge(params) { ...@@ -10,17 +10,33 @@ export function getKnowledge(params) {
* 获取试卷列表 * 获取试卷列表
*/ */
export function getPaperList(params) { export function getPaperList(params) {
return httpRequest.get('/api/qbs/admin/v1/question-papers/x1', { params }) return httpRequest.get(`/api/qbs/admin/v1/question-papers/${params.project_prefix}`, { params })
} }
/** /**
* 新建试卷 * 新建试卷
*/ */
export function createNewPaper(data) { export function createPaper(data) {
return httpRequest.post('/api/qbs/admin/v1/question-paper', data) return httpRequest.post('/api/qbs/admin/v1/question-paper', data)
} }
/**
* 更新试卷
*/
export function updatePaper(data) {
return httpRequest.put(`/api/qbs/admin/v1/question-paper/${data.id}`, data)
}
/**
* 获取试卷详情
*/
export function getPaper(params) {
return httpRequest.get(`/api/qbs/admin/v1/question-paper/${params.id}`, { params })
}
/** /**
* 获取试卷分类 * 获取试卷分类
*/ */
export function getPaperCategory(params) { export function getPaperCategory(params) {
return httpRequest.get(`/api/qbs/admin/v1/question-category/tree/${params}`, { params }) return httpRequest.get(`/api/qbs/admin/v1/question-category/tree/${params.project_prefix}`, { params })
} }
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
<el-row :gutter="20"> <el-row :gutter="20">
<!-- 试题列表 --> <!-- 试题列表 -->
<el-col :span="18"> <el-col :span="18">
<el-card id="questionMain" <el-card id="questionMain">
><div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span class="clearfix_tit"> 试题列表</span> <span class="clearfix_tit"> 试题列表</span>
<el-button class="clearfix_del" type="primary" @click="delCheckedQuestion" v-if="questionList.length > 0" <el-button class="clearfix_del" type="primary" @click="delCheckedQuestion" v-if="questionList.length > 0"
>删除所选试题</el-button >删除所选试题</el-button
......
<template>
<el-dialog title="添加试卷试题" v-bind="$attrs" v-on="$listeners"></el-dialog>
</template>
<script>
export default {
props: { data: { type: Object, default: () => ({}) } },
data() {
return {}
}
}
</script>
<style></style>
...@@ -5,33 +5,32 @@ const routes = [ ...@@ -5,33 +5,32 @@ const routes = [
path: '/paper', path: '/paper',
component: AppLayout, component: AppLayout,
meta: { title: '试卷中心' }, meta: { title: '试卷中心' },
redirect: '/paper/list',
children: [ children: [
{
path: '',
redirect: '/paper/list'
},
{ {
path: 'list', path: 'list',
component: () => import('./views/List.vue'), component: () => import('./views/List.vue'),
meta: { title: '我的试卷库' } meta: { title: '我的试卷库' }
}, },
{ {
path: 'newPaper', name: 'createPaper',
name: 'newPaper', path: 'create',
component: () => import('./views/NewPaper.vue'), component: () => import('./views/NewPaper.vue'),
meta: { title: '新建试卷' } meta: { title: '新建试卷' }
}, },
{ {
path: 'newPapers', name: 'editPaper',
name: 'newPaper', path: 'update/:id',
component: () => import('./views/NewPaper.vue'), component: () => import('./views/NewPaper.vue'),
meta: { title: '编辑试卷' } meta: { title: '编辑试卷' },
props: true
}, },
{ {
path: 'detail', name: 'viewPaper',
name: 'detail', path: 'detail/:id',
component: () => import('./views/Detail.vue'), component: () => import('./views/Detail.vue'),
meta: { title: '试卷详情' } meta: { title: '试卷详情' },
props: true
} }
] ]
} }
......
<template> <template>
<div> <div>
<!-- 试卷描述 --> <!-- 试卷描述 -->
<el-card> <app-card title="试卷信息">
<el-descriptions :column="2" class="descriptionsCon"> <template #header-aside>
<template slot="extra"> <el-button type="primary" size="mini" @click="handleUpdate">编辑试卷</el-button>
<el-button type="primary" @click="editPaper">编辑试卷</el-button>
</template> </template>
<el-descriptions-item label="试卷名称">{{ paperDetail.paperName }}</el-descriptions-item> <el-descriptions :column="2" class="descriptionsCon">
<el-descriptions-item label="标签">1111</el-descriptions-item> <el-descriptions-item label="试卷名称">{{ detail.paper_title }}</el-descriptions-item>
<el-descriptions-item label="试卷分类">{{ paperDetail.paperType }}</el-descriptions-item> <el-descriptions-item label="标签">{{ detail.paper_labels }}</el-descriptions-item>
<el-descriptions-item label="组卷模式">{{ paperDetail.paperMode }}</el-descriptions-item> <el-descriptions-item label="试卷分类">{{ detail.paper_category }}</el-descriptions-item>
<el-descriptions-item label="试卷总分">{{ paperDetail.paperTotalScore }}</el-descriptions-item> <el-descriptions-item label="组卷模式">{{ detail.paper_type }}</el-descriptions-item>
<el-descriptions-item label="及格分数">{{ paperDetail.paperPassScore }}</el-descriptions-item> <el-descriptions-item label="试卷总分">{{ detail.paper_total_score }}</el-descriptions-item>
<el-descriptions-item label="考试时长">40分钟</el-descriptions-item> <el-descriptions-item label="及格分数">{{ detail.pass_score }}</el-descriptions-item>
<el-descriptions-item label="最短交卷时长">20分钟</el-descriptions-item> <el-descriptions-item label="考试时长">{{ detail.paper_times }}分钟</el-descriptions-item>
<el-descriptions-item label="试题顺序">固定</el-descriptions-item> <el-descriptions-item label="最短交卷时长">{{ detail.minimum_paper_handing_time }}分钟</el-descriptions-item>
<el-descriptions-item label="多次考试"></el-descriptions-item> <el-descriptions-item label="试题顺序">{{ detail.paper_question_order }}</el-descriptions-item>
<el-descriptions-item label="多次考试成绩计算规则">平均计算法 </el-descriptions-item> <el-descriptions-item label="多次考试">{{ detail.is_multiple_exams }}</el-descriptions-item>
<el-descriptions-item label="多次考试成绩计算规则">{{ detail.multiple_test_score_rule }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-card> </app-card>
<!-- 试卷列表 --> <!-- 试卷列表 -->
<QuestionList :paperMode="paperDetail.paperMode" :paperTotalScore="paperDetail.paperTotalScore" /> <QuestionList :paperMode="detail.paperMode" :paperTotalScore="detail.paperTotalScore" />
</div> </div>
</template> </template>
<script> <script>
import QuestionList from '../components/QuestionList.vue' import QuestionList from '../components/QuestionList.vue'
import { getPaper } from '../api.js'
export default { export default {
props: { id: { type: String } },
components: { QuestionList }, components: { QuestionList },
computed: { data() {
paperDetail() { return {
return JSON.parse(this.$route.query.paperDetail) detail: {}
} }
}, },
// watch: { computed: {},
// paperDetail: { beforeMount() {
// paperDetail: { this.getDetail()
// immediate: true, },
// handler(data) {
// this.form = Object.assign({}, this.form, data)
// }
// }
// }
// },
methods: { methods: {
// 编辑试卷 // 获取试卷详情
editPaper() { getDetail() {
this.$router.push({ getPaper({ id: this.id }).then(res => {
path: 'newPaper', this.detail = Object.assign({}, this.detail, res.data)
query: {
paperDetail: this.paperDetail,
isEdit: true
}
}) })
},
// 编辑试卷
handleUpdate() {
this.$router.push({ name: 'editPaper', params: { id: this.detail.id } })
} }
} }
} }
......
...@@ -2,65 +2,49 @@ ...@@ -2,65 +2,49 @@
<app-card> <app-card>
<app-list v-bind="tableOptions" ref="list" @selection-change="handleSelectionChange"> <app-list v-bind="tableOptions" ref="list" @selection-change="handleSelectionChange">
<div class="btn_operate"> <div class="btn_operate">
<el-button type="primary" icon="el-icon-plus" @click="handleCreatePaper">新建试卷</el-button> <el-button type="primary" icon="el-icon-plus" @click="handleCreate">新建试卷</el-button>
<el-button type="primary" icon="el-icon-plus" @click="batchDelete">批量删除</el-button> <el-button type="primary" icon="el-icon-delete" @click="batchDelete">批量删除</el-button>
</div>
<template v-slot:input-filter>
<div class="filter-input">
<el-select v-model="filterInput" placeholder="请选择试题分类">
<el-option :label="treeValue.name" :value="treeValue.id"></el-option>
</el-select>
<div class="pop" @click="dialogVisible = true"></div>
</div> </div>
<template v-slot:filter-category="{ params }">
<question-type-cascader v-model="params.paper_category"></question-type-cascader>
</template> </template>
<template v-slot:table-x="{ row }"> <template v-slot:table-x="{ row }">
<el-button type="text" @click="handleDdit(row)">编辑</el-button> <el-button type="text" @click="handleUpdate(row)">编辑</el-button>
<el-button type="text" @click="handleDetail(row)">查看详情</el-button> <el-button type="text" @click="handleView(row)">查看详情</el-button>
<el-button type="text" @click="handleDelete(row)">删除</el-button> <el-button type="text" @click="handleDelete(row)">删除</el-button>
</template> </template>
<el-dialog title="提示" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
<el-tree
:data="treeList"
:props="defaultProps"
@node-click="handleNodeClick"
:expand-on-click-node="false"
></el-tree>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="dialogConfirm">确 定</el-button>
</span>
</el-dialog>
</app-list> </app-list>
</app-card> </app-card>
</template> </template>
<script> <script>
import { getPaperList, getPaperCategory } from '../api' import { getPaperList } from '../api'
import QuestionTypeCascader from '@/components/base/QuestionTypeCascader.vue'
const paperType = [ const paperType = [
{ label: '选题组卷', value: 0 }, { label: '选题组卷', value: 1 },
{ label: '自动组卷', value: 1 } { label: '自动组卷', value: 2 }
] ]
export default { export default {
components: { QuestionTypeCascader },
data() { data() {
return { return {
visible: false, visible: false,
multipleSelection: [], // 选择项 multipleSelection: [], // 选择项
treeList: [], paperCategoryList: []
dialogVisible: false,
defaultProps: '',
filterInput: '',
treeValue: {
name: '',
id: ''
}
} }
}, },
computed: { computed: {
activeProject() {
return this.$store.state.activeProject || {}
},
tableOptions() { tableOptions() {
return { return {
remote: { remote: {
httpRequest: getPaperList, httpRequest: getPaperList,
params: { params: {
project_prefix: this.activeProject.tag,
id: '', id: '',
paper_title: '', paper_title: '',
paper_type: '', paper_type: '',
...@@ -92,111 +76,47 @@ export default { ...@@ -92,111 +76,47 @@ export default {
}, },
{ {
slots: 'input-filter', type: 'select',
prop: 'question_category', prop: 'paperType',
type: 'input', label: '试卷分类:',
label: '试卷分类:' slots: 'filter-category'
} }
], ],
columns: [ columns: [
{ type: 'selection', minWidth: '50px', fixed: 'left' }, { type: 'selection', width: '50px', fixed: 'left' },
{ type: 'index', label: '序号', minWidth: '50px', fixed: 'left' }, { type: 'index', label: '序号', minWidth: '50px', fixed: 'left' },
{ label: '组卷模式', prop: 'paper_type' }, { label: '组卷模式', prop: 'paper_type' },
{ label: '试卷分类', prop: 'paper_category' }, { label: '试卷分类', prop: 'paper_category' },
{ label: '试卷名称', prop: 'paper_title' }, { label: '试卷名称', prop: 'paper_title' },
{ label: '总分', prop: 'paper_total_score' }, { label: '总分', prop: 'paper_total_score' },
{ label: '及格分数', prop: 'paperPassScore' }, { label: '及格分数', prop: 'pass_score' },
{ label: '更新人', prop: 'operator.username' }, { label: '更新人', prop: 'operator.realname' },
{ label: '更新时间', prop: 'updated_at' }, { label: '更新时间', prop: 'updated_at' },
{ label: '操作', slots: 'table-x', align: 'right', width: 150 } { label: '操作', slots: 'table-x', align: 'right', width: 150 }
] ]
} }
} }
}, },
mounted() {
// 获取试卷分类
this.getTreeList()
},
methods: { methods: {
getTreeList() {
getPaperCategory('x1').then(res => {
if (Array.isArray(res.data)) {
this.initTree(res.data)
}
})
},
// 过滤数据 变成tree组件需要的数据
initTree(data) {
this.treeList = data.reduce((a, b) => {
b.label = b.category_name
if (b.children.length) {
setData(b.children)
}
a.push(b)
return a
}, [])
function setData(item) {
return item.map(element => {
if (element.children.length) {
setData(element.children)
element.label = element.category_name
} else {
element.label = element.category_name
}
return element
})
}
},
handleNodeClick(data) {
this.treeValue.name = data.label
this.treeValue.id = data.id
},
handleClose() {
this.treeValue.name = ''
this.treeValue.id = ''
this.dialogVisible = false
},
dialogConfirm() {
this.dialogVisible = false
this.filterInput = this.treeValue.name
this.$refs.list.refetch()
},
// 新建试卷 // 新建试卷
handleCreatePaper() { handleCreate() {
this.$router.push({ this.$router.push({ name: 'createPaper' })
path: 'newPaper',
query: { isEdit: false }
})
}, },
// 编辑试卷 // 编辑试卷
handleDdit(row) { handleUpdate(row) {
console.log(row) this.$router.push({ name: 'editPaper', params: { id: row.id } })
this.$router.push({ },
path: 'newPapers', // 查看详情
query: { handleView(row) {
rowDetail: row, this.$router.push({ name: 'viewPaper', params: { id: row.id } })
isEdit: true
}
})
}, },
handleSelectionChange(val) { handleSelectionChange(val) {
this.multipleSelection = val this.multipleSelection = val
console.log(val)
}, },
// 批量删除 // 批量删除
batchDelete() { batchDelete() {
console.log('111') console.log('111')
}, },
// 查看详情
handleDetail(row) {
this.$router.push({
path: 'detail',
query: {
paperDetail: JSON.stringify(row)
}
})
},
// 单个删除 // 单个删除
handleDelete(row) { handleDelete(row) {
// this.$refs.list.refetch() // this.$refs.list.refetch()
......
<template> <template>
<el-form ref="form" :model="form" label-width="160px" :label-position="labelPosition"> <app-card>
<el-form ref="form" :model="form" :rules="rules" label-width="160px" label-position="right">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item label="试卷名称" prop="paper_title">
label="试卷名称"
prop="paper_title"
:rules="[{ message: '请输入试卷名称', required: true, trigger: 'blur' }]"
>
<el-input v-model="form.paper_title" placeholder="请输入试卷名称" /> <el-input v-model="form.paper_title" placeholder="请输入试卷名称" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="18">
<el-form-item label="试卷用途" prop="paper_uses"> <el-form-item label="试卷用途" prop="paper_uses">
<el-radio-group v-model="form.paper_uses"> <el-radio-group v-model="form.paper_uses">
<el-radio :label="1">考试</el-radio> <el-radio :label="1">考试</el-radio>
...@@ -20,7 +16,6 @@ ...@@ -20,7 +16,6 @@
<el-radio :label="3">课程测试</el-radio> <el-radio :label="3">课程测试</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
...@@ -32,9 +27,7 @@ ...@@ -32,9 +27,7 @@
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="试卷分类" prop="paper_category"> <el-form-item label="试卷分类" prop="paper_category">
<el-select v-model="form.paper_category" placeholder="请选择试卷分类" style="width: 100%"> <question-type-cascader v-model="form.paper_category"></question-type-cascader>
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
...@@ -42,18 +35,13 @@ ...@@ -42,18 +35,13 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="组卷模式" prop="paper_type"> <el-form-item label="组卷模式" prop="paper_type">
<el-select v-model="form.paper_type" placeholder="请选择组卷模式" style="width: 100%"> <el-select v-model="form.paper_type" placeholder="请选择组卷模式" style="width: 100%">
<el-option label="自动组卷" :value="0"> </el-option> <el-option label="选题组卷" :value="1"></el-option>
<el-option label="选题组卷" :value="1"> </el-option> <el-option label="自动组卷" :value="2"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
<el-form-item <el-form-item label="试题顺序" prop="paper_question_order" v-if="form.paper_type === 1">
label="试题顺序"
:rules="[{ message: '请选择试题顺序', required: true, trigger: 'change' }]"
style="padding-left: 20px"
v-if="form.paper_type === 1"
>
<el-radio-group v-model="form.paper_question_order"> <el-radio-group v-model="form.paper_question_order">
<el-radio :label="1">固定</el-radio> <el-radio :label="1">固定</el-radio>
<el-radio :label="2">随机</el-radio> <el-radio :label="2">随机</el-radio>
...@@ -63,11 +51,7 @@ ...@@ -63,11 +51,7 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item label="试卷总分" prop="paper_total_score">
label="试卷总分"
prop="paper_total_score"
:rules="[{ message: '请输入试卷总分', required: true, trigger: 'blur' }]"
>
<el-input-number <el-input-number
:controls="false" :controls="false"
:step="1" :step="1"
...@@ -81,12 +65,7 @@ ...@@ -81,12 +65,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
<el-form-item <el-form-item label="及格分数" prop="pass_score">
label="及格分数"
prop="pass_score"
:rules="[{ message: '请输入及格分数', required: true, trigger: 'blur' }]"
style="padding-left: 20px"
>
<el-input-number <el-input-number
:controls="false" :controls="false"
:step="1" :step="1"
...@@ -102,37 +81,26 @@ ...@@ -102,37 +81,26 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item label="考试时长" prop="paper_times">
label="考试时长"
prop="paper_times"
:rules="[{ message: '请输入考试时长', required: true, trigger: 'blur' }]"
>
<el-input-number <el-input-number
v-model="form.paper_times" v-model="form.paper_times"
:controls="false" :controls="false"
:min="1" :min="1"
:max="150" :max="150"
placeholder="请输入考试时长" placeholder="请输入考试时长"
style="width: 90%"
:precision="0" :precision="0"
></el-input-number ></el-input-number
>&nbsp;分钟 >&nbsp;分钟
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item label="最短交卷时长" prop="minimum_paper_handing_time">
label="最短交卷时长"
prop="minimum_paper_handing_time"
:rules="[{ message: '请输入考试时长', required: true, trigger: 'blur' }]"
style="padding-left: 20px"
>
<el-input-number <el-input-number
v-model="form.minimum_paper_handing_time" v-model="form.minimum_paper_handing_time"
:controls="false" :controls="false"
:min="1" :min="1"
:max="150" :max="150"
placeholder="请输入考试时长" placeholder="请输入考试时长"
style="width: 90%"
:precision="0" :precision="0"
></el-input-number ></el-input-number
>&nbsp;分钟 >&nbsp;分钟
...@@ -141,7 +109,7 @@ ...@@ -141,7 +109,7 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="多次考试" :rules="[{ required: true, trigger: 'blur' }]"> <el-form-item label="多次考试" prop="is_multiple_exams">
<el-radio-group v-model="form.is_multiple_exams"> <el-radio-group v-model="form.is_multiple_exams">
<el-radio :label="0"></el-radio> <el-radio :label="0"></el-radio>
<el-radio :label="1"></el-radio> <el-radio :label="1"></el-radio>
...@@ -149,7 +117,7 @@ ...@@ -149,7 +117,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="多次考试成绩计算规则" style="padding-left: 20px" v-if="form.moreExam === '1'"> <el-form-item label="多次考试成绩计算规则" v-if="form.is_multiple_exams === 1">
<el-radio-group v-model="form.multiple_test_score_rule"> <el-radio-group v-model="form.multiple_test_score_rule">
<el-radio :label="1">平均计算法</el-radio> <el-radio :label="1">平均计算法</el-radio>
<el-radio :label="2">最高得分法</el-radio> <el-radio :label="2">最高得分法</el-radio>
...@@ -157,120 +125,136 @@ ...@@ -157,120 +125,136 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-form-item> <div style="padding: 30px; text-align: center">
<el-row style="margin-top: 30px">
<el-button @click="handleCancel" style="margin-left: 100px">取消</el-button> <el-button @click="handleCancel" style="margin-left: 100px">取消</el-button>
<el-button type="primary" @click="handleSubmit">提交</el-button> <el-button type="primary" @click="handleSubmit">保存</el-button>
<el-button type="primary" @click="handleSubmitSelect">保存并选择试题</el-button> <el-button type="primary" @click="handleSubmitSelect" v-if="hasSelectQuestionButton">保存并选择试题</el-button>
</el-row> </div>
</el-form-item>
</el-form> </el-form>
<question-select :visible.sync="questionSelectVisible"></question-select>
</app-card>
</template> </template>
<script> <script>
import { createNewPaper } from '../api' import { getPaper, createPaper, updatePaper } from '../api'
import QuestionTypeCascader from '@/components/base/QuestionTypeCascader.vue'
export default { export default {
props: { id: { type: String } },
components: { QuestionTypeCascader, QuestionSelect: () => import('../components/QuestionSelect.vue') },
data() { data() {
return { return {
labelPosition: 'left',
btnDisabled: false,
paper_category: [
{ label: '测试', value: 1 },
{ label: '考试', value: 2 },
{ label: '模拟', value: 3 }
],
form: { form: {
paper_title: '', // 试卷名称 paper_title: '', // 试卷名称
paper_uses: 1, // 试卷用途 paper_uses: 1, // 试卷用途
paper_labels: '', // 标签 paper_labels: '', // 标签
paper_category: 1, // 试卷分类 paper_category: undefined, // 试卷分类
paper_type: 1, // 组卷模式 paper_type: undefined, // 组卷模式
paper_question_order: 0, // 试题顺序 paper_question_order: 1, // 试题顺序
paper_total_score: undefined, // 试卷总分 paper_total_score: 100, // 试卷总分
paperPassScore: undefined, // 及格分数 pass_score: 60, // 及格分数
paper_times: undefined, // 考试时长 paper_times: 90, // 考试时长
minimum_paper_handing_time: undefined, // 最短交卷时长 minimum_paper_handing_time: 15, // 最短交卷时长
is_multiple_exams: 1, // 多次考试 is_multiple_exams: 0, // 多次考试
multiple_test_score_rule: 1 // 多次考试成绩计算规则 multiple_test_score_rule: 1 // 多次考试成绩计算规则
}
}
}, },
computed: { rules: {
paperDetail() { paper_title: [{ message: '请输入试卷名称', required: true, trigger: 'blur' }],
return this.$route.query.paperDetail paper_uses: [{ message: '请选择试卷用途', required: true, trigger: 'change' }],
paper_category: [{ message: '请选择试卷分类', required: true, trigger: 'change' }],
paper_type: [{ message: '请选择组卷模式', required: true, trigger: 'change' }],
paper_total_score: [{ message: '请输入试卷总分', required: true, trigger: 'blur' }],
paper_question_order: [{ message: '请选择试题顺序', required: true, trigger: 'change' }],
pass_score: [{ message: '请输入及格分数', required: true, trigger: 'blur' }],
paper_times: [{ message: '请输入考试时长', required: true, trigger: 'blur' }],
minimum_paper_handing_time: [{ message: '请输入考试时长', required: true, trigger: 'blur' }],
is_multiple_exams: [{ message: '请选择是否多次考试', required: true, trigger: 'change' }]
}, },
isEdit() { questionSelectVisible: false
return this.$route.query.isEdit
} }
}, },
watch: { watch: {
rowDetail: { '$route.query.select': {
immediate: true, immediate: true,
handler(data) { handler(value) {
this.form = Object.assign({}, this.form, data) value && this.showSelectQuestion()
} }
},
paperDetail: {
immediate: true,
handler(data) {
this.form = Object.assign({}, this.form, data)
} }
},
computed: {
isEdit() {
return !!this.id
},
hasSelectQuestionButton() {
return !this.isEdit || this.$route.query.select
} }
}, },
beforeMount() {
this.isEdit && this.getDetail()
},
methods: { methods: {
// 取消 // 取消
handleCancel() { handleCancel() {
history.go(-1) this.$router.replace('/paper/list')
}, },
// 保存 // 保存
handleSubmit() { handleSubmit() {
this.$refs.form.validate(valid => { this.$refs.form.validate().then(() => {
if (valid) { // 保存成功回到列表
this.$confirm('保存成功!', { this.createPaper().then(res => {
confirmButtonText: '确定' this.$router.replace('/paper/list')
}).then(() => {
history.go(-1)
createNewPaper(Object.assign(this.form, { project_prefix: 'x1' })).then(res => {
this.$message.sucess('新建试卷成功')
})
}) })
} else {
setTimeout(() => {
// 表单校验不通过聚焦至第一个不通过的输入框
const isError = document.getElementsByClassName('is-error')
isError[0].querySelector('input').focus()
}, 100)
return false
}
}) })
}, },
// 保存并选择试题 // 保存并选择试题
handleSubmitSelect() { handleSubmitSelect() {
this.$refs.form.validate(valid => { this.$refs.form.validate().then(async () => {
if (valid) { if (this.isEdit) {
this.$confirm('保存成功!', { this.updatePaper(() => {
confirmButtonText: '确定' this.showSelectQuestion()
}).then(() => {
// 调用接口
this.$router.push({
path: 'detail',
form: this.form
}) })
} else {
this.createPaper(res => {
this.$router.replace({ path: '/paper/update/' + res.data.id, query: { select: true } })
})
}
}) })
},
// 显示选题
showSelectQuestion() {
if (this.isEdit) {
this.visible = true
} else { } else {
setTimeout(() => { this.$router.replace('/paper/update')
// 表单校验不通过聚焦至第一个不通过的输入框
const isError = document.getElementsByClassName('is-error')
isError[0].querySelector('input').focus()
}, 100)
return false
} }
this.questionSelectVisible = true
},
// 创建试卷
createPaper(callback) {
return createPaper(this.form).then(res => {
this.$message.success('保存成功')
callback && callback(res)
return res
})
},
// 更新试卷
updatePaper(callback) {
return updatePaper(this.form).then(res => {
this.$message.success('保存成功')
callback && callback(res)
return res
})
},
// 获取试卷详情
getDetail() {
getPaper({ id: this.id }).then(res => {
this.form = Object.assign({}, this.form, res.data)
}) })
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
:v-deep .el-input-number .el-input-number__decrease { :v-deep .el-input-number .el-input-number__decrease {
display: none; display: none;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论