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

chore: 新增批量导出试题

上级 4754fc0c
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",
"element-ui": "^2.15.12", "element-ui": "^2.15.12",
"file-saver": "^2.0.5",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"query-string": "^7.1.3", "query-string": "^7.1.3",
"vue": "^2.7.14", "vue": "^2.7.14",
...@@ -1713,6 +1714,11 @@ ...@@ -1713,6 +1714,11 @@
"node": "^10.12.0 || >=12.0.0" "node": "^10.12.0 || >=12.0.0"
} }
}, },
"node_modules/file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
},
"node_modules/file-uri-to-path": { "node_modules/file-uri-to-path": {
"version": "2.0.0", "version": "2.0.0",
"dev": true, "dev": true,
...@@ -4744,6 +4750,11 @@ ...@@ -4744,6 +4750,11 @@
"flat-cache": "^3.0.4" "flat-cache": "^3.0.4"
} }
}, },
"file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
},
"file-uri-to-path": { "file-uri-to-path": {
"version": "2.0.0", "version": "2.0.0",
"dev": true "dev": true
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",
"element-ui": "^2.15.12", "element-ui": "^2.15.12",
"file-saver": "^2.0.5",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"query-string": "^7.1.3", "query-string": "^7.1.3",
"vue": "^2.7.14", "vue": "^2.7.14",
......
...@@ -68,3 +68,10 @@ export function importQuestion(tag, data) { ...@@ -68,3 +68,10 @@ export function importQuestion(tag, data) {
withCredentials: true withCredentials: true
}) })
} }
/**
* 导出试题
*/
export function exportQuestion(params) {
return httpRequest.get('/api/qbs/admin/v2/export-questions', { params, responseType: 'blob' })
}
...@@ -7,31 +7,16 @@ ...@@ -7,31 +7,16 @@
</div> </div>
<app-list v-bind="tableOptions" ref="list" @selection-change="handleSelectionChange"> <app-list v-bind="tableOptions" ref="list" @selection-change="handleSelectionChange">
<template v-slot:filter-category="{ params }"> <template v-slot:filter-category="{ params }">
<question-type-cascader <question-type-cascader multiple v-model="params.question_categories" @change="refetchList"></question-type-cascader>
multiple
v-model="params.question_categories"
@change="refetchList"
></question-type-cascader>
</template> </template>
<div class="operate-btn"> <div class="operate-btn">
<el-button type="primary" icon="el-icon-plus" @click="$router.push({ path: '/question/create' })" v-permission="'question_create'">新建试题</el-button>
<el-button type="primary" icon="el-icon-upload2" @click="importDialogVisible = true" v-permission="'question_import'">批量导入试题</el-button>
<el-button type="primary" icon="el-icon-download" @click="handleExport"> 批量导出试题 </el-button>
<el-button <el-button
type="primary" type="primary"
icon="el-icon-plus" icon="el-icon-delete"
@click="$router.push({ path: '/question/create' })"
v-permission="'question_create'"
>新建试题</el-button
>
<el-button
type="primary"
icon="el-icon-plus"
@click="importDialogVisible = true"
v-permission="'question_import'"
>批量导入试题</el-button
>
<el-button
type="primary"
icon="el-icon-plus"
@click="handleDelete()" @click="handleDelete()"
:disabled="this.deleteQuestions.length === 0" :disabled="this.deleteQuestions.length === 0"
v-permission="'question_batch_delete'" v-permission="'question_batch_delete'"
...@@ -39,18 +24,10 @@ ...@@ -39,18 +24,10 @@
> >
</div> </div>
<template v-slot:table-x="{ row }"> <template v-slot:table-x="{ row }">
<router-link <router-link :to="{ path: '/question/editQuestion', query: { id: row.id, type: 'edit' } }" target="_blank" v-permission="'question_update'">
:to="{ path: '/question/editQuestion', query: { id: row.id, type: 'edit' } }"
target="_blank"
v-permission="'question_update'"
>
<el-button type="text">编辑</el-button> <el-button type="text">编辑</el-button>
</router-link> </router-link>
<router-link <router-link :to="{ path: '/question/questionDetail', query: { id: row.id, type: 'view' } }" target="_blank" v-permission="'question_detail'">
:to="{ path: '/question/questionDetail', query: { id: row.id, type: 'view' } }"
target="_blank"
v-permission="'question_detail'"
>
<el-button type="text">查看详情</el-button> <el-button type="text">查看详情</el-button>
</router-link> </router-link>
<el-button type="text" @click="handleDelete(row.id)" v-permission="'question_batch_delete'">删除</el-button> <el-button type="text" @click="handleDelete(row.id)" v-permission="'question_batch_delete'">删除</el-button>
...@@ -61,9 +38,11 @@ ...@@ -61,9 +38,11 @@
</template> </template>
<script> <script>
import { getAppList, deleteQuestion } from '../api' import { getAppList, deleteQuestion, exportQuestion } from '../api'
import importQuestion from '../components/importQuestion.vue' import importQuestion from '../components/importQuestion.vue'
import QuestionTypeCascader from '@/components/base/QuestionTypeTreeselect.vue' import QuestionTypeCascader from '@/components/base/QuestionTypeTreeselect.vue'
import { saveAs } from 'file-saver'
export default { export default {
components: { importQuestion, QuestionTypeCascader }, components: { importQuestion, QuestionTypeCascader },
data() { data() {
...@@ -74,7 +53,8 @@ export default { ...@@ -74,7 +53,8 @@ export default {
treeDialogVisible: false, // tree弹窗 treeDialogVisible: false, // tree弹窗
filterRadio: 1, // 题库筛选 filterRadio: 1, // 题库筛选
filterInput: '', // tree回显内容 filterInput: '', // tree回显内容
defaultProps: '' defaultProps: '',
params: {}
} }
}, },
computed: { computed: {
...@@ -142,6 +122,9 @@ export default { ...@@ -142,6 +122,9 @@ export default {
project_prefix: this.activeProject.tag, project_prefix: this.activeProject.tag,
question_categories: [] question_categories: []
}, },
beforeRequest: params => {
this.params = params
},
callback(data) { callback(data) {
const questionType = { const questionType = {
1: '单选题', 1: '单选题',
...@@ -190,7 +173,6 @@ export default { ...@@ -190,7 +173,6 @@ export default {
} }
} }
}, },
mounted() {},
methods: { methods: {
// 列表选择 // 列表选择
handleSelectionChange(data) { handleSelectionChange(data) {
...@@ -222,6 +204,12 @@ export default { ...@@ -222,6 +204,12 @@ export default {
refetchList() { refetchList() {
// 刷新列表 // 刷新列表
this.$refs.list.refetch() this.$refs.list.refetch()
},
// 导出试题
handleExport() {
exportQuestion(this.params).then(res => {
saveAs(res, 'export.xlsx')
})
} }
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论