Commit ce278878fa648b5eb3b4234899cef29c6f957f4a

Authored by 梁保满
1 parent 384a2a54

2-2 bugfix

src/api/apis/apis.js
@@ -1653,7 +1653,8 @@ export default { @@ -1653,7 +1653,8 @@ export default {
1653 return service({ 1653 return service({
1654 url: setUpUrls.tClassAndStudentTemplate, 1654 url: setUpUrls.tClassAndStudentTemplate,
1655 method: "POST", 1655 method: "POST",
1656 - data 1656 + data,
  1657 + responseType: 'arraybuffer',
1657 }); 1658 });
1658 }, 1659 },
1659 //教学班班级名册导出 1660 //教学班班级名册导出
src/api/axios.js
@@ -29,7 +29,6 @@ service.interceptors.request.use( @@ -29,7 +29,6 @@ service.interceptors.request.use(
29 config.headers.manager = 1 29 config.headers.manager = 1
30 config.headers.classes = classes 30 config.headers.classes = classes
31 } 31 }
32 - console.log(config)  
33 return config; 32 return config;
34 }, 33 },
35 (error) => { 34 (error) => {
src/api/urls/apis.js
@@ -364,9 +364,6 @@ export default { @@ -364,9 +364,6 @@ export default {
364 // 载指定版本授课端 364 // 载指定版本授课端
365 pGetAppDownloadUrl: "/api_html/personal/getAppDownloadUrl", 365 pGetAppDownloadUrl: "/api_html/personal/getAppDownloadUrl",
366 366
367 - //导出随堂问单科多课时报表  
368 - pExportPhaseAnswerReport: "/api_html/personal/exportPhaseAnswerReport",  
369 -  
370 367
371 // 修改密码 368 // 修改密码
372 changePwd: "/api_html/changePwd", 369 changePwd: "/api_html/changePwd",
@@ -409,6 +406,7 @@ export default { @@ -409,6 +406,7 @@ export default {
409 // 删除班级信息 406 // 删除班级信息
410 removeClass: "/api_html/school/manager/delClass", 407 removeClass: "/api_html/school/manager/delClass",
411 408
  409 +
412 //删除即时测考试 410 //删除即时测考试
413 deleteReport: "/api_html/teaching/deleteReport", 411 deleteReport: "/api_html/teaching/deleteReport",
414 //设置单班科目分析低分区间 412 //设置单班科目分析低分区间
@@ -419,34 +417,4 @@ export default { @@ -419,34 +417,4 @@ export default {
419 exportExamMultiReport: "/api_html/teaching/exportExamMultiReport", 417 exportExamMultiReport: "/api_html/teaching/exportExamMultiReport",
420 //查询即时测多班默认等级列表 418 //查询即时测多班默认等级列表
421 defaultLevels: "/api_html/teaching/defaultLevels", 419 defaultLevels: "/api_html/teaching/defaultLevels",
422 -  
423 -  
424 -  
425 - /** v1.5 */  
426 - // 教师/个人版导入备题组卷Word文档  
427 - paperWordUpload: "/api_html/common/paper/upload",  
428 - // 删除随堂问报表  
429 - deletePaperReport: "/api_html/teaching/deletePaperReport",  
430 - // 删除基站  
431 - deleteStation: "/api_html/school/manager/deleteStation",  
432 - // 导出授课端日志  
433 - downloadDeviceLog: "/api_html/school/manager/downloadDeviceLog",  
434 - // 教学班班级名册模板下载  
435 - tClassAndStudentTemplate: "/api_html/school/manager/tClassAndStudentTemplate",  
436 - // 教学班班级名册导出  
437 - exportTClassAndStudent: "/api_html/school/manager/exportTClassAndStudent",  
438 - // 删除班级信息(新)  
439 - deleteClass: "/api_html/school/manager/deleteClass",  
440 - // 清除老师下所有关联班级  
441 - clearTeacherClasses: "/api_html/school/manager/clearTeacherClasses",  
442 -  
443 - // 下载即时测导入分数模板  
444 - scoreTemplate: "/api_html/teaching/scoreTemplate",  
445 - // 导入即时测报表分数  
446 - importScore: "/api_html/teaching/importScore",  
447 - // 获取即时测报表学生名单和题目列表  
448 - listStudentsAndQuestions: "/api_html/teaching/listStudentsAndQuestions",  
449 - // 提交即时测报表分数  
450 - submitScore: "/api_html/teaching/submitScore",  
451 -  
452 } 420 }
src/components/charts/lineChart.vue
@@ -10,7 +10,8 @@ export default { @@ -10,7 +10,8 @@ export default {
10 params: Array, 10 params: Array,
11 xAxis: Array, 11 xAxis: Array,
12 colors: Array, 12 colors: Array,
13 - formatterYAxis: true 13 + formatterYAxis: true,
  14 + tooltipFormatter:false
14 }, 15 },
15 watch: { 16 watch: {
16 params: { 17 params: {
@@ -40,6 +41,11 @@ export default { @@ -40,6 +41,11 @@ export default {
40 tooltip: { 41 tooltip: {
41 trigger: "item", 42 trigger: "item",
42 confine: true, 43 confine: true,
  44 + formatter(v) {
  45 + let html = `<p>${v.seriesName}</p>`
  46 + html += `${v.marker} ${v.name}:${v.value}${that.tooltipFormatter?'%':''}`
  47 + return html
  48 + },
43 }, 49 },
44 legend: { 50 legend: {
45 show: true, 51 show: true,
src/components/exportDia.vue
@@ -92,7 +92,7 @@ export default { @@ -92,7 +92,7 @@ export default {
92 return item.studentId 92 return item.studentId
93 }) 93 })
94 } 94 }
95 - this.$emit('exportData', studentIds) 95 + this.$emit('exportData', this.downType==1?null:studentIds)
96 }, 96 },
97 cancel() { 97 cancel() {
98 if (this.exportType == 2) { 98 if (this.exportType == 2) {
src/router/index.js
@@ -9,7 +9,7 @@ import HomeMain from &quot;@/views/index/mainIndex&quot; @@ -9,7 +9,7 @@ import HomeMain from &quot;@/views/index/mainIndex&quot;
9 const NotFound = () => import("@/views/page404") 9 const NotFound = () => import("@/views/page404")
10 const ExaminationPaper = () => import("@/views/examinationPaper/index") 10 const ExaminationPaper = () => import("@/views/examinationPaper/index")
11 const ExaminationPaperAdd = () => import("@/views/examinationPaper/add") 11 const ExaminationPaperAdd = () => import("@/views/examinationPaper/add")
12 -const ExaminationPaperAddAsk = () => import("@/views/examinationPaper/addAsk") 12 +const ExaminationPaperAddQs = () => import("@/views/examinationPaper/addQs")
13 const ExaminationPaperEdit = () => import("@/views/examinationPaper/edit") 13 const ExaminationPaperEdit = () => import("@/views/examinationPaper/edit")
14 const ExaminationPaperRecycle = () => import("@/views/examinationPaper/recycle") 14 const ExaminationPaperRecycle = () => import("@/views/examinationPaper/recycle")
15 const ExaminationPaperArchiving = () => import("@/views/examinationPaper/archiving") 15 const ExaminationPaperArchiving = () => import("@/views/examinationPaper/archiving")
@@ -169,10 +169,10 @@ let addrouters = [ @@ -169,10 +169,10 @@ let addrouters = [
169 children: [] 169 children: []
170 }, 170 },
171 { 171 {
172 - path: "/examinationPaperAddAsk", 172 + path: "/examinationPaperAddQs",
173 iconCls: "", // 图标样式class 173 iconCls: "", // 图标样式class
174 - name: "examinationPaperAddAsk",  
175 - component: ExaminationPaperAddAsk, 174 + name: "examinationPaperAddQs",
  175 + component: ExaminationPaperAddQs,
176 parent: "examinationPaper", 176 parent: "examinationPaper",
177 children: [] 177 children: []
178 }, 178 },
@@ -810,10 +810,10 @@ const addroutersPersonal = [ @@ -810,10 +810,10 @@ const addroutersPersonal = [
810 children: [] 810 children: []
811 }, 811 },
812 { 812 {
813 - path: "/examinationPaperAddAsk", 813 + path: "/examinationPaperAddQs",
814 iconCls: "", 814 iconCls: "",
815 - name: "examinationPaperAddAsk",  
816 - component: ExaminationPaperAddAsk, 815 + name: "examinationPaperAddQs",
  816 + component: ExaminationPaperAddQs,
817 parent: "examinationPaper", 817 parent: "examinationPaper",
818 children: [] 818 children: []
819 }, 819 },
src/store/index.js
@@ -26,6 +26,7 @@ const store = new Vuex.Store({ @@ -26,6 +26,7 @@ const store = new Vuex.Store({
26 : [], //动态路由 26 : [], //动态路由
27 tokenSources: new Map(), //正在请求接口(切换取消请求) 27 tokenSources: new Map(), //正在请求接口(切换取消请求)
28 classes: localStorage.getItem("classes") || "", //班主任选择班级查询报表(用于教学班学生筛选) 28 classes: localStorage.getItem("classes") || "", //班主任选择班级查询报表(用于教学班学生筛选)
  29 + refreshTestList: false, //重新计分刷新列表
29 }, 30 },
30 mutations: { 31 mutations: {
31 setToken(state, token) { 32 setToken(state, token) {
@@ -75,6 +76,9 @@ const store = new Vuex.Store({ @@ -75,6 +76,9 @@ const store = new Vuex.Store({
75 setClasses(state, data) { 76 setClasses(state, data) {
76 state.classes = data; 77 state.classes = data;
77 localStorage.setItem("classes", data); 78 localStorage.setItem("classes", data);
  79 + },
  80 + setRefreshTestList(state, data) {
  81 + state.refreshTestList = data;
78 } 82 }
79 }, 83 },
80 actions: { 84 actions: {
@@ -206,6 +210,7 @@ const store = new Vuex.Store({ @@ -206,6 +210,7 @@ const store = new Vuex.Store({
206 uniquerouter: (state) => state.layoutStore.uniquerouter, 210 uniquerouter: (state) => state.layoutStore.uniquerouter,
207 tabnavBox: (state) => state.layoutStore.tabnavBox, 211 tabnavBox: (state) => state.layoutStore.tabnavBox,
208 rightNav: (state) => state.layoutStore.rightNav, 212 rightNav: (state) => state.layoutStore.rightNav,
  213 + refreshTestList: (state) => state.refreshTestList,
209 }, 214 },
210 modules: { 215 modules: {
211 layoutStore, 216 layoutStore,
src/views/basic/ask/analysis.vue
@@ -103,7 +103,7 @@ export default { @@ -103,7 +103,7 @@ export default {
103 this.id = JSON.parse(this.$route.query.id) 103 this.id = JSON.parse(this.$route.query.id)
104 this.status = this.$route.query.status ? this.$route.query.status : 0; 104 this.status = this.$route.query.status ? this.$route.query.status : 0;
105 this._QueryData(); 105 this._QueryData();
106 - this._QueryDataQuestionRank(); 106 + this.types != 1 ?this._QueryDataQuestionRank():'';
107 this.types != 3 ? this.periodDetail() : ''; 107 this.types != 3 ? this.periodDetail() : '';
108 }, 108 },
109 methods: { 109 methods: {
@@ -209,13 +209,7 @@ export default { @@ -209,13 +209,7 @@ export default {
209 }); 209 });
210 this.loading = false; 210 this.loading = false;
211 if (status === 0) { 211 if (status === 0) {
212 - if (this.type == 2) {  
213 - this.tableData = data?.list || []  
214 - } else {  
215 - this.tableData = data?.list.sort((a, b) => {  
216 - return a.questionIndex - b.questionIndex;  
217 - });  
218 - } 212 + this.tableData = data?.list || []
219 this.total = data.count; 213 this.total = data.count;
220 } else { 214 } else {
221 this.$message.error(info); 215 this.$message.error(info);
@@ -224,22 +218,13 @@ export default { @@ -224,22 +218,13 @@ export default {
224 async _QueryDataQuestionRank() { 218 async _QueryDataQuestionRank() {
225 let queryData; 219 let queryData;
226 let query = {}; 220 let query = {};
227 - if (this.types == 1) {  
228 - if (this.role == "ROLE_PERSONAL") {  
229 - queryData = this.$request.pPeriodStudentReport  
230 - } else {  
231 - queryData = this.$request.periodStudentReport  
232 - }  
233 - query.type = this.type - 1  
234 - query.periodId = this.id[0]  
235 - } else { 221 +
236 query.periodIds = this.id 222 query.periodIds = this.id
237 if (this.types == 2) { 223 if (this.types == 2) {
238 queryData = this.$request.phaseAnswerReport 224 queryData = this.$request.phaseAnswerReport
239 } else if (this.types == 3) { 225 } else if (this.types == 3) {
240 queryData = this.$request.cTPhaseAnswerReport 226 queryData = this.$request.cTPhaseAnswerReport
241 } 227 }
242 - }  
243 if (this.types != 1) { 228 if (this.types != 1) {
244 query.classId = this.classId 229 query.classId = this.classId
245 } 230 }
@@ -249,6 +234,7 @@ export default { @@ -249,6 +234,7 @@ export default {
249 ...query, 234 ...query,
250 }); 235 });
251 this.loading = false; 236 this.loading = false;
  237 + console.log(data)
252 if (status === 0) { 238 if (status === 0) {
253 this.exportStudent = data?.list && [...data?.list] || [] 239 this.exportStudent = data?.list && [...data?.list] || []
254 } else { 240 } else {
@@ -268,16 +254,21 @@ export default { @@ -268,16 +254,21 @@ export default {
268 this.exportLoading = true; 254 this.exportLoading = true;
269 let studentIds = arr 255 let studentIds = arr
270 let query = {}; 256 let query = {};
271 - if (studentIds.length > 0) {  
272 - query.studentIds = studentIds  
273 - } else {  
274 - query.studentIds = [] 257 + if(studentIds != null){
  258 + if (studentIds.length > 0) {
  259 + query.studentIds = studentIds
  260 + } else {
  261 + query.studentIds = []
  262 + }
275 } 263 }
276 let exportPeriodReport = "" 264 let exportPeriodReport = ""
277 - if (this.id.length == 1) { 265 + if (this.types == 1) {
278 query.periodId = this.id[0] 266 query.periodId = this.id[0]
279 - exportPeriodReport = this.role == "ROLE_PERSONAL" ? this.$request.pExportPhaseAnswerReport : this.$request.exportPeriodReport  
280 - } else { 267 + exportPeriodReport = this.role == "ROLE_PERSONAL" ? this.$request.pExportPeriodReport : this.$request.exportPeriodReport
  268 + } else if(this.types == 2){
  269 + query.periodIds = this.id
  270 + exportPeriodReport = this.role == "ROLE_PERSONAL" ?this.$request.pExportPhaseAnswerReport:this.$request.exportPhaseAnswerReport
  271 + }else{
281 query.periodIds = this.id 272 query.periodIds = this.id
282 exportPeriodReport = this.$request.cTExportPhaseAnswerReport 273 exportPeriodReport = this.$request.cTExportPhaseAnswerReport
283 } 274 }
@@ -287,6 +278,7 @@ export default { @@ -287,6 +278,7 @@ export default {
287 }); 278 });
288 this.exportLoading = false; 279 this.exportLoading = false;
289 if (data) { 280 if (data) {
  281 + this.cancel()
290 let blob = new Blob([data], { 282 let blob = new Blob([data], {
291 type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 283 type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
292 }); 284 });
src/views/basic/ask/components/answerQustion.vue
1 <template> 1 <template>
2 <div> 2 <div>
3 <el-table :data="resultData" border style="width: 100%"> 3 <el-table :data="resultData" border style="width: 100%">
4 - <el-table-column prop="studentCode" label="学号" align="center"></el-table-column>  
5 - <el-table-column prop="studentName" label="姓名" align="center"></el-table-column> 4 + <el-table-column
  5 + prop="studentCode"
  6 + label="学号"
  7 + align="center"
  8 + ></el-table-column>
  9 + <el-table-column
  10 + prop="studentName"
  11 + label="姓名"
  12 + align="center"
  13 + ></el-table-column>
6 <template v-if="types == 1"> 14 <template v-if="types == 1">
7 - <el-table-column prop="answerTimes" label="答题次数" align="center"></el-table-column>  
8 - <el-table-column prop="consumingDuration" label="答题耗时" align="center"><template slot-scope="scoped">{{  
9 - setDuration(scoped.row.consumingDuration)  
10 - }}</template></el-table-column>  
11 - <el-table-column prop="correctAnswerTimes" label="答对次数" align="center"></el-table-column>  
12 - <el-table-column prop="participationRate" label="参与度" sortable align="center"><template slot-scope="scoped">{{  
13 - scoped.row.participationRate }}%</template></el-table-column>  
14 - <el-table-column prop="correctRate" label="正确率" sortable align="center"><template slot-scope="scoped">{{  
15 - scoped.row.correctRate }}%</template></el-table-column>  
16 - <el-table-column prop="answerCorrectRate" label="已答正确率" sortable align="center"><template slot-scope="scoped">{{  
17 - scoped.row.answerCorrectRate }}%</template></el-table-column>  
18 - <el-table-column v-for="(item, index) in optionsList" :key="index" :label="'Q' + (index + 1)"  
19 - align="center"><template slot-scope="scoped"> 15 + <el-table-column
  16 + prop="answerTimes"
  17 + label="答题次数"
  18 + align="center"
  19 + ></el-table-column>
  20 + <el-table-column
  21 + prop="consumingDuration"
  22 + label="答题耗时"
  23 + align="center"
  24 + ><template slot-scope="scoped">{{
  25 + setDuration(scoped.row.consumingDuration)
  26 + }}</template></el-table-column
  27 + >
  28 + <el-table-column
  29 + prop="correctAnswerTimes"
  30 + label="答对次数"
  31 + align="center"
  32 + ></el-table-column>
  33 + <el-table-column
  34 + prop="participationRate"
  35 + label="参与度"
  36 + sortable
  37 + align="center"
  38 + ><template slot-scope="scoped"
  39 + >{{ scoped.row.participationRate }}%</template
  40 + ></el-table-column
  41 + >
  42 + <el-table-column
  43 + prop="correctRate"
  44 + label="正确率"
  45 + sortable
  46 + align="center"
  47 + ><template slot-scope="scoped"
  48 + >{{ scoped.row.correctRate }}%</template
  49 + ></el-table-column
  50 + >
  51 + <el-table-column
  52 + prop="answerCorrectRate"
  53 + label="已答正确率"
  54 + sortable
  55 + align="center"
  56 + ><template slot-scope="scoped"
  57 + >{{ scoped.row.answerCorrectRate }}%</template
  58 + ></el-table-column
  59 + >
  60 + <el-table-column
  61 + v-for="(item, index) in optionsList"
  62 + :key="index"
  63 + :label="'Q' + (index + 1)"
  64 + align="center"
  65 + ><template slot-scope="scoped">
20 <span :class="scoped.row['isRight' + index] ? '' : 'red'">{{ 66 <span :class="scoped.row['isRight' + index] ? '' : 'red'">{{
21 scoped.row["answer" + index] 67 scoped.row["answer" + index]
22 }}</span> 68 }}</span>
@@ -24,59 +70,136 @@ @@ -24,59 +70,136 @@
24 </el-table-column> 70 </el-table-column>
25 </template> 71 </template>
26 <template v-if="types == 2"> 72 <template v-if="types == 2">
27 - <el-table-column prop="answerTimes" label="累计答题次数" align="center"></el-table-column>  
28 - <el-table-column prop="correctAnswerTimes" label="累计答对次数" align="center"></el-table-column>  
29 - <el-table-column prop="participationRate" label="总参与度" align="center"><template slot-scope="scoped">{{  
30 - scoped.row.participationRate }}%</template></el-table-column> 73 + <el-table-column
  74 + prop="answerTimes"
  75 + label="累计答题次数"
  76 + align="center"
  77 + ></el-table-column>
  78 + <el-table-column
  79 + prop="correctAnswerTimes"
  80 + label="累计答对次数"
  81 + align="center"
  82 + ></el-table-column>
  83 + <el-table-column
  84 + prop="participationRate"
  85 + label="总参与度"
  86 + align="center"
  87 + ><template slot-scope="scoped"
  88 + >{{ scoped.row.participationRate }}%</template
  89 + ></el-table-column
  90 + >
31 91
32 - <el-table-column prop="participationRateRank" label="总参与度班名" align="center"></el-table-column>  
33 - <el-table-column prop="correctRate" label="总正确率" align="center"><template slot-scope="scoped">{{  
34 - scoped.row.correctRate }}%</template></el-table-column>  
35 - <el-table-column prop="correctRateRank" label="总正确率班名" sortable align="center"></el-table-column>  
36 - <el-table-column prop="answerCorrectRate" label="已答正确率" align="center"><template slot-scope="scoped">{{  
37 - scoped.row.answerCorrectRate }}%</template></el-table-column> 92 + <el-table-column
  93 + prop="participationRateRank"
  94 + label="总参与度班名"
  95 + align="center"
  96 + ></el-table-column>
  97 + <el-table-column prop="correctRate" label="总正确率" align="center"
  98 + ><template slot-scope="scoped"
  99 + >{{ scoped.row.correctRate }}%</template
  100 + ></el-table-column
  101 + >
  102 + <el-table-column
  103 + prop="correctRateRank"
  104 + label="总正确率班名"
  105 + sortable
  106 + align="center"
  107 + ></el-table-column>
  108 + <el-table-column
  109 + prop="answerCorrectRate"
  110 + label="已答正确率"
  111 + align="center"
  112 + ><template slot-scope="scoped"
  113 + >{{ scoped.row.answerCorrectRate }}%</template
  114 + ></el-table-column
  115 + >
38 <el-table-column label="查看折线图" align="center"> 116 <el-table-column label="查看折线图" align="center">
39 <template slot-scope="scoped"> 117 <template slot-scope="scoped">
40 - <el-button @click="openLineChart(scoped.row)" type="primary" size="mini" circle  
41 - icon="el-icon-arrow-right"></el-button></template> 118 + <el-button
  119 + @click="openLineChart(scoped.row)"
  120 + type="primary"
  121 + size="mini"
  122 + circle
  123 + icon="el-icon-arrow-right"
  124 + ></el-button
  125 + ></template>
42 </el-table-column> 126 </el-table-column>
43 </template> 127 </template>
44 <template v-if="types == 3"> 128 <template v-if="types == 3">
45 - <el-table-column v-for="(item, index) in phaseOption" :key="index" :label="item" align="center">  
46 - <el-table-column align="center" :label="index == 0 ? '总课时数' : '课时数'" :prop="'periodCount' + item"> 129 + <el-table-column
  130 + v-for="(item, index) in phaseOption"
  131 + :key="index"
  132 + :label="item"
  133 + align="center"
  134 + >
  135 + <el-table-column
  136 + align="center"
  137 + :label="index == 0 ? '总课时数' : '课时数'"
  138 + :prop="'periodCount' + item"
  139 + >
47 </el-table-column> 140 </el-table-column>
48 - <el-table-column align="center" :label="index == 0 ? '总出题数' : '出题数'" :prop="'questionNum' + item"> 141 + <el-table-column
  142 + align="center"
  143 + :label="index == 0 ? '总出题数' : '出题数'"
  144 + :prop="'questionNum' + item"
  145 + >
49 </el-table-column> 146 </el-table-column>
50 - <el-table-column align="center" :label="index == 0 ? '总参与度' : '参与度'"  
51 - :prop="'participationRate' + item"><template slot-scope="scoped">{{ scoped.row["participationRate" + item]  
52 - }}%</template> 147 + <el-table-column
  148 + align="center"
  149 + :label="index == 0 ? '总参与度' : '参与度'"
  150 + :prop="'participationRate' + item"
  151 + ><template slot-scope="scoped"
  152 + >{{ scoped.row["participationRate" + item] }}%</template
  153 + >
53 </el-table-column> 154 </el-table-column>
54 - <el-table-column align="center" :label="index == 0 ? '总正确率' : '正确率'" :prop="'correctRate' + item"><template  
55 - slot-scope="scoped">{{ scoped.row["correctRate" + item] }}%</template> 155 + <el-table-column
  156 + align="center"
  157 + :label="index == 0 ? '总正确率' : '正确率'"
  158 + :prop="'correctRate' + item"
  159 + ><template slot-scope="scoped"
  160 + >{{ scoped.row["correctRate" + item] }}%</template
  161 + >
56 </el-table-column> 162 </el-table-column>
57 </el-table-column> 163 </el-table-column>
58 <el-table-column label="查看雷达图" align="center"> 164 <el-table-column label="查看雷达图" align="center">
59 <template slot-scope="scoped"> 165 <template slot-scope="scoped">
60 - <el-button @click="openRandarChart(scoped.row)" type="primary" size="mini" circle  
61 - icon="el-icon-arrow-right"></el-button></template> 166 + <el-button
  167 + @click="openRandarChart(scoped.row)"
  168 + type="primary"
  169 + size="mini"
  170 + circle
  171 + icon="el-icon-arrow-right"
  172 + ></el-button
  173 + ></template>
62 </el-table-column> 174 </el-table-column>
63 </template> 175 </template>
64 </el-table> 176 </el-table>
65 - <el-dialog class="chart-dia" :visible.sync="chartDia" :title="chartTitle" width="800"> 177 + <el-dialog
  178 + class="chart-dia"
  179 + :visible.sync="chartDia"
  180 + :title="chartTitle"
  181 + width="800"
  182 + >
66 <div class="chart-box"> 183 <div class="chart-box">
67 - <LineChart v-if="types == 2" id="askLineChart" :params="chartData" :xAxis="xAxis" /> 184 + <LineChart
  185 + v-if="types == 2"
  186 + id="askLineChart"
  187 + :params="chartData"
  188 + :xAxis="xAxis"
  189 + :tooltipFormatter="true"
  190 + />
68 <RadarChart v-if="types == 3" id="askRadarChart" :params="chartData" /> 191 <RadarChart v-if="types == 3" id="askRadarChart" :params="chartData" />
69 </div> 192 </div>
70 </el-dialog> 193 </el-dialog>
71 </div> 194 </div>
72 </template> 195 </template>
73 <script> 196 <script>
74 -import LineChart from "@/components/charts/lineChart"  
75 -import RadarChart from "@/components/charts/radarChart" 197 +import LineChart from "@/components/charts/lineChart";
  198 +import RadarChart from "@/components/charts/radarChart";
76 export default { 199 export default {
77 components: { 200 components: {
78 LineChart, 201 LineChart,
79 - RadarChart 202 + RadarChart,
80 }, 203 },
81 props: { 204 props: {
82 tableData: Array, 205 tableData: Array,
@@ -97,11 +220,11 @@ export default { @@ -97,11 +220,11 @@ export default {
97 }, 220 },
98 computed: { 221 computed: {
99 resultData: function () { 222 resultData: function () {
100 - let resultData = [] 223 + let resultData = [];
101 if (this.tableData.length) { 224 if (this.tableData.length) {
102 let optionsList = []; 225 let optionsList = [];
103 let subjectName = []; 226 let subjectName = [];
104 - let rank = {} 227 + let rank = {};
105 resultData = this.tableData.map((item) => { 228 resultData = this.tableData.map((item) => {
106 let params = {}; 229 let params = {};
107 230
@@ -116,8 +239,8 @@ export default { @@ -116,8 +239,8 @@ export default {
116 items.answer == 1 239 items.answer == 1
117 ? "✓" 240 ? "✓"
118 : items.answer == 2 241 : items.answer == 2
119 - ? "✗"  
120 - : items.answer; 242 + ? "✗"
  243 + : items.answer;
121 }); 244 });
122 } else if (this.types == 3) { 245 } else if (this.types == 3) {
123 item.dataList.map((items, index) => { 246 item.dataList.map((items, index) => {
@@ -134,47 +257,49 @@ export default { @@ -134,47 +257,49 @@ export default {
134 }); 257 });
135 } 258 }
136 if (this.types != 3) { 259 if (this.types != 3) {
137 - let participationRateArr = []  
138 - let correctRateArr = []  
139 - this.tableData.map(item => {  
140 - participationRateArr.push(item.participationRate)  
141 - correctRateArr.push(item.correctRate)  
142 - })  
143 - participationRateArr = [...new Set(participationRateArr)] 260 + let participationRateArr = [];
  261 + let correctRateArr = [];
  262 + this.tableData.map((item) => {
  263 + participationRateArr.push(item.participationRate);
  264 + correctRateArr.push(item.correctRate);
  265 + });
  266 + participationRateArr = [...new Set(participationRateArr)];
144 participationRateArr = participationRateArr.sort((a, b) => { 267 participationRateArr = participationRateArr.sort((a, b) => {
145 - return b - a  
146 - })  
147 - correctRateArr = [...new Set(correctRateArr)] 268 + return b - a;
  269 + });
  270 + correctRateArr = [...new Set(correctRateArr)];
148 correctRateArr = correctRateArr.sort((a, b) => { 271 correctRateArr = correctRateArr.sort((a, b) => {
149 - return b - a  
150 - })  
151 - let participationRateRank = participationRateArr.findIndex(value => {  
152 - return item.participationRate == value  
153 - })  
154 - let correctRateRank = correctRateArr.findIndex(value => {  
155 - return item.correctRate == value  
156 - }) 272 + return b - a;
  273 + });
  274 + let participationRateRank = participationRateArr.findIndex(
  275 + (value) => {
  276 + return item.participationRate == value;
  277 + }
  278 + );
  279 + let correctRateRank = correctRateArr.findIndex((value) => {
  280 + return item.correctRate == value;
  281 + });
157 rank = { 282 rank = {
158 participationRateRank: participationRateRank + 1, 283 participationRateRank: participationRateRank + 1,
159 - correctRateRank: correctRateRank + 1  
160 - } 284 + correctRateRank: correctRateRank + 1,
  285 + };
161 } 286 }
162 return { 287 return {
163 ...item, 288 ...item,
164 ...params, 289 ...params,
165 - ...rank 290 + ...rank,
166 }; 291 };
167 }); 292 });
168 this.phaseOption = [...subjectName]; 293 this.phaseOption = [...subjectName];
169 this.optionsList = [...optionsList]; 294 this.optionsList = [...optionsList];
170 } else { 295 } else {
171 - resultData = []  
172 - this.optionsList = [] 296 + resultData = [];
  297 + this.optionsList = [];
173 } 298 }
174 - return resultData  
175 - } 299 + return resultData;
  300 + },
176 }, 301 },
177 - created() { }, 302 + created() {},
178 methods: { 303 methods: {
179 setDuration(times) { 304 setDuration(times) {
180 if (times) { 305 if (times) {
@@ -198,84 +323,82 @@ export default { @@ -198,84 +323,82 @@ export default {
198 }, 323 },
199 //查看折线图 324 //查看折线图
200 openLineChart(obj) { 325 openLineChart(obj) {
201 - this.chartTitle = `${obj.studentName}-${this.subjectNames[0]}-多课时作答表现图`  
202 - this.chartDia = true  
203 - let participationRate = []  
204 - let correctRate = []  
205 - let answerCorrectRate = []  
206 - let dataList = obj.dataList  
207 - this.xAxis = dataList.map(item => {  
208 - participationRate.push(item.participationRate)  
209 - correctRate.push(item.correctRate)  
210 - answerCorrectRate.push(item.answerCorrectRate)  
211 - return item.name  
212 - }) 326 + this.chartTitle = `${obj.studentName}-${this.subjectNames[0]}-多课时作答表现图`;
  327 + this.chartDia = true;
  328 + let participationRate = [];
  329 + let correctRate = [];
  330 + let answerCorrectRate = [];
  331 + let dataList = obj.dataList;
  332 + this.xAxis = dataList.map((item) => {
  333 + participationRate.push(item.participationRate);
  334 + correctRate.push(item.correctRate);
  335 + answerCorrectRate.push(item.answerCorrectRate);
  336 + return item.name;
  337 + });
213 this.chartData = [ 338 this.chartData = [
214 { 339 {
215 name: "参与度", 340 name: "参与度",
216 - value: participationRate 341 + value: participationRate,
217 }, 342 },
218 { 343 {
219 name: "正确率", 344 name: "正确率",
220 - value: correctRate 345 + value: correctRate,
221 }, 346 },
222 { 347 {
223 name: "已答正确率", 348 name: "已答正确率",
224 - value: answerCorrectRate 349 + value: answerCorrectRate,
225 }, 350 },
226 - ]  
227 - 351 + ];
228 }, 352 },
229 openRandarChart(obj) { 353 openRandarChart(obj) {
230 this.chartData = { 354 this.chartData = {
231 indicator: [ 355 indicator: [
232 { 356 {
233 - name: '', max: 100, 357 + name: "",
  358 + max: 100,
234 axisLabel: { 359 axisLabel: {
235 show: true, 360 show: true,
236 showMaxLabel: true, 361 showMaxLabel: true,
237 - formatter: '{value}%' 362 + formatter: "{value}%",
238 }, 363 },
239 }, 364 },
240 ], 365 ],
241 - seriesData: []  
242 - }  
243 - this.chartTitle = obj.studentName + '-多科-多课时作答表现图'  
244 - let dataList = obj.dataList.slice(1, obj.dataList.length)  
245 - let subjectList = dataList.map(item => item.subjectName) 366 + seriesData: [],
  367 + };
  368 + this.chartTitle = obj.studentName + "-多科-多课时作答表现图";
  369 + let dataList = obj.dataList.slice(1, obj.dataList.length);
  370 + let subjectList = dataList.map((item) => item.subjectName);
246 subjectList.map((item, index) => { 371 subjectList.map((item, index) => {
247 if (index < 1) { 372 if (index < 1) {
248 - this.chartData.indicator[index].name = item 373 + this.chartData.indicator[index].name = item;
249 } else { 374 } else {
250 - this.chartData.indicator.push({ name: item, max: 100 }) 375 + this.chartData.indicator.push({ name: item, max: 100 });
251 } 376 }
252 - }) 377 + });
253 // 为了美观 378 // 为了美观
254 if (this.chartData.indicator.length < 3) { 379 if (this.chartData.indicator.length < 3) {
255 - let num = this.chartData.indicator.length 380 + let num = this.chartData.indicator.length;
256 for (let i = 0; i < 6; i++) { 381 for (let i = 0; i < 6; i++) {
257 if (i >= num) { 382 if (i >= num) {
258 - this.chartData.indicator.push({ name: "", max: 100 }) 383 + this.chartData.indicator.push({ name: "", max: 100 });
259 } 384 }
260 } 385 }
261 } 386 }
262 - let participationRate = dataList.map(item => item.participationRate)  
263 - let correctRate = dataList.map(item => item.correctRate) 387 + let participationRate = dataList.map((item) => item.participationRate);
  388 + let correctRate = dataList.map((item) => item.correctRate);
264 this.chartData.seriesData = [ 389 this.chartData.seriesData = [
265 { 390 {
266 value: participationRate, 391 value: participationRate,
267 - name: '参与度' 392 + name: "参与度",
268 }, 393 },
269 { 394 {
270 value: correctRate, 395 value: correctRate,
271 - name: '正确率' 396 + name: "正确率",
272 }, 397 },
273 - ]  
274 - this.chartDia = true  
275 -  
276 - 398 + ];
  399 + this.chartDia = true;
277 }, 400 },
278 - } 401 + },
279 }; 402 };
280 </script> 403 </script>
281 <style lang="scss"> 404 <style lang="scss">
src/views/basic/ask/components/example.vue
1 <template> 1 <template>
2 2
3 <el-table :data="tableData" border style="width: 100%"> 3 <el-table :data="tableData" border style="width: 100%">
4 - <el-table-column prop="questionIndex" label="题号" align="center"><template slot-scope="scoped">Q{{  
5 - scoped.row.questionIndex }}</template></el-table-column> 4 + <el-table-column prop="title" label="题号" align="center"></el-table-column>
6 <el-table-column prop="questionType" label="题型" align="center"> 5 <el-table-column prop="questionType" label="题型" align="center">
7 <template slot-scope="scoped">{{ 6 <template slot-scope="scoped">{{
8 setSubPro(scoped.row.questionType) 7 setSubPro(scoped.row.questionType)
src/views/basic/setUp/teacher.vue
@@ -468,6 +468,13 @@ export default { @@ -468,6 +468,13 @@ export default {
468 }, 468 },
469 //添加教师 469 //添加教师
470 addTeacher() { 470 addTeacher() {
  471 + if (this.setTercherType == 1) {
  472 + delete this.rulesTeacher.roleList
  473 + } else {
  474 + this.rulesTeacher.roleList = [
  475 + { required: true, message: "请选择角色信息", trigger: "blur" },
  476 + ]
  477 + }
471 this.$refs.formTeacher.validate(async (valid) => { 478 this.$refs.formTeacher.validate(async (valid) => {
472 if (valid) { 479 if (valid) {
473 let obj = this.setTeacharForm(); 480 let obj = this.setTeacharForm();
@@ -497,11 +504,12 @@ export default { @@ -497,11 +504,12 @@ export default {
497 if (res.status === 0) { 504 if (res.status === 0) {
498 this.$message.success(res.info); 505 this.$message.success(res.info);
499 this.diaTeacher = false; 506 this.diaTeacher = false;
500 - this._QueryData(6); 507 + this._QueryData(10);
501 } else { 508 } else {
502 this.$message.error(res.info); 509 this.$message.error(res.info);
503 } 510 }
504 } else { 511 } else {
  512 + console.log(valid)
505 this.$message.warning("输入有误请检查!"); 513 this.$message.warning("输入有误请检查!");
506 return false; 514 return false;
507 } 515 }
@@ -631,7 +639,7 @@ export default { @@ -631,7 +639,7 @@ export default {
631 ...query, 639 ...query,
632 }); 640 });
633 if (status === 0) { 641 if (status === 0) {
634 - this._QueryData(6); 642 + this._QueryData(10);
635 } else { 643 } else {
636 this.$message.error(info); 644 this.$message.error(info);
637 } 645 }
src/views/basic/test/components/multipleSubTest.vue
@@ -239,10 +239,12 @@ export default { @@ -239,10 +239,12 @@ export default {
239 this.exportLoading = true; 239 this.exportLoading = true;
240 let studentIds = arr 240 let studentIds = arr
241 let query = {}; 241 let query = {};
242 - if (studentIds.length > 0) {  
243 - query.studentIds = studentIds  
244 - } else {  
245 - query.studentIds = [] 242 + if(studentIds != null){
  243 + if (studentIds.length > 0) {
  244 + query.studentIds = studentIds
  245 + } else {
  246 + query.studentIds = []
  247 + }
246 } 248 }
247 249
248 250
src/views/basic/test/components/multipleTest.vue
@@ -205,10 +205,12 @@ export default { @@ -205,10 +205,12 @@ export default {
205 this.exportLoading = true; 205 this.exportLoading = true;
206 let studentIds = [...arr] 206 let studentIds = [...arr]
207 let query = {}; 207 let query = {};
208 - if (studentIds.length > 0) {  
209 - query.studentIds = studentIds  
210 - } else {  
211 - query.studentIds = [] 208 + if(studentIds != null){
  209 + if (studentIds.length > 0) {
  210 + query.studentIds = studentIds
  211 + } else {
  212 + query.studentIds = []
  213 + }
212 } 214 }
213 const exportPhaseExamReport = this.role == "ROLE_PERSONAL" 215 const exportPhaseExamReport = this.role == "ROLE_PERSONAL"
214 ? this.$request.pExportPhaseExamReport 216 ? this.$request.pExportPhaseExamReport
src/views/basic/test/components/test.vue
@@ -198,7 +198,7 @@ @@ -198,7 +198,7 @@
198 </div> 198 </div>
199 <div class="down"> 199 <div class="down">
200 <div> 200 <div>
201 - <el-button @click="openDown" type="primary" plain round icon="fa fa-cloud-download">导出报表</el-button> 201 + <el-button @click="exportData" type="primary" plain round icon="fa fa-cloud-download">导出报表</el-button>
202 <el-button v-if="!this.$store.getters.code" @click="print" type="primary" plain round 202 <el-button v-if="!this.$store.getters.code" @click="print" type="primary" plain round
203 icon="el-icon-printer">打印</el-button> 203 icon="el-icon-printer">打印</el-button>
204 </div> 204 </div>
@@ -237,7 +237,6 @@ @@ -237,7 +237,6 @@
237 <el-button @click="diaMinScore = false">取 消</el-button> 237 <el-button @click="diaMinScore = false">取 消</el-button>
238 </div> 238 </div>
239 </el-dialog> 239 </el-dialog>
240 - <ExportDia :exportStudent="exportStudent" :diaShow="diaShow" @cancel="cancel" @exportData="exportData" />  
241 </div> 240 </div>
242 </template> 241 </template>
243 <script> 242 <script>
@@ -445,6 +444,7 @@ export default { @@ -445,6 +444,7 @@ export default {
445 }); 444 });
446 this.loading = false; 445 this.loading = false;
447 if (status === 0) { 446 if (status === 0) {
  447 + this.$store.commit("setRefreshTestList", true)
448 this.$message.success(info); 448 this.$message.success(info);
449 this._QueryData(); 449 this._QueryData();
450 this.paperModifyLog.modifiedTime = ""; 450 this.paperModifyLog.modifiedTime = "";
@@ -564,30 +564,15 @@ export default { @@ -564,30 +564,15 @@ export default {
564 } 564 }
565 }, 565 },
566 566
567 - //导出  
568 - openDown() {  
569 - this.diaShow = true;  
570 - },  
571 - cancel() {  
572 - this.diaShow = false;  
573 - },  
574 - async exportData(arr) { 567 + async exportData() {
575 if (this.exportLoading == true) return; 568 if (this.exportLoading == true) return;
576 this.exportLoading = true; 569 this.exportLoading = true;
577 - let studentIds = arr  
578 - let query = {};  
579 - if (studentIds.length > 0) {  
580 - query.studentIds = studentIds  
581 - } else {  
582 - query.studentIds = []  
583 - }  
584 const exportExamReport = this.role == "ROLE_PERSONAL" ? 570 const exportExamReport = this.role == "ROLE_PERSONAL" ?
585 this.$request.pExportExamReport 571 this.$request.pExportExamReport
586 : this.$request.exportExamReport; 572 : this.$request.exportExamReport;
587 573
588 const data = await exportExamReport({ 574 const data = await exportExamReport({
589 examId: this.id, 575 examId: this.id,
590 - ...query  
591 }); 576 });
592 this.exportLoading = false; 577 this.exportLoading = false;
593 if (!data.status) { 578 if (!data.status) {
src/views/examinationPaper/add.vue
  1 +<!-- 组卷 -->
1 <template> 2 <template>
2 <div ref="content" class="content-box"> 3 <div ref="content" class="content-box">
3 <back-box> 4 <back-box>
@@ -384,19 +385,22 @@ @@ -384,19 +385,22 @@
384 <span class="answer-s" v-for="option in subQuestions.answerOptions.split(',')" :class="subQuestions.correctAnswer == option ? 'active' : '' 385 <span class="answer-s" v-for="option in subQuestions.answerOptions.split(',')" :class="subQuestions.correctAnswer == option ? 'active' : ''
385 " :key="option" @click="subQuestions.correctAnswer = option">{{ option }}</span> 386 " :key="option" @click="subQuestions.correctAnswer = option">{{ option }}</span>
386 </p> 387 </p>
  388 + <p v-if="subQuestions.questionType == 3 ||
  389 + subQuestions.questionType == 2
  390 + " class="answer-box answer-box2">
  391 + <el-button size="mini" type="primary" icon="el-icon-plus" circle
  392 + @click="addOptions(subQuestions)"></el-button>
  393 + <el-button size="mini" type="primary" icon="el-icon-minus" round circle
  394 + @click="removeOptions(subQuestions)"></el-button>
  395 + </p>
387 </div> 396 </div>
388 <template v-if="isUpload"> 397 <template v-if="isUpload">
389 <div class="qs-upload"> 398 <div class="qs-upload">
390 <el-popover placement="right" width="600" trigger="click"> 399 <el-popover placement="right" width="600" trigger="click">
391 <div class="screenshot-box"> 400 <div class="screenshot-box">
392 - <iframe class="screenshot"  
393 - v-if="subQuestions.screenshot && subQuestions.screenshot.includes('html')"  
394 - :src="subQuestions.screenshot"></iframe>  
395 - <img class="screenshot screenshot-img"  
396 - v-if="subQuestions.screenshot && !subQuestions.screenshot.includes('html')"  
397 - :src="subQuestions.screenshot" alt=""> 401 + <iframe class="screenshot" v-if="subQuestions.screenshot" :src="subQuestions.screenshot"></iframe>
398 <p style="textAlign:center"><el-button type="primary" round size="mini" icon="el-icon-upload" 402 <p style="textAlign:center"><el-button type="primary" round size="mini" icon="el-icon-upload"
399 - @click="openStem(subQuestions, index, indexs, 1)">{{ subQuestions.answerScreenshot ? "重新选择图片" 403 + @click="openStem(subQuestions, index, indexs, 1)">{{ subQuestions.screenshot ? "重新选择图片"
400 : "上传题干" }}</el-button> 404 : "上传题干" }}</el-button>
401 </p> 405 </p>
402 </div> 406 </div>
@@ -407,12 +411,8 @@ @@ -407,12 +411,8 @@
407 <div class="qs-upload"> 411 <div class="qs-upload">
408 <el-popover placement="right" width="600" trigger="click"> 412 <el-popover placement="right" width="600" trigger="click">
409 <div class="screenshot-box"> 413 <div class="screenshot-box">
410 - <iframe class="screenshot"  
411 - v-if="subQuestions.answerScreenshot && subQuestions.answerScreenshot.includes('html')" 414 + <iframe class="screenshot" v-if="subQuestions.answerScreenshot"
412 :src="subQuestions.answerScreenshot"></iframe> 415 :src="subQuestions.answerScreenshot"></iframe>
413 - <img class="screenshot screenshot-img"  
414 - v-if="subQuestions.answerScreenshot && !subQuestions.answerScreenshot.includes('html')"  
415 - :src="subQuestions.answerScreenshot" alt="">  
416 <p style="textAlign:center"><el-button type="primary" round size="mini" icon="el-icon-upload" 416 <p style="textAlign:center"><el-button type="primary" round size="mini" icon="el-icon-upload"
417 @click="openStem(subQuestions, index, indexs, 2)">{{ subQuestions.answerScreenshot ? "重新选择图片" 417 @click="openStem(subQuestions, index, indexs, 2)">{{ subQuestions.answerScreenshot ? "重新选择图片"
418 : "上传题目解析" }}</el-button> 418 : "上传题目解析" }}</el-button>
@@ -505,11 +505,7 @@ @@ -505,11 +505,7 @@
505 <template v-for="(question, index) in form.questionList"> 505 <template v-for="(question, index) in form.questionList">
506 <div class="screenshot-box" v-for="(subQuestions, indexs) in question.subQuestions" 506 <div class="screenshot-box" v-for="(subQuestions, indexs) in question.subQuestions"
507 :key="index + '-' + indexs"> 507 :key="index + '-' + indexs">
508 - <iframe class="screenshot" v-if="subQuestions.screenshot && subQuestions.screenshot.includes('html')"  
509 - :src="subQuestions.screenshot"></iframe>  
510 - <img class="screenshot screenshot-img"  
511 - v-if="subQuestions.screenshot && !subQuestions.screenshot.includes('html')" :src="subQuestions.screenshot"  
512 - alt=""> 508 + <iframe class="screenshot" v-if="subQuestions.screenshot" :src="subQuestions.screenshot"></iframe>
513 </div> 509 </div>
514 </template> 510 </template>
515 </div> 511 </div>
@@ -523,20 +519,14 @@ @@ -523,20 +519,14 @@
523 v-if="dialogStem" width="500"> 519 v-if="dialogStem" width="500">
524 <div class="upload-box"> 520 <div class="upload-box">
525 <template v-show="stem.type == 1"> 521 <template v-show="stem.type == 1">
526 - <img v-if="stem.screenshot && !stem.screenshot.includes('html')" :src="stem.screenshot" class="stem-pic" /> 522 + <iframe class="screenshot" v-if="stem.screenshot" :src="stem.screenshot"></iframe>
527 </template> 523 </template>
528 <template v-show="stem.type == 2"> 524 <template v-show="stem.type == 2">
529 - <img v-if="stem.answerScreenshot && !stem.answerScreenshot.includes('html')" :src="stem.answerScreenshot"  
530 - class="stem-pic" /> 525 + <iframe class="screenshot" v-if="stem.answerScreenshot" :src="stem.answerScreenshot"></iframe>
531 </template> 526 </template>
532 - <el-upload class="upload-demo" action="http://121.40.127.171/file/uploadImg" :limit="1" :on-success="upSuccess"  
533 - :on-error="upError" accept="image/*">  
534 - <el-button v-show="stem.type == 1" size="small" type="primary">{{  
535 - stem.screenshot && !stem.screenshot.includes('html') ? "重新上传" : "选择照片"  
536 - }}</el-button>  
537 - <el-button v-show="stem.type == 2" size="small" type="primary">{{  
538 - stem.answerScreenshot && !stem.answerScreenshot.includes('html') ? "重新上传" : "选择照片"  
539 - }}</el-button> 527 + <el-upload class="upload-demo" :action="uploadUrl" :limit="1" :on-success="upSuccess" :on-error="upError"
  528 + accept="image/*">
  529 + <el-button size="small" type="primary">选择照片</el-button>
540 </el-upload> 530 </el-upload>
541 </div> 531 </div>
542 <div slot="footer"> 532 <div slot="footer">
@@ -708,6 +698,7 @@ export default { @@ -708,6 +698,7 @@ export default {
708 //返回列表页参数记录 698 //返回列表页参数记录
709 listType: 1, 699 listType: 1,
710 listShare: 0, 700 listShare: 0,
  701 + uploadUrl: "/file/uploadImgToHtml"
711 }; 702 };
712 }, 703 },
713 async created() { 704 async created() {
@@ -1511,15 +1502,21 @@ export default { @@ -1511,15 +1502,21 @@ export default {
1511 } 1502 }
1512 const { data, status, info } = await fetchSubjectList({ ...query }); 1503 const { data, status, info } = await fetchSubjectList({ ...query });
1513 if (status === 0) { 1504 if (status === 0) {
  1505 + let subjectArr = []
1514 this.subjectList = 1506 this.subjectList =
1515 data.subjectNames?.map((item) => { 1507 data.subjectNames?.map((item) => {
  1508 + subjectArr.push(item.subjectName || item)
1516 return { 1509 return {
1517 value: this.role == "ROLE_PERSONAL" ? item.subjectName : item, 1510 value: this.role == "ROLE_PERSONAL" ? item.subjectName : item,
1518 label: this.role == "ROLE_PERSONAL" ? item.subjectName : item, 1511 label: this.role == "ROLE_PERSONAL" ? item.subjectName : item,
1519 }; 1512 };
1520 }) || []; 1513 }) || [];
1521 if (this.subjectList.length) { 1514 if (this.subjectList.length) {
1522 - this.form.subjectName = this.subjectList[0].value; 1515 + if (subjectArr.includes(this.$route.query.subjectName)) {
  1516 + this.form.subjectName = this.$route.query.subjectName;
  1517 + } else {
  1518 + this.form.subjectName = this.subjectList[0].value;
  1519 + }
1523 } 1520 }
1524 } else { 1521 } else {
1525 this.$message.error(info); 1522 this.$message.error(info);
@@ -1541,9 +1538,7 @@ export default { @@ -1541,9 +1538,7 @@ export default {
1541 if (this.role != "ROLE_PERSONAL") { 1538 if (this.role != "ROLE_PERSONAL") {
1542 this.form.sharingType = data.sharingType; 1539 this.form.sharingType = data.sharingType;
1543 } 1540 }
1544 - if (data.sharingType != 1) {  
1545 - this.form.tagId = data.tagId === 0 ? "" : data.tagId;  
1546 - } 1541 + this.form.tagId = "";
1547 this.formatData(data) 1542 this.formatData(data)
1548 } else { 1543 } else {
1549 this.$message.error(info); 1544 this.$message.error(info);
src/views/examinationPaper/addAsk.vue renamed to src/views/examinationPaper/addQs.vue
  1 +<!-- 备题 -->
1 <template> 2 <template>
2 <div ref="content" class="content-box"> 3 <div ref="content" class="content-box">
3 <back-box> 4 <back-box>
@@ -120,40 +121,12 @@ @@ -120,40 +121,12 @@
120 </div> 121 </div>
121 122
122 <div class="qs-upload"> 123 <div class="qs-upload">
123 - <el-popover placement="right" width="600" trigger="click">  
124 - <div class="screenshot-box">  
125 - <iframe class="screenshot"  
126 - v-if="subQuestions.screenshot && subQuestions.screenshot.includes('html')"  
127 - :src="subQuestions.screenshot"></iframe>  
128 - <img class="screenshot screenshot-img"  
129 - v-if="subQuestions.screenshot && !subQuestions.screenshot.includes('html')"  
130 - :src="subQuestions.screenshot" alt="">  
131 - <p style="textAlign:center"><el-button type="primary" round size="mini" icon="el-icon-upload"  
132 - @click="openStem(subQuestions, index, indexs, 1)">{{ subQuestions.answerScreenshot ? "重新选择图片"  
133 - : "上传题干" }}</el-button>  
134 - </p>  
135 - </div>  
136 - <el-button slot="reference" class="icon-tickets" type="primary" circle size="mini"  
137 - icon="el-icon-tickets"></el-button>  
138 - </el-popover> 124 + <el-button slot="reference" class="icon-tickets" type="primary" circle size="mini"
  125 + icon="el-icon-tickets" @click="openStem(subQuestions, index, indexs, 1)"></el-button>
139 </div> 126 </div>
140 <div class="qs-upload"> 127 <div class="qs-upload">
141 - <el-popover placement="right" width="600" trigger="click">  
142 - <div class="screenshot-box">  
143 - <iframe class="screenshot"  
144 - v-if="subQuestions.answerScreenshot && subQuestions.answerScreenshot.includes('html')"  
145 - :src="subQuestions.answerScreenshot"></iframe>  
146 - <img class="screenshot screenshot-img"  
147 - v-if="subQuestions.answerScreenshot && !subQuestions.answerScreenshot.includes('html')"  
148 - :src="subQuestions.answerScreenshot" alt="">  
149 - <p style="textAlign:center"><el-button type="primary" round size="mini" icon="el-icon-upload"  
150 - @click="openStem(subQuestions, index, indexs, 2)">{{ subQuestions.answerScreenshot ? "重新选择图片"  
151 - : "上传题目解析" }}</el-button>  
152 - </p>  
153 - </div>  
154 - <el-button slot="reference" class="icon-tickets" type="primary" circle size="mini"  
155 - icon="el-icon-tickets"></el-button>  
156 - </el-popover> 128 + <el-button slot="reference" class="icon-tickets" type="primary" circle size="mini"
  129 + icon="el-icon-tickets" @click="openStem(subQuestions, index, indexs, 2)"></el-button>
157 </div> 130 </div>
158 <div class="qs-upload" v-if="knowledgeData.length"> 131 <div class="qs-upload" v-if="knowledgeData.length">
159 <el-button type="primary" circle size="mini" icon="el-icon-price-tag" 132 <el-button type="primary" circle size="mini" icon="el-icon-price-tag"
@@ -226,24 +199,18 @@ @@ -226,24 +199,18 @@
226 v-if="dialogStem" width="500"> 199 v-if="dialogStem" width="500">
227 <div class="upload-box"> 200 <div class="upload-box">
228 <template v-show="stem.type == 1"> 201 <template v-show="stem.type == 1">
229 - <img v-if="stem.screenshot && !stem.screenshot.includes('html')" :src="stem.screenshot" class="stem-pic" /> 202 + <iframe class="screenshot" v-if="stem.screenshot" :src="stem.screenshot"></iframe>
230 </template> 203 </template>
231 <template v-show="stem.type == 2"> 204 <template v-show="stem.type == 2">
232 - <img v-if="stem.answerScreenshot && !stem.answerScreenshot.includes('html')" :src="stem.answerScreenshot"  
233 - class="stem-pic" /> 205 + <iframe class="screenshot" v-if="stem.answerScreenshot" :src="stem.answerScreenshot"></iframe>
234 </template> 206 </template>
235 - <el-upload class="upload-demo" action="http://121.40.127.171/file/uploadImg" :limit="1"  
236 - :on-success="upSuccess" :on-error="upError" accept="image/*">  
237 - <el-button v-show="stem.type == 1" size="small" type="primary">{{  
238 - stem.screenshot && !stem.screenshot.includes('html') ? "重新上传" : "选择照片"  
239 - }}</el-button>  
240 - <el-button v-show="stem.type == 2" size="small" type="primary">{{  
241 - stem.answerScreenshot && !stem.answerScreenshot.includes('html') ? "重新上传" : "选择照片"  
242 - }}</el-button> 207 + <el-upload class="upload-demo" :action="uploadUrl" :limit="1" :on-success="upSuccess" :on-error="upError"
  208 + accept="image/*">
  209 + <el-button size="small" type="primary">选择上传照片</el-button>
243 </el-upload> 210 </el-upload>
244 </div> 211 </div>
245 <div slot="footer"> 212 <div slot="footer">
246 - <el-button @click="dialogStem = false">确定</el-button> 213 + <el-button @click="dialogStem = false">保存</el-button>
247 </div> 214 </div>
248 </el-dialog> 215 </el-dialog>
249 <el-dialog :close-on-click-modal="false" title="知识点" :visible.sync="dialogKnowledge" width="500"> 216 <el-dialog :close-on-click-modal="false" title="知识点" :visible.sync="dialogKnowledge" width="500">
@@ -268,11 +235,7 @@ @@ -268,11 +235,7 @@
268 <div class="question-box"> 235 <div class="question-box">
269 <template v-for="question in form.questionList"> 236 <template v-for="question in form.questionList">
270 <div class="screenshot-box" v-for="subQuestions in question.subQuestions"> 237 <div class="screenshot-box" v-for="subQuestions in question.subQuestions">
271 - <iframe class="screenshot" v-if="subQuestions.screenshot && subQuestions.screenshot.includes('html')"  
272 - :src="subQuestions.screenshot"></iframe>  
273 - <img class="screenshot screenshot-img"  
274 - v-if="subQuestions.screenshot && !subQuestions.screenshot.includes('html')" :src="subQuestions.screenshot"  
275 - alt=""> 238 + <iframe class="screenshot" v-if="subQuestions.screenshot" :src="subQuestions.screenshot"></iframe>
276 </div> 239 </div>
277 </template> 240 </template>
278 </div> 241 </div>
@@ -355,6 +318,7 @@ export default { @@ -355,6 +318,7 @@ export default {
355 //返回列表页参数记录 318 //返回列表页参数记录
356 listType: 1, 319 listType: 1,
357 listShare: 0, 320 listShare: 0,
  321 + uploadUrl: "/file/uploadImgToHtml"
358 }; 322 };
359 }, 323 },
360 computed: { 324 computed: {
@@ -391,11 +355,13 @@ export default { @@ -391,11 +355,13 @@ export default {
391 this.role = 355 this.role =
392 this.$store.getters.info.showRole || 356 this.$store.getters.info.showRole ||
393 this.$store.getters.info.permissions[0].role; 357 this.$store.getters.info.permissions[0].role;
394 - let params = this.$route.query.params && JSON.parse(this.$route.query.params) || null  
395 - this.form.title = params?.name  
396 - this.form.id = params?.id  
397 - this.form.sharingType = params?.sharingType || 0  
398 - this.formatData(params) 358 + if (this.type != 2) {
  359 + let params = this.$route.query.params && JSON.parse(this.$route.query.params) || null
  360 + this.form.title = params?.name
  361 + this.form.id = params?.id
  362 + this.form.sharingType = params?.sharingType || 0
  363 + this.formatData(params)
  364 + }
399 console.log(this.form) 365 console.log(this.form)
400 if (this.role != "ROLE_PERSONAL") { 366 if (this.role != "ROLE_PERSONAL") {
401 this.formRules.gradeName = [ 367 this.formRules.gradeName = [
@@ -934,9 +900,12 @@ export default { @@ -934,9 +900,12 @@ export default {
934 }); 900 });
935 if (status == 0) { 901 if (status == 0) {
936 this.form.title = data.title + "_副本"; 902 this.form.title = data.title + "_副本";
  903 +
  904 + this.form.examsDuration = data.examsDuration;
937 if (this.role != "ROLE_PERSONAL") { 905 if (this.role != "ROLE_PERSONAL") {
938 this.form.sharingType = data.sharingType; 906 this.form.sharingType = data.sharingType;
939 } 907 }
  908 + this.form.tagId = "";
940 this.formatData(data) 909 this.formatData(data)
941 } else { 910 } else {
942 this.$message.error(info); 911 this.$message.error(info);
src/views/examinationPaper/edit.vue
@@ -80,11 +80,7 @@ @@ -80,11 +80,7 @@
80 <div class="qs-set"> 80 <div class="qs-set">
81 <el-popover placement="right" width="600" trigger="click"> 81 <el-popover placement="right" width="600" trigger="click">
82 <div class="screenshot-box"> 82 <div class="screenshot-box">
83 - <iframe class="screenshot" v-if="subQuestions.screenshot && subQuestions.screenshot.includes('html')"  
84 - :src="subQuestions.screenshot"></iframe>  
85 - <img class="screenshot screenshot-img"  
86 - v-if="subQuestions.screenshot && !subQuestions.screenshot.includes('html')"  
87 - :src="subQuestions.screenshot" alt=""> 83 + <iframe class="screenshot" v-if="subQuestions.screenshot" :src="subQuestions.screenshot"></iframe>
88 <p style="textAlign:center"><el-button type="primary" round size="mini" icon="el-icon-upload" 84 <p style="textAlign:center"><el-button type="primary" round size="mini" icon="el-icon-upload"
89 @click="openStem(subQuestions, 1, indexs)">重新选择图片</el-button></p> 85 @click="openStem(subQuestions, 1, indexs)">重新选择图片</el-button></p>
90 </div> 86 </div>
@@ -95,12 +91,8 @@ @@ -95,12 +91,8 @@
95 <div class="qs-set"> 91 <div class="qs-set">
96 <el-popover placement="right" width="600" trigger="click"> 92 <el-popover placement="right" width="600" trigger="click">
97 <div class="screenshot-box"> 93 <div class="screenshot-box">
98 - <iframe class="screenshot"  
99 - v-if="subQuestions.answerScreenshot && subQuestions.answerScreenshot.includes('html')" 94 + <iframe class="screenshot" v-if="subQuestions.answerScreenshot"
100 :src="subQuestions.answerScreenshot"></iframe> 95 :src="subQuestions.answerScreenshot"></iframe>
101 - <img class="screenshot screenshot-img"  
102 - v-if="subQuestions.answerScreenshot && !subQuestions.answerScreenshot.includes('html')"  
103 - :src="subQuestions.answerScreenshot" alt="">  
104 <p style="textAlign:center"><el-button type="primary" round size="mini" icon="el-icon-upload" 96 <p style="textAlign:center"><el-button type="primary" round size="mini" icon="el-icon-upload"
105 @click="openStem(subQuestions, 2, indexs)">重新选择图片</el-button></p> 97 @click="openStem(subQuestions, 2, indexs)">重新选择图片</el-button></p>
106 </div> 98 </div>
@@ -281,14 +273,9 @@ @@ -281,14 +273,9 @@
281 <img v-if="stem.answerScreenshot && !stem.answerScreenshot.includes('html')" :src="stem.answerScreenshot" 273 <img v-if="stem.answerScreenshot && !stem.answerScreenshot.includes('html')" :src="stem.answerScreenshot"
282 class="stem-pic" /> 274 class="stem-pic" />
283 </template> 275 </template>
284 - <el-upload class="upload-demo" action="http://121.40.127.171/file/uploadImg" :limit="1" :on-success="upSuccess"  
285 - :on-error="upError" accept="image/*">  
286 - <el-button v-show="stem.type == 1" size="small" type="primary">{{  
287 - stem.screenshot && !stem.screenshot.includes('html') ? "重新上传" : "选择照片"  
288 - }}</el-button>  
289 - <el-button v-show="stem.type == 2" size="small" type="primary">{{  
290 - stem.answerScreenshot && !stem.answerScreenshot.includes('html') ? "重新上传" : "选择照片"  
291 - }}</el-button> 276 + <el-upload class="upload-demo" :action="uploadUrl" :limit="1" :on-success="upSuccess" :on-error="upError"
  277 + accept="image/*">
  278 + <el-button size="small" type="primary">选择照片</el-button>
292 </el-upload> 279 </el-upload>
293 </div> 280 </div>
294 <div slot="footer"> 281 <div slot="footer">
@@ -364,7 +351,8 @@ export default { @@ -364,7 +351,8 @@ export default {
364 answerScreenshot: "", //题目解析图片地址 351 answerScreenshot: "", //题目解析图片地址
365 knowledge: [], //知识点 352 knowledge: [], //知识点
366 }, 353 },
367 - gradeClassList: [] //学段列表 354 + gradeClassList: [], //学段列表
  355 + uploadUrl: "/file/uploadImgToHtml"
368 }; 356 };
369 }, 357 },
370 computed: { 358 computed: {
src/views/examinationPaper/index.vue
@@ -39,7 +39,10 @@ @@ -39,7 +39,10 @@
39 <el-option v-for="item in subjectList" :key="item.value" :label="item.label" :value="item.value"> 39 <el-option v-for="item in subjectList" :key="item.value" :label="item.label" :value="item.value">
40 </el-option> 40 </el-option>
41 </el-select> 41 </el-select>
42 - 42 + <el-select v-if="query.type == 2" class="sel" v-model="query.tagId" placeholder="选择类型" @change="getData(false)">
  43 + <el-option v-for="item in typeList" :key="item.label" :label="item.label" :value="item.value">{{ item.label }}
  44 + </el-option>
  45 + </el-select>
43 <el-input placeholder="试卷名称" v-model="query.title" class="input-with-select" @keyup.enter.native="getData(true)"> 46 <el-input placeholder="试卷名称" v-model="query.title" class="input-with-select" @keyup.enter.native="getData(true)">
44 <el-button slot="append" icon="el-icon-search" @click="getData(true)"></el-button> 47 <el-button slot="append" icon="el-icon-search" @click="getData(true)"></el-button>
45 </el-input> 48 </el-input>
@@ -101,7 +104,7 @@ @@ -101,7 +104,7 @@
101 <el-dropdown-menu slot="dropdown"> 104 <el-dropdown-menu slot="dropdown">
102 <el-dropdown-item :command="1" 105 <el-dropdown-item :command="1"
103 v-if="userName == item.realName && role != 'ROLE_PERSONAL'">修改分享范围</el-dropdown-item> 106 v-if="userName == item.realName && role != 'ROLE_PERSONAL'">修改分享范围</el-dropdown-item>
104 - <el-dropdown-item v-show="query.type == 2" :command="2">复制</el-dropdown-item> 107 + <el-dropdown-item :command="2">复制</el-dropdown-item>
105 <el-dropdown-item v-show="query.share == 0" :command="3">放入回收站</el-dropdown-item> 108 <el-dropdown-item v-show="query.share == 0" :command="3">放入回收站</el-dropdown-item>
106 </el-dropdown-menu> 109 </el-dropdown-menu>
107 </el-dropdown> 110 </el-dropdown>
@@ -168,12 +171,14 @@ export default { @@ -168,12 +171,14 @@ export default {
168 query: { 171 query: {
169 classId: "", 172 classId: "",
170 subjectName: "", 173 subjectName: "",
  174 + tagId: "",
171 title: "", 175 title: "",
172 type: 1, //试卷类型 176 type: 1, //试卷类型
173 share: 0, //分享类型 177 share: 0, //分享类型
174 }, 178 },
175 classList: [], 179 classList: [],
176 subjectList: [], 180 subjectList: [],
  181 + typeList: [],
177 archivedTotal: 0, //已归档答题卡数量 182 archivedTotal: 0, //已归档答题卡数量
178 tableData: [], 183 tableData: [],
179 shareForm: { 184 shareForm: {
@@ -213,6 +218,7 @@ export default { @@ -213,6 +218,7 @@ export default {
213 if (!this.query.classId) { 218 if (!this.query.classId) {
214 return; 219 return;
215 } 220 }
  221 + this._QueryTypeList()
216 await this._QuerySubjectList(); 222 await this._QuerySubjectList();
217 this._QueryData(); 223 this._QueryData();
218 }, 224 },
@@ -228,7 +234,7 @@ export default { @@ -228,7 +234,7 @@ export default {
228 path: "/examinationPaperArchiving", 234 path: "/examinationPaperArchiving",
229 }); 235 });
230 }, 236 },
231 - //去备题 237 + //去组卷
232 toAdd(query) { 238 toAdd(query) {
233 if (!this.query.classId) { 239 if (!this.query.classId) {
234 this.$message.warning("没有任课班级,请先设置。"); 240 this.$message.warning("没有任课班级,请先设置。");
@@ -240,18 +246,19 @@ export default { @@ -240,18 +246,19 @@ export default {
240 ...query, 246 ...query,
241 listType: this.query.type, 247 listType: this.query.type,
242 listShare: this.query.share, 248 listShare: this.query.share,
  249 + subjectName: this.query.subjectName
243 } 250 }
244 }; 251 };
245 this.$router.push(routerItem); 252 this.$router.push(routerItem);
246 }, 253 },
247 - //去组卷  
248 - toAddAsk(query) { 254 + //去备题
  255 + toAddQs(query) {
249 if (!this.query.classId) { 256 if (!this.query.classId) {
250 this.$message.warning("没有任课班级,请先设置。"); 257 this.$message.warning("没有任课班级,请先设置。");
251 return; 258 return;
252 } 259 }
253 let routerItem = { 260 let routerItem = {
254 - path: "/examinationPaperAddAsk", 261 + path: "/examinationPaperAddQs",
255 query: { 262 query: {
256 ...query, 263 ...query,
257 listType: this.query.type, 264 listType: this.query.type,
@@ -280,7 +287,11 @@ export default { @@ -280,7 +287,11 @@ export default {
280 break; 287 break;
281 case 2: 288 case 2:
282 //复制 289 //复制
283 - that.toAdd({ type: 2, paperId: item.id }); 290 + if (that.type == 2) {
  291 + that.toAdd({ type: 2, paperId: item.id });
  292 + } else {
  293 + that.toAddQs({ type: 2, paperId: item.id });
  294 + }
284 break; 295 break;
285 case 3: 296 case 3:
286 //归档 297 //归档
@@ -290,8 +301,8 @@ export default { @@ -290,8 +301,8 @@ export default {
290 }, 301 },
291 changPaperType(type) { 302 changPaperType(type) {
292 this.query.type = type 303 this.query.type = type
  304 + this.query.tagId = ""
293 this.changShare(0) 305 this.changShare(0)
294 -  
295 }, 306 },
296 changePage(page) { 307 changePage(page) {
297 this.page = page; 308 this.page = page;
@@ -339,6 +350,9 @@ export default { @@ -339,6 +350,9 @@ export default {
339 //切换班级 350 //切换班级
340 async changClazz() { 351 async changClazz() {
341 this.page = 1; 352 this.page = 1;
  353 + if (this.query.type == 2) {
  354 + await this._QueryTypeList()
  355 + }
342 await this._QuerySubjectList(); 356 await this._QuerySubjectList();
343 this._QueryData(false); 357 this._QueryData(false);
344 }, 358 },
@@ -418,6 +432,35 @@ export default { @@ -418,6 +432,35 @@ export default {
418 this.$message.error(info); 432 this.$message.error(info);
419 } 433 }
420 }, 434 },
  435 + // 查找答题卡类型
  436 + async _QueryTypeList() {
  437 + if (!this.query.classId) return;
  438 + let fetchTypeNames =
  439 + this.role == "ROLE_PERSONAL"
  440 + ? this.$request.pPaperTagList
  441 + : this.$request.fetchTypeNames;
  442 +
  443 + const { data, status, info } = await fetchTypeNames({
  444 + classId: this.query.classId,
  445 + type: 0,
  446 + });
  447 + if (status === 0) {
  448 + this.typeList =
  449 + data.list.map((item) => {
  450 + return {
  451 + value: item.tagId,
  452 + label: item.tag,
  453 + };
  454 + }) || [];
  455 + this.typeList.unshift({
  456 + value: "",
  457 + label: "请选择标签",
  458 + });
  459 + this.query.tagId = ""
  460 + } else {
  461 + this.$message.error(info);
  462 + }
  463 + },
421 async _QueryData(type) { 464 async _QueryData(type) {
422 if (!this.query.classId) return; 465 if (!this.query.classId) return;
423 this.loading = true; 466 this.loading = true;
@@ -479,7 +522,7 @@ export default { @@ -479,7 +522,7 @@ export default {
479 if (this.query.type == 2) { 522 if (this.query.type == 2) {
480 this.toAdd({ params, isUpload: 1 }) 523 this.toAdd({ params, isUpload: 1 })
481 } else { 524 } else {
482 - this.toAddAsk({ params }) 525 + this.toAddQs({ params })
483 } 526 }
484 } 527 }
485 }, 528 },