Commit 3ba60a6372a38d6ca6746923bd23045b3f6ac555
1 parent
5be3bb70
发卡补卡,设备状态上传下载接口联调
Showing
8 changed files
with
676 additions
and
382 deletions
src/api/apis/apis.js
| ... | ... | @@ -529,6 +529,13 @@ export default { |
| 529 | 529 | data, |
| 530 | 530 | }); |
| 531 | 531 | }, |
| 532 | + // 导入基站模板下载地址 | |
| 533 | + stationTemplateUrl() { | |
| 534 | + return service({ | |
| 535 | + url: setUpUrls.stationTemplateUrl, | |
| 536 | + method: "POST", | |
| 537 | + }); | |
| 538 | + }, | |
| 532 | 539 | // 查询下载配置列表 |
| 533 | 540 | appConfigList(data) { |
| 534 | 541 | return service({ |
| ... | ... | @@ -594,6 +601,14 @@ export default { |
| 594 | 601 | responseType: 'arraybuffer', |
| 595 | 602 | }); |
| 596 | 603 | }, |
| 604 | + // 发卡应用下载 | |
| 605 | + latestClickersApp(data) { | |
| 606 | + return service({ | |
| 607 | + url: setUpUrls.latestClickersApp, | |
| 608 | + method: "POST", | |
| 609 | + data, | |
| 610 | + }); | |
| 611 | + }, | |
| 597 | 612 | |
| 598 | 613 | /** |
| 599 | 614 | * 集团管理员-学校管理 | ... | ... |
src/api/urls/apis.js
| ... | ... | @@ -134,6 +134,8 @@ export default { |
| 134 | 134 | updateDevice: "/api_html/school/manager/updateDevice", |
| 135 | 135 | // 新增基站 |
| 136 | 136 | addStation: "/api_html/school/manager/addStation", |
| 137 | + // 导入基站模板下载地址 | |
| 138 | + stationTemplateUrl: "/api_html/school/manager/stationTemplateUrl", | |
| 137 | 139 | // 查询下载配置列表 |
| 138 | 140 | appConfigList: "/api_html/school/manager/appConfigList", |
| 139 | 141 | // 查询最新的授课端应用版本 |
| ... | ... | @@ -147,9 +149,11 @@ export default { |
| 147 | 149 | // 设备使用分析 |
| 148 | 150 | usageAnalysis: "/api_html/school/manager/usageAnalysis", |
| 149 | 151 | // 发卡记录 |
| 150 | - cardList: "/api_html/school/manager/cardList", | |
| 152 | + cardList: "/api_html/school/manager/clickersLogList", | |
| 151 | 153 | // 导出设备使用分析 |
| 152 | 154 | exportUsageAnalysis: "/api_html/school/manager/exportUsageAnalysis", |
| 155 | + // 发卡应用下载 | |
| 156 | + latestClickersApp: "/api_html/school/manager/latestClickersApp", | |
| 153 | 157 | |
| 154 | 158 | |
| 155 | 159 | // 查询区域列表 | ... | ... |
src/components/upload.vue
| ... | ... | @@ -76,7 +76,6 @@ export default { |
| 76 | 76 | // } |
| 77 | 77 | }, |
| 78 | 78 | upSuccess(res) { |
| 79 | - debugger | |
| 80 | 79 | if (res && res.status == 0 ) { |
| 81 | 80 | this.$message.success("上传成功"); |
| 82 | 81 | this.$emit("upSuccess"); |
| ... | ... | @@ -85,7 +84,6 @@ export default { |
| 85 | 84 | } |
| 86 | 85 | }, |
| 87 | 86 | upError(res) { |
| 88 | - debugger | |
| 89 | 87 | if (res && res.status == 0) { |
| 90 | 88 | this.$message.error("上传失败"); |
| 91 | 89 | } else { | ... | ... |
src/views/card/index.vue
| ... | ... | @@ -10,6 +10,7 @@ |
| 10 | 10 | <div class="answer-header"> |
| 11 | 11 | <div class="sel-box"> |
| 12 | 12 | <el-cascader |
| 13 | + @change="_QueryData(1)" | |
| 13 | 14 | size="small" |
| 14 | 15 | class="sel" |
| 15 | 16 | clearable |
| ... | ... | @@ -53,18 +54,20 @@ |
| 53 | 54 | v-if="!tableData.length && !loading" |
| 54 | 55 | description="暂无数据" |
| 55 | 56 | ></el-empty> |
| 56 | - <div v-else class="table-box"> | |
| 57 | + <div v-else class="table-box" v-loading="loading"> | |
| 57 | 58 | <el-table :data="tableData" border style="width: 100%"> |
| 58 | 59 | <el-table-column |
| 59 | 60 | align="center" |
| 60 | 61 | label="答题器编码" |
| 61 | - prop="sn" | |
| 62 | - ></el-table-column> | |
| 63 | - <el-table-column | |
| 64 | - align="center" | |
| 65 | - label="班级" | |
| 66 | - prop="className" | |
| 62 | + prop="clickerSn" | |
| 67 | 63 | ></el-table-column> |
| 64 | + <el-table-column align="center" label="班级"> | |
| 65 | + <template slot-scope="scope"> | |
| 66 | + <span v-for="item in scope.row.classList" :key="item.classCode">{{ | |
| 67 | + item.className | |
| 68 | + }}</span> | |
| 69 | + </template> | |
| 70 | + </el-table-column> | |
| 68 | 71 | <el-table-column |
| 69 | 72 | align="center" |
| 70 | 73 | label="学生姓名" |
| ... | ... | @@ -75,22 +78,40 @@ |
| 75 | 78 | label="学号" |
| 76 | 79 | prop="studentId" |
| 77 | 80 | ></el-table-column> |
| 78 | - <el-table-column | |
| 79 | - align="center" | |
| 80 | - label="类型" | |
| 81 | - prop="type" | |
| 82 | - ></el-table-column> | |
| 83 | - <el-table-column | |
| 84 | - align="center" | |
| 85 | - label="描述" | |
| 86 | - prop="desc" | |
| 87 | - ></el-table-column> | |
| 81 | + <el-table-column align="center" label="类型"> | |
| 82 | + <template slot-scope="scope"> | |
| 83 | + {{ scope.row.operationType == 0 ? "发卡" : "补卡" }} | |
| 84 | + </template></el-table-column | |
| 85 | + > | |
| 86 | + <el-table-column align="center" label="描述"> | |
| 87 | + <template slot-scope="scope"> | |
| 88 | + {{ | |
| 89 | + scope.row.operationType == 0 | |
| 90 | + ? "--" | |
| 91 | + : scope.row.reason == 0 | |
| 92 | + ? "丢失" | |
| 93 | + : "损坏" | |
| 94 | + }} | |
| 95 | + </template></el-table-column | |
| 96 | + > | |
| 88 | 97 | <el-table-column |
| 89 | 98 | align="center" |
| 90 | 99 | label="操作时间" |
| 91 | - prop="time" | |
| 100 | + prop="modifiedTime" | |
| 92 | 101 | ></el-table-column> |
| 93 | 102 | </el-table> |
| 103 | + <div class="pagination-box"> | |
| 104 | + <el-pagination | |
| 105 | + small="" | |
| 106 | + layout="total,prev, pager, next" | |
| 107 | + :hide-on-single-page="true" | |
| 108 | + :total="total" | |
| 109 | + @current-change="changePage" | |
| 110 | + :current-page="page" | |
| 111 | + :page-size="size" | |
| 112 | + > | |
| 113 | + </el-pagination> | |
| 114 | + </div> | |
| 94 | 115 | </div> |
| 95 | 116 | </div> |
| 96 | 117 | </div> |
| ... | ... | @@ -100,19 +121,23 @@ |
| 100 | 121 | export default { |
| 101 | 122 | data() { |
| 102 | 123 | return { |
| 103 | - loading:false, | |
| 104 | - props: { multiple: true, checkStrictly: false }, | |
| 124 | + loading: false, | |
| 125 | + props: { multiple: false }, | |
| 105 | 126 | query: { |
| 106 | - classId: [], | |
| 127 | + classId: "", | |
| 107 | 128 | studentName: "", |
| 108 | 129 | studentCode: "", |
| 109 | 130 | }, |
| 110 | 131 | gradeList: [], |
| 111 | 132 | tableData: [], |
| 133 | + page: 1, | |
| 134 | + size: 20, | |
| 135 | + total: 0, | |
| 112 | 136 | }; |
| 113 | 137 | }, |
| 114 | 138 | created() { |
| 115 | - // this._QueryGradeList(); | |
| 139 | + this._QueryGradeList(); | |
| 140 | + this._QueryData(); | |
| 116 | 141 | }, |
| 117 | 142 | methods: { |
| 118 | 143 | // 查找班级 |
| ... | ... | @@ -142,12 +167,15 @@ export default { |
| 142 | 167 | this.$message.error(info); |
| 143 | 168 | } |
| 144 | 169 | }, |
| 170 | + changePage(page) { | |
| 171 | + this.page = page; | |
| 172 | + this._QueryData(4); | |
| 173 | + }, | |
| 145 | 174 | async _QueryData(type) { |
| 146 | 175 | let query = {}; |
| 147 | 176 | query.gradeName = this.query.gradeName; |
| 148 | - query.classId = this.query.classId; | |
| 149 | 177 | if (type == 1) { |
| 150 | - query.classId = this.query.classId; | |
| 178 | + query.classId = this.query.classId[1] ? this.query.classId[1] : ""; | |
| 151 | 179 | this.query.studentCode = ""; |
| 152 | 180 | this.query.studentName = ""; |
| 153 | 181 | } else if (type == 2) { |
| ... | ... | @@ -158,15 +186,20 @@ export default { |
| 158 | 186 | query.studentCode = this.query.studentCode; |
| 159 | 187 | this.query.classId = ""; |
| 160 | 188 | this.query.studentName = ""; |
| 189 | + } else { | |
| 190 | + query = { ...this.query }; | |
| 161 | 191 | } |
| 162 | 192 | this.loading = true; |
| 163 | 193 | const { data, status, info } = await this.$request.cardList({ |
| 164 | 194 | ...query, |
| 195 | + page: this.page, | |
| 196 | + size: 20, | |
| 165 | 197 | }); |
| 166 | 198 | this.loading = false; |
| 167 | 199 | console.log(status); |
| 168 | 200 | if (status === 0) { |
| 169 | 201 | this.tableData = data.list || []; |
| 202 | + this.total = data.count; | |
| 170 | 203 | } else { |
| 171 | 204 | this.$message.error(info); |
| 172 | 205 | } | ... | ... |
src/views/device/index.vue
| ... | ... | @@ -5,7 +5,7 @@ |
| 5 | 5 | <span>设备管理</span> |
| 6 | 6 | </template> |
| 7 | 7 | <template slot="btns" v-if="role != 'ROLE_JITUAN' && type == 1 && !code"> |
| 8 | - <!-- <el-tooltip effect="dark" content="设备导入" placement="bottom"> | |
| 8 | + <el-tooltip effect="dark" content="设备导入" placement="bottom"> | |
| 9 | 9 | <el-button |
| 10 | 10 | type="primary" |
| 11 | 11 | icon="el-icon-upload2" |
| ... | ... | @@ -14,7 +14,7 @@ |
| 14 | 14 | circle |
| 15 | 15 | @click="diaUp = true" |
| 16 | 16 | ></el-button> |
| 17 | - </el-tooltip> --> | |
| 17 | + </el-tooltip> | |
| 18 | 18 | <el-tooltip |
| 19 | 19 | v-if="role == 'ROLE_XUEXIAO'" |
| 20 | 20 | effect="dark" |
| ... | ... | @@ -400,7 +400,6 @@ |
| 400 | 400 | </div> |
| 401 | 401 | <el-dialog title="设备导入" :visible.sync="diaUp" width="400"> |
| 402 | 402 | <up-load |
| 403 | - id="downDevice" | |
| 404 | 403 | :url="url" |
| 405 | 404 | @upSuccess="upSuccess" |
| 406 | 405 | fileName="设备信息" |
| ... | ... | @@ -526,7 +525,7 @@ export default { |
| 526 | 525 | role: "", |
| 527 | 526 | code: "", |
| 528 | 527 | loading: false, |
| 529 | - url: "/web/upLoadDevice", | |
| 528 | + url: "/api_html/teaching/importStation", | |
| 530 | 529 | diaUp: false, |
| 531 | 530 | diaAnswerEqu: false, |
| 532 | 531 | gradeList: [], |
| ... | ... | @@ -788,16 +787,17 @@ export default { |
| 788 | 787 | } |
| 789 | 788 | }, |
| 790 | 789 | async downExcel() { |
| 791 | - let data = await this.$request.downDevice({ | |
| 790 | + let { data, status, info } = await this.$request.stationTemplateUrl({ | |
| 792 | 791 | id: this.id, |
| 793 | 792 | }); |
| 794 | - if (data && !data.code) { | |
| 795 | - let blob = new Blob([data], { | |
| 796 | - type: "application/vnd.ms-excel;charset=utf-8", | |
| 797 | - }); | |
| 798 | - downloadFile(`设备信息.xlsx`, blob); | |
| 793 | + if (status == 0) { | |
| 794 | + const a = document.createElement("a"); | |
| 795 | + a.href = data.downloadUrl; | |
| 796 | + document.body.appendChild(a); | |
| 797 | + a.click(); | |
| 798 | + a.remove(); | |
| 799 | 799 | } else { |
| 800 | - this.$message.error(data.info); | |
| 800 | + this.$message.error(info); | |
| 801 | 801 | } |
| 802 | 802 | }, |
| 803 | 803 | ... | ... |
src/views/down/index.vue
| ... | ... | @@ -12,11 +12,11 @@ |
| 12 | 12 | </p> |
| 13 | 13 | <el-button plan round @click="links">授课端下载</el-button> |
| 14 | 14 | </div> |
| 15 | - <div class="down-item"> | |
| 15 | + <div class="down-item" v-loading="loading"> | |
| 16 | 16 | <p class="txt"> |
| 17 | 17 | 配合发卡器硬件,方便学校管理员进行发卡补卡操作的软件。 |
| 18 | 18 | </p> |
| 19 | - <el-button plan round>发卡软件下载</el-button> | |
| 19 | + <el-button plan round @click="downCard">发卡软件下载</el-button> | |
| 20 | 20 | </div> |
| 21 | 21 | </div> |
| 22 | 22 | </div> |
| ... | ... | @@ -24,12 +24,33 @@ |
| 24 | 24 | |
| 25 | 25 | <script> |
| 26 | 26 | export default { |
| 27 | + data() { | |
| 28 | + return { | |
| 29 | + loading: false, | |
| 30 | + }; | |
| 31 | + }, | |
| 27 | 32 | methods: { |
| 28 | 33 | links() { |
| 29 | 34 | this.$router.push({ |
| 30 | 35 | path: "/downClient", |
| 31 | 36 | }); |
| 32 | 37 | }, |
| 38 | + async downCard() { | |
| 39 | + if (this.loading == true) return; | |
| 40 | + this.loading = true; | |
| 41 | + const { data, status, info } = await this.$request.latestClickersApp(); | |
| 42 | + this.loading = false; | |
| 43 | + if (status == 0) { | |
| 44 | + const a = document.createElement("a"); | |
| 45 | + a.href = data.downloadUrl; | |
| 46 | + a.download = data.appName; | |
| 47 | + document.body.appendChild(a); | |
| 48 | + a.click(); | |
| 49 | + a.remove(); | |
| 50 | + } else { | |
| 51 | + this.$message.error(info); | |
| 52 | + } | |
| 53 | + }, | |
| 33 | 54 | }, |
| 34 | 55 | }; |
| 35 | 56 | </script> | ... | ... |
src/views/examinationPaper/add.vue
| ... | ... | @@ -185,8 +185,19 @@ |
| 185 | 185 | </el-dialog> |
| 186 | 186 | </div> |
| 187 | 187 | <div v-show="step == 1"> |
| 188 | - <div v-for="(question, index) in form.questionList" :key="index"> | |
| 188 | + <div | |
| 189 | + class="question-box" | |
| 190 | + v-for="(question, index) in form.questionList" | |
| 191 | + :key="index" | |
| 192 | + > | |
| 189 | 193 | <p class="question-title"> |
| 194 | + <el-tooltip effect="dark" :content="question.show?'收起':'展开'" placement="left"> | |
| 195 | + <i | |
| 196 | + class="el-icon-caret-right" | |
| 197 | + :class="question.show ? 'active' : ''" | |
| 198 | + @click="question.show = !question.show" | |
| 199 | + ></i> | |
| 200 | + </el-tooltip> | |
| 190 | 201 | <span>{{ setBigNum(index) }}、</span> |
| 191 | 202 | <el-input |
| 192 | 203 | class="ipt" |
| ... | ... | @@ -210,128 +221,143 @@ |
| 210 | 221 | <span class="m20">共:{{ question.subQuestions.length }}题</span> |
| 211 | 222 | <span>共:{{ setScore(question) }}分</span> |
| 212 | 223 | </p> |
| 213 | - <ul class="questions-ul"> | |
| 214 | - <li class="sub-questions"> | |
| 215 | - <div class="qs-num">题号</div> | |
| 216 | - <div class="qs-type">题型</div> | |
| 217 | - <div class="qs-score">分数</div> | |
| 218 | - <div class="qs-partScore">漏选得分</div> | |
| 219 | - <div class="qs-options">选项设置</div> | |
| 220 | - <div class="qs-set">操作</div> | |
| 221 | - </li> | |
| 222 | - <li | |
| 223 | - class="sub-questions" | |
| 224 | - v-for="(subQuestions, indexs) in question.subQuestions" | |
| 225 | - :key="indexs" | |
| 226 | - > | |
| 227 | - <div class="qs-num">{{ setNum(index, indexs) }}</div> | |
| 228 | - <div class="qs-type"> | |
| 229 | - <el-select | |
| 230 | - v-model="subQuestions.questionType" | |
| 231 | - placeholder="选择题目类型" | |
| 232 | - @change="changeSubQuestions($event, subQuestions)" | |
| 233 | - > | |
| 234 | - <el-option label="单选题" :value="2"></el-option> | |
| 235 | - <el-option label="多选题" :value="3"></el-option> | |
| 236 | - <el-option label="判断题" :value="4"></el-option> | |
| 237 | - <el-option label="主观题" :value="5"></el-option> | |
| 238 | - </el-select> | |
| 239 | - </div> | |
| 240 | - <div class="qs-score"> | |
| 241 | - <el-input-number | |
| 242 | - class="number-ipt" | |
| 243 | - size="medium" | |
| 244 | - :min="1" | |
| 245 | - :max="200" | |
| 246 | - :precision="2" | |
| 247 | - :step="1" | |
| 248 | - v-model="subQuestions.score" | |
| 249 | - label="单题分值" | |
| 250 | - ></el-input-number> | |
| 251 | - </div> | |
| 252 | - <div class="qs-partScore"> | |
| 253 | - <p v-if="subQuestions.questionType != 3">--</p> | |
| 254 | - <el-input-number | |
| 255 | - class="number-ipt" | |
| 256 | - v-else | |
| 257 | - size="medium" | |
| 258 | - :min="0" | |
| 259 | - :precision="2" | |
| 260 | - :max="subQuestions.score" | |
| 261 | - :step="0.5" | |
| 262 | - v-model="subQuestions.partScore" | |
| 263 | - label="漏选得分" | |
| 264 | - ></el-input-number> | |
| 265 | - </div> | |
| 266 | - <div class="qs-options"> | |
| 267 | - <p v-if="subQuestions.questionType == 5">--</p> | |
| 268 | - <p | |
| 269 | - v-else-if="subQuestions.questionType == 4" | |
| 270 | - class="answer-box" | |
| 271 | - > | |
| 272 | - <span class="answer-s">✓</span> | |
| 273 | - <span class="answer-s">✗</span> | |
| 274 | - </p> | |
| 275 | - <p v-else class="answer-box"> | |
| 276 | - <span | |
| 277 | - class="answer-s" | |
| 278 | - v-for="option in subQuestions.answerOptions.split(',')" | |
| 279 | - :key="option" | |
| 280 | - >{{ option }}</span | |
| 224 | + <transition name="el-zoom-in-top"> | |
| 225 | + <ul v-show="question.show" class="questions-ul"> | |
| 226 | + <li class="sub-questions"> | |
| 227 | + <div class="qs-num">题号</div> | |
| 228 | + <div class="qs-type">题型</div> | |
| 229 | + <div class="qs-score">分数</div> | |
| 230 | + <div class="qs-partScore">漏选得分</div> | |
| 231 | + <div class="qs-options">选项设置</div> | |
| 232 | + <div class="qs-set">操作</div> | |
| 233 | + </li> | |
| 234 | + <li | |
| 235 | + class="sub-questions" | |
| 236 | + v-for="(subQuestions, indexs) in question.subQuestions" | |
| 237 | + :key="indexs" | |
| 238 | + > | |
| 239 | + <div class="qs-num">{{ setNum(index, indexs) }}</div> | |
| 240 | + <div class="qs-type"> | |
| 241 | + <el-select | |
| 242 | + v-model="subQuestions.questionType" | |
| 243 | + placeholder="选择题目类型" | |
| 244 | + @change="changeSubQuestions($event, subQuestions)" | |
| 281 | 245 | > |
| 282 | - <el-button | |
| 283 | - size="mini" | |
| 284 | - type="primary" | |
| 285 | - icon="el-icon-plus" | |
| 286 | - circle | |
| 287 | - @click="addOptions(subQuestions)" | |
| 288 | - ></el-button> | |
| 289 | - <el-button | |
| 290 | - size="mini" | |
| 291 | - type="primary" | |
| 292 | - icon="el-icon-minus" | |
| 293 | - round | |
| 294 | - circle | |
| 295 | - @click="removeOptions(subQuestions)" | |
| 296 | - ></el-button> | |
| 297 | - </p> | |
| 298 | - </div> | |
| 299 | - <div class="qs-set"> | |
| 300 | - <el-popconfirm | |
| 301 | - title="确定删除这道题吗?" | |
| 302 | - @confirm="delTabData(indexs, index)" | |
| 303 | - > | |
| 304 | - <el-button | |
| 305 | - slot="reference" | |
| 306 | - class="delete" | |
| 307 | - type="danger" | |
| 308 | - size="mini" | |
| 309 | - circle | |
| 310 | - icon="el-icon-delete" | |
| 311 | - ></el-button> | |
| 312 | - </el-popconfirm> | |
| 313 | - </div> | |
| 314 | - </li> | |
| 315 | - <li class="sub-questions"> | |
| 316 | - <div class="qs-num">添加</div> | |
| 317 | - <div class="qs-type"> | |
| 318 | - <el-select | |
| 319 | - v-model="addSubQuestionsType" | |
| 320 | - placeholder="选择题目类型" | |
| 321 | - @change="changeAddSubQuestions($event, question)" | |
| 322 | - > | |
| 323 | - <el-option label="单选题" :value="2"></el-option> | |
| 324 | - <el-option label="多选题" :value="3"></el-option> | |
| 325 | - <el-option label="判断题" :value="4"></el-option> | |
| 326 | - <el-option label="主观题" :value="5"></el-option> | |
| 327 | - </el-select> | |
| 328 | - </div> | |
| 329 | - <div class="qs-score"></div> | |
| 330 | - <div class="qs-partScore"></div> | |
| 331 | - <div class="qs-options"></div> | |
| 332 | - <div class="qs-set"></div> | |
| 333 | - </li> | |
| 334 | - </ul> | |
| 246 | + <el-option label="单选题" :value="2"></el-option> | |
| 247 | + <el-option label="多选题" :value="3"></el-option> | |
| 248 | + <el-option label="判断题" :value="4"></el-option> | |
| 249 | + <el-option label="主观题" :value="5"></el-option> | |
| 250 | + </el-select> | |
| 251 | + </div> | |
| 252 | + <div class="qs-score"> | |
| 253 | + <el-input-number | |
| 254 | + class="number-ipt" | |
| 255 | + size="medium" | |
| 256 | + :min="1" | |
| 257 | + :max="200" | |
| 258 | + :precision="2" | |
| 259 | + :step="1" | |
| 260 | + v-model="subQuestions.score" | |
| 261 | + label="单题分值" | |
| 262 | + ></el-input-number> | |
| 263 | + </div> | |
| 264 | + <div class="qs-partScore"> | |
| 265 | + <p v-if="subQuestions.questionType != 3">--</p> | |
| 266 | + <el-input-number | |
| 267 | + class="number-ipt" | |
| 268 | + v-else | |
| 269 | + size="medium" | |
| 270 | + :min="0" | |
| 271 | + :precision="2" | |
| 272 | + :max="subQuestions.score" | |
| 273 | + :step="0.5" | |
| 274 | + v-model="subQuestions.partScore" | |
| 275 | + label="漏选得分" | |
| 276 | + ></el-input-number> | |
| 277 | + </div> | |
| 278 | + <div class="qs-options"> | |
| 279 | + <p v-if="subQuestions.questionType == 5">--</p> | |
| 280 | + <p | |
| 281 | + v-else-if="subQuestions.questionType == 4" | |
| 282 | + class="answer-box" | |
| 283 | + > | |
| 284 | + <span | |
| 285 | + class="answer-s" | |
| 286 | + :class="subQuestions.correctAnswer == 1 ? 'active' : ''" | |
| 287 | + >✓</span | |
| 288 | + > | |
| 289 | + <span | |
| 290 | + class="answer-s" | |
| 291 | + :class="subQuestions.correctAnswer == 2 ? 'active' : ''" | |
| 292 | + >✗</span | |
| 293 | + > | |
| 294 | + </p> | |
| 295 | + <p v-else class="answer-box"> | |
| 296 | + <span | |
| 297 | + class="answer-s" | |
| 298 | + v-for="option in subQuestions.answerOptions.split(',')" | |
| 299 | + :key="option" | |
| 300 | + :class=" | |
| 301 | + subQuestions.correctAnswer?.includes(option) | |
| 302 | + ? 'active' | |
| 303 | + : '' | |
| 304 | + " | |
| 305 | + >{{ option }}</span | |
| 306 | + > | |
| 307 | + <el-button | |
| 308 | + size="mini" | |
| 309 | + type="primary" | |
| 310 | + icon="el-icon-plus" | |
| 311 | + circle | |
| 312 | + @click="addOptions(subQuestions)" | |
| 313 | + ></el-button> | |
| 314 | + <el-button | |
| 315 | + size="mini" | |
| 316 | + type="primary" | |
| 317 | + icon="el-icon-minus" | |
| 318 | + round | |
| 319 | + circle | |
| 320 | + @click="removeOptions(subQuestions)" | |
| 321 | + ></el-button> | |
| 322 | + </p> | |
| 323 | + </div> | |
| 324 | + <div class="qs-set"> | |
| 325 | + <el-popconfirm | |
| 326 | + title="确定删除这道题吗?" | |
| 327 | + @confirm="delTabData(indexs, index)" | |
| 328 | + > | |
| 329 | + <el-button | |
| 330 | + slot="reference" | |
| 331 | + class="delete" | |
| 332 | + type="danger" | |
| 333 | + size="mini" | |
| 334 | + circle | |
| 335 | + icon="el-icon-delete" | |
| 336 | + ></el-button> | |
| 337 | + </el-popconfirm> | |
| 338 | + </div> | |
| 339 | + </li> | |
| 340 | + <li class="sub-questions"> | |
| 341 | + <div class="qs-num">添加</div> | |
| 342 | + <div class="qs-type"> | |
| 343 | + <el-select | |
| 344 | + v-model="addSubQuestionsType" | |
| 345 | + placeholder="选择题目类型" | |
| 346 | + @change="changeAddSubQuestions($event, question)" | |
| 347 | + > | |
| 348 | + <el-option label="单选题" :value="2"></el-option> | |
| 349 | + <el-option label="多选题" :value="3"></el-option> | |
| 350 | + <el-option label="判断题" :value="4"></el-option> | |
| 351 | + <el-option label="主观题" :value="5"></el-option> | |
| 352 | + </el-select> | |
| 353 | + </div> | |
| 354 | + <div class="qs-score"></div> | |
| 355 | + <div class="qs-partScore"></div> | |
| 356 | + <div class="qs-options"></div> | |
| 357 | + <div class="qs-set"></div> | |
| 358 | + </li> | |
| 359 | + </ul> | |
| 360 | + </transition> | |
| 335 | 361 | </div> |
| 336 | 362 | <div class="add-box"> |
| 337 | 363 | <p class="add-question" @click="openQuestion"> |
| ... | ... | @@ -379,7 +405,11 @@ |
| 379 | 405 | </el-col> |
| 380 | 406 | </el-form-item> |
| 381 | 407 | <el-form-item label="选择题型:"> |
| 382 | - <el-select v-model="questionForm.questionType" placeholder=""> | |
| 408 | + <el-select | |
| 409 | + v-model="questionForm.questionType" | |
| 410 | + placeholder="" | |
| 411 | + @change="setQuestionForm" | |
| 412 | + > | |
| 383 | 413 | <el-option |
| 384 | 414 | v-for="item in questionOptions" |
| 385 | 415 | :key="item.value" |
| ... | ... | @@ -393,6 +423,7 @@ |
| 393 | 423 | <el-form-item label="题数:"> |
| 394 | 424 | <el-input-number |
| 395 | 425 | v-model="questionForm.number" |
| 426 | + @change="changeQesNum" | |
| 396 | 427 | :min="1" |
| 397 | 428 | :max="100" |
| 398 | 429 | :step-strictly="true" |
| ... | ... | @@ -439,6 +470,113 @@ |
| 439 | 470 | label="label" |
| 440 | 471 | ></el-input-number> |
| 441 | 472 | </el-form-item> |
| 473 | + <el-form-item | |
| 474 | + label="设置答案:" | |
| 475 | + v-show="questionForm.questionType != 5" | |
| 476 | + > | |
| 477 | + <div class="qs-options"> | |
| 478 | + <p class="ipt"> | |
| 479 | + <el-input | |
| 480 | + v-if=" | |
| 481 | + questionForm.questionType == 2 || | |
| 482 | + questionForm.questionType == 3 || | |
| 483 | + questionForm.questionType == 6 | |
| 484 | + " | |
| 485 | + v-model="questionForm.answerList" | |
| 486 | + @keydown.native=" | |
| 487 | + keydownAnswer($event, questionForm.questionType, 1) | |
| 488 | + " | |
| 489 | + @input=" | |
| 490 | + setAllAnswer($event, questionForm.questionType, 1) | |
| 491 | + " | |
| 492 | + ></el-input> | |
| 493 | + <el-input | |
| 494 | + v-if="questionForm.questionType == 4" | |
| 495 | + v-model="questionForm.answerList" | |
| 496 | + readonly="" | |
| 497 | + ></el-input> | |
| 498 | + </p> | |
| 499 | + <p class="answer-box"> | |
| 500 | + <template v-if="questionForm.questionType == 4"> | |
| 501 | + <span | |
| 502 | + class="answer-s active" | |
| 503 | + @click=" | |
| 504 | + questionForm.answerList.length < questionForm.number | |
| 505 | + ? (questionForm.answerList += '✓') | |
| 506 | + : '' | |
| 507 | + " | |
| 508 | + >✓</span | |
| 509 | + > | |
| 510 | + <span | |
| 511 | + class="answer-s active" | |
| 512 | + @click=" | |
| 513 | + questionForm.answerList.length < questionForm.number | |
| 514 | + ? (questionForm.answerList += '✗') | |
| 515 | + : '' | |
| 516 | + " | |
| 517 | + >✗</span | |
| 518 | + > | |
| 519 | + </template> | |
| 520 | + <template v-if="questionForm.questionType == 3"> | |
| 521 | + <template v-for="(option, opIdx) in rightOptions"> | |
| 522 | + <span | |
| 523 | + v-if="opIdx < questionForm.selectNum" | |
| 524 | + class="answer-s active" | |
| 525 | + :key="option" | |
| 526 | + @click="setMultiple(questionForm, option)" | |
| 527 | + >{{ option }}</span | |
| 528 | + > | |
| 529 | + </template> | |
| 530 | + <span | |
| 531 | + class="answer-s active" | |
| 532 | + @click=" | |
| 533 | + questionForm.answerList.split(',').length < | |
| 534 | + questionForm.number | |
| 535 | + ? (questionForm.answerList += ',') | |
| 536 | + : '' | |
| 537 | + " | |
| 538 | + >,</span | |
| 539 | + > | |
| 540 | + </template> | |
| 541 | + <template | |
| 542 | + v-if=" | |
| 543 | + questionForm.questionType == 2 || | |
| 544 | + questionForm.questionType == 6 | |
| 545 | + " | |
| 546 | + class="answer-box" | |
| 547 | + > | |
| 548 | + <template v-for="(option, opIdx) in rightOptions"> | |
| 549 | + <span | |
| 550 | + v-if="opIdx < questionForm.selectNum" | |
| 551 | + class="answer-s active" | |
| 552 | + :key="option" | |
| 553 | + @click=" | |
| 554 | + questionForm.answerList.length < questionForm.number | |
| 555 | + ? (questionForm.answerList += option) | |
| 556 | + : '' | |
| 557 | + " | |
| 558 | + >{{ option }}</span | |
| 559 | + > | |
| 560 | + </template> | |
| 561 | + </template> | |
| 562 | + <span | |
| 563 | + class="answer-s delButton" | |
| 564 | + @click=" | |
| 565 | + questionForm.answerList = questionForm.answerList.slice( | |
| 566 | + 0, | |
| 567 | + -1 | |
| 568 | + ) | |
| 569 | + " | |
| 570 | + >x</span | |
| 571 | + > | |
| 572 | + <span | |
| 573 | + class="answer-s ac" | |
| 574 | + @click="questionForm.answerList = ''" | |
| 575 | + >ac</span | |
| 576 | + > | |
| 577 | + </p> | |
| 578 | + </div> | |
| 579 | + </el-form-item> | |
| 442 | 580 | </el-form> |
| 443 | 581 | </div> |
| 444 | 582 | <div class="dialog-footer" slot="footer"> |
| ... | ... | @@ -452,208 +590,212 @@ |
| 452 | 590 | <p class="name">{{ form.title }}</p> |
| 453 | 591 | <p class="totals">卷面总分:{{ allScore }}分</p> |
| 454 | 592 | </div> |
| 455 | - <div v-for="(question, index) in form.questionList" :key="index"> | |
| 593 | + <div | |
| 594 | + class="question-box" | |
| 595 | + v-for="(question, index) in form.questionList" | |
| 596 | + :key="index" | |
| 597 | + > | |
| 456 | 598 | <p class="question-title"> |
| 457 | 599 | <span>{{ setBigNum(index) }}、</span> |
| 458 | 600 | <span class="title-txt">{{ question.questionTitle }}</span> |
| 459 | 601 | <span class="m20">共:{{ setNums(question.subQuestions) }}题</span> |
| 460 | 602 | <span>共:{{ setScore(question) }} 分</span> |
| 461 | 603 | </p> |
| 462 | - <ul class="questions-ul"> | |
| 463 | - <li class="sub-questions"> | |
| 464 | - <div class="qs-num">题号</div> | |
| 465 | - <div class="qs-type">题型</div> | |
| 466 | - <div class="qs-score">分数</div> | |
| 467 | - <div class="qs-partScore">漏选得分</div> | |
| 468 | - <div class="qs-options qs-options2">选项设置</div> | |
| 469 | - </li> | |
| 470 | - <li | |
| 471 | - v-for="(subQuestions, indexs) in question.subQuestions" | |
| 472 | - :key="indexs" | |
| 473 | - > | |
| 474 | - <p | |
| 475 | - class="set-ans-btn" | |
| 476 | - v-if=" | |
| 477 | - subQuestions.qusType && | |
| 478 | - subQuestions.subNum && | |
| 479 | - subQuestions.subNum > 4 | |
| 480 | - " | |
| 604 | + <ul class="questions-ul"> | |
| 605 | + <li class="sub-questions"> | |
| 606 | + <div class="qs-num">题号</div> | |
| 607 | + <div class="qs-type">题型</div> | |
| 608 | + <div class="qs-score">分数</div> | |
| 609 | + <div class="qs-partScore">漏选得分</div> | |
| 610 | + <div class="qs-options qs-options2">选项设置</div> | |
| 611 | + </li> | |
| 612 | + <li | |
| 613 | + v-for="(subQuestions, indexs) in question.subQuestions" | |
| 614 | + :key="indexs" | |
| 481 | 615 | > |
| 482 | - <el-button type="primary" @click="setFormAns(indexs, index)" | |
| 483 | - >批量设置答案</el-button | |
| 616 | + <p | |
| 617 | + class="set-ans-btn" | |
| 618 | + v-if=" | |
| 619 | + subQuestions.qusType && | |
| 620 | + subQuestions.subNum && | |
| 621 | + subQuestions.subNum > 4 | |
| 622 | + " | |
| 484 | 623 | > |
| 485 | - </p> | |
| 486 | - <div v-else class="sub-questions"> | |
| 487 | - <div class="qs-num"> | |
| 488 | - {{ setNum(index, indexs, subQuestions) }} | |
| 489 | - </div> | |
| 490 | - <div class="qs-type"> | |
| 491 | - {{ setSubPro(subQuestions.questionType) }} | |
| 492 | - </div> | |
| 493 | - <div class="qs-score"> | |
| 494 | - <el-input-number | |
| 495 | - class="number-ipt" | |
| 496 | - size="medium" | |
| 497 | - :min="1" | |
| 498 | - :max="200" | |
| 499 | - :precision="2" | |
| 500 | - v-model="subQuestions.score" | |
| 501 | - label="单题分值" | |
| 502 | - ></el-input-number> | |
| 503 | - </div> | |
| 504 | - <div class="qs-partScore"> | |
| 505 | - <p v-if="subQuestions.questionType != 3">--</p> | |
| 506 | - <el-input-number | |
| 507 | - class="number-ipt" | |
| 508 | - v-else | |
| 509 | - size="medium" | |
| 510 | - :min="0" | |
| 511 | - :precision="2" | |
| 512 | - :max="subQuestions.score" | |
| 513 | - :step="0.5" | |
| 514 | - v-model="subQuestions.partScore" | |
| 515 | - label="漏选得分" | |
| 516 | - ></el-input-number> | |
| 517 | - </div> | |
| 518 | - <div class="qs-options qs-options2"> | |
| 519 | - <p v-if="subQuestions.questionType == 5">--</p> | |
| 520 | - <p v-if="subQuestions.questionType == 4" class="answer-box"> | |
| 521 | - <span | |
| 522 | - class="answer-s" | |
| 523 | - :class="subQuestions.correctAnswer == 1 ? 'active' : ''" | |
| 524 | - @click="subQuestions.correctAnswer = 1" | |
| 525 | - >✓</span | |
| 526 | - > | |
| 527 | - <span | |
| 528 | - class="answer-s" | |
| 529 | - :class="subQuestions.correctAnswer == 2 ? 'active' : ''" | |
| 530 | - @click="subQuestions.correctAnswer = 2" | |
| 531 | - >✗</span | |
| 532 | - > | |
| 533 | - </p> | |
| 534 | - <p v-if="subQuestions.questionType == 3" class="answer-box"> | |
| 535 | - <span | |
| 536 | - class="answer-s" | |
| 537 | - v-for="option in subQuestions.answerOptions.split(',')" | |
| 538 | - :class=" | |
| 539 | - subQuestions.correctAnswer?.includes(option) | |
| 540 | - ? 'active' | |
| 541 | - : '' | |
| 542 | - " | |
| 543 | - :key="option" | |
| 544 | - @click="changAnswer(subQuestions, option)" | |
| 545 | - >{{ option }}</span | |
| 546 | - > | |
| 547 | - </p> | |
| 548 | - <p v-if="subQuestions.questionType == 2" class="answer-box"> | |
| 549 | - <span | |
| 550 | - class="answer-s" | |
| 551 | - v-for="option in subQuestions.answerOptions.split(',')" | |
| 552 | - :class=" | |
| 553 | - subQuestions.correctAnswer == option ? 'active' : '' | |
| 554 | - " | |
| 555 | - :key="option" | |
| 556 | - @click="subQuestions.correctAnswer = option" | |
| 557 | - >{{ option }}</span | |
| 558 | - > | |
| 559 | - </p> | |
| 560 | - </div> | |
| 561 | - </div> | |
| 562 | - </li> | |
| 563 | - </ul> | |
| 564 | - <el-dialog | |
| 565 | - title="批量设置答案" | |
| 566 | - :visible.sync="diaSetAns" | |
| 567 | - :close-on-click-modal="false" | |
| 568 | - width="400" | |
| 569 | - :modal-append-to-body="false" | |
| 570 | - > | |
| 571 | - <div class="qs-options"> | |
| 572 | - <p class="dia-tips"> | |
| 573 | - 请点击选项按钮设置答案,多选题题目之间用“,”隔开,若添加5道题:“AC,AD,BD,AC,CD” | |
| 574 | - </p> | |
| 575 | - <p>{{ setSubPro(formAns.qusType) }}:</p> | |
| 576 | - <p class="ipt"> | |
| 577 | - <el-input | |
| 578 | - v-if="formAns.qusType == 2 || formAns.qusType == 3" | |
| 579 | - v-model="formAns.answerList" | |
| 580 | - @keydown.native="keydownAnswer($event, formAns.qusType)" | |
| 581 | - @input="setAllAnswer($event, formAns.qusType)" | |
| 582 | - ></el-input> | |
| 583 | - <el-input | |
| 584 | - v-if="formAns.qusType == 4" | |
| 585 | - v-model="formAns.answerList" | |
| 586 | - readonly="" | |
| 587 | - ></el-input> | |
| 588 | - </p> | |
| 589 | - <p class="answer-box"> | |
| 590 | - <template v-if="formAns.qusType == 4"> | |
| 591 | - <span | |
| 592 | - class="answer-s active" | |
| 593 | - @click=" | |
| 594 | - formAns.answerList.length < formAns.subNum | |
| 595 | - ? (formAns.answerList += '✓') | |
| 596 | - : '' | |
| 597 | - " | |
| 598 | - >✓</span | |
| 599 | - > | |
| 600 | - <span | |
| 601 | - class="answer-s active" | |
| 602 | - @click=" | |
| 603 | - formAns.answerList.length < formAns.subNum | |
| 604 | - ? (formAns.answerList += '✗') | |
| 605 | - : '' | |
| 606 | - " | |
| 607 | - >✗</span | |
| 608 | - > | |
| 609 | - </template> | |
| 610 | - <template v-if="formAns.qusType == 3"> | |
| 611 | - <span | |
| 612 | - class="answer-s active" | |
| 613 | - v-for="option in formAns.answerOptions.split(',')" | |
| 614 | - :key="option" | |
| 615 | - @click="setMultiple(formAns, option)" | |
| 616 | - >{{ option }}</span | |
| 624 | + <el-button type="primary" @click="setFormAns(indexs, index)" | |
| 625 | + >批量设置答案</el-button | |
| 617 | 626 | > |
| 618 | - <span | |
| 619 | - class="answer-s active" | |
| 620 | - @click=" | |
| 621 | - formAns.answerList.split(',').length < formAns.subNum | |
| 622 | - ? (formAns.answerList += ',') | |
| 623 | - : '' | |
| 624 | - " | |
| 625 | - >,</span | |
| 626 | - > | |
| 627 | - </template> | |
| 628 | - <template v-if="formAns.qusType == 2" class="answer-box"> | |
| 629 | - <span | |
| 630 | - class="answer-s active" | |
| 631 | - v-for="option in formAns.answerOptions.split(',')" | |
| 632 | - :key="option" | |
| 633 | - @click=" | |
| 634 | - formAns.answerList.length < formAns.subNum | |
| 635 | - ? (formAns.answerList += option) | |
| 636 | - : '' | |
| 637 | - " | |
| 638 | - >{{ option }}</span | |
| 639 | - > | |
| 640 | - </template> | |
| 627 | + </p> | |
| 628 | + <div v-else class="sub-questions"> | |
| 629 | + <div class="qs-num"> | |
| 630 | + {{ setNum(index, indexs, subQuestions) }} | |
| 631 | + </div> | |
| 632 | + <div class="qs-type"> | |
| 633 | + {{ setSubPro(subQuestions.questionType) }} | |
| 634 | + </div> | |
| 635 | + <div class="qs-score"> | |
| 636 | + <el-input-number | |
| 637 | + class="number-ipt" | |
| 638 | + size="medium" | |
| 639 | + :min="1" | |
| 640 | + :max="200" | |
| 641 | + :precision="2" | |
| 642 | + v-model="subQuestions.score" | |
| 643 | + label="单题分值" | |
| 644 | + ></el-input-number> | |
| 645 | + </div> | |
| 646 | + <div class="qs-partScore"> | |
| 647 | + <p v-if="subQuestions.questionType != 3">--</p> | |
| 648 | + <el-input-number | |
| 649 | + class="number-ipt" | |
| 650 | + v-else | |
| 651 | + size="medium" | |
| 652 | + :min="0" | |
| 653 | + :precision="2" | |
| 654 | + :max="subQuestions.score" | |
| 655 | + :step="0.5" | |
| 656 | + v-model="subQuestions.partScore" | |
| 657 | + label="漏选得分" | |
| 658 | + ></el-input-number> | |
| 659 | + </div> | |
| 660 | + <div class="qs-options qs-options2"> | |
| 661 | + <p v-if="subQuestions.questionType == 5">--</p> | |
| 662 | + <p v-if="subQuestions.questionType == 4" class="answer-box"> | |
| 663 | + <span | |
| 664 | + class="answer-s" | |
| 665 | + :class="subQuestions.correctAnswer == 1 ? 'active' : ''" | |
| 666 | + @click="subQuestions.correctAnswer = 1" | |
| 667 | + >✓</span | |
| 668 | + > | |
| 669 | + <span | |
| 670 | + class="answer-s" | |
| 671 | + :class="subQuestions.correctAnswer == 2 ? 'active' : ''" | |
| 672 | + @click="subQuestions.correctAnswer = 2" | |
| 673 | + >✗</span | |
| 674 | + > | |
| 675 | + </p> | |
| 676 | + <p v-if="subQuestions.questionType == 3" class="answer-box"> | |
| 677 | + <span | |
| 678 | + class="answer-s" | |
| 679 | + v-for="option in subQuestions.answerOptions.split(',')" | |
| 680 | + :class=" | |
| 681 | + subQuestions.correctAnswer?.includes(option) | |
| 682 | + ? 'active' | |
| 683 | + : '' | |
| 684 | + " | |
| 685 | + :key="option" | |
| 686 | + @click="changAnswer(subQuestions, option)" | |
| 687 | + >{{ option }}</span | |
| 688 | + > | |
| 689 | + </p> | |
| 690 | + <p v-if="subQuestions.questionType == 2" class="answer-box"> | |
| 691 | + <span | |
| 692 | + class="answer-s" | |
| 693 | + v-for="option in subQuestions.answerOptions.split(',')" | |
| 694 | + :class=" | |
| 695 | + subQuestions.correctAnswer == option ? 'active' : '' | |
| 696 | + " | |
| 697 | + :key="option" | |
| 698 | + @click="subQuestions.correctAnswer = option" | |
| 699 | + >{{ option }}</span | |
| 700 | + > | |
| 701 | + </p> | |
| 702 | + </div> | |
| 703 | + </div> | |
| 704 | + </li> | |
| 705 | + </ul> | |
| 706 | + </div> | |
| 707 | + <el-dialog | |
| 708 | + title="批量设置答案" | |
| 709 | + :visible.sync="diaSetAns" | |
| 710 | + :close-on-click-modal="false" | |
| 711 | + width="400" | |
| 712 | + :modal-append-to-body="false" | |
| 713 | + > | |
| 714 | + <div class="qs-options"> | |
| 715 | + <p class="dia-tips"> | |
| 716 | + 请点击选项按钮设置答案,多选题题目之间用“,”隔开,若添加5道题:“AC,AD,BD,AC,CD” | |
| 717 | + </p> | |
| 718 | + <p>{{ setSubPro(formAns.qusType) }}:</p> | |
| 719 | + <p class="ipt"> | |
| 720 | + <el-input | |
| 721 | + v-if="formAns.qusType == 2 || formAns.qusType == 3" | |
| 722 | + v-model="formAns.answerList" | |
| 723 | + @keydown.native="keydownAnswer($event, formAns.qusType)" | |
| 724 | + @input="setAllAnswer($event, formAns.qusType)" | |
| 725 | + ></el-input> | |
| 726 | + <el-input | |
| 727 | + v-if="formAns.qusType == 4" | |
| 728 | + v-model="formAns.answerList" | |
| 729 | + readonly="" | |
| 730 | + ></el-input> | |
| 731 | + </p> | |
| 732 | + <p class="answer-box"> | |
| 733 | + <template v-if="formAns.qusType == 4"> | |
| 641 | 734 | <span |
| 642 | - class="answer-s delButton" | |
| 643 | - @click="formAns.answerList = formAns.answerList.slice(0, -1)" | |
| 644 | - >x</span | |
| 735 | + class="answer-s active" | |
| 736 | + @click=" | |
| 737 | + formAns.answerList.length < formAns.subNum | |
| 738 | + ? (formAns.answerList += '✓') | |
| 739 | + : '' | |
| 740 | + " | |
| 741 | + >✓</span | |
| 645 | 742 | > |
| 646 | - <span class="answer-s ac" @click="formAns.answerList = ''" | |
| 647 | - >ac</span | |
| 743 | + <span | |
| 744 | + class="answer-s active" | |
| 745 | + @click=" | |
| 746 | + formAns.answerList.length < formAns.subNum | |
| 747 | + ? (formAns.answerList += '✗') | |
| 748 | + : '' | |
| 749 | + " | |
| 750 | + >✗</span | |
| 648 | 751 | > |
| 649 | - </p> | |
| 650 | - </div> | |
| 651 | - <div class="dialog-footer" slot="footer"> | |
| 652 | - <el-button @click="saveFormAns">确 定</el-button> | |
| 653 | - <el-button @click="diaSetAns = false">取 消</el-button> | |
| 654 | - </div> | |
| 655 | - </el-dialog> | |
| 656 | - </div> | |
| 752 | + </template> | |
| 753 | + <template v-if="formAns.qusType == 3"> | |
| 754 | + <span | |
| 755 | + class="answer-s active" | |
| 756 | + v-for="option in formAns.answerOptions.split(',')" | |
| 757 | + :key="option" | |
| 758 | + @click="setMultiple(formAns, option)" | |
| 759 | + >{{ option }}</span | |
| 760 | + > | |
| 761 | + <span | |
| 762 | + class="answer-s active" | |
| 763 | + @click=" | |
| 764 | + formAns.answerList.split(',').length < formAns.subNum | |
| 765 | + ? (formAns.answerList += ',') | |
| 766 | + : '' | |
| 767 | + " | |
| 768 | + >,</span | |
| 769 | + > | |
| 770 | + </template> | |
| 771 | + <template v-if="formAns.qusType == 2" class="answer-box"> | |
| 772 | + <span | |
| 773 | + class="answer-s active" | |
| 774 | + v-for="option in formAns.answerOptions.split(',')" | |
| 775 | + :key="option" | |
| 776 | + @click=" | |
| 777 | + formAns.answerList.length < formAns.subNum | |
| 778 | + ? (formAns.answerList += option) | |
| 779 | + : '' | |
| 780 | + " | |
| 781 | + >{{ option }}</span | |
| 782 | + > | |
| 783 | + </template> | |
| 784 | + <span | |
| 785 | + class="answer-s delButton" | |
| 786 | + @click="formAns.answerList = formAns.answerList.slice(0, -1)" | |
| 787 | + >x</span | |
| 788 | + > | |
| 789 | + <span class="answer-s ac" @click="formAns.answerList = ''" | |
| 790 | + >ac</span | |
| 791 | + > | |
| 792 | + </p> | |
| 793 | + </div> | |
| 794 | + <div class="dialog-footer" slot="footer"> | |
| 795 | + <el-button @click="saveFormAns">确 定</el-button> | |
| 796 | + <el-button @click="diaSetAns = false">取 消</el-button> | |
| 797 | + </div> | |
| 798 | + </el-dialog> | |
| 657 | 799 | <div class="btn-box"> |
| 658 | 800 | <el-button type="danger" plain round @click="linkBack" |
| 659 | 801 | >取消</el-button |
| ... | ... | @@ -675,6 +817,7 @@ const questionForm = { |
| 675 | 817 | selectNum: 4, |
| 676 | 818 | score: 1, |
| 677 | 819 | partScore: 0, |
| 820 | + answerList: "", | |
| 678 | 821 | }; |
| 679 | 822 | const subQuesOptions = { |
| 680 | 823 | questionType: 2, |
| ... | ... | @@ -878,6 +1021,28 @@ export default { |
| 878 | 1021 | |
| 879 | 1022 | return txt; |
| 880 | 1023 | }, |
| 1024 | + setQuestionForm(val) { | |
| 1025 | + //切换题型清空答案 | |
| 1026 | + this.questionForm.answerList = ""; | |
| 1027 | + }, | |
| 1028 | + changeQesNum(val) { | |
| 1029 | + //减少题数设置答案 | |
| 1030 | + if ( | |
| 1031 | + this.questionForm.questionType == 2 || | |
| 1032 | + this.questionForm.questionType == 4 | |
| 1033 | + ) { | |
| 1034 | + this.questionForm.answerList = this.questionForm.answerList.substring( | |
| 1035 | + 0, | |
| 1036 | + val | |
| 1037 | + ); | |
| 1038 | + } else { | |
| 1039 | + console.log(this.questionForm.answerList.split(",")); | |
| 1040 | + this.questionForm.answerList = this.questionForm.answerList | |
| 1041 | + .split(",") | |
| 1042 | + .splice(0, val) | |
| 1043 | + .join(","); | |
| 1044 | + } | |
| 1045 | + }, | |
| 881 | 1046 | setFormAns(indexs, index) { |
| 882 | 1047 | //初始化要修改的答案 |
| 883 | 1048 | this.formAns = { ...this.form.questionList[index].subQuestions[indexs] }; |
| ... | ... | @@ -904,12 +1069,17 @@ export default { |
| 904 | 1069 | //多选答案设置 |
| 905 | 1070 | obj.answerList += answer; |
| 906 | 1071 | let str = obj.answerList; |
| 907 | - let str2 = checkAnswer( | |
| 908 | - str, | |
| 909 | - 3, | |
| 910 | - obj.answerOptions.split(",").length, | |
| 911 | - obj.answerList.length | |
| 912 | - ); | |
| 1072 | + let str2; | |
| 1073 | + if (!!obj.answerOptions) { | |
| 1074 | + str2 = checkAnswer( | |
| 1075 | + str, | |
| 1076 | + 3, | |
| 1077 | + obj.answerOptions.split(",").length, | |
| 1078 | + obj.answerList.length | |
| 1079 | + ); | |
| 1080 | + } else { | |
| 1081 | + str2 = checkAnswer(str, 3, obj.selectNum, obj.answerList.length); | |
| 1082 | + } | |
| 913 | 1083 | obj.answerList = str2; |
| 914 | 1084 | }, |
| 915 | 1085 | saveFormAns() { |
| ... | ... | @@ -931,7 +1101,6 @@ export default { |
| 931 | 1101 | correctAnswer = this.formAns.answerList[subNum - i]; |
| 932 | 1102 | } else if (this.formAns.qusType == 3) { |
| 933 | 1103 | correctAnswer = this.formAns.answerList.split(",")[subNum - i]; |
| 934 | - | |
| 935 | 1104 | console.log(this.formAns.answerList.split(",")[subNum - i]); |
| 936 | 1105 | } else if (this.formAns.qusType == 4) { |
| 937 | 1106 | correctAnswer = |
| ... | ... | @@ -969,11 +1138,16 @@ export default { |
| 969 | 1138 | // event.returnValue = ""; |
| 970 | 1139 | // } |
| 971 | 1140 | // }, |
| 972 | - keydownAnswer(event, type) { | |
| 1141 | + keydownAnswer(event, type, isAddBig) { | |
| 973 | 1142 | let answerA = "ABCDEFG"; |
| 974 | 1143 | let answer_a = "abcdefg"; |
| 975 | - answerA = answerA.substring(0, this.formAns.subNum); | |
| 976 | - answer_a = answer_a.substring(0, this.formAns.subNum); | |
| 1144 | + if (isAddBig) { | |
| 1145 | + answerA = answerA.substring(0, this.questionForm.selectNum); | |
| 1146 | + answer_a = answer_a.substring(0, this.questionForm.selectNum); | |
| 1147 | + } else { | |
| 1148 | + answerA = answerA.substring(0, this.formAns.subNum); | |
| 1149 | + answer_a = answer_a.substring(0, this.formAns.subNum); | |
| 1150 | + } | |
| 977 | 1151 | answerA += answer_a; |
| 978 | 1152 | answerA = type == 2 ? answerA : answerA + ","; |
| 979 | 1153 | if ( |
| ... | ... | @@ -996,15 +1170,26 @@ export default { |
| 996 | 1170 | event.returnValue = ""; |
| 997 | 1171 | } |
| 998 | 1172 | }, |
| 999 | - setAllAnswer(event, type) { | |
| 1000 | - let str = this.formAns.answerList; | |
| 1001 | - let str2 = checkAnswer( | |
| 1002 | - str, | |
| 1003 | - type, | |
| 1004 | - this.formAns.answerOptions.split(",").length, | |
| 1005 | - this.formAns.subNum | |
| 1006 | - ); | |
| 1007 | - this.formAns.answerList = str2; | |
| 1173 | + setAllAnswer(event, type, isAddBig) { | |
| 1174 | + if (isAddBig) { | |
| 1175 | + let str = this.questionForm.answerList; | |
| 1176 | + let str2 = checkAnswer( | |
| 1177 | + str, | |
| 1178 | + type, | |
| 1179 | + this.questionForm.selectNum, | |
| 1180 | + this.questionForm.number | |
| 1181 | + ); | |
| 1182 | + this.questionForm.answerList = str2; | |
| 1183 | + } else { | |
| 1184 | + let str = this.formAns.answerList; | |
| 1185 | + let str2 = checkAnswer( | |
| 1186 | + str, | |
| 1187 | + type, | |
| 1188 | + this.formAns.answerOptions.split(",").length, | |
| 1189 | + this.formAns.subNum | |
| 1190 | + ); | |
| 1191 | + this.formAns.answerList = str2; | |
| 1192 | + } | |
| 1008 | 1193 | }, |
| 1009 | 1194 | setAnswer(type, ans) { |
| 1010 | 1195 | let txt = ""; |
| ... | ... | @@ -1133,6 +1318,7 @@ export default { |
| 1133 | 1318 | this.addQuestionVisible = true; |
| 1134 | 1319 | }, |
| 1135 | 1320 | addQuestion() { |
| 1321 | + //添加大题 | |
| 1136 | 1322 | let subQuestions = []; |
| 1137 | 1323 | let questionsOptions = { |
| 1138 | 1324 | ...subQuesOptions, |
| ... | ... | @@ -1164,6 +1350,20 @@ export default { |
| 1164 | 1350 | break; |
| 1165 | 1351 | } |
| 1166 | 1352 | for (let i = 0; i < this.questionForm.number; i++) { |
| 1353 | + let answer = ""; | |
| 1354 | + if (questionsOptions.questionType == 4) { | |
| 1355 | + answer = | |
| 1356 | + this.questionForm.answerList[i] == "✓" | |
| 1357 | + ? 1 | |
| 1358 | + : this.questionForm.answerList[i] == "✗" | |
| 1359 | + ? 2 | |
| 1360 | + : ""; | |
| 1361 | + } else if (questionsOptions.questionType == 3) { | |
| 1362 | + answer = this.questionForm.answerList.split(",")[i] || ""; | |
| 1363 | + } else if (questionsOptions.questionType == 2) { | |
| 1364 | + answer = this.questionForm.answerList[i] || ""; | |
| 1365 | + } | |
| 1366 | + questionsOptions.correctAnswer = answer; | |
| 1167 | 1367 | subQuestions.push({ ...questionsOptions }); |
| 1168 | 1368 | } |
| 1169 | 1369 | this.form.questionList.push({ |
| ... | ... | @@ -1171,6 +1371,7 @@ export default { |
| 1171 | 1371 | number: this.questionForm.number, |
| 1172 | 1372 | source: 10, |
| 1173 | 1373 | subQuestions: [...subQuestions], |
| 1374 | + show: false, | |
| 1174 | 1375 | }); |
| 1175 | 1376 | this.addQuestionVisible = false; |
| 1176 | 1377 | }, |
| ... | ... | @@ -1347,8 +1548,12 @@ export default { |
| 1347 | 1548 | if (this.saveLoading) return; |
| 1348 | 1549 | this.saveLoading = true; |
| 1349 | 1550 | this.formatQuestionList(); |
| 1551 | + let formDatas = deepClone(this.form) | |
| 1552 | + for (let i = 0; i < formDatas.questionList.length; i++) { | |
| 1553 | + delete formDatas.questionList[i].show | |
| 1554 | + } | |
| 1350 | 1555 | const { data, status, info } = await this.$request.addPaper({ |
| 1351 | - ...this.form, | |
| 1556 | + ...formDatas, | |
| 1352 | 1557 | }); |
| 1353 | 1558 | this.saveLoading = false; |
| 1354 | 1559 | if (status == 0) { |
| ... | ... | @@ -1480,13 +1685,13 @@ export default { |
| 1480 | 1685 | background-size: 19px; |
| 1481 | 1686 | color: transparent; |
| 1482 | 1687 | } |
| 1483 | - .answer-s.ac{ | |
| 1484 | - border:none; | |
| 1688 | + .answer-s.ac { | |
| 1689 | + border: none; | |
| 1485 | 1690 | } |
| 1486 | 1691 | .ac { |
| 1487 | 1692 | border-color: #ff6868; |
| 1488 | 1693 | background: #ff6868; |
| 1489 | - color: #fff!important; | |
| 1694 | + color: #fff !important; | |
| 1490 | 1695 | } |
| 1491 | 1696 | } |
| 1492 | 1697 | |
| ... | ... | @@ -1573,10 +1778,16 @@ export default { |
| 1573 | 1778 | margin: 0 12px; |
| 1574 | 1779 | } |
| 1575 | 1780 | } |
| 1781 | +.question-box { | |
| 1782 | + margin-bottom: 20px; | |
| 1783 | +} | |
| 1576 | 1784 | .question-title { |
| 1577 | 1785 | line-height: 40px; |
| 1786 | + display: flex; | |
| 1787 | + align-items: center; | |
| 1788 | + margin-bottom: 12px; | |
| 1578 | 1789 | .m20 { |
| 1579 | - margin-right: 20px; | |
| 1790 | + margin: 0 20px; | |
| 1580 | 1791 | } |
| 1581 | 1792 | .ipt { |
| 1582 | 1793 | width: 300px; |
| ... | ... | @@ -1595,6 +1806,20 @@ export default { |
| 1595 | 1806 | font-size: 16px; |
| 1596 | 1807 | font-weight: 700; |
| 1597 | 1808 | } |
| 1809 | + .el-icon-caret-right { | |
| 1810 | + font-size: 24px; | |
| 1811 | + color: #888; | |
| 1812 | + transition: all 0.4s; | |
| 1813 | + margin-right: 12px; | |
| 1814 | + cursor: pointer; | |
| 1815 | + &.active { | |
| 1816 | + transform: rotate(90deg); | |
| 1817 | + } | |
| 1818 | + } | |
| 1819 | +} | |
| 1820 | +.questions-ul { | |
| 1821 | + border-left: 1px solid #e2e2e2; | |
| 1822 | + border-top: 1px solid #e2e2e2; | |
| 1598 | 1823 | } |
| 1599 | 1824 | .el-input-number { |
| 1600 | 1825 | width: 140px; |
| ... | ... | @@ -1630,11 +1855,6 @@ export default { |
| 1630 | 1855 | } |
| 1631 | 1856 | } |
| 1632 | 1857 | } |
| 1633 | -.questions-ul { | |
| 1634 | - border-left: 1px solid #e2e2e2; | |
| 1635 | - border-top: 1px solid #e2e2e2; | |
| 1636 | - margin: 12px 0; | |
| 1637 | -} | |
| 1638 | 1858 | .qs-options { |
| 1639 | 1859 | .answer-s { |
| 1640 | 1860 | display: inline-block; | ... | ... |
src/views/setUp/school.vue
| ... | ... | @@ -308,6 +308,9 @@ export default { |
| 308 | 308 | if (!this.subjectName) { |
| 309 | 309 | this.$message.warning("请填写科目名称"); |
| 310 | 310 | return; |
| 311 | + }else if(this.subjectList.includes(this.subjectName)){ | |
| 312 | + this.$message.warning("科目已存在,请重新填写~"); | |
| 313 | + return; | |
| 311 | 314 | } |
| 312 | 315 | this.subjectList.push(this.subjectName); |
| 313 | 316 | this.formGrade.subjectNames.push(this.subjectName); | ... | ... |