فهرست منبع

Merge branch 'develop' into PL/develop-BI

Li 3 سال پیش
والد
کامیت
925cfe3d19
20فایلهای تغییر یافته به همراه770 افزوده شده و 460 حذف شده
  1. 4 0
      TEAMModelOS/ClientApp/src/api/studentWeb.js
  2. 206 143
      TEAMModelOS/ClientApp/src/common/BaseCanvas.vue
  3. 2 0
      TEAMModelOS/ClientApp/src/components/dashboard/art/BasePointLineBar.vue
  4. 1 1
      TEAMModelOS/ClientApp/src/components/dashboard/art/LeftTop.vue
  5. 64 36
      TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/ClassRecord.less
  6. 12 10
      TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/ClassRecord.vue
  7. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/DataCount.vue
  8. 2 2
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperTest.vue
  9. 227 211
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue
  10. 25 3
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/ChartHome/ClassPoint.vue
  11. 3 3
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/ChartHome/ExamPerform.vue
  12. 19 0
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/ChartHome/HomeworkPoint.vue
  13. 25 7
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeViewnnnnew.less
  14. 171 32
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeViewnnnnew.vue
  15. 3 3
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/newHomeView.vue
  16. 1 0
      TEAMModelOS/ClientApp/src/components/student-web/achievement/MyAchievement.vue
  17. 0 4
      TEAMModelOS/ClientApp/src/view/dashboard/Art.less
  18. 2 2
      TEAMModelOS/ClientApp/src/view/student-web/App.vue
  19. 1 1
      TEAMModelOS/ClientApp/src/view/student-web/AppNew.vue
  20. 1 1
      TEAMModelOS/ClientApp/src/view/train/TrainDetail.vue

+ 4 - 0
TEAMModelOS/ClientApp/src/api/studentWeb.js

@@ -339,4 +339,8 @@ export default {
     getHwAch: function(data) {
         return post("/student/stu-hw-score", data)
     },
+    // 获取所有名单
+    getAllGrouplist: function(data) {
+        return post("/grouplist/get-student-joined-grouplist", data)
+    },
 }

+ 206 - 143
TEAMModelOS/ClientApp/src/common/BaseCanvas.vue

@@ -1,53 +1,88 @@
 <template>
-	<div class="maintenancePlanAdd">
-		<div class="panel-body">
-			<div class="demo">
-				<div class="draw-btn-group">
-					<div :class="{active:drawType==''}" :title="vm.$t('utils.choose')" @click="drawTypeChange('')">
-						<i class="iconfont icon-move1"></i>
-					</div>
-					<div :class="{active:drawType=='pen'}" :title="vm.$t('utils.draw')" @click="drawTypeChange('pen')">
-						<i class="iconfont icon-brush"></i>
-					</div>
-					<div :class="{active:drawType=='arrow'}" :title="vm.$t('utils.arrow')" @click="drawTypeChange('arrow')">
-						<i class="iconfont icon-arrow-mark"></i>
-					</div>
-					<div :class="{active:drawType=='text'}" :title="vm.$t('utils.text')" @click="drawTypeChange('text')">
-						<i class="iconfont icon-text"></i>
-					</div>
-					<div :class="{active:drawType=='ellipse'}" :title="vm.$t('utils.circle')" @click="drawTypeChange('ellipse')">
-						<i class="iconfont icon-oval"></i>
-					</div>
-					<div :class="{active:drawType=='rectangle'}" :title="vm.$t('utils.rect')" @click="drawTypeChange('rectangle')">
-						<i class="iconfont icon-rect"></i>
-					</div>
-					<div :class="{active:drawType=='pentagram'}" :title="vm.$t('utils.star')" @click="drawTypeChange('pentagram')">
-						<i class="iconfont icon-k-point"></i>
-					</div>
-					<div @click="uploadImg" :title="vm.$t('utils.upload')">
-						<i class="iconfont icon-cus-video"></i>
-					</div>
-					<div @click="undo" :title="vm.$t('utils.undo')">
-						<i class="iconfont icon-undo"></i>
-					</div>
-					<div @click="clear" :title="vm.$t('utils.clear')">
-						<i class="iconfont icon-reset"></i>
-					</div>
-					<div @click="save" :title="vm.$t('utils.save')">
-						<i class="iconfont icon-baocun1"></i>
-					</div>
-					<ColorPicker v-model="color" />
-				</div>
-				<canvas id="canvas" :width="width" :height="height"></canvas>
-			</div>
-			<div class="footer">
-				<Button @click="cancel">{{ vm.$t('utils.cancel') }}</Button>
-				<Button type="success" @click="save">{{ vm.$t('utils.save') }}</Button>
-			</div>
-		</div>
-		<input type="file" @change="uploadImgChange" id="imgInput" accept="image/*" />
-		<img id="img" crossOrigin="Anonymous" :src="imgSrc" />
-	</div>
+    <div class="maintenancePlanAdd">
+        <div class="panel-body">
+            <div class="demo">
+                <div class="draw-btn-group">
+                    <div
+                        :class="{ active: drawType == '' }"
+                        :title="vm.$t('utils.choose')"
+                        @click="drawTypeChange('')"
+                    >
+                        <i class="iconfont icon-move1"></i>
+                    </div>
+                    <div
+                        :class="{ active: drawType == 'pen' }"
+                        :title="vm.$t('utils.draw')"
+                        @click="drawTypeChange('pen')"
+                    >
+                        <i class="iconfont icon-brush"></i>
+                    </div>
+                    <div
+                        :class="{ active: drawType == 'arrow' }"
+                        :title="vm.$t('utils.arrow')"
+                        @click="drawTypeChange('arrow')"
+                    >
+                        <i class="iconfont icon-arrow-mark"></i>
+                    </div>
+                    <div
+                        :class="{ active: drawType == 'text' }"
+                        :title="vm.$t('utils.text')"
+                        @click="drawTypeChange('text')"
+                    >
+                        <i class="iconfont icon-text"></i>
+                    </div>
+                    <div
+                        :class="{ active: drawType == 'ellipse' }"
+                        :title="vm.$t('utils.circle')"
+                        @click="drawTypeChange('ellipse')"
+                    >
+                        <i class="iconfont icon-oval"></i>
+                    </div>
+                    <div
+                        :class="{ active: drawType == 'rectangle' }"
+                        :title="vm.$t('utils.rect')"
+                        @click="drawTypeChange('rectangle')"
+                    >
+                        <i class="iconfont icon-rect"></i>
+                    </div>
+                    <div
+                        :class="{ active: drawType == 'pentagram' }"
+                        :title="vm.$t('utils.star')"
+                        @click="drawTypeChange('pentagram')"
+                    >
+                        <i class="iconfont icon-k-point"></i>
+                    </div>
+                    <div @click="uploadImg" :title="vm.$t('utils.upload')">
+                        <i class="iconfont icon-cus-video"></i>
+                    </div>
+                    <div @click="undo" :title="vm.$t('utils.undo')">
+                        <i class="iconfont icon-undo"></i>
+                    </div>
+                    <div @click="clear" :title="vm.$t('utils.clear')">
+                        <i class="iconfont icon-reset"></i>
+                    </div>
+                    <div @click="save" :title="vm.$t('utils.save')">
+                        <i class="iconfont icon-baocun1"></i>
+                    </div>
+                    <ColorPicker v-model="color" />
+                </div>
+                <canvas id="canvas" :width="width" :height="height"></canvas>
+            </div>
+            <div class="footer">
+                <Button @click="cancel">{{ vm.$t("utils.cancel") }}</Button>
+                <Button type="success" @click="save">{{
+                    vm.$t("utils.save")
+                }}</Button>
+            </div>
+        </div>
+        <input
+            type="file"
+            @change="uploadImgChange"
+            id="imgInput"
+            accept="image/*"
+        />
+        <img id="img" crossOrigin="Anonymous" :src="imgSrc" />
+    </div>
 </template>
 <script>
 	export default {
@@ -134,7 +169,22 @@
 		},
 		methods: {
 			clear(){
-				this.canvas.clear()
+				if(this.canvas && Object.keys(this.canvas).length){
+					this.canvas.clear()
+				}
+				if (this.bgImg && this.canvas) {
+					var imgElement = document.createElement("img"); //声明我们的图片
+					imgElement.crossOrigin = 'Anonymous'
+					imgElement.src = this.bgImg
+					imgElement.width = this.width
+					imgElement.height = this.height
+					imgElement.onload = () => {
+						var imgInstance = new fabric.Image(imgElement, {
+							zIndex: -2,
+						});
+						this.canvas.add(imgInstance);
+					};
+				}
 			},
 			cancel(){
 				this.$emit('onCloseModal')
@@ -145,6 +195,20 @@
 						this.canvas.getObjects()[this.canvas.getObjects().length - 1]
 					)
 				}
+
+				if (this.bgImg && this.canvas) {
+					var imgElement = document.createElement("img"); //声明我们的图片
+					imgElement.crossOrigin = 'Anonymous'
+					imgElement.src = this.bgImg
+					imgElement.width = this.width
+					imgElement.height = this.height
+					imgElement.onload = () => {
+						var imgInstance = new fabric.Image(imgElement, {
+							zIndex: -2,
+						});
+						this.canvas.add(imgInstance);
+					};
+				}
 			},
 			save() {
 				this.canvas.discardActiveObject();
@@ -666,99 +730,98 @@
 </script>
 
 <style lang="less">
-	.maintenancePlanAdd{
-		
-		.footer{
-			display: none;
-			float: right;
-			margin-top: 10px;
-			
-			.ivu-btn{
-				margin-left: 20px;
-			}
-		}
-		
-		.ivu-color-picker {
-			.ivu-icon{
-				display: none;
-			}
-			
-			.ivu-input{
-				background: none;
-				border: none;
-				display: flex;
-				justify-content: center;
-			}
-			
-			.ivu-color-picker-focused{
-				box-shadow: none;
-			}
-			
-			.ivu-color-picker-color{
-				height: 20px;
-				width: 20px;
-				margin-top: 5px;
-				cursor: pointer;
-			}
-		}
-		
-		.ivu-input-icon-normal+.ivu-input{
-			padding: 0;
-		}
-	
-	.el-container {
-		flex-direction: column;
-	}
-
-	img,
-	input {
-		display: none;
-	}
-
-	.demo {
-		display: flex;
-		justify-content: center;
-		align-items: center;
-	}
-
-	canvas {
-		border: 1px dashed #b8b8b8;
-	}
-
-	.draw-btn-group {
-		height: 480px;
-		width: 40px;
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		justify-content: flex-start;
-		background: #e7e7e7;
-
-		&>div {
-			cursor: pointer;
-			display: flex;
-			justify-content: center;
-
-			&:hover {
-				background: #c7c7c7;
-			}
+.maintenancePlanAdd {
+    .footer {
+        display: none;
+        float: right;
+        margin-top: 10px;
 
-			i {
-				display: flex;
-				background-repeat: no-repeat;
-				// background-size: 80%;
-				// background-position: 50% 50%;
-				height: 40px;
-				width: 40px;
-				font-size: 22px;
-				align-items: center;
-				justify-content: center;
-			}
-		}
+        .ivu-btn {
+            margin-left: 20px;
+        }
+    }
 
-		.active {
-			background: #c7c7c7;
-		}
-		}
-	}
+    .ivu-color-picker {
+        .ivu-icon {
+            display: none;
+        }
+
+        .ivu-input {
+            background: none;
+            border: none;
+            display: flex;
+            justify-content: center;
+        }
+
+        .ivu-color-picker-focused {
+            box-shadow: none;
+        }
+
+        .ivu-color-picker-color {
+            height: 20px;
+            width: 20px;
+            margin-top: 5px;
+            cursor: pointer;
+        }
+    }
+
+    .ivu-input-icon-normal + .ivu-input {
+        padding: 0;
+    }
+
+    .el-container {
+        flex-direction: column;
+    }
+
+    img,
+    input {
+        display: none;
+    }
+
+    .demo {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+    }
+
+    canvas {
+        border: 1px dashed #b8b8b8;
+    }
+
+    .draw-btn-group {
+        height: 480px;
+        width: 40px;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: flex-start;
+        background: #e7e7e7;
+
+        & > div {
+            cursor: pointer;
+            display: flex;
+            justify-content: center;
+
+            &:hover {
+                background: #c7c7c7;
+            }
+
+            i {
+                display: flex;
+                background-repeat: no-repeat;
+                // background-size: 80%;
+                // background-position: 50% 50%;
+                height: 40px;
+                width: 40px;
+                font-size: 22px;
+                align-items: center;
+                justify-content: center;
+            }
+        }
+
+        .active {
+            background: #c7c7c7;
+        }
+    }
+}
 </style>

+ 2 - 0
TEAMModelOS/ClientApp/src/components/dashboard/art/BasePointLineBar.vue

@@ -78,6 +78,8 @@ export default {
         dataZoom: [{
           show: true,
           height: 10,
+          start:20,
+          end:60,
           xAxisIndex: [0],
           bottom: 10,
           handleIcon: 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',

+ 1 - 1
TEAMModelOS/ClientApp/src/components/dashboard/art/LeftTop.vue

@@ -121,7 +121,7 @@ export default {
 
       .count-num {
         display: inline-block;
-        font-size: 26px;
+        font-size: 22px;
         font-weight: bold;
         margin-top: 10px;
       }

+ 64 - 36
TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/ClassRecord.less

@@ -16,11 +16,13 @@
         .cur-page-tag {
             opacity: 0;
         }
-        .course-cur-img{
+
+        .course-cur-img {
             height: 100%;
         }
     }
 }
+
 .cur-page-tag {
     position: absolute;
     left: 5px;
@@ -30,7 +32,7 @@
     font-size: 18px;
     line-height: 30px;
     display: block;
-    background: rgba(255,153,0,0.9);
+    background: rgba(255, 153, 0, 0.9);
     border-radius: 50%;
     text-align: center;
     opacity: 1;
@@ -53,6 +55,7 @@
     transition: opacity 1.2s;
     border-right: 2px solid black;
 }
+
 .record-info {
     background-color: #f9f9f9;
     width: 100%;
@@ -65,11 +68,11 @@
         display: flex;
         justify-content: space-between;
 
-        & > div > p {
+        &>div>p {
             margin-bottom: 5px;
         }
     }
-    
+
     .testTitle {
         background-color: rgb(255, 255, 255);
         // color: #24b880;
@@ -81,7 +84,7 @@
         border-bottom: 1px solid rgba(0, 0, 0, 0.1);
         z-index: 10;
 
-        .logoutIcon{
+        .logoutIcon {
             cursor: pointer;
             margin-right: 10px;
         }
@@ -94,7 +97,7 @@
         width: 100%;
     }
 
-    .video-player-box{
+    .video-player-box {
         width: 50%;
         justify-content: center;
         height: 450px;
@@ -104,13 +107,13 @@
         background-color: #fff;
     }
 
-    .message-area{
+    .message-area {
         position: relative;
         height: 815px;
         padding: 10px;
         margin-bottom: 20px;
 
-        .filter-type{
+        .filter-type {
             position: absolute;
             right: 0;
             top: 10px;
@@ -122,11 +125,11 @@
             flex-direction: column;
             background-color: #F1F1F1;
 
-            span{
+            span {
                 border: none;
                 padding: 0px;
                 font-size: 32px;
-                
+
                 &:hover {
                     cursor: pointer;
                     color: #24b880;
@@ -138,17 +141,17 @@
             }
         }
 
-        .message-box{
+        .message-box {
             display: flex;
             border-bottom: 1px #ccc solid;
 
-            .message-page{
+            .message-page {
                 width: 10%;
                 padding: 10px 15px;
                 padding-bottom: 0;
                 // border-right: 1px #ccc dashed;
 
-                img{
+                img {
                     margin-top: 5px;
                 }
 
@@ -169,7 +172,7 @@
                 }
             }
 
-            .message-record{
+            .message-record {
                 padding: 10px 15px;
                 padding-bottom: 0;
                 width: 87%;
@@ -208,8 +211,8 @@
                         border-radius: 4px;
                         position: relative;
                         // width: 85%;
-                    
-                        &::before{
+
+                        &::before {
                             content: "";
                             position: absolute;
                             top: 3px;
@@ -222,8 +225,8 @@
                             border-color: transparent #d4ede1 transparent transparent;
                         }
 
-                        .message-text{
-                            img{
+                        .message-text {
+                            img {
                                 max-width: 80%;
                             }
 
@@ -237,11 +240,13 @@
                                 display: flex;
                                 flex-direction: column;
                                 justify-content: center;
+
                                 .student-no {
                                     font-size: 40px;
                                     color: black;
                                     font-weight: 600;
                                 }
+
                                 .student-name {
                                     color: #007cff;
                                     font-weight: 800;
@@ -265,14 +270,14 @@
                         left: 55px;
                     }
                 }
-                
+
                 .teacher-item {
                     display: block;
                     // padding-right: 5%;
                     text-align: right !important;
                     position: relative;
                     margin-bottom: 50px;
-                    
+
                     .message-avatar {
                         border-radius: 50%;
                         float: left;
@@ -300,8 +305,8 @@
                         border-radius: 4px;
                         position: relative;
                         // width: 85%;
-                    
-                        &::before{
+
+                        &::before {
                             content: "";
                             position: absolute;
                             top: 3px;
@@ -314,8 +319,8 @@
                             border-color: transparent transparent transparent #ffecc2;
                         }
 
-                        .message-text{
-                            img{
+                        .message-text {
+                            img {
                                 max-width: 80%;
                             }
 
@@ -329,11 +334,13 @@
                                 display: flex;
                                 flex-direction: column;
                                 justify-content: center;
+
                                 .student-no {
                                     font-size: 40px;
                                     color: black;
                                     font-weight: 600;
                                 }
+
                                 .student-name {
                                     color: #007cff;
                                     font-weight: 800;
@@ -358,7 +365,7 @@
                     }
                 }
 
-                .teacher-client-icon{
+                .teacher-client-icon {
                     font-size: 30px;
                     padding: 5px;
                     color: #ffffff;
@@ -368,7 +375,7 @@
                     float: left;
                 }
 
-                .student-client-icon{
+                .student-client-icon {
                     font-size: 30px;
                     padding: 5px;
                     color: #ffffff;
@@ -378,15 +385,17 @@
                     margin-left: 15px;
                 }
 
-                .event-item{
+                .event-item {
                     border: 1px dashed transparent;
                     margin-bottom: 15px;
                     padding: 5px 5px;
                 }
-                .event-item:hover{
+
+                .event-item:hover {
                     border: 1px dashed #e0e0e0;
                 }
-                .student-event{
+
+                .student-event {
                     display: flex;
                     justify-content: end;
                 }
@@ -407,8 +416,8 @@
             font-weight: bold;
         }
     }
-    
-    .title-rect-name > span{
+
+    .title-rect-name>span {
         background-color: #24B880;
         font-size: 12px;
         padding: 3px;
@@ -417,19 +426,21 @@
         color: #fff;
         cursor: pointer;
     }
-    
-    .e-note-tag{
+
+    .e-note-tag {
         font-size: 16px;
         padding: 2px 5px;
         margin-left: 30px;
         vertical-align: top;
         cursor: pointer;
         user-select: none;
-        &:hover{
+
+        &:hover {
             color: #24b880;
         }
     }
 }
+
 .image-viewer {
     background-color: rgba(0, 0, 0, 0.8);
     z-index: 9999;
@@ -450,7 +461,7 @@
         margin: 5% auto;
         border: none;
     }
-    
+
     .close-icon {
         position: absolute;
         right: 15px;
@@ -461,10 +472,27 @@
     }
 }
 
-.no-video-tips{
+.no-video-tips {
     position: absolute;
     top: 0px;
     left: 0px;
     color: #ff9900;
     width: 100%;
 }
+
+@media screen and (max-width: 768px) {
+    .class-content {
+        flex-direction: column;
+
+        .courseware-wrap,
+        .video-player-box {
+            width: 100%;
+        }
+
+        .video-player-box {
+            margin-top: 10px;
+            margin-left: 0;
+            height: auto;
+        }
+    }
+}

+ 12 - 10
TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/ClassRecord.vue

@@ -16,16 +16,18 @@
                             <Icon type="ios-contact-outline" style="font-weight: bold;" class="base-info-icon" />{{ $t('studentWeb.baseInfo.teacher') }}
                             <span class="base-info-text">{{ recordInfo.tmdname }}</span>
                         </p>
-                        <p style="margin-left: 20px;">
-                            <svg-icon class="base-info-icon" icon-class="course" />{{ $t('studentWeb.baseInfo.subjectName') }}
-                            <span class="base-info-text">{{ courseNow.name }}</span>
-                        </p>
-                        <p style="margin-left: 20px;">
-                            <Icon custom="iconfont icon-mingdan" class="base-info-icon" />{{ $t('studentWeb.baseInfo.stuList') }}
-                            <template v-if="courseNow.className.length">
-                                <span class="base-info-text" v-for="(item, index) in courseNow.className" :key="index" style="margin-right: 10px;">{{ item.name }}</span>
-                            </template>
-                        </p>
+                        <template v-if="courseNow">
+                            <p style="margin-left: 20px;">
+                                <svg-icon class="base-info-icon" icon-class="course" />{{ $t('studentWeb.baseInfo.subjectName') }}
+                                <span class="base-info-text">{{ courseNow.name }}</span>
+                            </p>
+                            <p style="margin-left: 20px;">
+                                <Icon custom="iconfont icon-mingdan" class="base-info-icon" />{{ $t('studentWeb.baseInfo.stuList') }}
+                                <template v-if="courseNow.className.length">
+                                    <span class="base-info-text" v-for="(item, index) in courseNow.className" :key="index" style="margin-right: 10px;">{{ item.name }}</span>
+                                </template>
+                            </p>
+                        </template>
                         <p style="margin-left: 20px;">
                             <Icon type="md-timer" class="base-info-icon" />{{ $t('studentWeb.baseInfo.duration') }}:
                             <span class="base-info-text">{{ recordInfo.time }}</span>

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/ClassRecord/DataCount.vue

@@ -41,7 +41,7 @@ export default {
         return {
             attentColor: ['', '#19be6b', '#EB3941', '#EB3941', '#EB3941', '#EB3941'],
             colorList: ['#19be6b', '#2d8cf0', '#2db7f5', '#2db7f5', '#2db7f5', '#19be6b', '#2db7f5', '#2db7f5', '#2db7f5', '#ed4014'],
-            attendType: false,
+            attendType: 2, //新加入的会没有该学生的信息,即nowStuInfo = undefined
             dataList: [
                 {
                     label: this.$t("studentWeb.hiteachNote.dataCount.getCount"),

+ 2 - 2
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperTest.vue

@@ -363,7 +363,7 @@
                     </div>
                     <div v-else>{{ $t("studentWeb.exam.testpop.noExam") }}</div>
                 </div>
-                <div style="display: flex; margin-top: 10px;">
+                <div v-if="isWrong" style="margin-top: 10px;">
                     <span class="color-type">
                         <span class="activeBg" style="background-color: #92D2A9;"></span>
                         {{ $t("studentWeb.exam.report.right") }}
@@ -1082,7 +1082,7 @@
                     // 已作答
                     if(n[this.queNo] && n[this.queNo].length) {
                         if(this.isWrong) {
-                            let objectiveTypes = ["single", "multiple", "judge"]
+                            let objectiveTypes = ["single", "multiple", "judge"]
 
                             if(objectiveTypes.includes(this.showExam[this.queNo].type)) {
                                 if(this.showExam[this.queNo].type != "multiple") {

+ 227 - 211
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue

@@ -1,238 +1,254 @@
 <template>
-  <div class="content">
-    <div class="editor-wrap" v-show="!isConnector">
-      <div id="textArea"></div>
+    <div class="content">
+        <div class="editor-wrap" v-show="!isConnector">
+            <div id="textArea"></div>
+        </div>
+        <div class="connector-wrap" v-if="isConnector">
+            <div v-if="answerImg">
+                <!-- <img :src="answerImg" alt=""> -->
+                <span v-html="answerImg"></span>
+            </div>
+            <p v-if="answerImg" style="font-weight: bold; margin-bottom: 20px">
+                {{ $t("studentWeb.exam.testpop.reAns") }}
+            </p>
+            <BaseCanvas :vm="vm" :bgImg="markBg" :isStudent="markStatus" @onCloseModal="closeModal" @onSaveCanvas="saveMark"></BaseCanvas>
+        </div>
+        <Modal v-model="markStatus" fullscreen :title="$t('studentWeb.exam.answer')" footer-hide ref="compose">
+            <BaseCanvas v-if="markStatus" :vm="vm" :bgImg="markBg" :isStudent="markStatus" @onCloseModal="closeModal" @onSaveCanvas="saveMark"></BaseCanvas>
+        </Modal>
+        <iframe class="frame" id="answerIframe" :srcdoc="itemInfo.question"></iframe>
     </div>
-    <div class="connector-wrap" v-if="isConnector">
-      <div v-if="answerImg">
-        <img :src="answerImg" alt="">
-      </div>
-      <p v-if="answerImg" style="font-weight: bold;margin-bottom:20px">{{ $t("studentWeb.exam.testpop.reAns") }}</p>
-      <BaseCanvas :vm="vm" :bgImg="markBg" @onCloseModal="closeModal" :isStudent="markStatus" @onSaveCanvas="saveMark"></BaseCanvas>
-    </div>
-    <Modal v-model="markStatus" fullscreen :title="$t('studentWeb.exam.answer')" footer-hide ref="compose">
-      <BaseCanvas v-if="markStatus" :vm="vm" :bgImg="markBg" @onCloseModal="closeModal" :isStudent="markStatus" @onSaveCanvas="saveMark"></BaseCanvas>
-    </Modal>
-    <iframe class="frame" id="answerIframe" :srcdoc="itemInfo.question"></iframe>
-  </div>
 </template>
 <script>
-import html2canvas from 'html2canvas';
-import E from 'wangeditor';
-import { editor_tw_config } from '@/utils/editorLangTw.js';
-import { editor_en_config } from '@/utils/editorLangEn.js';
-import i18next from 'i18next';
+import html2canvas from "html2canvas"
+import E from "wangeditor"
+import { editor_tw_config } from "@/utils/editorLangTw.js"
+import { editor_en_config } from "@/utils/editorLangEn.js"
+import i18next from "i18next"
 export default {
-  components: {
-
-  },
-  props: {
-    index: {
-      type: Number,
-      default: -1
-    },
-    textData: {
-      type: Array,
-      default: () => {
-        return []
-      }
+    components: {},
+    props: {
+        index: {
+            type: Number,
+            default: -1,
+        },
+        textData: {
+            type: Array,
+            default: () => {
+                return []
+            },
+        },
+        itemInfo: {
+            type: Object,
+            default: () => {
+                return {}
+            },
+        },
+        close: {
+            type: Boolean,
+            default: false,
+        },
     },
-    itemInfo: {
-      type: Object,
-      default: () => {
-        return {}
-      }
-    },
-    close: {
-      type: Boolean,
-      default: false
-    }
-  },
-  data(vm) {
-    return {
-      answerImg: null,
-      vm: vm,
-      tabName: 'exercise',
-      editorContent: "",
-      examInfo: [],
-      editor: null,
-      markStatus: false,
-      markBg: ""
-    }
-  },
-  methods: {
-    async getInfo() {
-      console.error(this.markBg)
-      this.markBg = ""
-      this.examInfo = []
-      this.initEditor()
-      console.error(this.textData)
-      this.answerImg = null
-      if (this.textData.length > 0) {
-        this.examInfo = [...this.textData]
-        if (this.isConnector) {
-          this.answerImg = this.textData[0]
-        } else {
-          this.answerImg = null
-          this.editor.txt.html(this.examInfo[0])
-        }
-      }
-      setTimeout(() => {
-        if (this.isConnector) {
-          this.markStuAnswer()
+    data(vm) {
+        return {
+            answerImg: null,
+            vm: vm,
+            tabName: "exercise",
+            editorContent: "",
+            examInfo: [],
+            editor: null,
+            markStatus: false,
+            markBg: "",
         }
-      }, 100)
     },
-    closeModal() {
-      this.markStatus = false
-      this.markBg = ""
+    methods: {
+        async getInfo() {
+            // console.error(this.markBg)
+            this.markBg = ""
+            this.examInfo = []
+            this.initEditor()
+            // console.error(this.textData)
+            this.answerImg = null
+            if (this.textData.length > 0) {
+                this.examInfo = [...this.textData]
+                if (this.isConnector) {
+                    this.answerImg = this.textData[0]
+                } else {
+                    this.answerImg = null
+                    this.editor.txt.html(this.examInfo[0])
+                }
+            }
+            setTimeout(() => {
+                if (this.isConnector) {
+                    this.markStuAnswer()
+                }
+            }, 100)
+        },
+        closeModal() {
+            this.markStatus = false
+            this.markBg = ""
+        },
+        saveMark(data) {
+            if (data) {
+                data.height = 400
+                data.width = 400
+                let params = `<img src="${data.base64}" />`
+                let img = document.createElement("img")
+                img.src = data.base64
+                if (this.isConnector) {
+                    this.answerImg = params
+                    this.markBg = ""
+                    setTimeout(() => {
+                        this.markStuAnswer()
+                    }, 100)
+                    this.$emit("dataGet", params, this.index)
+                    this.$Message.success(this.$t("settings.submitSucTips"))
+                } else {
+                    this.editor.txt.html(img.outerHTML)
+                }
+                this.markStatus = false
+            }
+        },
+        initEditor() {
+            this.editorContent = ""
+            this.editor = new E("#textArea")
+            this.editor.config.onchange = (html) => {
+                this.editorContent = html
+            }
+            this.editor.config.showFullScreen = false
+            this.editor.config.menus = [
+                "link", // 插入链接
+                "justify", // 对齐方式
+                "image", // 插入图片
+            ]
+            this.editor.config.zIndex = 1
+            this.editor.config.placeholder = this.$t(
+                "studentWeb.exam.inputAnswers"
+            )
+            this.editor.config.height = 300
+            this.editor.config.showLinkImg = false
+            this.editor.config.uploadImgShowBase64 = true // 使用 base64 保存图片不建议使用这种,我只是图个方便
+            this.$editorTools.addCanvas(this, this.editor)
+            this.editor.config.menus.push("connector")
+            this.$editorTools.addStuBgBtn(this, this.editor)
+            // if (this.itemInfo.type == 'correct' || this.itemInfo.type == 'connector') {
+            //     this.editor.config.menus.push('connector')
+            //     this.$editorTools.addStuBgBtn(this, this.editor)
+            // } else {
+            //     this.$editorTools.addCanvas(this, this.editor)
+            // }
+            let curLang = localStorage.getItem("local") || "zh-cn"
+            if (curLang === "zh-tw") {
+                // 自定义语言
+                this.editor.config.languages["tw"] = editor_tw_config
+                // 选择语言
+                this.editor.config.lang = "tw"
+                // 引入 i18next 插件
+                this.editor.i18next = i18next
+            }
+            if (curLang === "en-us") {
+                // 自定义语言
+                this.editor.config.languages["en"] = editor_en_config
+                // 选择语言
+                this.editor.config.lang = "en"
+                // 引入 i18next 插件
+                this.editor.i18next = i18next
+            }
+            this.editor.create()
+            if (this.close) {
+                this.editor.disable()
+            }
+            this.editor.txt.clear()
+            if (this.examInfo.length > 0) {
+                this.editor.txt.html(this.examInfo[0])
+            }
+        },
+        markStuAnswer() {
+            let answerIframe = ""
+            answerIframe = document.getElementById("answerIframe")
+            answerIframe.contentWindow.document.body.style.width = "fit-content"
+            answerIframe.contentWindow.document.body.style.minWidth = "600px"
+            answerIframe.contentWindow.document.body.style.backgroundColor =
+                "#f5f5f5"
+            console.log(
+                document.getElementById("answerIframe").contentWindow.document
+            )
+            let iframe = document
+                .getElementById("answerIframe")
+                .contentWindow.document.getElementsByTagName("p")
+
+            if (iframe.length > 0) {
+                for (let i = 0; i < iframe.length - 1; i++) {
+                    iframe[i].style.lineHeight = "50px"
+                    iframe[i].style.paddingBottom = "30px"
+                }
+                iframe[iframe.length - 1].style.paddingBottom = "100px"
+                iframe[iframe.length - 1].style.lineHeight = "50px"
+            }
+            html2canvas(answerIframe.contentWindow.document.body).then(
+                (canvas) => {
+                    if (!this.isConnector) {
+                        this.markStatus = true
+                    }
+                    this.markBg = canvas.toDataURL("image/png")
+                }
+            )
+        },
     },
-    saveMark(data) {
-      if (data) {
-        data.height = 400
-        data.width = 400
-        let img = document.createElement('img')
-        img.src = data.base64
-        if (this.isConnector) {
-          this.answerImg = data.base64
-          this.markBg = ''
-          setTimeout(() => {
+    mounted() {
+        this.initEditor()
+        this.getInfo()
+        // 监听富文本画板功能
+        this.$EventBus.$off("onStuCanvas")
+        this.$EventBus.$on("onStuCanvas", (editor) => {
+            this.markBg = ""
             this.markStuAnswer()
-          }, 100)
-          this.$emit("dataGet", data.base64, this.index)
-          this.$Message.success(this.$t('settings.submitSucTips'))
-        } else {
-          this.editor.txt.html(img.outerHTML)
-        }
-        this.markStatus = false
-      }
-    },
-    initEditor() {
-      this.editorContent = ""
-      this.editor = new E("#textArea");
-      this.editor.config.onchange = (html) => {
-        this.editorContent = html;
-      };
-      this.editor.config.showFullScreen = false
-      this.editor.config.menus = [
-        "link", // 插入链接
-        "justify", // 对齐方式
-        "image", // 插入图片
-      ]
-      this.editor.config.zIndex = 1
-      this.editor.config.placeholder = this.$t('studentWeb.exam.inputAnswers')
-      this.editor.config.height = 300
-      this.editor.config.showLinkImg = false;
-      this.editor.config.uploadImgShowBase64 = true; // 使用 base64 保存图片不建议使用这种,我只是图个方便
-      this.$editorTools.addCanvas(this, this.editor)
-      this.editor.config.menus.push('connector')
-      this.$editorTools.addStuBgBtn(this, this.editor)
-      // if (this.itemInfo.type == 'correct' || this.itemInfo.type == 'connector') {
-      //     this.editor.config.menus.push('connector')
-      //     this.$editorTools.addStuBgBtn(this, this.editor)
-      // } else {
-      //     this.$editorTools.addCanvas(this, this.editor)
-      // }
-      let curLang = localStorage.getItem('local') || 'zh-cn'
-      if (curLang === 'zh-tw') {
-        // 自定义语言
-        this.editor.config.languages['tw'] = editor_tw_config
-        // 选择语言
-        this.editor.config.lang = 'tw'
-        // 引入 i18next 插件
-        this.editor.i18next = i18next
-      }
-      if (curLang === 'en-us') {
-        // 自定义语言
-        this.editor.config.languages['en'] = editor_en_config
-        // 选择语言
-        this.editor.config.lang = 'en'
-        // 引入 i18next 插件
-        this.editor.i18next = i18next
-      }
-      this.editor.create();
-      if (this.close) {
-        this.editor.disable()
-      }
-      this.editor.txt.clear()
-      if (this.examInfo.length > 0) {
-        this.editor.txt.html(this.examInfo[0])
-      }
+        })
     },
-    markStuAnswer() {
-      let answerIframe = ''
-      answerIframe = document.getElementById('answerIframe')
-      answerIframe.contentWindow.document.body.style.width = 'fit-content'
-      answerIframe.contentWindow.document.body.style.minWidth = '600px'
-      answerIframe.contentWindow.document.body.style.backgroundColor = '#f5f5f5'
-      console.log(document.getElementById('answerIframe').contentWindow.document)
-      let iframe = document.getElementById('answerIframe').contentWindow.document.getElementsByTagName('p')
-
-      if (iframe.length > 0) {
-        for (let i = 0; i < iframe.length - 1; i++) {
-          iframe[i].style.lineHeight = '50px'
-          iframe[i].style.paddingBottom = '30px'
-        }
-        iframe[iframe.length - 1].style.paddingBottom = '100px'
-        iframe[iframe.length - 1].style.lineHeight = '50px'
-      }
-      html2canvas(answerIframe.contentWindow.document.body).then(canvas => {
-        if(!this.isConnector){
-            this.markStatus = true
-        }
-        this.markBg = canvas.toDataURL("image/png");
-      })
+    computed: {
+        isConnector() {
+            return (
+                this.itemInfo.type == "connector" ||
+                this.itemInfo.type == "correct"
+            )
+        },
     },
-  },
-  mounted() {
-    this.initEditor()
-    this.getInfo()
-    // 监听富文本画板功能
-    this.$EventBus.$off('onStuCanvas')
-    this.$EventBus.$on('onStuCanvas', editor => {
-      this.markBg = ""
-      this.markStuAnswer()
-    })
-  },
-  computed: {
-    isConnector() {
-      return this.itemInfo.type == 'connector' || this.itemInfo.type == 'correct'
-    }
-  },
-  watch: {
-    index() {
-      this.getInfo()
-      deep: true
-      immediate: true
+    watch: {
+        index() {
+            this.getInfo()
+            deep: true
+            immediate: true
+        },
+        editorContent() {
+            if(!this.isConnector) {
+                this.$emit("dataGet", this.editorContent, this.index)
+            }
+        },
     },
-    editorContent() {
-      this.$emit("dataGet", this.editorContent, this.index)
-    }
-  }
 }
 </script>
 <style scoped>
 .content {
-  width: 100%;
-  height: 100%;
+    width: 100%;
+    height: 100%;
 }
 .connector-wrap /deep/ .demo {
-  justify-content: flex-start !important;
+    justify-content: flex-start !important;
 }
 .textArea {
-  width: 100%;
-  height: 100%;
+    width: 100%;
+    height: 100%;
 }
 .frame {
-  /*height: 100px;*/
-  border: none;
-  position: fixed;
-  height: 0.1px;
-  width: 50%;
-  /*margin-left:10px;*/
-  /*line-height: 50px;*/
+    /*height: 100px;*/
+    border: none;
+    position: fixed;
+    height: 0.1px;
+    width: 50%;
+    /*margin-left:10px;*/
+    /*line-height: 50px;*/
 }
 .canvas-tools {
-  bottom: -50px;
+    bottom: -50px;
 }
 </style>

+ 25 - 3
TEAMModelOS/ClientApp/src/components/student-web/HomeView/ChartHome/ClassPoint.vue

@@ -4,6 +4,10 @@
             {{ $t("studentWeb.home.title.classScore") }}
         </div>
         <div id="classPoint"></div>
+        <div v-show="!nowRadar.length" class="no-data">
+            <img src="../noData.png" alt="">
+            <p>{{ $t("studentWeb.public.noData") }}</p>
+        </div>
         <div class="typeAll">
             <div class="typeDef" @click="changeType(false)">
                 <span :class="{'activeBg': !type}"></span>
@@ -23,10 +27,13 @@ export default {
     data() {
         return {
             type: false, //个人的类型
-            school: ["数学", "语文", "英语", "化学", "生物", "物理", "地理"],
-            private: ["个人", "培训课", "健身课", "鉴赏课", "解剖课", "盆栽课", "人文历史概述"],
+            // school: ["数学", "语文", "英语", "化学", "生物", "物理", "地理"],
+            school: [],
+            // privates: ["个人", "培训课", "健身课", "鉴赏课", "解剖课", "盆栽课", "人文历史概述"],
+            privates: [],
             schoolData: ['87', '75', '100', '12', '46', 97, 57],
             privateData: ['55', '99', '12', '74', '88', 37, 67],
+            nowRadar: [],
         }
     },
     methods: {
@@ -82,7 +89,7 @@ export default {
                     // name:'作业次数',
                     nameLocation: 'end',
                     type: 'category',
-                    data: this.type ? this.private : this.school,
+                    data: this.type ? this.privates : this.school,
                     axisLine: {
                         lineStyle: {
                             color: "#AAA"
@@ -117,10 +124,12 @@ export default {
         },
         changeType(type) {
             this.type = type
+            this.nowRadar = type ? this.privates : this.school
             this.setEcharts()
         },
     },
     mounted () {
+        this.nowRadar = this.school
         this.setEcharts()
     }
 }
@@ -161,5 +170,18 @@ export default {
             // color: white;
         }
     }
+    .no-data {
+        background-color: #fff;
+        // width: 100%;
+        height: 235px;
+        position: absolute;
+        top: 30px;
+        text-align: center;
+        // padding-top: 35px;
+
+        img {
+            width: 50%;
+        }
+    }
 }
 </style>

+ 3 - 3
TEAMModelOS/ClientApp/src/components/student-web/HomeView/ChartHome/ExamPerform.vue

@@ -8,7 +8,7 @@
         </template>
         <div v-show="!nowRadar.length" class="no-data">
             <img src="../noData.png" alt="">
-            <p>暂没有数据</p>
+            <p>{{ $t("studentWeb.public.noData") }}</p>
         </div>
         <div class="typeAll">
             <div class="typeDef" @click="changeType(false)">
@@ -136,7 +136,7 @@ export default {
                             name: item.name
                         })
                         let average = Number((item.total / item.num * 100).toFixed(0))
-                        console.log(item.total, item.num, average);
+                        // console.log(item.total, item.num, average);
                         this.schoolData[0].value.push(average)
                     })
                     examArr.privates.forEach(item => {
@@ -145,7 +145,7 @@ export default {
                             name: item.name
                         })
                         let average = Number((item.total / item.num * 100).toFixed(0))
-                        console.log(item.total, item.num, average);
+                        // console.log(item.total, item.num, average);
                         this.privateData[0].value.push(average)
                     })
                     this.nowRadar = this.school

+ 19 - 0
TEAMModelOS/ClientApp/src/components/student-web/HomeView/ChartHome/HomeworkPoint.vue

@@ -4,6 +4,10 @@
             {{ $t("studentWeb.home.title.homework") }}
         </div>
         <div id="homeworkPoint"></div>
+        <div v-show="!hwAch.length" class="no-data">
+            <img src="../noData.png" alt="">
+            <p>{{ $t("studentWeb.public.noData") }}</p>
+        </div>
     </div>
 </template>
 
@@ -260,4 +264,19 @@ export default {
     width: 100%;
     height: 253px;
 }
+.homework-echarts {
+    .no-data {
+        background-color: #fff;
+        // width: 100%;
+        height: 235px;
+        position: absolute;
+        top: 30px;
+        text-align: center;
+        padding-top: 35px;
+
+        img {
+            width: 50%;
+        }
+    }
+}
 </style>

+ 25 - 7
TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeViewnnnnew.less

@@ -1,6 +1,6 @@
 .home-view {
     padding: 0.5rem 1.7rem;
-    
+
     .home-card {
         margin-top: 15px;
         box-shadow: 0px 2px 13px rgba(0, 0, 0, 0.1);
@@ -24,6 +24,7 @@
             margin-right: 20px;
         }
     }
+
     .home-head {
         margin-top: 15px;
         // display: flex;
@@ -54,7 +55,7 @@
     }
 
     .no-data-notice {
-        
+
         text-align: center;
         min-height: 212px;
         // padding-top: 40px;
@@ -69,18 +70,18 @@
         justify-content: space-between;
         margin-bottom: 20px;
 
-        & > div > p:first-child {
+        &>div>p:first-child {
             margin-bottom: 5px;
         }
 
-        & > div:first-child {
-            & > p:first-child {
+        &>div:first-child {
+            &>p:first-child {
                 font-size: 18px;
                 font-weight: bold;
             }
         }
 
-        & > div:last-child{
+        &>div:last-child {
             text-align: right;
         }
 
@@ -88,10 +89,27 @@
             width: 50%;
         }
     }
+
+    .list-new {
+        .list-new-test {
+            display: flex;
+            justify-content: center;
+            flex-direction: column;
+        }
+
+        .list-new-img {
+            width: 20%;
+            margin-right: 5px;
+
+            &>img {
+                width: 100%;
+            }
+        }
+    }
 }
 
 @media screen and (max-width: 520px) {
     .home-view .home-list-title {
         display: block;
     }
-}
+}

+ 171 - 32
TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeViewnnnnew.vue

@@ -20,9 +20,9 @@
                     <p class="home-title-name">{{ $t("studentWeb.home.title.classRecord") }}</p>
                     <div v-if="classRecord.length" style="height: 455px;">
                         <vuescroll>
-                            <div v-for="(classRecord, cIndex) in classRecord" :key="cIndex" class="list-new">
-                                <div class="list-new-icon">
-                                    <img src="./noData.png" alt="">
+                            <div v-for="(classRecord, cIndex) in classRecord" :key="cIndex" class="list-new" @click="toRecord(classRecord)">
+                                <div class="list-new-img">
+                                    <img :src="classRecord.CoverImage ? classRecord.CoverImage : './noData.png'" alt="">
                                 </div>
                                 <div class="list-new-test">
                                     <p>{{ classRecord.name }}</p>
@@ -213,7 +213,9 @@
 import ExamPerform from './ChartHome/ExamPerform.vue';
 import HomeworkPoint from './ChartHome/HomeworkPoint.vue';
 import ClassPoint from './ChartHome/ClassPoint.vue';
+
 import { mapState } from 'vuex';
+import BlobTool from "@/utils/blobTool.js"
 
 export default {
     name: "HomeViewnnnnew",
@@ -240,6 +242,11 @@ export default {
                 survey: 0,
             },
             examAch: [],
+            groups: {
+                school: [],
+                private: [],
+            },
+            sasInfo: undefined,
         }
     },
     mounted () {
@@ -247,7 +254,7 @@ export default {
         this.$emit("onNavNo", this.MyNo)
         this.$emit("onNavName", this.MyName)
         this.getNotice()
-        this.getClaRecord()
+        this.getGroupList()
         this.getActivity()
     },
     methods: {
@@ -280,34 +287,157 @@ export default {
                 }, */
             ]
         },
-        getClaRecord() {
-            this.classRecord = [
-                /* {
-                    name: "罗老师的课堂记录",
-                    startTime: "2022-04-29",
-                    time: "00:10:58",
-                },
-                {
-                    name: "罗老师的课堂记录",
-                    startTime: "2022-04-29",
-                    time: "00:10:58",
-                },
-                {
-                    name: "罗老师的课堂记录",
-                    startTime: "2022-04-29",
-                    time: "00:10:58",
-                },
-                {
-                    name: "罗老师的课堂记录",
-                    startTime: "2022-04-29",
-                    time: "00:10:58",
-                },
-                {
-                    name: "罗老师的课堂记录",
-                    startTime: "2022-04-29",
-                    time: "00:10:58",
-                }, */
-            ]
+        getGroupList() {
+            // return new Promise(resolve => {
+                this.isLoading = true
+                this.groups = {
+                    school: [],
+                    private: [],
+                }
+                this.classRecord = []
+                // this.getSas(this.userInfo.azp)
+                this.$api.studentWeb.getAllGrouplist({}).then(res => {
+                    if(res.groups.length) {
+                        res.groups.forEach(item => {
+                            if(item.scope === 'school') {
+                                this.groups.school.push(item.id)
+                            } else if(item.scope === 'private') {
+                                this.groups.private.push(item.id)
+                            }
+                        })
+                        this.getSchool("school", this.groups.school)
+                    }
+                }).finally(() => {
+                    // resolve(groups)
+                })
+            // })
+        },
+        getSchool(type, groupIds, end) {
+            if(groupIds.length) {
+                let param = {
+                    scope: type, //school:传school,private:传tmdid
+                    school: type === "school" ? this.userInfo.azp : "",
+                    category: [],
+                    subjectId: [],
+                    grade: [],
+                    doubleGreen: false,
+                    quality: false,
+                    DESC: "startTime",
+                    pageCount: 999, //返回六条数据(分页)
+                    today: false,
+                    continuationToken: null, //返回的有值的话,下次查询就要用这个值
+                    groupIds,
+                }
+                this.$api.studentWeb.getClassRecord(param).then(async res => {
+                    if(res.lessonRecords.length) {
+                        let creatId = []
+                        let sasInfo = undefined
+                        if(type === "school") {
+                            sasInfo = await this.getSas(this.userInfo.azp)
+                        }
+                        res.lessonRecords.forEach(item => {
+                            item.startTime = this.dateFormat(item.startTime)
+                            let sec = item.duration % 60
+                            let min = parseInt(item.duration / 60)
+                            let mins = min >= 60 ? min % 60 : min
+                            let hour = parseInt(min / 60)
+                            item.time = `${hour < 10 ? ('0' + hour) : hour}:${mins < 10 ? ('0' + mins) : mins}:${sec < 10 ? ('0' + sec) : sec}`
+                            if(type === "school") {
+                                item.eNote = `${sasInfo.url}/${sasInfo.name}/records/${item.id}/Note.pdf?${sasInfo.sas}`
+                                item.CoverImage = `${sasInfo.url}/${sasInfo.name}/records/${item.id}/Record/CoverImage.jpg?${sasInfo.sas}`
+                            } else {
+                                if(!creatId.includes(item.tmdid)) {
+                                    creatId.push(item.tmdid)
+                                }
+                                item.eNote = ""
+                                item.CoverImage = ""
+                            }
+                            item.myNote = []
+                            this.classRecord.push(item)
+                        })
+                        if(type === "private") {
+                            creatId.forEach(async item => {
+                                let sasInfoP = await this.getSas(item)
+                                this.classRecord = this.classRecord.map(record => {
+                                    if(record.scope === "private" && record.tmdid === item) {
+                                        record.eNote = `${sasInfoP.url}/${sasInfoP.name}/records/${record.id}/Note.pdf?${sasInfoP.sas}`
+                                        record.CoverImage = `${sasInfoP.url}/${sasInfoP.name}/records/${record.id}/Record/CoverImage.jpg?${sasInfoP.sas}`
+                                    }
+                                    return record
+                                })
+                                await this.getTrainFiles(sasInfoP, "private")
+                            })
+                        } else {
+                            this.getTrainFiles(sasInfo, "school")
+                        }
+                    }
+                    if(!end) {
+                        this.getSchool("private", this.groups.private, true)
+                    }
+                }).finally(() => {
+                    this.isLoading = false
+                })
+            }
+        },
+        // 查找活动的视频和文件
+        getTrainFiles(sasInfo, scope) {
+            return new Promise((r, j) => {
+                let blobTool = new BlobTool(sasInfo.url, sasInfo.name, "?" + sasInfo.sas, scope)
+                let promiseArr = []
+                let recList = [...this.classRecord]
+                if(scope === "school") {
+                    recList.forEach((item, index) => {
+                        promiseArr.push(new Promise((r, j) => {
+                            blobTool.listBlob({
+                                prefix: `records/${item.id}/Clients/${this.userInfo.sub}/Task/NoteSelfNote`
+                            }).then(
+                                res => {
+                                    let imgList = []
+                                    res.blobList.forEach(list => {
+                                        imgList.push(`${list.url}?${sasInfo.sas}`)
+                                    })
+                                    this.classRecord[index].myNote = imgList
+                                    r(res)
+                                },
+                                err => {
+
+                                }
+                            )
+                        }))
+                    })
+                } else {
+                    recList.forEach((item, index) => {
+                        if(item.scope === "private" && item.tmdid === sasInfo.name) {
+                            promiseArr.push(new Promise((r, j) => {
+                                blobTool.listBlob({
+                                    prefix: `records/${item.id}/Clients/${this.userInfo.sub}/Task/NoteSelfNote`
+                                }).then(
+                                    res => {
+                                        let imgList = []
+                                        res.blobList.forEach(list => {
+                                            imgList.push(`${list.url}?${sasInfo.sas}`)
+                                        })
+                                        this.classRecord[index].myNote = imgList
+                                        r(res)
+                                    },
+                                    err => {
+
+                                    }
+                                )
+                            }))
+                        }
+                    })
+                }
+                Promise.all(promiseArr).then(res => {
+                })
+            })
+        },
+        getSas(info) {
+            return new Promise(async (r, j) => {
+                let code = info
+                let sasInfo = await this.$tools.getBlobSas(code)
+                r(sasInfo)
+            })
         },
         getActivity(time) {
             this.isLoading = true
@@ -477,6 +607,15 @@ export default {
                 query: {aId: item.id}
             })
         },
+        toRecord(item) {
+            this.$router.push({
+                name: "stuClassRec",
+                params: {
+                    record: item,
+                    // courseNow: this.courseNow
+                }
+            })
+        },
     },
     computed: {
         ...mapState({

+ 3 - 3
TEAMModelOS/ClientApp/src/components/student-web/HomeView/newHomeView.vue

@@ -3,7 +3,7 @@
         <Loading v-show="isLoading" bgColor="rgba(0, 0, 0, 0.3)"></Loading>
         <div class="home-view">
             <Row :gutter="30">
-                <i-col :xs="24" :sm="24" :md="12" :lg="7">
+                <i-col :xs="24" :sm="24" :md="24" :lg="12" :xl="7">
                     <!-- 加入课程 -->
                     <Card :bordered="true" class="barCard">
                         <p slot="title" style="font-weight: bolder">
@@ -72,7 +72,7 @@
                         </div>
                     </Card>
                 </i-col>
-                <i-col :xs="24" :sm="24" :md="12" :lg="9">
+                <i-col :xs="24" :sm="24" :md="24" :lg="12" :xl="9">
                     <!-- 评测、作业 -->
                     <Card class="barCard" :bordered="true">
                         <div slot="title" style="font-weight: bolder">
@@ -86,7 +86,7 @@
                         <hwMissionListCard :testData="examandHw" :choDate="choDate ? choDate : ''" @choiceDate="choiceDate" />
                     </Card>
                 </i-col>
-                <i-col :xs="24" :sm="24" :md="12" :lg="8">
+                <i-col :xs="24" :sm="24" :md="24" :lg="12" :xl="8">
                     <!-- 活动完成率 -->
                     <Card class="barCard" :bordered="true">
                         <p slot="title" style="font-weight: bolder">

+ 1 - 0
TEAMModelOS/ClientApp/src/components/student-web/achievement/MyAchievement.vue

@@ -664,6 +664,7 @@ export default {
         searchExam() {
             this.continuationTokenExam = null
             this.examRep = []
+            this.isLoading = true
             this.getExamList()
         },
     },

+ 0 - 4
TEAMModelOS/ClientApp/src/view/dashboard/Art.less

@@ -120,10 +120,6 @@
       .aside-width {
         width: 40%;
       }
-      .react-r-s,
-      .react-l-s {
-        // background-color: #0f1325;
-      }
   
       // 平行四边形
       .react-right {

+ 2 - 2
TEAMModelOS/ClientApp/src/view/student-web/App.vue

@@ -75,10 +75,10 @@
                     <Icon custom="iconfont icon-ketanghudonghangwei" size="18" class="tabIcon2" style="font-weight: bold" />
                     <span v-show="MyNo != 4">{{ $t('studentWeb.type.classInteraction') }}</span>
                 </MenuItem>
-                <!-- <MenuItem name="7" to="/studentWeb/achievement" :title="$t('studentWeb.type.achievement')">
+                <MenuItem name="7" to="/studentWeb/achievement" :title="$t('studentWeb.type.achievement')">
                     <Icon custom="iconfont icon-chengjitongji" size="18" class="tabIcon2" style="font-weight: bold" />
                     <span v-show="MyNo != 7">{{ $t('studentWeb.type.achievement') }}</span>
-                </MenuItem> -->
+                </MenuItem>
                 <MenuItem name="3" to="/studentWeb/eventView" :title="$t('studentWeb.type.activity')">
                     <svg-icon icon-class="selflearning" class="tabIcon2" />
                     <span v-show="MyNo != 3">{{ $t('studentWeb.type.activity') }}</span>

+ 1 - 1
TEAMModelOS/ClientApp/src/view/student-web/AppNew.vue

@@ -52,7 +52,7 @@
                 </Menu>
                 <!-- 头像 -->
                 <div class="profile-dropdown">
-                    <div id="stuPhoto" v-if="userInfo.picture">
+                    <div id="stuPhoto">
                         <img :src="userInfo.picture" alt="" width="35" height="35">
                         <span style="margin-left: 5px;">{{ userInfo.name }}</span>
                     </div>

+ 1 - 1
TEAMModelOS/ClientApp/src/view/train/TrainDetail.vue

@@ -102,7 +102,7 @@
                                     <Upload action="" multiple :show-upload-list="false" :before-upload="handleUpload" style="display:inline-block">
                                         <span class="upload-text" @click="setUpload('file')">上传</span>
                                     </Upload>
-                                    <span class="text-info">(资料可上传多份)</span>
+                                    <span class="text-info">(资料可上传多份)</span>
                                 </span>
                             </div>
                         </div>