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,6 +529,13 @@ export default { | ||
529 | data, | 529 | data, |
530 | }); | 530 | }); |
531 | }, | 531 | }, |
532 | + // 导入基站模板下载地址 | ||
533 | + stationTemplateUrl() { | ||
534 | + return service({ | ||
535 | + url: setUpUrls.stationTemplateUrl, | ||
536 | + method: "POST", | ||
537 | + }); | ||
538 | + }, | ||
532 | // 查询下载配置列表 | 539 | // 查询下载配置列表 |
533 | appConfigList(data) { | 540 | appConfigList(data) { |
534 | return service({ | 541 | return service({ |
@@ -594,6 +601,14 @@ export default { | @@ -594,6 +601,14 @@ export default { | ||
594 | responseType: 'arraybuffer', | 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,6 +134,8 @@ export default { | ||
134 | updateDevice: "/api_html/school/manager/updateDevice", | 134 | updateDevice: "/api_html/school/manager/updateDevice", |
135 | // 新增基站 | 135 | // 新增基站 |
136 | addStation: "/api_html/school/manager/addStation", | 136 | addStation: "/api_html/school/manager/addStation", |
137 | + // 导入基站模板下载地址 | ||
138 | + stationTemplateUrl: "/api_html/school/manager/stationTemplateUrl", | ||
137 | // 查询下载配置列表 | 139 | // 查询下载配置列表 |
138 | appConfigList: "/api_html/school/manager/appConfigList", | 140 | appConfigList: "/api_html/school/manager/appConfigList", |
139 | // 查询最新的授课端应用版本 | 141 | // 查询最新的授课端应用版本 |
@@ -147,9 +149,11 @@ export default { | @@ -147,9 +149,11 @@ export default { | ||
147 | // 设备使用分析 | 149 | // 设备使用分析 |
148 | usageAnalysis: "/api_html/school/manager/usageAnalysis", | 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 | exportUsageAnalysis: "/api_html/school/manager/exportUsageAnalysis", | 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,7 +76,6 @@ export default { | ||
76 | // } | 76 | // } |
77 | }, | 77 | }, |
78 | upSuccess(res) { | 78 | upSuccess(res) { |
79 | - debugger | ||
80 | if (res && res.status == 0 ) { | 79 | if (res && res.status == 0 ) { |
81 | this.$message.success("上传成功"); | 80 | this.$message.success("上传成功"); |
82 | this.$emit("upSuccess"); | 81 | this.$emit("upSuccess"); |
@@ -85,7 +84,6 @@ export default { | @@ -85,7 +84,6 @@ export default { | ||
85 | } | 84 | } |
86 | }, | 85 | }, |
87 | upError(res) { | 86 | upError(res) { |
88 | - debugger | ||
89 | if (res && res.status == 0) { | 87 | if (res && res.status == 0) { |
90 | this.$message.error("上传失败"); | 88 | this.$message.error("上传失败"); |
91 | } else { | 89 | } else { |
src/views/card/index.vue
@@ -10,6 +10,7 @@ | @@ -10,6 +10,7 @@ | ||
10 | <div class="answer-header"> | 10 | <div class="answer-header"> |
11 | <div class="sel-box"> | 11 | <div class="sel-box"> |
12 | <el-cascader | 12 | <el-cascader |
13 | + @change="_QueryData(1)" | ||
13 | size="small" | 14 | size="small" |
14 | class="sel" | 15 | class="sel" |
15 | clearable | 16 | clearable |
@@ -53,18 +54,20 @@ | @@ -53,18 +54,20 @@ | ||
53 | v-if="!tableData.length && !loading" | 54 | v-if="!tableData.length && !loading" |
54 | description="暂无数据" | 55 | description="暂无数据" |
55 | ></el-empty> | 56 | ></el-empty> |
56 | - <div v-else class="table-box"> | 57 | + <div v-else class="table-box" v-loading="loading"> |
57 | <el-table :data="tableData" border style="width: 100%"> | 58 | <el-table :data="tableData" border style="width: 100%"> |
58 | <el-table-column | 59 | <el-table-column |
59 | align="center" | 60 | align="center" |
60 | label="答题器编码" | 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 | ></el-table-column> | 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 | <el-table-column | 71 | <el-table-column |
69 | align="center" | 72 | align="center" |
70 | label="学生姓名" | 73 | label="学生姓名" |
@@ -75,22 +78,40 @@ | @@ -75,22 +78,40 @@ | ||
75 | label="学号" | 78 | label="学号" |
76 | prop="studentId" | 79 | prop="studentId" |
77 | ></el-table-column> | 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 | <el-table-column | 97 | <el-table-column |
89 | align="center" | 98 | align="center" |
90 | label="操作时间" | 99 | label="操作时间" |
91 | - prop="time" | 100 | + prop="modifiedTime" |
92 | ></el-table-column> | 101 | ></el-table-column> |
93 | </el-table> | 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 | </div> | 115 | </div> |
95 | </div> | 116 | </div> |
96 | </div> | 117 | </div> |
@@ -100,19 +121,23 @@ | @@ -100,19 +121,23 @@ | ||
100 | export default { | 121 | export default { |
101 | data() { | 122 | data() { |
102 | return { | 123 | return { |
103 | - loading:false, | ||
104 | - props: { multiple: true, checkStrictly: false }, | 124 | + loading: false, |
125 | + props: { multiple: false }, | ||
105 | query: { | 126 | query: { |
106 | - classId: [], | 127 | + classId: "", |
107 | studentName: "", | 128 | studentName: "", |
108 | studentCode: "", | 129 | studentCode: "", |
109 | }, | 130 | }, |
110 | gradeList: [], | 131 | gradeList: [], |
111 | tableData: [], | 132 | tableData: [], |
133 | + page: 1, | ||
134 | + size: 20, | ||
135 | + total: 0, | ||
112 | }; | 136 | }; |
113 | }, | 137 | }, |
114 | created() { | 138 | created() { |
115 | - // this._QueryGradeList(); | 139 | + this._QueryGradeList(); |
140 | + this._QueryData(); | ||
116 | }, | 141 | }, |
117 | methods: { | 142 | methods: { |
118 | // 查找班级 | 143 | // 查找班级 |
@@ -142,12 +167,15 @@ export default { | @@ -142,12 +167,15 @@ export default { | ||
142 | this.$message.error(info); | 167 | this.$message.error(info); |
143 | } | 168 | } |
144 | }, | 169 | }, |
170 | + changePage(page) { | ||
171 | + this.page = page; | ||
172 | + this._QueryData(4); | ||
173 | + }, | ||
145 | async _QueryData(type) { | 174 | async _QueryData(type) { |
146 | let query = {}; | 175 | let query = {}; |
147 | query.gradeName = this.query.gradeName; | 176 | query.gradeName = this.query.gradeName; |
148 | - query.classId = this.query.classId; | ||
149 | if (type == 1) { | 177 | if (type == 1) { |
150 | - query.classId = this.query.classId; | 178 | + query.classId = this.query.classId[1] ? this.query.classId[1] : ""; |
151 | this.query.studentCode = ""; | 179 | this.query.studentCode = ""; |
152 | this.query.studentName = ""; | 180 | this.query.studentName = ""; |
153 | } else if (type == 2) { | 181 | } else if (type == 2) { |
@@ -158,15 +186,20 @@ export default { | @@ -158,15 +186,20 @@ export default { | ||
158 | query.studentCode = this.query.studentCode; | 186 | query.studentCode = this.query.studentCode; |
159 | this.query.classId = ""; | 187 | this.query.classId = ""; |
160 | this.query.studentName = ""; | 188 | this.query.studentName = ""; |
189 | + } else { | ||
190 | + query = { ...this.query }; | ||
161 | } | 191 | } |
162 | this.loading = true; | 192 | this.loading = true; |
163 | const { data, status, info } = await this.$request.cardList({ | 193 | const { data, status, info } = await this.$request.cardList({ |
164 | ...query, | 194 | ...query, |
195 | + page: this.page, | ||
196 | + size: 20, | ||
165 | }); | 197 | }); |
166 | this.loading = false; | 198 | this.loading = false; |
167 | console.log(status); | 199 | console.log(status); |
168 | if (status === 0) { | 200 | if (status === 0) { |
169 | this.tableData = data.list || []; | 201 | this.tableData = data.list || []; |
202 | + this.total = data.count; | ||
170 | } else { | 203 | } else { |
171 | this.$message.error(info); | 204 | this.$message.error(info); |
172 | } | 205 | } |
src/views/device/index.vue
@@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
5 | <span>设备管理</span> | 5 | <span>设备管理</span> |
6 | </template> | 6 | </template> |
7 | <template slot="btns" v-if="role != 'ROLE_JITUAN' && type == 1 && !code"> | 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 | <el-button | 9 | <el-button |
10 | type="primary" | 10 | type="primary" |
11 | icon="el-icon-upload2" | 11 | icon="el-icon-upload2" |
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | circle | 14 | circle |
15 | @click="diaUp = true" | 15 | @click="diaUp = true" |
16 | ></el-button> | 16 | ></el-button> |
17 | - </el-tooltip> --> | 17 | + </el-tooltip> |
18 | <el-tooltip | 18 | <el-tooltip |
19 | v-if="role == 'ROLE_XUEXIAO'" | 19 | v-if="role == 'ROLE_XUEXIAO'" |
20 | effect="dark" | 20 | effect="dark" |
@@ -400,7 +400,6 @@ | @@ -400,7 +400,6 @@ | ||
400 | </div> | 400 | </div> |
401 | <el-dialog title="设备导入" :visible.sync="diaUp" width="400"> | 401 | <el-dialog title="设备导入" :visible.sync="diaUp" width="400"> |
402 | <up-load | 402 | <up-load |
403 | - id="downDevice" | ||
404 | :url="url" | 403 | :url="url" |
405 | @upSuccess="upSuccess" | 404 | @upSuccess="upSuccess" |
406 | fileName="设备信息" | 405 | fileName="设备信息" |
@@ -526,7 +525,7 @@ export default { | @@ -526,7 +525,7 @@ export default { | ||
526 | role: "", | 525 | role: "", |
527 | code: "", | 526 | code: "", |
528 | loading: false, | 527 | loading: false, |
529 | - url: "/web/upLoadDevice", | 528 | + url: "/api_html/teaching/importStation", |
530 | diaUp: false, | 529 | diaUp: false, |
531 | diaAnswerEqu: false, | 530 | diaAnswerEqu: false, |
532 | gradeList: [], | 531 | gradeList: [], |
@@ -788,16 +787,17 @@ export default { | @@ -788,16 +787,17 @@ export default { | ||
788 | } | 787 | } |
789 | }, | 788 | }, |
790 | async downExcel() { | 789 | async downExcel() { |
791 | - let data = await this.$request.downDevice({ | 790 | + let { data, status, info } = await this.$request.stationTemplateUrl({ |
792 | id: this.id, | 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 | } else { | 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,11 +12,11 @@ | ||
12 | </p> | 12 | </p> |
13 | <el-button plan round @click="links">授课端下载</el-button> | 13 | <el-button plan round @click="links">授课端下载</el-button> |
14 | </div> | 14 | </div> |
15 | - <div class="down-item"> | 15 | + <div class="down-item" v-loading="loading"> |
16 | <p class="txt"> | 16 | <p class="txt"> |
17 | 配合发卡器硬件,方便学校管理员进行发卡补卡操作的软件。 | 17 | 配合发卡器硬件,方便学校管理员进行发卡补卡操作的软件。 |
18 | </p> | 18 | </p> |
19 | - <el-button plan round>发卡软件下载</el-button> | 19 | + <el-button plan round @click="downCard">发卡软件下载</el-button> |
20 | </div> | 20 | </div> |
21 | </div> | 21 | </div> |
22 | </div> | 22 | </div> |
@@ -24,12 +24,33 @@ | @@ -24,12 +24,33 @@ | ||
24 | 24 | ||
25 | <script> | 25 | <script> |
26 | export default { | 26 | export default { |
27 | + data() { | ||
28 | + return { | ||
29 | + loading: false, | ||
30 | + }; | ||
31 | + }, | ||
27 | methods: { | 32 | methods: { |
28 | links() { | 33 | links() { |
29 | this.$router.push({ | 34 | this.$router.push({ |
30 | path: "/downClient", | 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 | </script> | 56 | </script> |
src/views/examinationPaper/add.vue
@@ -185,8 +185,19 @@ | @@ -185,8 +185,19 @@ | ||
185 | </el-dialog> | 185 | </el-dialog> |
186 | </div> | 186 | </div> |
187 | <div v-show="step == 1"> | 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 | <p class="question-title"> | 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 | <span>{{ setBigNum(index) }}、</span> | 201 | <span>{{ setBigNum(index) }}、</span> |
191 | <el-input | 202 | <el-input |
192 | class="ipt" | 203 | class="ipt" |
@@ -210,128 +221,143 @@ | @@ -210,128 +221,143 @@ | ||
210 | <span class="m20">共:{{ question.subQuestions.length }}题</span> | 221 | <span class="m20">共:{{ question.subQuestions.length }}题</span> |
211 | <span>共:{{ setScore(question) }}分</span> | 222 | <span>共:{{ setScore(question) }}分</span> |
212 | </p> | 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 | </div> | 361 | </div> |
336 | <div class="add-box"> | 362 | <div class="add-box"> |
337 | <p class="add-question" @click="openQuestion"> | 363 | <p class="add-question" @click="openQuestion"> |
@@ -379,7 +405,11 @@ | @@ -379,7 +405,11 @@ | ||
379 | </el-col> | 405 | </el-col> |
380 | </el-form-item> | 406 | </el-form-item> |
381 | <el-form-item label="选择题型:"> | 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 | <el-option | 413 | <el-option |
384 | v-for="item in questionOptions" | 414 | v-for="item in questionOptions" |
385 | :key="item.value" | 415 | :key="item.value" |
@@ -393,6 +423,7 @@ | @@ -393,6 +423,7 @@ | ||
393 | <el-form-item label="题数:"> | 423 | <el-form-item label="题数:"> |
394 | <el-input-number | 424 | <el-input-number |
395 | v-model="questionForm.number" | 425 | v-model="questionForm.number" |
426 | + @change="changeQesNum" | ||
396 | :min="1" | 427 | :min="1" |
397 | :max="100" | 428 | :max="100" |
398 | :step-strictly="true" | 429 | :step-strictly="true" |
@@ -439,6 +470,113 @@ | @@ -439,6 +470,113 @@ | ||
439 | label="label" | 470 | label="label" |
440 | ></el-input-number> | 471 | ></el-input-number> |
441 | </el-form-item> | 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 | </el-form> | 580 | </el-form> |
443 | </div> | 581 | </div> |
444 | <div class="dialog-footer" slot="footer"> | 582 | <div class="dialog-footer" slot="footer"> |
@@ -452,208 +590,212 @@ | @@ -452,208 +590,212 @@ | ||
452 | <p class="name">{{ form.title }}</p> | 590 | <p class="name">{{ form.title }}</p> |
453 | <p class="totals">卷面总分:{{ allScore }}分</p> | 591 | <p class="totals">卷面总分:{{ allScore }}分</p> |
454 | </div> | 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 | <p class="question-title"> | 598 | <p class="question-title"> |
457 | <span>{{ setBigNum(index) }}、</span> | 599 | <span>{{ setBigNum(index) }}、</span> |
458 | <span class="title-txt">{{ question.questionTitle }}</span> | 600 | <span class="title-txt">{{ question.questionTitle }}</span> |
459 | <span class="m20">共:{{ setNums(question.subQuestions) }}题</span> | 601 | <span class="m20">共:{{ setNums(question.subQuestions) }}题</span> |
460 | <span>共:{{ setScore(question) }} 分</span> | 602 | <span>共:{{ setScore(question) }} 分</span> |
461 | </p> | 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 | <span | 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 | <div class="btn-box"> | 799 | <div class="btn-box"> |
658 | <el-button type="danger" plain round @click="linkBack" | 800 | <el-button type="danger" plain round @click="linkBack" |
659 | >取消</el-button | 801 | >取消</el-button |
@@ -675,6 +817,7 @@ const questionForm = { | @@ -675,6 +817,7 @@ const questionForm = { | ||
675 | selectNum: 4, | 817 | selectNum: 4, |
676 | score: 1, | 818 | score: 1, |
677 | partScore: 0, | 819 | partScore: 0, |
820 | + answerList: "", | ||
678 | }; | 821 | }; |
679 | const subQuesOptions = { | 822 | const subQuesOptions = { |
680 | questionType: 2, | 823 | questionType: 2, |
@@ -878,6 +1021,28 @@ export default { | @@ -878,6 +1021,28 @@ export default { | ||
878 | 1021 | ||
879 | return txt; | 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 | setFormAns(indexs, index) { | 1046 | setFormAns(indexs, index) { |
882 | //初始化要修改的答案 | 1047 | //初始化要修改的答案 |
883 | this.formAns = { ...this.form.questionList[index].subQuestions[indexs] }; | 1048 | this.formAns = { ...this.form.questionList[index].subQuestions[indexs] }; |
@@ -904,12 +1069,17 @@ export default { | @@ -904,12 +1069,17 @@ export default { | ||
904 | //多选答案设置 | 1069 | //多选答案设置 |
905 | obj.answerList += answer; | 1070 | obj.answerList += answer; |
906 | let str = obj.answerList; | 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 | obj.answerList = str2; | 1083 | obj.answerList = str2; |
914 | }, | 1084 | }, |
915 | saveFormAns() { | 1085 | saveFormAns() { |
@@ -931,7 +1101,6 @@ export default { | @@ -931,7 +1101,6 @@ export default { | ||
931 | correctAnswer = this.formAns.answerList[subNum - i]; | 1101 | correctAnswer = this.formAns.answerList[subNum - i]; |
932 | } else if (this.formAns.qusType == 3) { | 1102 | } else if (this.formAns.qusType == 3) { |
933 | correctAnswer = this.formAns.answerList.split(",")[subNum - i]; | 1103 | correctAnswer = this.formAns.answerList.split(",")[subNum - i]; |
934 | - | ||
935 | console.log(this.formAns.answerList.split(",")[subNum - i]); | 1104 | console.log(this.formAns.answerList.split(",")[subNum - i]); |
936 | } else if (this.formAns.qusType == 4) { | 1105 | } else if (this.formAns.qusType == 4) { |
937 | correctAnswer = | 1106 | correctAnswer = |
@@ -969,11 +1138,16 @@ export default { | @@ -969,11 +1138,16 @@ export default { | ||
969 | // event.returnValue = ""; | 1138 | // event.returnValue = ""; |
970 | // } | 1139 | // } |
971 | // }, | 1140 | // }, |
972 | - keydownAnswer(event, type) { | 1141 | + keydownAnswer(event, type, isAddBig) { |
973 | let answerA = "ABCDEFG"; | 1142 | let answerA = "ABCDEFG"; |
974 | let answer_a = "abcdefg"; | 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 | answerA += answer_a; | 1151 | answerA += answer_a; |
978 | answerA = type == 2 ? answerA : answerA + ","; | 1152 | answerA = type == 2 ? answerA : answerA + ","; |
979 | if ( | 1153 | if ( |
@@ -996,15 +1170,26 @@ export default { | @@ -996,15 +1170,26 @@ export default { | ||
996 | event.returnValue = ""; | 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 | setAnswer(type, ans) { | 1194 | setAnswer(type, ans) { |
1010 | let txt = ""; | 1195 | let txt = ""; |
@@ -1133,6 +1318,7 @@ export default { | @@ -1133,6 +1318,7 @@ export default { | ||
1133 | this.addQuestionVisible = true; | 1318 | this.addQuestionVisible = true; |
1134 | }, | 1319 | }, |
1135 | addQuestion() { | 1320 | addQuestion() { |
1321 | + //添加大题 | ||
1136 | let subQuestions = []; | 1322 | let subQuestions = []; |
1137 | let questionsOptions = { | 1323 | let questionsOptions = { |
1138 | ...subQuesOptions, | 1324 | ...subQuesOptions, |
@@ -1164,6 +1350,20 @@ export default { | @@ -1164,6 +1350,20 @@ export default { | ||
1164 | break; | 1350 | break; |
1165 | } | 1351 | } |
1166 | for (let i = 0; i < this.questionForm.number; i++) { | 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 | subQuestions.push({ ...questionsOptions }); | 1367 | subQuestions.push({ ...questionsOptions }); |
1168 | } | 1368 | } |
1169 | this.form.questionList.push({ | 1369 | this.form.questionList.push({ |
@@ -1171,6 +1371,7 @@ export default { | @@ -1171,6 +1371,7 @@ export default { | ||
1171 | number: this.questionForm.number, | 1371 | number: this.questionForm.number, |
1172 | source: 10, | 1372 | source: 10, |
1173 | subQuestions: [...subQuestions], | 1373 | subQuestions: [...subQuestions], |
1374 | + show: false, | ||
1174 | }); | 1375 | }); |
1175 | this.addQuestionVisible = false; | 1376 | this.addQuestionVisible = false; |
1176 | }, | 1377 | }, |
@@ -1347,8 +1548,12 @@ export default { | @@ -1347,8 +1548,12 @@ export default { | ||
1347 | if (this.saveLoading) return; | 1548 | if (this.saveLoading) return; |
1348 | this.saveLoading = true; | 1549 | this.saveLoading = true; |
1349 | this.formatQuestionList(); | 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 | const { data, status, info } = await this.$request.addPaper({ | 1555 | const { data, status, info } = await this.$request.addPaper({ |
1351 | - ...this.form, | 1556 | + ...formDatas, |
1352 | }); | 1557 | }); |
1353 | this.saveLoading = false; | 1558 | this.saveLoading = false; |
1354 | if (status == 0) { | 1559 | if (status == 0) { |
@@ -1480,13 +1685,13 @@ export default { | @@ -1480,13 +1685,13 @@ export default { | ||
1480 | background-size: 19px; | 1685 | background-size: 19px; |
1481 | color: transparent; | 1686 | color: transparent; |
1482 | } | 1687 | } |
1483 | - .answer-s.ac{ | ||
1484 | - border:none; | 1688 | + .answer-s.ac { |
1689 | + border: none; | ||
1485 | } | 1690 | } |
1486 | .ac { | 1691 | .ac { |
1487 | border-color: #ff6868; | 1692 | border-color: #ff6868; |
1488 | background: #ff6868; | 1693 | background: #ff6868; |
1489 | - color: #fff!important; | 1694 | + color: #fff !important; |
1490 | } | 1695 | } |
1491 | } | 1696 | } |
1492 | 1697 | ||
@@ -1573,10 +1778,16 @@ export default { | @@ -1573,10 +1778,16 @@ export default { | ||
1573 | margin: 0 12px; | 1778 | margin: 0 12px; |
1574 | } | 1779 | } |
1575 | } | 1780 | } |
1781 | +.question-box { | ||
1782 | + margin-bottom: 20px; | ||
1783 | +} | ||
1576 | .question-title { | 1784 | .question-title { |
1577 | line-height: 40px; | 1785 | line-height: 40px; |
1786 | + display: flex; | ||
1787 | + align-items: center; | ||
1788 | + margin-bottom: 12px; | ||
1578 | .m20 { | 1789 | .m20 { |
1579 | - margin-right: 20px; | 1790 | + margin: 0 20px; |
1580 | } | 1791 | } |
1581 | .ipt { | 1792 | .ipt { |
1582 | width: 300px; | 1793 | width: 300px; |
@@ -1595,6 +1806,20 @@ export default { | @@ -1595,6 +1806,20 @@ export default { | ||
1595 | font-size: 16px; | 1806 | font-size: 16px; |
1596 | font-weight: 700; | 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 | .el-input-number { | 1824 | .el-input-number { |
1600 | width: 140px; | 1825 | width: 140px; |
@@ -1630,11 +1855,6 @@ export default { | @@ -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 | .qs-options { | 1858 | .qs-options { |
1639 | .answer-s { | 1859 | .answer-s { |
1640 | display: inline-block; | 1860 | display: inline-block; |
src/views/setUp/school.vue
@@ -308,6 +308,9 @@ export default { | @@ -308,6 +308,9 @@ export default { | ||
308 | if (!this.subjectName) { | 308 | if (!this.subjectName) { |
309 | this.$message.warning("请填写科目名称"); | 309 | this.$message.warning("请填写科目名称"); |
310 | return; | 310 | return; |
311 | + }else if(this.subjectList.includes(this.subjectName)){ | ||
312 | + this.$message.warning("科目已存在,请重新填写~"); | ||
313 | + return; | ||
311 | } | 314 | } |
312 | this.subjectList.push(this.subjectName); | 315 | this.subjectList.push(this.subjectName); |
313 | this.formGrade.subjectNames.push(this.subjectName); | 316 | this.formGrade.subjectNames.push(this.subjectName); |