src/api/question.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/subject.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/education/subject/list.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exam/question/components/Show.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exam/question/edit/gap-filling.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exam/question/edit/multiple-choice.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exam/question/edit/short-answer.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exam/question/edit/single-choice.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exam/question/edit/true-false.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exam/question/list.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/question.js
@@ -4,5 +4,6 @@ pageList: query => post('/api/admin/question/page', query), edit: query => post('/api/admin/question/edit', query), select: id => post('/api/admin/question/select/' + id), deleteQuestion: id => post('/api/admin/question/delete/' + id) deleteQuestion: id => post('/api/admin/question/delete/' + id), updateStatus: query => post('/api/admin/question/status', query) } src/api/subject.js
@@ -1,9 +1,11 @@ import { post } from '@/utils/request' import { get, post } from '@/utils/request' export default { list: query => post('/api/admin/subject/list'), pageList: query => post('/api/admin/subject/page', query), edit: query => post('/api/admin/education/subject/edit', query), select: id => post('/api/admin/education/subject/select/' + id), deleteSubject: id => post('/api/admin/education/subject/delete/' + id) edit: query => post('/api/admin/subject/edit', query), select: id => post('/api/admin/subject/select/' + id), deleteSubject: id => post('/api/admin/subject/delete/' + id), updateStatus: query => post('/api/admin/subject/status', query), getItemOrder: id => get('/api/admin/subject/getItemOrder') } src/views/education/subject/list.vue
@@ -1,34 +1,63 @@ <template> <div class="app-container"> <el-form :model="queryParam" ref="queryForm" :inline="true"> <el-form-item label="年级:"> <el-select v-model="queryParam.level" placeholder="年级" clearable=""> <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option> <el-form-item> <el-input v-model="queryParam.name" placeholder="请输入名称" clearable></el-input> </el-form-item> <el-form-item> <el-select v-model="queryParam.status" placeholder="请选择状态" clearable @change="search"> <el-option value="1" label="启用"></el-option> <el-option value="2" label="禁用"></el-option> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">查询</el-button> <router-link :to="{path:'/education/subject/edit'}" class="link-left"> <el-button type="primary">添加</el-button> </router-link> <el-button type="primary" @click="search">查询</el-button> <el-button type="primary" @click="edit()">添加</el-button> </el-form-item> </el-form> <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%"> <el-table-column prop="id" label="Id" /> <el-table-column prop="name" label="学科"/> <el-table-column prop="levelName" label="年级" /> <el-table-column width="220px" label="操作" align="center"> <el-table-column align="center" prop="name" label="名称" show-overflow-tooltip /> <el-table-column align="center" prop="itemOrder" label="排序" /> <el-table-column align="center" prop="createTime" label="创建时间" /> <el-table-column align="center" prop="status" label="状态"> <template slot-scope="{row}"> <router-link :to="{path:'/education/subject/edit', query:{id:row.id}}" class="link-left"> <el-button size="mini">编辑</el-button> </router-link> <el-button size="mini" type="danger" @click="delSubject(row)" class="link-left">删除</el-button> <el-tag :type="row.status === '禁用' ? 'danger' : 'success'"> {{ row.status ? row.status : '启用' }} </el-tag> </template> </el-table-column> <el-table-column label="操作" align="center"> <template slot-scope="{row}"> <el-button size="mini" @click="edit(row)">编辑</el-button> <el-button size="mini" type="primary" @click="status(row)"> {{ row.status === "禁用" ? "启用" : "禁用" }} </el-button> <el-popconfirm title="确认删除吗" @confirm="deleteSubject(row)"> <el-button slot="reference" size="mini" type="danger" class="link-left">删除</el-button> </el-popconfirm> </template> </el-table-column> </el-table> <pagination v-show="total>0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize" @pagination="search"/> <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize" @pagination="search" /> <el-dialog :visible.sync="visible" width="400px"> <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules"> <el-form-item label="名称:" prop="name" required> <el-input v-model="form.name" maxlength="10" show-word-limit /> </el-form-item> <el-form-item label="排序:" prop="itemOrder" required> <el-input-number v-model="form.itemOrder" type="number" :min="1" :max="100" /> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> <el-button @click="resetForm">重置</el-button> </el-form-item> </el-form> </el-dialog> </div> </template> @@ -39,37 +68,84 @@ export default { components: { Pagination }, data () { data() { return { listLoading: true, queryParam: { level: null, name: '', pageIndex: 1, pageSize: 10 }, listLoading: true, formLoading: false, total: 0, tableData: [], total: 0 } form: { id: '', name: '', itemOrder: '' }, visible: false, rules: { name: [ { required: true, message: '请输入名称', trigger: 'blur' } ], itemOrder: [ { required: true, message: '请输入排序', trigger: 'blur', type: 'number' } ] }, }; }, created () { created() { this.search() }, methods: { search () { // 获取排序 getItemOrder() { subjectApi.getItemOrder().then(re => { this.form.itemOrder = re.data }) }, // 获取列表 search() { this.listLoading = true subjectApi.pageList(this.queryParam).then(data => { const re = data.data this.tableData = re.list this.total = re.total this.queryParam.pageIndex = re.pageNum subjectApi.pageList(this.queryParam).then(re => { this.tableData = re.data.list this.total = re.data.total this.queryParam.pageSize = re.data.pageSize this.queryParam.pageIndex = re.data.pageNum this.listLoading = false }) }, submitForm () { this.queryParam.pageIndex = 1 this.search() edit(row) { if (row) { subjectApi.select(row.id).then(re => { if (re.code === 1) { this.form = re.data; this.visible = true; } else { this.$message.error(re.message) } }) } else { this.getItemOrder(); this.visible = true; } }, delSubject (row) { status(row) { let question = { id: row.id, status: row.status === '禁用' ? '启用' : '禁用' } subjectApi.updateStatus(question).then(re => { if (re.code === 1) { this.$message.success(re.message) this.search() } else { this.$message.error(re.message) } }) }, deleteSubject(row) { let _this = this subjectApi.deleteSubject(row.id).then(re => { if (re.code === 1) { @@ -79,7 +155,32 @@ _this.$message.error(re.message) } }) } }, submitForm() { let _this = this this.$refs.form.validate((valid) => { if (valid) { this.formLoading = true subjectApi.edit(this.form).then(re => { if (re.code === 1) { _this.$message.success(re.message) _this.search() _this.formLoading = false _this.visible = false } else { _this.$message.error(re.message) _this.formLoading = false _this.visible = false } }) } }) }, resetForm() { let lastId = this.form.id this.$refs['form'].resetFields() this.form.id = lastId }, }, computed: { ...mapGetters('enumItem', [ src/views/exam/question/components/Show.vue
@@ -60,3 +60,8 @@ methods: {} } </script> <style scoped> /deep/ td { background-color: #f0f0f0; } </style> src/views/exam/question/edit/gap-filling.vue
@@ -1,14 +1,9 @@ <template> <div class="app-container"> <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules"> <el-form-item label="年级:" prop="gradeLevel" required> <el-select v-model="form.gradeLevel" placeholder="年级" @change="levelChange"> <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option> </el-select> </el-form-item> <el-form-item label="学科:" prop="subjectId" required> <el-select v-model="form.subjectId" placeholder="学科" > <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option> <el-option v-for="item in subjects" :key="item.id" :value="item.id" :label="item.name"></el-option> </el-select> </el-form-item> <el-form-item label="题干:" prop="title" required> @@ -17,14 +12,10 @@ <el-form-item label="填空答案:" required> <el-form-item :label="item.prefix" :key="item.prefix" v-for="item in form.items" label-width="50px" class="question-item-label"> <el-input v-model="item.content" @focus="inputClick(item,'content')" class="question-item-content-input" style="width: 80%"/> <span class="question-item-span">分数:</span><el-input-number v-model="item.score" :precision="1" :step="1" :max="100" ></el-input-number> </el-form-item> </el-form-item> <el-form-item label="解析:" prop="analyze" required> <el-input v-model="form.analyze" @focus="inputClick(form,'analyze')" /> </el-form-item> <el-form-item label="分数:" prop="score" required> <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number> </el-form-item> <el-form-item label="难度:" required> <el-rate v-model="form.difficult" class="question-item-rate"></el-rate> @@ -115,7 +106,7 @@ if (id && parseInt(id) !== 0) { _this.formLoading = true questionApi.select(id).then(re => { _this.form = re.response _this.form = re.data _this.formLoading = false }) } src/views/exam/question/edit/multiple-choice.vue
@@ -1,14 +1,9 @@ <template> <div class="app-container"> <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules"> <el-form-item label="年级:" prop="gradeLevel" required> <el-select v-model="form.gradeLevel" placeholder="年级" @change="levelChange"> <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option> </el-select> </el-form-item> <el-form-item label="学科:" prop="subjectId" required> <el-select v-model="form.subjectId" placeholder="学科" > <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option> <el-option v-for="item in subjects" :key="item.id" :value="item.id" :label="item.name"></el-option> </el-select> </el-form-item> <el-form-item label="题干:" prop="title" required> @@ -23,9 +18,6 @@ </el-form-item> <el-form-item label="解析:" prop="analyze" required> <el-input v-model="form.analyze" @focus="inputClick(form,'analyze')" /> </el-form-item> <el-form-item label="分数:" prop="score" required> <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number> </el-form-item> <el-form-item label="难度:" required> <el-rate v-model="form.difficult" class="question-item-rate"></el-rate> @@ -130,7 +122,7 @@ if (id && parseInt(id) !== 0) { _this.formLoading = true questionApi.select(id).then(re => { _this.form = re.response _this.form = re.data _this.formLoading = false }) } src/views/exam/question/edit/short-answer.vue
@@ -1,14 +1,9 @@ <template> <div class="app-container"> <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules"> <el-form-item label="年级:" prop="gradeLevel" required> <el-select v-model="form.gradeLevel" placeholder="年级" @change="levelChange"> <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option> </el-select> </el-form-item> <el-form-item label="学科:" prop="subjectId" required> <el-select v-model="form.subjectId" placeholder="学科" > <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option> <el-option v-for="item in subjects" :key="item.id" :value="item.id" :label="item.name"></el-option> </el-select> </el-form-item> <el-form-item label="题干:" prop="title" required> @@ -19,9 +14,6 @@ </el-form-item> <el-form-item label="解析:" prop="analyze" required> <el-input v-model="form.analyze" @focus="inputClick(form,'analyze')" /> </el-form-item> <el-form-item label="分数:" prop="score" required> <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number> </el-form-item> <el-form-item label="难度:" required> <el-rate v-model="form.difficult" class="question-item-rate"></el-rate> src/views/exam/question/edit/single-choice.vue
@@ -1,14 +1,9 @@ <template> <div class="app-container"> <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules"> <el-form-item label="年级:" prop="gradeLevel" required> <el-select v-model="form.gradeLevel" placeholder="年级" @change="levelChange" clearable> <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option> </el-select> </el-form-item> <el-form-item label="学科:" prop="subjectId" required> <el-select v-model="form.subjectId" placeholder="学科" > <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option> <el-option v-for="item in subjects" :key="item.id" :value="item.id" :label="item.name"></el-option> </el-select> </el-form-item> <el-form-item label="题干:" prop="title" required> @@ -23,9 +18,6 @@ </el-form-item> <el-form-item label="解析:" prop="analyze" required> <el-input v-model="form.analyze" @focus="inputClick(form,'analyze')" /> </el-form-item> <el-form-item label="分数:" prop="score" required> <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number> </el-form-item> <el-form-item label="难度:" required> <el-rate v-model="form.difficult" class="question-item-rate"></el-rate> src/views/exam/question/edit/true-false.vue
@@ -1,14 +1,9 @@ <template> <div class="app-container"> <el-form :model="form" ref="form" label-width="100px" v-loading="formLoading" :rules="rules"> <el-form-item label="年级:" prop="gradeLevel" required> <el-select v-model="form.gradeLevel" placeholder="年级" @change="levelChange"> <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option> </el-select> </el-form-item> <el-form-item label="学科:" prop="subjectId" required> <el-select v-model="form.subjectId" placeholder="学科" > <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option> <el-option v-for="item in subjects" :key="item.id" :value="item.id" :label="item.name"></el-option> </el-select> </el-form-item> <el-form-item label="题干:" prop="title" required> @@ -22,9 +17,6 @@ </el-form-item> <el-form-item label="解析:" prop="analyze" required> <el-input v-model="form.analyze" @focus="inputClick(form,'analyze')" /> </el-form-item> <el-form-item label="分数:" prop="score" required> <el-input-number v-model="form.score" :precision="1" :step="1" :max="100"></el-input-number> </el-form-item> <el-form-item label="难度:" required> <el-rate v-model="form.difficult" class="question-item-rate"></el-rate> src/views/exam/question/list.vue
@@ -1,59 +1,68 @@ <template> <div class="app-container"> <el-form :model="queryParam" ref="queryForm" :inline="true"> <el-form-item label="题目ID:"> <el-input v-model="queryParam.id" clearable></el-input> <el-form-item> <el-input v-model="queryParam.content" placeholder="请输入题目" clearable></el-input> </el-form-item> <el-form-item label="题目内容:"> <el-input v-model="queryParam.content" clearable></el-input> </el-form-item> <el-form-item label="年级:"> <el-select v-model="queryParam.level" placeholder="年级" @change="levelChange" clearable> <el-option v-for="item in levelEnum" :key="item.key" :value="item.key" :label="item.value"></el-option> </el-select> </el-form-item> <el-form-item label="学科:"> <el-select v-model="queryParam.subjectId" clearable> <el-option v-for="item in subjectFilter" :key="item.id" :value="item.id" :label="item.name+' ( '+item.levelName+' )'"></el-option> </el-select> </el-form-item> <el-form-item label="题型:"> <el-select v-model="queryParam.questionType" clearable> <el-option v-for="item in questionType" :key="item.key" :value="item.key" :label="item.value"></el-option> <el-form-item> <el-select v-model="queryParam.subjectId" placeholder="请选择科目" clearable multiple @change="search"> <el-option v-for="item in subjects" :key="item.id" :value="item.id" :label="item.name"></el-option> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">查询</el-button> <el-select v-model="queryParam.questionType" placeholder="请选择题型" clearable multiple @change="search"> <el-option v-for="item in questionTypeEnum" :key="item.key" :value="item.key" :label="item.value"></el-option> </el-select> </el-form-item> <el-form-item> <el-select v-model="queryParam.status" placeholder="请选择状态" clearable @change="search"> <el-option value="1" label="启用"></el-option> <el-option value="2" label="禁用"></el-option> </el-select> </el-form-item> <el-form-item> <el-button type="primary" @click="search">查询</el-button> <el-popover placement="bottom" trigger="click"> <el-button type="warning" size="mini" v-for="item in editUrlEnum" :key="item.key" @click="$router.push({path:item.value})">{{item.name}} @click="$router.push({ path: item.value })">{{ item.name }} </el-button> <el-button slot="reference" type="primary" class="link-left">添加</el-button> </el-popover> </el-form-item> </el-form> <el-table v-loading="listLoading" :data="tableData" border fit highlight-current-row style="width: 100%"> <el-table-column prop="id" label="Id" width="90px"/> <el-table-column prop="subjectId" label="学科" :formatter="subjectFormatter" width="120px"/> <el-table-column prop="questionType" label="题型" :formatter="questionTypeFormatter" width="70px"/> <el-table-column prop="shortTitle" label="题干" show-overflow-tooltip/> <el-table-column prop="score" label="分数" width="60px"/> <el-table-column prop="difficult" label="难度" width="60px"/> <el-table-column prop="createTime" label="创建时间" width="160px"/> <el-table-column label="操作" align="center" width="220px"> <el-table-column align="center" prop="shortTitle" label="题目" show-overflow-tooltip> </el-table-column> <el-table-column align="center" prop="subjectName" label="科目" width="150px"> </el-table-column> <el-table-column align="center" prop="questionTypeName" label="题型" width="100px"> </el-table-column> <el-table-column align="center" prop="difficult" label="难度" width="100px" /> <el-table-column align="center" prop="createTime" label="创建时间" width="160px" /> <el-table-column align="center" prop="status" label="状态" width="100px"> <template slot-scope="{row}"> <el-button size="mini" @click="showQuestion(row)">预览</el-button> <el-button size="mini" @click="editQuestion(row)">编辑</el-button> <el-button size="mini" type="danger" @click="deleteQuestion(row)" class="link-left">删除</el-button> <el-tag :type="row.status === '禁用' ? 'danger' : 'success'"> {{ row.status ? row.status : '启用' }} </el-tag> </template> </el-table-column> <el-table-column label="操作" align="center" width="300px"> <template slot-scope="{row}"> <el-button size="mini" @click="showQuestion(row)">预览</el-button> <el-button size="mini" @click="editQuestion(row)">编辑</el-button> <el-button size="mini" type="primary" @click="statusQuestion(row)"> {{ row.status === "禁用" ? "启用" : "禁用" }} </el-button> <el-popconfirm title="确认删除吗" @confirm="deleteQuestion(row)"> <el-button slot="reference" size="mini" type="danger" class="link-left">删除</el-button> </el-popconfirm> </template> </el-table-column> </el-table> <pagination v-show="total>0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize" @pagination="search"/> <pagination v-show="total > 0" :total="total" :page.sync="queryParam.pageIndex" :limit.sync="queryParam.pageSize" @pagination="search" /> <el-dialog :visible.sync="questionShow.dialog" style="width: 100%;height: 100%"> <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading"/> <QuestionShow :qType="questionShow.qType" :question="questionShow.question" :qLoading="questionShow.loading" /> </el-dialog> </div> </template> @@ -66,7 +75,7 @@ export default { components: { Pagination, QuestionShow }, data () { data() { return { queryParam: { id: null, @@ -88,16 +97,30 @@ } } }, created () { created() { this.initSubject() this.search() }, methods: { submitForm () { statusQuestion(row) { let question = { id: row.id, status: row.status === '禁用' ? '启用' : '禁用' } questionApi.updateStatus(question).then(re => { if (re.code === 1) { this.$message.success(re.message) this.search() } else { this.$message.error(re.message) } }) }, submitForm() { this.queryParam.pageIndex = 1 this.search() }, search () { search() { this.listLoading = true questionApi.pageList(this.queryParam).then(data => { const re = data.data @@ -107,28 +130,28 @@ this.listLoading = false }) }, levelChange () { levelChange() { this.queryParam.subjectId = null this.subjectFilter = this.subjects.filter(data => data.level === this.queryParam.level) }, addQuestion () { addQuestion() { this.$router.push('/exam/question/edit/singleChoice') }, showQuestion (row) { showQuestion(row) { let _this = this this.questionShow.dialog = true this.questionShow.loading = true questionApi.select(row.id).then(re => { _this.questionShow.qType = re.response.questionType _this.questionShow.question = re.response _this.questionShow.qType = re.data.questionType _this.questionShow.question = re.data _this.questionShow.loading = false }) }, editQuestion (row) { editQuestion(row) { let url = this.enumFormat(this.editUrlEnum, row.questionType) this.$router.push({ path: url, query: { id: row.id } }) }, deleteQuestion (row) { deleteQuestion(row) { let _this = this questionApi.deleteQuestion(row.id).then(re => { if (re.code === 1) { @@ -139,10 +162,10 @@ } }) }, questionTypeFormatter (row, column, cellValue, index) { questionTypeFormatter(row, column, cellValue, index) { return this.enumFormat(this.questionType, cellValue) }, subjectFormatter (row, column, cellValue, index) { subjectFormatter(row, column, cellValue, index) { return this.subjectEnumFormat(cellValue) }, ...mapActions('exam', { initSubject: 'initSubject' }) @@ -150,6 +173,7 @@ computed: { ...mapGetters('enumItem', ['enumFormat']), ...mapState('enumItem', { questionTypeEnum: state => state.exam.question.typeEnum, questionType: state => state.exam.question.typeEnum, editUrlEnum: state => state.exam.question.editUrlEnum, levelEnum: state => state.user.levelEnum