Commit ead476dde3ee1f3851870933ba75ee0a19ba2bd4

Authored by LH_PC
1 parent 627f3fff

fix:最终定版

src/App.vue
@@ -22,9 +22,10 @@ export default { @@ -22,9 +22,10 @@ export default {
22 22
23 const docHeight = document.body.clientHeight; 23 const docHeight = document.body.clientHeight;
24 24
25 - const docWidth = document.body.clientWidth;  
26 -  
27 - if (docWidth < 1700) { 25 + const docWidth = document.body.clientWidth;
  26 +
  27 + if (docWidth < 1700) {
  28 +
28 const currentScale = docHeight / docWidth; 29 const currentScale = docHeight / docWidth;
29 30
30 let [scale, translate] = [0, 0]; 31 let [scale, translate] = [0, 0];
@@ -51,22 +52,56 @@ export default { @@ -51,22 +52,56 @@ export default {
51 offsetHeight > 0 ? `translate(0, ${offsetHeight / 2}px)` : ""; 52 offsetHeight > 0 ? `translate(0, ${offsetHeight / 2}px)` : "";
52 } 53 }
53 54
54 - if (docHeight <= 700) { 55 + if (docHeight <= 600) {
  56 +
  57 + $app.style.cssText = `
  58 + transform: scale(${scale}) ${translate};
  59 + transform-origin: top left;
  60 + min-width: 1920px;
  61 + min-height:830px;
  62 + `;
  63 + }
  64 + else if (docHeight == 610) {
  65 + $app.style.cssText = `
  66 + transform: scale(${scale}) ${translate};
  67 + transform-origin: top left;
  68 + min-width: 1920px;
  69 + min-height:885px;
  70 + `;
  71 + }
  72 + else if (docHeight <= 606) {
  73 + $app.style.cssText = `
  74 + transform: scale(${scale}) ${translate};
  75 + transform-origin: top left;
  76 + min-width: 1920px;
  77 + min-height:850px;
  78 + `;
  79 + }
  80 + else if (docHeight <= 650) {
  81 +
  82 + $app.style.cssText = `
  83 + transform: scale(${scale}) ${translate};
  84 + transform-origin: top left;
  85 + min-width: 1920px;
  86 + min-height:850px;
  87 + `;
  88 + }
  89 + else if (docHeight <= 700) {
55 90
56 $app.style.cssText = ` 91 $app.style.cssText = `
57 transform: scale(${scale}) ${translate}; 92 transform: scale(${scale}) ${translate};
58 transform-origin: top left; 93 transform-origin: top left;
59 min-width: 1920px; 94 min-width: 1920px;
60 - min-height: 885px; 95 + min-height: 890px;
61 `; 96 `;
62 } 97 }
63 - else if (docHeight <= 780) { 98 + else if (docHeight <= 750) {
64 99
65 $app.style.cssText = ` 100 $app.style.cssText = `
66 transform: scale(${scale}) ${translate}; 101 transform: scale(${scale}) ${translate};
67 transform-origin: top left; 102 transform-origin: top left;
68 min-width: 1920px; 103 min-width: 1920px;
69 - min-height:910px; 104 + min-height: 910px;
70 `; 105 `;
71 } 106 }
72 else { 107 else {
src/assets/css/index.scss
@@ -498,7 +498,7 @@ ul { @@ -498,7 +498,7 @@ ul {
498 .flex-btn { 498 .flex-btn {
499 position: fixed !important; 499 position: fixed !important;
500 z-index: 999 !important; 500 z-index: 999 !important;
501 - bottom: 30px !important; 501 + bottom: 0px !important;
502 padding: 10px 10px !important; 502 padding: 10px 10px !important;
503 right: 0px !important; 503 right: 0px !important;
504 background-color: white !important; 504 background-color: white !important;
@@ -514,7 +514,7 @@ ul { @@ -514,7 +514,7 @@ ul {
514 .flex-btn { 514 .flex-btn {
515 position: fixed !important; 515 position: fixed !important;
516 z-index: 999 !important; 516 z-index: 999 !important;
517 - bottom: 30px !important; 517 + bottom: -4px !important;
518 padding: 10px 10px !important; 518 padding: 10px 10px !important;
519 right: 0px !important; 519 right: 0px !important;
520 background-color: white !important; 520 background-color: white !important;
@@ -541,11 +541,13 @@ ul { @@ -541,11 +541,13 @@ ul {
541 541
542 542
543 @media screen and (max-width: 1920px) { 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) { 544 + * :not(.p1, .fa, .el-button, .el-icon-upload, h1, h2, h3, h4, h5, h6, .el-progress__text, .text-radius) {
545 545
546 font-size: 18px !important; 546 font-size: 18px !important;
547 547
548 - 548 + .text-radius *{
  549 + font-size: 16px !important;
  550 + }
549 551
550 .default-body-detail * { 552 .default-body-detail * {
551 font-size: 15px !important; 553 font-size: 15px !important;
@@ -576,11 +578,15 @@ ul { @@ -576,11 +578,15 @@ ul {
576 } 578 }
577 579
578 @media screen and (min-width: 1921px) { 580 @media screen and (min-width: 1921px) {
579 - * :not(.p1, .fa, .el-button, .el-icon-upload, h1, h2, h3, h4, h5, h6, .el-progress__text) { 581 + * :not(.p1, .fa, .el-button, .el-icon-upload, h1, h2, h3, h4, h5, h6, .el-progress__text, .text-radius) {
580 582
581 font-size: 14px !important; 583 font-size: 14px !important;
582 584
583 - .default-body-detail * { 585 + .text-radius * {
  586 + font-size: 14px !important;
  587 + }
  588 +
  589 + .default-body-detail * {
584 font-size: 13px !important; 590 font-size: 13px !important;
585 591
586 .cell { 592 .cell {
@@ -591,7 +597,7 @@ ul { @@ -591,7 +597,7 @@ ul {
591 597
592 .default-body .default-filter * { 598 .default-body .default-filter * {
593 line-height: 38px !important; 599 line-height: 38px !important;
594 - } 600 + }
595 601
596 .card-content { 602 .card-content {
597 width: 48% !important; 603 width: 48% !important;
src/config/index.js
1 const modeUrl = { 1 const modeUrl = {
2 // 开发环境 2 // 开发环境
3 development: { 3 development: {
4 - baseURL: "/api/", 4 + baseURL: "/",
5 authBaseURL: "", 5 authBaseURL: "",
6 $cdn:"" 6 $cdn:""
7 }, 7 },
8 // 生产环境 8 // 生产环境
9 production: { 9 production: {
10 - baseURL: "/api/", 10 + baseURL: "/",
11 authBaseURL: "", 11 authBaseURL: "",
12 $cdn:"" 12 $cdn:""
13 }, 13 },
src/store/index.js
@@ -67,9 +67,11 @@ const store = new Vuex.Store({ @@ -67,9 +67,11 @@ const store = new Vuex.Store({
67 } 67 }
68 return null; 68 return null;
69 }); 69 });
  70 +
70 state.addRouters = aRouters; // 保存动态路由用来addRouter 71 state.addRouters = aRouters; // 保存动态路由用来addRouter
71 state.routers = defaultRouter.concat(aRouters); // 所有有权限的路由表,用来生成菜单列表 72 state.routers = defaultRouter.concat(aRouters); // 所有有权限的路由表,用来生成菜单列表
72 localStorage.setItem("addRouters", JSON.stringify(routers)); 73 localStorage.setItem("addRouters", JSON.stringify(routers));
  74 + console.log('routers',state)
73 }, 75 },
74 setTokenSources(state, data) { 76 setTokenSources(state, data) {
75 if (data instanceof Array) { 77 if (data instanceof Array) {
src/views/basic/askTestQuestion/components/askSummaryReport.vue
@@ -306,8 +306,7 @@ export default { @@ -306,8 +306,7 @@ export default {
306 _export() { 306 _export() {
307 this.diaShow = true; 307 this.diaShow = true;
308 }, 308 },
309 - _print() {  
310 - 309 + _print() {
311 let title = this.detail.title || this.subjectNames?.join(); 310 let title = this.detail.title || this.subjectNames?.join();
312 tablePrint({ 311 tablePrint({
313 id: "print-content", 312 id: "print-content",
@@ -473,6 +472,8 @@ export default { @@ -473,6 +472,8 @@ export default {
473 this.singleSubjectSummary = periodListReponse.data.list; 472 this.singleSubjectSummary = periodListReponse.data.list;
474 473
475 this.total = periodListReponse.data.count; 474 this.total = periodListReponse.data.count;
  475 +
  476 + this.exportStudent = [...this.singleSubjectSummary];
476 }, 477 },
477 async _studentPerformance() { 478 async _studentPerformance() {
478 479
src/views/basic/askTestQuestion/detail.vue
@@ -17,16 +17,13 @@ @@ -17,16 +17,13 @@
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" />
18 </el-select> 18 </el-select>
19 <div style="float: right;"> 19 <div style="float: right;">
20 - <span v-if="(dataType == '2' && currentType == '测验成绩单') ||  
21 - (dataType == '2' && currentType == '试题分析') ||  
22 - (dataType == '3' && currentType == '学生成绩排名')"> 20 + <span v-if="(dataType == '2' && currentType == '测验成绩单') || (dataType == '2' && currentType == '试题分析') ">
23 单题低分率: 21 单题低分率:
24 <el-input-number class="parent-number" v-model="lowLevel" :min="1" :max="100" label="低分率"> 22 <el-input-number class="parent-number" v-model="lowLevel" :min="1" :max="100" label="低分率">
25 </el-input-number> 23 </el-input-number>
26 </span> 24 </span>
27 25
28 - <el-button v-if="(dataType == '3' && currentType == '班级对比情况表') ||  
29 - (dataType == '3' && currentType == '学生成绩排名')" @click="_studentLevelSet" 26 + <el-button v-if="(dataType == '3' && currentType == '班级对比情况表') || (dataType == '3' && currentType == '学生成绩排名')" @click="_studentLevelSet"
30 class="green-el-button"> 27 class="green-el-button">
31 设置学生成绩等级 28 设置学生成绩等级
32 </el-button> 29 </el-button>
@@ -405,6 +402,7 @@ @@ -405,6 +402,7 @@
405 {{ scoped.row.missPeopleNumber }}</span> 人 402 {{ scoped.row.missPeopleNumber }}</span> 人
406 </span> 403 </span>
407 <span style="margin: 10px 0;" 404 <span style="margin: 10px 0;"
  405 + v-if="item.students && item.students?.length >= 1"
408 v-for="(item, index) in scoped.row.details.filter(item => item.option.indexOf('未答') < 0 && !item.right)"> 406 v-for="(item, index) in scoped.row.details.filter(item => item.option.indexOf('未答') < 0 && !item.right)">
409 选{{ item.option }}:{{ item.students.join("/") }} 407 选{{ item.option }}:{{ item.students.join("/") }}
410 </span> 408 </span>
@@ -1650,7 +1648,7 @@ export default { @@ -1650,7 +1648,7 @@ export default {
1650 1648
1651 var missCount = 0; 1649 var missCount = 0;
1652 1650
1653 - var missI = questionList[i].details.filter(item => !item.right); 1651 + var missI = questionList[i].details.filter(item => item.option.indexOf('未答') < 0 && !item.right);
1654 1652
1655 missI.forEach(itemsa => { 1653 missI.forEach(itemsa => {
1656 missCount = Number(missCount) + Number(itemsa.students?.length ?? 0) 1654 missCount = Number(missCount) + Number(itemsa.students?.length ?? 0)
src/views/basic/askTestQuestion/gradeAnalysisDetail.vue
@@ -182,7 +182,7 @@ @@ -182,7 +182,7 @@
182 <span>总计 <span style="color:red;"> 182 <span>总计 <span style="color:red;">
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;" v-if="item.students && item.students?.length >= 1"
186 v-for="(item, index) in scoped.row.details.filter(item => item.option.indexOf('未答') < 0 && !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>
@@ -1044,7 +1044,7 @@ export default { @@ -1044,7 +1044,7 @@ export default {
1044 1044
1045 var missCount = 0; 1045 var missCount = 0;
1046 1046
1047 - var missI = questionList[i].details.filter(item => !item.right); 1047 + var missI = questionList[i].details.filter(item => item.option.indexOf('未答') < 0 && !item.right);
1048 1048
1049 missI.forEach(itemsa => { 1049 missI.forEach(itemsa => {
1050 missCount = Number(missCount) + Number(itemsa.students?.length ?? 0) 1050 missCount = Number(missCount) + Number(itemsa.students?.length ?? 0)
src/views/basic/askTestQuestion/index.vue
@@ -40,7 +40,7 @@ @@ -40,7 +40,7 @@
40 </el-radio-group> 40 </el-radio-group>
41 </div> 41 </div>
42 <el-main> 42 <el-main>
43 - <div style='position: relative;'> 43 + <div class="paper-list">
44 <el-tabs v-model="tabType" v-loading="queryLoading" type="card" class="default-tabs"> 44 <el-tabs v-model="tabType" v-loading="queryLoading" type="card" class="default-tabs">
45 <el-tab-pane :name="'0'" :label="`我自编的(${createdCount})`"> 45 <el-tab-pane :name="'0'" :label="`我自编的(${createdCount})`">
46 <div class="card-content" :key="index" v-for="( item, index ) in defaultList "> 46 <div class="card-content" :key="index" v-for="( item, index ) in defaultList ">
@@ -53,6 +53,9 @@ @@ -53,6 +53,9 @@
53 <div class="text"> 53 <div class="text">
54 {{ item.id }} 54 {{ item.id }}
55 </div> 55 </div>
  56 + <div class="text-radius" v-if="item.tag && item.tag.length >= 1">
  57 + <span> {{ item.tag }}&nbsp;</span>
  58 + </div>
56 </div> 59 </div>
57 </el-col> 60 </el-col>
58 <el-col :span="18" class="content"> 61 <el-col :span="18" class="content">
@@ -73,7 +76,8 @@ @@ -73,7 +76,8 @@
73 <el-popconfirm style="color:gray !important;" 76 <el-popconfirm style="color:gray !important;"
74 @confirm="_deleteDetermineQ(item.id)" 77 @confirm="_deleteDetermineQ(item.id)"
75 :title="dataType == 1 ? '确认删除此课件' : '确认删除此试卷'"> 78 :title="dataType == 1 ? '确认删除此课件' : '确认删除此试卷'">
76 - <el-button class="small-button" :size="'small'" style="color:#606266 !important;" 79 + <el-button class="small-button" :size="'small'"
  80 + style="color:#606266 !important;"
77 @click.native="_delete(item.id)" type="text" 81 @click.native="_delete(item.id)" type="text"
78 slot="reference">删除</el-button> 82 slot="reference">删除</el-button>
79 </el-popconfirm> 83 </el-popconfirm>
@@ -145,6 +149,9 @@ @@ -145,6 +149,9 @@
145 <div class="text"> 149 <div class="text">
146 {{ item.id }} 150 {{ item.id }}
147 </div> 151 </div>
  152 + <div class="text-radius" v-if="item.tag && item.tag.length >= 1">
  153 + <span> {{ item.tag }}&nbsp;</span>
  154 + </div>
148 </div> 155 </div>
149 </el-col> 156 </el-col>
150 <el-col :span="18" class="content"> 157 <el-col :span="18" class="content">
@@ -164,7 +171,8 @@ @@ -164,7 +171,8 @@
164 <el-popconfirm style="color:gray !important;" 171 <el-popconfirm style="color:gray !important;"
165 @confirm="_deleteDetermineQ(item.id)" 172 @confirm="_deleteDetermineQ(item.id)"
166 :title="dataType == 1 ? '确认删除此课件' : '确认删除此试卷'"> 173 :title="dataType == 1 ? '确认删除此课件' : '确认删除此试卷'">
167 - <el-button class="small-button" :size="'small'" style="color:#606266 !important;" 174 + <el-button class="small-button" :size="'small'"
  175 + style="color:#606266 !important;"
168 @click.native="_delete(item.id)" type="text" 176 @click.native="_delete(item.id)" type="text"
169 slot="reference">删除</el-button> 177 slot="reference">删除</el-button>
170 </el-popconfirm> 178 </el-popconfirm>
@@ -274,7 +282,7 @@ @@ -274,7 +282,7 @@
274 </el-image> 282 </el-image>
275 283
276 </span> 284 </span>
277 - </div> 285 + </div>
278 <p>第二步:上传完成编辑好的试卷。</p> 286 <p>第二步:上传完成编辑好的试卷。</p>
279 </div> 287 </div>
280 </upload> 288 </upload>
@@ -308,14 +316,14 @@ export default { @@ -308,14 +316,14 @@ export default {
308 sharedList: [], 316 sharedList: [],
309 dataType: "1", 317 dataType: "1",
310 importType: 0, 318 importType: 0,
311 - tabType: "0", 319 + tabType: "0",
312 url: "/api_html/common/paper/upload", //上传文档地址 320 url: "/api_html/common/paper/upload", //上传文档地址
313 listPage: { 321 listPage: {
314 page: 1, 322 page: 1,
315 size: 8, 323 size: 8,
316 total: 0, 324 total: 0,
317 }, 325 },
318 - query: { 326 + query: {
319 dateStatus: "-1", 327 dateStatus: "-1",
320 title: "", 328 title: "",
321 class: null, 329 class: null,
@@ -339,19 +347,19 @@ export default { @@ -339,19 +347,19 @@ export default {
339 this.listPage.page = 1; 347 this.listPage.page = 1;
340 this._serach(); 348 this._serach();
341 }, 349 },
342 - 'query.dateStatus'(val) { 350 + 'query.dateStatus'(val) {
343 var dateRange = setDateRules(val); 351 var dateRange = setDateRules(val);
344 352
345 this.query.dateRange = [dateRange.startDay, dateRange.endDay]; 353 this.query.dateRange = [dateRange.startDay, dateRange.endDay];
346 } 354 }
347 }, 355 },
348 - async created() { 356 + async created() {
349 this.dataType = location.href.endsWith("askPreparationQuestions") ? "1" : "2"; 357 this.dataType = location.href.endsWith("askPreparationQuestions") ? "1" : "2";
350 this.code = this.$store.getters.csCode; 358 this.code = this.$store.getters.csCode;
351 this.role = 359 this.role =
352 this.$store.getters.info.showRole || 360 this.$store.getters.info.showRole ||
353 this.$store.getters.info.permissions[0].role; 361 this.$store.getters.info.permissions[0].role;
354 - this.query.dateStatus = "onWeek"; 362 + this.query.dateStatus = "onWeek";
355 await this._loadQueryDatas(); 363 await this._loadQueryDatas();
356 }, 364 },
357 methods: { 365 methods: {
@@ -657,182 +665,206 @@ export default { @@ -657,182 +665,206 @@ export default {
657 }; 665 };
658 </script> 666 </script>
659 <style lang="scss"> 667 <style lang="scss">
660 -.down-box {  
661 - padding-left: 20px; 668 +.paper-list {
  669 + position: relative;
  670 + .down-box {
  671 + padding-left: 20px;
662 672
663 - .down-head {  
664 - display: block; 673 + .down-head {
  674 + display: block;
665 675
666 - span,  
667 - a {  
668 - vertical-align: middle; 676 + span,
  677 + a {
  678 + vertical-align: middle;
  679 + }
669 } 680 }
670 } 681 }
671 -}  
672 682
673 -.header-button {  
674 - float: right;  
675 - margin-right: 50px;  
676 - background: rgba(65, 204, 149, 1);  
677 - color: white;  
678 -  
679 - :hover { 683 + .header-button {
  684 + float: right;
  685 + margin-right: 50px;
680 background: rgba(65, 204, 149, 1); 686 background: rgba(65, 204, 149, 1);
681 color: white; 687 color: white;
682 - }  
683 -}  
684 688
685 -.el-tabs__content {  
686 - padding-left: 20px !important;  
687 - padding-right: 0px !important;  
688 - padding-top: 20px !important;  
689 -} 689 + :hover {
  690 + background: rgba(65, 204, 149, 1);
  691 + color: white;
  692 + }
  693 + }
690 694
691 -.el-tabs__header {  
692 - margin: 0px !important;  
693 -} 695 + .el-tabs__content {
  696 + padding-left: 20px !important;
  697 + padding-right: 0px !important;
  698 + padding-top: 20px !important;
  699 + }
694 700
695 -.card-content {  
696 - .descption-tag {  
697 - display: inline-block;  
698 - background: rgba(102, 127, 253, 0.1);  
699 - border-radius: 4px 4px 4px 4px;  
700 - color: #667FFD;  
701 - line-height: 32px;  
702 - padding: 0 10px;  
703 - margin-right: 10px;  
704 - height: 32px;  
705 - margin-top: 3px; 701 + .el-tabs__header {
  702 + margin: 0px !important;
706 } 703 }
707 704
708 - width: 48.4%;  
709 - display: inline-block;  
710 - margin-bottom: 10px;  
711 - min-height: 190px;  
712 - border: 1px solid #E6E9F4;  
713 - border-radius: 10px 10px 10px 10px;  
714 - box-shadow: 0px 4px 14px 0px rgba(0, 0, 0, 0.08);  
715 - margin-right: 20px;  
716 - background: #FFFFFF;  
717 -  
718 - .content {  
719 - margin-top: 15px !important;  
720 - padding-left: 10px !important;  
721 - font-size: 14px;  
722 - font-weight: 400;  
723 -  
724 - .descption-label {  
725 - min-width: 120px; 705 + .card-content {
  706 + .descption-tag {
  707 + display: inline-block;
  708 + background: rgba(102, 127, 253, 0.1);
  709 + border-radius: 4px 4px 4px 4px;
  710 + color: #667FFD;
  711 + line-height: 32px;
  712 + padding: 0 10px;
  713 + margin-right: 10px;
  714 + height: 32px;
  715 + margin-top: 3px;
726 } 716 }
727 717
728 - .descption-tag-text {  
729 - margin-bottom: 20px;  
730 - display: flex;  
731 - justify-content: flex-start;  
732 - align-items: center;  
733 - width: calc(100% - 5px);  
734 - } 718 + width: 48.4%;
  719 + display: inline-block;
  720 + margin-bottom: 10px;
  721 + min-height: 190px;
  722 + border: 1px solid #E6E9F4;
  723 + border-radius: 10px 10px 10px 10px;
  724 + box-shadow: 0px 4px 14px 0px rgba(0, 0, 0, 0.08);
  725 + margin-right: 20px;
  726 + background: #FFFFFF;
  727 +
  728 + .content {
  729 + margin-top: 15px !important;
  730 + padding-left: 10px !important;
  731 + font-size: 14px;
  732 + font-weight: 400;
  733 +
  734 + .descption-label {
  735 + min-width: 120px;
  736 + }
735 737
  738 + .descption-tag-text {
  739 + margin-bottom: 20px;
  740 + display: flex;
  741 + justify-content: flex-start;
  742 + align-items: center;
  743 + width: calc(100% - 5px);
  744 + }
736 745
737 746
738 - .descption-text {  
739 - height: 30px;  
740 - margin-top: 10px;  
741 747
742 - .descption-text-block {  
743 - margin-right: 10px;  
744 - display: flex;  
745 - justify-content: flex-start; 748 + .descption-text {
  749 + height: 30px;
  750 + margin-top: 10px;
746 751
747 - .sharing-descption {  
748 - flex: 1;  
749 - color: gray;  
750 - opacity: 0.8;  
751 - text-align: right  
752 - } 752 + .descption-text-block {
  753 + margin-right: 10px;
  754 + display: flex;
  755 + justify-content: flex-start;
753 756
754 - img {  
755 - height: 20px;  
756 - width: 20px;  
757 - margin-right: 5px;  
758 - }  
759 - }  
760 - } 757 + .sharing-descption {
  758 + flex: 1;
  759 + color: gray;
  760 + opacity: 0.8;
  761 + text-align: right
  762 + }
761 763
762 - .title-text {  
763 - .title-label {  
764 - font-weight: bold;  
765 - font-size: 24px !important;  
766 - color: #303133;  
767 - line-height: 28px;  
768 - display: inline-block;  
769 - width: calc(100% - 100px);  
770 - height: 28px;  
771 - text-transform: none;  
772 - padding-bottom: 10px !important; 764 + img {
  765 + height: 20px;
  766 + width: 20px;
  767 + margin-right: 5px;
  768 + }
  769 + }
773 } 770 }
774 771
775 - .dropdown-button {  
776 - .el-button {  
777 - background-color: #667FFD !important;  
778 - color: white; 772 + .title-text {
  773 + .title-label {
  774 + font-weight: bold;
  775 + font-size: 24px !important;
  776 + color: #303133;
  777 + line-height: 28px;
  778 + display: inline-block;
  779 + width: calc(100% - 100px);
  780 + height: 28px;
  781 + text-transform: none;
  782 + padding-bottom: 10px !important;
779 } 783 }
780 784
781 - float: right;  
782 - margin-right: 20px; 785 + .dropdown-button {
  786 + .el-button {
  787 + background-color: #667FFD !important;
  788 + color: white;
  789 + }
783 790
  791 + float: right;
  792 + margin-right: 20px;
  793 + }
784 } 794 }
785 } 795 }
786 - }  
787 796
788 - .left {  
789 - height: 190px;  
790 - background-color: #41CC95;  
791 - vertical-align: middle;  
792 - border-radius: 10px 0px 0px 10px;  
793 -  
794 - .left-icon {  
795 - margin-top: 26px;  
796 - height: 70px;  
797 -  
798 - .icon {  
799 - height: 100px;  
800 - width: 100px;  
801 - background: rgba(255, 255, 255, 0.1);  
802 - border-radius: 61px 61px 61px 61px;  
803 - margin: auto;  
804 - text-align: center;  
805 -  
806 - img {  
807 - margin-top: 24px;  
808 - height: 52px;  
809 - width: 52px; 797 + .left {
  798 + height: 190px;
  799 + background-color: #41CC95;
  800 + vertical-align: middle;
  801 + border-radius: 10px 0px 0px 10px;
  802 +
  803 + .left-icon {
  804 + margin-top: 26px;
  805 + height: 70px;
  806 + .icon {
  807 + height: 100px;
  808 + width: 100px;
  809 + background: rgba(255, 255, 255, 0.1);
  810 + border-radius: 61px 61px 61px 61px;
  811 + margin: auto;
  812 + text-align: center;
  813 +
  814 + img {
  815 + margin-top: 24px;
  816 + height: 52px;
  817 + width: 52px;
  818 + }
  819 + }
  820 +
  821 + .text {
  822 + width: 100%;
  823 + text-align: center;
  824 + margin-top: 5px;
  825 + font-size: 20px;
  826 + color: #FFFFFF;
  827 + }
  828 +
  829 + .text-radius {
  830 + width: 100%;
  831 + text-align: left;
  832 + margin-top: 9px;
  833 + margin-left: 1px;
  834 + white-space: nowrap;
  835 + width: calc(100% - 7.5px);
  836 + span {
  837 + overflow: hidden;
  838 + white-space: nowrap;
  839 + color: #209466;
  840 + text-overflow: ellipsis;
  841 + display: inline-block;
  842 + border-radius: 1px 15px 0px 10px;
  843 + padding-left: 8px;
  844 + padding-right: 4px;
  845 + padding-top: 2px;
  846 + padding-bottom: 2px;
  847 + max-width: calc(100% - 1px);
  848 + background: #E4F8F0;
  849 + }
810 } 850 }
811 } 851 }
  852 + }
812 853
813 - .text {  
814 - width: 100%;  
815 - text-align: center;  
816 - margin-top: 5px;  
817 - font-size: 20px; 854 + .right {
  855 + .el-button {
  856 + background-color: #667FFD;
  857 + line-height: 16px;
818 color: #FFFFFF; 858 color: #FFFFFF;
  859 + margin-top: 15px;
  860 + padding: 10px 20px !important;
819 } 861 }
820 } 862 }
821 - }  
822 863
823 - .right {  
824 - .el-button {  
825 - background-color: #667FFD;  
826 - line-height: 16px;  
827 - color: #FFFFFF;  
828 - margin-top: 15px;  
829 - padding: 10px 20px !important;  
830 - }  
831 } 864 }
832 865
833 -}  
834 -  
835 -.el-popconfirm__action {  
836 - margin-top: 10px; 866 + .el-popconfirm__action {
  867 + margin-top: 10px;
  868 + }
837 } 869 }
838 </style> 870 </style>
839 \ No newline at end of file 871 \ No newline at end of file
src/views/basic/askTestQuestion/update.vue
@@ -26,8 +26,7 @@ @@ -26,8 +26,7 @@
26 <p class="name-box"> 26 <p class="name-box">
27 <span>分享范围:</span> 27 <span>分享范围:</span>
28 <el-radio :disabled="isViewer" class="name-radio" v-model="form.sharingType" :label="0">任课班级分享</el-radio> 28 <el-radio :disabled="isViewer" class="name-radio" v-model="form.sharingType" :label="0">任课班级分享</el-radio>
29 - <el-radio :disabled="isViewer" class="name-radio" @click.native="_selectClassSharingType"  
30 - v-model="form.sharingType" :label="1">自定义分享班级</el-radio> 29 + <el-radio :disabled="isViewer" class="name-radio" @click.native="_selectClassSharingType" v-model="form.sharingType" :label="1">自定义分享班级</el-radio>
31 </p> 30 </p>
32 </div> 31 </div>
33 <div class="question-box"> 32 <div class="question-box">
@@ -225,26 +224,30 @@ @@ -225,26 +224,30 @@
225 :append-to-body="true"> 224 :append-to-body="true">
226 <div :key="classSharingType"> 225 <div :key="classSharingType">
227 <el-row class="row-subfix"> 226 <el-row class="row-subfix">
228 - <div class="row-line">  
229 - <span class="line-subfix">年级:</span>  
230 - <span class="line-value">{{ gradeName }}</span>  
231 - </div> 227 + <el-col :xs="24" :sm="24" :md="24" :lg="24" type="flex" style="flex-wrap:wrap">
  228 + <div class="row-line">
  229 + <span class="line-subfix">年级:</span>
  230 + <span class="line-value">{{ gradeName }}</span>
  231 + </div>
  232 + </el-col>
232 </el-row> 233 </el-row>
233 <el-row v-if="gradeClass.length >= 1" class="row-subfix" style="margin-top: 20px;"> 234 <el-row v-if="gradeClass.length >= 1" class="row-subfix" style="margin-top: 20px;">
234 - <span class="line-subfix" style="float: left;">班级:</span>  
235 - <div class="row-line" style="float: left; 235 + <el-col :xs="24" :sm="24" :md="24" :lg="24" type="flex" style="flex-wrap:wrap">
  236 + <span class="line-subfix" style="float: left;">班级:</span>
  237 + <div class="row-line" style="float: left;
236 background:rgb(245,247,250);padding:15px 10px;width: calc(100% - 80px);border-radius:5px;"> 238 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);">  
238 - <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll"  
239 - @change="handleCheckAllChange">全选</el-checkbox>  
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 }}  
244 - </el-checkbox>  
245 - </div>  
246 - </span>  
247 - </div> 239 + <span class="line-value" style="min-height: 300px;border-radius: 4px; background: rgb(247,247,250);">
  240 + <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll"
  241 + @change="handleCheckAllChange">全选</el-checkbox>
  242 + <div>
  243 + <el-checkbox @change="handleCheckedClassChange" v-model="item.isChecked" :key="index"
  244 + v-for="(item, index) in gradeClass" :label="item.id">
  245 + {{ item.className }}
  246 + </el-checkbox>
  247 + </div>
  248 + </span>
  249 + </div>
  250 + </el-col>
248 </el-row> 251 </el-row>
249 </div> 252 </div>
250 <div slot="footer"> 253 <div slot="footer">
@@ -1134,7 +1137,7 @@ export default { @@ -1134,7 +1137,7 @@ export default {
1134 }, 1137 },
1135 }; 1138 };
1136 </script> 1139 </script>
1137 -<style lang="scss"> 1140 +<style lang="scss" scoped>
1138 .line-value { 1141 .line-value {
1139 color: black; 1142 color: black;
1140 } 1143 }
src/views/basic/down/client.vue
@@ -19,7 +19,8 @@ @@ -19,7 +19,8 @@
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 class="down-btn" type="primary" @click="getAppDownloadUrl(false)">立即下载</el-button> 22 + <el-button class="down-btn" type="primary" v-loading="downClientLoading"
  23 + @click="getAppDownloadUrl(false)">立即下载</el-button>
23 </div> 24 </div>
24 </div> 25 </div>
25 <!-- <ul class="down-ul"> 26 <!-- <ul class="down-ul">
@@ -229,6 +230,7 @@ export default { @@ -229,6 +230,7 @@ export default {
229 dialogVis: false, 230 dialogVis: false,
230 askCount: true, 231 askCount: true,
231 examsDuration: true, 232 examsDuration: true,
  233 + downClientLoading: false,
232 configId: "", 234 configId: "",
233 formData: { 235 formData: {
234 configName: "", 236 configName: "",
@@ -423,11 +425,14 @@ export default { @@ -423,11 +425,14 @@ export default {
423 this.$message.error(info); 425 this.$message.error(info);
424 } 426 }
425 }, 427 },
426 - async getAppDownloadUrl(configId) { 428 + async getAppDownloadUrl(configId) {
  429 + if (this.downClientLoading) return;
  430 + this.downClientLoading = true;
427 const { data, status, info } = await this.$request.getAppDownloadUrl({ 431 const { data, status, info } = await this.$request.getAppDownloadUrl({
428 configId: configId || "", 432 configId: configId || "",
429 }); 433 });
430 if (status == 0) { 434 if (status == 0) {
  435 + this.downClientLoading = false;
431 // this.tableData = [...data.list] || []; 436 // this.tableData = [...data.list] || [];
432 const a = document.createElement("a"); 437 const a = document.createElement("a");
433 a.href = data.downloadUrl; 438 a.href = data.downloadUrl;
@@ -435,6 +440,7 @@ export default { @@ -435,6 +440,7 @@ export default {
435 a.click(); 440 a.click();
436 a.remove(); 441 a.remove();
437 } else { 442 } else {
  443 + this.downClientLoading = false;
438 this.$message.error(info); 444 this.$message.error(info);
439 } 445 }
440 }, 446 },
src/views/basic/setUp/archived.vue
@@ -166,7 +166,7 @@ export default { @@ -166,7 +166,7 @@ export default {
166 if (data && !data.code) { 166 if (data && !data.code) {
167 167
168 let blob = new Blob([data], { 168 let blob = new Blob([data], {
169 - type: "application/vnd.ms-excel;charset=utf-8", 169 + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
170 }); 170 });
171 171
172 downloadFile(type == 2 ? "教师任课信息" : type == 0 ? "行政班名单模板" : "教学班名单模板", blob); 172 downloadFile(type == 2 ? "教师任课信息" : type == 0 ? "行政班名单模板" : "教学班名单模板", blob);
src/views/examinationPaper/add.vue
@@ -78,11 +78,9 @@ @@ -78,11 +78,9 @@
78 v-model="form.examsDuration" label="考试时长"></el-input-number> 78 v-model="form.examsDuration" label="考试时长"></el-input-number>
79 </el-form-item> 79 </el-form-item>
80 <el-form-item v-if="role != 'ROLE_PERSONAL'" label="分享范围:" prop="sharingType"> 80 <el-form-item v-if="role != 'ROLE_PERSONAL'" label="分享范围:" prop="sharingType">
81 - <el-radio-group v-model="form.sharingType">  
82 - <el-radio :label="0">任课班级分享</el-radio>  
83 - <el-radio class="name-radio" @click.native="_selectClassSharingType" v-model="form.sharingType"  
84 - :label="1">自定义分享班级</el-radio>  
85 - </el-radio-group> 81 + <el-radio :label="0" v-model="form.sharingType">任课班级分享</el-radio>
  82 + <el-radio class="name-radio" @click.native="_selectClassSharingType" v-model="form.sharingType"
  83 + :label="1">自定义分享班级</el-radio>
86 </el-form-item> 84 </el-form-item>
87 </el-form> 85 </el-form>
88 <div class="btn-box"> 86 <div class="btn-box">
@@ -355,7 +353,7 @@ @@ -355,7 +353,7 @@
355 <p class="name">{{ form.title }}</p> 353 <p class="name">{{ form.title }}</p>
356 <p class="totals">卷面总分:{{ allScore }}分</p> 354 <p class="totals">卷面总分:{{ allScore }}分</p>
357 </div> 355 </div>
358 - <div class="question-box flex-content" v-for="(question, index) in form.questionList" :key="index"> 356 + <div class="question-box flex-content" v-for="(question, index) in form.questionList" :key="index">
359 <p class="question-title"> 357 <p class="question-title">
360 <span>{{ setBigNum(index) }}、</span> 358 <span>{{ setBigNum(index) }}、</span>
361 <span class="title-txt">{{ question.questionTitle }}</span> 359 <span class="title-txt">{{ question.questionTitle }}</span>
@@ -390,16 +388,11 @@ @@ -390,16 +388,11 @@
390 {{ setNum(index, indexs, subQuestions) }} 388 {{ setNum(index, indexs, subQuestions) }}
391 </div> 389 </div>
392 <div class="qs-type"> 390 <div class="qs-type">
393 - <template v-if="isUpload">  
394 - <el-select v-model="subQuestions.questionType" placeholder="选择题目类型" 391 + <el-select v-model="subQuestions.questionType" placeholder="选择题目类型"
395 @change="changeSubQuestions($event, subQuestions)"> 392 @change="changeSubQuestions($event, subQuestions)">
396 <el-option v-for="options in questionOptions" :key="options.value" :label="options.label" 393 <el-option v-for="options in questionOptions" :key="options.value" :label="options.label"
397 :value="options.value"></el-option> 394 :value="options.value"></el-option>
398 </el-select> 395 </el-select>
399 - </template>  
400 - <template v-else>  
401 - {{ setSubPro(subQuestions.questionType) }}  
402 - </template>  
403 </div> 396 </div>
404 <div class="qs-score"> 397 <div class="qs-score">
405 <el-input-number class="number-ipt" size="medium" :min="1" :max="200" :precision="2" 398 <el-input-number class="number-ipt" size="medium" :min="1" :max="200" :precision="2"
@@ -528,7 +521,7 @@ @@ -528,7 +521,7 @@
528 <el-button round @click="step = 0">上一步</el-button> 521 <el-button round @click="step = 0">上一步</el-button>
529 <el-button type="primary" round @click="toStep(3)">下一步</el-button> 522 <el-button type="primary" round @click="toStep(3)">下一步</el-button>
530 </template> 523 </template>
531 - </div> 524 + </div>
532 </div> 525 </div>
533 </div> 526 </div>
534 <div v-if="step == 3"> 527 <div v-if="step == 3">
@@ -536,7 +529,7 @@ @@ -536,7 +529,7 @@
536 <p class="name">{{ form.title }}</p> 529 <p class="name">{{ form.title }}</p>
537 <p class="totals">卷面总分:{{ allScore }}分</p> 530 <p class="totals">卷面总分:{{ allScore }}分</p>
538 </div> 531 </div>
539 - <div class="question-box flex-content" > 532 + <div class="question-box flex-content">
540 <template v-for="(question, index) in form.questionList"> 533 <template v-for="(question, index) in form.questionList">
541 <p class="question-title"> 534 <p class="question-title">
542 <span>{{ setBigNum(index) }}、</span> 535 <span>{{ setBigNum(index) }}、</span>
src/views/examinationPaper/addQs.vue
@@ -66,11 +66,9 @@ @@ -66,11 +66,9 @@
66 </el-select> 66 </el-select>
67 </el-form-item> 67 </el-form-item>
68 <el-form-item v-if="role != 'ROLE_PERSONAL'" label="分享范围:" prop="sharingType"> 68 <el-form-item v-if="role != 'ROLE_PERSONAL'" label="分享范围:" prop="sharingType">
69 - <el-radio-group v-model="form.sharingType">  
70 - <el-radio :label="0">任课班级分享</el-radio>  
71 - <el-radio class="name-radio" @click.native="_selectClassSharingType" v-model="form.sharingType"  
72 - :label="1">自定义分享班级</el-radio>  
73 - </el-radio-group> 69 + <el-radio class="name-radio" :label="0" v-model="form.sharingType">任课班级分享</el-radio>
  70 + <el-radio class="name-radio" @click.native="_selectClassSharingType" v-model="form.sharingType"
  71 + :label="1">自定义分享班级</el-radio>
74 </el-form-item> 72 </el-form-item>
75 </el-form> 73 </el-form>
76 <div class="btn-box"> 74 <div class="btn-box">
@@ -82,7 +80,7 @@ @@ -82,7 +80,7 @@
82 <div class="answer-title"> 80 <div class="answer-title">
83 <p class="name">{{ form.title }}</p> 81 <p class="name">{{ form.title }}</p>
84 </div> 82 </div>
85 - <div class="question-box flex-content" > 83 + <div class="question-box flex-content">
86 <ul class="questions-ul"> 84 <ul class="questions-ul">
87 <li class="sub-questions"> 85 <li class="sub-questions">
88 <div class="qs-num">题号</div> 86 <div class="qs-num">题号</div>
@@ -315,7 +313,7 @@ @@ -315,7 +313,7 @@
315 <el-button type="danger" plain round @click="linkBack">取消</el-button> 313 <el-button type="danger" plain round @click="linkBack">取消</el-button>
316 <el-button round @click="step = 0">上一步</el-button> 314 <el-button round @click="step = 0">上一步</el-button>
317 <el-button type="primary" round @click="toStep(2)">下一步</el-button> 315 <el-button type="primary" round @click="toStep(2)">下一步</el-button>
318 - </div> 316 + </div>
319 </div> 317 </div>
320 <el-dialog :close-on-click-modal="false" :modal-append-to-body="false" 318 <el-dialog :close-on-click-modal="false" :modal-append-to-body="false"
321 :title="stem.type == 1 ? '上传题干' : '上传题目解析'" :visible.sync="dialogStem" v-if="dialogStem" width="800px"> 319 :title="stem.type == 1 ? '上传题干' : '上传题目解析'" :visible.sync="dialogStem" v-if="dialogStem" width="800px">
@@ -349,7 +347,7 @@ @@ -349,7 +347,7 @@
349 <div class="answer-title"> 347 <div class="answer-title">
350 <p class="name">{{ form.title }}</p> 348 <p class="name">{{ form.title }}</p>
351 </div> 349 </div>
352 - <div class="question-box flex-content" > 350 + <div class="question-box flex-content">
353 <template v-for="question in form.questionList"> 351 <template v-for="question in form.questionList">
354 <template v-if="!question.subQuestions"> 352 <template v-if="!question.subQuestions">
355 <div class="screenshot-box" v-if="question.screenshot"> 353 <div class="screenshot-box" v-if="question.screenshot">
src/views/layout/Footer/bottom.vue
@@ -15,7 +15,7 @@ p{ @@ -15,7 +15,7 @@ p{
15 height: 28px; 15 height: 28px;
16 line-height: 28px; 16 line-height: 28px;
17 text-align: left; 17 text-align: left;
18 - font-size: 12px; 18 + font-size: 12px !important;
19 color: #999999; 19 color: #999999;
20 } 20 }
21 </style> 21 </style>
vue.config.js
1 const path = require("path"); 1 const path = require("path");
2 const resolve = (dir) => path.join(__dirname, dir); 2 const resolve = (dir) => path.join(__dirname, dir);
3 const IS_PROD = ["production", "prod"].includes(process.env.NODE_ENV); 3 const IS_PROD = ["production", "prod"].includes(process.env.NODE_ENV);
4 -const BundleAnalyzerPlugin = require("webpack-bundle-analyzer")  
5 - .BundleAnalyzerPlugin; 4 +const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
  5 +
  6 +const TimeStamp = new Date().getTime();
6 7
7 module.exports = { 8 module.exports = {
8 publicPath: "./", // 编译后的地址,可以根据环境进行设置 9 publicPath: "./", // 编译后的地址,可以根据环境进行设置
@@ -33,9 +34,21 @@ module.exports = { @@ -33,9 +34,21 @@ module.exports = {
33 }, 34 },
34 disableHostCheck: true 35 disableHostCheck: true
35 }, 36 },
  37 + configureWebpack: {
  38 + devtool: 'source-map',
  39 + output: { // 输出重构 打包编译后的 文件名称 【模块名称.版本号.js】
  40 + filename: `js/[name].${TimeStamp}.js`,
  41 + chunkFilename: `js/[name].${TimeStamp}.js`
  42 + },
  43 + },
36 css: { 44 css: {
37 extract: IS_PROD, // 是否将组件中的 CSS 提取至一个独立的 CSS 文件中 (而不是动态注入到 JavaScript 中的 inline 代码)。 45 extract: IS_PROD, // 是否将组件中的 CSS 提取至一个独立的 CSS 文件中 (而不是动态注入到 JavaScript 中的 inline 代码)。
38 sourceMap: false, 46 sourceMap: false,
  47 + extract: {
  48 + // 修改打包后css文件名 // css打包文件,添加时间戳
  49 + filename: `css/[name].${TimeStamp}.css`,
  50 + chunkFilename: `css/[name].${TimeStamp}.css`
  51 + }
39 }, 52 },
40 chainWebpack: (config) => { 53 chainWebpack: (config) => {
41 config.plugin('html').tap(args => { 54 config.plugin('html').tap(args => {