From a2d050614fa2c833dd73068d9624cdcb6952f610 Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期三, 19 六月 2024 13:28:47 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/api/educationResource.js | 9 src/views/answer/detail.vue | 8 package-lock.json | 56 +++++ src/components/UploadC.vue | 132 +++++++++++++ src/store/modules/enumItem.js | 23 + package.json | 1 src/views/answer/list.vue | 2 src/views/education/resource/list.vue | 322 ++++++++++++++++++++++++++++++++ src/router.js | 6 src/views/exam/question/edit/audio.vue | 2 10 files changed, 543 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7132a21..d1cc00a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "3.9.0", "license": "AGPL-3.0", "dependencies": { + "@vue-office/pdf": "^2.0.2", "axios": "^0.19.2", "clipboard": "^2.0.11", "codemirror": "^5.65.16", @@ -2289,6 +2290,22 @@ "dev": true, "engines": { "node": ">= 8" + } + }, + "node_modules/@vue-office/pdf": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@vue-office/pdf/-/pdf-2.0.2.tgz", + "integrity": "sha512-bQFqGxSOnKbvCS7OoJniYoTz1VIm1XOrRD27Msorxny9NFJ8RsQK1A4uhlnISJRFMaUwp1qlcVE9jMAhsiIyjg==", + "hasInstallScript": true, + "peerDependencies": { + "@vue/composition-api": "^1.7.1", + "vue": "^2.0.0 || >=3.0.0", + "vue-demi": "^0.14.6" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } } }, "node_modules/@vue/babel-helper-vue-jsx-merge-props": { @@ -17408,6 +17425,32 @@ "resolved": "https://registry.npmmirror.com/vue-count-to/-/vue-count-to-1.0.13.tgz", "integrity": "sha512-6R4OVBVNtQTlcbXu6SJ8ENR35M2/CdWt3Jmv57jOUM+1ojiFmjVGvZPH8DfHpMDSA+ITs+EW5V6qthADxeyYOQ==" }, + "node_modules/vue-demi": { + "version": "0.14.8", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "hasInstallScript": true, + "peer": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/vue-eslint-parser": { "version": "5.0.0", "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz", @@ -20555,6 +20598,12 @@ "dev": true } } + }, + "@vue-office/pdf": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@vue-office/pdf/-/pdf-2.0.2.tgz", + "integrity": "sha512-bQFqGxSOnKbvCS7OoJniYoTz1VIm1XOrRD27Msorxny9NFJ8RsQK1A4uhlnISJRFMaUwp1qlcVE9jMAhsiIyjg==", + "requires": {} }, "@vue/babel-helper-vue-jsx-merge-props": { "version": "1.4.0", @@ -32599,6 +32648,13 @@ "resolved": "https://registry.npmmirror.com/vue-count-to/-/vue-count-to-1.0.13.tgz", "integrity": "sha512-6R4OVBVNtQTlcbXu6SJ8ENR35M2/CdWt3Jmv57jOUM+1ojiFmjVGvZPH8DfHpMDSA+ITs+EW5V6qthADxeyYOQ==" }, + "vue-demi": { + "version": "0.14.8", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "peer": true, + "requires": {} + }, "vue-eslint-parser": { "version": "5.0.0", "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz", diff --git a/package.json b/package.json index 1002a34..a01a867 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ ] }, "dependencies": { + "@vue-office/pdf": "^2.0.2", "axios": "^0.19.2", "clipboard": "^2.0.11", "codemirror": "^5.65.16", diff --git a/src/api/educationResource.js b/src/api/educationResource.js new file mode 100644 index 0000000..d176ee8 --- /dev/null +++ b/src/api/educationResource.js @@ -0,0 +1,9 @@ +import { post, get } from '@/utils/request' + +export default { + page: query => get('/api/admin/education/resource/page', query), + add: data => post('/api/admin/education/resource', data), + update: data => post('/api/admin/education/resource/edit', data), + list: () => post('/api/admin/education/resource/list'), + remove: (data) => post('/api/admin/education/resource/remove', data) +} diff --git a/src/components/UploadC.vue b/src/components/UploadC.vue new file mode 100644 index 0000000..1a2e57f --- /dev/null +++ b/src/components/UploadC.vue @@ -0,0 +1,132 @@ +<template> + <div> + <el-upload :action="uploadUrl" :show-file-list="true" :limit="uploadNum" :accept="acceptList" multiple + :file-list="fileUrl" :on-remove="handleRemove" :before-remove="beforeRemove" :on-success="handleUploadSuccess" + :before-upload="beforeUpload"> + <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button> + <div slot="tip" class="el-upload__tip">鍙兘涓婁紶pdf銆乵p4銆乤vi銆乸ng銆乯pg銆乯pge鏂囦欢锛屼笖涓嶈秴杩噞{ fileSizeLimitM }}M</div> + <div v-if="fileUrl && fileUrl.length > 0 && uploadNum === 1"> + <video controls class="returnShow" v-if="fileType === 'video'" :src="'/api/files/' + fileUrl[0].url"></video> + <img class="returnShow" v-if="fileType === 'img'" :src="'/api/files/' + fileUrl[0].url" /> + </div> + </el-upload> + </div> +</template> + +<script> + +export default { + name: "UploadC", + props: { + uploadNum: { + required: false, + default: 1, + type: Number + }, + fileType: { + required: false, + type: String + }, + fileSizeLimitM: { + required: false, + default: 1, + type: Number + }, + fileUrl: { + type: Array, + required: true, + default: () => [] + } + }, + data() { + return { + uploadUrl: "http://localhost:8000/api/upload/upload", + fileTypeList: { + 'video': ['mp4', 'avi'], + 'img': ['jpg', 'png', 'jpeg'], + 'pdf': ['pdf'], + 'file': ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'png', 'jpg', 'jpeg', 'pdf'], + } + }; + }, + methods: { + clearFile() { + this.fileUrl = []; + }, + beforeRemove(file, fileList) { + if (file && file.status === "success") { + return this.$confirm(`纭畾绉婚櫎 ${file.name}锛焋); + } + }, + handleRemove(file, fileList) { + this.$emit('removeFile', this.fileUrl, file.name); + }, + handleUploadSuccess(res, file) { + this.fileUrl.push(res.data); + this.$emit('getUploadUrl', this.fileUrl); + }, + beforeUpload(file) { + const { type } = file; + const typeList = this.fileTypeList[this.fileType]; + let limitType = true; + if (typeList) { + const tempType = typeList.find(item => { + if (type.includes(item)) { + return true; + } else { + return false; + } + }); + if (!tempType) { + this.$message.error(`璇蜂笂浼犳纭殑鏂囦欢鏍煎紡锛乣); + limitType = false; + } + } + const limit = file.size / 1024 / 1024 < this.fileSizeLimitM; + if (!limit) { + this.$message.error(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${this.fileSizeLimitM}MB!`); + } + return limitType && limit; + }, + }, + computed: { + acceptList() { + let temp = '.*'; + if (this.fileTypeList[this.fileType]) { + temp = this.fileTypeList[this.fileType].map(item => '.' + item).join(','); + } + return temp; + } + } +}; +</script> + +<style scoped> +.returnShow { + width: 300px; + height: 200px; +} + +.avatar-uploader { + text-align: center; + width: 100% +} + +.avatar-uploader-icon:hover { + border-color: #409EFF; +} + +.avatar-uploader-icon { + font-size: 28px; + color: #8c939d; + text-align: center; + border: 1px dashed #d9d9d9; + border-radius: 6px; + cursor: pointer; + +} + +.avatar { + display: block; +} +</style> diff --git a/src/router.js b/src/router.js index 489c209..24ee814 100644 --- a/src/router.js +++ b/src/router.js @@ -250,6 +250,12 @@ name: 'EducationSubjectEditPage', meta: { title: '瀛︾缂栬緫', noCache: true, activeMenu: '/education/subject/list' }, hidden: true + }, + { + path: 'resource/list', + component: () => import('@/views/education/resource/list'), + name: 'EducationResourcePage', + meta: { title: '鏁欏璧勬簮', noCache: true } } ] }, diff --git a/src/store/modules/enumItem.js b/src/store/modules/enumItem.js index 9572098..861a788 100644 --- a/src/store/modules/enumItem.js +++ b/src/store/modules/enumItem.js @@ -4,8 +4,8 @@ sexEnum: [{ key: 1, value: '鐢�' }, { key: 2, value: '濂�' }], statusEnum: [{ key: 1, value: '鍚敤' }, { key: 2, value: '绂佺敤' }], levelEnum: [{ key: 1, value: '涓�骞寸骇' }, { key: 2, value: '浜屽勾绾�' }, { key: 3, value: '涓夊勾绾�' }, { key: 4, value: '鍥涘勾绾�' }, { key: 5, value: '浜斿勾绾�' }, { key: 6, value: '鍏勾绾�' }, - { key: 7, value: '鍒濅竴' }, { key: 8, value: '鍒濅簩' }, { key: 9, value: '鍒濅笁' }, - { key: 10, value: '楂樹竴' }, { key: 11, value: '楂樹簩' }, { key: 12, value: '楂樹笁' }], + { key: 7, value: '鍒濅竴' }, { key: 8, value: '鍒濅簩' }, { key: 9, value: '鍒濅笁' }, + { key: 10, value: '楂樹竴' }, { key: 11, value: '楂樹簩' }, { key: 12, value: '楂樹笁' }], roleEnum: [{ key: 1, value: '瀛︾敓' }, { key: 2, value: '鏁欏笀' }, { key: 3, value: '绠$悊鍛�' }], statusTag: [{ key: 1, value: 'success' }, { key: 2, value: 'danger' }], statusBtn: [{ key: 1, value: '绂佺敤' }, { key: 2, value: '鍚敤' }] @@ -17,13 +17,18 @@ question: { typeEnum: [{ key: 1, value: '鍗曢�夐' }, { key: 2, value: '澶氶�夐' }, { key: 3, value: '鍒ゆ柇棰�' }, { key: 4, value: '濉┖棰�' }, { key: 5, value: '绠�绛旈' }, { key: 6, value: '璇煶棰�' }, { key: 7, value: '璁$畻棰�' }, { key: 8, value: '鍒嗘瀽棰�' }], editUrlEnum: [{ key: 1, value: '/exam/question/edit/singleChoice', name: '鍗曢�夐' }, - { key: 2, value: '/exam/question/edit/multipleChoice', name: '澶氶�夐' }, - { key: 3, value: '/exam/question/edit/trueFalse', name: '鍒ゆ柇棰�' }, - { key: 4, value: '/exam/question/edit/gapFilling', name: '濉┖棰�' }, - { key: 5, value: '/exam/question/edit/shortAnswer', name: '绠�绛旈' }, - { key: 6, value: '/exam/question/edit/audio', name: '璇煶棰�' }, - { key: 7, value: '/exam/question/edit/calculate', name: '璁$畻棰�' }, - { key: 8, value: '/exam/question/edit/analysis', name: '鍒嗘瀽棰�' }] + { key: 2, value: '/exam/question/edit/multipleChoice', name: '澶氶�夐' }, + { key: 3, value: '/exam/question/edit/trueFalse', name: '鍒ゆ柇棰�' }, + { key: 4, value: '/exam/question/edit/gapFilling', name: '濉┖棰�' }, + { key: 5, value: '/exam/question/edit/shortAnswer', name: '绠�绛旈' }, + { key: 6, value: '/exam/question/edit/audio', name: '璇煶棰�' }, + { key: 7, value: '/exam/question/edit/calculate', name: '璁$畻棰�' }, + { key: 8, value: '/exam/question/edit/analysis', name: '鍒嗘瀽棰�' }], + answer: { + doRightTag: [{ key: true, value: 'success' }, { key: false, value: 'danger' }, { key: null, value: 'warning' }], + doRightEnum: [{ key: true, value: '姝g‘' }, { key: false, value: '閿欒' }, { key: null, value: '寰呮壒鏀�' }], + doCompletedTag: [{ key: false, value: 'info' }, { key: true, value: 'success' }] + } } } } diff --git a/src/views/answer/detail.vue b/src/views/answer/detail.vue index 013aec1..cf9517d 100644 --- a/src/views/answer/detail.vue +++ b/src/views/answer/detail.vue @@ -8,13 +8,6 @@ </span> </el-col> </el-row> - <el-row class="do-exam-title-hidden"> - <el-col :span="24"> - <span :key="item.itemOrder" v-for="item in answer.answerItems"> - <el-tag class="do-exam-title-tag">{{ item.itemOrder }}</el-tag> - </span> - </el-col> - </el-row> <el-container class="app-item-contain"> <el-header class="align-center"> <h1>{{ form.name }}</h1> @@ -67,6 +60,7 @@ if (id && parseInt(id) !== 0) { _this.formLoading = true examPaperAnswerApi.read(id).then(re => { + re = {"code":1,"message":"鎴愬姛","data":{"paper":{"id":30,"level":1,"subjectId":4,"paperType":7,"name":"鏅鸿兘璁粌璇曞嵎 - 1","suggestTime":12,"limitDateTime":null,"titleItems":[{"name":"鍗曢�夐","questionItems":[{"id":25,"questionType":1,"subjectId":4,"title":"涓崕鍥涘ぇ鍚嶈憲閮芥湁鍝簺锛屼笅鍒楁纭殑鏄�","gradeLevel":1,"items":[{"prefix":"A","content":"绾㈡ゼ姊�","score":null,"itemUuid":null},{"prefix":"B","content":"鐧芥ゼ姊�","score":null,"itemUuid":null},{"prefix":"C","content":"闈掓ゼ姊�","score":null,"itemUuid":null},{"prefix":"D","content":"缁挎ゼ姊�","score":null,"itemUuid":null}],"analyze":"棰樼洰姣旇緝绠�鍗曪紝鑷鍒嗘瀽","correctArray":null,"correct":"A","score":"2.5","difficult":3,"itemOrder":1,"knowledgeIdList":[8,9]},{"id":30,"questionType":1,"subjectId":4,"title":"涓崕鍥涘ぇ鍚嶈憲閮芥湁鍝簺锛屼笅鍒楁纭殑鏄�","gradeLevel":1,"items":[{"prefix":"A","content":"绾㈡ゼ姊�","score":null,"itemUuid":null},{"prefix":"B","content":"鐧芥ゼ姊�","score":null,"itemUuid":null},{"prefix":"C","content":"闈掓ゼ姊�","score":null,"itemUuid":null},{"prefix":"D","content":"缁挎ゼ姊�","score":null,"itemUuid":null}],"analyze":"棰樼洰姣旇緝绠�鍗曪紝鑷鍒嗘瀽","correctArray":null,"correct":"A","score":"2.5","difficult":3,"itemOrder":2,"knowledgeIdList":[8,9]}]},{"name":"澶氶�夐","questionItems":[{"id":26,"questionType":2,"subjectId":4,"title":"涓崕鍥涘ぇ鍚嶈憲閮芥湁鍝簺锛屼笅鍒楁纭殑鏄�","gradeLevel":1,"items":[{"prefix":"A","content":"绾㈡ゼ姊�","score":null,"itemUuid":null},{"prefix":"B","content":"鐧芥ゼ姊�","score":null,"itemUuid":null},{"prefix":"C","content":"闈掓ゼ姊�","score":null,"itemUuid":null},{"prefix":"D","content":"缁挎ゼ姊�","score":null,"itemUuid":null}],"analyze":"棰樼洰姣旇緝绠�鍗曪紝鑷鍒嗘瀽","correctArray":["A","C"],"correct":"A,C","score":"2.5","difficult":3,"itemOrder":3,"knowledgeIdList":[8,9]},{"id":31,"questionType":2,"subjectId":4,"title":"涓崕鍥涘ぇ鍚嶈憲閮芥湁鍝簺锛屼笅鍒楁纭殑鏄�","gradeLevel":1,"items":[{"prefix":"A","content":"绾㈡ゼ姊�","score":null,"itemUuid":null},{"prefix":"B","content":"鐧芥ゼ姊�","score":null,"itemUuid":null},{"prefix":"C","content":"闈掓ゼ姊�","score":null,"itemUuid":null},{"prefix":"D","content":"缁挎ゼ姊�","score":null,"itemUuid":null}],"analyze":"棰樼洰姣旇緝绠�鍗曪紝鑷鍒嗘瀽","correctArray":["A","C"],"correct":"A,C","score":"2.5","difficult":3,"itemOrder":4,"knowledgeIdList":[8,9]}]},{"name":"鍒ゆ柇棰�","questionItems":[{"id":27,"questionType":3,"subjectId":4,"title":"涓崕鍥涘ぇ鍚嶈憲閮芥湁鍝簺锛屼笅鍒楄鏄庢纭悧","gradeLevel":1,"items":[{"prefix":"A","content":"姝g‘","score":null,"itemUuid":null},{"prefix":"B","content":"閿欒","score":null,"itemUuid":null}],"analyze":"棰樼洰姣旇緝绠�鍗曪紝鑷鍒嗘瀽","correctArray":null,"correct":"A","score":"2.5","difficult":3,"itemOrder":5,"knowledgeIdList":[8,9]},{"id":32,"questionType":3,"subjectId":4,"title":"涓崕鍥涘ぇ鍚嶈憲閮芥湁鍝簺锛屼笅鍒楄鏄庢纭悧","gradeLevel":1,"items":[{"prefix":"A","content":"姝g‘","score":null,"itemUuid":null},{"prefix":"B","content":"閿欒","score":null,"itemUuid":null}],"analyze":"棰樼洰姣旇緝绠�鍗曪紝鑷鍒嗘瀽","correctArray":null,"correct":"A","score":"2.5","difficult":3,"itemOrder":6,"knowledgeIdList":[8,9]}]}],"score":"15","classes":null},"answer":{"id":9,"doTime":26,"score":"7.5","createUser":null,"answerItems":[{"id":25,"questionId":25,"doRight":true,"content":"A","itemOrder":1,"contentArray":null,"score":"2.5","questionScore":"2.5"},{"id":26,"questionId":30,"doRight":false,"content":"C","itemOrder":2,"contentArray":null,"score":"0","questionScore":"2.5"},{"id":27,"questionId":26,"doRight":false,"content":"","itemOrder":3,"contentArray":[""],"score":"0","questionScore":"2.5"},{"id":28,"questionId":31,"doRight":false,"content":"C,D","itemOrder":4,"contentArray":["C","D"],"score":"0","questionScore":"2.5"},{"id":29,"questionId":27,"doRight":true,"content":"A","itemOrder":5,"contentArray":null,"score":"2.5","questionScore":"2.5"},{"id":30,"questionId":32,"doRight":true,"content":"A","itemOrder":6,"contentArray":null,"score":"2.5","questionScore":"2.5"}],"doTimeStr":"26绉�"}}} _this.form = re.data.paper _this.answer = re.data.answer _this.formLoading = false diff --git a/src/views/answer/list.vue b/src/views/answer/list.vue index 63d1414..aa567ed 100644 --- a/src/views/answer/list.vue +++ b/src/views/answer/list.vue @@ -28,7 +28,7 @@ <span v-if="row.paperType === 3">椤哄簭璇曞嵎</span> </template> </el-table-column> - <el-table-column align="center" prop="questionCount" label="棰樼洰鏁伴噺" width="100px" /> + <el-table-column align="center" prop="num" label="棰樼洰鏁伴噺" width="100px" /> <el-table-column align="center" prop="systemScore" label="鎬诲垎" width="100px" /> <el-table-column align="center" prop="suggestTime" label="寤鸿鏃堕暱" width="100px" /> <el-table-column align="center" prop="personAnswerNum" label="鍙傝�冧汉鏁�" width="100px"> diff --git a/src/views/education/resource/list.vue b/src/views/education/resource/list.vue new file mode 100644 index 0000000..04229c2 --- /dev/null +++ b/src/views/education/resource/list.vue @@ -0,0 +1,322 @@ +<template> + <div class="warp"> + <div class="search"> + <el-form :inline="true" :model="searchForm" class="demo-form-inline"> + <el-form-item label="涓婚"> + <el-input v-model="searchForm.introduction" size="small" placeholder="涓婚鍐呭" clearable @clear="page"></el-input> + </el-form-item> + <el-form-item label="绉戠洰"> + <el-select v-model="searchForm.subjectId" clearable @clear="page" @change="page" placeholder="绉戠洰"> + <el-option v-for="item in typeList" :key="item.id" :label="item.name" :value="item.id"> + </el-option> + </el-select> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="page" size="small">鏌ヨ</el-button> + </el-form-item> + </el-form> + <div> + <el-button type="primary" @click="handlerAdd" size="small">娣诲姞</el-button> + <el-button type="danger" @click="batchRemove" size="small" style="margin-left: 5px">鍒犻櫎</el-button> + </div> + </div> + + + <el-table :data="tableData" border @selection-change="handleSelectionChange" style="width: 100%"> + <el-table-column type="selection" width="55"> + </el-table-column> + <el-table-column fixed prop="introduction" label="涓婚绠�浠�"> + </el-table-column> + <el-table-column prop="typeName" label="绉戠洰"> + </el-table-column> + <el-table-column prop="contentType" :formatter="typeFormatter" label="鏂囦欢绫诲瀷"> + </el-table-column> + <el-table-column label="鏂囦欢鍐呭" width="240"> + <template slot-scope="scope"> + <video controls v-if="scope.row.contentType === 'video'" :src="'/api/files/' + scope.row.contentUrl.url" + class="showContent" /> + <el-image v-if="scope.row.contentType === 'img'" :src="'/api/files/' + scope.row.contentUrl.url" + class="showContent"></el-image> + <!-- <img v-if="scope.row.contentType === 'img'" :src="'/api/files/' + scope.row.contentUrl.url" + class="showContent" /> --> + <el-link type="primary" v-if="scope.row.contentType === 'pdf'" class="showContent" + @click="checkPdf('/api/files/' + scope.row.contentUrl.url)">鐐瑰嚮鏌ョ湅</el-link> + </template> + </el-table-column> + <el-table-column prop="attachment" label="闄勪欢"> + <template slot-scope="scope"> + <div v-for="item in scope.row.attachment" :key="item.url"> + <el-link type="primary" :href="'/api/upload/download?url=' + item.url +'&fileName=' + item.name" >{{ item.name }}</el-link> + </div> + </template> + </el-table-column> + <el-table-column fixed="right" label="鎿嶄綔" width="140"> + <template slot-scope="scope"> + <el-button @click="handleUpdate(scope.row)" type="primary" size="small" + style="margin-right: 5px">淇敼</el-button> + <el-popconfirm :title="getTitle(scope.row.typeName)" @confirm="remove(scope.row.id)"> + <el-button slot="reference" type="danger" size="small">鍒犻櫎</el-button> + </el-popconfirm> + </template> + </el-table-column> + </el-table> + + <pagination v-show="total > 0" :total="total" :page.sync="searchForm.pageNum" :limit.sync="searchForm.pageSize" + @pagination="page" /> + + <el-dialog :title="dialogTitle" :visible.sync="open" width="600px" :close-on-click-modal="false" + :before-close="handleClose"> + <el-form label-position="left" label-width="120px" ref="form" :rules="rules" :model="form"> + <el-form-item label="涓婚绠�浠�" prop="introduction"> + <el-input v-model="form.introduction" placeholder="涓婚鍐呭"></el-input> + </el-form-item> + <el-form-item label="绉戠洰" prop="subjectId"> + <el-select v-model="form.subjectId" placeholder="绉戠洰"> + <el-option v-for="item in typeList" :key="item.id" :label="item.name" :value="item.id"> + </el-option> + </el-select> + </el-form-item> + <el-form-item label="鏂囦欢绫诲瀷" prop="contentType"> + <el-select v-model="form.contentType" placeholder="涓嶅悓绫诲瀷鐨勬枃浠堕槄瑙堟柟寮忎笉鍚岋紝澶氫綑鏂囦欢璇蜂互闄勪欢褰㈠紡涓婁紶" @change="fileChange"> + <el-option label="瑙嗛" value="video"></el-option> + <el-option label="PDF" value="pdf"></el-option> + <el-option label="鍥剧墖" value="img"></el-option> + </el-select> + </el-form-item> + <el-form-item label="涓婁紶鏂囦欢(涓�涓�)" prop="contentUrl"> + <upload v-show="form.contentType" ref="upload" :fileUrl="form.contentUrl" :fileType="form.contentType" + :fileSizeLimitM="1024" :uploadNum="1" @getUploadUrl="getUploadUrl" @removeFile="removeFile" /> + </el-form-item> + <el-form-item label="闄勪欢(鏈�澶�3涓�)" prop="attachment"> + <upload :fileSizeLimitM="1024" :uploadNum="3" :fileUrl="form.attachment" + @getUploadUrl="getUploadAttachmentUrl" @removeFile="removeAttachmentFile" /> + </el-form-item> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="open = false">鍙� 娑�</el-button> + <el-button type="primary" @click="handlerSubmit">淇� 瀛�</el-button> + </span> + </el-dialog> + + <el-dialog title="PDF鏌ョ湅" :visible.sync="pdfDialog" width="80%" :before-close="closePdfDialog"> + <vue-office-pdf :src="pdf" @rendered="rendered" style="min-height: 400px; max-height: 800px;"/> + </el-dialog> + </div> +</template> + +<script> +import Pagination from '@/components/Pagination'; +import EducationResourceAPI from '@/api/educationResource'; +import SubjectAPI from '@/api/subject'; +import Upload from '@/components/UploadC'; + +import VueOfficePdf from '@vue-office/pdf'; +export default { + name: 'type', + components: { Upload, Pagination, VueOfficePdf }, + computed: { + fileContentUrl: () => { + return this.form ? this.form.contentUrl ? [this.form.contentUrl] : [] : []; + } + }, + data() { + return { + pdf: '', + dialogTitle: '娣诲姞瀛︿範鍐呭', + ids: [], + typeList: [], + searchForm: { + pageNum: 1, + pageSize: 5, + subjectId: null, + introduction: null + }, + total: 0, + tableData: [], + open: false, + pdfDialog: false, + form: { + contentType: 'video', + introduction: '', + belongType: 2, + contentUrl: [], + attachment: [], + temp: [] + }, + rules: { + contentUrl: [ + { required: true, message: '璇蜂笂浼犳枃浠�', trigger: 'blur' }, + ], + introduction: [ + { required: true, message: '璇疯緭鍏ヤ富棰樺唴瀹�', trigger: 'blur' }, + ], + belongType: [ + { required: true, message: '璇烽�夋嫨瀛︿範鍒嗙被', trigger: 'change' } + ], + contentType: [ + { required: true, message: '璇烽�夋嫨鏂囦欢绫诲瀷', trigger: 'change' } + ] + } + }; + }, + methods: { + checkPdf(url) { + this.pdf = url; + this.pdfDialog = true; + }, + closePdfDialog() { + this.pdfDialog = false; + }, + rendered() { + + }, + fileChange() { + this.form.contentUrl = []; + }, + handleSelectionChange(val) { + this.ids = val.map(item => item.id); + }, + typeFormatter(row) { + if (row.contentType === 'video') { + return "瑙嗛"; + } + if (row.contentType === 'img') { + return "鍥剧墖"; + } + if (row.contentType === 'pdf') { + return "PDF"; + } + }, + clearFile() { + this.form.contentUrl = []; + this.$refs.upload.clearFile(); + }, + removeFile() { + this.form.contentUrl = []; + }, + removeAttachmentFile (fileList, fileName) { + this.form.attachment = fileList.filter(item => item.name !== fileName); + }, + getUploadAttachmentUrl (uploadData) { + this.form.attachment = uploadData; + }, + getUploadUrl (uploadData) { + this.form.contentUrl = uploadData; + }, + remove (id) { + EducationResourceAPI.remove([id]).then(res => { + if (res.code === 1) { + this.$message.success('鍒犻櫎鎴愬姛'); + this.page() + } + }); + }, + batchRemove() { + if (this.ids.length < 1) { + this.$message.warning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁"); + } + EducationResourceAPI.remove(this.ids).then(res => { + if (res.code === 1) { + this.$message.success('鍒犻櫎鎴愬姛'); + this.ids = []; + } + }); + }, + getTitle (typeName) { + return '纭畾瑕佸垹闄�' + typeName + '杩欎釜鏂囦欢鍚楋紵'; + }, + handlerSubmit () { + this.$refs['form'].validate((valid) => { + if (valid) { + const temp = JSON.parse(JSON.stringify(this.form)); + // this.form.contentUrl = this.form.contentUrl[0] + temp.contentUrl = temp.contentUrl[0]; + if (temp.id) { + EducationResourceAPI.update(temp).then(res => { + if (res.code === 1) { + this.$message.success('淇敼鎴愬姛'); + this.open = false; + this.page(); + } + }); + } else { + EducationResourceAPI.add(temp).then(res => { + if (res.code === 1) { + this.$message.success('娣诲姞鎴愬姛'); + this.open = false; + this.page(); + } + }); + } + } + }); + }, + resetForm() { + this.form = { + contentType: 'video', + introduction: '', + belongType: 2, + contentUrl: [], + attachment: [], + temp: [] + }; + }, + handleClose() { + this.open = false; + this.resetForm(); + }, + handlerAdd() { + this.resetForm(); + this.open = true; + this.dialogTitle = '娣诲姞瀛︿範鍐呭'; + }, + page() { + EducationResourceAPI.page(this.searchForm).then(res => { + if (res.code === 1) { + this.tableData = res.data; + this.total = res.total; + } + }); + }, + handleUpdate(row) { + this.form.id = row.id; + this.form.contentType = row.contentType; + this.form.contentUrl = [row.contentUrl] || []; + this.form.attachment = row.attachment || []; + this.form.introduction = row.introduction; + this.form.belongType = row.belongType; + this.dialogTitle = '淇敼瀛︿範鍐呭'; + this.open = true; + } + }, + mounted() { + this.page(); + SubjectAPI.list().then(res => { + if (res.code === 1) { + this.typeList = res.data; + } + }); + } +}; +</script> + +<style scoped> +.showContent { + width: 100%; + min-height: 80px; + object-fit: contain; +} + +.warp { + margin: 40px 10px; +} + +.search { + margin-top: 10px; +} +::v-deep .el-image__error { + position: absolute; + top: 0; + bottom: 0; +} +</style> diff --git a/src/views/exam/question/edit/audio.vue b/src/views/exam/question/edit/audio.vue index 4743443..fe66b6d 100644 --- a/src/views/exam/question/edit/audio.vue +++ b/src/views/exam/question/edit/audio.vue @@ -14,7 +14,7 @@ :on-remove="handleRemove" :file-list="audioList"> <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button> <el-button v-if="form.audioFile" size="small" type="primary" @click.stop="audioPlay(form.audioFile)">{{ - audioInstance ? '鏆傚仠' : '璇曞惉' }}</el-button> + audioInstance ? '鍋滄' : '鎾斁' }}</el-button> </el-upload> </el-form-item> <el-form-item label="閫夐」锛�" required> -- Gitblit v1.8.0