Commit ef16e57e44cc35452a97631094f164e361015342

Authored by LH_PC
1 parent 6bca489d

fix:前端版本迭代

Showing 46 changed files with 2297 additions and 1781 deletions
public/static/课件模板.docx
No preview for this file type
src/App.vue
@@ -13,88 +13,84 @@ export default { @@ -13,88 +13,84 @@ export default {
13 mounted() { 13 mounted() {
14 14
15 }, 15 },
16 - created() {  
17 - this.$nextTick(() => { 16 + methods: {
  17 + _reSize() {
  18 +
18 const $app = this.$refs.app; 19 const $app = this.$refs.app;
19 - // 设置 屏幕 百分比 尺寸 适配  
20 - const standardScale = "100%" / "100%";  
21 - window.addEventListener(  
22 - "resize",  
23 - _.debounce(function () {  
24 20
25 - const docHeight = document.body.clientHeight; 21 + const standardScale = "100%" / "100%";
26 22
27 - const docWidth = document.body.clientWidth; 23 + const docHeight = document.body.clientHeight;
28 24
29 - if (docWidth < 1700) { 25 + const docWidth = document.body.clientWidth;
  26 +
  27 + if (docWidth < 1700) {
  28 + const currentScale = docHeight / docWidth;
30 29
31 - const currentScale = docHeight / docWidth; 30 + let [scale, translate] = [0, 0];
  31 + if (currentScale < standardScale) {
  32 + // 以高度计算
  33 + scale = docHeight / 1080;
32 34
33 - let [scale, translate] = [0, 0]; 35 + const shouleWidth = 1920 * scale;
34 36
35 - if (currentScale < standardScale) {  
36 - // 以高度计算  
37 - scale = docHeight / 1080; 37 + const offsetWidth = docWidth - shouleWidth;
38 38
39 - const shouleWidth = 1920 * scale; 39 + translate =
  40 + offsetWidth > 0 ? `translate(${offsetWidth / 2}px, 0)` : "";
40 41
41 - const offsetWidth = docWidth - shouleWidth; 42 + } else {
  43 + // 以宽度计算
  44 + scale = docWidth / 1920;
42 45
43 - translate =  
44 - offsetWidth > 0 ? `translate(${offsetWidth / 2}px, 0)` : "";  
45 -  
46 - } else {  
47 - // 以宽度计算  
48 - scale = docWidth / 1920; 46 + const shouleHeight = 1080 * scale;
49 47
50 - const shouleHeight = 1080 * scale; 48 + const offsetHeight = docHeight - shouleHeight;
51 49
52 - const offsetHeight = docHeight - shouleHeight; 50 + translate =
  51 + offsetHeight > 0 ? `translate(0, ${offsetHeight / 2}px)` : "";
  52 + }
53 53
54 - translate =  
55 - offsetHeight > 0 ? `translate(0, ${offsetHeight / 2}px)` : "";  
56 - }  
57 -  
58 - if (docHeight <= 700) { 54 + if (docHeight <= 700) {
59 55
60 - $app.style.cssText = ` 56 + $app.style.cssText = `
61 transform: scale(${scale}) ${translate}; 57 transform: scale(${scale}) ${translate};
62 transform-origin: top left; 58 transform-origin: top left;
63 min-width: 1920px; 59 min-width: 1920px;
64 - min-height: 850px;  
65 - `;  
66 - }  
67 - else if (docHeight <= 750) {  
68 -  
69 - $app.style.cssText = ` 60 + min-height: 885px;
  61 + `;
  62 + }
  63 + else if (docHeight <= 780) {
  64 +
  65 + $app.style.cssText = `
70 transform: scale(${scale}) ${translate}; 66 transform: scale(${scale}) ${translate};
71 transform-origin: top left; 67 transform-origin: top left;
72 min-width: 1920px; 68 min-width: 1920px;
73 - min-height:920px;  
74 - `;  
75 - }  
76 - else {  
77 - $app.style.cssText = ` 69 + min-height:910px;
  70 + `;
  71 + }
  72 + else {
  73 + $app.style.cssText = `
78 transform: scale(${scale}) ${translate}; 74 transform: scale(${scale}) ${translate};
79 transform-origin: top left; 75 transform-origin: top left;
80 min-width: 1920px; 76 min-width: 1920px;
81 - min-height:1080px;  
82 - `;  
83 - } 77 + min-height:1045px;
  78 + `;
  79 + }
84 80
85 - } else {  
86 - $app.style.cssText = '';  
87 - }  
88 - }),  
89 - 300  
90 - ); 81 + } else {
  82 + $app.style.cssText = '';
  83 + }
  84 + },
  85 + },
  86 + created() {
  87 + let that = this;
91 88
  89 + this.$nextTick(() => {
92 if (document.createEvent) { 90 if (document.createEvent) {
93 - var event = document.createEvent("HTMLEvents");  
94 - event.initEvent("resize", true, true);  
95 - window.dispatchEvent(event); 91 + that._reSize();
96 } else if (document.createEventObject) { 92 } else if (document.createEventObject) {
97 - window.fireEvent("onresize"); 93 + that._reSize();
98 } 94 }
99 }); 95 });
100 } 96 }
@@ -106,7 +102,7 @@ export default { @@ -106,7 +102,7 @@ export default {
106 body { 102 body {
107 margin: 0px; 103 margin: 0px;
108 padding: 0px; 104 padding: 0px;
109 - font-family: Microsoft YaHei, Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, SimSun, sans-serif; 105 + font-family: Microsoft YaHei, Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, SimSun, sans-serif;
110 -webkit-font-smoothing: antialiased; 106 -webkit-font-smoothing: antialiased;
111 } 107 }
112 108
src/api/apis/apis.js
@@ -23,12 +23,22 @@ const downService = (url, data) =&gt; { @@ -23,12 +23,22 @@ const downService = (url, data) =&gt; {
23 responseType: 'arraybuffer', 23 responseType: 'arraybuffer',
24 }); 24 });
25 } 25 }
26 -export default { 26 +export default {
27 // 知识点 27 // 知识点
28 gKnowledge(section, subject) { 28 gKnowledge(section, subject) {
29 - return defaltService(setUpUrls.gtestExamReport, {  
30 - ...subject, ...section  
31 - }) 29 + var requestParams = [];
  30 + if (section) {
  31 + requestParams.push("section=" + section);
  32 + }
  33 + if (subject) {
  34 + requestParams.push("subject=" + subject);
  35 + }
  36 + var requestUrl = setUpUrls.gKnowledge + (requestParams.length >= 1 ? "?" + requestParams.join("&") : "");
  37 + return defaltGetService(requestUrl)
  38 + },
  39 + // 年级组长-成绩概要
  40 + gclassdiffReport(data) {
  41 + return defaltService(setUpUrls.gclassdiffReport, data)
32 }, 42 },
33 // 年级组长-成绩测验单 43 // 年级组长-成绩测验单
34 gTestExamReport(data) { 44 gTestExamReport(data) {
@@ -213,6 +223,9 @@ export default { @@ -213,6 +223,9 @@ export default {
213 periodReportList(data) { 223 periodReportList(data) {
214 return defaltService(setUpUrls.periodReportList, data) 224 return defaltService(setUpUrls.periodReportList, data)
215 }, 225 },
  226 + classdiffreport(data) {
  227 + return defaltService(setUpUrls.classdiffreport, data)
  228 + },
216 //任课老师-查询阶段问答报表 229 //任课老师-查询阶段问答报表
217 phaseAnswerReport(data) { 230 phaseAnswerReport(data) {
218 return defaltService(setUpUrls.phaseAnswerReport, data) 231 return defaltService(setUpUrls.phaseAnswerReport, data)
@@ -680,6 +693,9 @@ export default { @@ -680,6 +693,9 @@ export default {
680 pModifyPaper(data) { 693 pModifyPaper(data) {
681 return defaltService(setUpUrls.pModifyPaper, data) 694 return defaltService(setUpUrls.pModifyPaper, data)
682 }, 695 },
  696 + pModifyPaperNew(data) {
  697 + return defaltService(setUpUrls.pModifyPaperNew, data)
  698 + },
683 // 删除答题卡 699 // 删除答题卡
684 pDelPaper(data) { 700 pDelPaper(data) {
685 return defaltService(setUpUrls.pDelPaper, data) 701 return defaltService(setUpUrls.pDelPaper, data)
src/api/axios.js
@@ -3,7 +3,7 @@ import NProgress from &quot;nprogress&quot;; @@ -3,7 +3,7 @@ import NProgress from &quot;nprogress&quot;;
3 import { Message } from "element-ui"; 3 import { Message } from "element-ui";
4 import router from "@/router/index"; 4 import router from "@/router/index";
5 import store from "@/store"; 5 import store from "@/store";
6 -import conf from "../config/index"; // 路径配置 6 +import conf from "@/config/index"; // 路径配置
7 import { getURLParams } from "@/utils"; 7 import { getURLParams } from "@/utils";
8 8
9 let code = getURLParams("code") || getURLParams("dockkey") || localStorage.getItem("csCode") || ""; 9 let code = getURLParams("code") || getURLParams("dockkey") || localStorage.getItem("csCode") || "";
src/api/urls/apis.js
1 1
2 export default { 2 export default {
3 - // 年级组长-查询报表列表  
4 - gKnowledge: "/api_html/knowledge/list", 3 + // 年级组长-查询报表列表
  4 + gKnowledge: "/knowledge/list",
5 // 年级组长-查询报表列表 5 // 年级组长-查询报表列表
6 gListExamReport: "/api_html/grade/manager/listExamReport", 6 gListExamReport: "/api_html/grade/manager/listExamReport",
7 // 年级组长-查询管理的班级 7 // 年级组长-查询管理的班级
@@ -17,6 +17,8 @@ export default { @@ -17,6 +17,8 @@ export default {
17 gExportPhaseInteractiveReport: "/api_html/grade/manager/exportPhaseInteractiveReport", 17 gExportPhaseInteractiveReport: "/api_html/grade/manager/exportPhaseInteractiveReport",
18 // 年级组长-成绩测验单 18 // 年级组长-成绩测验单
19 gtestExamReport: "/api_html/grade/manager/testExamReport", 19 gtestExamReport: "/api_html/grade/manager/testExamReport",
  20 + // 年级组长-考试概要
  21 + gclassdiffReport: "/api_html/grade/manager/classdiffreport",
20 // 年级组长-试题分析 22 // 年级组长-试题分析
21 gpaperExamReport: "/api_html/grade/manager/paperExamReport", 23 gpaperExamReport: "/api_html/grade/manager/paperExamReport",
22 // 年级组长-学生成绩排行 24 // 年级组长-学生成绩排行
@@ -62,13 +64,15 @@ export default { @@ -62,13 +64,15 @@ export default {
62 64
63 //任课老师-查询管理班级 65 //任课老师-查询管理班级
64 tClassList: "/api_html/teaching/classList", 66 tClassList: "/api_html/teaching/classList",
  67 + //任老师-报表详情
  68 + classdiffreport: "/api_html/teaching/classdiffreport",
65 tpaperExamReport: "/api_html/teaching/paperExamReport", 69 tpaperExamReport: "/api_html/teaching/paperExamReport",
66 // 任课老师-学生成绩排行 70 // 任课老师-学生成绩排行
67 tstudentExamReport2: "/api_html/teaching/studentExamReport2", 71 tstudentExamReport2: "/api_html/teaching/studentExamReport2",
68 // 任课老师-班级情况对比 72 // 任课老师-班级情况对比
69 tclassdiffExamReport: "/api_html/teaching/classdiffExamReport", 73 tclassdiffExamReport: "/api_html/teaching/classdiffExamReport",
70 tClassFromGrade: "/api_html/teaching/grade/classList", 74 tClassFromGrade: "/api_html/teaching/grade/classList",
71 - tClassGrade:'/api_html/teaching/grade', 75 + tClassGrade: '/api_html/teaching/grade',
72 //任课老师-测验成绩单 76 //任课老师-测验成绩单
73 tTestExamReport: "/api_html/teaching/testExamReport", 77 tTestExamReport: "/api_html/teaching/testExamReport",
74 //任课老师-查询答题卡详情 78 //任课老师-查询答题卡详情
@@ -82,7 +86,7 @@ export default { @@ -82,7 +86,7 @@ export default {
82 phaseAnswerReport: "/api_html/teaching/phaseAnswerReport", 86 phaseAnswerReport: "/api_html/teaching/phaseAnswerReport",
83 //任课老师-查询阶段互动报表 87 //任课老师-查询阶段互动报表
84 phaseInteractiveReport: "/api_html/teaching/phaseInteractiveReport", 88 phaseInteractiveReport: "/api_html/teaching/phaseInteractiveReport",
85 - exportPhaseExamReport: "/api_html/teaching/exportPhaseExamReport", 89 + exportPhaseExamReport: "/api_html/teaching/exportPhaseExamReport",
86 //任课老师-查询课时题目列表 90 //任课老师-查询课时题目列表
87 periodQuestionList: "/api_html/teaching/periodQuestionList", 91 periodQuestionList: "/api_html/teaching/periodQuestionList",
88 //任课老师-设置课时报表答案 92 //任课老师-设置课时报表答案
@@ -93,6 +97,8 @@ export default { @@ -93,6 +97,8 @@ export default {
93 periodQuestionReport: "/api_html/teaching/periodQuestionReport", 97 periodQuestionReport: "/api_html/teaching/periodQuestionReport",
94 //任课老师-查询课时学生答题明细 98 //任课老师-查询课时学生答题明细
95 periodStudentReport: "/api_html/teaching/periodStudentReport", 99 periodStudentReport: "/api_html/teaching/periodStudentReport",
  100 + // 修改答题卡
  101 + pModifyPaperNew: "/api_html/teaching/modifyPaperNew",
96 //任课老师-分页查询即时测报表 102 //任课老师-分页查询即时测报表
97 examReportList: "/api_html/teaching/examReportList", 103 examReportList: "/api_html/teaching/examReportList",
98 //任课老师-查询阶段测练报表 104 //任课老师-查询阶段测练报表
src/assets/css/index.scss
@@ -347,6 +347,26 @@ ul { @@ -347,6 +347,26 @@ ul {
347 347
348 // 默认实体 348 // 默认实体
349 .default-body { 349 .default-body {
  350 +
  351 + .anwser-column {
  352 + border: 1px solid #ebeef5;
  353 +
  354 + padding: 0px !important;
  355 +
  356 + .cell {
  357 + height: 100%;
  358 + width: calc(100% - 2px);
  359 + }
  360 +
  361 + .red {
  362 + height: 100%;
  363 + width: 100%;
  364 + background: #FBEEDC;
  365 + color: red;
  366 + display: block;
  367 + }
  368 + }
  369 +
350 font-size: 14px; 370 font-size: 14px;
351 font-weight: 400; 371 font-weight: 400;
352 color: #303133; 372 color: #303133;
@@ -386,7 +406,7 @@ ul { @@ -386,7 +406,7 @@ ul {
386 } 406 }
387 407
388 tr, 408 tr,
389 - td { 409 + td:not(.anwser-column) {
390 height: 40px; 410 height: 40px;
391 padding: 5px 0px !important; 411 padding: 5px 0px !important;
392 border: 1px solid #ebeef5; 412 border: 1px solid #ebeef5;
@@ -432,6 +452,12 @@ ul { @@ -432,6 +452,12 @@ ul {
432 line-height: 40px; 452 line-height: 40px;
433 } 453 }
434 454
  455 + .el-tag__close {
  456 + height: 100% !important;
  457 + line-height: 1.2;
  458 + min-width: 20px;
  459 + }
  460 +
435 .filter-input, 461 .filter-input,
436 .filter-select { 462 .filter-select {
437 width: 13%; 463 width: 13%;
@@ -464,39 +490,108 @@ ul { @@ -464,39 +490,108 @@ ul {
464 } 490 }
465 } 491 }
466 492
467 -@media screen and (max-width: 1921px) and (max-height: 1081px) {  
468 - * :not(.p1, .fa, .el-button, .el-icon-upload, h1, h2, h3, h4, h5, h6) { 493 +@media screen and (max-width: 1200px) {
  494 + .flex-content {
  495 + padding: 55px !important;
  496 + }
  497 +
  498 + .flex-btn {
  499 + position: fixed !important;
  500 + z-index: 999 !important;
  501 + bottom: 30px !important;
  502 + padding: 10px 10px !important;
  503 + right: 0px !important;
  504 + background-color: white !important;
  505 + width: calc(100% - 280px) !important;
  506 + }
  507 +}
  508 +
  509 +@media screen and (max-width: 1500px) and (min-width: 1201px) {
  510 + .flex-content {
  511 + padding: 55px !important;
  512 + }
  513 +
  514 + .flex-btn {
  515 + position: fixed !important;
  516 + z-index: 999 !important;
  517 + bottom: 30px !important;
  518 + padding: 10px 10px !important;
  519 + right: 0px !important;
  520 + background-color: white !important;
  521 + width: calc(100% - 280px) !important;
  522 + }
  523 +}
  524 +
  525 +@media screen and (min-width: 1501px) {
  526 + .flex-content {
  527 + padding: 25px !important;
  528 + }
  529 +
  530 + .flex-btn {
  531 + position: fixed !important;
  532 + z-index: 999 !important;
  533 + bottom: -10px !important;
  534 + padding: 10px 0px !important;
  535 + right: 30px !important;
  536 + background-color: white !important;
  537 + width: calc(100% - 280px) !important;
  538 + }
  539 +
  540 +}
  541 +
  542 +
  543 +@media screen and (max-width: 1920px) {
  544 + * :not(.p1, .fa, .el-button, .el-icon-upload, h1, h2, h3, h4, h5, h6, .el-progress__text) {
  545 +
469 font-size: 18px !important; 546 font-size: 18px !important;
470 547
471 - .default-title {  
472 - font-size: 24px !important; 548 +
  549 +
  550 + .default-body-detail * {
  551 + font-size: 15px !important;
  552 +
  553 + .cell {
  554 + padding-left: 2px !important;
  555 + padding-right: 2px !important;
  556 + }
473 } 557 }
474 558
475 - .el-button * {  
476 - font-size: 16px !important; 559 + .default-title {
  560 + font-size: 24px !important;
477 } 561 }
478 562
479 - .el-select-dropdown__item * { 563 + .el-select-dropdown__item *,
  564 + .small-button * {
480 font-size: 16px !important; 565 font-size: 16px !important;
481 } 566 }
482 567
483 .el-form :not(h1, h2, h3, h4, h5, h6), 568 .el-form :not(h1, h2, h3, h4, h5, h6),
484 .el-dropdown-menu__item, 569 .el-dropdown-menu__item,
485 - .el-cascader-node__label { 570 + .el-form-item__error,
  571 + .el-dialog__body .el-checkbox *,
  572 + .el-checkbox__label {
486 font-size: 16px !important; 573 font-size: 16px !important;
487 } 574 }
488 -  
489 } 575 }
490 } 576 }
491 577
492 -@media screen and (min-width: 1921px) and (min-height: 1081px) {  
493 - * :not(.p1, .fa, .el-button, .el-icon-upload, h1, h2, h3, h4, h5, h6) { 578 +@media screen and (min-width: 1921px) {
  579 + * :not(.p1, .fa, .el-button, .el-icon-upload, h1, h2, h3, h4, h5, h6, .el-progress__text) {
494 580
495 font-size: 14px !important; 581 font-size: 14px !important;
496 582
  583 + .default-body-detail * {
  584 + font-size: 13px !important;
  585 +
  586 + .cell {
  587 + padding-left: 4px !important;
  588 + padding-right: 4px !important;
  589 + }
  590 + }
  591 +
497 .default-body .default-filter * { 592 .default-body .default-filter * {
498 line-height: 38px !important; 593 line-height: 38px !important;
499 - } 594 + }
500 595
501 .card-content { 596 .card-content {
502 width: 48% !important; 597 width: 48% !important;
@@ -506,13 +601,16 @@ ul { @@ -506,13 +601,16 @@ ul {
506 font-size: 24px !important; 601 font-size: 24px !important;
507 } 602 }
508 603
509 - .el-select-dropdown__item * { 604 + .el-select-dropdown__item *,
  605 + .small-button * {
510 font-size: 12px !important; 606 font-size: 12px !important;
511 } 607 }
512 608
513 .el-form :not(h1, h2, h3, h4, h5, h6), 609 .el-form :not(h1, h2, h3, h4, h5, h6),
514 .el-dropdown-menu__item, 610 .el-dropdown-menu__item,
515 - .el-cascader-node__label { 611 + .el-form-item__error,
  612 + .el-dialog__body .el-checkbox *,
  613 + .el-checkbox__label {
516 font-size: 12px !important; 614 font-size: 12px !important;
517 } 615 }
518 616
src/components/upload.vue
@@ -2,8 +2,9 @@ @@ -2,8 +2,9 @@
2 <div> 2 <div>
3 <slot name="down"></slot> 3 <slot name="down"></slot>
4 <div class="d1"> 4 <div class="d1">
5 - <el-upload class="upload-demo" ref="upload" :action="url" :multiple="false" :data="{ ...query }"  
6 - :with-credentials="true" :limit="1" :on-change="change" :on-success="upSuccess" :on-error="upError"> 5 + <el-upload class="upload-demo" ref="upload" :action="uploadUrl" :multiple="false" :data="{ ...query }"
  6 + :with-credentials="true" :limit="1" :on-remove="removec" :on-change="change" :on-success="upSuccess"
  7 + :on-error="upError">
7 <!-- accept="application/vnd.ms-excel" --> 8 <!-- accept="application/vnd.ms-excel" -->
8 <div class="upload-btn"> 9 <div class="upload-btn">
9 <i class="el-icon-upload"></i> 10 <i class="el-icon-upload"></i>
@@ -11,10 +12,15 @@ @@ -11,10 +12,15 @@
11 </div> 12 </div>
12 </el-upload> 13 </el-upload>
13 </div> 14 </div>
  15 + <div class="d1">
  16 + <el-progress :percentage="percent" v-if="percent > 0"></el-progress>
  17 + </div>
  18 + <slot name="descption"></slot>
14 </div> 19 </div>
15 </template> 20 </template>
16 21
17 <script> 22 <script>
  23 +import conf from "@/config/index"; // 路径配置
18 export default { 24 export default {
19 name: "downUpData", 25 name: "downUpData",
20 props: { 26 props: {
@@ -36,6 +42,28 @@ export default { @@ -36,6 +42,28 @@ export default {
36 }, 42 },
37 }, 43 },
38 computed: { 44 computed: {
  45 + percent: function () {
  46 + var _percentage = 0;
  47 + console.log(this.isOked)
  48 + if (this.file?.percentage) _percentage = this.file?.percentage;
  49 + if (_percentage >= 100) {
  50 + if (!this.isOked) _percentage = 96;
  51 + else _percentage = 100;
  52 + }
  53 + return _percentage;
  54 + },
  55 + uploadUrl: function () {
  56 + var requestUrl = '';
  57 + var ogrinUrl = this.$props.url;
  58 + var baseUrl = conf.baseURL;
  59 + if (baseUrl == '/' && ogrinUrl.indexOf('/') == 0) {
  60 + requestUrl = ogrinUrl;
  61 + }
  62 + else {
  63 + requestUrl = baseUrl + ogrinUrl
  64 + }
  65 + return requestUrl;
  66 + },
39 query: function () { 67 query: function () {
40 if (this.id) { 68 if (this.id) {
41 return { 69 return {
@@ -57,12 +85,16 @@ export default { @@ -57,12 +85,16 @@ export default {
57 data() { 85 data() {
58 return { 86 return {
59 file: null, 87 file: null,
  88 + isOked: false
60 }; 89 };
61 }, 90 },
62 methods: { 91 methods: {
  92 + removec(file, fileList) {
  93 + this.file = null;
  94 + this.isOked = false;
  95 + },
63 async submitUpload() { 96 async submitUpload() {
64 this.$refs.upload.submit(); 97 this.$refs.upload.submit();
65 -  
66 // const formData = new FormData() 98 // const formData = new FormData()
67 // formData.append('id',this.componentId) 99 // formData.append('id',this.componentId)
68 // formData.append('file',new File(this.file.raw)) 100 // formData.append('file',new File(this.file.raw))
@@ -75,6 +107,7 @@ export default { @@ -75,6 +107,7 @@ export default {
75 // } 107 // }
76 }, 108 },
77 upSuccess(res) { 109 upSuccess(res) {
  110 + this.isOked = true;
78 if (res && res.status == 0) { 111 if (res && res.status == 0) {
79 this.$message.success("上传成功"); 112 this.$message.success("上传成功");
80 this.$emit("upSuccess", res); 113 this.$emit("upSuccess", res);
@@ -84,6 +117,7 @@ export default { @@ -84,6 +117,7 @@ export default {
84 } 117 }
85 }, 118 },
86 upError(res) { 119 upError(res) {
  120 + this.isOked = true;
87 if (res && res.status == 0) { 121 if (res && res.status == 0) {
88 this.$message.error("上传失败"); 122 this.$message.error("上传失败");
89 } else { 123 } else {
@@ -101,11 +135,13 @@ export default { @@ -101,11 +135,13 @@ export default {
101 .d1 { 135 .d1 {
102 padding: 10px; 136 padding: 10px;
103 overflow: hidden; 137 overflow: hidden;
  138 +
104 :deep(.el-upload-list) { 139 :deep(.el-upload-list) {
105 width: 100%; 140 width: 100%;
106 } 141 }
107 - 142 +
108 } 143 }
  144 +
109 .btn { 145 .btn {
110 border-radius: 8px; 146 border-radius: 8px;
111 font-weight: normal; 147 font-weight: normal;
@@ -115,7 +151,7 @@ export default { @@ -115,7 +151,7 @@ export default {
115 display: flex; 151 display: flex;
116 flex-direction: column; 152 flex-direction: column;
117 align-items: center; 153 align-items: center;
118 - 154 +
119 } 155 }
120 156
121 .upload-btn { 157 .upload-btn {
@@ -131,3 +167,14 @@ export default { @@ -131,3 +167,14 @@ export default {
131 167
132 } 168 }
133 </style> 169 </style>
  170 +
  171 +<style>
  172 +.el-progress__text {
  173 + margin-left: 10px !important;
  174 + font-size: 14px !important;
  175 +}
  176 +
  177 +.el-upload-list .el-progress {
  178 + display: none !important;
  179 +}
  180 +</style>
src/config/index.js
1 const modeUrl = { 1 const modeUrl = {
2 // 开发环境 2 // 开发环境
3 development: { 3 development: {
4 - baseURL: "/", 4 + baseURL: "/api/",
5 authBaseURL: "", 5 authBaseURL: "",
6 $cdn:"" 6 $cdn:""
7 }, 7 },
src/router/index.js
@@ -346,7 +346,7 @@ let addrouters = [ @@ -346,7 +346,7 @@ let addrouters = [
346 path: "/testReportDetail", 346 path: "/testReportDetail",
347 iconCls: "", 347 iconCls: "",
348 name: "testReportDetail", 348 name: "testReportDetail",
349 - demoRoles: ["ROLE_JIAOSHI"], 349 + demoRoles: ["ROLE_JIAOSHI","ROLE_BANZHUREN"],
350 component: askTestReportDetail, 350 component: askTestReportDetail,
351 hidden: true, 351 hidden: true,
352 children: [] 352 children: []
src/store/index.js
@@ -41,7 +41,7 @@ const store = new Vuex.Store({ @@ -41,7 +41,7 @@ const store = new Vuex.Store({
41 localStorage.setItem("info", JSON.stringify(data)); 41 localStorage.setItem("info", JSON.stringify(data));
42 }, 42 },
43 setRouters: (state, routers) => { 43 setRouters: (state, routers) => {
44 - console.log('current', state); 44 + state.addRouters = [];
45 let addrouterList = [] 45 let addrouterList = []
46 if (state.info.showRole == 'ROLE_PERSONAL') { 46 if (state.info.showRole == 'ROLE_PERSONAL') {
47 addrouterList = [...addroutersPersonal] 47 addrouterList = [...addroutersPersonal]
@@ -55,12 +55,10 @@ const store = new Vuex.Store({ @@ -55,12 +55,10 @@ const store = new Vuex.Store({
55 } 55 }
56 } 56 }
57 57
58 - let aRouters = addrouterList.filter((item) => {  
59 - 58 + let aRouters = addrouterList.filter((item) => {
60 let path = item.children[0]?.path.replace("/", ""); 59 let path = item.children[0]?.path.replace("/", "");
61 if (routers?.includes(path) == true) return item; 60 if (routers?.includes(path) == true) return item;
62 - else if (item.demoRoles?.includes(state.info.showRole) == true) return item;  
63 - 61 + else if (item.demoRoles?.includes(state.info.showRole) == true) return item;
64 if (item.children) { 62 if (item.children) {
65 item.children = item.children.filter((itemFilter) => { 63 item.children = item.children.filter((itemFilter) => {
66 return itemFilter.demoRoles?.includes(state.info.showRole) == true 64 return itemFilter.demoRoles?.includes(state.info.showRole) == true
@@ -102,7 +100,6 @@ const store = new Vuex.Store({ @@ -102,7 +100,6 @@ const store = new Vuex.Store({
102 .then((res) => { 100 .then((res) => {
103 let response = res; 101 let response = res;
104 if (response.status == 0) { 102 if (response.status == 0) {
105 - console.log(response)  
106 const userInfo = { ...response.data }; 103 const userInfo = { ...response.data };
107 if (userInfo.permissions && userInfo.permissions.length) { 104 if (userInfo.permissions && userInfo.permissions.length) {
108 userInfo.showRoleName = response.data.permissions[0]?.roleName; 105 userInfo.showRoleName = response.data.permissions[0]?.roleName;
@@ -121,6 +118,7 @@ const store = new Vuex.Store({ @@ -121,6 +118,7 @@ const store = new Vuex.Store({
121 hidden: true, 118 hidden: true,
122 children: [], 119 children: [],
123 }); 120 });
  121 + sessionStorage.setItem("RouteRefresh", false);
124 if (params.url) { 122 if (params.url) {
125 window.location.href = params.url; 123 window.location.href = params.url;
126 } else { 124 } else {
src/utils/index.js
@@ -106,30 +106,23 @@ export function deepClone(obj) { @@ -106,30 +106,23 @@ export function deepClone(obj) {
106 return result; 106 return result;
107 } 107 }
108 108
109 -export function getKnowledge(knowledge) { 109 +export function getKnowledge(knowledgeParam) {
  110 + if (!knowledgeParam) return "";
110 111
111 - if (!knowledge) return ""; 112 + var knowledge = knowledgeParam + "";
112 113
113 - var splitPoints = s.Split(','); 114 + var knowledges = knowledge.split(',');
114 115
115 - var result = "";  
116 -  
117 - splitPoints.forEach(split => {  
118 -  
119 - var ss = split.Split('#').filter(dd => dd.length >= 1); 116 + var resultArray = [];
120 117
  118 + knowledges.forEach(ksplit => {
  119 + var ss = ksplit.split('#').filter(dd => dd.length >= 1);
121 if (ss.length > 0) { 120 if (ss.length > 0) {
122 - result += ss[ss.Length - 1] + ";"; 121 + resultArray.push(ss[ss.length - 1]);
123 } 122 }
124 }) 123 })
125 124
126 - if (result.length > 1) result = result.substring(0, result.length - 1);  
127 -  
128 - if (result.length == 1) {  
129 - return "";  
130 - }  
131 -  
132 - return result; 125 + return resultArray.join(';');
133 } 126 }
134 127
135 // // 3DES加密 128 // // 3DES加密
@@ -854,74 +847,425 @@ export function formatGradeNameClass(data) { @@ -854,74 +847,425 @@ export function formatGradeNameClass(data) {
854 }); 847 });
855 return gradeNameArr; 848 return gradeNameArr;
856 } 849 }
  850 +_
  851 +
  852 +export function tablePrint(options) {
857 853
858 -export function tablePrint(id, title, type = null) { 854 + var id = options.id;
  855 + var title = options.title;
  856 + var lindex = options.lindex;
  857 + var splitParam = options.splitParam ?? 20;
  858 + var printType = options.printType;
  859 + var fixedColumn = options.fixedColumn ?? 0;
  860 + var diffNumber = options.diffNumber ?? 0;
  861 + var diffStNumber = options.diffStNumber ?? 0;
859 let divs = document.getElementById(id); 862 let divs = document.getElementById(id);
860 let awin = window.open("", "_blank"); 863 let awin = window.open("", "_blank");
861 awin.document.getElementsByTagName( 864 awin.document.getElementsByTagName(
862 "head" 865 "head"
863 - )[0].innerHTML = `<style> @media print {@page {size:A4 landscape;margin:10mm}  
864 - body{margin:5mm;font-size:8px;}}  
865 - body{-webkit-print-color-adjust: exact;}  
866 - .tit{text-align:center;font-size:20px;color:#333;line-height:24px;font-weight:700;padding:10px 0;margin:0;}  
867 - .table-box,.el-table,.el-table__body-wrapper,.el-table--border{max-height:99999999px!important;height:auto;width:auto!important;max-width:1400px;margin: 0 auto;}  
868 - .el-table{width:100%}  
869 - .print-hidden{display:none;}  
870 - .el-table,.el-table__body-wrapper{max-height:auto}  
871 - .el-table .el-table__cell{padding:12px 0}  
872 - .el-table thead tr:first-child th.el-table__cell{border-top: 1px solid #ccc}  
873 - .el-table thead tr:first-child th.el-table__cell:first-child{border-left: 1px solid #ccc;}  
874 - .el-table thead tr th.el-table__cell{background:#ccc}  
875 - .el-table tbody tr td.el-table__cell:first-child{border-left: 1px solid #ccc;}  
876 - .el-table td.el-table__cell{border-bottom: 1px solid #ccc;}  
877 - .el-table--border .el-table__cell{border-right: 1px solid #ccc;}  
878 - .el-table--border th.el-table__cell, .el-table__fixed-right-patch{border-bottom: 1px solid #ccc;}  
879 - .el-table .el-table__cell.gutter{border:none!important;}  
880 - .el-table__fixed{display:none!important}  
881 - .el-table .el-table__cell.is-center{text-align:center!important}  
882 - .el-table .el-table__cell.is-hidden>*{visibility: inherit;}  
883 - .el-table__cell.gutter{display:none}  
884 - ul,li{margin:0;padding:0;list-style:none}  
885 - .hui-box{display: flex;text-align: center;}  
886 - .hui-box .s-txt{width: 61px;line-height: 144px;background: #ccc;font-size: 16px;color: #fff;font-weight: 700;border:1px solid #ccc;box-sizing:border-box}  
887 - .hui-li{display: flex;}  
888 - .hui-s{height: 48px;line-height: 48px;border-right: 1px solid #ccc;border-bottom: 1px solid #ccc;box-sizing: border-box;}  
889 - .hui-s.s1{width: 100px;}  
890 - .hui-s.s2{ width: 110px;}  
891 - .hui-s.s3{width: 120px;}  
892 - .info { display: flex;flex-wrap: wrap;border-left: 1px solid #ccc;border-top: 1px solid #ccc;margin-bottom: 12px;}  
893 - .info-item {width: 25%;height: 50px;box-sizing: border-box;flex-shrink: 0;background: #f8f8f8;border-right: 1px solid #ccc;border-bottom: 1px solid #ccc;line-height: 50px;text-align: center;}  
894 - .row-line { width: calc(20% - 2px);  
895 - border: 1px solid #ebeef5;  
896 - background: #f5f7fa;  
897 - display: inline-block;  
898 - height: 40px;  
899 - line-height: 40px;  
900 -  
901 - .line-subfix {  
902 - margin-left: 10px;  
903 - }}  
904 -  
905 - .el-table__header,.el-table__body{width:100%!important;}  
906 - #print-table{max-width:1400px;margin: 0 auto;width: 100%;}  
907 - .hide{max-width:1400px;margin: 0 auto;width: 100%;border-left: 1px solid #ccc;border-spacing:0;box-sizing:border-box}  
908 - .hide thead th{background:#ccc;line-height: 48px;border-right: 1px solid #ccc;box-sizing:border-box}  
909 - .hide tbody tr td{line-height: 48px;border-right: 1px solid #ccc;text-align:center;box-sizing:border-box}  
910 - .hide td{border-bottom: 1px solid #ccc;} 866 + )[0].innerHTML = `<style>
  867 + @media print {
  868 + @page {
  869 + size: A4 portrait;
  870 + margin: 4mm
  871 + }
  872 +
  873 +
  874 + body {
  875 + margin: 2mm;
  876 + font-size: 8px;
  877 + }
  878 + }
  879 +
  880 + * :not(.tit) {
  881 + font-size: 10px;
  882 + }
  883 +
  884 +
  885 + body {
  886 + -webkit-print-color-adjust: exact;
  887 + }
  888 + .el-table__fixed-right{
  889 + display: none;
  890 + }
  891 + .tit {
  892 + text-align: center;
  893 + font-size: 14px;
  894 + color: #333;
  895 + line-height: 24px;
  896 + font-weight: 700;
  897 + /* padding: 10px 0; */
  898 + margin: 0;
  899 + }
  900 +
  901 + .table-box,
  902 + .el-table,
  903 + .el-table__body-wrapper,
  904 + .el-table--border {
  905 + max-height: 99999999px !important;
  906 + height: auto;
  907 + width: auto !important;
  908 + max-width: 1400px;
  909 + margin: 5px auto;
  910 + }
  911 +
  912 + .el-table,table {
  913 + width: 100%;
  914 + margin-bottom:10px;
  915 + }
  916 +
  917 + .print-hidden,.el-tabs__nav {
  918 + display: none;
  919 + }
  920 +
  921 + .el-table,
  922 + .el-table__body-wrapper {
  923 + max-height: auto
  924 + }
  925 +
  926 + .el-table .el-table__cell {
  927 + padding: 2px 0;
  928 + border-right: 1px solid black;
  929 + min-width:50px;
  930 + }
  931 +
  932 + .el-table thead tr:first-child th.el-table__cell {
  933 + border-top: 1px solid black;
  934 + }
  935 +
  936 + .el-table thead tr:first-child th.el-table__cell:first-child {
  937 + border-left: 1px solid black;
  938 + }
  939 +
  940 + .el-table thead tr th.el-table__cell {
  941 + background: #ccc
  942 + }
  943 + .el-table thead tr th{
  944 + height:auto;
  945 + word-wrap:break-word;
  946 + word-break:break-all;
  947 + overflow:hidden;
  948 + }
  949 + .el-table tbody tr td.el-table__cell:first-child {
  950 + border-left: 1px solid black;
  951 + }
  952 +
  953 + .el-table td.el-table__cell {
  954 + border-bottom: 1px solid black;
  955 + }
  956 +
  957 + .el-table--border .el-table__cell {
  958 + border-right: 1px solid black;
  959 + }
  960 +
  961 + .el-table--border th.el-table__cell,
  962 + .el-table__fixed-right-patch {
  963 + border-bottom: 1px solid black;
  964 + }
  965 +
  966 + .el-table .el-table__cell.gutter {
  967 + border: none !important;
  968 + }
  969 +
  970 + .el-table__fixed {
  971 + display: none !important
  972 + }
  973 +
  974 + .el-table .el-table__cell {
  975 + text-align: center !important
  976 + }
  977 +
  978 + .el-table .el-table__cell.is-hidden>* {
  979 + visibility: inherit;
  980 + }
  981 +
  982 + .el-table__cell.gutter {
  983 + display: none
  984 + }
  985 +
  986 + ul,
  987 + li {
  988 + margin: 0;
  989 + padding: 0;
  990 + list-style: none
  991 + }
  992 +
  993 + .hui-box {
  994 + display: flex;
  995 + text-align: center;
  996 + }
  997 +
  998 + .hui-box .s-txt {
  999 + width: 61px;
  1000 + line-height: 144px;
  1001 + background: #ccc;
  1002 + font-size: 16px;
  1003 + color: #fff;
  1004 + font-weight: 700;
  1005 + border: 1px solid #ccc;
  1006 + box-sizing: border-box
  1007 + }
  1008 +
  1009 + .hui-li {
  1010 + display: flex;
  1011 + }
  1012 +
  1013 + .hui-s {
  1014 + height: 48px;
  1015 + line-height: 48px;
  1016 + border-right: 1px solid #ccc;
  1017 + border-bottom: 1px solid #ccc;
  1018 + box-sizing: border-box;
  1019 + }
  1020 +
  1021 + .hui-s.s1 {
  1022 + width: 100px;
  1023 + }
  1024 +
  1025 + .hui-s.s2 {
  1026 + width: 110px;
  1027 + }
  1028 +
  1029 + .hui-s.s3 {
  1030 + width: 120px;
  1031 + }
  1032 +
  1033 + .info {
  1034 + display: flex;
  1035 + flex-wrap: wrap;
  1036 + border-left: 1px solid #ccc;
  1037 + border-top: 1px solid #ccc;
  1038 + margin-bottom: 12px;
  1039 + }
  1040 +
  1041 + .info-item {
  1042 + width: 25%;
  1043 + height: 50px;
  1044 + box-sizing: border-box;
  1045 + flex-shrink: 0;
  1046 + background: #f8f8f8;
  1047 + border-right: 1px solid #ccc;
  1048 + border-bottom: 1px solid #ccc;
  1049 + line-height: 50px;
  1050 + text-align: center;
  1051 + }
  1052 +
  1053 + .row-line {
  1054 + width: 33%;
  1055 + border: 1px solid #ebeef5;
  1056 + background: #f5f7fa;
  1057 + display: inline-block;
  1058 + height: 30px;
  1059 + line-height: 30px;
  1060 +
  1061 + .line-subfix {
  1062 + margin-left: 10px;
  1063 + }
  1064 + }
  1065 +
  1066 + .row-line-5 {
  1067 + width: 19.5% !important;
  1068 + }
  1069 +
  1070 + .row-line-4 {
  1071 + width: 24.5% !important;
  1072 + }
  1073 + .el-table__header,
  1074 + .el-table__body {
  1075 + width: 100% !important;
  1076 + }
  1077 +
  1078 + #print-table {
  1079 + max-width: 1400px;
  1080 + margin: 0 auto;
  1081 + width: 100%;
  1082 + }
  1083 +
  1084 + .hide {
  1085 + max-width: 1400px;
  1086 + margin: 0 auto;
  1087 + width: 100%;
  1088 + border-left: 1px solid #ccc;
  1089 + border-spacing: 0;
  1090 + box-sizing: border-box
  1091 + }
  1092 +
  1093 + .hide thead th {
  1094 + background: #ccc;
  1095 + line-height: 48px;
  1096 + border-right: 1px solid #ccc;
  1097 + box-sizing: border-box
  1098 + }
  1099 +
  1100 + .hide tbody tr td {
  1101 + line-height: 48px;
  1102 + border-right: 1px solid #ccc;
  1103 + text-align: center;
  1104 + box-sizing: border-box
  1105 + }
  1106 +
  1107 + .hide td {
  1108 + border-bottom: 1px solid #ccc;
  1109 + }
911 </style>`; 1110 </style>`;
  1111 + var splitNumber = splitParam ? splitParam : 20;
  1112 +
912 let aDom = divs.cloneNode(true); 1113 let aDom = divs.cloneNode(true);
913 - if (!type) {  
914 - let aTbody = aDom.getElementsByClassName("el-table__body")[0]?.getElementsByTagName("tbody")[0];  
915 - aDom.getElementsByClassName("el-table__header")[0].append(aTbody); 1114 +
  1115 + let thead = aDom.querySelectorAll('.el-table__header-wrapper thead');
  1116 +
  1117 + let tbody = aDom.querySelectorAll('.el-table__body-wrapper table');
  1118 +
  1119 + var lastNotHiddenNumber = 0;
  1120 +
  1121 + if (tbody.length >= 1) {
  1122 +
  1123 + for (var tb = 0; tb < tbody.length; tb++) {
  1124 +
  1125 + var currentTbody = tbody[tb];
  1126 +
  1127 + var currentThead = thead[tb];
  1128 +
  1129 + var headTrs = currentThead.querySelectorAll('tr');
  1130 +
  1131 + var headThs = null;
  1132 +
  1133 + if (lindex != null && lindex >= 0)
  1134 + headThs = headTrs[lindex].querySelectorAll('th');
  1135 + else
  1136 + headThs = headTrs[headTrs.length - 1].querySelectorAll('th');
  1137 +
  1138 + if (headThs.length > splitNumber) {
  1139 +
  1140 + var bodyTrs = currentTbody.querySelectorAll('tr');
  1141 +
  1142 + var roas = Math.ceil(headThs.length / splitNumber);
  1143 +
  1144 + if (fixedColumn) {
  1145 +
  1146 + var thLength = headThs.length;
  1147 +
  1148 + thLength -= splitNumber;
  1149 +
  1150 + roas = 1;
  1151 +
  1152 + splitNumber -= fixedColumn;
  1153 +
  1154 + roas += Math.ceil(thLength / splitNumber);
  1155 +
  1156 + } else fixedColumn = 0;
  1157 +
  1158 + for (var stao = 1; stao < roas; stao++) {
  1159 +
  1160 + var newThead = currentThead.cloneNode(true);
  1161 +
  1162 + var newTbody = currentTbody.cloneNode();
  1163 +
  1164 + var newTrs = newThead.querySelectorAll('tr');
  1165 +
  1166 + for (var trds = 0; trds < newTrs.length; trds++) {
  1167 +
  1168 + var newThs = newTrs[trds].querySelectorAll('th');
  1169 +
  1170 + var index = 0;
  1171 +
  1172 + for (var lpss = 0; lpss < newThs.length; lpss++) {
  1173 +
  1174 + var newTh = newThs[lpss];
  1175 +
  1176 + if (!newTh) continue;
  1177 +
  1178 + if (stao == roas - 1 && index >= (splitNumber + fixedColumn)) {
  1179 + var currentTh = headTrs[trds].querySelectorAll('th')[lpss];
  1180 + if (currentTh) {
  1181 + currentTh.style.display = "none";
  1182 + }
  1183 + }
  1184 +
  1185 + var min = (stao + 1) * splitNumber;
  1186 +
  1187 + var max = stao * splitNumber;
  1188 +
  1189 + if (fixedColumn != 0) {
  1190 + min += fixedColumn;
  1191 + max += fixedColumn;
  1192 + }
  1193 +
  1194 + if (index >= min || index < max) {
  1195 + if (trds == 0 && fixedColumn != 0 && lpss < fixedColumn) {
  1196 + if (stao == roas - 1) lastNotHiddenNumber += 1;
  1197 + continue;
  1198 + }
  1199 + newTh.style.display = "none";
  1200 + }
  1201 + else if (stao == roas - 1) lastNotHiddenNumber += 1;
  1202 +
  1203 +
  1204 + var colspan = Number(newTh.getAttribute('colspan')) || 0;
  1205 +
  1206 + index += 1;
  1207 +
  1208 + if (colspan > 1) {
  1209 + index += colspan - 1;
  1210 + }
  1211 + }
  1212 + }
  1213 +
  1214 + for (var trd = 0; trd < bodyTrs.length; trd++) {
  1215 + var currentTr = bodyTrs[trd];
  1216 + var newTr = currentTr.cloneNode(true);
  1217 + var currentTds = currentTr.querySelectorAll('td');
  1218 + var newTds = newTr.querySelectorAll('td');
  1219 + var length = headThs.length + diffNumber;
  1220 + for (var lps = 0; lps < length; lps++) {
  1221 + var lpsIndex = lps;
  1222 + if (lps > diffStNumber) lpsIndex = lps - diffNumber;
  1223 + var newTd = newTds[lps];
  1224 + if (!newTd) continue;
  1225 + if (stao == roas - 1 && lpsIndex >= (splitNumber + fixedColumn)) {
  1226 + var currentTd = currentTds[lps];
  1227 + if (currentTd) {
  1228 + currentTd.style.display = "none";
  1229 + }
  1230 + }
  1231 + var min = (stao + 1) * splitNumber;
  1232 + var max = stao * splitNumber;
  1233 + if (fixedColumn != 0) {
  1234 + min += fixedColumn;
  1235 + max += fixedColumn;
  1236 + }
  1237 + if (lpsIndex >= min || lpsIndex < max) {
  1238 + if (fixedColumn != 0 && lpsIndex < fixedColumn) continue;
  1239 + newTd.style.display = "none";
  1240 + }
  1241 + }
  1242 + newTbody.appendChild(newTr);
  1243 + }
  1244 +
  1245 + if (lastNotHiddenNumber == fixedColumn) continue;
  1246 + newTbody.appendChild(newThead);
  1247 +
  1248 + newTbody.classList.add('_addedList');
  1249 +
  1250 + currentTbody.parentNode.parentNode.append(newTbody);
  1251 + }
  1252 + }
  1253 +
  1254 + currentTbody.appendChild(currentThead);
  1255 + }
916 } 1256 }
  1257 +
917 if (title) { 1258 if (title) {
918 let pTit = awin.document.createElement('p') 1259 let pTit = awin.document.createElement('p')
919 pTit.className = "tit" 1260 pTit.className = "tit"
920 pTit.innerHTML = title 1261 pTit.innerHTML = title
921 awin.document.body.append(pTit) 1262 awin.document.body.append(pTit)
922 } 1263 }
  1264 +
923 awin.document.body.append(aDom); 1265 awin.document.body.append(aDom);
  1266 +
924 awin.print(); 1267 awin.print();
  1268 +
925 awin.close() 1269 awin.close()
926 } 1270 }
927 1271
src/views/admin/clientVersion/components/upLoad.vue
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <el-upload 5 <el-upload
6 class="upload-demo" 6 class="upload-demo"
7 ref="upload" 7 ref="upload"
8 - :action="url" 8 + :action="uploadUrl"
9 :multiple="false" 9 :multiple="false"
10 :data="{ ...query }" 10 :data="{ ...query }"
11 :limit="1" 11 :limit="1"
@@ -24,6 +24,8 @@ @@ -24,6 +24,8 @@
24 </template> 24 </template>
25 25
26 <script> 26 <script>
  27 +import conf from "@/config/index"; // 路径配置
  28 +
27 export default { 29 export default {
28 name: "downUpData", 30 name: "downUpData",
29 props: { 31 props: {
@@ -43,6 +45,24 @@ export default { @@ -43,6 +45,24 @@ export default {
43 file: null, 45 file: null,
44 }; 46 };
45 }, 47 },
  48 + computed: {
  49 + uploadUrl: function () {
  50 +
  51 + var requestUrl = '';
  52 +
  53 + var ogrinUrl = this.$props.url;
  54 +
  55 + var baseUrl = conf.baseURL;
  56 +
  57 + if (baseUrl == '/' && ogrinUrl.indexOf('/') == 0) {
  58 + requestUrl = ogrinUrl;
  59 + }
  60 + else {
  61 + requestUrl = baseUrl + ogrinUrl
  62 + }
  63 + return requestUrl;
  64 + }
  65 + },
46 methods: { 66 methods: {
47 async submitUpload() { 67 async submitUpload() {
48 this.$refs.upload.submit(); 68 this.$refs.upload.submit();
src/views/admin/clientVersion/components/upLoadImg.vue
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 <el-upload 4 <el-upload
5 class="avatar-uploader" 5 class="avatar-uploader"
6 ref="upload" 6 ref="upload"
7 - :action="url" 7 + :action="uploadUrl"
8 :multiple="false" 8 :multiple="false"
9 :data="{ ...query }" 9 :data="{ ...query }"
10 :limit="1" 10 :limit="1"
@@ -20,6 +20,8 @@ @@ -20,6 +20,8 @@
20 </template> 20 </template>
21 21
22 <script> 22 <script>
  23 +import conf from "@/config/index"; // 路径配置
  24 +
23 export default { 25 export default {
24 name: "downUpData", 26 name: "downUpData",
25 props: { 27 props: {
@@ -33,6 +35,24 @@ export default { @@ -33,6 +35,24 @@ export default {
33 type: String, 35 type: String,
34 default: "", 36 default: "",
35 }, 37 },
  38 + },
  39 + computed: {
  40 + uploadUrl: function () {
  41 +
  42 + var requestUrl = '';
  43 +
  44 + var ogrinUrl = this.$props.url;
  45 +
  46 + var baseUrl = conf.baseURL;
  47 +
  48 + if (baseUrl == '/' && ogrinUrl.indexOf('/') == 0) {
  49 + requestUrl = ogrinUrl;
  50 + }
  51 + else {
  52 + requestUrl = baseUrl + ogrinUrl
  53 + }
  54 + return requestUrl;
  55 + }
36 }, 56 },
37 data() { 57 data() {
38 return { 58 return {
src/views/basic/ask/analysis.vue
@@ -132,7 +132,10 @@ export default { @@ -132,7 +132,10 @@ export default {
132 if (this.types == 2) { 132 if (this.types == 2) {
133 title = this.subjectNames.join(); 133 title = this.subjectNames.join();
134 } 134 }
135 - tablePrint("print-content", this.className + title + "_" + name); 135 + tablePrint({
  136 + id: "print-content",
  137 + title: this.className + title + "_" + name
  138 + });
136 }, 139 },
137 setType(type) { 140 setType(type) {
138 this.type = type; 141 this.type = type;
src/views/basic/ask/archiving.vue
@@ -104,8 +104,8 @@ @@ -104,8 +104,8 @@
104 </el-table-column> 104 </el-table-column>
105 <el-table-column align="center" :label="index == 0 ? '总参与度' : '参与度'" 105 <el-table-column align="center" :label="index == 0 ? '总参与度' : '参与度'"
106 :prop="'participationRate' + item"><template slot-scope="scoped"> 106 :prop="'participationRate' + item"><template slot-scope="scoped">
107 - {{ scoped.row["participationRate" + item] }}%  
108 - </template> 107 + {{ scoped.row["participationRate" + item] }}%
  108 + </template>
109 </el-table-column> 109 </el-table-column>
110 <el-table-column align="center" :label="index == 0 ? '总正确率' : '正确率'" 110 <el-table-column align="center" :label="index == 0 ? '总正确率' : '正确率'"
111 :prop="'correctRate' + item"><template slot-scope="scoped">{{ scoped.row["correctRate" + item] 111 :prop="'correctRate' + item"><template slot-scope="scoped">{{ scoped.row["correctRate" + item]
@@ -233,8 +233,10 @@ export default { @@ -233,8 +233,10 @@ export default {
233 methods: { 233 methods: {
234 print() { 234 print() {
235 tablePrint( 235 tablePrint(
236 - "print-content",  
237 - "随堂问-已归档" + this.tabList[this.tabIndex - 1] 236 + {
  237 + id: "print-content",
  238 + title: "随堂问-已归档" + this.tabList[this.tabIndex - 1]
  239 + }
238 ); 240 );
239 }, 241 },
240 changeSub(val) { 242 changeSub(val) {
src/views/basic/ask/components/answerQustion.vue
@@ -307,9 +307,9 @@ export default { @@ -307,9 +307,9 @@ export default {
307 detail.map((items, index) => { 307 detail.map((items, index) => {
308 params["isRight" + index] = items.isRight; 308 params["isRight" + index] = items.isRight;
309 params["answer" + index] = 309 params["answer" + index] =
310 - items.answer == 1 310 + items.answer == 1 && items.questionType == 4
311 ? "✓" 311 ? "✓"
312 - : items.answer == 2 312 + : items.answer == 2 && items.questionType == 4
313 ? "✗" 313 ? "✗"
314 : items.answer; 314 : items.answer;
315 }); 315 });
src/views/basic/ask/components/example.vue
@@ -17,16 +17,16 @@ @@ -17,16 +17,16 @@
17 scoped.row.answerCorrectRate }}%</template></el-table-column> 17 scoped.row.answerCorrectRate }}%</template></el-table-column>
18 <el-table-column prop="correctAnswer" label="正确答案" align="center"> 18 <el-table-column prop="correctAnswer" label="正确答案" align="center">
19 <template slot-scope="scoped">{{ 19 <template slot-scope="scoped">{{
20 - scoped.row.correctAnswer == 1 20 + scoped.row.correctAnswer == 1 && scoped.row.questionType == 4
21 ? "✓" 21 ? "✓"
22 - : scoped.row.correctAnswer == 2 22 + : scoped.row.correctAnswer == 2 && scoped.row.questionType == 4
23 ? "✗" 23 ? "✗"
24 : scoped.row.correctAnswer 24 : scoped.row.correctAnswer
25 }}</template></el-table-column> 25 }}</template></el-table-column>
26 <el-table-column prop="fallible" label="干扰答案" align="center"><template slot-scope="scoped">{{ 26 <el-table-column prop="fallible" label="干扰答案" align="center"><template slot-scope="scoped">{{
27 - scoped.row.fallible == 1 27 + scoped.row.fallible == 1 && scoped.row.questionType == 4
28 ? "✓" 28 ? "✓"
29 - : scoped.row.fallible == 2 29 + : scoped.row.fallible == 2 && scoped.row.questionType == 4
30 ? "✗" 30 ? "✗"
31 : scoped.row.fallible 31 : scoped.row.fallible
32 }}</template></el-table-column> 32 }}</template></el-table-column>
src/views/basic/askTestQuestion/components/askBzrMulti.vue
1 <template> 1 <template>
2 <div style="margin-right: 20px;width: 100%"> 2 <div style="margin-right: 20px;width: 100%">
3 <el-row class="row-type"> 3 <el-row class="row-type">
4 - <label>阶段报表类型</label> 4 + <label>报表类型</label>
5 <el-select class="opration-select" v-model="currentType"> 5 <el-select class="opration-select" v-model="currentType">
6 <el-option v-for="(item, index) in types" :lable="item" :key="index" :value="item" /> 6 <el-option v-for="(item, index) in types" :lable="item" :key="index" :value="item" />
7 </el-select> 7 </el-select>
@@ -50,7 +50,8 @@ @@ -50,7 +50,8 @@
50 }}</template> 50 }}</template>
51 </el-table-column> 51 </el-table-column>
52 </el-table-column> 52 </el-table-column>
53 - <el-table-column label="查看雷达图" fixed="right" width="100" align="center"> 53 + <el-table-column label="查看雷达图" fixed="right" width="100" align="center"
  54 + class-name="print-hidden">
54 <template slot-scope="scoped"> 55 <template slot-scope="scoped">
55 <el-button type="text" @click="openRandarChart(scoped.row)">查看</el-button> 56 <el-button type="text" @click="openRandarChart(scoped.row)">查看</el-button>
56 </template> 57 </template>
@@ -99,7 +100,7 @@ @@ -99,7 +100,7 @@
99 <el-dialog :append-to-body="true" class="chart-dia" :visible.sync="redarVisible" :title="radarChart.title" 100 <el-dialog :append-to-body="true" class="chart-dia" :visible.sync="redarVisible" :title="radarChart.title"
100 width="800"> 101 width="800">
101 <div class="chart-box"> 102 <div class="chart-box">
102 - <RadarChart id="radarChart" :params="radarChart" /> 103 + <RadarChart id="radarChart" :params="radarChart" :tooltipFormatter="true" />
103 </div> 104 </div>
104 </el-dialog> 105 </el-dialog>
105 </div> 106 </div>
@@ -188,8 +189,29 @@ export default { @@ -188,8 +189,29 @@ export default {
188 } 189 }
189 }, 190 },
190 _print() { 191 _print() {
  192 + var splitParam = 0;
  193 + var diffNumber = 0;
  194 + var diffStNumber = 0;
  195 + if (this.currentType == '学生多科作答表现') {
  196 + splitParam = 16;
  197 + diffNumber = 2;
  198 + diffStNumber = 15;
  199 + }
  200 + else if (this.currentType == '学生多科互动表现') {
  201 + splitParam = 15;
  202 + diffNumber = 4;
  203 + diffStNumber = 14;
  204 + }
191 205
192 - tablePrint("print-content", this.currentType); 206 + tablePrint({
  207 + id: "print-content",
  208 + title: this.currentType,
  209 + lindex: 1,
  210 + splitParam: splitParam,
  211 + fixedColumn: 2,
  212 + diffNumber: diffNumber,
  213 + diffStNumber: diffStNumber
  214 + });
193 }, 215 },
194 async refresh() { 216 async refresh() {
195 await this._changeType(); 217 await this._changeType();
@@ -264,7 +286,7 @@ export default { @@ -264,7 +286,7 @@ export default {
264 286
265 let subjectName = []; 287 let subjectName = [];
266 288
267 - this.answersList = answersResponse.data.list?.map((item) => { 289 + this.answersList = answersResponse.data?.list?.map((item) => {
268 290
269 let params = {}; 291 let params = {};
270 292
@@ -291,7 +313,6 @@ export default { @@ -291,7 +313,6 @@ export default {
291 313
292 this.answersOptions = [...optionsList]; 314 this.answersOptions = [...optionsList];
293 315
294 - console.log(this.answersList)  
295 }, 316 },
296 async _multiDisciplinaryInteraction() { 317 async _multiDisciplinaryInteraction() {
297 318
@@ -323,7 +344,7 @@ export default { @@ -323,7 +344,7 @@ export default {
323 344
324 this.interactionList = interactionReponse.data?.list?.map((item) => { 345 this.interactionList = interactionReponse.data?.list?.map((item) => {
325 let params = {}; 346 let params = {};
326 - item.dataList?.filter((items, index) => { 347 + item.dataList?.filter((items, index) => {
327 if (!subjectName.includes(items.subjectName) && items.subjectName != '全部科目') { 348 if (!subjectName.includes(items.subjectName) && items.subjectName != '全部科目') {
328 subjectName.push(items.subjectName); 349 subjectName.push(items.subjectName);
329 } 350 }
src/views/basic/askTestQuestion/components/askListReport.vue
@@ -3,35 +3,35 @@ @@ -3,35 +3,35 @@
3 <el-table class="default-table" :data="$props.datas" border> 3 <el-table class="default-table" :data="$props.datas" border>
4 <el-table-column prop="subjectName" label="科目" width="180" /> 4 <el-table-column prop="subjectName" label="科目" width="180" />
5 <el-table-column prop="title" label="课时名称" /> 5 <el-table-column prop="title" label="课时名称" />
6 - <el-table-column prop="participationRate" label="总参与度" width="180" > 6 + <el-table-column prop="participationRate" label="总参与度" width="180">
7 <template slot-scope="scoped"> 7 <template slot-scope="scoped">
8 {{ scoped.row.participationRate }}% 8 {{ scoped.row.participationRate }}%
9 </template> 9 </template>
10 </el-table-column> 10 </el-table-column>
11 - <el-table-column prop="answerCorrectRate" label="已答正确率" width="180" > 11 + <el-table-column prop="answerCorrectRate" label="已答正确率" width="180">
12 <template slot-scope="scoped"> 12 <template slot-scope="scoped">
13 {{ scoped.row.answerCorrectRate }}% 13 {{ scoped.row.answerCorrectRate }}%
14 </template> 14 </template>
15 </el-table-column> 15 </el-table-column>
16 - <el-table-column prop="classCorrectRate" label="班级正确率" width="180" > 16 + <el-table-column prop="classCorrectRate" label="班级正确率" width="180">
17 <template slot-scope="scoped"> 17 <template slot-scope="scoped">
18 - {{ scoped.row.classCorrectRate }}%  
19 - </template> 18 + {{ scoped.row.classCorrectRate }}%
  19 + </template>
20 </el-table-column> 20 </el-table-column>
21 <el-table-column prop="questionNum" label="题目总数" width="180" /> 21 <el-table-column prop="questionNum" label="题目总数" width="180" />
22 <el-table-column prop="startTime" label="上课时间" width="220" /> 22 <el-table-column prop="startTime" label="上课时间" width="220" />
23 <el-table-column label="操作" width="200"> 23 <el-table-column label="操作" width="200">
24 <template slot-scope="scoped"> 24 <template slot-scope="scoped">
25 - <template v-if="scoped.row.answerNum == 0"> 25 + <!-- <template v-if="scoped.row.answerNum == 0">
26 <el-button v-if="role != 'ROLE_BANZHUREN'" type="text" 26 <el-button v-if="role != 'ROLE_BANZHUREN'" type="text"
27 @click="_edit(scoped.row)">设置答案</el-button> 27 @click="_edit(scoped.row)">设置答案</el-button>
28 <template v-else>未设置答案</template> 28 <template v-else>未设置答案</template>
29 - </template> 29 + </template> -->
30 <el-button type="text" @click="_linkToDetail(scoped.row)">查看</el-button> 30 <el-button type="text" @click="_linkToDetail(scoped.row)">查看</el-button>
31 - <el-popconfirm v-if="role != 'ROLE_BANZHUREN'" title="确定删除吗?" @confirm="_remove(scoped.row)"> 31 + <!-- <el-popconfirm v-if="role != 'ROLE_BANZHUREN'" title="确定删除吗?" @confirm="_remove(scoped.row)">
32 <el-button class="remove-test" slot="reference" type="text" style="color:red;margin-left:10px" 32 <el-button class="remove-test" slot="reference" type="text" style="color:red;margin-left:10px"
33 :loading="scoped.row.loading">删除</el-button> 33 :loading="scoped.row.loading">删除</el-button>
34 - </el-popconfirm> 34 + </el-popconfirm> -->
35 </template> 35 </template>
36 </el-table-column> 36 </el-table-column>
37 </el-table> 37 </el-table>
@@ -70,13 +70,15 @@ export default { @@ -70,13 +70,15 @@ export default {
70 }, 70 },
71 }); 71 });
72 }, 72 },
73 - _edit(item) { 73 + _edit(item) {
74 this.$router.push({ 74 this.$router.push({
75 path: "/examinationPaperEdit", 75 path: "/examinationPaperEdit",
76 query: { 76 query: {
77 paperId: item.id, 77 paperId: item.id,
78 title: item.title, 78 title: item.title,
79 type: 3, 79 type: 3,
  80 + subjectName: item.subjectName,
  81 + sectionName: item.sectionName
80 }, 82 },
81 }); 83 });
82 }, 84 },
src/views/basic/askTestQuestion/components/askSummaryReport.vue
1 <template> 1 <template>
2 <div style="margin-right: 20px;width: 100%"> 2 <div style="margin-right: 20px;width: 100%">
3 <el-row class="row-type"> 3 <el-row class="row-type">
4 - <label>阶段报表类型</label> 4 + <label>报表类型</label>
5 <el-select class="opration-select" v-model="currentType"> 5 <el-select class="opration-select" v-model="currentType">
6 <el-option v-for="(item, index) in types" :lable="item" :key="index" :value="item" /> 6 <el-option v-for="(item, index) in types" :lable="item" :key="index" :value="item" />
7 </el-select> 7 </el-select>
@@ -13,75 +13,75 @@ @@ -13,75 +13,75 @@
13 <div id="print-content"> 13 <div id="print-content">
14 <div v-if="currentType == '题目作答表现汇总'"> 14 <div v-if="currentType == '题目作答表现汇总'">
15 <el-row class="row-subfix" style="margin-top:10px"> 15 <el-row class="row-subfix" style="margin-top:10px">
16 - <div class="row-line"> 16 + <div class="row-line row-line">
17 <span class="line-subfix">班级:</span> 17 <span class="line-subfix">班级:</span>
18 <span class="line-value">{{ detail.className }}</span> 18 <span class="line-value">{{ detail.className }}</span>
19 </div> 19 </div>
20 - <div class="row-line"> 20 + <div class="row-line row-line">
21 <span class="line-subfix">科目:</span> 21 <span class="line-subfix">科目:</span>
22 <span class="line-value">{{ detail.subjectName }}</span> 22 <span class="line-value">{{ detail.subjectName }}</span>
23 </div> 23 </div>
24 - <div class="row-line"> 24 + <div class="row-line row-line">
25 <span class="line-subfix">课时数:</span> 25 <span class="line-subfix">课时数:</span>
26 <span class="line-value">{{ $props.askReportIds.length }}</span> 26 <span class="line-value">{{ $props.askReportIds.length }}</span>
27 </div> 27 </div>
28 - <div class="row-line"> 28 + <div class="row-line ">
29 <span class="line-subfix">上课时间:</span> 29 <span class="line-subfix">上课时间:</span>
30 <span class="line-value">{{ detail.startTime }}</span> 30 <span class="line-value">{{ detail.startTime }}</span>
31 </div> 31 </div>
32 - <div class="row-line"> 32 + <div class="row-line ">
33 <span class="line-subfix">下课时间:</span> 33 <span class="line-subfix">下课时间:</span>
34 <span class="line-value">{{ detail.endTime }}</span> 34 <span class="line-value">{{ detail.endTime }}</span>
35 </div> 35 </div>
36 </el-row> 36 </el-row>
37 <el-row class="row-subfix"> 37 <el-row class="row-subfix">
38 - <div class="row-line"> 38 + <div class="row-line row-line-5">
39 <span class="line-subfix">班级人数:</span> 39 <span class="line-subfix">班级人数:</span>
40 <span class="line-value">{{ detail.classPersonNum }}</span> 40 <span class="line-value">{{ detail.classPersonNum }}</span>
41 </div> 41 </div>
42 - <div class="row-line"> 42 + <div class="row-line row-line-5">
43 <span class="line-subfix">签到人数:</span> 43 <span class="line-subfix">签到人数:</span>
44 <span class="line-value">{{ detail.checkInCount }}</span> 44 <span class="line-value">{{ detail.checkInCount }}</span>
45 </div> 45 </div>
46 - <div class="row-line"> 46 + <div class="row-line row-line-5">
47 <span class="line-subfix">题目总数:</span> 47 <span class="line-subfix">题目总数:</span>
48 <span class="line-value">{{ detail.questionNum }}</span> 48 <span class="line-value">{{ detail.questionNum }}</span>
49 </div> 49 </div>
50 - <div class="row-line"> 50 + <div class="row-line row-line-5">
51 <span class="line-subfix">答题总数:</span> 51 <span class="line-subfix">答题总数:</span>
52 <span class="line-value">{{ detail.totalAnswersNum }}</span> 52 <span class="line-value">{{ detail.totalAnswersNum }}</span>
53 </div> 53 </div>
54 - <div class="row-line"> 54 + <div class="row-line row-line-5">
55 <span class="line-subfix">课时时长:</span> 55 <span class="line-subfix">课时时长:</span>
56 - <span class="line-value">{{ setDuration(detail.duration) }}</span> 56 + <span class="line-value">{{ setDuration(detail.consumingDuration) }}</span>
57 </div> 57 </div>
58 </el-row> 58 </el-row>
59 <el-row class="row-subfix"> 59 <el-row class="row-subfix">
60 - <div class="row-line"> 60 + <div class="row-line row-line-5">
61 <span class="line-subfix">答对总数:</span> 61 <span class="line-subfix">答对总数:</span>
62 <span class="line-value">{{ detail.totalCorrectAnswersNum }}</span> 62 <span class="line-value">{{ detail.totalCorrectAnswersNum }}</span>
63 </div> 63 </div>
64 - <div class="row-line"> 64 + <div class="row-line row-line-5">
65 <span class="line-subfix">总参与度:</span> 65 <span class="line-subfix">总参与度:</span>
66 <span class="line-value">{{ detail.participationRate ? detail.participationRate : 0 }}%</span> 66 <span class="line-value">{{ detail.participationRate ? detail.participationRate : 0 }}%</span>
67 </div> 67 </div>
68 - <div class="row-line"> 68 + <div class="row-line row-line-5">
69 <span class="line-subfix">班级正确率:</span> 69 <span class="line-subfix">班级正确率:</span>
70 <span class="line-value">{{ detail.classCorrectRate ? detail.classCorrectRate : 0 }}%</span> 70 <span class="line-value">{{ detail.classCorrectRate ? detail.classCorrectRate : 0 }}%</span>
71 </div> 71 </div>
72 - <div class="row-line"> 72 + <div class="row-line row-line-5">
73 <span class="line-subfix">已达正确率:</span> 73 <span class="line-subfix">已达正确率:</span>
74 <span class="line-value">{{ detail.answerCorrectRate ? detail.answerCorrectRate : 0 }}%</span> 74 <span class="line-value">{{ detail.answerCorrectRate ? detail.answerCorrectRate : 0 }}%</span>
75 </div> 75 </div>
76 - <div class="row-line"> 76 + <div class="row-line row-line-5">
77 <span class="line-subfix">反馈时长:</span> 77 <span class="line-subfix">反馈时长:</span>
78 - <span class="line-value">{{ setDuration(detail.consumingDuration) }}</span> 78 + <span class="line-value">{{ setDuration(detail.duration) }}</span>
79 </div> 79 </div>
80 </el-row> 80 </el-row>
81 <el-row class="row-table"> 81 <el-row class="row-table">
82 <el-table class="default-table" :data="singleSubjectSummary" border> 82 <el-table class="default-table" :data="singleSubjectSummary" border>
83 <el-table-column prop="title" label="课时-题号" /> 83 <el-table-column prop="title" label="课时-题号" />
84 - <el-table-column label="题干" width="80"> 84 + <el-table-column label="题干" class-name="print-hidden" width="80">
85 <template slot-scope="scoped"> 85 <template slot-scope="scoped">
86 <el-button type="text" @click="openStem(scoped.row)">查看</el-button> 86 <el-button type="text" @click="openStem(scoped.row)">查看</el-button>
87 </template> 87 </template>
@@ -104,9 +104,10 @@ @@ -104,9 +104,10 @@
104 104
105 <el-table-column prop="knowledge" label="知识点(单题)" width="150"> 105 <el-table-column prop="knowledge" label="知识点(单题)" width="150">
106 <template slot-scope="scoped"> 106 <template slot-scope="scoped">
107 - <el-tooltip effect="dark" :content="scoped.row.knowledge" placement="left"> 107 + <el-tooltip effect="dark" :content="_knowledge(scoped.row.knowledge)"
  108 + placement="bottom">
108 <span class="overflowText"> 109 <span class="overflowText">
109 - {{ scoped.row.knowledge }} 110 + {{ _knowledge(scoped.row.knowledge) }}
110 </span> 111 </span>
111 </el-tooltip> 112 </el-tooltip>
112 </template> 113 </template>
@@ -114,8 +115,8 @@ @@ -114,8 +115,8 @@
114 <el-table-column prop="correctAnswer" label="正确答案(单题)" width="150"> 115 <el-table-column prop="correctAnswer" label="正确答案(单题)" width="150">
115 <template slot-scope="scoped"> 116 <template slot-scope="scoped">
116 {{ 117 {{
117 - scoped.row.correctAnswer == 1 ? "✓" :  
118 - scoped.row.correctAnswer == 2 ? "✗" : 118 + scoped.row.questionType == 4 && scoped.row.correctAnswer == 1 ? "✓" :
  119 + scoped.row.questionType == 4 && scoped.row.correctAnswer == 2 ? "✗" :
119 scoped.row.correctAnswer 120 scoped.row.correctAnswer
120 }} 121 }}
121 </template> 122 </template>
@@ -123,8 +124,8 @@ @@ -123,8 +124,8 @@
123 <el-table-column prop="fallible" label="干扰选项(单题)" width="150"> 124 <el-table-column prop="fallible" label="干扰选项(单题)" width="150">
124 <template slot-scope="scoped"> 125 <template slot-scope="scoped">
125 {{ 126 {{
126 - scoped.row.fallible == 1 ? "✓" :  
127 - scoped.row.fallible == 2 ? "✗" : 127 + scoped.row.questionType == 4 && scoped.row.fallible == 1 ? "✓" :
  128 + scoped.row.questionType == 4 && scoped.row.fallible == 2 ? "✗" :
128 scoped.row.fallible 129 scoped.row.fallible
129 }} 130 }}
130 </template> 131 </template>
@@ -134,48 +135,52 @@ @@ -134,48 +135,52 @@
134 </div> 135 </div>
135 <div v-if="currentType == '学生单科表现作答汇总表'"> 136 <div v-if="currentType == '学生单科表现作答汇总表'">
136 <el-row class="row-subfix" style="margin-top:10px"> 137 <el-row class="row-subfix" style="margin-top:10px">
137 - <div class="row-line"> 138 + <div class="row-line row-line-4">
138 <span class="line-subfix">班级:</span> 139 <span class="line-subfix">班级:</span>
139 <span class="line-value">{{ detail.className }}</span> 140 <span class="line-value">{{ detail.className }}</span>
140 </div> 141 </div>
141 - <div class="row-line"> 142 + <div class="row-line row-line-4">
142 <span class="line-subfix">科目:</span> 143 <span class="line-subfix">科目:</span>
143 <span class="line-value">{{ detail.subjectName }}</span> 144 <span class="line-value">{{ detail.subjectName }}</span>
144 </div> 145 </div>
145 - <div class="row-line">  
146 - <span class="line-subfix">开始时间:</span>  
147 - <span class="line-value">{{ $props.queryParams.dateRange[0] }}</span> 146 + <div class="row-line row-line-4">
  147 + <span class="line-subfix">开始日期:</span>
  148 + <span class="line-value">{{ $props.queryParams.dateRange && $props.queryParams.dateRange.length
  149 + > 1 ?
  150 + $props.queryParams.dateRange[0] : "" }}</span>
148 </div> 151 </div>
149 - <div class="row-line">  
150 - <span class="line-subfix">截止时间:</span>  
151 - <span class="line-value">{{ $props.queryParams.dateRange[1] }}</span> 152 + <div class="row-line row-line-4">
  153 + <span class="line-subfix">截止日期:</span>
  154 + <span class="line-value">{{ $props.queryParams.dateRange && $props.queryParams.dateRange.length
  155 + > 1 ?
  156 + $props.queryParams.dateRange[1] : "" }}</span>
152 </div> 157 </div>
153 - <div class="row-line"> 158 + <!-- <div class="row-line">
154 <span class="line-subfix">下课时间:</span> 159 <span class="line-subfix">下课时间:</span>
155 <span class="line-value">{{ detail.endTime }}</span> 160 <span class="line-value">{{ detail.endTime }}</span>
156 - </div> 161 + </div> -->
157 </el-row> 162 </el-row>
158 <el-row class="row-subfix"> 163 <el-row class="row-subfix">
159 - <div class="row-line"> 164 + <div class="row-line row-line-4">
160 <span class="line-subfix">课时数:</span> 165 <span class="line-subfix">课时数:</span>
161 <span class="line-value">{{ $props.askReportIds.length }}</span> 166 <span class="line-value">{{ $props.askReportIds.length }}</span>
162 </div> 167 </div>
163 - <div class="row-line"> 168 + <div class="row-line row-line-4">
164 <span class="line-subfix">总出题数:</span> 169 <span class="line-subfix">总出题数:</span>
165 <span class="line-value">{{ detail.questionNum }}</span> 170 <span class="line-value">{{ detail.questionNum }}</span>
166 </div> 171 </div>
167 - <div class="row-line"> 172 + <div class="row-line row-line-4">
168 <span class="line-subfix">查询时间:</span> 173 <span class="line-subfix">查询时间:</span>
169 <span class="line-value">{{ detail.selectDate }}</span> 174 <span class="line-value">{{ detail.selectDate }}</span>
170 </div> 175 </div>
171 - <div class="row-line"> 176 + <div class="row-line row-line-4">
172 <span class="line-subfix">查询老师:</span> 177 <span class="line-subfix">查询老师:</span>
173 - <span class="line-value">{{ detail.answerCorrectRate }}</span> 178 + <span class="line-value">{{ this.$store.getters.info.name }}</span>
174 </div> 179 </div>
175 - <div class="row-line"> 180 + <!-- <div class="row-line row-line-5">
176 <span class="line-subfix">课时时长:</span> 181 <span class="line-subfix">课时时长:</span>
177 <span class="line-value">{{ setDuration(detail.consumingDuration) }}</span> 182 <span class="line-value">{{ setDuration(detail.consumingDuration) }}</span>
178 - </div> 183 + </div> -->
179 </el-row> 184 </el-row>
180 <el-row class="row-table"> 185 <el-row class="row-table">
181 <el-table class="default-table" :data="studentPerformance"> 186 <el-table class="default-table" :data="studentPerformance">
@@ -194,7 +199,7 @@ @@ -194,7 +199,7 @@
194 <el-table-column prop="answerCorrectRate" label="已答正确率" width="120"> 199 <el-table-column prop="answerCorrectRate" label="已答正确率" width="120">
195 <template slot-scope="scoped">{{ scoped.row.answerCorrectRate }}%</template> 200 <template slot-scope="scoped">{{ scoped.row.answerCorrectRate }}%</template>
196 </el-table-column> 201 </el-table-column>
197 - <el-table-column prop="correctAnswerNum" label="查看折线图" width="120"> 202 + <el-table-column prop="correctAnswerNum" label="查看折线图" class-name="print-hidden" width="120">
198 <template slot-scope="scoped"> 203 <template slot-scope="scoped">
199 <el-button type="text" text @click="openLineChart(scoped.row)">查看</el-button> 204 <el-button type="text" text @click="openLineChart(scoped.row)">查看</el-button>
200 </template> 205 </template>
@@ -225,25 +230,27 @@ @@ -225,25 +230,27 @@
225 </div> 230 </div>
226 </el-dialog> 231 </el-dialog>
227 <el-dialog :append-to-body="true" class="stem" :visible.sync="stem.visible" :title="'题干'" width="800"> 232 <el-dialog :append-to-body="true" class="stem" :visible.sync="stem.visible" :title="'题干'" width="800">
228 - <iframe v-if="stem && stem.src" :src="stem.src" style="width: 100%;min-height: 400px;" /> 233 + <Preview v-if="stem && stem.src" :src="stem.src" :key="stem.src" />
229 </el-dialog> 234 </el-dialog>
230 <ExportDia :exportStudent="exportStudent" :diaShow="diaShow" @cancel="cancel" @exportData="_exportData" 235 <ExportDia :exportStudent="exportStudent" :diaShow="diaShow" @cancel="cancel" @exportData="_exportData"
231 :type="'折线图'" /> 236 :type="'折线图'" />
232 </div> 237 </div>
233 </template> 238 </template>
234 <script> 239 <script>
235 -import { formatDate,getKnowledge } from "utils"; 240 +import { formatDate, getKnowledge } from "utils";
236 import { downloadFile, tablePrint } from "@/utils"; 241 import { downloadFile, tablePrint } from "@/utils";
237 import LineChart from "@/components/charts/lineChart"; 242 import LineChart from "@/components/charts/lineChart";
  243 +import Preview from "@/components/preview";
238 export default { 244 export default {
239 name: "askSummaryReport", 245 name: "askSummaryReport",
240 components: { 246 components: {
241 - LineChart 247 + LineChart,
  248 + Preview
242 }, 249 },
243 props: { 250 props: {
244 askReportIds: Array, 251 askReportIds: Array,
245 queryParams: Object, 252 queryParams: Object,
246 - role: "", 253 + role: "",
247 }, 254 },
248 255
249 watch: { 256 watch: {
@@ -282,6 +289,7 @@ export default { @@ -282,6 +289,7 @@ export default {
282 }, 289 },
283 //题干数据对象 290 //题干数据对象
284 stem: { 291 stem: {
  292 + type: "html",
285 visible: false, 293 visible: false,
286 src: null 294 src: null
287 } 295 }
@@ -292,13 +300,19 @@ export default { @@ -292,13 +300,19 @@ export default {
292 await this._detail(); 300 await this._detail();
293 }, 301 },
294 methods: { 302 methods: {
  303 + _knowledge(knowledgeParam) {
  304 + return getKnowledge(knowledgeParam)
  305 + },
295 _export() { 306 _export() {
296 this.diaShow = true; 307 this.diaShow = true;
297 }, 308 },
298 _print() { 309 _print() {
299 - let title = this.detail.title || this.subjectNames.join();  
300 310
301 - tablePrint("print-content", title + "_" + this.currentType); 311 + let title = this.detail.title || this.subjectNames?.join();
  312 + tablePrint({
  313 + id: "print-content",
  314 + title: title + "_" + this.currentType
  315 + });
302 }, 316 },
303 cancel() { 317 cancel() {
304 this.diaShow = false; 318 this.diaShow = false;
@@ -307,7 +321,9 @@ export default { @@ -307,7 +321,9 @@ export default {
307 321
308 let studentIds = arr; 322 let studentIds = arr;
309 323
310 - let query = {}; 324 + let query = {
  325 + size: 9999
  326 + };
311 327
312 if (studentIds != null) { 328 if (studentIds != null) {
313 if (studentIds.length > 0) { 329 if (studentIds.length > 0) {
@@ -348,6 +364,7 @@ export default { @@ -348,6 +364,7 @@ export default {
348 await this._detail(); 364 await this._detail();
349 }, 365 },
350 async _changeType() { 366 async _changeType() {
  367 + this.detail.selectDate = formatDate(new Date(), "yyyy-MM-dd");
351 switch (this.currentType) { 368 switch (this.currentType) {
352 case "题目作答表现汇总": { await this._singleSubjectSummary(); }; break; 369 case "题目作答表现汇总": { await this._singleSubjectSummary(); }; break;
353 case "学生单科表现作答汇总表": { await this._studentPerformance(); }; break; 370 case "学生单科表现作答汇总表": { await this._studentPerformance(); }; break;
@@ -422,8 +439,10 @@ export default { @@ -422,8 +439,10 @@ export default {
422 this.$message.error(detailReponse.info); 439 this.$message.error(detailReponse.info);
423 return; 440 return;
424 } 441 }
  442 +
425 this.detail = detailReponse.data; 443 this.detail = detailReponse.data;
426 - this.detail.selectDate = formatDate(new Date(), "yyyy-MM-dd"); 444 +
  445 +
427 }, 446 },
428 async _singleSubjectSummary() { 447 async _singleSubjectSummary() {
429 448
@@ -439,6 +458,7 @@ export default { @@ -439,6 +458,7 @@ export default {
439 let query = { 458 let query = {
440 periodIds: this.$props.askReportIds, 459 periodIds: this.$props.askReportIds,
441 classIds: [this.$props.queryParams.class], 460 classIds: [this.$props.queryParams.class],
  461 + size: 9999
442 }; 462 };
443 463
444 let periodListReponse = await periodList({ 464 let periodListReponse = await periodList({
@@ -538,10 +558,11 @@ export default { @@ -538,10 +558,11 @@ export default {
538 name: "已答正确率", 558 name: "已答正确率",
539 value: answerCorrectRate, 559 value: answerCorrectRate,
540 }, 560 },
541 - ]; 561 + ];
542 }, 562 },
543 openStem(stemRow) { 563 openStem(stemRow) {
544 this.stem.src = stemRow.screenshot ?? ""; 564 this.stem.src = stemRow.screenshot ?? "";
  565 + console.log('stem', this.stem)
545 this.stem.visible = true; 566 this.stem.visible = true;
546 }, 567 },
547 openExport() { 568 openExport() {
@@ -584,6 +605,20 @@ export default { @@ -584,6 +605,20 @@ export default {
584 } 605 }
585 } 606 }
586 607
  608 +.row-line-4 {
  609 + width: calc(25% - 4px);
  610 + border: 1px solid #ebeef5;
  611 + background: #f5f7fa;
  612 + display: inline-block;
  613 + height: 40px;
  614 + line-height: 40px;
  615 +
  616 + .line-subfix {
  617 + margin-left: 10px;
  618 +
  619 + }
  620 +}
  621 +
587 .row-table { 622 .row-table {
588 margin-top: 20px; 623 margin-top: 20px;
589 } 624 }
src/views/basic/askTestQuestion/components/testBzrMulti.vue
1 <template> 1 <template>
2 <div style="margin-right: 20px;width: 100%"> 2 <div style="margin-right: 20px;width: 100%">
3 <div v-if="status == 'select'"> 3 <div v-if="status == 'select'">
4 - <el-row class="row-type"> 4 + <el-row class="row-type print-hidden">
5 5
6 <div style="float: right;"> 6 <div style="float: right;">
7 <el-button type="primary" :disabled="multipleSelection.length < 1" class="opration-btn" 7 <el-button type="primary" :disabled="multipleSelection.length < 1" class="opration-btn"
@@ -28,7 +28,10 @@ @@ -28,7 +28,10 @@
28 <div v-if="status == 'selected'"> 28 <div v-if="status == 'selected'">
29 <el-container style="height: 100%;width: 100%;"> 29 <el-container style="height: 100%;width: 100%;">
30 <el-main id="print-content"> 30 <el-main id="print-content">
31 - <el-row class="row-type"> 31 + <el-row class="row-type print-hidden">
  32 + <div style="float: left;">
  33 + <el-button @click="_backa">返回</el-button>
  34 + </div>
32 <div style="float: right;"> 35 <div style="float: right;">
33 <el-button type="primary" @click="_import" class="opration-btn" 36 <el-button type="primary" @click="_import" class="opration-btn"
34 icon="el-icon-upload2">导出报表</el-button> 37 icon="el-icon-upload2">导出报表</el-button>
@@ -83,26 +86,21 @@ @@ -83,26 +86,21 @@
83 }}</template> 86 }}</template>
84 </el-table-column> 87 </el-table-column>
85 </el-table-column> 88 </el-table-column>
86 - <el-table-column label="查看雷达图"> 89 + <el-table-column label="查看雷达图" class-name="print-hidden">
87 <template slot-scope="scoped"> 90 <template slot-scope="scoped">
88 <el-button type="text" @click="openRandarChart(scoped.row)">查看</el-button> 91 <el-button type="text" @click="openRandarChart(scoped.row)">查看</el-button>
89 </template> 92 </template>
90 </el-table-column> 93 </el-table-column>
91 </el-table> 94 </el-table>
92 </el-row> 95 </el-row>
93 - </el-main>  
94 - <el-footer>  
95 - <div style="float: right;margin-top: 10px;">  
96 - <el-button @click="_backa">返回</el-button>  
97 - </div>  
98 - </el-footer> 96 + </el-main>
99 </el-container> 97 </el-container>
100 98
101 </div> 99 </div>
102 <el-dialog class="chart-dia" :visible.sync="redarVisible" :title="radarChart.title" width="800" 100 <el-dialog class="chart-dia" :visible.sync="redarVisible" :title="radarChart.title" width="800"
103 :append-to-body="true"> 101 :append-to-body="true">
104 <div class="chart-box"> 102 <div class="chart-box">
105 - <RadarChart id="testRadarChart" :params="radarChart" /> 103 + <RadarChart id="testRadarChart" :params="radarChart" />
106 </div> 104 </div>
107 </el-dialog> 105 </el-dialog>
108 </div> 106 </div>
@@ -171,7 +169,15 @@ export default { @@ -171,7 +169,15 @@ export default {
171 }, 169 },
172 methods: { 170 methods: {
173 _print() { 171 _print() {
174 - tablePrint("print-content", this.currentType); 172 + tablePrint({
  173 + id: "print-content",
  174 + title: this.currentType,
  175 + lindex: 1,
  176 + splitParam: 16,
  177 + fixedColumn: 2,
  178 + diffNumber: 2,
  179 + diffStNumber: 15
  180 + });
175 }, 181 },
176 _checkAll() { 182 _checkAll() {
177 // this.multipleSelection = [...] 183 // this.multipleSelection = [...]
@@ -276,9 +282,9 @@ export default { @@ -276,9 +282,9 @@ export default {
276 this.exportStudent = []; 282 this.exportStudent = [];
277 }, 283 },
278 openRandarChart(obj) { 284 openRandarChart(obj) {
279 - 285 +
280 let max = 0; 286 let max = 0;
281 - 287 +
282 const dataList = obj.dataList.slice(1, obj.dataList.length); 288 const dataList = obj.dataList.slice(1, obj.dataList.length);
283 let subjectList = dataList.map((item) => { 289 let subjectList = dataList.map((item) => {
284 let score = Number(item.highestScore || item.score); 290 let score = Number(item.highestScore || item.score);
@@ -330,10 +336,10 @@ export default { @@ -330,10 +336,10 @@ export default {
330 value: dataList.map((item) => item.score), 336 value: dataList.map((item) => item.score),
331 name: "本人得分", 337 name: "本人得分",
332 }, 338 },
333 - ]; 339 + ];
334 340
335 this.radarChart.title = obj.studentName + "-多科阶段作答表现图"; 341 this.radarChart.title = obj.studentName + "-多科阶段作答表现图";
336 - console.log(this.radarChart) 342 +
337 this.redarVisible = true; 343 this.redarVisible = true;
338 }, 344 },
339 async _loadData() { 345 async _loadData() {
src/views/basic/askTestQuestion/components/testListReport.vue
@@ -150,7 +150,9 @@ export default { @@ -150,7 +150,9 @@ export default {
150 paperId: item.id, 150 paperId: item.id,
151 title: item.title, 151 title: item.title,
152 type: 2, //搜索题目详情类型 152 type: 2, //搜索题目详情类型
153 - examType: item.examPaperId == 0 ? 1 : 2, 153 + examType: item.examPaperId == 0 ? 1 : 2,
  154 + subjectName: item.subjectName,
  155 + sectionName: item.sectionName
154 }, 156 },
155 }); 157 });
156 }, 158 },
src/views/basic/askTestQuestion/components/testMultiClassReport.vue
1 <template> 1 <template>
2 <div style="margin-right: 20px;width: 100%"> 2 <div style="margin-right: 20px;width: 100%">
3 <el-row class="row-type"> 3 <el-row class="row-type">
4 - <label>阶段报表类型</label> 4 + <label>报表类型</label>
5 <el-select class="opration-select" v-model="currentType" style="margin-left: 10px;"> 5 <el-select class="opration-select" v-model="currentType" style="margin-left: 10px;">
6 <el-option v-for="(item, index) in types" :lable="item" :key="index" :value="item" /> 6 <el-option v-for="(item, index) in types" :lable="item" :key="index" :value="item" />
7 </el-select> 7 </el-select>
@@ -9,11 +9,12 @@ @@ -9,11 +9,12 @@
9 <el-row class="row-type" style="margin-top: 10px;"> 9 <el-row class="row-type" style="margin-top: 10px;">
10 <el-table v-if="$props.params" class="default-table" :data="listReport"> 10 <el-table v-if="$props.params" class="default-table" :data="listReport">
11 <el-table-column prop="subjectName" label="科目" width="100" /> 11 <el-table-column prop="subjectName" label="科目" width="100" />
12 - <el-table-column prop="paperName" label="试卷名称" /> 12 + <el-table-column prop="paperName" label="试卷名称" />
13 <el-table-column prop="classCorrectRate" label="已考班级"> 13 <el-table-column prop="classCorrectRate" label="已考班级">
14 <template slot-scope="scoped"> 14 <template slot-scope="scoped">
15 <el-checkbox-group v-model="scoped.row.checkedClassList"> 15 <el-checkbox-group v-model="scoped.row.checkedClassList">
16 - <el-checkbox :key="index" v-for="(item, index) in scoped.row.classInfos" :label="item.classId"> 16 + <el-checkbox :key="index" v-for="(item, index) in scoped.row.classInfos"
  17 + :label="item.classId">
17 {{ item.className }} 18 {{ item.className }}
18 </el-checkbox> 19 </el-checkbox>
19 </el-checkbox-group> 20 </el-checkbox-group>
@@ -48,7 +49,7 @@ export default { @@ -48,7 +49,7 @@ export default {
48 } 49 }
49 }, 50 },
50 methods: { 51 methods: {
51 - _linkToDetail(dataRow) { 52 + _linkToDetail(dataRow) {
52 this.$router.push({ 53 this.$router.push({
53 path: "/testReportDetail", 54 path: "/testReportDetail",
54 query: { 55 query: {
@@ -62,7 +63,7 @@ export default { @@ -62,7 +63,7 @@ export default {
62 }); 63 });
63 }, 64 },
64 async _loadDatas() { 65 async _loadDatas() {
65 - 66 +
66 var dataRequestParams = { 67 var dataRequestParams = {
67 classIds: this.$props.params.class ? [this.$props.params.class] : 68 classIds: this.$props.params.class ? [this.$props.params.class] :
68 this.$props.params.classIds ? [...this.$props.params.classIds] : null, 69 this.$props.params.classIds ? [...this.$props.params.classIds] : null,
@@ -72,7 +73,7 @@ export default { @@ -72,7 +73,7 @@ export default {
72 subjects: this.$props.params.subject ? [this.$props.params.subject] : 73 subjects: this.$props.params.subject ? [this.$props.params.subject] :
73 this.$props.params.subjects ? [...this.$props.params.subjects] : null 74 this.$props.params.subjects ? [...this.$props.params.subjects] : null
74 }; 75 };
75 - 76 +
76 var dataRequest = this.$request.tListExamReport; 77 var dataRequest = this.$request.tListExamReport;
77 78
78 79
src/views/basic/askTestQuestion/components/testSummaryReport.vue
@@ -51,7 +51,7 @@ @@ -51,7 +51,7 @@
51 }}</template> 51 }}</template>
52 </el-table-column> 52 </el-table-column>
53 </el-table-column> 53 </el-table-column>
54 - <el-table-column label="查看折线图" fixed="right" align="center" width="120"> 54 + <el-table-column label="查看折线图" class-name="print-hidden" fixed="right" align="center" width="120">
55 <template slot-scope="scoped"> 55 <template slot-scope="scoped">
56 <el-button type="text" @click="_openLineChart(scoped.row)">查看</el-button> 56 <el-button type="text" @click="_openLineChart(scoped.row)">查看</el-button>
57 </template> 57 </template>
@@ -133,11 +133,15 @@ export default { @@ -133,11 +133,15 @@ export default {
133 let query = { 133 let query = {
134 examIds: this.$props.testReportIds, 134 examIds: this.$props.testReportIds,
135 classIds: [this.$props.queryParams.class], 135 classIds: [this.$props.queryParams.class],
136 - subjectName: [this.$props.queryParams.subject],  
137 - startDay: this.$props.queryParams.dateRange[0] ?? null,  
138 - endDay: this.$props.queryParams.dateRange[1] ?? null, 136 + subjectName: [this.$props.queryParams.subject]
139 }; 137 };
140 138
  139 + if (this.$props.queryParams.dateRange && this.$props.queryParams.dateRange.length >= 2) {
  140 + query.startDay = this.$props.queryParams.dateRange[0];
  141 + query.endDay = this.$props.queryParams.dateRange[1];
  142 + }
  143 +
  144 +
141 const { data, status, info } = await phaseExamReport({ 145 const { data, status, info } = await phaseExamReport({
142 ...query 146 ...query
143 }); 147 });
@@ -158,7 +162,7 @@ export default { @@ -158,7 +162,7 @@ export default {
158 } 162 }
159 }); 163 });
160 }); 164 });
161 - console.log('lsit', data?.list) 165 +
162 this.stageReport = data?.list.map((item) => { 166 this.stageReport = data?.list.map((item) => {
163 let params = {}; 167 let params = {};
164 dataIdsList.map((ids, index) => { 168 dataIdsList.map((ids, index) => {
@@ -224,10 +228,17 @@ export default { @@ -224,10 +228,17 @@ export default {
224 } 228 }
225 }, 229 },
226 _print() { 230 _print() {
227 - tablePrint("print-content", "即时测-已归档单课时报表"); 231 + tablePrint({
  232 + id: "print-content",
  233 + title: "即时测-阶段报表",
  234 + splitParam: 18,
  235 + fixedColumn: 2,
  236 + diffNumber: 2,
  237 + diffStNumber: 3
  238 + });
228 }, 239 },
229 _titleClick() { }, 240 _titleClick() { },
230 - _openLineChart(chartRow) { 241 + _openLineChart(chartRow) {
231 var subejct = this.$props.role == 'ROLE_BANZHUREN' ? this.$props.queryParams.subjects[0] : this.$props.queryParams.subject; 242 var subejct = this.$props.role == 'ROLE_BANZHUREN' ? this.$props.queryParams.subjects[0] : this.$props.queryParams.subject;
232 this.lineChart.title = `${chartRow.studentName}-${subejct}-即时测-多卷作答表现图`; 243 this.lineChart.title = `${chartRow.studentName}-${subejct}-即时测-多卷作答表现图`;
233 this.lineChart.visible = true; 244 this.lineChart.visible = true;
src/views/basic/askTestQuestion/detail.vue
1 <template> 1 <template>
2 - <el-container class="default-body"> 2 + <el-container class="default-body default-body-detail">
3 <el-header> 3 <el-header>
4 <back-box class="detailBack"> 4 <back-box class="detailBack">
5 <template slot="title"> 5 <template slot="title">
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 </el-header> 11 </el-header>
12 <div class="default-filter"> 12 <div class="default-filter">
13 <el-row class="row-type"> 13 <el-row class="row-type">
14 - <label>阶段报表类型</label> 14 + <label>报表类型</label>
15 <el-select @change="_changeType" v-if="dataType && currentType" class="opration-select" 15 <el-select @change="_changeType" v-if="dataType && currentType" class="opration-select"
16 v-model="currentType"> 16 v-model="currentType">
17 <el-option v-for="(item, index) in types" :lable="item.name" :key="index" :value="item.name" /> 17 <el-option v-for="(item, index) in types" :lable="item.name" :key="index" :value="item.name" />
@@ -19,14 +19,14 @@ @@ -19,14 +19,14 @@
19 <div style="float: right;"> 19 <div style="float: right;">
20 <span v-if="(dataType == '2' && currentType == '测验成绩单') || 20 <span v-if="(dataType == '2' && currentType == '测验成绩单') ||
21 (dataType == '2' && currentType == '试题分析') || 21 (dataType == '2' && currentType == '试题分析') ||
22 - (dataType == '3' && currentType == '学生成绩排名')"> 22 + (dataType == '3' && currentType == '学生成绩排名')">
23 单题低分率: 23 单题低分率:
24 <el-input-number class="parent-number" v-model="lowLevel" :min="1" :max="100" label="低分率"> 24 <el-input-number class="parent-number" v-model="lowLevel" :min="1" :max="100" label="低分率">
25 </el-input-number> 25 </el-input-number>
26 </span> 26 </span>
27 27
28 <el-button v-if="(dataType == '3' && currentType == '班级对比情况表') || 28 <el-button v-if="(dataType == '3' && currentType == '班级对比情况表') ||
29 - (dataType == '3' && currentType == '学生成绩排名')" @click="_studentLevelSet" 29 + (dataType == '3' && currentType == '学生成绩排名')" @click="_studentLevelSet"
30 class="green-el-button"> 30 class="green-el-button">
31 设置学生成绩等级 31 设置学生成绩等级
32 </el-button> 32 </el-button>
@@ -37,13 +37,13 @@ @@ -37,13 +37,13 @@
37 </div> 37 </div>
38 </el-row> 38 </el-row>
39 </div> 39 </div>
40 - <el-main> 40 + <el-main v-loading="loading">
41 <div style=" padding: 20px;" id="print-content"> 41 <div style=" padding: 20px;" id="print-content">
42 - <div style="margin-bottom:20px;background:#ffb3b3;padding:10px 20px;" class="tips" 42 + <div style="margin-bottom:20px;background:#ffb3b3;padding:10px 20px;" class="tips print-hidden"
43 v-if="paperModifyLog.modifiedTime && !status"> 43 v-if="paperModifyLog.modifiedTime && !status">
44 <p class="tips-p"> 44 <p class="tips-p">
45 <i class="fa fa-bell-o"></i> 45 <i class="fa fa-bell-o"></i>
46 - {{ `${paperModifyLog.modifiedTime} ${paperModifyLog.realName}` }}修改了答案,是否重新记分? 46 + {{ `${paperModifyLog.modifiedTime} ${paperModifyLog.realName}` }}修改了试卷,是否重新记分?
47 <el-button type="danger" round @click="_reScore" size="mini">重新计分</el-button> 47 <el-button type="danger" round @click="_reScore" size="mini">重新计分</el-button>
48 <el-button type="danger" round plain size="mini" 48 <el-button type="danger" round plain size="mini"
49 @click="paperModifyLog.modifiedTime = ''">暂时不计</el-button> 49 @click="paperModifyLog.modifiedTime = ''">暂时不计</el-button>
@@ -73,53 +73,53 @@ @@ -73,53 +73,53 @@
73 </div> 73 </div>
74 </el-row> 74 </el-row>
75 <el-row class="row-subfix"> 75 <el-row class="row-subfix">
76 - <div class="row-line"> 76 + <div class="row-line row-line-5">
77 <span class="line-subfix">班级人数:</span> 77 <span class="line-subfix">班级人数:</span>
78 <span class="line-value">{{ detail.classPersonNum }}</span> 78 <span class="line-value">{{ detail.classPersonNum }}</span>
79 </div> 79 </div>
80 - <div class="row-line"> 80 + <div class="row-line row-line-5">
81 <span class="line-subfix">签到人数:</span> 81 <span class="line-subfix">签到人数:</span>
82 <span class="line-value">{{ detail.checkInCount }}</span> 82 <span class="line-value">{{ detail.checkInCount }}</span>
83 </div> 83 </div>
84 - <div class="row-line"> 84 + <div class="row-line row-line-5">
85 <span class="line-subfix">题目总数:</span> 85 <span class="line-subfix">题目总数:</span>
86 <span class="line-value">{{ detail.questionNum }}</span> 86 <span class="line-value">{{ detail.questionNum }}</span>
87 </div> 87 </div>
88 - <div class="row-line"> 88 + <div class="row-line row-line-5">
89 <span class="line-subfix">答题总数:</span> 89 <span class="line-subfix">答题总数:</span>
90 <span class="line-value">{{ detail.totalAnswersNum }}</span> 90 <span class="line-value">{{ detail.totalAnswersNum }}</span>
91 </div> 91 </div>
92 - <div class="row-line"> 92 + <div class="row-line row-line-5">
93 <span class="line-subfix">课时时长:</span> 93 <span class="line-subfix">课时时长:</span>
94 <span class="line-value">{{ setDuration(detail.duration) }}</span> 94 <span class="line-value">{{ setDuration(detail.duration) }}</span>
95 </div> 95 </div>
96 </el-row> 96 </el-row>
97 <el-row class="row-subfix"> 97 <el-row class="row-subfix">
98 - <div class="row-line"> 98 + <div class="row-line row-line-5">
99 <span class="line-subfix">答对总数:</span> 99 <span class="line-subfix">答对总数:</span>
100 <span class="line-value">{{ detail.totalCorrectAnswersNum }}</span> 100 <span class="line-value">{{ detail.totalCorrectAnswersNum }}</span>
101 </div> 101 </div>
102 - <div class="row-line"> 102 + <div class="row-line row-line-5">
103 <span class="line-subfix">总参与度:</span> 103 <span class="line-subfix">总参与度:</span>
104 <span class="line-value">{{ detail.participationRate }}%</span> 104 <span class="line-value">{{ detail.participationRate }}%</span>
105 </div> 105 </div>
106 - <div class="row-line"> 106 + <div class="row-line row-line-5">
107 <span class="line-subfix">班级正确率:</span> 107 <span class="line-subfix">班级正确率:</span>
108 <span class="line-value">{{ detail.classCorrectRate }}%</span> 108 <span class="line-value">{{ detail.classCorrectRate }}%</span>
109 </div> 109 </div>
110 - <div class="row-line">  
111 - <span class="line-subfix">已达正确率:</span> 110 + <div class="row-line row-line-5">
  111 + <span class="line-subfix">已答正确率:</span>
112 <span class="line-value">{{ detail.answerCorrectRate }}%</span> 112 <span class="line-value">{{ detail.answerCorrectRate }}%</span>
113 </div> 113 </div>
114 - <div class="row-line"> 114 + <div class="row-line row-line-5">
115 <span class="line-subfix">反馈时长:</span> 115 <span class="line-subfix">反馈时长:</span>
116 - <span class="line-value">{{ setDuration(detail.consumingDuration) }}</span> 116 + <span class="line-value">{{ setDuration1000(detail.consumingDuration) }}</span>
117 </div> 117 </div>
118 </el-row> 118 </el-row>
119 <el-row class="row-table"> 119 <el-row class="row-table">
120 <el-table class="default-table" :data="askItemAnalysis"> 120 <el-table class="default-table" :data="askItemAnalysis">
121 <el-table-column prop="title" label="课时-题号" /> 121 <el-table-column prop="title" label="课时-题号" />
122 - <el-table-column label="题干" width="80"> 122 + <el-table-column label="题干" class-name="print-hidden" width="80">
123 <template slot-scope="scoped"> 123 <template slot-scope="scoped">
124 <el-button type="text" size="mini" @click="openStem(scoped.row)">查看</el-button> 124 <el-button type="text" size="mini" @click="openStem(scoped.row)">查看</el-button>
125 </template> 125 </template>
@@ -140,12 +140,21 @@ @@ -140,12 +140,21 @@
140 <template slot-scope="scoped">{{ scoped.row.answerCorrectRate }}%</template> 140 <template slot-scope="scoped">{{ scoped.row.answerCorrectRate }}%</template>
141 </el-table-column> 141 </el-table-column>
142 142
143 - <el-table-column prop="knowledge" label="知识点(单题)" width="150" /> 143 + <el-table-column prop="knowledge" label="知识点(单题)" width="150">
  144 + <template slot-scope="scoped">
  145 + <el-tooltip effect="dark" :content="_knowledge(scoped.row.knowledge)"
  146 + placement="bottom">
  147 + <span class="overflowText">
  148 + {{ _knowledge(scoped.row.knowledge) }}
  149 + </span>
  150 + </el-tooltip>
  151 + </template>
  152 + </el-table-column>
144 <el-table-column prop="correctAnswer" label="正确答案(单题)" width="150"> 153 <el-table-column prop="correctAnswer" label="正确答案(单题)" width="150">
145 <template slot-scope="scoped"> 154 <template slot-scope="scoped">
146 {{ 155 {{
147 - scoped.row.correctAnswer == 1 ? "✓" :  
148 - scoped.row.correctAnswer == 2 ? "✗" : 156 + scoped.row.correctAnswer == 1 && scoped.row.questionType == 4 ? "✓" :
  157 + scoped.row.correctAnswer == 2 && scoped.row.questionType == 4 ? "✗" :
149 scoped.row.correctAnswer 158 scoped.row.correctAnswer
150 }} 159 }}
151 </template> 160 </template>
@@ -153,8 +162,8 @@ @@ -153,8 +162,8 @@
153 <el-table-column prop="fallible" label="干扰选项(单题)" width="150"> 162 <el-table-column prop="fallible" label="干扰选项(单题)" width="150">
154 <template slot-scope="scoped"> 163 <template slot-scope="scoped">
155 {{ 164 {{
156 - scoped.row.fallible == 1 ? "✓" :  
157 - scoped.row.fallible == 2 ? "✗" : 165 + scoped.row.fallible == 1 && scoped.row.questionType == 4 ? "✓" :
  166 + scoped.row.fallible == 2 && scoped.row.questionType == 4 ? "✗" :
158 scoped.row.fallible 167 scoped.row.fallible
159 }} 168 }}
160 </template> 169 </template>
@@ -168,24 +177,21 @@ @@ -168,24 +177,21 @@
168 <el-table-column prop="studentCode" label="学号"></el-table-column> 177 <el-table-column prop="studentCode" label="学号"></el-table-column>
169 <el-table-column prop="studentName" label="姓名"></el-table-column> 178 <el-table-column prop="studentName" label="姓名"></el-table-column>
170 <el-table-column prop="answerTimes" label="答题次数"></el-table-column> 179 <el-table-column prop="answerTimes" label="答题次数"></el-table-column>
171 - <el-table-column prop="consumingDuration" label="答题耗时"><template slot-scope="scoped">{{  
172 - setDuration(scoped.row.consumingDuration)  
173 - }} 180 + <el-table-column prop="consumingDuration" label="答题耗时"><template slot-scope="scoped">
  181 + {{ setDuration1000(scoped.row.consumingDuration) }}
174 </template></el-table-column> 182 </template></el-table-column>
175 <el-table-column prop="correctAnswerTimes" label="答对次数"> 183 <el-table-column prop="correctAnswerTimes" label="答对次数">
176 - <template slot-scope="scoped">{{  
177 - scoped.row.correctAnswerTimes ||  
178 - Number(scoped.row.correctAnswerTimes) === 0  
179 - ? scoped.row.correctAnswerTimes  
180 - : "-"  
181 - }}</template> 184 + <template slot-scope="scoped">
  185 + {{ scoped.row.correctAnswerTimes || Number(scoped.row.correctAnswerTimes) === 0 ?
  186 + scoped.row.correctAnswerTimes : "-" }}
  187 + </template>
182 </el-table-column> 188 </el-table-column>
183 <el-table-column prop="participationRate" label="参与度"><template slot-scope="scoped">{{ 189 <el-table-column prop="participationRate" label="参与度"><template slot-scope="scoped">{{
184 - scoped.row.participationRate ||  
185 - Number(scoped.row.participationRate) === 0  
186 - ? scoped.row.participationRate + "%"  
187 - : "-"  
188 - }}</template></el-table-column> 190 + scoped.row.participationRate ||
  191 + Number(scoped.row.participationRate) === 0
  192 + ? scoped.row.participationRate + "%"
  193 + : "-"
  194 + }}</template></el-table-column>
189 <el-table-column prop="correctRate" label="正确率"><template slot-scope="scoped">{{ 195 <el-table-column prop="correctRate" label="正确率"><template slot-scope="scoped">{{
190 scoped.row.correctRate || Number(scoped.row.correctRate) === 0 196 scoped.row.correctRate || Number(scoped.row.correctRate) === 0
191 ? scoped.row.correctRate + "%" 197 ? scoped.row.correctRate + "%"
@@ -197,11 +203,11 @@ @@ -197,11 +203,11 @@
197 ? scoped.row.answerCorrectRate + "%" 203 ? scoped.row.answerCorrectRate + "%"
198 : "-" 204 : "-"
199 }}</template></el-table-column> 205 }}</template></el-table-column>
200 - <el-table-column v-for="(item, index) in askPeriodQuestionItemOptions" :key="index" 206 + <el-table-column class-name="anwser-column"
  207 + v-for="(item, index) in askPeriodQuestionItemOptions" :key="index"
201 :label="'Q' + (index + 1)"><template slot-scope="scoped"> 208 :label="'Q' + (index + 1)"><template slot-scope="scoped">
202 - <span :class="scoped.row['isRight' + index] ? '' : 'red'">{{  
203 - scoped.row["answer" + index] || "-"  
204 - }}</span> 209 + <div :class="scoped.row['isRight' + index] ? '' : 'red'">{{ scoped.row["answer" +
  210 + index] || "-" }}</div>
205 </template> 211 </template>
206 </el-table-column> 212 </el-table-column>
207 </el-table> 213 </el-table>
@@ -223,19 +229,19 @@ @@ -223,19 +229,19 @@
223 </div> 229 </div>
224 <div v-if="dataType == '1' && currentType == '学生签到表现'"> 230 <div v-if="dataType == '1' && currentType == '学生签到表现'">
225 <el-row class="row-subfix"> 231 <el-row class="row-subfix">
226 - <div class="row-line"> 232 + <div class="row-line row-line-5">
227 <span class="line-subfix">应到人数:</span> 233 <span class="line-subfix">应到人数:</span>
228 <span class="line-value">{{ detail.classPersonNum }}</span> 234 <span class="line-value">{{ detail.classPersonNum }}</span>
229 </div> 235 </div>
230 - <div class="row-line"> 236 + <div class="row-line row-line-5">
231 <span class="line-subfix">实到人数:</span> 237 <span class="line-subfix">实到人数:</span>
232 <span class="line-value">{{ detail.checkInCount }}</span> 238 <span class="line-value">{{ detail.checkInCount }}</span>
233 </div> 239 </div>
234 - <div class="row-line"> 240 + <div class="row-line row-line-5">
235 <span class="line-subfix">迟到人数:</span> 241 <span class="line-subfix">迟到人数:</span>
236 <span class="line-value">{{ detail.classPersonNum - detail.checkInCount }}</span> 242 <span class="line-value">{{ detail.classPersonNum - detail.checkInCount }}</span>
237 </div> 243 </div>
238 - <div class="row-line"> 244 + <div class="row-line row-line-5">
239 <span class="line-subfix">未到人数:</span> 245 <span class="line-subfix">未到人数:</span>
240 <span class="line-value">{{ detail.classPersonNum - detail.checkInCount }}</span> 246 <span class="line-value">{{ detail.classPersonNum - detail.checkInCount }}</span>
241 </div> 247 </div>
@@ -279,8 +285,8 @@ @@ -279,8 +285,8 @@
279 </el-table> 285 </el-table>
280 </el-row> 286 </el-row>
281 <el-row class="row-subfix"> 287 <el-row class="row-subfix">
282 - <el-table class="default-table" style="margin-top: 10px" :data="studentList">  
283 - <el-table-column :width="item.label == '学号' ? 120 : 0" :prop="item.prop" :label="item.label" 288 + <el-table class="default-table" style="margin-top: 10px" :data="studentList" ref="table">
  289 + <el-table-column :width="item.label == '学号' ? 90 : 0" :prop="item.prop" :label="item.label"
284 :key="index" v-for="(item, index) in studentHeader" /> 290 :key="index" v-for="(item, index) in studentHeader" />
285 </el-table> 291 </el-table>
286 </el-row> 292 </el-row>
@@ -399,7 +405,7 @@ @@ -399,7 +405,7 @@
399 {{ scoped.row.missPeopleNumber }}</span> 人 405 {{ scoped.row.missPeopleNumber }}</span> 人
400 </span> 406 </span>
401 <span style="margin: 10px 0;" 407 <span style="margin: 10px 0;"
402 - v-for="(item, index) in scoped.row.details.filter(item => !item.right)"> 408 + v-for="(item, index) in scoped.row.details.filter(item => item.option.indexOf('未答') < 0 && !item.right)">
403 选{{ item.option }}:{{ item.students.join("/") }} 409 选{{ item.option }}:{{ item.students.join("/") }}
404 </span> 410 </span>
405 <span></span> 411 <span></span>
@@ -416,7 +422,16 @@ @@ -416,7 +422,16 @@
416 {{ setSubPro(scope.row.questionType) }} 422 {{ setSubPro(scope.row.questionType) }}
417 </template> 423 </template>
418 </el-table-column> 424 </el-table-column>
419 - <el-table-column prop="knowledge" width="100" label="知识点"></el-table-column> 425 + <el-table-column prop="knowledge" width="100" label="知识点">
  426 + <template slot-scope="scoped">
  427 + <el-tooltip effect="dark" :content="_knowledge(scoped.row.knowledge)"
  428 + placement="bottom">
  429 + <span class="overflowText">
  430 + {{ _knowledge(scoped.row.knowledge) }}
  431 + </span>
  432 + </el-tooltip>
  433 + </template>
  434 + </el-table-column>
420 <el-table-column prop="score" width="100" label="满分值"></el-table-column> 435 <el-table-column prop="score" width="100" label="满分值"></el-table-column>
421 <el-table-column width="110" prop="highestScore" label="班最高分"></el-table-column> 436 <el-table-column width="110" prop="highestScore" label="班最高分"></el-table-column>
422 <el-table-column width="110" prop="lowestScore" label="班最低分"></el-table-column> 437 <el-table-column width="110" prop="lowestScore" label="班最低分"></el-table-column>
@@ -433,17 +448,17 @@ @@ -433,17 +448,17 @@
433 <el-table-column prop="classScoringRate" width="120" label="已考得分率"> 448 <el-table-column prop="classScoringRate" width="120" label="已考得分率">
434 <template slot-scope="scoped"> 449 <template slot-scope="scoped">
435 <div v-if="scoped.row.type == 'colspan'"> 450 <div v-if="scoped.row.type == 'colspan'">
436 - {{ scoped.row.classScoringRate }} 451 + {{ scoped.row.scoringRate }}
437 </div> 452 </div>
438 - <div :class="scoped.row.classScoringRate <= lowLevel ? 'lowLevelClass' : ''" v-else>  
439 - {{ Number(scoped.row.classScoringRate).toFixed(2) }}% 453 + <div :class="scoped.row.scoringRate <= lowLevel ? 'lowLevelClass' : ''" v-else>
  454 + {{ Number(scoped.row.scoringRate).toFixed(2) }}%
440 </div> 455 </div>
441 </template> 456 </template>
442 </el-table-column> 457 </el-table-column>
443 <el-table-column prop="correctAnswer" label="答案"><template slot-scope="scoped">{{ 458 <el-table-column prop="correctAnswer" label="答案"><template slot-scope="scoped">{{
444 - scoped.row.correctAnswer == 1 459 + scoped.row.correctAnswer == 1 && scoped.row.questionType == 4
445 ? "✓" 460 ? "✓"
446 - : scoped.row.correctAnswer == 2 461 + : scoped.row.correctAnswer == 2 && scoped.row.questionType == 4
447 ? "✗" 462 ? "✗"
448 : scoped.row.correctAnswer 463 : scoped.row.correctAnswer
449 }}</template> 464 }}</template>
@@ -501,7 +516,7 @@ @@ -501,7 +516,7 @@
501 <el-table-column prop="subjectiveExamScore" label="主观题分"></el-table-column> 516 <el-table-column prop="subjectiveExamScore" label="主观题分"></el-table-column>
502 </el-table-column> 517 </el-table-column>
503 <el-table-column v-for="(item, index) in studentQuestionOptions" :key="index" 518 <el-table-column v-for="(item, index) in studentQuestionOptions" :key="index"
504 - :label="'Q' + item.id" :prop="'score' + item.id"> 519 + :label="'Q' + item.questionIndex" :prop="'score' + item.id">
505 </el-table-column> 520 </el-table-column>
506 </el-table> 521 </el-table>
507 </div> 522 </div>
@@ -511,15 +526,15 @@ @@ -511,15 +526,15 @@
511 <el-table-column prop="studentName" label="姓名"></el-table-column> 526 <el-table-column prop="studentName" label="姓名"></el-table-column>
512 <el-table-column prop="className" label="班级"></el-table-column> 527 <el-table-column prop="className" label="班级"></el-table-column>
513 <el-table-column prop="examScore" label="总分"></el-table-column> 528 <el-table-column prop="examScore" label="总分"></el-table-column>
514 - <el-table-column v-for="(item, index) in studentAnseredOptions" :key="index"  
515 - :label="'Q' + item.id"> 529 + <el-table-column class-name="anwser-column" v-for="(item, index) in studentAnseredOptions"
  530 + :key="index" :label="'Q' + item.questionIndex">
516 <template slot-scope="scope"> 531 <template slot-scope="scope">
517 <span v-if="studentAnsered[index]?.questionType == 5">*</span> 532 <span v-if="studentAnsered[index]?.questionType == 5">*</span>
518 <span v-else-if="scope.row['answer' + item.id]" 533 <span v-else-if="scope.row['answer' + item.id]"
519 - :class="scope.row['isRight' + item.id] ? '' : 'error'"> 534 + :class="scope.row['isRight' + item.id] ? '' : 'red'">
520 {{ scope.row["answer" + item.id] }} 535 {{ scope.row["answer" + item.id] }}
521 </span> 536 </span>
522 - <span v-else :class="scope.row['questionType' + item.id] == 5 ? '' : 'error'">-</span> 537 + <span v-else :class="scope.row['questionType' + item.id] == 5 ? '' : 'red'">-</span>
523 </template> 538 </template>
524 </el-table-column> 539 </el-table-column>
525 </el-table> 540 </el-table>
@@ -535,8 +550,8 @@ @@ -535,8 +550,8 @@
535 </el-table-column> 550 </el-table-column>
536 <el-table-column prop="title" label="参与度" width="120"> 551 <el-table-column prop="title" label="参与度" width="120">
537 <template slot-scope="scoped"> 552 <template slot-scope="scoped">
538 - {{ Number(scoped.row.testCount * 100 / scoped.row.classCount).toFixed(2) }}%  
539 - 553 + {{ Number(scoped.row.testCount * 100 / scoped.row.classCount).toFixed(2) }}%
  554 +
540 </template> 555 </template>
541 </el-table-column> 556 </el-table-column>
542 <el-table-column prop="avg" label="班平均分" width="120" /> 557 <el-table-column prop="avg" label="班平均分" width="120" />
@@ -562,9 +577,10 @@ @@ -562,9 +577,10 @@
562 </el-table-column> 577 </el-table-column>
563 <el-table-column prop="knowledge" label="知识点"> 578 <el-table-column prop="knowledge" label="知识点">
564 <template slot-scope="scoped"> 579 <template slot-scope="scoped">
565 - <el-tooltip effect="dark" :content="scoped.row.knowledge" placement="left"> 580 + <el-tooltip effect="dark" :content="_knowledge(scoped.row.knowledge)"
  581 + placement="bottom">
566 <span class="overflowText"> 582 <span class="overflowText">
567 - {{ scoped.row.knowledge }} 583 + {{ _knowledge(scoped.row.knowledge) }}
568 </span> 584 </span>
569 </el-tooltip> 585 </el-tooltip>
570 </template> 586 </template>
@@ -572,8 +588,7 @@ @@ -572,8 +588,7 @@
572 <el-table-column prop="score" label="满分值" width="120" /> 588 <el-table-column prop="score" label="满分值" width="120" />
573 <el-table-column prop="avgScore" label="年级平均分" width="120"> 589 <el-table-column prop="avgScore" label="年级平均分" width="120">
574 <template slot-scope="scoped"> 590 <template slot-scope="scoped">
575 - <div v-if="scoped.row.type == 'colspan'"  
576 - :class="scoped.row.avgScore <= lowLevel ? 'lowLevelClass' : ''"> 591 + <div v-if="scoped.row.type == 'colspan'">
577 {{ Number(scoped.row.avgScore).toFixed(2) }} % 592 {{ Number(scoped.row.avgScore).toFixed(2) }} %
578 </div> 593 </div>
579 <div v-else> 594 <div v-else>
@@ -581,36 +596,44 @@ @@ -581,36 +596,44 @@
581 </div> 596 </div>
582 </template> 597 </template>
583 </el-table-column> 598 </el-table-column>
584 - <el-table-column prop="gradeScoringRate" label="年级得分率" width="120"> 599 + <el-table-column prop="gradeScoringRate" label="年级已考得分率" width="120">
585 <template slot-scope="scoped"> 600 <template slot-scope="scoped">
586 - <div v-if="scoped.row.type == 'colspan'">  
587 - {{ scoped.row.gradeScoringRate }} 601 + <div v-if="scoped.row.questionIndex == '汇总'">
  602 + {{ scoped.row.gradeScoringRate.toFixed(2) }} %
  603 + </div>
  604 + <div v-else-if="scoped.row.type == 'colspan'">
  605 + {{ scoped.row.gradeScoringRate.toFixed(2) }}
588 </div> 606 </div>
589 - <div v-else="scoped.row.gradeScoringRate"  
590 - :class="scoped.row.gradeScoringRate <= lowLevel ? 'lowLevelClass' : ''">  
591 - {{ Number(scoped.row.gradeScoringRate).toFixed(2) }} % 607 + <div v-else="scoped.row.gradeScoringRate">
  608 + {{ Number(scoped.row.gradeScoringRate * 100).toFixed(2) }} %
592 </div> 609 </div>
593 </template> 610 </template>
594 </el-table-column> 611 </el-table-column>
595 - <el-table-column prop="correctAnswer" label="答案" width="120" /> 612 + <el-table-column prop="correctAnswer" label="答案" width="120">
  613 + <template slot-scope="scoped">
  614 + {{
  615 + scoped.row.correctAnswer == 1 && scoped.row.questionType == 4 ? "✓" :
  616 + scoped.row.correctAnswer == 2 && scoped.row.questionType == 4 ? "✗" :
  617 + scoped.row.correctAnswer
  618 + }}
  619 + </template>
  620 + </el-table-column>
596 <el-table-column v-for="(item, index) in testPaperExamReportOptions" :key="index" 621 <el-table-column v-for="(item, index) in testPaperExamReportOptions" :key="index"
597 :label="item.title" :prop="'count' + index" width="120"> 622 :label="item.title" :prop="'count' + index" width="120">
598 <template slot-scope="scope"> 623 <template slot-scope="scope">
599 <p class="persent"> 624 <p class="persent">
600 {{ 625 {{
601 - scope.row.questionType == "5"  
602 - ? ""  
603 - : scope.row["option" + index]  
604 - ? `${scope.row["option" + index]}(${scope.row["persent" + index] ?? "0"  
605 - })`  
606 - : "" 626 + scope.row.questionType == "5" ? "" : scope.row["option" + index]
  627 + ? `${scope.row["option" + index]}(${scope.row["persent" + index] ?? "0"
  628 + })`
  629 + : ""
607 }} 630 }}
608 </p> 631 </p>
609 </template> 632 </template>
610 </el-table-column> 633 </el-table-column>
611 </el-table> 634 </el-table>
612 </div> 635 </div>
613 - <div v-if="dataType == '3' && currentType == '学生成绩排名'"> 636 + <div v-if="dataType == '3' && currentType == '学生成绩排名'">
614 <el-table class="default-table" :data="testStudentExamReport"> 637 <el-table class="default-table" :data="testStudentExamReport">
615 <el-table-column prop="gradeRank" label="年级排行" /> 638 <el-table-column prop="gradeRank" label="年级排行" />
616 <el-table-column prop="code" label="学号" /> 639 <el-table-column prop="code" label="学号" />
@@ -623,7 +646,8 @@ @@ -623,7 +646,8 @@
623 </div> 646 </div>
624 </el-main> 647 </el-main>
625 <el-dialog class="stem" :visible.sync="stem.visible" :title="'题干'" width="800" :append-to-body="true"> 648 <el-dialog class="stem" :visible.sync="stem.visible" :title="'题干'" width="800" :append-to-body="true">
626 - <iframe v-if="stem && stem.src" :src="stem.src" style="width: 100%;min-height: 400px;" /> 649 + <Preview v-if="stem && stem.src" :src="stem.src" :key="stem.src" />
  650 + <!-- <iframe v-if="stem && stem.src" :src="stem.src" style="width: 100%;min-height: 400px;" /> -->
627 </el-dialog> 651 </el-dialog>
628 <el-dialog :append-to-body="true" :close-on-click-modal="false" title="学生等级设置" 652 <el-dialog :append-to-body="true" :close-on-click-modal="false" title="学生等级设置"
629 :visible.sync="studentLevelDialog" width="900px" @closed="_studentLevelClose"> 653 :visible.sync="studentLevelDialog" width="900px" @closed="_studentLevelClose">
@@ -704,10 +728,11 @@ @@ -704,10 +728,11 @@
704 </el-container> 728 </el-container>
705 </template> 729 </template>
706 <script> 730 <script>
707 -import { formatDate, downloadFile, tablePrint } from "utils"; 731 +import Preview from "@/components/preview";
  732 +import { formatDate, downloadFile, tablePrint, getKnowledge } from "utils";
708 export default { 733 export default {
709 name: "reportDetail", 734 name: "reportDetail",
710 - components: { testScoreSet: () => import("./components/testScoreSet.vue"), }, 735 + components: { testScoreSet: () => import("./components/testScoreSet.vue"), Preview },
711 async created() { 736 async created() {
712 this.role = 737 this.role =
713 738
@@ -733,12 +758,11 @@ export default { @@ -733,12 +758,11 @@ export default {
733 758
734 await this._queryDefaultLevels(); 759 await this._queryDefaultLevels();
735 760
736 - if (this.dataType == '2') {  
737 - await this._examDetail();  
738 - } 761 + await this._examDetail();
739 }, 762 },
740 data() { 763 data() {
741 return { 764 return {
  765 + loading: true,
742 status: 0, 766 status: 0,
743 //导出相关 767 //导出相关
744 paperModifyLog: {}, 768 paperModifyLog: {},
@@ -808,7 +832,7 @@ export default { @@ -808,7 +832,7 @@ export default {
808 // 学生签到情况 832 // 学生签到情况
809 askCheckinStatus: [], 833 askCheckinStatus: [],
810 // 报表详情 834 // 报表详情
811 - testReport: { 835 + examReport: {
812 subjectiveScore: 0, 836 subjectiveScore: 0,
813 subjectiveHighestScore: "", 837 subjectiveHighestScore: "",
814 subjectiveLowestScore: "", 838 subjectiveLowestScore: "",
@@ -859,6 +883,22 @@ export default { @@ -859,6 +883,22 @@ export default {
859 return tit; 883 return tit;
860 }, 884 },
861 setDuration(times) { 885 setDuration(times) {
  886 + let m = parseInt(times / 60);
  887 + let s = parseInt(times % 60);
  888 + console.log(times)
  889 + let aTime;
  890 + if (times == 0) {
  891 + aTime = `0`;
  892 + } else {
  893 + if (m == 0 && times != 0) {
  894 + aTime = `${times}秒`;
  895 + } else if (m != 0 && times != 0) {
  896 + aTime = `${m}分${s}秒`;
  897 + }
  898 + }
  899 + return aTime;
  900 + },
  901 + setDuration1000(times) {
862 let m = parseInt(times / 1000 / 60); 902 let m = parseInt(times / 1000 / 60);
863 let s = parseInt((times / 1000) % 60); 903 let s = parseInt((times / 1000) % 60);
864 let ms = times; 904 let ms = times;
@@ -885,7 +925,7 @@ export default { @@ -885,7 +925,7 @@ export default {
885 name: "试题分析" 925 name: "试题分析"
886 }, { 926 }, {
887 dataType: "3", 927 dataType: "3",
888 - name: "学生成绩排名" 928 + name: "学生成绩排名"
889 }, { 929 }, {
890 dataType: "2", 930 dataType: "2",
891 name: "测验成绩单" 931 name: "测验成绩单"
@@ -930,22 +970,52 @@ export default { @@ -930,22 +970,52 @@ export default {
930 } 970 }
931 }, 971 },
932 methods: { 972 methods: {
  973 + _knowledge(param) {
  974 + return getKnowledge(param);
  975 + },
933 async _examDetail() { 976 async _examDetail() {
934 - const examDetail =  
935 - this.role == "ROLE_PERSONAL"  
936 - ? this.$request.pExamDetail  
937 - : this.$request.examDetail; 977 + if (this.dataType == 2) {
  978 + const examDetail =
  979 + this.role == "ROLE_PERSONAL"
  980 + ? this.$request.pExamDetail
  981 + : this.$request.examDetail;
938 982
939 - let { data, info, status } = await examDetail({  
940 - examId: this.ids[0],  
941 - });  
942 - console.log('detail', data, data.paperModifyLog)  
943 - if (status === 0) {  
944 - if (data.paperModifyLog) {  
945 - this.paperModifyLog = { ...data?.paperModifyLog }; 983 + let { data, info, status } = await examDetail({
  984 + examId: this.ids[0],
  985 + });
  986 +
  987 + if (status === 0) {
  988 + this.examReport = { ...data?.examReport };
  989 +
  990 + if (data.paperModifyLog) {
  991 + this.paperModifyLog = { ...data?.paperModifyLog };
  992 + }
  993 + } else {
  994 + this.$message.error(info);
946 } 995 }
947 - } else {  
948 - this.$message.error(info); 996 + }
  997 + else if (this.dataType == 3) {
  998 + let paramObj = JSON.parse(JSON.stringify(this.fromData))
  999 + if (paramObj.levelType == 0) {
  1000 + paramObj.levels = paramObj.levels.map((item) => {
  1001 + item[1] = ((item[1] / 100) * this.examPaperScore).toFixed(1);
  1002 + item[2] = ((item[2] / 100) * this.examPaperScore).toFixed(1);
  1003 + return item;
  1004 + });
  1005 + }
  1006 +
  1007 + let { data, info, status } = await this.$request.classdiffreport({
  1008 + paperId: this.ids[0],
  1009 + classIds: this.classIds,
  1010 + reportRange: paramObj
  1011 + });
  1012 +
  1013 + if (status != 0) {
  1014 + this.$message.error(info);
  1015 + return;
  1016 + }
  1017 +
  1018 + this.examReport = { ...data };
949 } 1019 }
950 }, 1020 },
951 async _reScore() { 1021 async _reScore() {
@@ -958,6 +1028,7 @@ export default { @@ -958,6 +1028,7 @@ export default {
958 await this._changeType(); 1028 await this._changeType();
959 this.paperModifyLog.modifiedTime = ""; 1029 this.paperModifyLog.modifiedTime = "";
960 this.paperModifyLog.realName = ""; 1030 this.paperModifyLog.realName = "";
  1031 + location.reload();
961 } else { 1032 } else {
962 this.$message.error(info); 1033 this.$message.error(info);
963 } 1034 }
@@ -1004,15 +1075,22 @@ export default { @@ -1004,15 +1075,22 @@ export default {
1004 if (columnIndex == 0) { 1075 if (columnIndex == 0) {
1005 return [3, 1]; 1076 return [3, 1];
1006 } 1077 }
1007 - // else if (columnIndex == 6) {  
1008 - // return [3, 1];  
1009 - // }  
1010 - // else if (columnIndex == 7) {  
1011 - // return [3, 5];  
1012 - // } 1078 + else if (columnIndex == 8) {
  1079 + return [3, 1];
  1080 + }
  1081 + else if (columnIndex == 9) {
  1082 + return [3, this.testQuestionOptions.length];
  1083 + }
  1084 + else if (columnIndex >= 9) {
  1085 + return [0, 0];
  1086 + }
1013 else { 1087 else {
1014 return [1, 1] 1088 return [1, 1]
1015 } 1089 }
  1090 + } else if (rowIndex > this.testQuestions?.length - 3) {
  1091 + if (columnIndex >= 7) {
  1092 + return [0, 0];
  1093 + }
1016 } 1094 }
1017 else { 1095 else {
1018 return [1, 1] 1096 return [1, 1]
@@ -1027,11 +1105,18 @@ export default { @@ -1027,11 +1105,18 @@ export default {
1027 return [3, 1]; 1105 return [3, 1];
1028 } 1106 }
1029 else if (columnIndex == 7) { 1107 else if (columnIndex == 7) {
1030 - return [3, 5]; 1108 + return [3, this.testPaperExamReportOptions.length];
  1109 + }
  1110 + else if (columnIndex >= 7) {
  1111 + return [0, 0];
1031 } 1112 }
1032 else { 1113 else {
1033 return [1, 1] 1114 return [1, 1]
1034 } 1115 }
  1116 + } else if (rowIndex > this.testPaperExamReport?.length - 3) {
  1117 + if (columnIndex >= 5) {
  1118 + return [0, 0];
  1119 + }
1035 } 1120 }
1036 else { 1121 else {
1037 return [1, 1] 1122 return [1, 1]
@@ -1141,7 +1226,6 @@ export default { @@ -1141,7 +1226,6 @@ export default {
1141 } 1226 }
1142 } 1227 }
1143 else if (this.dataType == '3') { 1228 else if (this.dataType == '3') {
1144 -  
1145 let paramObj = JSON.parse(JSON.stringify(this.fromData)) 1229 let paramObj = JSON.parse(JSON.stringify(this.fromData))
1146 1230
1147 if (paramObj.levelType == 0) { 1231 if (paramObj.levelType == 0) {
@@ -1174,9 +1258,48 @@ export default { @@ -1174,9 +1258,48 @@ export default {
1174 1258
1175 }, 1259 },
1176 _print() { 1260 _print() {
1177 - tablePrint("print-content", this.title + "_" + this.currentType); 1261 + var splitNumber = null;
  1262 + var index = null;
  1263 + var printType = 0;
  1264 + var fixedColumn = null;
  1265 + var diffNumber = null;
  1266 + var diffStNumber = null;
  1267 + if (this.dataType == '1' && this.currentType == '学生作答表现') {
  1268 + splitNumber = 18;
  1269 + fixedColumn = 2;
  1270 + diffNumber = 2;
  1271 + diffStNumber = 17;
  1272 + }
  1273 + else if (this.dataType == '2' && this.currentType == '小题分报表') {
  1274 + splitNumber = 18;
  1275 + index = 0;
  1276 + fixedColumn = 2;
  1277 + diffNumber = 2;
  1278 + diffStNumber = 3;
  1279 + printType = '即时测-小题分报表';
  1280 + }
  1281 + else if (this.dataType == '2' && this.currentType == '试题分析') {
  1282 + splitNumber = 17;
  1283 + }
  1284 + else if (this.dataType == '2' && this.currentType == '作答明细') {
  1285 + fixedColumn = 3;
  1286 + diffNumber = 3;
  1287 + diffStNumber = 17;
  1288 + splitNumber = 18;
  1289 + }
  1290 + tablePrint({
  1291 + id: "print-content",
  1292 + title: this.title + "_" + this.currentType,
  1293 + lindex: index,
  1294 + splitParam: splitNumber,
  1295 + printType: printType,
  1296 + fixedColumn: fixedColumn,
  1297 + diffNumber: diffNumber,
  1298 + diffStNumber: diffStNumber
  1299 + });
1178 }, 1300 },
1179 async _changeType() { 1301 async _changeType() {
  1302 + this.loading = true;
1180 if (this.dataType == "1") { 1303 if (this.dataType == "1") {
1181 if (this.currentType == "试题分析") { 1304 if (this.currentType == "试题分析") {
1182 await this._loadAskItemAnalysis(); 1305 await this._loadAskItemAnalysis();
@@ -1216,10 +1339,11 @@ export default { @@ -1216,10 +1339,11 @@ export default {
1216 else if (this.currentType == "试题分析") { 1339 else if (this.currentType == "试题分析") {
1217 await this._testPaperExamReport(); 1340 await this._testPaperExamReport();
1218 } 1341 }
1219 - else if (this.currentType == "学生成绩排名") { 1342 + else if (this.currentType == "学生成绩排名") {
1220 await this._testStudentExamReport(); 1343 await this._testStudentExamReport();
1221 } 1344 }
1222 } 1345 }
  1346 + this.loading = false;
1223 }, 1347 },
1224 async _testPaperExamReport() { 1348 async _testPaperExamReport() {
1225 //主观 1349 //主观
@@ -1251,31 +1375,30 @@ export default { @@ -1251,31 +1375,30 @@ export default {
1251 let response = await request({ 1375 let response = await request({
1252 paperId: this.ids[0], 1376 paperId: this.ids[0],
1253 classIds: this.classIds, 1377 classIds: this.classIds,
  1378 + size: 9999
1254 }); 1379 });
1255 1380
1256 if (response.status != 0) { 1381 if (response.status != 0) {
1257 this.$message.error(response.info); 1382 this.$message.error(response.info);
1258 return; 1383 return;
1259 } 1384 }
1260 -  
1261 - var maxOption = 0;  
1262 - response.data.forEach((item) =>{  
1263 - if(item.details){  
1264 - if(maxOption < item.details.length)  
1265 - { 1385 +
  1386 + var maxOption = 0;
  1387 + response.data.forEach((item) => {
  1388 + if (item.details) {
  1389 + if (maxOption < item.details.length) {
1266 maxOption = item.details.length; 1390 maxOption = item.details.length;
1267 - } 1391 + }
1268 } 1392 }
1269 -  
1270 - })  
1271 -  
1272 - let optionsList = [];  
1273 1393
1274 - for(var io=0;io<maxOption;io++){ 1394 + })
  1395 +
  1396 + let optionsList = [];
  1397 +
  1398 + for (var io = 0; io < maxOption; io++) {
1275 optionsList.push({}) 1399 optionsList.push({})
1276 } 1400 }
1277 1401
1278 - // let optionsList = [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}];  
1279 1402
1280 let tableData = response.data?.map((item) => { 1403 let tableData = response.data?.map((item) => {
1281 1404
@@ -1298,6 +1421,7 @@ export default { @@ -1298,6 +1421,7 @@ export default {
1298 1421
1299 let params = {}; 1422 let params = {};
1300 1423
  1424 +
1301 const detail = item?.details ?? []; 1425 const detail = item?.details ?? [];
1302 1426
1303 let lastOPtion = detail?.find((item) => { 1427 let lastOPtion = detail?.find((item) => {
@@ -1308,7 +1432,7 @@ export default { @@ -1308,7 +1432,7 @@ export default {
1308 }); 1432 });
1309 1433
1310 optionsList.map((items, index) => { 1434 optionsList.map((items, index) => {
1311 - if (index != 4) { 1435 + if (index < maxOption - 1) {
1312 params["count" + index] = 1436 params["count" + index] =
1313 defaultArr[index]?.option != "未答" 1437 defaultArr[index]?.option != "未答"
1314 ? defaultArr[index]?.count 1438 ? defaultArr[index]?.count
@@ -1319,9 +1443,9 @@ export default { @@ -1319,9 +1443,9 @@ export default {
1319 : ""; 1443 : "";
1320 params["option" + index] = 1444 params["option" + index] =
1321 defaultArr[index]?.option != "未答" 1445 defaultArr[index]?.option != "未答"
1322 - ? defaultArr[index]?.option == 1 1446 + ? defaultArr[index]?.option == 1 && item.questionType == 4
1323 ? "✓" 1447 ? "✓"
1324 - : defaultArr[index]?.option == 2 1448 + : defaultArr[index]?.option == 2 && item.questionType == 4
1325 ? "✗" 1449 ? "✗"
1326 : defaultArr[index]?.option 1450 : defaultArr[index]?.option
1327 : ""; 1451 : "";
@@ -1330,12 +1454,10 @@ export default { @@ -1330,12 +1454,10 @@ export default {
1330 items["title"] = "未答"; 1454 items["title"] = "未答";
1331 params["count" + index] = lastOPtion?.count ?? ""; 1455 params["count" + index] = lastOPtion?.count ?? "";
1332 params["persent" + index] = lastOPtion?.persent ?? ""; 1456 params["persent" + index] = lastOPtion?.persent ?? "";
1333 - params["option" + index] = "?"; 1457 + params["option" + index] = "未答";
1334 } 1458 }
1335 }); 1459 });
1336 1460
1337 -  
1338 -  
1339 return { 1461 return {
1340 ...item, 1462 ...item,
1341 ...params, 1463 ...params,
@@ -1347,30 +1469,29 @@ export default { @@ -1347,30 +1469,29 @@ export default {
1347 }); 1469 });
1348 1470
1349 this.testPaperExamReportOptions = [...optionsList]; 1471 this.testPaperExamReportOptions = [...optionsList];
1350 -  
1351 this.testPaperExamReport.push({ 1472 this.testPaperExamReport.push({
1352 questionIndex: "汇总", 1473 questionIndex: "汇总",
1353 - questionType: "客观题",  
1354 - score: objective.sum,  
1355 - avgScore: objective.avg == 0 ? 0 : Number(objective.avg).toFixed(2),  
1356 - gradeScoringRate: objective.avg == 0 ? 0 : Number(objective.avg * 100 / objective.sum).toFixed(2), 1474 + questionType: "主观题",
  1475 + score: this.examReport.subjectiveScore,
  1476 + avgScore: this.examReport.subjectiveAvgScore,
  1477 + gradeScoringRate: this.examReport.subjectiveRate,
1357 correctAnswer: "备注" 1478 correctAnswer: "备注"
1358 }) 1479 })
1359 1480
1360 this.testPaperExamReport.push({ 1481 this.testPaperExamReport.push({
1361 - questionIndex: "观题", 1482 + questionIndex: "观题",
1362 type: "colspan", 1483 type: "colspan",
1363 - knowledge: subjective.sum,  
1364 - score: subjective.avg == 0 ? 0 : Number(subjective.avg).toFixed(2),  
1365 - avgScore: subjective.avg == 0 ? 0 : Number(subjective.avg * 100 / subjective.sum).toFixed(2) 1484 + knowledge: this.examReport.objectiveScore,
  1485 + score: this.examReport.objectiveAvgScore,
  1486 + avgScore: this.examReport.objectiveRate
1366 }) 1487 })
1367 1488
1368 this.testPaperExamReport.push({ 1489 this.testPaperExamReport.push({
1369 questionIndex: "合计", 1490 questionIndex: "合计",
1370 type: "colspan", 1491 type: "colspan",
1371 - knowledge: summary.sum,  
1372 - score: summary.avg == 0 ? 0 : Number(summary.avg).toFixed(2),  
1373 - avgScore: summary.avg == 0 ? 0 : Number(summary.avg * 100 / summary.sum).toFixed(2) 1492 + knowledge: this.examReport.examPaperScore,
  1493 + score: this.examReport.avg,
  1494 + avgScore: this.examReport.rate
1374 }) 1495 })
1375 }, 1496 },
1376 async _testStudentExamReport() { 1497 async _testStudentExamReport() {
@@ -1466,50 +1587,43 @@ export default { @@ -1466,50 +1587,43 @@ export default {
1466 1587
1467 var studentResults = []; 1588 var studentResults = [];
1468 1589
1469 - for (var iheader = 0; iheader < 3; iheader++) {  
1470 - for (  
1471 - var imapping = 0;  
1472 - imapping < this.studentMapping.length;  
1473 - imapping++  
1474 - ) {  
1475 - studentHeaders.push({  
1476 - prop: this.studentMapping[imapping].key + "_" + iheader,  
1477 - label: this.studentMapping[imapping].label,  
1478 - key: this.studentMapping[imapping].key,  
1479 - });  
1480 - } 1590 + for (var iheader = 0; iheader < 17; iheader++) {
  1591 + studentHeaders.push({
  1592 + prop: "column" + iheader,
  1593 + label: this.studentMapping[iheader % this.studentMapping.length].label,
  1594 + key: this.studentMapping[iheader % this.studentMapping.length].key,
  1595 + });
1481 } 1596 }
1482 1597
  1598 + var studentList = response.data.gradeExamStudentReports;
  1599 +
1483 this.studentHeader = [...studentHeaders]; 1600 this.studentHeader = [...studentHeaders];
1484 1601
1485 - for (var isp = 0; isp < response.data.gradeExamStudentReports.length; isp++) { 1602 + var stuRow = Math.ceil(studentList.length * 1.00 / 3);
1486 1603
1487 - var item = {}; 1604 + for (var isp = 0; isp < studentList.length; isp++) {
1488 1605
1489 - for (  
1490 - var iamapping = 0;  
1491 - iamapping < studentHeaders.length;  
1492 - iamapping++  
1493 - ) {  
1494 - var currentData = response.data.gradeExamStudentReports[isp]; 1606 + var row = isp % stuRow;
1495 1607
1496 - if (!currentData) continue; 1608 + var col = parseInt(isp / stuRow);
1497 1609
1498 - var currentHeader = studentHeaders[iamapping]; 1610 + var item = {};
1499 1611
1500 - item[currentHeader.prop] = currentData[currentHeader.key]; 1612 + if (studentResults.length <= row)
  1613 + studentResults.push({});
1501 1614
1502 - if (  
1503 - iamapping >= this.studentMapping.length - 1 &&  
1504 - iamapping % this.studentMapping.length == 0  
1505 - ) {  
1506 - isp += 1;  
1507 - }  
1508 - } 1615 + item = studentResults[row];
1509 1616
1510 - studentResults.push(item);  
1511 - } 1617 + var studentResult = studentList[isp];
1512 1618
  1619 + item["column" + (6 * col)] = studentResult.code;
  1620 + item["column" + (6 * col + 1)] = studentResult.name;
  1621 + item["column" + (6 * col + 2)] = studentResult.gradeRank;
  1622 + item["column" + (6 * col + 3)] = studentResult.exam;
  1623 + item["column" + (6 * col + 4)] = studentResult.objective;
  1624 + item["column" + (6 * col + 5)] = studentResult.subjective;
  1625 + }
  1626 + console.log(studentResults)
1513 this.studentList = [...studentResults]; 1627 this.studentList = [...studentResults];
1514 1628
1515 var show4Area = true; //显示4选项区域 1629 var show4Area = true; //显示4选项区域
@@ -1530,7 +1644,9 @@ export default { @@ -1530,7 +1644,9 @@ export default {
1530 1644
1531 for (var i = 0; i < questionList.length; i++) { 1645 for (var i = 0; i < questionList.length; i++) {
1532 1646
1533 - var correctAnswerValue = questionList[i].correctAnswer == "1" ? "✓" : questionList[i].correctAnswer == 2 ? "✗" : questionList[i].correctAnswer; 1647 + var correctAnswerValue =
  1648 + questionList[i].questionType == 4 && questionList[i].correctAnswer == "1" ? "✓" :
  1649 + questionList[i].questionType == 4 && questionList[i].correctAnswer == "2" ? "✗" : questionList[i].correctAnswer;
1534 1650
1535 var missCount = 0; 1651 var missCount = 0;
1536 1652
@@ -1562,6 +1678,10 @@ export default { @@ -1562,6 +1678,10 @@ export default {
1562 minOptions = 2; 1678 minOptions = 2;
1563 optionNumList.push(2); 1679 optionNumList.push(2);
1564 } 1680 }
  1681 + if (questionList[i].questionType == 3) {
  1682 + if (minOptions > 4) minOptions = 4;
  1683 + }
  1684 +
1565 } 1685 }
1566 1686
1567 show4Area = minOptions <= 4; 1687 show4Area = minOptions <= 4;
@@ -1593,7 +1713,9 @@ export default { @@ -1593,7 +1713,9 @@ export default {
1593 1713
1594 var currentRow = areaList[row]; 1714 var currentRow = areaList[row];
1595 1715
1596 - var correctAnswerValue = question.correctAnswer == "1" ? "✓" : question.correctAnswer == "2" ? "✗" : question.correctAnswer; 1716 + var correctAnswerValue =
  1717 + question.questionType == 4 && question.correctAnswer == "1" ? "✓" :
  1718 + question.questionType == 4 && question.correctAnswer == "2" ? "✗" : question.correctAnswer;
1597 1719
1598 var details = question.details.filter(fl => { 1720 var details = question.details.filter(fl => {
1599 return fl.option.indexOf('未答') < 0; 1721 return fl.option.indexOf('未答') < 0;
@@ -1615,8 +1737,8 @@ export default { @@ -1615,8 +1737,8 @@ export default {
1615 var questionColumn = 'column' + Number(6 * col + ilr); 1737 var questionColumn = 'column' + Number(6 * col + ilr);
1616 1738
1617 if (details.length <= 4) { 1739 if (details.length <= 4) {
1618 -  
1619 - var questionOption = questionDetail ? (questionDetail.option == "1" ? "✓" : questionDetail.option == "2" ? "✗" : questionDetail.option) : "- -" 1740 + var questionOption = questionDetail ? (question.questionType == 4 && questionDetail.option == "1" ? "✓" :
  1741 + question.questionType == 4 && questionDetail.option == "2" ? "✗" : questionDetail.option) : "- -"
1620 1742
1621 if (questionOption != "- -") questionOption += "(" + questionDetail.persent + ")"; 1743 if (questionOption != "- -") questionOption += "(" + questionDetail.persent + ")";
1622 1744
@@ -1662,7 +1784,8 @@ export default { @@ -1662,7 +1784,8 @@ export default {
1662 1784
1663 var currentRow = areaList[row]; 1785 var currentRow = areaList[row];
1664 1786
1665 - var correctAnswerValue = question.correctAnswer == "1" ? "✓" : question.correctAnswer == 2 ? "✗" : question.correctAnswer; 1787 + var correctAnswerValue = question.questionType == 4 && question.correctAnswer == "1" ? "✓" :
  1788 + question.questionType == 4 && question.correctAnswer == "2" ? "✗" : question.correctAnswer;
1666 1789
1667 for (var ilr = 0; ilr < 9; ilr++) { 1790 for (var ilr = 0; ilr < 9; ilr++) {
1668 1791
@@ -1719,7 +1842,8 @@ export default { @@ -1719,7 +1842,8 @@ export default {
1719 1842
1720 var currentRow = areaList[row]; 1843 var currentRow = areaList[row];
1721 1844
1722 - var correctAnswerValue = question.correctAnswer == "1" ? "✓" : question.correctAnswer == 2 ? "✗" : question.correctAnswer; 1845 + var correctAnswerValue = question.questionType == 4 && question.correctAnswer == "1" ? "✓" :
  1846 + question.questionType == 4 && question.correctAnswer == "2" ? "✗" : question.correctAnswer;
1723 1847
1724 for (var ilr = 0; ilr < 12; ilr++) { 1848 for (var ilr = 0; ilr < 12; ilr++) {
1725 1849
@@ -1774,7 +1898,8 @@ export default { @@ -1774,7 +1898,8 @@ export default {
1774 : this.$request.periodDetail; 1898 : this.$request.periodDetail;
1775 1899
1776 let response = await request({ 1900 let response = await request({
1777 - periodIds: this.ids 1901 + periodIds: this.ids,
  1902 + size: 9999
1778 }); 1903 });
1779 1904
1780 if (response.status != 0) { 1905 if (response.status != 0) {
@@ -1794,7 +1919,8 @@ export default { @@ -1794,7 +1919,8 @@ export default {
1794 1919
1795 let listResponse = await listRequest({ 1920 let listResponse = await listRequest({
1796 periodIds: this.ids, 1921 periodIds: this.ids,
1797 - classIds: this.classIds 1922 + classIds: this.classIds,
  1923 + size: 9999
1798 }); 1924 });
1799 1925
1800 if (listResponse.status != 0) { 1926 if (listResponse.status != 0) {
@@ -1827,12 +1953,13 @@ export default { @@ -1827,12 +1953,13 @@ export default {
1827 if (detail.length > this.askPeriodQuestionItemOptions.length) { 1953 if (detail.length > this.askPeriodQuestionItemOptions.length) {
1828 this.askPeriodQuestionItemOptions = [...detail]; 1954 this.askPeriodQuestionItemOptions = [...detail];
1829 } 1955 }
  1956 +
1830 detail.map((items, index) => { 1957 detail.map((items, index) => {
1831 params["isRight" + index] = items.isRight; 1958 params["isRight" + index] = items.isRight;
1832 params["answer" + index] = 1959 params["answer" + index] =
1833 - items.answer == 1 1960 + items.answer == "1" && items.questionType == 4
1834 ? "✓" 1961 ? "✓"
1835 - : items.answer == 2 1962 + : items.answer == "2" && items.questionType == 4
1836 ? "✗" 1963 ? "✗"
1837 : items.answer; 1964 : items.answer;
1838 }); 1965 });
@@ -1878,7 +2005,6 @@ export default { @@ -1878,7 +2005,6 @@ export default {
1878 2005
1879 this.askCheckinStatus = response.data.list; 2006 this.askCheckinStatus = response.data.list;
1880 2007
1881 - console.log(detailResponse, response)  
1882 2008
1883 }, 2009 },
1884 async _loadTestDetail() { 2010 async _loadTestDetail() {
@@ -1934,15 +2060,16 @@ export default { @@ -1934,15 +2060,16 @@ export default {
1934 if (detail.length > optionsList.length) { 2060 if (detail.length > optionsList.length) {
1935 optionsList = [...detail]; 2061 optionsList = [...detail];
1936 } 2062 }
  2063 +
1937 detail.map((items, index) => { 2064 detail.map((items, index) => {
1938 params["que" + items.id] = items.id; 2065 params["que" + items.id] = items.id;
1939 params["score" + items.id] = String(items.score).includes(".") 2066 params["score" + items.id] = String(items.score).includes(".")
1940 ? Number(items.score) 2067 ? Number(items.score)
1941 : items.score; 2068 : items.score;
1942 params["answer" + items.id] = 2069 params["answer" + items.id] =
1943 - items.answer == 1 ? "✓" : items.answer == 2 ? "✗" : items.answer; 2070 + items.questionType == 4 && items.answer == "1" ? "✓" : items.questionType == 4 && items.answer == "2" ? "✗" : items.answer;
1944 params["isRight" + items.id] = items.isRight; 2071 params["isRight" + items.id] = items.isRight;
1945 - params["questionType" + items.id] = items.questionType; 2072 + params["questionType" + items.id] = item.questionType;
1946 }); 2073 });
1947 return { 2074 return {
1948 ...item, 2075 ...item,
@@ -2017,22 +2144,22 @@ export default { @@ -2017,22 +2144,22 @@ export default {
2017 min: 9999, 2144 min: 9999,
2018 answeredRate: 0 2145 answeredRate: 0
2019 }; 2146 };
2020 - 2147 +
2021 var maxOption = 0; 2148 var maxOption = 0;
2022 -  
2023 - data?.list?.forEach((item) =>{  
2024 -  
2025 - const detail = JSON.parse(item.detail);  
2026 -  
2027 - if(maxOption < detail.length)  
2028 - { 2149 +
  2150 + data?.list?.forEach((item) => {
  2151 +
  2152 + const detail = JSON.parse(item.detail);
  2153 +
  2154 + if (maxOption < detail.length) {
  2155 +
2029 maxOption = detail.length; 2156 maxOption = detail.length;
2030 - } 2157 + }
2031 }) 2158 })
2032 -  
2033 - let optionsList = [];  
2034 2159
2035 - for(var io=0;io<maxOption;io++){ 2160 + let optionsList = [];
  2161 +
  2162 + for (var io = 0; io < maxOption; io++) {
2036 optionsList.push({}) 2163 optionsList.push({})
2037 } 2164 }
2038 2165
@@ -2059,21 +2186,21 @@ export default { @@ -2059,21 +2186,21 @@ export default {
2059 : ""; 2186 : "";
2060 params["option" + index] = 2187 params["option" + index] =
2061 defaultArr[index]?.option != "未答" 2188 defaultArr[index]?.option != "未答"
2062 - ? defaultArr[index]?.option == 1 2189 + ? defaultArr[index]?.option == "1" && item?.questionType == 4
2063 ? "✓" 2190 ? "✓"
2064 - : defaultArr[index]?.option == 2 2191 + : defaultArr[index]?.option == "2" && item?.questionType == 4
2065 ? "✗" 2192 ? "✗"
2066 : defaultArr[index]?.option 2193 : defaultArr[index]?.option
2067 : ""; 2194 : "";
  2195 +
2068 items["title"] = "选项" + (index + 1); 2196 items["title"] = "选项" + (index + 1);
2069 - // if (index != 4) {  
2070 -  
2071 - // } else {  
2072 - // items["title"] = "未答";  
2073 - // params["count" + index] = lastOPtion.count;  
2074 - // params["persent" + index] = lastOPtion.persent;  
2075 - // params["option" + index] = "?";  
2076 - // } 2197 + if (index >= optionsList.length - 1) {
  2198 + items["title"] = "未答";
  2199 + params["count" + index] = lastOPtion.count;
  2200 + params["persent" + index] = lastOPtion.persent;
  2201 + params["option" + index] = "未答";
  2202 + }
  2203 +
2077 }); 2204 });
2078 2205
2079 summary.sum += parseFloat(item.score); 2206 summary.sum += parseFloat(item.score);
@@ -2117,47 +2244,46 @@ export default { @@ -2117,47 +2244,46 @@ export default {
2117 questionIndex: "汇总", 2244 questionIndex: "汇总",
2118 questionType: "主观题", 2245 questionType: "主观题",
2119 //满分值 2246 //满分值
2120 - score: subjective.sum, 2247 + score: this.examReport.subjectiveScore,
2121 //最高分 2248 //最高分
2122 - highestScore: subjective.max, 2249 + highestScore: this.examReport.subjectiveHighestScore,
2123 //最低分 2250 //最低分
2124 - lowestScore: subjective.min == 9999 ? 0 : subjective.min, 2251 + lowestScore: this.examReport.subjectiveLowestScore,
2125 //平均分 2252 //平均分
2126 - avgScore: subjective.avg == 0 ? 0 : Number(subjective.avg).toFixed(2), 2253 + avgScore: this.examReport.subjectiveAvgScore,
2127 //已考得分率 2254 //已考得分率
2128 - classScoringRate: subjective.sum == 0 ? 0 : Number(subjective.avg * 100 / subjective.sum).toFixed(2) 2255 + scoringRate: this.examReport.subjectiveScoringRate,
  2256 + correctAnswer: "备注"
2129 }) 2257 })
2130 2258
2131 this.testQuestions.push({ 2259 this.testQuestions.push({
2132 questionIndex: "客观题", 2260 questionIndex: "客观题",
2133 type: "colspan", 2261 type: "colspan",
2134 //满分值 2262 //满分值
2135 - knowledge: objective.sum, 2263 + knowledge: this.examReport.objectiveScore,
2136 //最高分 2264 //最高分
2137 - score: objective.max, 2265 + score: this.examReport.objectiveHighestScore,
2138 //最低分 2266 //最低分
2139 - highestScore: objective.min == 9999 ? 0 : objective.min, 2267 + highestScore: this.examReport.objectiveLowestScore,
2140 //平均分 2268 //平均分
2141 - lowestScore: objective.avg == 0 ? 0 : Number(objective.avg).toFixed(2), 2269 + lowestScore: this.examReport.objectiveAvgScore,
2142 //已考得分率 2270 //已考得分率
2143 - avgScore: objective.sum == 0 ? 0 : Number(objective.avg * 100 / objective.sum).toFixed(2) 2271 + avgScore: this.examReport.objectiveScoringRate
2144 }) 2272 })
2145 2273
2146 -  
2147 -  
2148 this.testQuestions.push({ 2274 this.testQuestions.push({
2149 questionIndex: "合计", 2275 questionIndex: "合计",
2150 type: "colspan", 2276 type: "colspan",
2151 //满分值 2277 //满分值
2152 - knowledge: summary.sum, 2278 + knowledge: this.examReport.examPaperScore,
2153 //最高分 2279 //最高分
2154 - score: summary.max, 2280 + score: this.examReport.highestScore,
2155 //最低分 2281 //最低分
2156 - highestScore: summary.min == 9999 ? 0 : summary.min, 2282 + highestScore: this.examReport.lowestScore,
2157 //平均分 2283 //平均分
2158 - lowestScore: summary.avg == 0 ? 0 : Number(summary.avg).toFixed(2), 2284 + lowestScore: this.examReport.avgScore,
2159 //已考得分率 2285 //已考得分率
2160 - avgScore: summary.sum == 0 ? 0 : Number(summary.avg / summary.sum * 100).toFixed(2) 2286 + avgScore: this.examReport.scoringRate
2161 }) 2287 })
2162 }, 2288 },
2163 keydownRange(event) { 2289 keydownRange(event) {
@@ -2192,9 +2318,12 @@ export default { @@ -2192,9 +2318,12 @@ export default {
2192 margin-top: 20px; 2318 margin-top: 20px;
2193 } 2319 }
2194 2320
2195 -.red {  
2196 - color: #f30;  
2197 -} 2321 +
  2322 +
  2323 +
  2324 +// .red {
  2325 +// color: #f30;
  2326 +// }
2198 2327
2199 .dia-tab-box { 2328 .dia-tab-box {
2200 font-size: 14px; 2329 font-size: 14px;
src/views/basic/askTestQuestion/gradeAnalysisDetail.vue
1 <template> 1 <template>
2 - <el-container class="default-body"> 2 + <el-container class="default-body default-body-detail">
3 <el-header> 3 <el-header>
4 <back-box class="detailBack"> 4 <back-box class="detailBack">
5 <template slot="title"> 5 <template slot="title">
@@ -45,7 +45,7 @@ @@ -45,7 +45,7 @@
45 <span class="line-subfix">试卷名称:</span> 45 <span class="line-subfix">试卷名称:</span>
46 <el-tooltip effect="dark" :content="item.paperName" placement="left"> 46 <el-tooltip effect="dark" :content="item.paperName" placement="left">
47 <span class="line-value">{{ item.paperName }}</span> 47 <span class="line-value">{{ item.paperName }}</span>
48 - </el-tooltip> 48 + </el-tooltip>
49 </div> 49 </div>
50 <div class="row-line"> 50 <div class="row-line">
51 <span class="line-subfix">测验时间:</span> 51 <span class="line-subfix">测验时间:</span>
@@ -183,7 +183,7 @@ @@ -183,7 +183,7 @@
183 {{ scoped.row.missPeopleNumber }}</span> 人 183 {{ scoped.row.missPeopleNumber }}</span> 人
184 </span> 184 </span>
185 <span style="margin: 10px 0;" 185 <span style="margin: 10px 0;"
186 - v-for="(item, index) in scoped.row.details.filter(item => !item.right)"> 186 + v-for="(item, index) in scoped.row.details.filter(item => item.option.indexOf('未答') < 0 && !item.right)">
187 选{{ item.option }}:{{ item.students.join("/") }} 187 选{{ item.option }}:{{ item.students.join("/") }}
188 </span> 188 </span>
189 <span></span> 189 <span></span>
@@ -199,7 +199,7 @@ @@ -199,7 +199,7 @@
199 <el-button type="default" style="margin-left:0px" :size="'small'" 199 <el-button type="default" style="margin-left:0px" :size="'small'"
200 @click="_changePage('next')">下一页</el-button> 200 @click="_changePage('next')">下一页</el-button>
201 </div> 201 </div>
202 - <div style="display: none;"> 202 + <div style="height: 1px;overflow: hidden;">
203 <div id="test-print"> 203 <div id="test-print">
204 <div v-for="(testTranscript, index) in testTranscriptDatas"> 204 <div v-for="(testTranscript, index) in testTranscriptDatas">
205 <div style="margin-top:20px"> 205 <div style="margin-top:20px">
@@ -313,7 +313,7 @@ @@ -313,7 +313,7 @@
313 {{ scoped.row.missPeopleNumber }}</span> 人 313 {{ scoped.row.missPeopleNumber }}</span> 人
314 </span> 314 </span>
315 <span style="margin: 10px 0;" 315 <span style="margin: 10px 0;"
316 - v-for="(item, index) in scoped.row.details.filter(item => !item.right)"> 316 + v-for="(item, index) in scoped.row.details.filter(item => item.option.indexOf('未答') < 0 && !item.right)">
317 选{{ item.option }}:{{ item.students.join("/") }} 317 选{{ item.option }}:{{ item.students.join("/") }}
318 </span> 318 </span>
319 <span></span> 319 <span></span>
@@ -325,10 +325,9 @@ @@ -325,10 +325,9 @@
325 </div> 325 </div>
326 </div> 326 </div>
327 </div> 327 </div>
328 -  
329 </el-tab-pane> 328 </el-tab-pane>
330 <el-tab-pane :name="'班级对比情况'" :label="`班级对比情况`" style="padding: 0 20px"> 329 <el-tab-pane :name="'班级对比情况'" :label="`班级对比情况`" style="padding: 0 20px">
331 - <div style="float: right;margin-bottom: 20px;"> 330 + <div class="print-hidden" style="float: right;margin-bottom: 20px;">
332 <el-button @click="_studentLevelSet" class="green-el-button" type="primary"> 331 <el-button @click="_studentLevelSet" class="green-el-button" type="primary">
333 设置学生成绩等级 332 设置学生成绩等级
334 </el-button> 333 </el-button>
@@ -382,7 +381,7 @@ @@ -382,7 +381,7 @@
382 </el-table> 381 </el-table>
383 </el-tab-pane> 382 </el-tab-pane>
384 <el-tab-pane :name="'试题分析表'" :label="`试题分析表`" style="padding: 0 20px"> 383 <el-tab-pane :name="'试题分析表'" :label="`试题分析表`" style="padding: 0 20px">
385 - <div style="float: right;margin-bottom: 20px;"> 384 + <div class="print-hidden" style="float: right;margin-bottom: 20px;">
386 单题低分率 385 单题低分率
387 <el-input-number class="parent-number" v-model="lowLevel" :min="1" :max="100" label="低分率"> 386 <el-input-number class="parent-number" v-model="lowLevel" :min="1" :max="100" label="低分率">
388 </el-input-number> 387 </el-input-number>
@@ -399,11 +398,16 @@ @@ -399,11 +398,16 @@
399 </el-table-column> 398 </el-table-column>
400 <el-table-column prop="knowledge" label="知识点"> 399 <el-table-column prop="knowledge" label="知识点">
401 <template slot-scope="scoped"> 400 <template slot-scope="scoped">
402 - <el-tooltip effect="dark" :content="scoped.row.knowledge" placement="left">  
403 - <span class="overflowText">  
404 - {{ scoped.row.knowledge }}  
405 - </span>  
406 - </el-tooltip> 401 + <div v-if="scoped.row.type == 'colspan'">
  402 + {{ scoped.row.knowledge }}
  403 + </div>
  404 + <div v-else>
  405 + <el-tooltip effect="dark" :content="_knowledge(scoped.row.knowledge)" placement="bottom">
  406 + <span class="overflowText">
  407 + {{ _knowledge(scoped.row.knowledge) }}
  408 + </span>
  409 + </el-tooltip>
  410 + </div>
407 </template> 411 </template>
408 </el-table-column> 412 </el-table-column>
409 <el-table-column prop="score" label="满分值" width="120"> 413 <el-table-column prop="score" label="满分值" width="120">
@@ -427,11 +431,11 @@ @@ -427,11 +431,11 @@
427 </div> 431 </div>
428 </template> 432 </template>
429 </el-table-column> 433 </el-table-column>
430 - <el-table-column prop="gradeScoringRate" label="年级得分率" width="120"> 434 + <el-table-column prop="gradeScoringRate" label="年级已考得分率" width="150">
431 <template slot-scope="scoped"> 435 <template slot-scope="scoped">
432 <div v-if="scoped.row.type == 'colspan'" 436 <div v-if="scoped.row.type == 'colspan'"
433 :class="scoped.row.gradeScoringRate < lowLevel ? 'lowLevelClass' : ''"> 437 :class="scoped.row.gradeScoringRate < lowLevel ? 'lowLevelClass' : ''">
434 - {{ scoped.row.gradeScoringRate }} % 438 + {{ Number(scoped.row.gradeScoringRate).toFixed(2) }} %
435 </div> 439 </div>
436 <div v-else="scoped.row.gradeScoringRate" 440 <div v-else="scoped.row.gradeScoringRate"
437 :class="Number(scoped.row.gradeScoringRate * 100) < lowLevel ? 'lowLevelClass' : ''"> 441 :class="Number(scoped.row.gradeScoringRate * 100) < lowLevel ? 'lowLevelClass' : ''">
@@ -458,7 +462,7 @@ @@ -458,7 +462,7 @@
458 </el-table> 462 </el-table>
459 </el-tab-pane> 463 </el-tab-pane>
460 <el-tab-pane :name="'学生成绩排行'" :label="`学生成绩排行`" style="padding: 0 20px"> 464 <el-tab-pane :name="'学生成绩排行'" :label="`学生成绩排行`" style="padding: 0 20px">
461 - <div style="float: right;margin-bottom: 20px;"> 465 + <div class="print-hidden" style="float: right;margin-bottom: 20px;">
462 <el-button @click="_import" type="primary" class="opration-btn" icon="el-icon-upload2">导出报表</el-button> 466 <el-button @click="_import" type="primary" class="opration-btn" icon="el-icon-upload2">导出报表</el-button>
463 <el-button @click="_print" type="primary" class="opration-btn" icon="el-icon-printer">打印报表</el-button> 467 <el-button @click="_print" type="primary" class="opration-btn" icon="el-icon-printer">打印报表</el-button>
464 </div> 468 </div>
@@ -553,7 +557,7 @@ @@ -553,7 +557,7 @@
553 </template> 557 </template>
554 558
555 <script> 559 <script>
556 -import { formatDate, downloadFile, tablePrint } from "utils"; 560 +import { formatDate, downloadFile, tablePrint, getKnowledge } from "utils";
557 export default { 561 export default {
558 data() { 562 data() {
559 return { 563 return {
@@ -577,6 +581,24 @@ export default { @@ -577,6 +581,24 @@ export default {
577 question10List: [], 581 question10List: [],
578 questionTotal: [], 582 questionTotal: [],
579 }, 583 },
  584 + // 报表详情
  585 + examReport: {
  586 + subjectiveScore: 0,
  587 + subjectiveHighestScore: "",
  588 + subjectiveLowestScore: "",
  589 + subjectiveAvgScore: "",
  590 + subjectiveClassScoringRate: "",
  591 + objectiveScore: "",
  592 + objectiveHighestScore: "",
  593 + objectiveLowestScore: "",
  594 + objectiveAvgScore: "",
  595 + objectiveClassScoringRate: "",
  596 + examPaperScore: "",
  597 + highestScore: "",
  598 + lowestScore: "",
  599 + avgScore: "",
  600 + classScoringRate: "",
  601 + },
580 currentPage: 0, 602 currentPage: 0,
581 totalPage: 0, 603 totalPage: 0,
582 checkedClassInfos: [], 604 checkedClassInfos: [],
@@ -652,8 +674,29 @@ export default { @@ -652,8 +674,29 @@ export default {
652 this.checkedClassInfos = this.classInfos?.map(item => item.classId); 674 this.checkedClassInfos = this.classInfos?.map(item => item.classId);
653 this.tabType = "成绩测验单"; 675 this.tabType = "成绩测验单";
654 await this._queryDefaultLevels(); 676 await this._queryDefaultLevels();
  677 + await this._examDetail();
655 }, 678 },
656 methods: { 679 methods: {
  680 + _knowledge(knowledgeParam) {
  681 + return getKnowledge(knowledgeParam)
  682 + },
  683 + async _examDetail() {
  684 +
  685 + const request = this.$request.gclassdiffReport;
  686 +
  687 + let { data, info, status } = await request({
  688 + paperId: this.paperId,
  689 + classIds: this.checkedClassInfos,
  690 + });
  691 +
  692 + if (status != 0) {
  693 + this.$message.error(info);
  694 + return;
  695 + }
  696 +
  697 + this.examReport = { ...data };
  698 +
  699 + },
657 async _anys() { 700 async _anys() {
658 this.queryLoading = true; 701 this.queryLoading = true;
659 switch (this.tabType) { 702 switch (this.tabType) {
@@ -762,12 +805,20 @@ export default { @@ -762,12 +805,20 @@ export default {
762 return [3, 1]; 805 return [3, 1];
763 } 806 }
764 else if (columnIndex == 7) { 807 else if (columnIndex == 7) {
765 - return [3, 5]; 808 + return [3, this.testPaperExamReportOptions.length];
  809 + }
  810 + else if (columnIndex >= 7) {
  811 + return [0, 0];
766 } 812 }
767 else { 813 else {
768 return [1, 1] 814 return [1, 1]
769 } 815 }
770 } 816 }
  817 + else if (rowIndex > this.testPaperExamReport?.length - 3) {
  818 + if (columnIndex >= 5) {
  819 + return [0, 0];
  820 + }
  821 + }
771 else { 822 else {
772 return [1, 1] 823 return [1, 1]
773 } 824 }
@@ -810,14 +861,21 @@ export default { @@ -810,14 +861,21 @@ export default {
810 861
811 this.testTranscriptDatas = []; 862 this.testTranscriptDatas = [];
812 for (var page = 0; page < this.checkedClassInfos.length; page++) { 863 for (var page = 0; page < this.checkedClassInfos.length; page++) {
813 - this.testTranscriptDatas.push(await this._testExamReport(page)); 864 + this.testTranscriptDatas.push(await this._testExamReport(page, 1));
814 } 865 }
815 setTimeout(() => { 866 setTimeout(() => {
816 - tablePrint("test-print", this.tabType);  
817 - }, 500); 867 + tablePrint({
  868 + id: "test-print",
  869 + title: this.tabType
  870 + });
  871 + }, 1000);
818 } 872 }
819 else { 873 else {
820 - tablePrint("print-content", this.tabType); 874 + tablePrint({
  875 + id: "print-content",
  876 + title: this.tabType,
  877 + printType: '年级组长-' + this.tabType
  878 + });
821 } 879 }
822 }, 880 },
823 async _import() { 881 async _import() {
@@ -865,7 +923,6 @@ export default { @@ -865,7 +923,6 @@ export default {
865 this.$message.error("下载失败"); 923 this.$message.error("下载失败");
866 } 924 }
867 }, 925 },
868 - _detailQ(id) { },  
869 setSubPro(type) { 926 setSubPro(type) {
870 let tit; 927 let tit;
871 switch (type) { 928 switch (type) {
@@ -922,48 +979,43 @@ export default { @@ -922,48 +979,43 @@ export default {
922 979
923 var studentResults = []; 980 var studentResults = [];
924 981
925 - for (var iheader = 0; iheader < 3; iheader++) {  
926 - for (  
927 - var imapping = 0;  
928 - imapping < this.studentMapping.length;  
929 - imapping++  
930 - ) {  
931 - studentHeaders.push({  
932 - prop: this.studentMapping[imapping].key + "_" + iheader,  
933 - label: this.studentMapping[imapping].label,  
934 - key: this.studentMapping[imapping].key,  
935 - });  
936 - } 982 + for (var iheader = 0; iheader < 17; iheader++) {
  983 + studentHeaders.push({
  984 + prop: "column" + iheader,
  985 + label: this.studentMapping[iheader % this.studentMapping.length].label,
  986 + key: this.studentMapping[iheader % this.studentMapping.length].key,
  987 + });
937 } 988 }
938 989
939 demoTestTranscript.studentHeader = [...studentHeaders]; 990 demoTestTranscript.studentHeader = [...studentHeaders];
940 991
941 - for (var isp = 0; isp < response.data.gradeExamStudentReports.length; isp++) { 992 + var studentList = response.data.gradeExamStudentReports;
942 993
943 - var item = {}; 994 + this.studentHeader = [...studentHeaders];
944 995
945 - for (  
946 - var iamapping = 0;  
947 - iamapping < studentHeaders.length;  
948 - iamapping++  
949 - ) {  
950 - var currentData = response.data.gradeExamStudentReports[isp]; 996 + var stuRow = Math.ceil(studentList.length * 1.00 / 3);
951 997
952 - if (!currentData) continue; 998 + for (var isp = 0; isp < studentList.length; isp++) {
953 999
954 - var currentHeader = studentHeaders[iamapping]; 1000 + var row = isp % stuRow;
955 1001
956 - item[currentHeader.prop] = currentData[currentHeader.key]; 1002 + var col = parseInt(isp / stuRow);
957 1003
958 - if (  
959 - iamapping >= this.studentMapping.length - 1 &&  
960 - iamapping % this.studentMapping.length == 0  
961 - ) {  
962 - isp += 1;  
963 - }  
964 - } 1004 + var item = {};
  1005 +
  1006 + if (studentResults.length <= row)
  1007 + studentResults.push({});
  1008 +
  1009 + item = studentResults[row];
965 1010
966 - studentResults.push(item); 1011 + var studentResult = studentList[isp];
  1012 +
  1013 + item["column" + (6 * col)] = studentResult.code;
  1014 + item["column" + (6 * col + 1)] = studentResult.name;
  1015 + item["column" + (6 * col + 2)] = studentResult.gradeRank;
  1016 + item["column" + (6 * col + 3)] = studentResult.exam;
  1017 + item["column" + (6 * col + 4)] = studentResult.objective;
  1018 + item["column" + (6 * col + 5)] = studentResult.subjective;
967 } 1019 }
968 1020
969 demoTestTranscript.studentList = [...studentResults]; 1021 demoTestTranscript.studentList = [...studentResults];
@@ -986,7 +1038,9 @@ export default { @@ -986,7 +1038,9 @@ export default {
986 1038
987 for (var i = 0; i < questionList.length; i++) { 1039 for (var i = 0; i < questionList.length; i++) {
988 1040
989 - var correctAnswerValue = questionList[i].correctAnswer == "1" ? "✓" : questionList[i].correctAnswer == 2 ? "✗" : questionList[i].correctAnswer; 1041 + var correctAnswerValue =
  1042 + questionList[i].questionType == 4 && questionList[i].correctAnswer == "1" ? "✓" :
  1043 + questionList[i].questionType == 4 && questionList[i].correctAnswer == "2" ? "✗" : questionList[i].correctAnswer;
990 1044
991 var missCount = 0; 1045 var missCount = 0;
992 1046
@@ -1019,10 +1073,11 @@ export default { @@ -1019,10 +1073,11 @@ export default {
1019 minOptions = 2; 1073 minOptions = 2;
1020 optionNumList.push(2); 1074 optionNumList.push(2);
1021 } 1075 }
  1076 + if (questionList[i].questionType == 3) {
  1077 + if (minOptions > 4) minOptions = 4;
  1078 + }
1022 } 1079 }
1023 1080
1024 - console.log(demoTestTranscript.questionTotal)  
1025 -  
1026 show4Area = minOptions <= 4; 1081 show4Area = minOptions <= 4;
1027 1082
1028 show7Area = optionNumList.filter(o => o > 4 && o <= 7); 1083 show7Area = optionNumList.filter(o => o > 4 && o <= 7);
@@ -1052,7 +1107,8 @@ export default { @@ -1052,7 +1107,8 @@ export default {
1052 1107
1053 var currentRow = areaList[row]; 1108 var currentRow = areaList[row];
1054 1109
1055 - var correctAnswerValue = question.correctAnswer == "1" ? "✓" : question.correctAnswer == 2 ? "✗" : question.correctAnswer; 1110 + var correctAnswerValue = question.questionType == 4 && question.correctAnswer == "1" ? "✓" :
  1111 + question.questionType == 4 && question.correctAnswer == "2" ? "✗" : question.correctAnswer;
1056 1112
1057 var details = question.details.filter(fl => { 1113 var details = question.details.filter(fl => {
1058 return fl.option.indexOf('未答') < 0; 1114 return fl.option.indexOf('未答') < 0;
@@ -1075,7 +1131,9 @@ export default { @@ -1075,7 +1131,9 @@ export default {
1075 1131
1076 if (details.length <= 4) { 1132 if (details.length <= 4) {
1077 1133
1078 - var questionOption = questionDetail ? (questionDetail.option == "1" ? "✓" : questionDetail.option == "2" ? "✗" : questionDetail.option) : "- -" 1134 + var questionOption = questionDetail ? (
  1135 + question.questionType == 4 && questionDetail.option == "1" ? "✓" :
  1136 + question.questionType == 4 && questionDetail.option == "2" ? "✗" : questionDetail.option) : "- -"
1079 1137
1080 if (questionOption != "- -") questionOption += "(" + questionDetail.persent + ")"; 1138 if (questionOption != "- -") questionOption += "(" + questionDetail.persent + ")";
1081 1139
@@ -1121,7 +1179,8 @@ export default { @@ -1121,7 +1179,8 @@ export default {
1121 1179
1122 var currentRow = areaList[row]; 1180 var currentRow = areaList[row];
1123 1181
1124 - var correctAnswerValue = question.correctAnswer == "1" ? "✓" : question.correctAnswer == 2 ? "✗" : question.correctAnswer; 1182 + var correctAnswerValue = question.questionType == 4 && question.correctAnswer == "1" ? "✓" :
  1183 + question.questionType == 4 && question.correctAnswer == "2" ? "✗" : question.correctAnswer;
1125 1184
1126 for (var ilr = 0; ilr < 9; ilr++) { 1185 for (var ilr = 0; ilr < 9; ilr++) {
1127 1186
@@ -1177,7 +1236,8 @@ export default { @@ -1177,7 +1236,8 @@ export default {
1177 1236
1178 var currentRow = areaList[row]; 1237 var currentRow = areaList[row];
1179 1238
1180 - var correctAnswerValue = question.correctAnswer == "1" ? "✓" : question.correctAnswer == 2 ? "✗" : question.correctAnswer; 1239 + var correctAnswerValue = question.questionType == 4 && question.correctAnswer == "1" ? "✓" :
  1240 + question.questionType == 4 && question.correctAnswer == "2" ? "✗" : question.correctAnswer;
1181 1241
1182 for (var ilr = 0; ilr < 12; ilr++) { 1242 for (var ilr = 0; ilr < 12; ilr++) {
1183 1243
@@ -1281,8 +1341,12 @@ export default { @@ -1281,8 +1341,12 @@ export default {
1281 return item.option != "未答"; 1341 return item.option != "未答";
1282 }); 1342 });
1283 1343
  1344 + if (item.questionType == 4) {
  1345 + item.correctAnswer = item.correctAnswer == 1 ? "✓" : "✗"
  1346 + }
  1347 +
1284 optionsList.map((items, index) => { 1348 optionsList.map((items, index) => {
1285 - if (index != 4) { 1349 + if (index < maxOption - 1) {
1286 params["count" + index] = 1350 params["count" + index] =
1287 defaultArr[index]?.option != "未答" 1351 defaultArr[index]?.option != "未答"
1288 ? defaultArr[index]?.count 1352 ? defaultArr[index]?.count
@@ -1291,11 +1355,12 @@ export default { @@ -1291,11 +1355,12 @@ export default {
1291 defaultArr[index]?.option != "未答" 1355 defaultArr[index]?.option != "未答"
1292 ? defaultArr[index]?.persent 1356 ? defaultArr[index]?.persent
1293 : ""; 1357 : "";
  1358 +
1294 params["option" + index] = 1359 params["option" + index] =
1295 defaultArr[index]?.option != "未答" 1360 defaultArr[index]?.option != "未答"
1296 - ? defaultArr[index]?.option == 1 1361 + ? defaultArr[index]?.option == 1 && item?.questionType == 4
1297 ? "✓" 1362 ? "✓"
1298 - : defaultArr[index]?.option == 2 1363 + : defaultArr[index]?.option == 2 && item?.questionType == 4
1299 ? "✗" 1364 ? "✗"
1300 : defaultArr[index]?.option 1365 : defaultArr[index]?.option
1301 : ""; 1366 : "";
@@ -1304,7 +1369,7 @@ export default { @@ -1304,7 +1369,7 @@ export default {
1304 items["title"] = "未答"; 1369 items["title"] = "未答";
1305 params["count" + index] = lastOPtion?.count ?? ""; 1370 params["count" + index] = lastOPtion?.count ?? "";
1306 params["persent" + index] = lastOPtion?.persent ?? ""; 1371 params["persent" + index] = lastOPtion?.persent ?? "";
1307 - params["option" + index] = "?"; 1372 + params["option" + index] = "未答";
1308 } 1373 }
1309 }); 1374 });
1310 1375
@@ -1336,35 +1401,38 @@ export default { @@ -1336,35 +1401,38 @@ export default {
1336 1401
1337 this.testPaperExamReportOptions = [...optionsList]; 1402 this.testPaperExamReportOptions = [...optionsList];
1338 1403
1339 - console.log(objective, subjective, summary, Number(objective.avg / objective.sum)) 1404 + var examReport = this.examReport;
  1405 +
1340 this.testPaperExamReport.push({ 1406 this.testPaperExamReport.push({
1341 questionIndex: "汇总", 1407 questionIndex: "汇总",
1342 questionType: "客观题", 1408 questionType: "客观题",
1343 type: "colspan", 1409 type: "colspan",
1344 - score: objective.sum,  
1345 - avgScore: objective.avg == 0 ? 0 : Number(objective.avg).toFixed(2),  
1346 - gradeScoringRate: objective.avg == 0 ? 0 : Number(objective.avg * 100 / objective.sum).toFixed(2), 1410 + knowledge: "",
  1411 + score: examReport.objectiveScore.toFixed(2),
  1412 + avgScore: examReport.objectiveAvgScore == 0 ? 0.00 : Number(examReport.objectiveAvgScore).toFixed(2),
  1413 + gradeScoringRate: examReport.objectiveRate == 0 ? 0.00 : Number(examReport.objectiveRate).toFixed(2),
1347 correctAnswer: "备注" 1414 correctAnswer: "备注"
1348 }) 1415 })
1349 1416
1350 this.testPaperExamReport.push({ 1417 this.testPaperExamReport.push({
1351 questionIndex: "主观题", 1418 questionIndex: "主观题",
1352 type: "colspan", 1419 type: "colspan",
1353 - knowledge: subjective.sum,  
1354 - score: subjective.avg == 0 ? 0 : Number(subjective.avg).toFixed(2),  
1355 - avgScore: subjective.avg == 0 ? 0 : Number(subjective.avg * 100 / subjective.sum).toFixed(2) 1420 + knowledge: examReport.subjectiveScore == 0 ? 0.00 : Number(examReport.subjectiveScore).toFixed(2),
  1421 + score: examReport.subjectiveAvgScore == 0 ? 0.00 : Number(examReport.subjectiveAvgScore).toFixed(2),
  1422 + avgScore: examReport.subjectiveRate == 0 ? 0.00 : Number(examReport.subjectiveRate).toFixed(2)
1356 }) 1423 })
1357 1424
1358 this.testPaperExamReport.push({ 1425 this.testPaperExamReport.push({
1359 questionIndex: "合计", 1426 questionIndex: "合计",
1360 type: "colspan", 1427 type: "colspan",
1361 - knowledge: summary.sum,  
1362 - score: summary.avg == 0 ? 0 : Number(summary.avg).toFixed(2),  
1363 - avgScore: summary.avg == 0 ? 0 : Number(summary.avg * 100 / summary.sum).toFixed(2) 1428 + knowledge: examReport.examPaperScore.toFixed(2),
  1429 + score: examReport.avg == 0 ? 0.00 : Number(examReport.avg).toFixed(2),
  1430 + avgScore: examReport.rate == 0 ? 0.00 : Number(examReport.rate).toFixed(2)
1364 }) 1431 })
1365 }, 1432 },
1366 async _testStudentExamReport() { 1433 async _testStudentExamReport() {
1367 this.testStudentExamReport = []; 1434 this.testStudentExamReport = [];
  1435 +
1368 if (!this.checkedClassInfos || this.checkedClassInfos?.length <= 0) return; 1436 if (!this.checkedClassInfos || this.checkedClassInfos?.length <= 0) return;
1369 1437
1370 const request = this.$request.gStudentExamReport; 1438 const request = this.$request.gStudentExamReport;
@@ -1427,7 +1495,6 @@ export default { @@ -1427,7 +1495,6 @@ export default {
1427 return item; 1495 return item;
1428 }); 1496 });
1429 }, 1497 },
1430 - _delete() { },  
1431 }, 1498 },
1432 }; 1499 };
1433 </script> 1500 </script>
src/views/basic/askTestQuestion/index.vue
@@ -33,7 +33,7 @@ @@ -33,7 +33,7 @@
33 <el-button type="primary" @click="_serach"> 33 <el-button type="primary" @click="_serach">
34 筛选 34 筛选
35 </el-button> 35 </el-button>
36 - <el-radio-group v-model="dateStatus" class="default-date-radio-group"> 36 + <el-radio-group v-model="query.dateStatus" class="default-date-radio-group">
37 <el-radio-button label="onDay">今天</el-radio-button> 37 <el-radio-button label="onDay">今天</el-radio-button>
38 <el-radio-button label="onWeek">本周</el-radio-button> 38 <el-radio-button label="onWeek">本周</el-radio-button>
39 <el-radio-button label="onMonth">本月</el-radio-button> 39 <el-radio-button label="onMonth">本月</el-radio-button>
@@ -73,7 +73,7 @@ @@ -73,7 +73,7 @@
73 <el-popconfirm style="color:gray !important;" 73 <el-popconfirm style="color:gray !important;"
74 @confirm="_deleteDetermineQ(item.id)" 74 @confirm="_deleteDetermineQ(item.id)"
75 :title="dataType == 1 ? '确认删除此课件' : '确认删除此试卷'"> 75 :title="dataType == 1 ? '确认删除此课件' : '确认删除此试卷'">
76 - <el-button style="color:#606266 !important;" 76 + <el-button class="small-button" :size="'small'" style="color:#606266 !important;"
77 @click.native="_delete(item.id)" type="text" 77 @click.native="_delete(item.id)" type="text"
78 slot="reference">删除</el-button> 78 slot="reference">删除</el-button>
79 </el-popconfirm> 79 </el-popconfirm>
@@ -109,7 +109,7 @@ @@ -109,7 +109,7 @@
109 <div class="pic" v-if="dataType == 2" style="margin-left: 44px;"> 109 <div class="pic" v-if="dataType == 2" style="margin-left: 44px;">
110 <img src="../../../assets/images/tishu.png" /> 110 <img src="../../../assets/images/tishu.png" />
111 </div> 111 </div>
112 - <div class="text" v-if="dataType == 2"> 预计时长:</div> 112 + <div class="text" v-if="dataType == 2"> 考试时长:</div>
113 <div class="value" v-if="dataType == 2">{{ item.examsDuration }} 113 <div class="value" v-if="dataType == 2">{{ item.examsDuration }}
114 分钟 114 分钟
115 </div> 115 </div>
@@ -159,11 +159,12 @@ @@ -159,11 +159,12 @@
159 <el-dropdown-menu slot="dropdown"> 159 <el-dropdown-menu slot="dropdown">
160 <el-dropdown-item 160 <el-dropdown-item
161 @click.native="_detailQ(item.id)">查看</el-dropdown-item> 161 @click.native="_detailQ(item.id)">查看</el-dropdown-item>
  162 + <el-dropdown-item @click.native="_copy(item)">复制</el-dropdown-item>
162 <el-dropdown-item> 163 <el-dropdown-item>
163 <el-popconfirm style="color:gray !important;" 164 <el-popconfirm style="color:gray !important;"
164 @confirm="_deleteDetermineQ(item.id)" 165 @confirm="_deleteDetermineQ(item.id)"
165 :title="dataType == 1 ? '确认删除此课件' : '确认删除此试卷'"> 166 :title="dataType == 1 ? '确认删除此课件' : '确认删除此试卷'">
166 - <el-button style="color:#606266 !important;" 167 + <el-button class="small-button" :size="'small'" style="color:#606266 !important;"
167 @click.native="_delete(item.id)" type="text" 168 @click.native="_delete(item.id)" type="text"
168 slot="reference">删除</el-button> 169 slot="reference">删除</el-button>
169 </el-popconfirm> 170 </el-popconfirm>
@@ -199,7 +200,7 @@ @@ -199,7 +200,7 @@
199 <div class="pic" v-if="dataType == 2" style="margin-left: 44px;"> 200 <div class="pic" v-if="dataType == 2" style="margin-left: 44px;">
200 <img src="../../../assets/images/tishu.png" /> 201 <img src="../../../assets/images/tishu.png" />
201 </div> 202 </div>
202 - <div class="text" v-if="dataType == 2"> 预计时长:</div> 203 + <div class="text" v-if="dataType == 2"> 考试时长:</div>
203 <div class="value" v-if="dataType == 2">{{ item.examsDuration }} 204 <div class="value" v-if="dataType == 2">{{ item.examsDuration }}
204 分钟 205 分钟
205 </div> 206 </div>
@@ -231,45 +232,49 @@ @@ -231,45 +232,49 @@
231 </div> 232 </div>
232 </el-main> 233 </el-main>
233 <el-footer class="el-footer-pagination"> 234 <el-footer class="el-footer-pagination">
234 - <el-pagination @current-change="pageSizeChange" background layout="prev, pager, next" :size="listPage.size"  
235 - :current-page="listPage.page" :total="listPage.total"> 235 + <el-pagination @current-change="pageSizeChange" background layout="prev, pager, next"
  236 + :page-size="listPage.size" :current-page="listPage.page" :total="listPage.total">
236 </el-pagination> 237 </el-pagination>
237 </el-footer> 238 </el-footer>
238 <el-dialog :append-to-body="true" :close-on-click-modal="false" title="上传word文档" :visible.sync="diaUp" 239 <el-dialog :append-to-body="true" :close-on-click-modal="false" title="上传word文档" :visible.sync="diaUp"
239 width="600px"> 240 width="600px">
240 <upload :url="url" :params="{ type: importType }" @upSuccess="upSuccess" fileName="下载"> 241 <upload :url="url" :params="{ type: importType }" @upSuccess="upSuccess" fileName="下载">
241 <div class="down-box p0" slot="down"> 242 <div class="down-box p0" slot="down">
242 - <p class="down-head" v-if="importType == 1">  
243 - <span>第一步:</span>  
244 - <!-- <el-link type="primary" @click="downExcel">下载模板,</el-link> -->  
245 - <span>或者导出菁优网试卷/组卷网(学科网)试卷;  
246 - 为保证第三方试卷导入成功,请注意参考导出示例:</span> 243 + <div class="down-head" v-if="importType == 1">
  244 + <span>第一步:
  245 + 导出菁优网试卷/组卷网(学科网)试卷;为保证第三方试卷导入成功,请注意参考导出示例:
  246 + </span>
  247 + <p> 菁优网示例如下:</p>
247 <span class="img-box"> 248 <span class="img-box">
248 <el-image class="img" :src="examplePic" :preview-src-list="examplePicList"> 249 <el-image class="img" :src="examplePic" :preview-src-list="examplePicList">
249 </el-image> 250 </el-image>
250 - 菁优网示例 </span>/ 251 + </span>
  252 + <p> 组卷网(学科网)示例如下:</p>
251 <span class="img-box"> 253 <span class="img-box">
252 <el-image class="img" :src="examplePic2" :preview-src-list="examplePicList2"> 254 <el-image class="img" :src="examplePic2" :preview-src-list="examplePicList2">
253 </el-image> 255 </el-image>
254 - 组卷网(学科网)示例。  
255 </span> 256 </span>
256 - </p>  
257 - <p class="down-head" v-if="importType == 2">  
258 - <span>第一步:  
259 - <el-link type="primary" @click="downExcel">下载模板,</el-link>  
260 - 导出菁优网试卷/组卷网(学科网)试卷;为保证第三方试卷导入成功,请注意参考导出示例:</span> 257 + </div>
  258 +
  259 + <div class="down-head" v-if="importType == 2">
  260 + <span>
  261 + 第一步:
  262 + <el-link type="primary" @click="downExcel">下载模板</el-link>,
  263 + 或者导出菁优网试卷/组卷网(学科网)试卷;为保证第三方试卷导入成功,请注意参考导出示例:
  264 + </span>
  265 + <p> 菁优网示例如下:</p>
261 <span class="img-box"> 266 <span class="img-box">
262 <el-image class="img" :src="examplePic" :preview-src-list="examplePicList"> 267 <el-image class="img" :src="examplePic" :preview-src-list="examplePicList">
263 </el-image> 268 </el-image>
264 - 菁优网示例 269 +
265 </span> 270 </span>
266 - / 271 + <p> 组卷网(学科网)示例如下:</p>
267 <span class="img-box"> 272 <span class="img-box">
268 <el-image class="img" :src="examplePic2" :preview-src-list="examplePicList2"> 273 <el-image class="img" :src="examplePic2" :preview-src-list="examplePicList2">
269 </el-image> 274 </el-image>
270 - 组卷网(学科网)示例。 275 +
271 </span> 276 </span>
272 - </p> 277 + </div>
273 <p>第二步:上传完成编辑好的试卷。</p> 278 <p>第二步:上传完成编辑好的试卷。</p>
274 </div> 279 </div>
275 </upload> 280 </upload>
@@ -303,15 +308,15 @@ export default { @@ -303,15 +308,15 @@ export default {
303 sharedList: [], 308 sharedList: [],
304 dataType: "1", 309 dataType: "1",
305 importType: 0, 310 importType: 0,
306 - tabType: "0",  
307 - dateStatus: "-1", 311 + tabType: "0",
308 url: "/api_html/common/paper/upload", //上传文档地址 312 url: "/api_html/common/paper/upload", //上传文档地址
309 listPage: { 313 listPage: {
310 page: 1, 314 page: 1,
311 size: 8, 315 size: 8,
312 total: 0, 316 total: 0,
313 }, 317 },
314 - query: { 318 + query: {
  319 + dateStatus: "-1",
315 title: "", 320 title: "",
316 class: null, 321 class: null,
317 subject: null, 322 subject: null,
@@ -334,18 +339,19 @@ export default { @@ -334,18 +339,19 @@ export default {
334 this.listPage.page = 1; 339 this.listPage.page = 1;
335 this._serach(); 340 this._serach();
336 }, 341 },
337 - 'dateStatus'(val) { 342 + 'query.dateStatus'(val) {
338 var dateRange = setDateRules(val); 343 var dateRange = setDateRules(val);
  344 +
339 this.query.dateRange = [dateRange.startDay, dateRange.endDay]; 345 this.query.dateRange = [dateRange.startDay, dateRange.endDay];
340 } 346 }
341 }, 347 },
342 - async created() { 348 + async created() {
343 this.dataType = location.href.endsWith("askPreparationQuestions") ? "1" : "2"; 349 this.dataType = location.href.endsWith("askPreparationQuestions") ? "1" : "2";
344 this.code = this.$store.getters.csCode; 350 this.code = this.$store.getters.csCode;
345 this.role = 351 this.role =
346 this.$store.getters.info.showRole || 352 this.$store.getters.info.showRole ||
347 this.$store.getters.info.permissions[0].role; 353 this.$store.getters.info.permissions[0].role;
348 - this.dateStatus = "onWeek"; 354 + this.query.dateStatus = "onWeek";
349 await this._loadQueryDatas(); 355 await this._loadQueryDatas();
350 }, 356 },
351 methods: { 357 methods: {
@@ -534,6 +540,8 @@ export default { @@ -534,6 +540,8 @@ export default {
534 subjectName: "", 540 subjectName: "",
535 tagId: "", 541 tagId: "",
536 title: "", 542 title: "",
  543 + start: null,
  544 + end: null,
537 type: this.dataType, //试卷类型 545 type: this.dataType, //试卷类型
538 share: this.tabType, //分享类型 546 share: this.tabType, //分享类型
539 }; 547 };
@@ -542,9 +550,10 @@ export default { @@ -542,9 +550,10 @@ export default {
542 queryParams.subjectName = this.query.subject; 550 queryParams.subjectName = this.query.subject;
543 queryParams.tagId = this.query.tagId; 551 queryParams.tagId = this.query.tagId;
544 queryParams.title = this.query.paper; 552 queryParams.title = this.query.paper;
545 - // queryParams.start = this.query.dateRange[0];  
546 - // queryParams.end = this.query.dateRange[1];  
547 - 553 + if (this.query?.dateRange?.length >= 2) {
  554 + queryParams.start = this.query.dateRange[0] ?? "";
  555 + queryParams.end = this.query.dateRange[1] ?? "";
  556 + }
548 const { data, status, info } = await fetchPaperList({ 557 const { data, status, info } = await fetchPaperList({
549 ...queryParams, 558 ...queryParams,
550 status: 1, 559 status: 1,
@@ -560,7 +569,7 @@ export default { @@ -560,7 +569,7 @@ export default {
560 this.createdCount = data?.myCount || 0; 569 this.createdCount = data?.myCount || 0;
561 this.sharedCount = data?.gradeCount || 0; 570 this.sharedCount = data?.gradeCount || 0;
562 this.listPage.total = data.total; 571 this.listPage.total = data.total;
563 - 572 + console.log('page', this.listPage)
564 if (this.tabType == "0") { 573 if (this.tabType == "0") {
565 this.defaultList = []; 574 this.defaultList = [];
566 if (data?.list) this.defaultList = [...data?.list]; 575 if (data?.list) this.defaultList = [...data?.list];
@@ -696,7 +705,7 @@ export default { @@ -696,7 +705,7 @@ export default {
696 margin-top: 3px; 705 margin-top: 3px;
697 } 706 }
698 707
699 - width: 48.5%; 708 + width: 48.4%;
700 display: inline-block; 709 display: inline-block;
701 margin-bottom: 10px; 710 margin-bottom: 10px;
702 min-height: 190px; 711 min-height: 190px;
src/views/basic/askTestQuestion/report.vue
@@ -4,18 +4,17 @@ @@ -4,18 +4,17 @@
4 <div class="default-title">{{ dataType == "1" ? '随堂问报表' : '即时测报表' }}</div> 4 <div class="default-title">{{ dataType == "1" ? '随堂问报表' : '即时测报表' }}</div>
5 </el-header> 5 </el-header>
6 <div class="default-filter"> 6 <div class="default-filter">
7 - <!-- <el-input v-model="query.paper" placeholder="报表名称" suffix-icon="el-icon-search" class="filter-input" type="number"  
8 - clearable /> -->  
9 <el-select @change="_changeClass" v-model="query.class" class="filter-select" placeholder="选择班级"> 7 <el-select @change="_changeClass" v-model="query.class" class="filter-select" placeholder="选择班级">
10 <el-option v-for="item in classList " :key="item.classId" :label="item.className" :value="item.classId" /> 8 <el-option v-for="item in classList " :key="item.classId" :label="item.className" :value="item.classId" />
11 </el-select> 9 </el-select>
12 <el-select v-model="query.subject" v-if="role == 'ROLE_JIAOSHI'" placeholder="选择科目" class="filter-select"> 10 <el-select v-model="query.subject" v-if="role == 'ROLE_JIAOSHI'" placeholder="选择科目" class="filter-select">
13 - <el-option v-for=" item in subjectList" :key="item" :label="item" :value="item" /> 11 + <el-option v-for="item in subjectList" :key="item" :label="item" :value="item" />
14 </el-select> 12 </el-select>
15 - <el-select v-model="query.subjects" style="width: 18%;" collapse-tags v-if="role == 'ROLE_BANZHUREN'" multiple placeholder="选择科目"  
16 - class="filter-select">  
17 - <el-option v-for="item in subjectList" :key="item" :label="item" :value="item">  
18 - <!-- <el-checkbox :checked="checkedSubject.indexOf(item) >= 0" @click="subjectCheck(item)">{{ item }}</el-checkbox> --> 13 + <el-select v-model="query.subjects" multiple popper-class="select-popover-class" v-if="role == 'ROLE_BANZHUREN'"
  14 + placeholder="选择科目" collapse-tags class="filter-select" style="width: 18%;">
  15 + <el-checkbox :value="selectAll" @change="selectAllHandle">全部科目</el-checkbox>
  16 + <el-option v-for="(item, index) in subjectList" :key="index" :value="item" :label="item">
  17 + <el-checkbox :value="query.subjects.includes(item)" :label="item" />
19 </el-option> 18 </el-option>
20 </el-select> 19 </el-select>
21 <el-date-picker class="filter-datePicker" @change="_dateChange" v-model="query.dateRange" type="daterange" 20 <el-date-picker class="filter-datePicker" @change="_dateChange" v-model="query.dateRange" type="daterange"
@@ -31,29 +30,29 @@ @@ -31,29 +30,29 @@
31 <el-main> 30 <el-main>
32 <div style="position: relative"> 31 <div style="position: relative">
33 <el-tabs v-model="tabType" v-loading="queryLoading" type="card" class="default-tabs" :key="tabIndexs"> 32 <el-tabs v-model="tabType" v-loading="queryLoading" type="card" class="default-tabs" :key="tabIndexs">
34 - <el-tab-pane v-if="dataType == 1 && role == 'ROLE_JIAOSHI'" :name="'0'" :label="`阶段报表`"> 33 + <el-tab-pane v-if="dataType == 1 && role == 'ROLE_JIAOSHI'" :name="'0'" :label="`单课时报表`">
  34 + <askListReport v-if="apiDatas.askReportList" :datas="apiDatas.askReportList" @opration="_serach" />
  35 + </el-tab-pane>
  36 + <el-tab-pane v-if="dataType == 1 && role == 'ROLE_JIAOSHI'" :name="'1'" :label="`阶段报表`">
35 <askSummaryReport ref="askSummaryReport" v-if="apiDatas.askReportIds" :askReportIds="apiDatas.askReportIds" 37 <askSummaryReport ref="askSummaryReport" v-if="apiDatas.askReportIds" :askReportIds="apiDatas.askReportIds"
36 :queryParams="query" /> 38 :queryParams="query" />
37 </el-tab-pane> 39 </el-tab-pane>
38 - <el-tab-pane v-if="dataType == 1 && role == 'ROLE_JIAOSHI'" :name="'1'" :label="`单课时报表`">  
39 - <askListReport v-if="apiDatas.askReportList" :datas="apiDatas.askReportList" @opration="_serach" />  
40 - </el-tab-pane>  
41 <el-tab-pane v-if="dataType == 1 && role == 'ROLE_BANZHUREN' && query.status == 'multi'" :name="'0'" 40 <el-tab-pane v-if="dataType == 1 && role == 'ROLE_BANZHUREN' && query.status == 'multi'" :name="'0'"
42 :label="`多科表现`" :queryParams="query"> 41 :label="`多科表现`" :queryParams="query">
43 <askBzrMulti v-if="apiDatas.askReportIds" :askReportIds="apiDatas.askReportIds" :queryParams="query" /> 42 <askBzrMulti v-if="apiDatas.askReportIds" :askReportIds="apiDatas.askReportIds" :queryParams="query" />
44 </el-tab-pane> 43 </el-tab-pane>
45 <el-tab-pane v-if="dataType == 1 && role == 'ROLE_BANZHUREN' && query.status == 'single'" :name="'1'" 44 <el-tab-pane v-if="dataType == 1 && role == 'ROLE_BANZHUREN' && query.status == 'single'" :name="'1'"
46 :label="`单科表现`" :queryParams="query"> 45 :label="`单科表现`" :queryParams="query">
47 - <askSummaryReport :role="role" ref="askSummaryReport" v-if="apiDatas.askReportIds" :askReportIds="apiDatas.askReportIds"  
48 - :queryParams="query" /> 46 + <askSummaryReport :role="role" ref="askSummaryReport" v-if="apiDatas.askReportIds"
  47 + :askReportIds="apiDatas.askReportIds" :queryParams="query" />
  48 + </el-tab-pane>
  49 + <el-tab-pane v-if="dataType == 2 && role == 'ROLE_JIAOSHI'" :name="'0'" :label="`单卷报表`">
  50 + <testListReport :datas="apiDatas.testReportList" @opration="_serach" />
49 </el-tab-pane> 51 </el-tab-pane>
50 - <el-tab-pane v-if="dataType == 2 && role == 'ROLE_JIAOSHI'" :name="'0'" :label="`阶段报表`"> 52 + <el-tab-pane v-if="dataType == 2 && role == 'ROLE_JIAOSHI'" :name="'1'" :label="`阶段报表`">
51 <testSummaryReport v-if="apiDatas.testReportIds" :testReportIds="apiDatas.testReportIds" 53 <testSummaryReport v-if="apiDatas.testReportIds" :testReportIds="apiDatas.testReportIds"
52 @headerClick="_headerClick" :queryParams="query" /> 54 @headerClick="_headerClick" :queryParams="query" />
53 </el-tab-pane> 55 </el-tab-pane>
54 - <el-tab-pane v-if="dataType == 2 && role == 'ROLE_JIAOSHI'" :name="'1'" :label="`单卷报表`">  
55 - <testListReport :datas="apiDatas.testReportList" @opration="_serach" />  
56 - </el-tab-pane>  
57 <el-tab-pane v-if="dataType == 2 && role == 'ROLE_JIAOSHI'" :name="'2'" :label="`多班对比报表`"> 56 <el-tab-pane v-if="dataType == 2 && role == 'ROLE_JIAOSHI'" :name="'2'" :label="`多班对比报表`">
58 <testMultiClassReport :params="query" /> 57 <testMultiClassReport :params="query" />
59 </el-tab-pane> 58 </el-tab-pane>
@@ -65,7 +64,7 @@ @@ -65,7 +64,7 @@
65 <el-tab-pane v-if="dataType == 2 && role == 'ROLE_BANZHUREN' && query.status == 'single'" :name="'1'" 64 <el-tab-pane v-if="dataType == 2 && role == 'ROLE_BANZHUREN' && query.status == 'single'" :name="'1'"
66 :label="`单科表现`"> 65 :label="`单科表现`">
67 <testSummaryReport v-if="apiDatas.testReportIds" :role="role" :list="apiDatas.testReportList" 66 <testSummaryReport v-if="apiDatas.testReportIds" :role="role" :list="apiDatas.testReportList"
68 - :testReportIds="apiDatas.testReportIds" :queryParams="query" /> 67 + :testReportIds="apiDatas.testReportIds" :queryParams="query" @headerClick="_headerClick" />
69 </el-tab-pane> 68 </el-tab-pane>
70 <div slot="tab-bar"> 69 <div slot="tab-bar">
71 <el-button type="primary" icon="el-icon-plus">新增</el-button> 70 <el-button type="primary" icon="el-icon-plus">新增</el-button>
@@ -127,7 +126,7 @@ export default { @@ -127,7 +126,7 @@ export default {
127 }; 126 };
128 }, 127 },
129 watch: { 128 watch: {
130 - 'dateStatus'(val) { 129 + 'dateStatus' (val) {
131 if (val == -1) return; 130 if (val == -1) return;
132 var dateRange = setDateRules(val); 131 var dateRange = setDateRules(val);
133 this.query.dateRange = [dateRange.startDay, dateRange.endDay]; 132 this.query.dateRange = [dateRange.startDay, dateRange.endDay];
@@ -136,15 +135,10 @@ export default { @@ -136,15 +135,10 @@ export default {
136 this.dataType = location.href.endsWith("askReport") ? "1" : "2"; 135 this.dataType = location.href.endsWith("askReport") ? "1" : "2";
137 this._loadQueryDatas(); 136 this._loadQueryDatas();
138 }, 137 },
139 - 'dataType'() {  
140 - if (this.dataType == "1") {  
141 - this.tabType = "0"  
142 - }  
143 - else if (this.dataType == "2") {  
144 - this.tabType = "0"  
145 - } 138 + 'query'(value) {
  139 +
146 }, 140 },
147 - async 'query.subjects'(value) { 141 + async 'query.subjects' (value) {
148 if (this.role == "ROLE_BANZHUREN") { 142 if (this.role == "ROLE_BANZHUREN") {
149 if (value.length == 1 && value[0] != '全部科目') { 143 if (value.length == 1 && value[0] != '全部科目') {
150 this.query.status = 'single'; 144 this.query.status = 'single';
@@ -153,7 +147,10 @@ export default { @@ -153,7 +147,10 @@ export default {
153 } 147 }
154 else { 148 else {
155 this.query.status = 'multi'; 149 this.query.status = 'multi';
156 - this.tabType = '0'; 150 + if (this.role == 'ROLE_BANZHUREN')
  151 + this.tabType = '0';
  152 + else
  153 + this.tabType = '1';
157 await this._serach(); 154 await this._serach();
158 } 155 }
159 } 156 }
@@ -169,13 +166,19 @@ export default { @@ -169,13 +166,19 @@ export default {
169 this.dateStatus = "onWeek"; 166 this.dateStatus = "onWeek";
170 await this._loadQueryDatas(); 167 await this._loadQueryDatas();
171 }, 168 },
  169 + computed: {
  170 + selectAll() {
  171 + return this.query?.subjects?.filter(f => f != '全部科目').length === this.subjectList.length;
  172 + }
  173 + },
172 methods: { 174 methods: {
173 - _opr() {  
174 - alert('opr');  
175 - },  
176 _dateChange() { 175 _dateChange() {
177 this.dateStatus = -1; 176 this.dateStatus = -1;
178 }, 177 },
  178 + selectAllHandle() {
  179 + if (this.selectAll) this.query.subjects = [];
  180 + else this.query.subjects = [...this.subjectList]
  181 + },
179 async _ReScore() { 182 async _ReScore() {
180 //重新记分 183 //重新记分
181 let { data, info, status } = await this.$request.reScore({ 184 let { data, info, status } = await this.$request.reScore({
@@ -210,9 +213,7 @@ export default { @@ -210,9 +213,7 @@ export default {
210 return; 213 return;
211 } 214 }
212 this.subjectList = data?.subjectNames ?? []; 215 this.subjectList = data?.subjectNames ?? [];
213 - if (this.role == "ROLE_BANZHUREN") {  
214 - this.subjectList.unshift("全部科目");  
215 - } 216 +
216 this.query.subject = data?.subjectNames[0] ?? ""; 217 this.query.subject = data?.subjectNames[0] ?? "";
217 this.checkedSubject = [...this.subjectList]; 218 this.checkedSubject = [...this.subjectList];
218 this.query.subjects = this.checkedSubject; 219 this.query.subjects = this.checkedSubject;
@@ -263,7 +264,6 @@ export default { @@ -263,7 +264,6 @@ export default {
263 else { 264 else {
264 queryParams.subjectNames = [this.query.subject]; 265 queryParams.subjectNames = [this.query.subject];
265 } 266 }
266 - console.log(queryParams, this.query.subject)  
267 267
268 queryParams.startDay = this.query.dateRange 268 queryParams.startDay = this.query.dateRange
269 ? this.query.dateRange[0] 269 ? this.query.dateRange[0]
@@ -287,7 +287,9 @@ export default { @@ -287,7 +287,9 @@ export default {
287 this.$message.error(askReportResponse.info); 287 this.$message.error(askReportResponse.info);
288 return; 288 return;
289 } 289 }
  290 +
290 this.apiDatas.askReportList = [...askReportResponse?.data?.list ?? []]; 291 this.apiDatas.askReportList = [...askReportResponse?.data?.list ?? []];
  292 +
291 this.apiDatas.askReportIds = [... this.apiDatas?.askReportList?.map((item) => item.id) ?? []]; 293 this.apiDatas.askReportIds = [... this.apiDatas?.askReportList?.map((item) => item.id) ?? []];
292 294
293 if (this.$refs["askSummaryReport"]) { 295 if (this.$refs["askSummaryReport"]) {
@@ -367,6 +369,22 @@ export default { @@ -367,6 +369,22 @@ export default {
367 }; 369 };
368 </script> 370 </script>
369 <style lang="scss"> 371 <style lang="scss">
  372 +/* 控制全选按钮样式 */
  373 +.select-popover-class .el-scrollbar__view>.el-checkbox {
  374 + padding: 5px 20px;
  375 +}
  376 +
  377 +/* 取消多选框触发事件 */
  378 +.select-popover-class .el-scrollbar__view>li .el-checkbox {
  379 + pointer-events: none;
  380 +}
  381 +
  382 +/* 隐藏多选框选中勾选样式 √ */
  383 +.select-popover-class .el-scrollbar__view>li::after {
  384 + display: none;
  385 +}
  386 +
  387 +
370 .el-tabs__content { 388 .el-tabs__content {
371 padding-left: 20px !important; 389 padding-left: 20px !important;
372 padding-right: 0px !important; 390 padding-right: 0px !important;
src/views/basic/askTestQuestion/update.vue
@@ -47,7 +47,7 @@ @@ -47,7 +47,7 @@
47 <div class="bigQuestionTitle" v-if="paperType != 1"> 47 <div class="bigQuestionTitle" v-if="paperType != 1">
48 {{ question.questionTitle }} 48 {{ question.questionTitle }}
49 (共{{ question.subQuestions.filter(subQuestion => subQuestion && 49 (共{{ question.subQuestions.filter(subQuestion => subQuestion &&
50 - subQuestion.questionId && subQuestion.questionType).length }}小题, 50 + subQuestion.questionIndex && subQuestion.questionType).length }}小题,
51 共{{ question.score }}分) 51 共{{ question.score }}分)
52 </div> 52 </div>
53 <div v-if="paperType == 2 && index == 0" class="courseware-title sub-questions"> 53 <div v-if="paperType == 2 && index == 0" class="courseware-title sub-questions">
@@ -61,9 +61,9 @@ @@ -61,9 +61,9 @@
61 </div> 61 </div>
62 62
63 <div class="courseware-content sub-questions" v-if="subQuestion && 63 <div class="courseware-content sub-questions" v-if="subQuestion &&
64 - subQuestion.questionId && subQuestion.questionType && question.subQuestions" 64 + subQuestion.questionIndex && subQuestion.questionType && question.subQuestions"
65 v-for="(subQuestion, subIndex) in question.subQuestions"> 65 v-for="(subQuestion, subIndex) in question.subQuestions">
66 - <div class="qs-num">{{ subQuestion.questionId }}</div> 66 + <div class="qs-num">{{ subQuestion.questionIndex }}</div>
67 <div class="qs-stem"> 67 <div class="qs-stem">
68 <iframe style="height: 100% !important" class="screenshot" :src="subQuestion.screenshot"></iframe> 68 <iframe style="height: 100% !important" class="screenshot" :src="subQuestion.screenshot"></iframe>
69 </div> 69 </div>
@@ -108,7 +108,7 @@ @@ -108,7 +108,7 @@
108 <span class="answer-s answer-opration" v-if="!isViewer" 108 <span class="answer-s answer-opration" v-if="!isViewer"
109 @click="openStem(subQuestion, 4, index, subIndex)">+</span> 109 @click="openStem(subQuestion, 4, index, subIndex)">+</span>
110 <span class="answer-s answer-opration" v-if="!isViewer" 110 <span class="answer-s answer-opration" v-if="!isViewer"
111 - @click="openStem(subQuestion, 4, index, subIndex)">-</span> 111 + @click="openStem(subQuestion, 5, index, subIndex)">-</span>
112 </p> 112 </p>
113 <p v-if="subQuestion.questionType == 2" class="answer-box"> 113 <p v-if="subQuestion.questionType == 2" class="answer-box">
114 <template :disabled="isViewer" v-for="option in subQuestion.answerOptions.split(',')"> 114 <template :disabled="isViewer" v-for="option in subQuestion.answerOptions.split(',')">
@@ -134,18 +134,18 @@ @@ -134,18 +134,18 @@
134 <el-button class="icon-tickets" type="text" 134 <el-button class="icon-tickets" type="text"
135 @click="openStem(subQuestion, 2, index, subIndex)">修改解析</el-button> 135 @click="openStem(subQuestion, 2, index, subIndex)">修改解析</el-button>
136 </div> 136 </div>
137 - <div class="qs-set" v-if="false"> 137 + <div class="qs-set">
138 <el-button type="text" @click="openKnowledge(subQuestion, index, subIndex)">修改知识点</el-button> 138 <el-button type="text" @click="openKnowledge(subQuestion, index, subIndex)">修改知识点</el-button>
139 </div> 139 </div>
140 - <div class="qs-set" style="margin-left:10px"> 140 + <div class="qs-set">
141 <el-popconfirm @confirm="_deleteDetermineQ(subIndex, index)" title="这是一小题确定删除吗?"> 141 <el-popconfirm @confirm="_deleteDetermineQ(subIndex, index)" title="这是一小题确定删除吗?">
142 - <!-- <el-button style="color:red" type="text" slot="reference">删除</el-button> --> 142 + <!-- <el-button style="color:red; " type="text" slot="reference">删除</el-button> -->
143 </el-popconfirm> 143 </el-popconfirm>
144 </div> 144 </div>
145 </div> 145 </div>
146 </div> 146 </div>
147 <div v-if="!question.subQuestions" class="courseware-content sub-questions"> 147 <div v-if="!question.subQuestions" class="courseware-content sub-questions">
148 - <div class="qs-num">{{ question.questionId }}</div> 148 + <div class="qs-num">{{ question.questionIndex }}</div>
149 <div class="qs-stem"> 149 <div class="qs-stem">
150 <iframe style="height: 100% !important" class="screenshot" :src="question.screenshot"></iframe> 150 <iframe style="height: 100% !important" class="screenshot" :src="question.screenshot"></iframe>
151 </div> 151 </div>
@@ -206,10 +206,10 @@ @@ -206,10 +206,10 @@
206 <el-button class="icon-tickets" type="text" 206 <el-button class="icon-tickets" type="text"
207 @click="openStem(question, 2, index, 0)">修改解析</el-button> 207 @click="openStem(question, 2, index, 0)">修改解析</el-button>
208 </div> 208 </div>
209 - <div class="qs-set" v-if="false"> 209 + <div class="qs-set">
210 <el-button type="text" @click="openKnowledge(question, index, 0)">修改知识点</el-button> 210 <el-button type="text" @click="openKnowledge(question, index, 0)">修改知识点</el-button>
211 </div> 211 </div>
212 - <div class="qs-set" style="margin-left:10px"> 212 + <div class="qs-set">
213 <el-popconfirm @confirm="_deleteDetermineQ(0, index)" title="这是一小题确定删除吗?"> 213 <el-popconfirm @confirm="_deleteDetermineQ(0, index)" title="这是一小题确定删除吗?">
214 <!-- <el-button style="color:red" type="text" slot="reference">删除</el-button> --> 214 <!-- <el-button style="color:red" type="text" slot="reference">删除</el-button> -->
215 </el-popconfirm> 215 </el-popconfirm>
@@ -221,28 +221,28 @@ @@ -221,28 +221,28 @@
221 </div> 221 </div>
222 </div> 222 </div>
223 </div> 223 </div>
224 - <el-dialog :close-on-click-modal="false" title="选择班级分享" :visible.sync="classSharingType" width="800"  
225 - :modal-append-to-body="false" :append-to-body="true">  
226 - <div> 224 + <el-dialog title="选择班级分享" :visible.sync="classSharingType" width="800" :close-on-click-modal="false"
  225 + :append-to-body="true">
  226 + <div :key="classSharingType">
227 <el-row class="row-subfix"> 227 <el-row class="row-subfix">
228 <div class="row-line"> 228 <div class="row-line">
229 <span class="line-subfix">年级:</span> 229 <span class="line-subfix">年级:</span>
230 <span class="line-value">{{ gradeName }}</span> 230 <span class="line-value">{{ gradeName }}</span>
231 </div> 231 </div>
232 </el-row> 232 </el-row>
233 - <el-row class="row-subfix" style="margin-top: 20px;"> 233 + <el-row v-if="gradeClass.length >= 1" class="row-subfix" style="margin-top: 20px;">
234 <span class="line-subfix" style="float: left;">班级:</span> 234 <span class="line-subfix" style="float: left;">班级:</span>
235 <div class="row-line" style="float: left; 235 <div class="row-line" style="float: left;
236 background:rgb(245,247,250);padding:15px 10px;width: calc(100% - 80px);border-radius:5px;"> 236 background:rgb(245,247,250);padding:15px 10px;width: calc(100% - 80px);border-radius:5px;">
237 <span class="line-value" style="min-height: 300px;border-radius: 4px; background: rgb(247,247,250);"> 237 <span class="line-value" style="min-height: 300px;border-radius: 4px; background: rgb(247,247,250);">
238 <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" 238 <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll"
239 @change="handleCheckAllChange">全选</el-checkbox> 239 @change="handleCheckAllChange">全选</el-checkbox>
240 - <el-checkbox-group v-model="checkedClass" style="margin-top: 15px;"  
241 - @change="handleCheckedClassChange">  
242 - <el-checkbox v-for="(item, index) in gradeClass" :label="item.id" :key="item.id"> 240 + <div>
  241 + <el-checkbox @change="handleCheckedClassChange" v-model="item.isChecked" :key="index"
  242 + v-for="(item, index) in gradeClass" :label="item.id">
243 {{ item.className }} 243 {{ item.className }}
244 </el-checkbox> 244 </el-checkbox>
245 - </el-checkbox-group> 245 + </div>
246 </span> 246 </span>
247 </div> 247 </div>
248 </el-row> 248 </el-row>
@@ -323,23 +323,9 @@ @@ -323,23 +323,9 @@
323 </div> 323 </div>
324 </el-dialog> 324 </el-dialog>
325 <el-dialog :append-to-body="true" :close-on-click-modal="false" title="知识点" :visible.sync="dialogKnowledge" 325 <el-dialog :append-to-body="true" :close-on-click-modal="false" title="知识点" :visible.sync="dialogKnowledge"
326 - width="500px">  
327 - <div>  
328 - <el-form ref="form" :model="stem" label-width="160px">  
329 - <el-form-item label="知识点:">  
330 - <el-cascader size="small" filterable :show-all-levels="false" clearable placeholder="选择知识点"  
331 - v-model="stem.knowledge" :options="knowledgeData" :props="{  
332 - expandTrigger: 'hover',  
333 - multiple: true,  
334 - checkStrictly: true,  
335 - }"></el-cascader>  
336 - </el-form-item>  
337 - </el-form>  
338 - </div>  
339 - <div slot="footer">  
340 - <el-button @click="dialogKnowledge = false">取 消</el-button>  
341 - <el-button type="primary" @click="setKnowledge">确 定</el-button>  
342 - </div> 326 + width="60%">
  327 + <knowledgePoints :key="dialogKnowledge" @opration="knowledgeOpration" :sectionName="stem.sectionName"
  328 + :subjectName="stem.subjectName" :knowledges="stem.knowledge" />
343 </el-dialog> 329 </el-dialog>
344 </div> 330 </div>
345 <div class="content-fi"> 331 <div class="content-fi">
@@ -352,7 +338,7 @@ @@ -352,7 +338,7 @@
352 338
353 <script> 339 <script>
354 import { deepClone, checkAnswer } from "utils"; 340 import { deepClone, checkAnswer } from "utils";
355 -import knowledgeList from "assets/js/knowledgeList.js"; 341 +import conf from "@/config/index";
356 export default { 342 export default {
357 data() { 343 data() {
358 return { 344 return {
@@ -409,7 +395,7 @@ export default { @@ -409,7 +395,7 @@ export default {
409 //v1.5 395 //v1.5
410 dialogStem: false, //截图开关 396 dialogStem: false, //截图开关
411 dialogKnowledge: false, //知识点开关 397 dialogKnowledge: false, //知识点开关
412 - knowledgeList: { ...knowledgeList }, 398 + // knowledgeList: { ...knowledgeList },
413 classList: [], 399 classList: [],
414 stem: { 400 stem: {
415 type: 1, 401 type: 1,
@@ -420,7 +406,7 @@ export default { @@ -420,7 +406,7 @@ export default {
420 knowledge: [], //知识点 406 knowledge: [], //知识点
421 }, 407 },
422 gradeClassList: [], //学段列表 408 gradeClassList: [], //学段列表
423 - uploadUrl: "/file/uploadImgToHtml", 409 + // uploadUrl: "/file/uploadImgToHtml",
424 iframeLoading: false, 410 iframeLoading: false,
425 examType: 2, 411 examType: 2,
426 }; 412 };
@@ -439,31 +425,22 @@ export default { @@ -439,31 +425,22 @@ export default {
439 }, 0); 425 }, 0);
440 return Number(score).toFixed(2); 426 return Number(score).toFixed(2);
441 }, 427 },
442 - // 知识点列表 根据学段-科目筛选  
443 - knowledgeData: function () {  
444 - let jsons = [];  
445 - if (this.form.gradeName && this.form.subjectName) {  
446 - let sectionName = "";  
447 - this.gradeClassList?.map((item) => {  
448 - if (this.form.gradeName == item.gradeName) {  
449 - sectionName = item.sectionName;  
450 - }  
451 - });  
452 - if (  
453 - sectionName &&  
454 - Object.keys(this.knowledgeList).includes(sectionName)  
455 - ) {  
456 - if (  
457 - Object.keys(this.knowledgeList[sectionName]).includes(  
458 - this.form.subjectName  
459 - )  
460 - ) {  
461 - jsons = this.knowledgeList[sectionName][this.form.subjectName];  
462 - }  
463 - } 428 + uploadUrl: function () {
  429 + var requestUrl = '';
  430 +
  431 + var ogrinUrl = '/file/uploadImgToHtml';
  432 +
  433 + var baseUrl = conf.baseURL;
  434 +
  435 + if (baseUrl == '/' && ogrinUrl.indexOf('/') == 0) {
  436 + requestUrl = ogrinUrl;
464 } 437 }
465 - return jsons;  
466 - }, 438 + else {
  439 + requestUrl = baseUrl + ogrinUrl
  440 + }
  441 +
  442 + return requestUrl;
  443 + }
467 }, 444 },
468 created() { 445 created() {
469 this.role = 446 this.role =
@@ -481,17 +458,47 @@ export default { @@ -481,17 +458,47 @@ export default {
481 this._GradeList(); 458 this._GradeList();
482 }, 459 },
483 methods: { 460 methods: {
  461 + // 知识点
  462 + openKnowledge(obj, index, indexs) {
  463 + this.stem.index = index;
  464 + this.stem.indexs = indexs;
  465 + this.stem.knowledge = obj.knowledge;
  466 + if (this.form.gradeName && this.form.subjectName) {
  467 + var matchClass = this.gradeClassList.find((item) => {
  468 + if (this.form.gradeName == item.gradeName) {
  469 + return item.sectionName;
  470 + }
  471 + });
  472 + this.stem.sectionName = matchClass?.sectionName ?? "";
  473 + this.stem.subjectName = this.form.subjectName ?? "";
  474 + }
  475 + this.dialogKnowledge = true;
  476 + },
  477 + knowledgeOpration(target) {
  478 + if (target.opration == 'confirm') {
  479 + this.form.questionList[this.stem.index].
  480 + subQuestions[this.stem.indexs].knowledge = target.knowledges.join(",");
  481 + this.dialogKnowledge = false;
  482 + }
  483 + else {
  484 + this.dialogKnowledge = false;
  485 + }
  486 + },
484 _checkedClass() { 487 _checkedClass() {
  488 + this.checkedClass = this.gradeClass.filter(item => item.isChecked).map(imap => imap.id);
485 this.classSharingType = false; 489 this.classSharingType = false;
486 }, 490 },
487 handleCheckAllChange(val) { 491 handleCheckAllChange(val) {
488 - this.checkedClass = val ? this.gradeClass?.map(item => item.id) : []; 492 + this.gradeClass.forEach(item => {
  493 + item.isChecked = val;
  494 + })
489 this.isIndeterminate = false; 495 this.isIndeterminate = false;
490 }, 496 },
491 - handleCheckedClassChange(value) { 497 + handleCheckedClassChange() {
  498 + var value = this.gradeClass.filter(item => item.isChecked);
492 let checkedCount = value.length; 499 let checkedCount = value.length;
493 - this.checkAll = checkedCount === this.checkedClass.length;  
494 - this.isIndeterminate = checkedCount > 0 && checkedCount < this.checkedClass.length; 500 + this.checkAll = checkedCount === this.gradeClass.length;
  501 + this.isIndeterminate = checkedCount > 0 && checkedCount < this.gradeClass.length;
495 }, 502 },
496 async _selectClassSharingType() { 503 async _selectClassSharingType() {
497 504
@@ -505,10 +512,16 @@ export default { @@ -505,10 +512,16 @@ export default {
505 512
506 if (classResponse.status != 0) { 513 if (classResponse.status != 0) {
507 this.$message.error(classResponse.info); 514 this.$message.error(classResponse.info);
  515 + return;
508 } 516 }
509 517
510 - this.gradeClass = [...classResponse.data];  
511 - 518 + this.gradeClass = [...classResponse.data.map(item => {
  519 + return {
  520 + isChecked: this.checkedClass.includes(item.id),
  521 + id: item.id,
  522 + className: item.className
  523 + }
  524 + })];
512 }, 525 },
513 // v1.5 526 // v1.5
514 //上传截图 527 //上传截图
@@ -594,25 +607,7 @@ export default { @@ -594,25 +607,7 @@ export default {
594 upError(res) { 607 upError(res) {
595 this.$message.error("上传失败"); 608 this.$message.error("上传失败");
596 }, 609 },
597 - // 打开知识点  
598 - openKnowledge(obj, index, indexs) {  
599 - this.stem.index = index;  
600 - this.stem.indexs = indexs || 0;  
601 - this.stem.knowledge = (obj.knowledge && obj.knowledge.split("#")) || [];  
602 - this.dialogKnowledge = true;  
603 - },  
604 - // 选择知识点  
605 - setKnowledge() {  
606 - if (this.questionList[0]?.subQuestions) {  
607 - this.questionList[this.stem.index].subQuestions[  
608 - this.stem.indexs  
609 - ].knowledge = this.stem.knowledge.join("#");  
610 - } else {  
611 - this.questionList[this.stem.index].knowledge =  
612 - this.stem.knowledge.join("#");  
613 - }  
614 - this.dialogKnowledge = false;  
615 - }, 610 +
616 //end 611 //end
617 612
618 linkBack() { 613 linkBack() {
@@ -893,7 +888,7 @@ export default { @@ -893,7 +888,7 @@ export default {
893 modifyPaper = 888 modifyPaper =
894 this.role == "ROLE_PERSONAL" 889 this.role == "ROLE_PERSONAL"
895 ? this.$request.pModifyPaper 890 ? this.$request.pModifyPaper
896 - : this.$request.modifyPaper; 891 + : this.$request.pModifyPaperNew;
897 params = { 892 params = {
898 classIds: this.checkedClass, 893 classIds: this.checkedClass,
899 sharingType: this.form.sharingType, 894 sharingType: this.form.sharingType,
@@ -936,7 +931,7 @@ export default { @@ -936,7 +931,7 @@ export default {
936 }); 931 });
937 } 932 }
938 } else { 933 } else {
939 - this.$message.error(message); 934 + this.$message.error(info);
940 } 935 }
941 }, 936 },
942 async _QueryDetail() { 937 async _QueryDetail() {
@@ -1384,11 +1379,12 @@ export default { @@ -1384,11 +1379,12 @@ export default {
1384 } 1379 }
1385 1380
1386 .qs-set { 1381 .qs-set {
1387 - width: 80px; 1382 + display: inline-block;
  1383 + padding: 0px 5px;
1388 } 1384 }
1389 1385
1390 .qs-oprations { 1386 .qs-oprations {
1391 - width: 300px; 1387 + width: 320px;
1392 } 1388 }
1393 1389
1394 .qs-options { 1390 .qs-options {
src/views/basic/down/client.vue
@@ -19,12 +19,7 @@ @@ -19,12 +19,7 @@
19 </div> 19 </div>
20 <div class="down-box"> 20 <div class="down-box">
21 <p class="txt">默认参数配置</p> 21 <p class="txt">默认参数配置</p>
22 - <el-button  
23 - class="down-btn"  
24 - type="primary"  
25 - @click="getAppDownloadUrl(false)"  
26 - >立即下载</el-button  
27 - > 22 + <el-button class="down-btn" type="primary" @click="getAppDownloadUrl(false)">立即下载</el-button>
28 </div> 23 </div>
29 </div> 24 </div>
30 <!-- <ul class="down-ul"> 25 <!-- <ul class="down-ul">
@@ -54,46 +49,35 @@ @@ -54,46 +49,35 @@
54 <i class="fa fa-mail-reply-all"></i> 49 <i class="fa fa-mail-reply-all"></i>
55 <p> 50 <p>
56 {{ 51 {{
57 - `${type == 1 ? "参数设置" : formData.configName}`  
58 - }} 52 + `${type == 1 ? "参数设置" : formData.configName}`
  53 + }}
59 </p> 54 </p>
60 </div> 55 </div>
61 </div> 56 </div>
62 <div class="form-box"> 57 <div class="form-box">
63 - <el-form  
64 - ref="forms"  
65 - :model="formData"  
66 - :rules="ruleForm"  
67 - label-width="180px"  
68 - > 58 + <el-form ref="forms" :model="formData" :rules="ruleForm" label-width="180px">
69 <el-form-item label="配置名称:" prop="configName" v-if="type == 1"> 59 <el-form-item label="配置名称:" prop="configName" v-if="type == 1">
70 <el-col :span="12"> 60 <el-col :span="12">
71 - <el-input  
72 - v-model.trim="formData.configName"  
73 - placeholder="请填写配置名称"  
74 - ></el-input> 61 + <el-input v-model.trim="formData.configName" placeholder="请填写配置名称"></el-input>
75 </el-col> 62 </el-col>
76 </el-form-item> 63 </el-form-item>
77 <el-form-item label="主菜单设置:" prop="mainMenu"> 64 <el-form-item label="主菜单设置:" prop="mainMenu">
78 <el-checkbox-group v-model="formData.mainMenu" :max="4"> 65 <el-checkbox-group v-model="formData.mainMenu" :max="4">
79 <el-checkbox v-for="item in menuList" :label="item" :key="item">{{ 66 <el-checkbox v-for="item in menuList" :label="item" :key="item">{{
80 - item  
81 - }}</el-checkbox> 67 + item
  68 + }}</el-checkbox>
82 </el-checkbox-group> 69 </el-checkbox-group>
83 </el-form-item> 70 </el-form-item>
84 <el-form-item label="弹出菜单组:" prop="popupMenu"> 71 <el-form-item label="弹出菜单组:" prop="popupMenu">
85 <el-radio-group v-model="formData.popupMenu"> 72 <el-radio-group v-model="formData.popupMenu">
86 <p class="popup-menu"> 73 <p class="popup-menu">
87 - <el-radio :label="1"  
88 - ><span>1:签到点名</span> <span> 2:导入导出</span>  
89 - <span>3:班级管理</span> <span>4:系统设置</span></el-radio  
90 - > 74 + <el-radio :label="1"><span>1:签到点名</span> <span> 2:导入导出</span>
  75 + <span>3:班级管理</span> <span>4:系统设置</span></el-radio>
91 </p> 76 </p>
92 <p class="popup-menu popup-menu1"> 77 <p class="popup-menu popup-menu1">
93 <el-radio :label="2"> 78 <el-radio :label="2">
94 <span>1:签到点名</span> <span> 2:导入导出</span> 79 <span>1:签到点名</span> <span> 2:导入导出</span>
95 - <span>3:考试任务</span> <span>4:系统设置</span></el-radio  
96 - > 80 + <span>3:考试任务</span> <span>4:系统设置</span></el-radio>
97 </p> 81 </p>
98 </el-radio-group> 82 </el-radio-group>
99 </el-form-item> 83 </el-form-item>
@@ -101,56 +85,24 @@ @@ -101,56 +85,24 @@
101 <el-col :span="12"> 85 <el-col :span="12">
102 <div class="silde-box"> 86 <div class="silde-box">
103 <p class="silde-p"> 87 <p class="silde-p">
104 - <span class="num" :style="{ left: formData.failedSet + '%' }"  
105 - >{{ formData.failedSet }}%</span  
106 - >  
107 - <el-slider  
108 - v-model="formData.failedSet"  
109 - :show-tooltip="false"  
110 - ></el-slider  
111 - ><span class="txt" :style="{ left: formData.failedSet + '%' }"  
112 - >不及格</span  
113 - > 88 + <span class="num" :style="{ left: formData.failedSet + '%' }">{{ formData.failedSet }}%</span>
  89 + <el-slider v-model="formData.failedSet" :show-tooltip="false"></el-slider><span class="txt"
  90 + :style="{ left: formData.failedSet + '%' }">不及格</span>
114 </p> 91 </p>
115 <p class="silde-p"> 92 <p class="silde-p">
116 - <span class="num" :style="{ left: formData.passSet + '%' }"  
117 - >{{ formData.passSet }}%</span  
118 - >  
119 - <el-slider  
120 - v-model="formData.passSet"  
121 - :show-tooltip="false"  
122 - ></el-slider  
123 - ><span class="txt" :style="{ left: formData.passSet + '%' }"  
124 - >及格</span  
125 - > 93 + <span class="num" :style="{ left: formData.passSet + '%' }">{{ formData.passSet }}%</span>
  94 + <el-slider v-model="formData.passSet" :show-tooltip="false"></el-slider><span class="txt"
  95 + :style="{ left: formData.passSet + '%' }">及格</span>
126 </p> 96 </p>
127 <p class="silde-p"> 97 <p class="silde-p">
128 - <span class="num" :style="{ left: formData.goodSet + '%' }"  
129 - >{{ formData.goodSet }}%</span  
130 - >  
131 - <el-slider  
132 - v-model="formData.goodSet"  
133 - :show-tooltip="false"  
134 - ></el-slider  
135 - ><span class="txt" :style="{ left: formData.goodSet + '%' }"  
136 - >良好</span  
137 - > 98 + <span class="num" :style="{ left: formData.goodSet + '%' }">{{ formData.goodSet }}%</span>
  99 + <el-slider v-model="formData.goodSet" :show-tooltip="false"></el-slider><span class="txt"
  100 + :style="{ left: formData.goodSet + '%' }">良好</span>
138 </p> 101 </p>
139 <p class="silde-p"> 102 <p class="silde-p">
140 - <span  
141 - class="num"  
142 - :style="{ left: formData.excellenSet + '%' }"  
143 - >{{ formData.excellenSet }}%</span  
144 - >  
145 - <el-slider  
146 - v-model="formData.excellenSet"  
147 - :show-tooltip="false"  
148 - ></el-slider  
149 - ><span  
150 - class="txt"  
151 - :style="{ left: formData.excellenSet + '%' }"  
152 - >优秀</span  
153 - > 103 + <span class="num" :style="{ left: formData.excellenSet + '%' }">{{ formData.excellenSet }}%</span>
  104 + <el-slider v-model="formData.excellenSet" :show-tooltip="false"></el-slider><span class="txt"
  105 + :style="{ left: formData.excellenSet + '%' }">优秀</span>
154 </p> 106 </p>
155 </div> 107 </div>
156 </el-col> 108 </el-col>
@@ -161,14 +113,8 @@ @@ -161,14 +113,8 @@
161 <el-radio :label="1">即时抢答</el-radio> 113 <el-radio :label="1">即时抢答</el-radio>
162 <el-radio :label="2">老师选择</el-radio> 114 <el-radio :label="2">老师选择</el-radio>
163 </el-radio-group> 115 </el-radio-group>
164 - <el-input-number  
165 - v-show="formData.viesAnswerSet === 0"  
166 - size="small"  
167 - class="count-down"  
168 - v-model="formData.countdown"  
169 - :step="1"  
170 - :step-strictly="true"  
171 - ></el-input-number> 116 + <el-input-number v-show="formData.viesAnswerSet === 0" size="small" class="count-down"
  117 + v-model="formData.countdown" :step="1" :step-strictly="true"></el-input-number>
172 <span v-show="formData.viesAnswerSet == 0">秒</span> 118 <span v-show="formData.viesAnswerSet == 0">秒</span>
173 </el-form-item> 119 </el-form-item>
174 <el-form-item label="抽答设置:" prop="ballotAnswerSet"> 120 <el-form-item label="抽答设置:" prop="ballotAnswerSet">
@@ -178,66 +124,28 @@ @@ -178,66 +124,28 @@
178 </el-radio-group> 124 </el-radio-group>
179 </el-form-item> 125 </el-form-item>
180 <el-form-item label="单选题选项默认个数:" prop="singleChoiceNum"> 126 <el-form-item label="单选题选项默认个数:" prop="singleChoiceNum">
181 - <el-input-number  
182 - size="small"  
183 - class="count-down count-down2"  
184 - v-model="formData.singleChoiceNum"  
185 - :min="2"  
186 - :max="7"  
187 - :step="1"  
188 - :step-strictly="true"  
189 - ></el-input-number  
190 - >个 127 + <el-input-number size="small" class="count-down count-down2" v-model="formData.singleChoiceNum" :min="2"
  128 + :max="7" :step="1" :step-strictly="true"></el-input-number>个
191 </el-form-item> 129 </el-form-item>
192 <el-form-item label="多选题选项默认个数:" prop="multipleChoiceNum"> 130 <el-form-item label="多选题选项默认个数:" prop="multipleChoiceNum">
193 - <el-input-number  
194 - size="small"  
195 - class="count-down count-down2"  
196 - v-model="formData.multipleChoiceNum"  
197 - :min="2"  
198 - :max="7"  
199 - :step="1"  
200 - :step-strictly="true"  
201 - ></el-input-number  
202 - >个 131 + <el-input-number size="small" class="count-down count-down2" v-model="formData.multipleChoiceNum" :min="2"
  132 + :max="7" :step="1" :step-strictly="true"></el-input-number>个
203 </el-form-item> 133 </el-form-item>
204 <el-form-item label="测—单题型默认题数:" prop="singleTypeNum"> 134 <el-form-item label="测—单题型默认题数:" prop="singleTypeNum">
205 - <el-input-number  
206 - size="small"  
207 - class="count-down count-down2"  
208 - v-model="formData.singleTypeNum"  
209 - :min="2"  
210 - :max="25"  
211 - :step="1"  
212 - :step-strictly="true"  
213 - ></el-input-number  
214 - >个 135 + <el-input-number size="small" class="count-down count-down2" v-model="formData.singleTypeNum" :min="2"
  136 + :max="25" :step="1" :step-strictly="true"></el-input-number>个
215 </el-form-item> 137 </el-form-item>
216 <el-form-item label="问—倒计时:" prop="askCountdown"> 138 <el-form-item label="问—倒计时:" prop="askCountdown">
217 <el-switch v-model="askCount" @change="askCountChange"> </el-switch> 139 <el-switch v-model="askCount" @change="askCountChange"> </el-switch>
218 - <el-input-number  
219 - v-show="askCount"  
220 - size="small"  
221 - class="count-down"  
222 - v-model="formData.askCountdown"  
223 - :min="0"  
224 - :step="1"  
225 - :step-strictly="true"  
226 - ></el-input-number> 140 + <el-input-number v-show="askCount" size="small" class="count-down" v-model="formData.askCountdown" :min="0"
  141 + :step="1" :step-strictly="true"></el-input-number>
227 {{ askCount ? "秒" : "" }} 142 {{ askCount ? "秒" : "" }}
228 </el-form-item> 143 </el-form-item>
229 <el-form-item label="测—倒计时:" prop="viesAnswerSet"> 144 <el-form-item label="测—倒计时:" prop="viesAnswerSet">
230 <el-switch v-model="examsDuration" @change="examsDurationChange"> 145 <el-switch v-model="examsDuration" @change="examsDurationChange">
231 </el-switch> 146 </el-switch>
232 - <el-input-number  
233 - v-show="examsDuration"  
234 - size="small"  
235 - class="count-down"  
236 - v-model="formData.examsDuration"  
237 - :min="0"  
238 - :step="1"  
239 - :step-strictly="true"  
240 - ></el-input-number> 147 + <el-input-number v-show="examsDuration" size="small" class="count-down" v-model="formData.examsDuration"
  148 + :min="0" :step="1" :step-strictly="true"></el-input-number>
241 {{ examsDuration ? "分" : "" }} 149 {{ examsDuration ? "分" : "" }}
242 </el-form-item> 150 </el-form-item>
243 <el-form-item label="答题结构展示:" prop="displayModel"> 151 <el-form-item label="答题结构展示:" prop="displayModel">
@@ -515,7 +423,7 @@ export default { @@ -515,7 +423,7 @@ export default {
515 this.$message.error(info); 423 this.$message.error(info);
516 } 424 }
517 }, 425 },
518 - async getAppDownloadUrl(configId) { 426 + async getAppDownloadUrl(configId) {
519 const { data, status, info } = await this.$request.getAppDownloadUrl({ 427 const { data, status, info } = await this.$request.getAppDownloadUrl({
520 configId: configId || "", 428 configId: configId || "",
521 }); 429 });
@@ -539,49 +447,60 @@ export default { @@ -539,49 +447,60 @@ export default {
539 width: 100%; 447 width: 100%;
540 position: relative; 448 position: relative;
541 } 449 }
  450 +
542 .page-content { 451 .page-content {
543 padding: 30px; 452 padding: 30px;
  453 +
544 .content-top { 454 .content-top {
545 padding: 20px 50px 20px 20px; 455 padding: 20px 50px 20px 20px;
546 display: flex; 456 display: flex;
547 justify-content: space-between; 457 justify-content: space-between;
548 align-items: center; 458 align-items: center;
  459 +
549 .cont-info { 460 .cont-info {
550 flex: 1; 461 flex: 1;
551 display: flex; 462 display: flex;
552 align-items: center; 463 align-items: center;
  464 +
553 .logo { 465 .logo {
554 width: 140px; 466 width: 140px;
555 margin-right: 16px; 467 margin-right: 16px;
556 } 468 }
  469 +
557 .name { 470 .name {
558 font-size: 20px; 471 font-size: 20px;
559 color: #333; 472 color: #333;
560 line-height: 24px; 473 line-height: 24px;
561 padding-bottom: 12px; 474 padding-bottom: 12px;
562 } 475 }
  476 +
563 .txt { 477 .txt {
564 font-size: 15px; 478 font-size: 15px;
565 color: #7f7f7f; 479 color: #7f7f7f;
566 line-height: 25px; 480 line-height: 25px;
567 } 481 }
568 } 482 }
  483 +
569 .down-box { 484 .down-box {
570 width: 200px; 485 width: 200px;
571 text-align: center; 486 text-align: center;
  487 +
572 .txt { 488 .txt {
573 font-size: 16px; 489 font-size: 16px;
574 padding-bottom: 8px; 490 padding-bottom: 8px;
575 } 491 }
  492 +
576 .down-btn { 493 .down-btn {
577 font-size: 20px; 494 font-size: 20px;
578 } 495 }
579 } 496 }
580 } 497 }
  498 +
581 .down-ul { 499 .down-ul {
582 display: flex; 500 display: flex;
583 flex-wrap: wrap; 501 flex-wrap: wrap;
584 padding: 0 20px; 502 padding: 0 20px;
  503 +
585 .down-li { 504 .down-li {
586 width: calc(50% - 12px); 505 width: calc(50% - 12px);
587 height: 72px; 506 height: 72px;
@@ -594,22 +513,27 @@ export default { @@ -594,22 +513,27 @@ export default {
594 border-radius: 10px; 513 border-radius: 10px;
595 background: #f8f8f8; 514 background: #f8f8f8;
596 box-shadow: 2px 2px 5px #ccc; 515 box-shadow: 2px 2px 5px #ccc;
  516 +
597 &:nth-child(2n) { 517 &:nth-child(2n) {
598 margin-right: 0; 518 margin-right: 0;
599 } 519 }
  520 +
600 font-size: 16px; 521 font-size: 16px;
601 color: #667ffd; 522 color: #667ffd;
  523 +
602 .p1 { 524 .p1 {
603 cursor: pointer; 525 cursor: pointer;
604 } 526 }
605 } 527 }
606 } 528 }
607 } 529 }
  530 +
608 :deep(.el-button.is-round) { 531 :deep(.el-button.is-round) {
609 width: 120px; 532 width: 120px;
610 text-align: center; 533 text-align: center;
611 padding: 10px 0; 534 padding: 10px 0;
612 } 535 }
  536 +
613 .edit-dia { 537 .edit-dia {
614 position: absolute; 538 position: absolute;
615 left: 0; 539 left: 0;
@@ -620,6 +544,7 @@ export default { @@ -620,6 +544,7 @@ export default {
620 height: calc(100vh - 80px); 544 height: calc(100vh - 80px);
621 background: #fff; 545 background: #fff;
622 overflow-y: auto; 546 overflow-y: auto;
  547 +
623 .back { 548 .back {
624 width: 100%; 549 width: 100%;
625 height: 56px; 550 height: 56px;
@@ -628,6 +553,7 @@ export default { @@ -628,6 +553,7 @@ export default {
628 align-items: center; 553 align-items: center;
629 padding: 0 20px; 554 padding: 0 20px;
630 box-sizing: border-box; 555 box-sizing: border-box;
  556 +
631 .back-l { 557 .back-l {
632 display: flex; 558 display: flex;
633 align-items: center; 559 align-items: center;
@@ -636,26 +562,33 @@ export default { @@ -636,26 +562,33 @@ export default {
636 font-size: 18px; 562 font-size: 18px;
637 font-weight: 500; 563 font-weight: 500;
638 } 564 }
  565 +
639 .fa-mail-reply-all { 566 .fa-mail-reply-all {
640 font-size: 28px; 567 font-size: 28px;
641 color: #b3b3b3; 568 color: #b3b3b3;
642 margin-right: 12px; 569 margin-right: 12px;
643 } 570 }
644 } 571 }
  572 +
645 .form-box { 573 .form-box {
646 padding: 20px; 574 padding: 20px;
  575 +
647 .popup-menu { 576 .popup-menu {
648 padding-bottom: 16px; 577 padding-bottom: 16px;
  578 +
649 span { 579 span {
650 padding-right: 12px; 580 padding-right: 12px;
651 } 581 }
652 } 582 }
  583 +
653 .popup-menu1 { 584 .popup-menu1 {
654 padding-bottom: 0; 585 padding-bottom: 0;
655 } 586 }
  587 +
656 .count-down { 588 .count-down {
657 width: 48px; 589 width: 48px;
658 margin: 0 8px 0 20px; 590 margin: 0 8px 0 20px;
  591 +
659 :deep(.el-input__inner) { 592 :deep(.el-input__inner) {
660 width: 48px; 593 width: 48px;
661 height: 32px; 594 height: 32px;
@@ -664,25 +597,31 @@ export default { @@ -664,25 +597,31 @@ export default {
664 border-color: #667ffd; 597 border-color: #667ffd;
665 padding: 0; 598 padding: 0;
666 } 599 }
  600 +
667 :deep(.el-input-number__decrease) { 601 :deep(.el-input-number__decrease) {
668 display: none; 602 display: none;
669 } 603 }
  604 +
670 :deep(.el-input-number__increase) { 605 :deep(.el-input-number__increase) {
671 display: none; 606 display: none;
672 } 607 }
673 } 608 }
  609 +
674 .count-down2 { 610 .count-down2 {
675 margin-left: 0; 611 margin-left: 0;
676 } 612 }
  613 +
677 .silde-box { 614 .silde-box {
678 position: relative; 615 position: relative;
679 width: 100%; 616 width: 100%;
680 height: 60px; 617 height: 60px;
  618 +
681 .silde-p { 619 .silde-p {
682 width: 100%; 620 width: 100%;
683 position: absolute; 621 position: absolute;
684 padding-top: 20px; 622 padding-top: 20px;
685 - & > span { 623 +
  624 + &>span {
686 position: absolute; 625 position: absolute;
687 width: 48px; 626 width: 48px;
688 text-align: center; 627 text-align: center;
@@ -690,19 +629,24 @@ export default { @@ -690,19 +629,24 @@ export default {
690 flex-shrink: 0; 629 flex-shrink: 0;
691 font-size: 12px; 630 font-size: 12px;
692 } 631 }
  632 +
693 :deep(.el-slider) { 633 :deep(.el-slider) {
694 flex: 1; 634 flex: 1;
695 } 635 }
  636 +
696 :deep(.el-slider__runway) { 637 :deep(.el-slider__runway) {
697 margin: 5px 0; 638 margin: 5px 0;
698 } 639 }
  640 +
699 :deep(.el-slider__runway) { 641 :deep(.el-slider__runway) {
700 background-color: #409eff; 642 background-color: #409eff;
701 } 643 }
  644 +
702 .num { 645 .num {
703 top: 0; 646 top: 0;
704 transform: translateX(-24px); 647 transform: translateX(-24px);
705 } 648 }
  649 +
706 .txt { 650 .txt {
707 bottom: -20px; 651 bottom: -20px;
708 transform: translateX(-24px); 652 transform: translateX(-24px);
src/views/basic/setUp/clazz.vue
@@ -82,9 +82,12 @@ @@ -82,9 +82,12 @@
82 <upload id="downTeacher" drag :url="url" 82 <upload id="downTeacher" drag :url="url"
83 style="border:rgb(219,226,235) dashed 1px;margin:0px auto;width: 80%;padding:40px 0px;border-radius: 5px;" 83 style="border:rgb(219,226,235) dashed 1px;margin:0px auto;width: 80%;padding:40px 0px;border-radius: 5px;"
84 @upSuccess="upSuccess" fileName="班级名单"> 84 @upSuccess="upSuccess" fileName="班级名单">
85 - <p class="down-txt" slot="down">  
86 - 通过Excel名单导入班级名单模板  
87 - </p> 85 + <div class="down-txt" slot="down" style="padding: 0px !important;">
  86 + <span style="text-align: center;margin:0px auto;">通过Excel名单导入班级名单模板</span>
  87 + </div>
  88 + <div class="down-txt" slot="descption" style="padding: 0px !important;">
  89 + <span style="text-align: center;margin:0px auto;color:red;">为避免导入班级类型出错,上传文件的名称必须包含“行政班”或“教学班”。</span>
  90 + </div>
88 </upload> 91 </upload>
89 </el-row> 92 </el-row>
90 </div> 93 </div>
src/views/basic/setUp/student.vue
@@ -230,7 +230,7 @@ @@ -230,7 +230,7 @@
230 @change="changeClazz()" 230 @change="changeClazz()"
231 placeholder="选择当前班级" 231 placeholder="选择当前班级"
232 > 232 >
233 - <el-option 233 + <el-option :key="index"
234 v-for="(item, index) in formStuCla.classList" 234 v-for="(item, index) in formStuCla.classList"
235 :label="item.className" 235 :label="item.className"
236 :value="item.id" 236 :value="item.id"
src/views/basic/setUp/teacher.vue
@@ -25,6 +25,12 @@ @@ -25,6 +25,12 @@
25 <el-option label="行政班" :value="0"></el-option> 25 <el-option label="行政班" :value="0"></el-option>
26 <el-option label="教学班" :value="1"></el-option> 26 <el-option label="教学班" :value="1"></el-option>
27 </el-select> 27 </el-select>
  28 + <el-select class="sel" @change="_QueryData(5)" v-model="query.role" placeholder="选择角色">
  29 + <el-option disabled label="请选择" :value="9"></el-option>
  30 + <el-option label="年级组长" :value="'年级组长'"></el-option>
  31 + <el-option label="班主任" :value="'班主任'"></el-option>
  32 + <el-option label="任课老师" :value="'任课老师'"></el-option>
  33 + </el-select>
28 <el-cascader size="small" class="sel sel2" clearable placeholder="选择范围" @change="_QueryData(1)" 34 <el-cascader size="small" class="sel sel2" clearable placeholder="选择范围" @change="_QueryData(1)"
29 v-model="query.gradeClassSub" :options="gradeClassSubList" :props="{ 35 v-model="query.gradeClassSub" :options="gradeClassSubList" :props="{
30 multiple: true, 36 multiple: true,
@@ -59,19 +65,17 @@ @@ -59,19 +65,17 @@
59 <el-checkbox v-show="showDel" v-model="AllTeacher" :indeterminate="indeterminate" 65 <el-checkbox v-show="showDel" v-model="AllTeacher" :indeterminate="indeterminate"
60 @change="handleCheckAllChange">{{ "" }}</el-checkbox> 66 @change="handleCheckAllChange">{{ "" }}</el-checkbox>
61 <span class="txt">教师列表</span> 67 <span class="txt">教师列表</span>
62 - <el-popconfirm v-show="showDel" title="确定所选教师格式化吗?" @confirm="remove"> 68 + <el-popconfirm v-show="showDel" title="确定清除所选教师的任课信息吗?" @confirm="remove">
63 <img slot="reference" class="clear" src="../../../assets/images/shuazi.svg" alt="" /> 69 <img slot="reference" class="clear" src="../../../assets/images/shuazi.svg" alt="" />
64 </el-popconfirm> 70 </el-popconfirm>
65 </p> 71 </p>
66 <el-checkbox-group v-model="clearTeacher" @change="handleCheckedChange"> 72 <el-checkbox-group v-model="clearTeacher" @change="handleCheckedChange">
67 <ul class="teacher-ul"> 73 <ul class="teacher-ul">
68 <li class="teacher-item" v-for="item in teacherList" :key="item.id"> 74 <li class="teacher-item" v-for="item in teacherList" :key="item.id">
69 - <el-checkbox v-show="showDel" :label="item.id">{{  
70 - ""  
71 - }}</el-checkbox> 75 + <el-checkbox v-show="showDel" :label="item.id">{{ "" }}</el-checkbox>
72 <p class="name" :class="showTId == item.id ? 'active' : ''" @click="showTeacher(item)"> 76 <p class="name" :class="showTId == item.id ? 'active' : ''" @click="showTeacher(item)">
73 - {{ item.realName  
74 - }}<template v-if="setClass(item)">({{ setClass(item) }})</template> 77 + {{ item.realName }}
  78 + <template v-if="setClass(item)">({{ setClass(item) }})</template>
75 </p> 79 </p>
76 </li> 80 </li>
77 </ul> 81 </ul>
@@ -97,6 +101,26 @@ @@ -97,6 +101,26 @@
97 }} 101 }}
98 </p> 102 </p>
99 </div> 103 </div>
  104 + <div class="grade-box" v-if="teacherDetail.teacherGradeList && teacherDetail.teacherGradeList.length">
  105 + <p class="h-title">年级组长</p>
  106 + <ul class="grade-info">
  107 + <li class="grade-li" v-for="item in teacherDetail.teacherGradeList" :key="item.classId">
  108 + <el-popconfirm title="确定删除吗?" @confirm="delTeacherManager(item, 0)" v-if="!code">
  109 + <i class="el-icon-delete" slot="reference"></i>
  110 + </el-popconfirm>
  111 + <div class="grade-item">
  112 + <p class="grade-name">
  113 + {{ item.gradeName }}
  114 + </p>
  115 + <div class="grade-class">
  116 + <p>
  117 + <i class="fa fa-address-book-o"></i>学生:{{ item.studentNum }}个
  118 + </p>
  119 + </div>
  120 + </div>
  121 + </li>
  122 + </ul>
  123 + </div>
100 <div class="grade-box" v-if="teacherDetail.managerList && teacherDetail.managerList.length"> 124 <div class="grade-box" v-if="teacherDetail.managerList && teacherDetail.managerList.length">
101 <p class="h-title">班主任</p> 125 <p class="h-title">班主任</p>
102 <ul class="grade-info"> 126 <ul class="grade-info">
@@ -119,9 +143,7 @@ @@ -119,9 +143,7 @@
119 </li> 143 </li>
120 </ul> 144 </ul>
121 </div> 145 </div>
122 - <div class="grade-box" v-if="teacherDetail.teacherCourseList &&  
123 - teacherDetail.teacherCourseList.length  
124 - "> 146 + <div class="grade-box" v-if="teacherDetail.teacherCourseList && teacherDetail.teacherCourseList.length">
125 <p class="h-title">任课老师</p> 147 <p class="h-title">任课老师</p>
126 <ul class="grade-info"> 148 <ul class="grade-info">
127 <li class="grade-li" v-for="item in teacherDetail.teacherCourseList" 149 <li class="grade-li" v-for="item in teacherDetail.teacherCourseList"
@@ -146,35 +168,6 @@ @@ -146,35 +168,6 @@
146 </li> 168 </li>
147 </ul> 169 </ul>
148 </div> 170 </div>
149 - <!-- <div  
150 - class="grade-box"  
151 - v-if="  
152 - teacherDetail.teacherGradeList &&  
153 - teacherDetail.teacherGradeList.length  
154 - "  
155 - >  
156 - <p class="h-title">备课组长</p>  
157 - <ul  
158 - class="grade-info"  
159 - v-for="item in teacherDetail.teacherGradeList"  
160 - :key="item.grade"  
161 - >  
162 - <li class="grade-li">  
163 - <el-popconfirm  
164 - title="确定删除吗?"  
165 - @confirm="delTeacherManager(item, 3)"  
166 - v-if="!code"  
167 - >  
168 - <i class="el-icon-delete" slot="reference"></i>  
169 - </el-popconfirm>  
170 - <div class="grade-item">  
171 - <p class="grade-name">  
172 - {{ item.gradeName }}({{ item.subjectName }})  
173 - </p>  
174 - </div>  
175 - </li>  
176 - </ul>  
177 - </div> -->  
178 </div> 171 </div>
179 </div> 172 </div>
180 </div> 173 </div>
@@ -213,27 +206,29 @@ @@ -213,27 +206,29 @@
213 </el-radio-group> 206 </el-radio-group>
214 </el-form-item> 207 </el-form-item>
215 <el-form-item v-show="isAdd || (!isAdd && setTercherType == 2)" label="教师角色:" prop="roleList"> 208 <el-form-item v-show="isAdd || (!isAdd && setTercherType == 2)" label="教师角色:" prop="roleList">
216 - <div class="role-list" v-for="(item, index) in formTeacher.roleList" :key="item.id">  
217 - <el-select class="sel-c" v-model="item.roleId" placeholder="选择角色" @change="item.classId = []">  
218 - <el-option v-for="item in teacherRoleList" :key="item.value" :label="item.label" :value="item.value">  
219 - </el-option>  
220 - </el-select>  
221 - <el-cascader size="small" v-if="item.roleId == 6" class="sel-t" collapse clearable placeholder="选择年级-班级"  
222 - v-model="item.classId" :options="gradeClassList" :props="{ expandTrigger: 'hover' }"></el-cascader>  
223 - <el-cascader size="small" v-if="item.roleId == 7" class="sel-t teacher-cascader" collapse clearable  
224 - placeholder="选择年级-科目-班级" v-model="item.classId" :options="gradeSubListClass"  
225 - :props="{ expandTrigger: 'hover', multiple: true }" popperClass="cascader-clazz"></el-cascader>  
226 - <el-cascader size="small" v-if="item.roleId == 8" class="sel-t" collapse clearable placeholder="选择年级-科目"  
227 - v-model="item.classId" :options="gradeList" :props="{ expandTrigger: 'hover' }"></el-cascader>  
228 - <el-select v-if="item.roleId == 3" v-model="item.gradeId" placeholder="选择年级">  
229 - <el-option v-for="item in gradeList" :key="item.value" :label="item.label" :value="item.value">  
230 - </el-option>  
231 - </el-select>  
232 - <i class="el-icon-close" @click="removeRoleList(index)"></i> 209 + <div class="role-list-main">
  210 + <div class="role-list" v-for="(item, index) in formTeacher.roleList" :key="item.id">
  211 + <el-select class="sel-c" v-model="item.roleId" placeholder="选择角色" @change="item.classId = []">
  212 + <el-option v-for="item in teacherRoleList" :key="item.value" :label="item.label" :value="item.value">
  213 + </el-option>
  214 + </el-select>
  215 + <el-cascader size="small" v-if="item.roleId == 6" class="sel-t" collapse clearable placeholder="选择年级-班级"
  216 + v-model="item.classId" :options="gradeClassList" :props="{ expandTrigger: 'hover' }"></el-cascader>
  217 + <el-cascader size="small" v-if="item.roleId == 7" class="sel-t teacher-cascader" collapse clearable
  218 + placeholder="选择年级-科目-班级" v-model="item.classId" :options="gradeSubListClass"
  219 + :props="{ expandTrigger: 'hover', multiple: true }" popperClass="cascader-clazz"></el-cascader>
  220 + <el-cascader size="small" v-if="item.roleId == 8" class="sel-t" collapse clearable placeholder="选择年级-科目"
  221 + v-model="item.classId" :options="gradeList" :props="{ expandTrigger: 'hover' }"></el-cascader>
  222 + <el-select v-if="item.roleId == 3" v-model="item.gradeId" placeholder="选择年级">
  223 + <el-option v-for="item in gradeList" :key="item.value" :label="item.label" :value="item.value">
  224 + </el-option>
  225 + </el-select>
  226 + <i class="el-icon-close" @click="removeRoleList(index)"></i>
  227 + </div>
  228 + <p class="add-box">
  229 + <el-button icon="el-icon-plus" @click="addRoleList">添加</el-button>
  230 + </p>
233 </div> 231 </div>
234 - <p class="add-box">  
235 - <el-button icon="el-icon-plus" @click="addRoleList">添加</el-button>  
236 - </p>  
237 </el-form-item> 232 </el-form-item>
238 </el-form> 233 </el-form>
239 <div class="dialog-footer" slot="footer"> 234 <div class="dialog-footer" slot="footer">
@@ -338,7 +333,7 @@ export default { @@ -338,7 +333,7 @@ export default {
338 ], 333 ],
339 sex: [{ required: true, message: "请选择性别", trigger: "blur" }], 334 sex: [{ required: true, message: "请选择性别", trigger: "blur" }],
340 roleList: [ 335 roleList: [
341 - { required: true, message: "请选择角色信息", trigger: "blur" }, 336 + { required: false, message: "请选择角色信息", trigger: "blur" },
342 ], 337 ],
343 }, 338 },
344 339
@@ -549,21 +544,18 @@ export default { @@ -549,21 +544,18 @@ export default {
549 let ERR_OK = this.formTeacher.roleList.length > 0; 544 let ERR_OK = this.formTeacher.roleList.length > 0;
550 if (ERR_OK) { 545 if (ERR_OK) {
551 let [managerList, teacherCourseList, gradeGroupList] = [[], [], []]; 546 let [managerList, teacherCourseList, gradeGroupList] = [[], [], []];
  547 + console.log(this.formTeacher.roleList)
552 this.formTeacher.roleList.map((item) => { 548 this.formTeacher.roleList.map((item) => {
553 if (item.roleId == 6) { 549 if (item.roleId == 6) {
554 managerList.push({ 550 managerList.push({
555 classId: item.classId[1], 551 classId: item.classId[1],
556 - className:  
557 - this.classList.find((items) => items.value == item.classId[1])  
558 - ?.label || "", 552 + className: this.classList.find((items) => items.value == item.classId[1])?.label || "",
559 }); 553 });
560 } else if (item.roleId == 7) { 554 } else if (item.roleId == 7) {
561 item.classId.map((clazz) => { 555 item.classId.map((clazz) => {
562 teacherCourseList.push({ 556 teacherCourseList.push({
563 classId: clazz[2], 557 classId: clazz[2],
564 - className:  
565 - this.classList.find((items) => items.value == clazz[2])  
566 - ?.label || "", 558 + className: this.classList.find((items) => items.value == clazz[2])?.label || "",
567 subjectName: clazz[1], 559 subjectName: clazz[1],
568 }); 560 });
569 }); 561 });
@@ -571,17 +563,8 @@ export default { @@ -571,17 +563,8 @@ export default {
571 else if (item.roleId == 3) { 563 else if (item.roleId == 3) {
572 gradeGroupList.push({ 564 gradeGroupList.push({
573 grade: item.gradeId 565 grade: item.gradeId
574 - }) 566 + })
575 } 567 }
576 - // else {  
577 - // gradeGroupList.push({  
578 - // grade: item.classId[0],  
579 - // gradeName:  
580 - // this.gradeList.find((items) => items.id == item.classId[0])  
581 - // ?.label || "",  
582 - // subjectName: item.classId[1],  
583 - // });  
584 - // }  
585 }); 568 });
586 return { 569 return {
587 managerList, 570 managerList,
@@ -589,36 +572,29 @@ export default { @@ -589,36 +572,29 @@ export default {
589 gradeGroupList, 572 gradeGroupList,
590 }; 573 };
591 } else { 574 } else {
592 - return false; 575 + if (this.setTercherType == 2)
  576 + return false;
  577 + return true;
593 } 578 }
594 }, 579 },
595 //教师角色数据转换为form格式数据 580 //教师角色数据转换为form格式数据
596 toTeacherForm() { 581 toTeacherForm() {
597 this.formTeacher.roleList = []; 582 this.formTeacher.roleList = [];
  583 + //班主任
598 this.formTeacher.managerList?.map((item) => { 584 this.formTeacher.managerList?.map((item) => {
599 this.formTeacher.roleList.push({ 585 this.formTeacher.roleList.push({
600 id: randomWord(true, 16, 20), 586 id: randomWord(true, 16, 20),
601 roleId: 6, 587 roleId: 6,
602 - classId: [  
603 - this.classList.find(  
604 - (items) =>  
605 - items.value == item.classId ||  
606 - items.label.includes(item.className)  
607 - )?.grade,  
608 - item.classId,  
609 - ], 588 + classId: [item.grade, item.classId],
610 }); 589 });
611 }); 590 });
  591 + //任课老师
612 let teacherClassId = []; 592 let teacherClassId = [];
613 this.formTeacher.teacherCourseList?.map((item) => { 593 this.formTeacher.teacherCourseList?.map((item) => {
614 teacherClassId.push([ 594 teacherClassId.push([
615 item.grade, 595 item.grade,
616 item.subjectName, 596 item.subjectName,
617 - this.classList.find(  
618 - (items) =>  
619 - items.value == item.classId ||  
620 - items.label.includes(item.className)  
621 - ).value, 597 + this.classList.find((items) => items.value == item.classId).value,
622 ]); 598 ]);
623 }); 599 });
624 if (teacherClassId.length) { 600 if (teacherClassId.length) {
@@ -628,21 +604,25 @@ export default { @@ -628,21 +604,25 @@ export default {
628 classId: [...teacherClassId], 604 classId: [...teacherClassId],
629 }); 605 });
630 } 606 }
631 - // this.formTeacher.gradeGroupList?.map((item) => {  
632 - // this.formTeacher.roleList.push({  
633 - // id: randomWord(true, 16, 20),  
634 - // roleId: 8,  
635 - // classId: [  
636 - // this.gradeList.find((items) => items.id == item.classId[0]).id,  
637 - // item.subjectName,  
638 - // ],  
639 - // });  
640 - // }); 607 + //年级组长
  608 + this.formTeacher.teacherGradeList?.map((item) => {
  609 + this.formTeacher.roleList.push({
  610 + id: randomWord(true, 16, 20),
  611 + roleId: 3,
  612 + gradeId: item.grade
  613 + });
  614 + });
  615 + console.log(this.formTeacher)
641 }, 616 },
642 //删除教师角色 617 //删除教师角色
643 async delTeacherManager(obj, type) { 618 async delTeacherManager(obj, type) {
644 let query; 619 let query;
645 switch (type) { 620 switch (type) {
  621 + case 0:
  622 + query = {
  623 + garde: obj.grade,
  624 + };
  625 + break;
646 case 1: 626 case 1:
647 query = { 627 query = {
648 classId: obj.classId, 628 classId: obj.classId,
@@ -734,7 +714,8 @@ export default { @@ -734,7 +714,8 @@ export default {
734 this.query.phone = ""; 714 this.query.phone = "";
735 this.query.gradeClassSub = []; 715 this.query.gradeClassSub = [];
736 query.type = this.query.type; 716 query.type = this.query.type;
737 - } else { 717 + }
  718 + else {
738 query = { ...this.query }; 719 query = { ...this.query };
739 query.grades = []; 720 query.grades = [];
740 query.classIds = []; 721 query.classIds = [];
@@ -995,6 +976,7 @@ export default { @@ -995,6 +976,7 @@ export default {
995 } 976 }
996 977
997 .teacher-list { 978 .teacher-list {
  979 +
998 width: 240px; 980 width: 240px;
999 981
1000 .h-title { 982 .h-title {
@@ -1122,6 +1104,7 @@ export default { @@ -1122,6 +1104,7 @@ export default {
1122 font-weight: bold; 1104 font-weight: bold;
1123 line-height: 18px; 1105 line-height: 18px;
1124 padding-bottom: 12px; 1106 padding-bottom: 12px;
  1107 + padding-right: 5px;
1125 } 1108 }
1126 1109
1127 .grade-class { 1110 .grade-class {
@@ -1154,10 +1137,15 @@ export default { @@ -1154,10 +1137,15 @@ export default {
1154 margin-right: 12px; 1137 margin-right: 12px;
1155 } 1138 }
1156 1139
  1140 +.role-list-main {
  1141 + float: left;
  1142 +}
  1143 +
1157 .role-list { 1144 .role-list {
1158 margin-bottom: 10px; 1145 margin-bottom: 10px;
1159 position: relative; 1146 position: relative;
1160 1147
  1148 +
1161 .sel-p { 1149 .sel-p {
1162 position: absolute; 1150 position: absolute;
1163 left: 146px; 1151 left: 146px;
src/views/basic/test/archiving.vue
@@ -7,82 +7,33 @@ @@ -7,82 +7,33 @@
7 </back-box> 7 </back-box>
8 <div class="answer-header"> 8 <div class="answer-header">
9 <div class="sel-box"> 9 <div class="sel-box">
10 - <el-select  
11 - class="sel"  
12 - v-model="query.classId"  
13 - placeholder="选择班级"  
14 - @change="changeclass"  
15 - >  
16 - <el-option  
17 - v-for="item in classList"  
18 - :key="item.value"  
19 - :label="item.label"  
20 - :value="item.value"  
21 - > 10 + <el-select class="sel" v-model="query.classId" placeholder="选择班级" @change="changeclass">
  11 + <el-option v-for="item in classList" :key="item.value" :label="item.label" :value="item.value">
22 </el-option> 12 </el-option>
23 </el-select> 13 </el-select>
24 - <el-select  
25 - v-if="role == 'ROLE_BANZHUREN'"  
26 - class="sel"  
27 - multiple  
28 - v-model="query.subjectNames"  
29 - placeholder="选择科目"  
30 - @change="changeSub"  
31 - >  
32 - <el-option  
33 - v-for="item in subjectList"  
34 - :key="item.value"  
35 - :label="item.label"  
36 - :value="item.value"  
37 - > 14 + <el-select v-if="role == 'ROLE_BANZHUREN'" class="sel" multiple v-model="query.subjectNames" placeholder="选择科目"
  15 + @change="changeSub">
  16 + <el-option v-for="item in subjectList" :key="item.value" :label="item.label" :value="item.value">
38 </el-option> 17 </el-option>
39 </el-select> 18 </el-select>
40 - <el-select  
41 - v-else  
42 - class="sel"  
43 - v-model="query.subjectNames"  
44 - placeholder="选择科目"  
45 - >  
46 - <el-option  
47 - v-for="item in subjectList"  
48 - :key="item.value"  
49 - :label="item.label"  
50 - :value="item.value"  
51 - > 19 + <el-select v-else class="sel" v-model="query.subjectNames" placeholder="选择科目">
  20 + <el-option v-for="item in subjectList" :key="item.value" :label="item.label" :value="item.value">
52 </el-option> 21 </el-option>
53 </el-select> 22 </el-select>
54 <div class="d1"> 23 <div class="d1">
55 - <el-date-picker  
56 - v-model="query.startDay"  
57 - type="date"  
58 - @change="handleChangeTimeStart"  
59 - placeholder="选择日期时间"  
60 - value-format="yyyy-MM-dd"  
61 - > 24 + <el-date-picker v-model="query.startDay" type="date" @change="handleChangeTimeStart" placeholder="选择日期时间"
  25 + value-format="yyyy-MM-dd">
62 </el-date-picker> 26 </el-date-picker>
63 ~ 27 ~
64 - <el-date-picker  
65 - v-model="query.endDay"  
66 - type="date"  
67 - placeholder="选择日期时间"  
68 - @change="handleChangeTimeEnd"  
69 - value-format="yyyy-MM-dd"  
70 - > 28 + <el-date-picker v-model="query.endDay" type="date" placeholder="选择日期时间" @change="handleChangeTimeEnd"
  29 + value-format="yyyy-MM-dd">
71 </el-date-picker> 30 </el-date-picker>
72 </div> 31 </div>
73 <p class="p1"> 32 <p class="p1">
74 - <span @click="setDate(1)" :class="[date == 1 ? 'active' : '', 's1']"  
75 - >今天</span  
76 - >  
77 - <span @click="setDate(2)" :class="[date == 2 ? 'active' : '', 's1']"  
78 - >本周</span  
79 - >  
80 - <span @click="setDate(3)" :class="[date == 3 ? 'active' : '', 's1']"  
81 - >本月</span  
82 - >  
83 - <span @click="setDate(4)" :class="[date == 4 ? 'active' : '', 's1']"  
84 - >本季度</span  
85 - > 33 + <span @click="setDate(1)" :class="[date == 1 ? 'active' : '', 's1']">今天</span>
  34 + <span @click="setDate(2)" :class="[date == 2 ? 'active' : '', 's1']">本周</span>
  35 + <span @click="setDate(3)" :class="[date == 3 ? 'active' : '', 's1']">本月</span>
  36 + <span @click="setDate(4)" :class="[date == 4 ? 'active' : '', 's1']">本季度</span>
86 </p> 37 </p>
87 <el-button type="primary" round @click="_QueryData()">筛选</el-button> 38 <el-button type="primary" round @click="_QueryData()">筛选</el-button>
88 </div> 39 </div>
@@ -104,71 +55,39 @@ @@ -104,71 +55,39 @@
104 </el-radio-group> --> 55 </el-radio-group> -->
105 <div v-show="tabIndex == 1" v-loading="loading"> 56 <div v-show="tabIndex == 1" v-loading="loading">
106 <el-table :data="tableData" border style="width: 100%"> 57 <el-table :data="tableData" border style="width: 100%">
107 - <el-table-column  
108 - prop="title"  
109 - label="试卷名称"  
110 - fixed  
111 - align="center"  
112 - ></el-table-column>  
113 - <el-table-column  
114 - prop="examPaperScore"  
115 - label="卷面分"  
116 - align="center"  
117 - width="68"  
118 - ></el-table-column>  
119 - <el-table-column prop="answeredNum" label="测验人数" align="center"  
120 - ><template slot-scope="scoped">{{  
121 - `${scoped.row.answeredNum}/${scoped.row.classPersonNum}`  
122 - }}</template></el-table-column  
123 - >  
124 - <el-table-column  
125 - prop="examStartTime"  
126 - label="测验时间"  
127 - width="100"  
128 - align="center"  
129 - ></el-table-column>  
130 - <el-table-column prop="avgScore" label="班平均分" align="center"  
131 - ><template slot-scope="scoped">{{  
132 - (scoped.row.subjectiveScore == scoped.row.examPaperScore ||  
133 - scoped.row.answerNum == 0) && 58 + <el-table-column prop="title" label="试卷名称" fixed align="center"></el-table-column>
  59 + <el-table-column prop="examPaperScore" label="卷面分" align="center" width="68"></el-table-column>
  60 + <el-table-column prop="answeredNum" label="测验人数" align="center"><template slot-scope="scoped">{{
  61 + `${scoped.row.answeredNum}/${scoped.row.classPersonNum}`
  62 + }}</template></el-table-column>
  63 + <el-table-column prop="examStartTime" label="测验时间" width="100" align="center"></el-table-column>
  64 + <el-table-column prop="avgScore" label="班平均分" align="center"><template slot-scope="scoped">{{
  65 + (scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  66 + scoped.row.answerNum == 0) &&
134 scoped.row.recordStatus == 0 67 scoped.row.recordStatus == 0
135 - ? "-"  
136 - : scoped.row.avgScore  
137 - }}</template></el-table-column  
138 - >  
139 - <el-table-column prop="highestScore" label="班最高分" align="center"  
140 - ><template slot-scope="scoped">{{  
141 - (scoped.row.subjectiveScore == scoped.row.examPaperScore ||  
142 - scoped.row.answerNum == 0) && 68 + ? "-"
  69 + : scoped.row.avgScore
  70 + }}</template></el-table-column>
  71 + <el-table-column prop="highestScore" label="班最高分" align="center"><template slot-scope="scoped">{{
  72 + (scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  73 + scoped.row.answerNum == 0) &&
143 scoped.row.recordStatus == 0 74 scoped.row.recordStatus == 0
144 - ? "-"  
145 - : scoped.row.highestScore  
146 - }}</template></el-table-column  
147 - >  
148 - <el-table-column prop="lowestScore" label="班最低分" align="center"  
149 - ><template slot-scope="scoped">{{  
150 - (scoped.row.subjectiveScore == scoped.row.examPaperScore ||  
151 - scoped.row.answerNum == 0) && 75 + ? "-"
  76 + : scoped.row.highestScore
  77 + }}</template></el-table-column>
  78 + <el-table-column prop="lowestScore" label="班最低分" align="center"><template slot-scope="scoped">{{
  79 + (scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  80 + scoped.row.answerNum == 0) &&
152 scoped.row.recordStatus == 0 81 scoped.row.recordStatus == 0
153 - ? "-"  
154 - : scoped.row.lowestScore  
155 - }}</template></el-table-column  
156 - >  
157 - <el-table-column  
158 - prop="excellenRate"  
159 - label="优秀数(率)"  
160 - sortable  
161 - align="center"  
162 - width="110"  
163 - class-name="p0"  
164 - ><template slot-scope="scoped">  
165 - <p  
166 - v-if="  
167 - (scoped.row.subjectiveScore == scoped.row.examPaperScore ||  
168 - scoped.row.answerNum == 0) &&  
169 - scoped.row.arecordStatus == 0  
170 - "  
171 - > 82 + ? "-"
  83 + : scoped.row.lowestScore
  84 + }}</template></el-table-column>
  85 + <el-table-column prop="excellenRate" label="优秀数(率)" sortable align="center" width="110"
  86 + class-name="p0"><template slot-scope="scoped">
  87 + <p v-if="(scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  88 + scoped.row.answerNum == 0) &&
  89 + scoped.row.arecordStatus == 0
  90 + ">
172 "-" 91 "-"
173 </p> 92 </p>
174 <template v-else> 93 <template v-else>
@@ -177,23 +96,13 @@ @@ -177,23 +96,13 @@
177 {{ `(${scoped.row.excellenRate}%)` }} 96 {{ `(${scoped.row.excellenRate}%)` }}
178 </p> 97 </p>
179 </template> 98 </template>
180 - </template></el-table-column  
181 - >  
182 - <el-table-column  
183 - prop="goodRate"  
184 - label="良好数(率)"  
185 - sortable  
186 - align="center"  
187 - width="110"  
188 - class-name="p0"  
189 - ><template slot-scope="scoped">  
190 - <p  
191 - v-if="  
192 - (scoped.row.subjectiveScore == scoped.row.examPaperScore ||  
193 - scoped.row.answerNum == 0) &&  
194 - scoped.row.arecordStatus == 0  
195 - "  
196 - > 99 + </template></el-table-column>
  100 + <el-table-column prop="goodRate" label="良好数(率)" sortable align="center" width="110" class-name="p0"><template
  101 + slot-scope="scoped">
  102 + <p v-if="(scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  103 + scoped.row.answerNum == 0) &&
  104 + scoped.row.arecordStatus == 0
  105 + ">
197 "-" 106 "-"
198 </p> 107 </p>
199 <template v-else> 108 <template v-else>
@@ -202,23 +111,13 @@ @@ -202,23 +111,13 @@
202 {{ `(${scoped.row.goodRate}%)` }} 111 {{ `(${scoped.row.goodRate}%)` }}
203 </p> 112 </p>
204 </template> 113 </template>
205 - </template></el-table-column  
206 - >  
207 - <el-table-column  
208 - prop="passRate"  
209 - label="及格数(率)"  
210 - sortable  
211 - align="center"  
212 - width="110"  
213 - class-name="p0"  
214 - ><template slot-scope="scoped">  
215 - <p  
216 - v-if="  
217 - (scoped.row.subjectiveScore == scoped.row.examPaperScore ||  
218 - scoped.row.answerNum == 0) &&  
219 - scoped.row.arecordStatus == 0  
220 - "  
221 - > 114 + </template></el-table-column>
  115 + <el-table-column prop="passRate" label="及格数(率)" sortable align="center" width="110" class-name="p0"><template
  116 + slot-scope="scoped">
  117 + <p v-if="(scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  118 + scoped.row.answerNum == 0) &&
  119 + scoped.row.arecordStatus == 0
  120 + ">
222 "-" 121 "-"
223 </p> 122 </p>
224 <template v-else> 123 <template v-else>
@@ -227,23 +126,13 @@ @@ -227,23 +126,13 @@
227 {{ `(${scoped.row.passRate}%)` }} 126 {{ `(${scoped.row.passRate}%)` }}
228 </p> 127 </p>
229 </template> 128 </template>
230 - </template></el-table-column  
231 - >  
232 - <el-table-column  
233 - prop="failedRate"  
234 - label="不及格数(率)"  
235 - sortable  
236 - align="center"  
237 - width="130"  
238 - class-name="p0"  
239 - ><template slot-scope="scoped">  
240 - <p  
241 - v-if="  
242 - (scoped.row.subjectiveScore == scoped.row.examPaperScore ||  
243 - scoped.row.answerNum == 0) &&  
244 - scoped.row.arecordStatus == 0  
245 - "  
246 - > 129 + </template></el-table-column>
  130 + <el-table-column prop="failedRate" label="不及格数(率)" sortable align="center" width="130"
  131 + class-name="p0"><template slot-scope="scoped">
  132 + <p v-if="(scoped.row.subjectiveScore == scoped.row.examPaperScore ||
  133 + scoped.row.answerNum == 0) &&
  134 + scoped.row.arecordStatus == 0
  135 + ">
247 "-" 136 "-"
248 </p> 137 </p>
249 <template v-else> 138 <template v-else>
@@ -252,155 +141,59 @@ @@ -252,155 +141,59 @@
252 {{ `(${scoped.row.failedRate}%)` }} 141 {{ `(${scoped.row.failedRate}%)` }}
253 </p> 142 </p>
254 </template> 143 </template>
255 - </template></el-table-column  
256 - > 144 + </template></el-table-column>
257 <el-table-column label="操作" align="center"> 145 <el-table-column label="操作" align="center">
258 <template slot-scope="scoped"> 146 <template slot-scope="scoped">
259 <el-tooltip effect="dark" content="详情" placement="top"> 147 <el-tooltip effect="dark" content="详情" placement="top">
260 - <el-button  
261 - type="primary"  
262 - circle  
263 - size="mini"  
264 - icon="fa fa-arrow-right"  
265 - @click="linkTo(scoped.row)"  
266 - ></el-button> 148 + <el-button type="primary" circle size="mini" icon="fa fa-arrow-right"
  149 + @click="linkTo(scoped.row)"></el-button>
267 </el-tooltip> 150 </el-tooltip>
268 </template> 151 </template>
269 </el-table-column> 152 </el-table-column>
270 </el-table> 153 </el-table>
271 <div class="pagination-box"> 154 <div class="pagination-box">
272 - <el-pagination  
273 - small=""  
274 - layout="total,prev, pager, next"  
275 - :hide-on-single-page="true"  
276 - :total="total"  
277 - @current-change="changePage"  
278 - :current-page="page"  
279 - :page-size="size"  
280 - > 155 + <el-pagination small="" layout="total,prev, pager, next" :hide-on-single-page="true" :total="total"
  156 + @current-change="changePage" :current-page="page" :page-size="size">
281 </el-pagination> 157 </el-pagination>
282 </div> 158 </div>
283 </div> 159 </div>
284 <div v-show="tabIndex == 2" v-loading="loading"> 160 <div v-show="tabIndex == 2" v-loading="loading">
285 - <el-empty  
286 - :image-size="100"  
287 - v-if="!tableData.length && loading == false"  
288 - description="没有更多数据"  
289 - ></el-empty> 161 + <el-empty :image-size="100" v-if="!tableData.length && loading == false" description="没有更多数据"></el-empty>
290 <template v-if="tableData.length && loading == false"> 162 <template v-if="tableData.length && loading == false">
291 <div id="print-content"> 163 <div id="print-content">
292 - <el-table  
293 - :max-height="tableMaxHeight"  
294 - v-if="role == 'ROLE_JIAOSHI'"  
295 - :data="tableData"  
296 - border  
297 - style="width: 100%"  
298 - >  
299 - <el-table-column  
300 - prop="studentCode"  
301 - label="学号"  
302 - align="center"  
303 - fixed  
304 - ></el-table-column>  
305 - <el-table-column  
306 - prop="studentName"  
307 - label="姓名"  
308 - fixed  
309 - align="center"  
310 - ></el-table-column>  
311 - <el-table-column  
312 - align="center"  
313 - v-for="(item, index) in answerList"  
314 - :key="index"  
315 - :label="item.title"  
316 - >  
317 - <el-table-column  
318 - :prop="'score' + index"  
319 - :label="index == 0 ? '总分' : '成绩'"  
320 - align="center"  
321 - :class-name="index % 2 == 0 ? 'bg' : ''"  
322 - ></el-table-column>  
323 - <el-table-column  
324 - :prop="'classRank' + index"  
325 - label="班名"  
326 - align="center"  
327 - :class-name="index % 2 == 0 ? 'bg' : ''"  
328 - ></el-table-column> 164 + <el-table :max-height="tableMaxHeight" v-if="role == 'ROLE_JIAOSHI'" :data="tableData" border
  165 + style="width: 100%">
  166 + <el-table-column prop="studentCode" label="学号" align="center" fixed></el-table-column>
  167 + <el-table-column prop="studentName" label="姓名" fixed align="center"></el-table-column>
  168 + <el-table-column align="center" v-for="(item, index) in answerList" :key="index" :label="item.title">
  169 + <el-table-column :prop="'score' + index" :label="index == 0 ? '总分' : '成绩'" align="center"
  170 + :class-name="index % 2 == 0 ? 'bg' : ''"></el-table-column>
  171 + <el-table-column :prop="'classRank' + index" label="班名" align="center"
  172 + :class-name="index % 2 == 0 ? 'bg' : ''"></el-table-column>
329 </el-table-column> 173 </el-table-column>
330 </el-table> 174 </el-table>
331 - <el-table  
332 - v-else  
333 - :data="tableData"  
334 - :max-height="tableMaxHeight"  
335 - border  
336 - style="width: 100%"  
337 - >  
338 - <el-table-column  
339 - prop="studentCode"  
340 - label="学号"  
341 - align="center"  
342 - fixed  
343 - ></el-table-column> 175 + <el-table v-else :data="tableData" :max-height="tableMaxHeight" border style="width: 100%">
  176 + <el-table-column prop="studentCode" label="学号" align="center" fixed></el-table-column>
344 177
345 - <el-table-column  
346 - prop="studentName"  
347 - label="姓名"  
348 - fixed  
349 - align="center"  
350 - ></el-table-column>  
351 - <el-table-column  
352 - align="center"  
353 - v-for="(item, index) in answerList"  
354 - :key="index"  
355 - :label="item"  
356 - >  
357 - <el-table-column  
358 - :prop="'examCount' + item"  
359 - label="测练数"  
360 - align="center"  
361 - :class-name="index % 2 == 0 ? 'bg' : ''"  
362 - ></el-table-column>  
363 - <el-table-column  
364 - :prop="'participationCount' + item"  
365 - label="参与数"  
366 - align="center"  
367 - :class-name="index % 2 == 0 ? 'bg' : ''"  
368 - ></el-table-column>  
369 - <el-table-column  
370 - :prop="'score' + item"  
371 - label="总分"  
372 - align="center"  
373 - :class-name="index % 2 == 0 ? 'bg' : ''"  
374 - ></el-table-column>  
375 - <el-table-column  
376 - :prop="'classRank' + item"  
377 - label="班名"  
378 - align="center"  
379 - :class-name="index % 2 == 0 ? 'bg' : ''"  
380 - ></el-table-column> 178 + <el-table-column prop="studentName" label="姓名" fixed align="center"></el-table-column>
  179 + <el-table-column align="center" v-for="(item, index) in answerList" :key="index" :label="item">
  180 + <el-table-column :prop="'examCount' + item" label="测练数" align="center"
  181 + :class-name="index % 2 == 0 ? 'bg' : ''"></el-table-column>
  182 + <el-table-column :prop="'participationCount' + item" label="参与数" align="center"
  183 + :class-name="index % 2 == 0 ? 'bg' : ''"></el-table-column>
  184 + <el-table-column :prop="'score' + item" label="总分" align="center"
  185 + :class-name="index % 2 == 0 ? 'bg' : ''"></el-table-column>
  186 + <el-table-column :prop="'classRank' + item" label="班名" align="center"
  187 + :class-name="index % 2 == 0 ? 'bg' : ''"></el-table-column>
381 </el-table-column> 188 </el-table-column>
382 </el-table> 189 </el-table>
383 </div> 190 </div>
384 </template> 191 </template>
385 </div> 192 </div>
386 <p class="down" v-if="tabIndex == 2 && tableData.length"> 193 <p class="down" v-if="tabIndex == 2 && tableData.length">
387 - <el-button  
388 - type="primary"  
389 - plain  
390 - round  
391 - icon="fa fa-cloud-download"  
392 - @click="downExl"  
393 - >导出报表</el-button  
394 - >  
395 - <el-button  
396 - v-if="!this.$store.getters.code"  
397 - @click="print"  
398 - type="primary"  
399 - plain  
400 - round  
401 - icon="el-icon-printer"  
402 - >打印</el-button  
403 - > 194 + <el-button type="primary" plain round icon="fa fa-cloud-download" @click="downExl">导出报表</el-button>
  195 + <el-button v-if="!this.$store.getters.code" @click="print" type="primary" plain round
  196 + icon="el-icon-printer">打印</el-button>
404 </p> 197 </p>
405 </div> 198 </div>
406 </div> 199 </div>
@@ -462,7 +255,10 @@ export default { @@ -462,7 +255,10 @@ export default {
462 }, 255 },
463 methods: { 256 methods: {
464 print() { 257 print() {
465 - tablePrint("print-content", "即时测-" + this.tabList[this.tabIndex - 1]); 258 + tablePrint({
  259 + id: "print-content",
  260 + title: "即时测-" + this.tabList[this.tabIndex - 1]
  261 + });
466 }, 262 },
467 changeSub(val) { 263 changeSub(val) {
468 //科目改变触发事件 264 //科目改变触发事件
@@ -832,6 +628,7 @@ div::-webkit-scrollbar { @@ -832,6 +628,7 @@ div::-webkit-scrollbar {
832 width: 3px; 628 width: 3px;
833 height: 10px; 629 height: 10px;
834 } 630 }
  631 +
835 div::-webkit-scrollbar-thumb { 632 div::-webkit-scrollbar-thumb {
836 border-radius: 10px; 633 border-radius: 10px;
837 background-color: #ccc; 634 background-color: #ccc;
@@ -841,25 +638,31 @@ div::-webkit-scrollbar-thumb { @@ -841,25 +638,31 @@ div::-webkit-scrollbar-thumb {
841 .page-container { 638 .page-container {
842 position: relative; 639 position: relative;
843 height: 100%; 640 height: 100%;
  641 +
844 &.active { 642 &.active {
845 overflow: hidden; 643 overflow: hidden;
846 } 644 }
847 } 645 }
  646 +
848 .table-box { 647 .table-box {
849 margin: 0 20px; 648 margin: 0 20px;
850 padding: 16px; 649 padding: 16px;
851 background: #f8f8f8; 650 background: #f8f8f8;
852 border-radius: 5px; 651 border-radius: 5px;
  652 +
853 :deep(.fa-arrow-right) { 653 :deep(.fa-arrow-right) {
854 padding-left: 2px; 654 padding-left: 2px;
855 } 655 }
  656 +
856 :deep(.fa-file-text) { 657 :deep(.fa-file-text) {
857 padding-left: 2px; 658 padding-left: 2px;
858 } 659 }
859 } 660 }
  661 +
860 .down { 662 .down {
861 padding-top: 16px; 663 padding-top: 16px;
862 } 664 }
  665 +
863 .click-b { 666 .click-b {
864 cursor: pointer; 667 cursor: pointer;
865 color: #409eff; 668 color: #409eff;
src/views/basic/test/components/contrast.vue
@@ -47,7 +47,8 @@ @@ -47,7 +47,8 @@
47 </div> 47 </div>
48 </div> 48 </div>
49 49
50 - <el-dialog :append-to-body="true" :close-on-click-modal="false" title="等级设置" :visible.sync="diaLogBox" width="800px" @closed="closeDia"> 50 + <el-dialog :append-to-body="true" :close-on-click-modal="false" title="等级设置" :visible.sync="diaLogBox"
  51 + width="800px" @closed="closeDia">
51 <el-form class="use-form"> 52 <el-form class="use-form">
52 <el-form-item class="use-form-item-box"> 53 <el-form-item class="use-form-item-box">
53 <el-form-item label="等级名称:" class="use-form-item"> 54 <el-form-item label="等级名称:" class="use-form-item">
@@ -87,8 +88,8 @@ @@ -87,8 +88,8 @@
87 <template v-if="fromData.levelType == 0"> 88 <template v-if="fromData.levelType == 0">
88 ({{ index != 0 ? "不含" : "" 89 ({{ index != 0 ? "不含" : ""
89 }}{{ 90 }}{{
90 - Number(((item[1] / 100) * examPaperScore).toFixed(1))  
91 -}}分) 91 + Number(((item[1] / 100) * examPaperScore).toFixed(1))
  92 + }}分)
92 </template> 93 </template>
93 <template v-else>{{ index != 0 ? "不含" : "" }}</template> 94 <template v-else>{{ index != 0 ? "不含" : "" }}</template>
94 </p> 95 </p>
@@ -99,8 +100,8 @@ @@ -99,8 +100,8 @@
99 % 100 %
100 <template v-if="fromData.levelType == 0"> 101 <template v-if="fromData.levelType == 0">
101 ({{ 102 ({{
102 - Number(((item[2] / 100) * examPaperScore).toFixed(1))  
103 - }}分) 103 + Number(((item[2] / 100) * examPaperScore).toFixed(1))
  104 + }}分)
104 </template> 105 </template>
105 </p> 106 </p>
106 <p class="item"> 107 <p class="item">
@@ -177,10 +178,10 @@ export default { @@ -177,10 +178,10 @@ export default {
177 } 178 }
178 }, 179 },
179 print() { 180 print() {
180 - tablePrint(  
181 - "print-content",  
182 - `多班_${this.subjectName}_${this.title}_测练成绩对比分析`  
183 - ); 181 + tablePrint({
  182 + id: "print-content",
  183 + title: `多班_${this.subjectName}_${this.title}_测练成绩对比分析`
  184 + })
184 }, 185 },
185 setType(type) { 186 setType(type) {
186 this.tableMaxHeight = this.$refs.main.offsetHeight; 187 this.tableMaxHeight = this.$refs.main.offsetHeight;
src/views/basic/test/components/multipleSubTest.vue
@@ -2,135 +2,71 @@ @@ -2,135 +2,71 @@
2 <div class="table-box" ref="main" v-loading="loading"> 2 <div class="table-box" ref="main" v-loading="loading">
3 <div id="print-content"> 3 <div id="print-content">
4 <!-- 多科多卷 --> 4 <!-- 多科多卷 -->
5 - <el-table  
6 - :data="tableData"  
7 - :max-height="tableMaxHeight"  
8 - border  
9 - style="width: 100%"  
10 - >  
11 - <el-table-column  
12 - prop="studentCode"  
13 - label="学号"  
14 - align="center"  
15 - fixed  
16 - ></el-table-column> 5 + <el-table :data="tableData" :max-height="tableMaxHeight" border style="width: 100%">
  6 + <el-table-column prop="studentCode" label="学号" align="center" fixed></el-table-column>
17 7
18 <el-table-column prop="studentName" label="姓名" fixed align="center"> 8 <el-table-column prop="studentName" label="姓名" fixed align="center">
19 - <template slot-scope="scoped"  
20 - ><span class="click-b" @click="toPortrait(scoped.row)"> 9 + <template slot-scope="scoped"><span class="click-b" @click="toPortrait(scoped.row)">
21 {{ scoped.row.studentName }} 10 {{ scoped.row.studentName }}
22 - </span></template  
23 - > 11 + </span></template>
24 </el-table-column> 12 </el-table-column>
25 - <el-table-column  
26 - align="center"  
27 - v-for="(item, index) in answerList"  
28 - :key="index"  
29 - :label="item"  
30 - >  
31 - <el-table-column  
32 - :prop="'examCount' + item"  
33 - label="测练数"  
34 - align="center"  
35 - :class-name="index % 2 == 0 ? 'bg' : ''"  
36 - > 13 + <el-table-column align="center" v-for="(item, index) in answerList" :key="index" :label="item">
  14 + <el-table-column :prop="'examCount' + item" label="测练数" align="center"
  15 + :class-name="index % 2 == 0 ? 'bg' : ''">
37 <template slot-scope="scoped">{{ 16 <template slot-scope="scoped">{{
38 - scoped.row["examCount" + item] ||  
39 - Number(scoped.row["examCount" + item]) === 0  
40 - ? scoped.row["examCount" + item]  
41 - : "-"  
42 - }}</template> 17 + scoped.row["examCount" + item] ||
  18 + Number(scoped.row["examCount" + item]) === 0
  19 + ? scoped.row["examCount" + item]
  20 + : "-"
  21 + }}</template>
43 </el-table-column> 22 </el-table-column>
44 - <el-table-column  
45 - :prop="'participationCount' + item"  
46 - label="参与数"  
47 - align="center"  
48 - :class-name="index % 2 == 0 ? 'bg' : ''"  
49 - > 23 + <el-table-column :prop="'participationCount' + item" label="参与数" align="center"
  24 + :class-name="index % 2 == 0 ? 'bg' : ''">
50 <template slot-scope="scoped">{{ 25 <template slot-scope="scoped">{{
51 - scoped.row["participationCount" + item] ||  
52 - Number(scoped.row["participationCount" + item]) === 0  
53 - ? scoped.row["participationCount" + item]  
54 - : "-"  
55 - }}</template> 26 + scoped.row["participationCount" + item] ||
  27 + Number(scoped.row["participationCount" + item]) === 0
  28 + ? scoped.row["participationCount" + item]
  29 + : "-"
  30 + }}</template>
56 </el-table-column> 31 </el-table-column>
57 - <el-table-column  
58 - :prop="'score' + item"  
59 - label="总分"  
60 - align="center"  
61 - :class-name="index % 2 == 0 ? 'bg' : ''"  
62 - > 32 + <el-table-column :prop="'score' + item" label="总分" align="center" :class-name="index % 2 == 0 ? 'bg' : ''">
63 <template slot-scope="scoped">{{ 33 <template slot-scope="scoped">{{
64 - scoped.row["score" + item] ||  
65 - Number(scoped.row["score" + item]) === 0  
66 - ? scoped.row["score" + item]  
67 - : "-"  
68 - }}</template> 34 + scoped.row["score" + item] ||
  35 + Number(scoped.row["score" + item]) === 0
  36 + ? scoped.row["score" + item]
  37 + : "-"
  38 + }}</template>
69 </el-table-column> 39 </el-table-column>
70 - <el-table-column  
71 - :prop="'classRank' + item"  
72 - label="班名"  
73 - align="center"  
74 - :class-name="index % 2 == 0 ? 'bg' : ''"  
75 - > 40 + <el-table-column :prop="'classRank' + item" label="班名" align="center"
  41 + :class-name="index % 2 == 0 ? 'bg' : ''">
76 <template slot-scope="scoped">{{ 42 <template slot-scope="scoped">{{
77 - scoped.row["classRank" + item] ||  
78 - Number(scoped.row["classRank" + item]) === 0  
79 - ? scoped.row["classRank" + item]  
80 - : "-"  
81 - }}</template> 43 + scoped.row["classRank" + item] ||
  44 + Number(scoped.row["classRank" + item]) === 0
  45 + ? scoped.row["classRank" + item]
  46 + : "-"
  47 + }}</template>
82 </el-table-column> 48 </el-table-column>
83 </el-table-column> 49 </el-table-column>
84 <el-table-column label="查看雷达图" align="center"> 50 <el-table-column label="查看雷达图" align="center">
85 <template slot-scope="scoped"> 51 <template slot-scope="scoped">
86 - <el-button  
87 - @click="openChart(scoped.row)"  
88 - type="primary"  
89 - size="mini"  
90 - circle  
91 - icon="el-icon-arrow-right"  
92 - ></el-button> 52 + <el-button @click="openChart(scoped.row)" type="primary" size="mini" circle
  53 + icon="el-icon-arrow-right"></el-button>
93 </template> 54 </template>
94 </el-table-column> 55 </el-table-column>
95 </el-table> 56 </el-table>
96 </div> 57 </div>
97 <div class="down"> 58 <div class="down">
98 - <el-button  
99 - @click="openDown"  
100 - type="primary"  
101 - plain  
102 - round  
103 - icon="fa fa-cloud-download"  
104 - >导出报表</el-button  
105 - >  
106 - <el-button  
107 - v-if="!this.$store.getters.code"  
108 - @click="print"  
109 - type="primary"  
110 - plain  
111 - round  
112 - icon="el-icon-printer"  
113 - >打印</el-button  
114 - > 59 + <el-button @click="openDown" type="primary" plain round icon="fa fa-cloud-download">导出报表</el-button>
  60 + <el-button v-if="!this.$store.getters.code" @click="print" type="primary" plain round
  61 + icon="el-icon-printer">打印</el-button>
115 </div> 62 </div>
116 - <el-dialog :append-to-body="true"  
117 - class="chart-dia"  
118 - :visible.sync="chartDia"  
119 - :title="chartTitle"  
120 - width="800"  
121 - > 63 + <el-dialog :append-to-body="true" class="chart-dia" :visible.sync="chartDia" :title="chartTitle" width="800">
122 <div class="chart-box"> 64 <div class="chart-box">
123 <RadarChart id="radarChart" :params="chartData" /> 65 <RadarChart id="radarChart" :params="chartData" />
124 </div> 66 </div>
125 </el-dialog> 67 </el-dialog>
126 - <ExportDia  
127 - :exportStudent="exportStudent"  
128 - :diaShow="diaShow"  
129 - @cancel="cancel"  
130 - @exportData="exportData"  
131 - lastLabel="总分"  
132 - type="雷达图"  
133 - /> 68 + <ExportDia :exportStudent="exportStudent" :diaShow="diaShow" @cancel="cancel" @exportData="exportData"
  69 + lastLabel="总分" type="雷达图" />
134 </div> 70 </div>
135 </template> 71 </template>
136 <script> 72 <script>
@@ -188,7 +124,10 @@ export default { @@ -188,7 +124,10 @@ export default {
188 }, 124 },
189 methods: { 125 methods: {
190 print() { 126 print() {
191 - tablePrint("print-content", this.subjectName + "汇总报表"); 127 + tablePrint({
  128 + id: "print-content",
  129 + title: this.subjectName + "汇总报表"
  130 + })
192 }, 131 },
193 toPortrait(obj) { 132 toPortrait(obj) {
194 //暂时不上线 133 //暂时不上线
src/views/basic/test/components/multipleTest.vue
@@ -91,7 +91,10 @@ export default { @@ -91,7 +91,10 @@ export default {
91 }, 91 },
92 methods: { 92 methods: {
93 print() { 93 print() {
94 - tablePrint("print-content", this.subjectName + "汇总报表"); 94 + tablePrint({
  95 + id: "print-content",
  96 + title: this.subjectName + "汇总报表"
  97 + })
95 }, 98 },
96 //查看折线图 99 //查看折线图
97 openChart(obj) { 100 openChart(obj) {
src/views/basic/test/components/scoreSet.vue
@@ -43,7 +43,7 @@ @@ -43,7 +43,7 @@
43 </template> 43 </template>
44 </el-table-column> 44 </el-table-column>
45 <!-- <el-table-column v-for="(item, index) in questionList" :key="index" :label="'第' + cNum[index] + '大题'" --> 45 <!-- <el-table-column v-for="(item, index) in questionList" :key="index" :label="'第' + cNum[index] + '大题'" -->
46 - <el-table-column v-for="(question, index) in questionList" :key="index" :label="'Q' + question.questionId" 46 + <el-table-column v-for="(question, index) in questionList" :key="index" :label="'Q' + question.questionIndex"
47 align="center"> 47 align="center">
48 <template slot-scope="scoped"> 48 <template slot-scope="scoped">
49 <el-input v-if="showSetScore" type="number" :min="0" :max="question.questionScore" @input="setScore( 49 <el-input v-if="showSetScore" type="number" :min="0" :max="question.questionScore" @input="setScore(
@@ -174,11 +174,13 @@ export default { @@ -174,11 +174,13 @@ export default {
174 this.tableMaxHeight = this.$refs.scoreSet.offsetHeight - 135; 174 this.tableMaxHeight = this.$refs.scoreSet.offsetHeight - 135;
175 }, 175 },
176 async _QueryData() { 176 async _QueryData() {
  177 +
177 this.loading = true; 178 this.loading = true;
178 const { data, status, info } = 179 const { data, status, info } =
179 await this.$request.listStudentsAndQuestions({ 180 await this.$request.listStudentsAndQuestions({
180 examId: this.id, 181 examId: this.id,
181 }); 182 });
  183 +
182 this.loading = false; 184 this.loading = false;
183 if (status === 0) { 185 if (status === 0) {
184 this.dataReponse = data; 186 this.dataReponse = data;
@@ -186,14 +188,18 @@ export default { @@ -186,14 +188,18 @@ export default {
186 this.questionList = this.dataReponse?.questionList || []; 188 this.questionList = this.dataReponse?.questionList || [];
187 if (this.questionList.length == 0) { 189 if (this.questionList.length == 0) {
188 this.questionList = Object.keys(studentList[0].scoreMap).map( 190 this.questionList = Object.keys(studentList[0].scoreMap).map(
189 - (item) => { 191 + (item) => {
  192 + var splitItem = item.split('=');
190 return { 193 return {
191 - questionId: item, 194 + questionIndex: splitItem.length >= 1 ? splitItem[0] : null,
  195 + questionId: splitItem.length >= 1 ? splitItem[1] : null,
  196 + // questionId: item,
192 questionScore: 20, 197 questionScore: 20,
193 }; 198 };
194 } 199 }
195 - ); 200 + );
196 } 201 }
  202 +
197 this.tableData = 203 this.tableData =
198 studentList.map((item) => { 204 studentList.map((item) => {
199 item.all = item.all || 0; //总分 205 item.all = item.all || 0; //总分
@@ -249,8 +255,7 @@ export default { @@ -249,8 +255,7 @@ export default {
249 } else { 255 } else {
250 this.$message.error(info); 256 this.$message.error(info);
251 } 257 }
252 - },  
253 - 258 + },
254 //导入成功 259 //导入成功
255 upSuccess(res) { 260 upSuccess(res) {
256 261
@@ -265,30 +270,30 @@ export default { @@ -265,30 +270,30 @@ export default {
265 item.object = 0; //客观题分数 270 item.object = 0; //客观题分数
266 item.subject = 0; //主观题分数 271 item.subject = 0; //主观题分数
267 var detail = JSON.parse(res.data[item.studentId]); 272 var detail = JSON.parse(res.data[item.studentId]);
268 - 273 +
269 var scoreMap = {}; 274 var scoreMap = {};
270 - 275 +
271 if (detail) { 276 if (detail) {
272 detail.forEach(item => { 277 detail.forEach(item => {
273 scoreMap[item.id] = item.score 278 scoreMap[item.id] = item.score
274 }) 279 })
275 - } 280 + }
276 281
277 item.scoreMap = scoreMap; 282 item.scoreMap = scoreMap;
278 - 283 +
279 this.questionList.map((question) => { 284 this.questionList.map((question) => {
280 - let keys = question.questionId;  
281 - if (!item.scoreMap[keys]) {  
282 - if (item.scoreMap[keys] == 0) {  
283 - item.scoreMap[keys] = 0;  
284 - } else {  
285 - item.scoreMap[keys] = "";  
286 - } 285 + let keys = question.questionId;
  286 + if (!item.scoreMap[keys]) {
  287 + if (item.scoreMap[keys] == 0) {
  288 + item.scoreMap[keys] = 0;
287 } else { 289 } else {
288 - let num = Number(item.scoreMap[keys]);  
289 - item.scoreMap[keys] = num; 290 + item.scoreMap[keys] = "";
290 } 291 }
291 - }); 292 + } else {
  293 + let num = Number(item.scoreMap[keys]);
  294 + item.scoreMap[keys] = num;
  295 + }
  296 + });
292 297
293 return item; 298 return item;
294 }) || []; 299 }) || [];
src/views/examinationPaper/add.vue
@@ -9,25 +9,26 @@ @@ -9,25 +9,26 @@
9 <div class="content"> 9 <div class="content">
10 <el-dialog :close-on-click-modal="false" title="选择班级分享" :visible.sync="classSharingType" width="800" 10 <el-dialog :close-on-click-modal="false" title="选择班级分享" :visible.sync="classSharingType" width="800"
11 :modal-append-to-body="false" :append-to-body="true"> 11 :modal-append-to-body="false" :append-to-body="true">
12 - <div> 12 + <div :key="classSharingType">
13 <el-row class="row-subfix"> 13 <el-row class="row-subfix">
14 <div class="row-line"> 14 <div class="row-line">
15 <span class="line-subfix">年级:</span> 15 <span class="line-subfix">年级:</span>
16 <span class="line-value">{{ gradeName }}</span> 16 <span class="line-value">{{ gradeName }}</span>
17 </div> 17 </div>
18 </el-row> 18 </el-row>
19 - <el-row class="row-subfix" style="margin-top: 20px;"> 19 + <el-row v-if="shareClass.length >= 1" class="row-subfix" style="margin-top: 20px;">
20 <span class="line-subfix" style="float: left;">班级:</span> 20 <span class="line-subfix" style="float: left;">班级:</span>
21 <div class="row-line" style="float: left; 21 <div class="row-line" style="float: left;
22 background:rgb(245,247,250);padding:15px 10px;width: calc(100% - 80px);border-radius:5px;"> 22 background:rgb(245,247,250);padding:15px 10px;width: calc(100% - 80px);border-radius:5px;">
23 <span class="line-value" style="min-height: 300px;border-radius: 4px; background: rgb(247,247,250);"> 23 <span class="line-value" style="min-height: 300px;border-radius: 4px; background: rgb(247,247,250);">
24 <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" 24 <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll"
25 @change="handleCheckAllChange">全选</el-checkbox> 25 @change="handleCheckAllChange">全选</el-checkbox>
26 - <el-checkbox-group v-model="checkedClass" style="margin-top: 15px;" @change="handleCheckedClassChange">  
27 - <el-checkbox v-for="(item, index) in shareClass" :label="item.id" :key="item.id"> 26 + <div>
  27 + <el-checkbox @change="handleCheckedClassChange" v-model="item.isChecked" :key="index"
  28 + v-for="(item, index) in shareClass" :label="item.id">
28 {{ item.className }} 29 {{ item.className }}
29 </el-checkbox> 30 </el-checkbox>
30 - </el-checkbox-group> 31 + </div>
31 </span> 32 </span>
32 </div> 33 </div>
33 </el-row> 34 </el-row>
@@ -252,7 +253,7 @@ @@ -252,7 +253,7 @@
252 <el-dialog :close-on-click-modal="false" title="添加大题" :append-to-body="true" 253 <el-dialog :close-on-click-modal="false" title="添加大题" :append-to-body="true"
253 :visible.sync="addQuestionVisible" width="600px"> 254 :visible.sync="addQuestionVisible" width="600px">
254 <div class="dia-content"> 255 <div class="dia-content">
255 - <el-form ref="form" :model="questionForm" :rules="questionFormRules" label-width="100px"> 256 + <el-form ref="form" :model="questionForm" :rules="questionFormRules" label-width="150px">
256 <el-form-item label="标题:"> 257 <el-form-item label="标题:">
257 <el-col :span="20"> 258 <el-col :span="20">
258 <el-input v-model.trim="questionForm.questionTitle" maxlength="30" placeholder="输入大题名称"></el-input> 259 <el-input v-model.trim="questionForm.questionTitle" maxlength="30" placeholder="输入大题名称"></el-input>
@@ -354,7 +355,7 @@ @@ -354,7 +355,7 @@
354 <p class="name">{{ form.title }}</p> 355 <p class="name">{{ form.title }}</p>
355 <p class="totals">卷面总分:{{ allScore }}分</p> 356 <p class="totals">卷面总分:{{ allScore }}分</p>
356 </div> 357 </div>
357 - <div class="question-box" v-for="(question, index) in form.questionList" :key="index"> 358 + <div class="question-box flex-content" v-for="(question, index) in form.questionList" :key="index">
358 <p class="question-title"> 359 <p class="question-title">
359 <span>{{ setBigNum(index) }}、</span> 360 <span>{{ setBigNum(index) }}、</span>
360 <span class="title-txt">{{ question.questionTitle }}</span> 361 <span class="title-txt">{{ question.questionTitle }}</span>
@@ -374,7 +375,7 @@ @@ -374,7 +375,7 @@
374 <div class="qs-options qs-options2">选项设置</div> 375 <div class="qs-options qs-options2">选项设置</div>
375 <div class="qs-upload" v-if="isUpload">题干</div> 376 <div class="qs-upload" v-if="isUpload">题干</div>
376 <div class="qs-upload" v-if="isUpload">题目解析</div> 377 <div class="qs-upload" v-if="isUpload">题目解析</div>
377 - <div class="qs-upload" v-if="isUpload">知识点</div> 378 + <div class="qs-upload">知识点</div>
378 <div class="qs-set">操作</div> 379 <div class="qs-set">操作</div>
379 </li> 380 </li>
380 <li v-for="(subQuestions, indexs) in question.subQuestions" :key="indexs"> 381 <li v-for="(subQuestions, indexs) in question.subQuestions" :key="indexs">
@@ -446,11 +447,11 @@ @@ -446,11 +447,11 @@
446 <el-button slot="reference" class="icon-tickets" type="primary" circle size="mini" 447 <el-button slot="reference" class="icon-tickets" type="primary" circle size="mini"
447 icon="el-icon-tickets" @click="openStem(subQuestions, index, indexs, 2)"></el-button> 448 icon="el-icon-tickets" @click="openStem(subQuestions, index, indexs, 2)"></el-button>
448 </div> 449 </div>
449 - <div class="qs-upload">  
450 - <el-button type="primary" circle size="mini" icon="el-icon-price-tag"  
451 - @click="openKnowledge(subQuestions, index, indexs)"></el-button>  
452 - </div>  
453 </template> 450 </template>
  451 + <div class="qs-upload">
  452 + <el-button type="primary" circle size="mini" icon="el-icon-price-tag"
  453 + @click="openKnowledge(subQuestions, index, indexs)"></el-button>
  454 + </div>
454 <div class="qs-set"> 455 <div class="qs-set">
455 <el-popconfirm title="确定删除这道题吗?" @confirm="delTabData(indexs, index)"> 456 <el-popconfirm title="确定删除这道题吗?" @confirm="delTabData(indexs, index)">
456 <el-button slot="reference" class="delete" type="danger" size="mini" circle 457 <el-button slot="reference" class="delete" type="danger" size="mini" circle
@@ -508,16 +509,26 @@ @@ -508,16 +509,26 @@
508 <el-button @click="diaSetAns = false">取 消</el-button> 509 <el-button @click="diaSetAns = false">取 消</el-button>
509 </div> 510 </div>
510 </el-dialog> 511 </el-dialog>
511 - <div class="btn-box">  
512 - <el-button type="danger" plain round @click="linkBack">取消</el-button>  
513 - <template v-if="!isUpload">  
514 - <el-button round @click="toStep(1)">上一步</el-button>  
515 - <el-button type="primary" round @click="save">保存</el-button>  
516 - </template>  
517 - <template v-else>  
518 - <el-button round @click="step = 0">上一步</el-button>  
519 - <el-button type="primary" round @click="toStep(3)">下一步</el-button>  
520 - </template> 512 + <div class="btn-box flex-btn" style="text-align: center; ">
  513 + <div style="display: inline-block;line-height: 45px;">
  514 + <label>请仔细核对
  515 + <label style="color:red;">“题型” </label>
  516 + 和
  517 + <label style="color:red;">“答案”</label>
  518 + 等是否识别正确
  519 + </label>
  520 + </div>
  521 + <div style="display: inline;;float: right">
  522 + <el-button type="danger" plain round @click="linkBack">取消</el-button>
  523 + <template v-if="!isUpload">
  524 + <el-button round @click="toStep(1)">上一步</el-button>
  525 + <el-button type="primary" round @click="save">保存</el-button>
  526 + </template>
  527 + <template v-else>
  528 + <el-button round @click="step = 0">上一步</el-button>
  529 + <el-button type="primary" round @click="toStep(3)">下一步</el-button>
  530 + </template>
  531 + </div>
521 </div> 532 </div>
522 </div> 533 </div>
523 <div v-if="step == 3"> 534 <div v-if="step == 3">
@@ -525,7 +536,7 @@ @@ -525,7 +536,7 @@
525 <p class="name">{{ form.title }}</p> 536 <p class="name">{{ form.title }}</p>
526 <p class="totals">卷面总分:{{ allScore }}分</p> 537 <p class="totals">卷面总分:{{ allScore }}分</p>
527 </div> 538 </div>
528 - <div class="question-box"> 539 + <div class="question-box flex-content" >
529 <template v-for="(question, index) in form.questionList"> 540 <template v-for="(question, index) in form.questionList">
530 <p class="question-title"> 541 <p class="question-title">
531 <span>{{ setBigNum(index) }}、</span> 542 <span>{{ setBigNum(index) }}、</span>
@@ -540,7 +551,7 @@ @@ -540,7 +551,7 @@
540 </div> 551 </div>
541 </template> 552 </template>
542 </div> 553 </div>
543 - <div class="btn-box"> 554 + <div class="btn-box flex-btn">
544 <el-button type="danger" plain round @click="linkBack">取消</el-button> 555 <el-button type="danger" plain round @click="linkBack">取消</el-button>
545 <el-button round @click="toStep(2)">上一步</el-button> 556 <el-button round @click="toStep(2)">上一步</el-button>
546 <el-button type="primary" round @click="save">保存</el-button> 557 <el-button type="primary" round @click="save">保存</el-button>
@@ -569,20 +580,9 @@ @@ -569,20 +580,9 @@
569 </div> 580 </div>
570 </el-dialog> 581 </el-dialog>
571 <el-dialog :close-on-click-modal="false" :append-to-body="true" title="知识点" :visible.sync="dialogKnowledge" 582 <el-dialog :close-on-click-modal="false" :append-to-body="true" title="知识点" :visible.sync="dialogKnowledge"
572 - width="1200px">  
573 - <div>  
574 - <el-form ref="form" :model="stem" label-width="160px">  
575 - <el-form-item label="知识点:">  
576 - <el-cascader size="small" filterable :show-all-levels="false" collapse clearable placeholder="选择知识点"  
577 - v-model="stem.knowledge" :options="knowledgeData"  
578 - :props="{ expandTrigger: 'hover', multiple: true }"></el-cascader>  
579 - </el-form-item>  
580 - </el-form>  
581 - </div>  
582 - <div slot="footer">  
583 - <el-button @click="dialogKnowledge = false">取 消</el-button>  
584 - <el-button type="primary" @click="setKnowledge">确 定</el-button>  
585 - </div> 583 + width="60%">
  584 + <knowledgePoints :key="dialogKnowledge" @opration="knowledgeOpration" :sectionName="stem.sectionName"
  585 + :subjectName="stem.subjectName" :knowledges="stem.knowledge" />
586 </el-dialog> 586 </el-dialog>
587 </div> 587 </div>
588 </div> 588 </div>
@@ -590,6 +590,7 @@ @@ -590,6 +590,7 @@
590 590
591 <script> 591 <script>
592 import { deepClone, checkAnswer, cNum } from "utils"; 592 import { deepClone, checkAnswer, cNum } from "utils";
  593 +import conf from "@/config/index";
593 const questionForm = { 594 const questionForm = {
594 questionTitle: "", 595 questionTitle: "",
595 questionType: 2, 596 questionType: 2,
@@ -619,31 +620,22 @@ export default { @@ -619,31 +620,22 @@ export default {
619 }, 0); 620 }, 0);
620 return Number(score).toFixed(2); 621 return Number(score).toFixed(2);
621 }, 622 },
622 - // 知识点列表 根据学段-科目筛选  
623 - knowledgeData: function () {  
624 - let jsons = [];  
625 - if (this.form.gradeName && this.form.subjectName) {  
626 - let sectionName = "";  
627 - this.gradeClassList.map((item) => {  
628 - if (this.form.gradeName == item.gradeName) {  
629 - sectionName = item.sectionName;  
630 - }  
631 - });  
632 - if (  
633 - sectionName &&  
634 - Object.keys(this.knowledgeList).includes(sectionName)  
635 - ) {  
636 - if (  
637 - Object.keys(this.knowledgeList[sectionName]).includes(  
638 - this.form.subjectName  
639 - )  
640 - ) {  
641 - jsons = this.knowledgeList[sectionName][this.form.subjectName];  
642 - }  
643 - } 623 + uploadUrl: function () {
  624 + var requestUrl = '';
  625 +
  626 + var ogrinUrl = '/file/uploadImgToHtml';
  627 +
  628 + var baseUrl = conf.baseURL;
  629 +
  630 + if (baseUrl == '/' && ogrinUrl.indexOf('/') == 0) {
  631 + requestUrl = ogrinUrl;
644 } 632 }
645 - return jsons;  
646 - }, 633 + else {
  634 + requestUrl = baseUrl + ogrinUrl
  635 + }
  636 +
  637 + return requestUrl;
  638 + }
647 }, 639 },
648 watch: { 640 watch: {
649 step: function () { 641 step: function () {
@@ -748,7 +740,7 @@ export default { @@ -748,7 +740,7 @@ export default {
748 //返回列表页参数记录 740 //返回列表页参数记录
749 listType: 1, 741 listType: 1,
750 listShare: 0, 742 listShare: 0,
751 - uploadUrl: "/file/uploadImgToHtml", 743 + // uploadUrl: "/file/uploadImgToHtml",
752 iframeLoading: false, 744 iframeLoading: false,
753 }; 745 };
754 }, 746 },
@@ -785,18 +777,47 @@ export default { @@ -785,18 +777,47 @@ export default {
785 } 777 }
786 }, 778 },
787 methods: { 779 methods: {
  780 + openKnowledge(obj, index, indexs) {
  781 + this.stem.index = index;
  782 + this.stem.indexs = indexs || 0;
  783 + this.stem.knowledge = obj.knowledge;
  784 + if (this.form.gradeName && this.form.subjectName) {
  785 + var matchClass = this.gradeClassList.find((item) => {
  786 + if (this.form.gradeName == item.gradeName) {
  787 + return item.sectionName;
  788 + }
  789 + });
  790 + this.stem.sectionName = matchClass?.sectionName ?? "";
  791 + this.stem.subjectName = this.form.subjectName ?? "";
  792 + }
  793 + this.dialogKnowledge = true;
  794 + },
  795 + knowledgeOpration(target) {
  796 + if (target.opration == 'confirm') {
  797 + this.form.questionList[this.stem.index].
  798 + subQuestions[this.stem.indexs].knowledge = target.knowledges.join(",");
  799 + this.dialogKnowledge = false;
  800 + }
  801 + else {
  802 + this.dialogKnowledge = false;
  803 + }
  804 + },
788 _checkedClass() { 805 _checkedClass() {
  806 + this.checkedClass = this.shareClass.filter(item => item.isChecked).map(imap => imap.id);
789 this.classSharingType = false; 807 this.classSharingType = false;
790 }, 808 },
791 handleCheckAllChange(val) { 809 handleCheckAllChange(val) {
792 - this.checkedClass = val ? this.shareClass?.map(item => item.id) : []; 810 + this.shareClass.forEach(item => {
  811 + item.isChecked = val;
  812 + })
793 this.isIndeterminate = false; 813 this.isIndeterminate = false;
794 }, 814 },
795 handleCheckedClassChange(value) { 815 handleCheckedClassChange(value) {
  816 + var value = this.shareClass.filter(item => item.isChecked);
796 let checkedCount = value.length; 817 let checkedCount = value.length;
797 - this.checkAll = checkedCount === this.checkedClass.length;  
798 - this.isIndeterminate = checkedCount > 0 && checkedCount < this.checkedClass.length;  
799 - }, 818 + this.checkAll = checkedCount === this.shareClass.length;
  819 + this.isIndeterminate = checkedCount > 0 && checkedCount < this.shareClass.length;
  820 + },
800 // v1.5 821 // v1.5
801 //上传截图 822 //上传截图
802 openStem(obj, index, indexs, type) { 823 openStem(obj, index, indexs, type) {
@@ -843,21 +864,6 @@ export default { @@ -843,21 +864,6 @@ export default {
843 upError(res) { 864 upError(res) {
844 this.$message.error("上传失败"); 865 this.$message.error("上传失败");
845 }, 866 },
846 - // 打开知识点  
847 - openKnowledge(obj, index, indexs) {  
848 - this.stem.index = index;  
849 - this.stem.indexs = indexs;  
850 - this.stem.knowledge = (obj.knowledge && obj.knowledge.split("#")) || [];  
851 - this.dialogKnowledge = true;  
852 - },  
853 - // 选择知识点  
854 - setKnowledge() {  
855 - this.form.questionList[this.stem.index].subQuestions[  
856 - this.stem.indexs  
857 - ].knowledge = this.stem.knowledge.join("#");  
858 - this.dialogKnowledge = false;  
859 - },  
860 - //end  
861 867
862 //取消创建 868 //取消创建
863 linkBack() { 869 linkBack() {
@@ -1252,19 +1258,26 @@ export default { @@ -1252,19 +1258,26 @@ export default {
1252 1258
1253 this.classSharingType = true; 1259 this.classSharingType = true;
1254 1260
  1261 + this.shareClass = [];
  1262 +
1255 var grade = this.gradeClassList.find(item => item.gradeName == this.form.gradeName); 1263 var grade = this.gradeClassList.find(item => item.gradeName == this.form.gradeName);
1256 1264
1257 - var classResponse = await this.$request.tClassGrade(grade?.grade,this.form.subjectName); 1265 + var classResponse = await this.$request.tClassGrade(grade?.grade, this.form.subjectName);
1258 1266
1259 if (classResponse.status != 0) { 1267 if (classResponse.status != 0) {
1260 this.$message.error(classResponse.info); 1268 this.$message.error(classResponse.info);
  1269 + return;
1261 } 1270 }
1262 - 1271 +
1263 this.gradeName = grade.gradeName; 1272 this.gradeName = grade.gradeName;
1264 -  
1265 - this.shareClass = classResponse.data;  
1266 -  
1267 1273
  1274 + this.shareClass = [...classResponse.data.map(item => {
  1275 + return {
  1276 + isChecked: this.checkedClass.includes(item.id),
  1277 + id: item.id,
  1278 + className: item.className
  1279 + }
  1280 + })];
1268 }, 1281 },
1269 openQuestion() { 1282 openQuestion() {
1270 this.questionForm = { ...questionForm }; 1283 this.questionForm = { ...questionForm };
@@ -1520,28 +1533,28 @@ export default { @@ -1520,28 +1533,28 @@ export default {
1520 }, 1533 },
1521 async save() { 1534 async save() {
1522 if (this.saveLoading) return; 1535 if (this.saveLoading) return;
1523 - 1536 +
1524 this.saveLoading = true; 1537 this.saveLoading = true;
1525 - 1538 +
1526 this.formatQuestionList(); 1539 this.formatQuestionList();
1527 - 1540 +
1528 let formDatas = deepClone(this.form); 1541 let formDatas = deepClone(this.form);
1529 - 1542 +
1530 formDatas.questionList = formDatas.questionList.filter(item => { 1543 formDatas.questionList = formDatas.questionList.filter(item => {
1531 return item.subQuestions?.length >= 1; 1544 return item.subQuestions?.length >= 1;
1532 }); 1545 });
1533 - 1546 +
1534 for (let i = 0; i < formDatas.questionList.length; i++) { 1547 for (let i = 0; i < formDatas.questionList.length; i++) {
1535 delete formDatas.questionList[i].show; 1548 delete formDatas.questionList[i].show;
1536 } 1549 }
1537 - 1550 +
1538 let addPaper = 1551 let addPaper =
1539 this.role == "ROLE_PERSONAL" 1552 this.role == "ROLE_PERSONAL"
1540 ? this.$request.pAddPaper 1553 ? this.$request.pAddPaper
1541 : this.$request.addPaper; 1554 : this.$request.addPaper;
1542 1555
1543 formDatas.classIds = this.checkedClass.join(","); 1556 formDatas.classIds = this.checkedClass.join(",");
1544 - 1557 +
1545 const { data, status, info } = await addPaper({ 1558 const { data, status, info } = await addPaper({
1546 ...formDatas, 1559 ...formDatas,
1547 }); 1560 });
src/views/examinationPaper/addQs.vue
@@ -7,27 +7,28 @@ @@ -7,27 +7,28 @@
7 </template> 7 </template>
8 </back-box> 8 </back-box>
9 <div class="content"> 9 <div class="content">
10 -  
11 <el-dialog :close-on-click-modal="false" title="选择班级分享" :visible.sync="classSharingType" width="800" 10 <el-dialog :close-on-click-modal="false" title="选择班级分享" :visible.sync="classSharingType" width="800"
12 :modal-append-to-body="false" :append-to-body="true"> 11 :modal-append-to-body="false" :append-to-body="true">
13 - <div> 12 + <div :key="classSharingType">
14 <el-row class="row-subfix"> 13 <el-row class="row-subfix">
15 <div class="row-line"> 14 <div class="row-line">
16 <span class="line-subfix">年级:</span> 15 <span class="line-subfix">年级:</span>
17 <span class="line-value">{{ gradeName }}</span> 16 <span class="line-value">{{ gradeName }}</span>
18 </div> 17 </div>
19 </el-row> 18 </el-row>
20 - <el-row class="row-subfix" style="margin-top: 20px;"> 19 + <el-row v-if="shareClass.length >= 1" class="row-subfix" style="margin-top: 20px;">
21 <span class="line-subfix" style="float: left;">班级:</span> 20 <span class="line-subfix" style="float: left;">班级:</span>
22 <div class="row-line" style="float: left; 21 <div class="row-line" style="float: left;
23 background:rgb(245,247,250);padding:15px 10px;width: calc(100% - 80px);border-radius:5px;"> 22 background:rgb(245,247,250);padding:15px 10px;width: calc(100% - 80px);border-radius:5px;">
24 <span class="line-value" style="min-height: 300px;border-radius: 4px; background: rgb(247,247,250);"> 23 <span class="line-value" style="min-height: 300px;border-radius: 4px; background: rgb(247,247,250);">
25 <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" 24 <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll"
26 @change="handleCheckAllChange">全选</el-checkbox> 25 @change="handleCheckAllChange">全选</el-checkbox>
27 - <el-checkbox-group v-model="checkedClass" style="margin-top: 15px;" @change="handleCheckedClassChange">  
28 - <el-checkbox v-for="(item, index) in shareClass" :label="item.id" :key="item.id">{{  
29 - item.className }}</el-checkbox>  
30 - </el-checkbox-group> 26 + <div>
  27 + <el-checkbox @change="handleCheckedClassChange" v-model="item.isChecked" :key="index"
  28 + v-for="(item, index) in shareClass" :label="item.id">
  29 + {{ item.className }}
  30 + </el-checkbox>
  31 + </div>
31 </span> 32 </span>
32 </div> 33 </div>
33 </el-row> 34 </el-row>
@@ -81,7 +82,7 @@ @@ -81,7 +82,7 @@
81 <div class="answer-title"> 82 <div class="answer-title">
82 <p class="name">{{ form.title }}</p> 83 <p class="name">{{ form.title }}</p>
83 </div> 84 </div>
84 - <div class="question-box"> 85 + <div class="question-box flex-content" >
85 <ul class="questions-ul"> 86 <ul class="questions-ul">
86 <li class="sub-questions"> 87 <li class="sub-questions">
87 <div class="qs-num">题号</div> 88 <div class="qs-num">题号</div>
@@ -91,7 +92,7 @@ @@ -91,7 +92,7 @@
91 <div class="qs-options qs-options2">选项设置</div> 92 <div class="qs-options qs-options2">选项设置</div>
92 <div class="qs-upload">题干</div> 93 <div class="qs-upload">题干</div>
93 <div class="qs-upload">题目解析</div> 94 <div class="qs-upload">题目解析</div>
94 - <div class="qs-upload" >知识点</div> 95 + <div class="qs-upload">知识点</div>
95 <div class="qs-set">操作</div> 96 <div class="qs-set">操作</div>
96 </li> 97 </li>
97 </ul> 98 </ul>
@@ -157,7 +158,7 @@ @@ -157,7 +158,7 @@
157 <el-button class="icon-tickets" type="primary" circle size="mini" icon="el-icon-tickets" 158 <el-button class="icon-tickets" type="primary" circle size="mini" icon="el-icon-tickets"
158 @click="openStem(question, 2, index)"></el-button> 159 @click="openStem(question, 2, index)"></el-button>
159 </div> 160 </div>
160 - <div class="qs-upload" > 161 + <div class="qs-upload">
161 <el-button type="primary" circle size="mini" icon="el-icon-price-tag" 162 <el-button type="primary" circle size="mini" icon="el-icon-price-tag"
162 @click="openKnowledge(question, index)"></el-button> 163 @click="openKnowledge(question, index)"></el-button>
163 </div> 164 </div>
@@ -239,7 +240,7 @@ @@ -239,7 +240,7 @@
239 <el-button class="icon-tickets" type="primary" circle size="mini" icon="el-icon-tickets" 240 <el-button class="icon-tickets" type="primary" circle size="mini" icon="el-icon-tickets"
240 @click="openStem(subQuestions, 2, index, indexs)"></el-button> 241 @click="openStem(subQuestions, 2, index, indexs)"></el-button>
241 </div> 242 </div>
242 - <div class="qs-upload" > 243 + <div class="qs-upload">
243 <el-button type="primary" circle size="mini" icon="el-icon-price-tag" 244 <el-button type="primary" circle size="mini" icon="el-icon-price-tag"
244 @click="openKnowledge(subQuestions, index, indexs)"></el-button> 245 @click="openKnowledge(subQuestions, index, indexs)"></el-button>
245 </div> 246 </div>
@@ -302,10 +303,19 @@ @@ -302,10 +303,19 @@
302 <el-button @click="diaSetAns = false">取 消</el-button> 303 <el-button @click="diaSetAns = false">取 消</el-button>
303 </div> 304 </div>
304 </el-dialog> 305 </el-dialog>
305 - <div class="btn-box">  
306 - <el-button type="danger" plain round @click="linkBack">取消</el-button>  
307 - <el-button round @click="step = 0">上一步</el-button>  
308 - <el-button type="primary" round @click="toStep(2)">下一步</el-button> 306 + <div class="btn-box flex-btn" style="text-align: center; ">
  307 + <div style="display: inline-block;line-height: 45px;">
  308 + <label>请仔细核对
  309 + <label style="color:red;">“题型” </label>
  310 + 和
  311 + <label style="color:red;">“答案”</label>等是否识别正确
  312 + </label>
  313 + </div>
  314 + <div style="display: inline;;float: right">
  315 + <el-button type="danger" plain round @click="linkBack">取消</el-button>
  316 + <el-button round @click="step = 0">上一步</el-button>
  317 + <el-button type="primary" round @click="toStep(2)">下一步</el-button>
  318 + </div>
309 </div> 319 </div>
310 <el-dialog :close-on-click-modal="false" :modal-append-to-body="false" 320 <el-dialog :close-on-click-modal="false" :modal-append-to-body="false"
311 :title="stem.type == 1 ? '上传题干' : '上传题目解析'" :visible.sync="dialogStem" v-if="dialogStem" width="800px"> 321 :title="stem.type == 1 ? '上传题干' : '上传题目解析'" :visible.sync="dialogStem" v-if="dialogStem" width="800px">
@@ -329,22 +339,17 @@ @@ -329,22 +339,17 @@
329 <el-button @click="dialogStem = false">保存</el-button> 339 <el-button @click="dialogStem = false">保存</el-button>
330 </div> 340 </div>
331 </el-dialog> 341 </el-dialog>
332 - <el-dialog :close-on-click-modal="false" :modal-append-to-body="false" title="知识点"  
333 - :visible.sync="dialogKnowledge" width="60%" >  
334 - <div>  
335 - <knowledgePoints :sectionName="stem.sectionName" :subjectName="stem.subjectName" :knowledges="stem.knowledge" @points="_points" />  
336 - </div>  
337 - <div slot="footer">  
338 - <el-button @click="dialogKnowledge = false">取 消</el-button>  
339 - <el-button type="primary" @click="setKnowledge">确 定</el-button>  
340 - </div> 342 + <el-dialog :append-to-body="true" :destroy-on-close="true" title="知识点" :visible.sync="dialogKnowledge"
  343 + width="60%">
  344 + <knowledgePoints :key="dialogKnowledge" @opration="knowledgeOpration" :sectionName="stem.sectionName"
  345 + :subjectName="stem.subjectName" :knowledges="stem.knowledge" />
341 </el-dialog> 346 </el-dialog>
342 </div> 347 </div>
343 <div v-if="step == 2"> 348 <div v-if="step == 2">
344 <div class="answer-title"> 349 <div class="answer-title">
345 <p class="name">{{ form.title }}</p> 350 <p class="name">{{ form.title }}</p>
346 </div> 351 </div>
347 - <div class="question-box"> 352 + <div class="question-box flex-content" >
348 <template v-for="question in form.questionList"> 353 <template v-for="question in form.questionList">
349 <template v-if="!question.subQuestions"> 354 <template v-if="!question.subQuestions">
350 <div class="screenshot-box" v-if="question.screenshot"> 355 <div class="screenshot-box" v-if="question.screenshot">
@@ -360,7 +365,7 @@ @@ -360,7 +365,7 @@
360 </template> 365 </template>
361 </template> 366 </template>
362 </div> 367 </div>
363 - <div class="btn-box"> 368 + <div class="btn-box flex-btn">
364 <el-button type="danger" plain round @click="linkBack">取消</el-button> 369 <el-button type="danger" plain round @click="linkBack">取消</el-button>
365 <el-button round @click="toStep(1)">上一步</el-button> 370 <el-button round @click="toStep(1)">上一步</el-button>
366 <el-button type="primary" round @click="save">保存</el-button> 371 <el-button type="primary" round @click="save">保存</el-button>
@@ -371,6 +376,7 @@ @@ -371,6 +376,7 @@
371 </template> 376 </template>
372 377
373 <script> 378 <script>
  379 +import conf from "@/config/index";
374 import { deepClone, checkAnswer } from "utils"; 380 import { deepClone, checkAnswer } from "utils";
375 import knowledgeList from "assets/js/knowledgeList.js"; 381 import knowledgeList from "assets/js/knowledgeList.js";
376 import knowledgePoints from "@/components/knowledgePoints" 382 import knowledgePoints from "@/components/knowledgePoints"
@@ -449,38 +455,11 @@ export default { @@ -449,38 +455,11 @@ export default {
449 //返回列表页参数记录 455 //返回列表页参数记录
450 listType: 1, 456 listType: 1,
451 listShare: 0, 457 listShare: 0,
452 - uploadUrl: "/file/uploadImgToHtml", 458 + // uploadUrl: "/file/uploadImgToHtml",
453 iframeLoading: false, 459 iframeLoading: false,
454 subjectName: "", 460 subjectName: "",
455 }; 461 };
456 }, 462 },
457 - // computed: {  
458 - // // 知识点列表 根据学段-科目筛选  
459 - // knowledgeData: function () {  
460 - // let jsons = [];  
461 - // if (this.form.gradeName && this.form.subjectName) {  
462 - // let sectionName = "";  
463 - // this.gradeClassList.map((item) => {  
464 - // if (this.form.gradeName == item.gradeName) {  
465 - // sectionName = item.sectionName;  
466 - // }  
467 - // });  
468 - // if (  
469 - // sectionName &&  
470 - // Object.keys(this.knowledgeList).includes(sectionName)  
471 - // ) {  
472 - // if (  
473 - // Object.keys(this.knowledgeList[sectionName]).includes(  
474 - // this.form.subjectName  
475 - // )  
476 - // ) {  
477 - // jsons = this.knowledgeList[sectionName][this.form.subjectName];  
478 - // }  
479 - // }  
480 - // }  
481 - // return jsons;  
482 - // },  
483 - // },  
484 watch: { 463 watch: {
485 step: function () { 464 step: function () {
486 this.$nextTick(function () { 465 this.$nextTick(function () {
@@ -488,6 +467,24 @@ export default { @@ -488,6 +467,24 @@ export default {
488 }); 467 });
489 }, 468 },
490 }, 469 },
  470 + computed: {
  471 + uploadUrl: function () {
  472 + var requestUrl = '';
  473 +
  474 + var ogrinUrl = '/file/uploadImgToHtml';
  475 +
  476 + var baseUrl = conf.baseURL;
  477 +
  478 + if (baseUrl == '/' && ogrinUrl.indexOf('/') == 0) {
  479 + requestUrl = ogrinUrl;
  480 + }
  481 + else {
  482 + requestUrl = baseUrl + ogrinUrl
  483 + }
  484 +
  485 + return requestUrl;
  486 + }
  487 + },
491 async created() { 488 async created() {
492 this.listType = this.$route.query.listType ? this.$route.query.listType : 1; 489 this.listType = this.$route.query.listType ? this.$route.query.listType : 1;
493 this.listShare = this.$route.query.listShare 490 this.listShare = this.$route.query.listShare
@@ -519,30 +516,65 @@ export default { @@ -519,30 +516,65 @@ export default {
519 } 516 }
520 }, 517 },
521 methods: { 518 methods: {
522 - _points(point) {  
523 - 519 + // 知识点
  520 + openKnowledge(obj, index, indexs) {
  521 + this.stem.index = index;
  522 + this.stem.indexs = indexs;
  523 + this.stem.knowledge = obj.knowledge;
  524 + if (this.form.gradeName && this.form.subjectName) {
  525 + var matchClass = this.gradeClassList.find((item) => {
  526 + if (this.form.gradeName == item.gradeName) {
  527 + return item.sectionName;
  528 + }
  529 + });
  530 + this.stem.sectionName = matchClass?.sectionName ?? "";
  531 + this.stem.subjectName = this.form.subjectName ?? "";
  532 + }
  533 + this.dialogKnowledge = true;
  534 + },
  535 + knowledgeOpration(target) {
  536 + if (target.opration == 'confirm') {
  537 + this.form.questionList[this.stem.index].
  538 + subQuestions[this.stem.indexs].knowledge = target.knowledges.join(",");
  539 + this.dialogKnowledge = false;
  540 + }
  541 + else {
  542 + this.dialogKnowledge = false;
  543 + }
524 }, 544 },
525 _checkedClass() { 545 _checkedClass() {
  546 + this.checkedClass = this.shareClass.filter(item => item.isChecked).map(imap => imap.id);
526 this.classSharingType = false; 547 this.classSharingType = false;
527 }, 548 },
528 handleCheckAllChange(val) { 549 handleCheckAllChange(val) {
529 - this.checkedClass = val ? this.shareClass?.map(item => item.id) : []; 550 + this.shareClass.forEach(item => {
  551 + item.isChecked = val;
  552 + })
530 this.isIndeterminate = false; 553 this.isIndeterminate = false;
531 }, 554 },
532 handleCheckedClassChange(value) { 555 handleCheckedClassChange(value) {
  556 + var value = this.shareClass.filter(item => item.isChecked);
533 let checkedCount = value.length; 557 let checkedCount = value.length;
534 - this.checkAll = checkedCount === this.checkedClass.length;  
535 - this.isIndeterminate = checkedCount > 0 && checkedCount < this.checkedClass.length; 558 + this.checkAll = checkedCount === this.shareClass.length;
  559 + this.isIndeterminate = checkedCount > 0 && checkedCount < this.shareClass.length;
536 }, 560 },
537 async _selectClassSharingType() { 561 async _selectClassSharingType() {
538 this.classSharingType = true; 562 this.classSharingType = true;
539 - var findGrade = this.gradeClassList.find(item => item.gradeName == this.form.gradeName);  
540 - this.gradeName = findGrade.gradeName;  
541 - var classResponse = await this.$request.tClassGrade(findGrade.grade, this.form.subjectName); 563 + this.shareClass = [];
  564 + var grade = this.gradeClassList.find(item => item.gradeName == this.form.gradeName);
  565 + var classResponse = await this.$request.tClassGrade(grade?.grade, this.form.subjectName);
542 if (classResponse.status != 0) { 566 if (classResponse.status != 0) {
543 this.$message.error(classResponse.info); 567 this.$message.error(classResponse.info);
  568 + return;
544 } 569 }
545 - this.shareClass = classResponse.data; 570 + this.gradeName = grade.gradeName;
  571 + this.shareClass = [...classResponse.data.map(item => {
  572 + return {
  573 + isChecked: this.checkedClass.includes(item.id),
  574 + id: item.id,
  575 + className: item.className
  576 + }
  577 + })];
546 }, 578 },
547 // v1.5 579 // v1.5
548 //上传截图 580 //上传截图
@@ -601,31 +633,6 @@ export default { @@ -601,31 +633,6 @@ export default {
601 upError(res) { 633 upError(res) {
602 this.$message.error("上传失败"); 634 this.$message.error("上传失败");
603 }, 635 },
604 - // 知识点  
605 - openKnowledge(obj, index, indexs) {  
606 - this.stem.index = index;  
607 - this.stem.indexs = indexs;  
608 - this.stem.knowledge = (obj.knowledge && obj.knowledge.split("#")) || [];  
609 - if (this.form.gradeName && this.form.subjectName) {  
610 - var matchClass = this.gradeClassList.find((item) => {  
611 - if (this.form.gradeName == item.gradeName) {  
612 - return item.sectionName;  
613 - }  
614 - });  
615 - this.stem.sectionName = matchClass?.sectionName ?? "";  
616 - this.stem.subjectName = this.form.subjectName ?? "";  
617 - }  
618 - // this.stem.sectionName =  
619 - this.dialogKnowledge = true;  
620 - },  
621 - // 知识点  
622 - setKnowledge() {  
623 - this.form.questionList[this.stem.index].subQuestions[  
624 - this.stem.indexs  
625 - ].knowledge = this.stem.knowledge.join("#");  
626 - this.dialogKnowledge = false;  
627 - },  
628 -  
629 //end 636 //end
630 linkBack() { 637 linkBack() {
631 this.$confirm( 638 this.$confirm(
src/views/examinationPaper/edit.vue
@@ -56,9 +56,7 @@ @@ -56,9 +56,7 @@
56 <div class="qs-set">知识点</div> 56 <div class="qs-set">知识点</div>
57 </div> 57 </div>
58 <div v-for="(subQuestions, indexs) in question.subQuestions" :key="indexs"> 58 <div v-for="(subQuestions, indexs) in question.subQuestions" :key="indexs">
59 - <p class="set-ans-btn" v-if="subQuestions.qusType &&  
60 - subQuestions.subNum &&  
61 - subQuestions.subNum > 4 59 + <p class="set-ans-btn" v-if="subQuestions.qusType && subQuestions.subNum && subQuestions.subNum > 4
62 "> 60 ">
63 <el-button type="primary" @click="setFormAns(indexs, index)">批量设置答案</el-button> 61 <el-button type="primary" @click="setFormAns(indexs, index)">批量设置答案</el-button>
64 </p> 62 </p>
@@ -88,8 +86,8 @@ @@ -88,8 +86,8 @@
88 <p v-if="subQuestions.questionType == 3" class="answer-box"> 86 <p v-if="subQuestions.questionType == 3" class="answer-box">
89 <template v-for="option in subQuestions.answerOptions?.split(',')"> 87 <template v-for="option in subQuestions.answerOptions?.split(',')">
90 <span v-if="option" class="answer-s" :class="subQuestions.correctAnswer?.includes(option) 88 <span v-if="option" class="answer-s" :class="subQuestions.correctAnswer?.includes(option)
91 - ? 'active'  
92 - : '' 89 + ? 'active'
  90 + : ''
93 " :key="option" @click="changAnswer(subQuestions, option)">{{ option }}</span> 91 " :key="option" @click="changAnswer(subQuestions, option)">{{ option }}</span>
94 </template> 92 </template>
95 </p> 93 </p>
@@ -175,8 +173,8 @@ @@ -175,8 +173,8 @@
175 <el-button type="danger" plain round @click="linkBack">取消</el-button> 173 <el-button type="danger" plain round @click="linkBack">取消</el-button>
176 <el-button type="primary" round @click="save">保存</el-button> 174 <el-button type="primary" round @click="save">保存</el-button>
177 </div> 175 </div>
178 - <el-dialog :append-to-body="true" :close-on-click-modal="false" title="批量设置答案" :visible.sync="diaSetAns" width="400"  
179 - :modal-append-to-body="false"> 176 + <el-dialog :append-to-body="true" :close-on-click-modal="false" title="批量设置答案" :visible.sync="diaSetAns"
  177 + width="400" :modal-append-to-body="false">
180 <div class="qs-options set-questions"> 178 <div class="qs-options set-questions">
181 <p class="dia-tips"> 179 <p class="dia-tips">
182 请点击选项按钮设置答案,多选题题目之间用“,”隔开,若添加5道题:“AC,AD,BD,AC,CD” 180 请点击选项按钮设置答案,多选题题目之间用“,”隔开,若添加5道题:“AC,AD,BD,AC,CD”
@@ -222,18 +220,13 @@ @@ -222,18 +220,13 @@
222 <el-button @click="diaSetAns = false">取 消</el-button> 220 <el-button @click="diaSetAns = false">取 消</el-button>
223 </div> 221 </div>
224 </el-dialog> 222 </el-dialog>
225 - <el-dialog :append-to-body="true" :close-on-click-modal="false" :title="stem.type == 1 ? '上传题干' : '上传题目解析'" :visible.sync="dialogStem"  
226 - v-if="dialogStem" width="800px"> 223 + <el-dialog :append-to-body="true" :close-on-click-modal="false" :title="stem.type == 1 ? '上传题干' : '上传题目解析'"
  224 + :visible.sync="dialogStem" v-if="dialogStem" width="800">
227 <div class="upload-box"> 225 <div class="upload-box">
228 - <div v-loading="iframeLoading">  
229 - <template v-if="stem.type == 1">  
230 - <iframe ref="screenshot" class="screenshot" v-if="stem.screenshot" :src="stem.screenshot"  
231 - @load="iframeLoading = false"></iframe>  
232 - </template>  
233 - <template v-else>  
234 - <iframe ref="screenshot" class="screenshot" v-if="stem.answerScreenshot" :src="stem.answerScreenshot"  
235 - @load="iframeLoading = false"></iframe>  
236 - </template> 226 + <div>
  227 + <Preview ref="screenshot" class="screenshot"
  228 + :src="stem.type == 1 ? stem.screenshot : stem.answerScreenshot">
  229 + </Preview>
237 </div> 230 </div>
238 <el-upload class="upload-demo" :action="uploadUrl" :limit="1" :on-success="upSuccess" :on-error="upError" 231 <el-upload class="upload-demo" :action="uploadUrl" :limit="1" :on-success="upSuccess" :on-error="upError"
239 accept="image/*"> 232 accept="image/*">
@@ -244,31 +237,19 @@ @@ -244,31 +237,19 @@
244 <el-button @click="dialogStem = false">确定</el-button> 237 <el-button @click="dialogStem = false">确定</el-button>
245 </div> 238 </div>
246 </el-dialog> 239 </el-dialog>
247 - <el-dialog :append-to-body="true" :close-on-click-modal="false" title="知识点" :visible.sync="dialogKnowledge" width="500px">  
248 - <div>  
249 - <el-form ref="form" :model="stem" label-width="160px">  
250 - <el-form-item label="知识点:">  
251 - <el-cascader size="small" filterable :show-all-levels="false" clearable placeholder="选择知识点"  
252 - v-model="stem.knowledge" :options="knowledgeData" :props="{  
253 - expandTrigger: 'hover',  
254 - multiple: true,  
255 - checkStrictly: true,  
256 - }"></el-cascader>  
257 - </el-form-item>  
258 - </el-form>  
259 - </div>  
260 - <div slot="footer">  
261 - <el-button @click="dialogKnowledge = false">取 消</el-button>  
262 - <el-button type="primary" @click="setKnowledge">确 定</el-button>  
263 - </div> 240 + <el-dialog :append-to-body="true" :close-on-click-modal="false" title="知识点" :visible.sync="dialogKnowledge"
  241 + width="60%">
  242 + <knowledgePoints :key="dialogKnowledge" @opration="knowledgeOpration" :sectionName="stem.sectionName"
  243 + :subjectName="stem.subjectName" :knowledges="stem.knowledge" />
264 </el-dialog> 244 </el-dialog>
265 </div> 245 </div>
266 </div> 246 </div>
267 </template> 247 </template>
268 248
269 <script> 249 <script>
  250 +import Preview from "@/components/preview";
270 import { deepClone, checkAnswer } from "utils"; 251 import { deepClone, checkAnswer } from "utils";
271 -import knowledgeList from "assets/js/knowledgeList.js"; 252 +import conf from "@/config/index";
272 export default { 253 export default {
273 data() { 254 data() {
274 return { 255 return {
@@ -306,8 +287,7 @@ export default { @@ -306,8 +287,7 @@ export default {
306 287
307 //v1.5 288 //v1.5
308 dialogStem: false, //截图开关 289 dialogStem: false, //截图开关
309 - dialogKnowledge: false, //知识点开关  
310 - knowledgeList: { ...knowledgeList }, 290 + dialogKnowledge: false, //知识点开关
311 stem: { 291 stem: {
312 type: 1, 292 type: 1,
313 index: 0, //大题位置 293 index: 0, //大题位置
@@ -315,14 +295,32 @@ export default { @@ -315,14 +295,32 @@ export default {
315 screenshot: "", //题干图片地址 295 screenshot: "", //题干图片地址
316 answerScreenshot: "", //题目解析图片地址 296 answerScreenshot: "", //题目解析图片地址
317 knowledge: [], //知识点 297 knowledge: [], //知识点
  298 + sectionName: "", //题目解析图片地址
  299 + subjectName: "" //知识点
318 }, 300 },
319 gradeClassList: [], //学段列表 301 gradeClassList: [], //学段列表
320 - uploadUrl: "/file/uploadImgToHtml", 302 + // uploadUrl: "/file/uploadImgToHtml",
321 iframeLoading: false, 303 iframeLoading: false,
322 examType: 2, 304 examType: 2,
323 }; 305 };
324 }, 306 },
325 computed: { 307 computed: {
  308 + uploadUrl: function () {
  309 + var requestUrl = '';
  310 +
  311 + var ogrinUrl = '/file/uploadImgToHtml';
  312 +
  313 + var baseUrl = conf.baseURL;
  314 +
  315 + if (baseUrl == '/' && ogrinUrl.indexOf('/') == 0) {
  316 + requestUrl = ogrinUrl;
  317 + }
  318 + else {
  319 + requestUrl = baseUrl + ogrinUrl
  320 + }
  321 +
  322 + return requestUrl;
  323 + },
326 allScore: function () { 324 allScore: function () {
327 let score = 0; 325 let score = 0;
328 this.questionList?.map((item) => { 326 this.questionList?.map((item) => {
@@ -335,32 +333,7 @@ export default { @@ -335,32 +333,7 @@ export default {
335 } 333 }
336 }, 0); 334 }, 0);
337 return Number(score).toFixed(2); 335 return Number(score).toFixed(2);
338 - },  
339 - // 知识点列表 根据学段-科目筛选  
340 - knowledgeData: function () {  
341 - let jsons = [];  
342 - if (this.form.gradeName && this.form.subjectName) {  
343 - let sectionName = "";  
344 - this.gradeClassList?.map((item) => {  
345 - if (this.form.gradeName == item.gradeName) {  
346 - sectionName = item.sectionName;  
347 - }  
348 - });  
349 - if (  
350 - sectionName &&  
351 - Object.keys(this.knowledgeList).includes(sectionName)  
352 - ) {  
353 - if (  
354 - Object.keys(this.knowledgeList[sectionName]).includes(  
355 - this.form.subjectName  
356 - )  
357 - ) {  
358 - jsons = this.knowledgeList[sectionName][this.form.subjectName];  
359 - }  
360 - }  
361 - }  
362 - return jsons;  
363 - }, 336 + }
364 }, 337 },
365 created() { 338 created() {
366 this.role = 339 this.role =
@@ -370,10 +343,27 @@ export default { @@ -370,10 +343,27 @@ export default {
370 this.examType = this.$route.query.examType || 2; 343 this.examType = this.$route.query.examType || 2;
371 this.paperType = this.$route.query.paperType || 2; 344 this.paperType = this.$route.query.paperType || 2;
372 this.form.title = this.$route.query.title || ""; 345 this.form.title = this.$route.query.title || "";
  346 + this.stem.sectionName = this.$route.query.sectionName || "";
  347 + this.stem.subjectName = this.$route.query.subjectName || "";
373 this._QueryDetail(); 348 this._QueryDetail();
374 this._GradeList(); 349 this._GradeList();
375 }, 350 },
376 methods: { 351 methods: {
  352 + knowledgeOpration(target) {
  353 + if (target.opration == 'confirm') {
  354 + if (this.questionList[0]?.subQuestions) {
  355 + this.questionList[this.stem.index].subQuestions[
  356 + this.stem.indexs
  357 + ].knowledge = target.knowledges.join(",");
  358 + } else {
  359 + this.questionList[this.stem.index].knowledge = target.knowledges.join(",");
  360 + }
  361 + this.dialogKnowledge = false;
  362 + }
  363 + else {
  364 + this.dialogKnowledge = false;
  365 + }
  366 + },
377 // v1.5 367 // v1.5
378 //上传截图 368 //上传截图
379 openStem(obj, type, index, indexs) { 369 openStem(obj, type, index, indexs) {
@@ -394,7 +384,6 @@ export default { @@ -394,7 +384,6 @@ export default {
394 this.stem.answerScreenshot = obj.answerScreenshot || ""; 384 this.stem.answerScreenshot = obj.answerScreenshot || "";
395 this.stem.screenshot = ""; 385 this.stem.screenshot = "";
396 } 386 }
397 -  
398 this.dialogStem = true; 387 this.dialogStem = true;
399 }, 388 },
400 //图片上传成功 389 //图片上传成功
@@ -421,7 +410,6 @@ export default { @@ -421,7 +410,6 @@ export default {
421 this.stem.answerScreenshot; 410 this.stem.answerScreenshot;
422 } 411 }
423 } 412 }
424 -  
425 this.$message.success("上传成功"); 413 this.$message.success("上传成功");
426 } else { 414 } else {
427 this.$message.error(res.info); 415 this.$message.error(res.info);
@@ -446,24 +434,10 @@ export default { @@ -446,24 +434,10 @@ export default {
446 // 打开知识点 434 // 打开知识点
447 openKnowledge(obj, index, indexs) { 435 openKnowledge(obj, index, indexs) {
448 this.stem.index = index; 436 this.stem.index = index;
449 - this.stem.indexs = indexs || 0;  
450 - this.stem.knowledge = (obj.knowledge && obj.knowledge.split("#")) || []; 437 + this.stem.indexs = indexs || 0;
  438 + this.stem.knowledge = obj?.knowledge ?? "";
451 this.dialogKnowledge = true; 439 this.dialogKnowledge = true;
452 }, 440 },
453 - // 选择知识点  
454 - setKnowledge() {  
455 - if (this.questionList[0]?.subQuestions) {  
456 - this.questionList[this.stem.index].subQuestions[  
457 - this.stem.indexs  
458 - ].knowledge = this.stem.knowledge.join("#");  
459 - } else {  
460 - this.questionList[this.stem.index].knowledge =  
461 - this.stem.knowledge.join("#");  
462 - }  
463 - this.dialogKnowledge = false;  
464 - },  
465 - //end  
466 -  
467 linkBack() { 441 linkBack() {
468 this.$router.go(-1); 442 this.$router.go(-1);
469 }, 443 },
@@ -884,6 +858,7 @@ export default { @@ -884,6 +858,7 @@ export default {
884 types[i].answerList = types[i].answerList.slice(0, -1); 858 types[i].answerList = types[i].answerList.slice(0, -1);
885 } 859 }
886 if (types[i].subNum >= 5) { 860 if (types[i].subNum >= 5) {
  861 + if (!item.subQuestions) continue;
887 item.subQuestions.splice( 862 item.subQuestions.splice(
888 types[i].index + i + 1, 863 types[i].index + i + 1,
889 0, 864 0,
@@ -969,7 +944,6 @@ export default { @@ -969,7 +944,6 @@ export default {
969 width: 100%; 944 width: 100%;
970 box-shadow: none; 945 box-shadow: none;
971 border: none; 946 border: none;
972 - height: 400px;  
973 } 947 }
974 948
975 .screenshot-img { 949 .screenshot-img {
@@ -991,7 +965,7 @@ export default { @@ -991,7 +965,7 @@ export default {
991 } 965 }
992 966
993 .btn-box { 967 .btn-box {
994 - width: calc(100% - 240px); 968 + width: calc(100% - 300px);
995 position: fixed; 969 position: fixed;
996 right: 40px; 970 right: 40px;
997 bottom: 20px; 971 bottom: 20px;
src/views/examinationPaper/edit_Old.vue
@@ -414,7 +414,7 @@ @@ -414,7 +414,7 @@
414 /> 414 />
415 <el-upload 415 <el-upload
416 class="upload-demo" 416 class="upload-demo"
417 - action="http://121.40.127.171/file/uploadImg" 417 + :action="uploadUrl"
418 :limit="1" 418 :limit="1"
419 :on-success="upSuccess" 419 :on-success="upSuccess"
420 :on-error="upError" 420 :on-error="upError"
@@ -471,6 +471,7 @@ @@ -471,6 +471,7 @@
471 </template> 471 </template>
472 472
473 <script> 473 <script>
  474 +import conf from "@/config/index";
474 import { deepClone, checkAnswer } from "utils"; 475 import { deepClone, checkAnswer } from "utils";
475 export default { 476 export default {
476 data() { 477 data() {
@@ -519,6 +520,22 @@ export default { @@ -519,6 +520,22 @@ export default {
519 }; 520 };
520 }, 521 },
521 computed: { 522 computed: {
  523 + uploadUrl: function () {
  524 + var requestUrl = '';
  525 +
  526 + var ogrinUrl = '/file/uploadImg';
  527 +
  528 + var baseUrl = conf.baseURL;
  529 +
  530 + if (baseUrl == '/' && ogrinUrl.indexOf('/') == 0) {
  531 + requestUrl = ogrinUrl;
  532 + }
  533 + else {
  534 + requestUrl = baseUrl + ogrinUrl
  535 + }
  536 +
  537 + return requestUrl;
  538 + },
522 allScore: function () { 539 allScore: function () {
523 let score = 0; 540 let score = 0;
524 this.questionList?.map((item) => { 541 this.questionList?.map((item) => {
src/views/index/mainIndex.vue
@@ -108,8 +108,16 @@ @@ -108,8 +108,16 @@
108 </li> 108 </li>
109 </template> 109 </template>
110 </ul> 110 </ul>
111 - <ul class="nav-list" v-if="type == 'ROLE_JIAOSHI' || type == 'ROLE_BANZHUREN'">  
112 - <template v-for="item in navList"> 111 + <ul v-if="type == 'ROLE_JIAOSHI' || type == 'ROLE_BANZHUREN' || type == 'ROLE_NIANJI'">
  112 + <template>
  113 + <div style="margin: auto;">
  114 + <el-image :src="logo" />
  115 + </div>
  116 + <div style="margin: auto;text-align: center;">
  117 + <h1 style="font-size: 26px;">欢迎使用中天易教</h1>
  118 + </div>
  119 + </template>
  120 + <!-- <template v-for="item in navList">
113 <li v-if="!item.path.includes('dataSync')" :key="item.path" class="nav-item item4" @click="links(item.path)"> 121 <li v-if="!item.path.includes('dataSync')" :key="item.path" class="nav-item item4" @click="links(item.path)">
114 <img class="icon" :src="getImgs(item.path)" alt="" /> 122 <img class="icon" :src="getImgs(item.path)" alt="" />
115 <div class="text" v-if="item.path == '/examinationPaper'"> 123 <div class="text" v-if="item.path == '/examinationPaper'">
@@ -118,10 +126,10 @@ @@ -118,10 +126,10 @@
118 {{ dataInfo.paperCount }}套答题卡。 126 {{ dataInfo.paperCount }}套答题卡。
119 </p> 127 </p>
120 </div> 128 </div>
121 - <!-- <div class="text" v-else-if="item.path == '/portrait'"> 129 + <div class="text" v-else-if="item.path == '/portrait'">
122 <p class="p1">学生画像</p> 130 <p class="p1">学生画像</p>
123 <p class="p2">共分析{{ dataInfo.imagesCount }}名学生成绩。</p> 131 <p class="p2">共分析{{ dataInfo.imagesCount }}名学生成绩。</p>
124 - </div> --> 132 + </div>
125 <div class="text" v-else-if="item.path == '/ask'"> 133 <div class="text" v-else-if="item.path == '/ask'">
126 <p class="p1">随堂问报表</p> 134 <p class="p1">随堂问报表</p>
127 <p class="p2" v-if="dataInfo.classPeriodCount"> 135 <p class="p2" v-if="dataInfo.classPeriodCount">
@@ -138,7 +146,7 @@ @@ -138,7 +146,7 @@
138 <p class="p1">软件下载</p> 146 <p class="p1">软件下载</p>
139 </div> 147 </div>
140 </li> 148 </li>
141 - </template> 149 + </template> -->
142 </ul> 150 </ul>
143 <ul class="nav-list" v-if="type == 'ROLE_PERSONAL'"> 151 <ul class="nav-list" v-if="type == 'ROLE_PERSONAL'">
144 <li class="nav-item item1" @click="links('/examinationPaper')"> 152 <li class="nav-item item1" @click="links('/examinationPaper')">
@@ -216,10 +224,13 @@ @@ -216,10 +224,13 @@
216 </template> 224 </template>
217 225
218 <script> 226 <script>
  227 +import logo from "@/assets/images/EasyQuiz.png";
  228 +
219 export default { 229 export default {
220 name: "mainIndex", 230 name: "mainIndex",
221 data() { 231 data() {
222 return { 232 return {
  233 + logo: logo,
223 type: "", 234 type: "",
224 navList: [], 235 navList: [],
225 dataInfo: {}, 236 dataInfo: {},
src/views/layout/header/header.vue
1 <template> 1 <template>
2 <div> 2 <div>
3 <el-header id="header"> 3 <el-header id="header">
4 - <span class="hideAside" @click="collapse"  
5 - ><i class="el-icon-s-fold" v-show="!isCollapse"></i>  
6 - <i class="el-icon-s-unfold" v-show="isCollapse"></i  
7 - ></span> 4 + <span class="hideAside" @click="collapse">
  5 + <i class="el-icon-s-fold" style="font-size: 24px !important;" v-show="!isCollapse"></i>
  6 + <i class="el-icon-s-unfold" style="font-size: 24px !important;" v-show="isCollapse"></i>
  7 + <i class="routeMap">
  8 + <!-- <el-breadcrumb separator="/">
  9 + <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  10 + <el-breadcrumb-item><a href="/">活动管理</a></el-breadcrumb-item>
  11 + <el-breadcrumb-item>活动列表</el-breadcrumb-item>
  12 + </el-breadcrumb> -->
  13 + </i>
  14 + </span>
8 <ul class="personal"> 15 <ul class="personal">
9 <!-- <li> 16 <!-- <li>
10 <langSelect></langSelect> 17 <langSelect></langSelect>
11 </li> --> 18 </li> -->
12 - <li  
13 - class="dropdown-box"  
14 - v-if="role != 'ROLE_PERSONAL' && role != 'ROLE_PINGTAI'"  
15 - > 19 + <li class="dropdown-box" v-if="role != 'ROLE_PERSONAL' && role != 'ROLE_PINGTAI'">
16 <div class="userInfo"> 20 <div class="userInfo">
17 <img :src="avatar" /> 21 <img :src="avatar" />
18 <div class="txt"> 22 <div class="txt">
@@ -21,19 +25,11 @@ @@ -21,19 +25,11 @@
21 </div> 25 </div>
22 <i class="el-icon-arrow-down"></i> 26 <i class="el-icon-arrow-down"></i>
23 </div> 27 </div>
24 - <el-dropdown  
25 - class="dropdown"  
26 - @command="handleCommand"  
27 - trigger="click"  
28 - > 28 + <el-dropdown class="dropdown" @command="handleCommand" trigger="click">
29 <div class="el-dropdown-link dropdown-link"></div> 29 <div class="el-dropdown-link dropdown-link"></div>
30 <el-dropdown-menu slot="dropdown" v-if="permissions.length"> 30 <el-dropdown-menu slot="dropdown" v-if="permissions.length">
31 - <el-dropdown-item  
32 - v-for="item in permissions"  
33 - :key="item.role"  
34 - :command="item.role"  
35 - >{{ item.roleName }}</el-dropdown-item  
36 - > 31 + <el-dropdown-item v-for="item in permissions" :key="item.role" :command="item.role">{{ item.roleName
  32 + }}</el-dropdown-item>
37 </el-dropdown-menu> 33 </el-dropdown-menu>
38 </el-dropdown> 34 </el-dropdown>
39 </li> 35 </li>
@@ -45,11 +41,7 @@ @@ -45,11 +41,7 @@
45 </div> 41 </div>
46 </div> 42 </div>
47 </li> 43 </li>
48 - <li  
49 - class="dropdown-box"  
50 - v-if="role == 'ROLE_PERSONAL'"  
51 - @click="linkToUserInfo"  
52 - > 44 + <li class="dropdown-box" v-if="role == 'ROLE_PERSONAL'" @click="linkToUserInfo">
53 <div class="userInfo"> 45 <div class="userInfo">
54 <img :src="avatar" /> 46 <img :src="avatar" />
55 <div class="txt"> 47 <div class="txt">
@@ -59,87 +51,34 @@ @@ -59,87 +51,34 @@
59 </div> 51 </div>
60 </li> 52 </li>
61 53
62 - <li  
63 - class="fullScreen"  
64 - v-if="role != 'ROLE_PERSONAL' && !code"  
65 - @click="openPwd"  
66 - >  
67 - <el-tooltip  
68 - class="item"  
69 - effect="dark"  
70 - content="修改密码"  
71 - placement="bottom"  
72 - ><i class="el-icon el-icon-key"></i  
73 - ></el-tooltip> 54 + <li class="fullScreen" v-if="role != 'ROLE_PERSONAL' && !code" @click="openPwd">
  55 + <el-tooltip class="item" effect="dark" content="修改密码" placement="bottom"><i
  56 + class="el-icon el-icon-key"></i></el-tooltip>
74 </li> 57 </li>
75 <li class="fullScreen" @click="fullScreen"> 58 <li class="fullScreen" @click="fullScreen">
76 - <el-tooltip  
77 - class="item"  
78 - effect="dark"  
79 - content="全屏"  
80 - placement="bottom"  
81 - ><i class="el-icon el-icon-full-screen"></i  
82 - ></el-tooltip> 59 + <el-tooltip class="item" effect="dark" content="全屏" placement="bottom"><i
  60 + class="el-icon el-icon-full-screen"></i></el-tooltip>
83 </li> 61 </li>
84 <li v-if="code && (role == 'ROLE_BANZHUREN' || role == 'ROLE_JIAOSHI')"> 62 <li v-if="code && (role == 'ROLE_BANZHUREN' || role == 'ROLE_JIAOSHI')">
85 - <el-tooltip  
86 - class="item"  
87 - effect="dark"  
88 - content="老平台入口"  
89 - placement="bottom"  
90 - >  
91 - <i @click="_LinkOld" class="el-icon el-icon-guide"></i  
92 - ></el-tooltip> 63 + <el-tooltip class="item" effect="dark" content="老平台入口" placement="bottom">
  64 + <i @click="_LinkOld" class="el-icon el-icon-guide"></i></el-tooltip>
93 </li> 65 </li>
94 <li> 66 <li>
95 - <el-tooltip  
96 - class="item"  
97 - effect="dark"  
98 - content="退出"  
99 - placement="bottom"  
100 - >  
101 - <i @click="logOut" class="el-icon el-icon-switch-button"></i  
102 - ></el-tooltip> 67 + <el-tooltip class="item" effect="dark" content="退出" placement="bottom">
  68 + <i @click="logOut" class="el-icon el-icon-switch-button"></i></el-tooltip>
103 </li> 69 </li>
104 </ul> 70 </ul>
105 </el-header> 71 </el-header>
106 <!-- <tabNav></tabNav> --> 72 <!-- <tabNav></tabNav> -->
107 <el-dialog :append-to-body="true" :close-on-click-modal="false" title="修改密码" :visible.sync="diaPass" width="400"> 73 <el-dialog :append-to-body="true" :close-on-click-modal="false" title="修改密码" :visible.sync="diaPass" width="400">
108 - <el-form  
109 - v-loading="loading"  
110 - ref="formPass"  
111 - class="form-box"  
112 - :model="password"  
113 - :rules="rulesPassword"  
114 - label-width="160px"  
115 - >  
116 - <el-form-item label="旧密码:" prop="oldPassword"  
117 - ><el-col :span="10"  
118 - ><el-input  
119 - maxlength="30"  
120 - v-model="password.oldPassword"  
121 - placeholder="请输入密码"  
122 - show-password  
123 - ></el-input></el-col  
124 - ></el-form-item>  
125 - <el-form-item label="新密码:" prop="password"  
126 - ><el-col :span="10"  
127 - ><el-input  
128 - maxlength="30"  
129 - v-model="password.password"  
130 - placeholder="请输入新密码"  
131 - show-password  
132 - ></el-input></el-col  
133 - ></el-form-item>  
134 - <el-form-item label="确认密码:" prop="resetPassword"  
135 - ><el-col :span="10"  
136 - ><el-input  
137 - maxlength="30"  
138 - v-model="password.resetPassword"  
139 - placeholder="请输入新密码"  
140 - show-password  
141 - ></el-input></el-col  
142 - ></el-form-item> 74 + <el-form v-loading="loading" ref="formPass" class="form-box" :model="password" :rules="rulesPassword"
  75 + label-width="160px">
  76 + <el-form-item label="旧密码:" prop="oldPassword"><el-col :span="10"><el-input maxlength="30"
  77 + v-model="password.oldPassword" placeholder="请输入密码" show-password></el-input></el-col></el-form-item>
  78 + <el-form-item label="新密码:" prop="password"><el-col :span="10"><el-input maxlength="30"
  79 + v-model="password.password" placeholder="请输入新密码" show-password></el-input></el-col></el-form-item>
  80 + <el-form-item label="确认密码:" prop="resetPassword"><el-col :span="10"><el-input maxlength="30"
  81 + v-model="password.resetPassword" placeholder="请输入新密码" show-password></el-input></el-col></el-form-item>
143 </el-form> 82 </el-form>
144 <div class="dialog-footer" slot="footer"> 83 <div class="dialog-footer" slot="footer">
145 <el-button @click="editPass">确 定</el-button> 84 <el-button @click="editPass">确 定</el-button>
@@ -307,7 +246,7 @@ export default { @@ -307,7 +246,7 @@ export default {
307 window.location.href = data; 246 window.location.href = data;
308 } else { 247 } else {
309 localStorage.setItem("token", ""); 248 localStorage.setItem("token", "");
310 - sessionStorage.setItem("addTab","") 249 + sessionStorage.setItem("addTab", "")
311 this.$store.commit("setToken", ""); 250 this.$store.commit("setToken", "");
312 this.$store.commit("setInfo", ""); 251 this.$store.commit("setInfo", "");
313 this.$store.commit("setRouters", ""); 252 this.$store.commit("setRouters", "");
@@ -331,7 +270,11 @@ $top: top; @@ -331,7 +270,11 @@ $top: top;
331 $bottom: bottom; 270 $bottom: bottom;
332 $left: left; 271 $left: left;
333 $right: right; 272 $right: right;
334 -$leftright: ($left, $right); 273 +$leftright: (
  274 + $left,
  275 + $right
  276 +);
  277 +
335 %w100 { 278 %w100 {
336 width: 100%; 279 width: 100%;
337 } 280 }
@@ -368,16 +311,24 @@ ul.el-menu { @@ -368,16 +311,24 @@ ul.el-menu {
368 justify-content: space-between; 311 justify-content: space-between;
369 color: #fff; 312 color: #fff;
370 padding: 0 20px 0 10px; 313 padding: 0 20px 0 10px;
  314 +
  315 + .routeMap {
  316 + display: inline-block;
  317 + }
  318 +
371 .hideAside { 319 .hideAside {
372 @extend %cursor; 320 @extend %cursor;
  321 +
373 i { 322 i {
374 font-size: 24px; 323 font-size: 24px;
375 line-height: 70px; 324 line-height: 70px;
376 } 325 }
377 } 326 }
  327 +
378 .personal { 328 .personal {
379 display: flex; 329 display: flex;
380 flex-direction: row; 330 flex-direction: row;
  331 +
381 li { 332 li {
382 @include set-value(margin, 8px); 333 @include set-value(margin, 8px);
383 font-size: 12px; 334 font-size: 12px;
@@ -386,40 +337,48 @@ ul.el-menu { @@ -386,40 +337,48 @@ ul.el-menu {
386 line-height: 70px; 337 line-height: 70px;
387 } 338 }
388 } 339 }
  340 +
389 .userInfo { 341 .userInfo {
390 display: flex; 342 display: flex;
391 align-items: center; 343 align-items: center;
392 height: 70px; 344 height: 70px;
393 @extend %cursor; 345 @extend %cursor;
  346 +
394 .txt { 347 .txt {
395 display: flex; 348 display: flex;
396 flex-direction: column; 349 flex-direction: column;
397 justify-content: center; 350 justify-content: center;
398 margin: 0 5px; 351 margin: 0 5px;
  352 +
399 p { 353 p {
400 line-height: 20px; 354 line-height: 20px;
401 font-size: 12px; 355 font-size: 12px;
402 } 356 }
403 } 357 }
  358 +
404 img { 359 img {
405 border-radius: 5px; 360 border-radius: 5px;
406 width: 28px; 361 width: 28px;
407 height: 28px; 362 height: 28px;
408 } 363 }
409 } 364 }
  365 +
410 .el-icon { 366 .el-icon {
411 font-size: 20px; 367 font-size: 20px;
412 line-height: 50px; 368 line-height: 50px;
413 } 369 }
  370 +
414 .fa-lg { 371 .fa-lg {
415 color: #fff; 372 color: #fff;
416 } 373 }
  374 +
417 .dropdown { 375 .dropdown {
418 position: absolute; 376 position: absolute;
419 top: 0; 377 top: 0;
420 right: 0; 378 right: 0;
421 bottom: 0; 379 bottom: 0;
422 left: 0; 380 left: 0;
  381 +
423 .dropdown-link { 382 .dropdown-link {
424 height: 70px; 383 height: 70px;
425 } 384 }
src/views/login/index.vue
@@ -171,9 +171,9 @@ $cursor: #000; @@ -171,9 +171,9 @@ $cursor: #000;
171 } 171 }
172 .login-container { 172 .login-container {
173 width: 100%; 173 width: 100%;
174 - height: 150vh; 174 + height: 100%;
175 background: url("../../assets/images/login-bg.png") no-repeat; 175 background: url("../../assets/images/login-bg.png") no-repeat;
176 - background-size: cover; 176 + background-size: 100% 100%;
177 overflow: hidden; 177 overflow: hidden;
178 display: flex; 178 display: flex;
179 justify-content: center; 179 justify-content: center;
vue.config.js
@@ -24,7 +24,8 @@ module.exports = { @@ -24,7 +24,8 @@ module.exports = {
24 "/": { 24 "/": {
25 // target:"http://ezquiz.sunvotecloud.cn", 25 // target:"http://ezquiz.sunvotecloud.cn",
26 // target:"http://192.168.1.151:8089", 26 // target:"http://192.168.1.151:8089",
27 - target: "http://121.40.127.171:8089", 27 + target: "http://121.40.127.171:8090",
  28 + // target: "http://121.40.127.171",
28 // target:"http://127.0.0.1:8089", 29 // target:"http://127.0.0.1:8089",
29 changeOrigin: true, 30 changeOrigin: true,
30 ws: true, 31 ws: true,
@@ -49,6 +50,7 @@ module.exports = { @@ -49,6 +50,7 @@ module.exports = {
49 .set("utils", resolve("src/utils")) 50 .set("utils", resolve("src/utils"))
50 .set("store", resolve("src/store")) 51 .set("store", resolve("src/store"))
51 .set("views", resolve("src/views")) 52 .set("views", resolve("src/views"))
  53 + .set("config", resolve("src/config"))
52 .set("api", resolve("src/api")); 54 .set("api", resolve("src/api"));
53 if (IS_PROD) { 55 if (IS_PROD) {
54 config.plugin("webpack-report").use(BundleAnalyzerPlugin, [ 56 config.plugin("webpack-report").use(BundleAnalyzerPlugin, [