Bladeren bron

Merge branch 'develop3.0-tmd' of http://106.12.23.251:10080/TEAMMODEL/TEAMModelOS into develop3.0-tmd

zhouj1203@hotmail.com 4 jaren geleden
bovenliggende
commit
4327f7ec7c
24 gewijzigde bestanden met toevoegingen van 453 en 180 verwijderingen
  1. 35 0
      TEAMModelOS.SDK/Models/Cosmos/School/Knowledge.cs
  2. 8 0
      TEAMModelOS/ClientApp/src/api/learnActivity.js
  3. 4 0
      TEAMModelOS/ClientApp/src/api/stuAccount.js
  4. 0 6
      TEAMModelOS/ClientApp/src/components/selflearn/NewChooseContent.vue
  5. 6 2
      TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js
  6. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js
  7. 6 2
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js
  8. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js
  9. 6 2
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js
  10. 5 2
      TEAMModelOS/ClientApp/src/utils/evTools.js
  11. 2 2
      TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue
  12. 2 2
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue
  13. 9 5
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseCreateChild.vue
  14. 9 5
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue
  15. 6 2
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseExerciseList.vue
  16. 10 24
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseImport.vue
  17. 194 57
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseRepair.vue
  18. 8 4
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreateExercises.vue
  19. 5 6
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue
  20. 4 4
      TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue
  21. 6 0
      TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.less
  22. 84 50
      TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.vue
  23. 10 3
      TEAMModelOS/Controllers/Analysis/AnalysisController.cs
  24. 32 2
      TEAMModelOS/Controllers/Core/BlobController.cs

+ 35 - 0
TEAMModelOS.SDK/Models/Cosmos/School/Knowledge.cs

@@ -34,4 +34,39 @@ namespace TEAMModelOS.SDK.Models.Cosmos.School
         public List<CodeValue> blocks { get; set; }
 
     }
+    /*
+    {
+        "id": "123",
+        "code": "Knowledge-hbcn-subjectId",
+        "periodId": "uuid",
+        
+        "points": [
+            "一元一次方程","二元一次方程","一元二次方程","直线方程","三元一次方程","鸡兔同笼问题","微积分方程","函数有界性","函数单调性","函数奇偶性","函数周期性","函数连续性","函数凹凸性",
+            "常函数","一次函数","二次函数","三次函数","四次函数","五次函数","幂函数","指数函数","对数函数","三角函数","反三角函数","常数函数",
+            "正弦函数","余弦函数","正切函数","余切函数","正割函数","余割函数","正矢函数","余矢函数","半正矢函数","半余矢函数","外正割函数","外余割函数"
+        ],
+        "block":[
+            {
+                "code": "方程式" ,
+                "value":["一元一次方程","二元一次方程","一元二次方程","直线方程","三元一次方程","鸡兔同笼问题","微积分方程"]
+            },
+            {
+                "code": "函数的特性" ,
+                "value": ["函数有界性","函数单调性","函数奇偶性","函数周期性","函数连续性","函数凹凸性"]
+            },
+            {
+                "code": "多项式函数" ,
+                "value": ["常函数","一次函数","二次函数","三次函数","四次函数","五次函数"]
+            },
+            {
+                "code":  "基本初等函数" ,
+                "value": ["幂函数","指数函数","对数函数","三角函数","反三角函数","常数函数"]
+            },
+            {
+                "code": "三角函数" ,
+                "value":["正弦函数","余弦函数","正切函数","余切函数","正割函数","余割函数","正矢函数","余矢函数","半正矢函数","半余矢函数","外正割函数","外余割函数"]
+            }
+        ]
+    }
+    */
 }

+ 8 - 0
TEAMModelOS/ClientApp/src/api/learnActivity.js

@@ -283,6 +283,14 @@ export default {
      */
     upsertAnswer: function (data) {
         return post('/teacher/comment/upsert-answer', data)
+    },
+
+    /**
+     * 必须是已结束的评测,进行中的评测可能会报错
+     *获取评测简要数据分析
+     */
+    upsertAnswer: function (data) {
+        return post('/analysis/simple', data)
     }
 
 }

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

@@ -63,5 +63,9 @@ export default {
     return post('/school/init/recall-school-aclasson', {
       school_code: data
     })
+  },
+  //从班级移除学生
+  removeStudent: function(data){
+    return post('/student/removeStudentFromClass', data)
   }
 }

+ 0 - 6
TEAMModelOS/ClientApp/src/components/selflearn/NewChooseContent.vue

@@ -411,21 +411,15 @@ export default {
         },
         //处理文件选中状态
         handleCheckStatus() {
-            let count = 0
             this.$nextTick(() => {
                 let urls = this.selectedFiles.map(item => { return item.url })
                 for (let i in this.$refs.fileTable.$refs.tbody.objData) {
                     if (this.selectedFiles.length) {
                         if (urls.indexOf(this.$refs.fileTable.$refs.tbody.objData[i].url) > -1) {
                             this.$refs.fileTable.$refs.tbody.objData[i]._isChecked = true
-                            count++
                         } else {
                             this.$refs.fileTable.$refs.tbody.objData[i]._isChecked = false
                         }
-                        //如果已经设置完成,提前跳出循环
-                        if (count == this.selectedFiles.length) {
-                            break
-                        }
                     } else {
                         this.$refs.fileTable.$refs.tbody.objData[i]._isChecked = false
                     }

+ 6 - 2
TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js

@@ -88,6 +88,10 @@ export default {
   '3222C6D2': 'HiTeach TBL',
   'J223IZAM': 'HiTeach PRO',
   addStuBtn: '添加學生',
-  delStuBtn: '删除學生',
-  editSeat: '修改座號'
+  delStuBtn: '移除學生',
+  editSeat: '修改座號',
+  removeTile: '移除提醒',
+  removeContent: '是否確認移除',
+  removeOk: '移除成功',
+  removeErr: '移除失敗'
 }

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js

@@ -74,6 +74,7 @@ export default {
 		field:'关联认知层次', 
 		knowledge:'关联知识点',
 		choosePoint:'选择知识点',
+		modify:'修改',
 		type:'选择题型',
 		stem:'题干',
 		option:'选项',

+ 6 - 2
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/schoolBaseInfo.js

@@ -151,6 +151,10 @@ export default {
   delClass:'删除班级',
   saveClassWarning:'当前教室数据尚未保存。如果离开,修改的数据将不会保存!',
   addStuBtn:'添加学生',
-  delStuBtn:'删除学生',
-  editSeat:'修改座号'
+  delStuBtn:'移除学生',
+  editSeat:'修改座号',
+  removeTile:'移除提醒',
+  removeContent:'是否确认移除',
+  removeOk:'移除成功',
+  removeErr:'移除失败'
 }

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js

@@ -74,6 +74,7 @@ export default {
 		field: '關聯認知層次',
 		knowledge: '關聯知識點',
 		choosePoint: '選擇知識點',
+		modify:'修改',
 		type: '選擇題型',
 		stem: '題幹',
 		option: '選項',

+ 6 - 2
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/schoolBaseInfo.js

@@ -153,6 +153,10 @@ export default {
   delClass: '删除班級',
   saveClassWarning: '當前教室數據尚未保存。如果離開,修改的數據將不會保存!',
   addStuBtn: '添加學生',
-  delStuBtn: '删除學生',
-  editSeat: '修改座號'
+  delStuBtn: '移除學生',
+  editSeat: '修改座號',
+  removeTile: '移除提醒',
+  removeContent: '是否確認移除',
+  removeOk: '移除成功',
+  removeErr: '移除失敗'
 }

+ 5 - 2
TEAMModelOS/ClientApp/src/utils/evTools.js

@@ -28,7 +28,7 @@ export default {
 					explain:item.explain,
 					type:item.type,
 					opts:item.option.length,
-					points:item.points,
+					knowledge:item.knowledge,
 					field:item.field,
 					level:item.level,
 					periodId:item.periodId,
@@ -60,7 +60,7 @@ export default {
 				score:0,
 				type:item.type,
 				question:this.getSimpleText(item.question),
-				points:item.points,
+				knowledge:item.knowledge,
 				field:item.field,
 				level:item.level,
 				periodId:item.periodId,
@@ -155,6 +155,9 @@ export default {
 			Promise.all(promiseArr).then(result => {
 				console.log('从Blob获取来的试题',result)
 				resolve(result)
+			}).catch(err => {
+				Message.error('有试题文件读取失败')
+				reject(err)
 			})
 		})
 	},

+ 2 - 2
TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue

@@ -143,9 +143,9 @@
 							<div class="item-explain">
 								<span class="explain-title">【{{$t('evaluation.knowledgePoints')}}】</span>
 								<div class="item-explain-details">
-									<span v-if="!item.points.length">{{$t('evaluation.noPoints')}}</span>
+									<span v-if="!item.knowledge || !item.knowledge.length">{{$t('evaluation.noPoints')}}</span>
 									<div v-else>
-										<span v-for="(point, index) in item.points" class="item-point-tag" :key="index">
+										<span v-for="(point, index) in item.knowledge" class="item-point-tag" :key="index">
 											{{ point }}
 										</span>
 									</div>

+ 2 - 2
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue

@@ -48,9 +48,9 @@
 			<div class="item-explain">
 				<span class="explain-title">【{{$t('evaluation.knowledgePoints')}}】</span>
 				<div class="item-explain-details">
-					<span v-if="!item.points || !item.points.length">{{$t('evaluation.noPoints')}}</span>
+					<span v-if="!item.knowledge || !item.knowledge.length">{{$t('evaluation.noPoints')}}</span>
 					<div v-else>
-						<span v-for="(point,index) in item.points" :key="index" class="item-point-tag">
+						<span v-for="(point,index) in item.knowledge" :key="index" class="item-point-tag">
 							<span>{{ point }}</span>
 						</span>
 					</div>

+ 9 - 5
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseCreateChild.vue

@@ -65,7 +65,7 @@
 		<!-- 补救的富文本部分 -->
 		<div class="exersices-analysis" v-show="exersicesType !== 'compose'">
 			<IconText :text="$t('evaluation.newExercise.repair')" :color="'#2892DD'" :icon="'md-link'" style="margin-bottom: 10px"></IconText>
-			<BaseRepair ref="repairRef" :datas="editInfo.repair"></BaseRepair>
+			<BaseRepair ref="repairRef" :repairs="editInfo.repair"></BaseRepair>
 		</div>
 
 		<div class="save-wrap display-flex">
@@ -279,7 +279,7 @@
 					this.$refs.repairRef.datas
 				);
 				exerciseItem.field = this.exerciseField + 1;
-				exerciseItem.points = this.exercisePoints;
+				exerciseItem.knowledge = this.exercisePoints;
 				exerciseItem.code =
 					this.$parent.$parent.exerciseScope === 0 ?
 					this.$store.state.userInfo.TEAMModelId :
@@ -341,9 +341,13 @@
 				if (list.length) {
 					let arr = [];
 					list.forEach((i, index) => {
-						if (this.$tools.isURL(i.blobUrl)) {
-							arr.push(i);
-						}
+						i.blobUrl.forEach(j => {
+							arr.push({
+								blobUrl:j.url,
+								name:i.name,
+								type:i.type
+							})
+						})
 					});
 					return arr;
 				} else {

+ 9 - 5
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue

@@ -93,7 +93,7 @@
 		<!-- 补救的富文本部分 -->
 		<div class="exersices-analysis" v-show="exersicesType !== 'compose'">
 			<IconText :text="$t('evaluation.newExercise.repair')" :color="'#2892DD'" :icon="'md-link'" style="margin-bottom: 10px"></IconText>
-			<BaseRepair ref="repairRef" :datas="repairResource || []"></BaseRepair>
+			<BaseRepair ref="repairRef" :rapairs="repairResource || []"></BaseRepair>
 		</div>
 
 		<!-- 小题展示区域 -->
@@ -320,7 +320,7 @@
 					this.$refs.repairRef.datas
 				);
 				exerciseItem.field = this.exerciseField + 1;
-				exerciseItem.points = this.exercisePoints;
+				exerciseItem.knowledge = this.exercisePoints;
 				exerciseItem.periodId = this.isSchool ?
 					this.schoolInfo.period[this.exercisePeriod].id :
 					null;
@@ -568,9 +568,13 @@
 				if (list.length) {
 					let arr = [];
 					list.forEach((i, index) => {
-						if (this.$tools.isURL(i.blobUrl)) {
-							arr.push(i);
-						}
+						i.blobUrl.forEach(j => {
+							arr.push({
+								blobUrl:j.url,
+								name:i.name,
+								type:i.type
+							})
+						})
 					});
 					return arr;
 				} else {

+ 6 - 2
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseExerciseList.vue

@@ -111,9 +111,9 @@
 								<div class="item-explain" v-show="isShowAnswer">
 									<span class="explain-title">【{{$t('evaluation.knowledgePoints')}}】</span>
 									<div class="item-explain-details">
-										<span v-if="! (_.compact(item.points).length)">{{$t('evaluation.noPoints')}}</span>
+										<span v-if="!item.knowledge || !(_.compact(item.knowledge).length)">{{$t('evaluation.noPoints')}}</span>
 										<div v-else>
-											<span v-for="(point,index) in item.points" :key="index" class="item-point-tag">
+											<span v-for="(point,index) in item.knowledge" :key="index" class="item-point-tag">
 												{{ point }}
 											</span>
 										</div>
@@ -672,6 +672,10 @@
 						if (newPaper.item.length) {
 							newPaper.item.forEach(i => {
 								if (!i.score) i.score = 0
+								// 如果有综合题 则将小题的分数进行累加作为综合题的分数
+								if(i.type === 'compose' && i.children.length){
+									i.score = i.children.reduce((a,b) => a + b.score , 0)
+								}
 							})
 							this.orderList.push({
 								list: newPaper.item

+ 10 - 24
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseImport.vue

@@ -71,7 +71,7 @@
             }
         },
         created() {
-            this.uploadUrl = window.location.origin  + '/import/upload-word'
+            this.uploadUrl = window.location.origin  + '/import/parse-word '
 			this.curLang = localStorage.getItem('local')
 			this.hostName = this.$store.state.privateSas ? this.$store.state.privateSas.url : 'https://teammodelstorage.blob.core.chinacloudapi.cn'
         },
@@ -163,30 +163,16 @@
              * @param response
              */
             uploadSuccess(response) {
-                if (response.htmlString) {
-                    let requestData = { lang:localStorage.getItem('local'), htmlString: response.htmlString }
-                    this.$api.SaveAnalyzeHtml(requestData).then(res => {
-                        if (!res.error) {
-							if(res.length){
-								this.$Message.success(this.$t('evaluation.importFile.warningTips3'))
-								this.$emit('importFinish',res)
-								this.isImportFinish = false
-								this.isBtnLoading = false
-								this.exerciseList = []
-							}else{
-								this.$Message.error(this.$t('evaluation.importFile.warningTips4'))
-								this.isBtnLoading = false
-							}
-                                
-                        }else{
-							this.$Message.error(this.$t('evaluation.importFile.warningTips5'))
-							this.isBtnLoading = false
-						}
-                    })
-                } else {
-                    this.$Message.error(this.$t('evaluation.importFile.warningTips5'))
+				if(Array.isArray(response) && response.length){
+					this.$Message.success(this.$t('evaluation.importFile.warningTips3'))
+					this.$emit('importFinish',response)
+					this.isImportFinish = false
 					this.isBtnLoading = false
-                }
+					this.exerciseList = []
+				}else{
+					this.$Message.error(this.$t('evaluation.importFile.warningTips4'))
+					this.isBtnLoading = false
+				}
 				this.isSelectFinish = false
             },
         },

+ 194 - 57
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseRepair.vue

@@ -1,39 +1,48 @@
 <template>
 	<div class="repair-wrap">
-		<Tabs :animated="false" name="repairTab">
-			<TabPane :label="$t('evaluation.newExercise.outRepair')" tab="repairTab">
-				<Button type="info" @click="onAddLink('normal')" v-show="datas.filter(i => i.type !== 'file').length === 0">{{$t('evaluation.newExercise.addLink')}}</Button>
+		<Tabs :animated="false" name="repairTab" v-model="curTab">
+			<TabPane :label="$t('evaluation.newExercise.innerRepair')" tab="repairTab" name="site">
+				<Button type="info" @click="onAddLink('site')">{{$t('evaluation.newExercise.chooseContent')}}</Button>
+				<div class="repair-link-wrap-item" v-for="(item,index) in datas.filter(i => i.type === 'file')" :key="index">
+						<div class="repair-link-wrap-item-box">
+							<p>资源描述:{{ item.name }}</p>
+							<div style="display: flex;">
+								<span>资源链接:</span>
+								<div>
+									<p v-for="(url,urlIndex) in item.blobUrl" :key="urlIndex">
+										<span>{{ url.url }}</span>
+									</p>
+								</div>
+							</div>
+							<div class="repair-link-tools">
+								<span @click="onEditRepair(item,index)">编辑</span>
+								<span @click="onDeleteRepair(item)">删除</span>
+							</div>
+						</div>
+				</div>
+			</TabPane>
+			<TabPane :label="$t('evaluation.newExercise.outRepair')" tab="repairTab" name="outer">
+				<Button type="info" @click="onAddLink('normal')">{{$t('evaluation.newExercise.addLink')}}</Button>
 				<div class="repair-link-wrap">
 					<div class="repair-link-wrap-item" v-for="(item,index) in datas.filter(i => i.type !== 'file')" :key="index">
 							<div class="repair-link-wrap-item-box">
-								<Input v-model="item.blobUrl" @on-change="onInputChange">
-								<Select v-model="item.type" slot="prepend" style="width: 120px">
-									<Option value="normal"><Icon type="ios-link" size="18"/>{{$t('evaluation.newExercise.normalResource')}}</Option>
-									<Option value="video"><Icon type="ios-videocam" size="18"/>{{$t('evaluation.newExercise.mediaResource')}}</Option>
-								</Select>
-								</Input>
-								<span class="flex-row-center" style="margin-left: 10px;">
-									<Icon type="md-add" color="#00aa3c" v-if="index === 0" @click="onAddLink('normal')"/>
-									<Icon type="md-close" color="#ff0000" size="24" @click="onDeleteLink(item)"/>
-								</span>
+								<p>资源描述:{{ item.name }}</p>
+								<div style="display: flex;">
+									<span>资源链接:</span>
+									<div>
+										<p v-for="(url,urlIndex) in item.blobUrl" :key="urlIndex">
+											<span>{{ url.url }}</span>
+										</p>
+									</div>
+								</div>
+								<div class="repair-link-tools">
+									<span @click="onEditRepair(item,index)">编辑</span>
+									<span @click="onDeleteRepair(item)">删除</span>
+								</div>
 							</div>
-							<p class="error-tip" v-show="!isURL(item.blobUrl)">{{$t('evaluation.newExercise.linkTip')}}</p>
 					</div>
 				</div>
 			</TabPane>
-			<TabPane :label="$t('evaluation.newExercise.innerRepair')" tab="repairTab">
-				<Button type="info" @click="isRelatedContent = true">{{$t('evaluation.newExercise.chooseContent')}}</Button>
-				<div class="repair-link-wrap-item" v-for="(item,index) in datas.filter(i => i.type === 'file')" :key="index">
-						<div class="repair-link-wrap-item-box">
-							<Input v-model="item.blobUrl" @on-change="onInputChange"/>
-							<span class="flex-row-center" style="margin-left: 10px;">
-								<!-- <Icon type="md-add" color="#00aa3c" v-if="index === 0" @click="onAddLink('normal')"/> -->
-								<Icon type="md-close" color="#ff0000" size="24" @click="onDeleteLink(item)"/>
-							</span>
-						</div>
-						<p class="error-tip" v-show="!isURL(item.blobUrl)">{{$t('evaluation.newExercise.linkTip')}}</p>
-				</div>
-			</TabPane>
 		</Tabs>
 		
 		<!-- 关联内容弹窗 -->
@@ -42,12 +51,40 @@
 		    <NewChooseContent :showSyllabus="isFalse"
 		                   :showOther="isFalse"
 		                   :showQuestion="isFalse"
-						   :defaultFiles="relateFileList"
+						   :defaultFiles="curRepair.blobUrl"
 						   ref="chooseContentRef"
 		                   @on-file-change="onSelectFile"></NewChooseContent>
 		
 		    <Button class="modal-btn" :loading="isLoading" @click="onConfirmRelate">{{$t('evaluation.confirm')}}</Button>
 		</Modal>
+		
+		<!-- 添加补救资源弹窗 -->
+		<Modal v-model="isAddRepair" width="600" footer-hide>
+		    <div class="modal-header" slot="header">添加补救资源</div>
+			<p style="margin: 15px 2px;">资源类型</p>
+			<Select v-model="curRepair.type" :disabled="isSiteLink">
+				<Option value="normal">{{$t('evaluation.newExercise.normalResource')}}</Option>
+				<Option value="file">{{$t('evaluation.newExercise.mediaResource')}}</Option>
+			</Select>
+			<p style="margin: 15px 2px;">资源描述</p>
+		    <Input v-model="curRepair.name" placeholder="请输入资源描述..."/>
+			<p style="margin: 15px 2px;">资源链接地址</p>
+			
+			<!-- 选择内容 -->
+			<Button type="info" @click="isRelatedContent = true" v-if="isSiteLink">{{$t('evaluation.newExercise.chooseContent')}}</Button>
+			<!-- 手动输入 -->
+			<Input v-model="curOutLink" v-if="!isSiteLink" placeholder="请输入资源地址,回车即可添加" @on-enter="onAddOutLink"/>
+			<!-- 链接link列表 -->
+			<div>
+				<p v-for="(item,index) in curRepair.blobUrl" class="repair-link-item">
+					<span>{{ item.url }}</span>
+					<Icon type="md-close" size="18" @click="onDeleteRelateLink(item)"/>
+				</p>
+			</div>
+			<!-- 确认 -->
+			<Button type="success" @click="onAddRepair" style="margin-top: 20px;width: 100%;height: 38px;">确认</Button>
+			
+		</Modal>
 	</div>
 </template>
 <script>
@@ -56,7 +93,7 @@
 		name:'BaseRepair',
 		components: { NewChooseContent },
 		props: {
-			datas: {
+			rapairs: {
 				type: Array,
 				default: function() {
 					return []
@@ -65,54 +102,97 @@
 		},
 		data() {
 			return {
+				datas:[],
+				curTab:'site',
+				curEditIndex:null,
+				curOutLink:'',
+				isAddRepair:false,
 				isLoading:false,
+				isSiteLink:true,
 				isRelatedContent:false,
 				isFalse:false,
-				relateFileList:[]
+				relateFileList:[],
+				defaultFiles:[],
+				curRepair:{
+					type:'file',
+					name:'',
+					blobUrl:[]
+				}
 			}
 		},
 		created() {
 			
 		},
 		methods: {
+			/* 点击添加外部或者内部资源 */
 			onAddLink(type){
-				let addObj = {
-					blobUrl:'',
-					type:type
+				this.isSiteLink = type === 'site'
+				this.curEditIndex = null
+				this.curRepair.name = ''
+				this.curRepair.type = type === 'site' ? 'file' : 'normal'
+				this.curRepair.blobUrl = []
+				this.isAddRepair = true
+				this.defaultFiles = []
+			},
+			
+			/* 回车添加外部资源链接 */
+			onAddOutLink(){
+				if(this.isURL(this.curOutLink)){
+					if(this.curRepair.blobUrl.map(i => i.url).indexOf(this.curOutLink) > -1){
+						this.$Message.warning('已存在相同链接!')
+					}else{
+						this.curRepair.blobUrl.push({
+							url:this.curOutLink
+						})
+						this.curOutLink = ''
+					}
+				}else{
+					this.$Message.warning('请输入正确格式的网址地址!')
 				}
-				this.datas.push(addObj)
+				
 			},
 			
-			onDeleteLink(item){
-				let index = this.datas.indexOf(item)
-				this.datas.splice(index,1)
-				if(item.type === 'file'){
-					let urlArr = this.relateFileList.map(i => i.url)
-					this.relateFileList.splice(urlArr.indexOf(item.blobUrl),1)
+			/* 点击添加资源 */
+			onAddRepair(){
+				if(this.curRepair.name.trim() === '' || this.curRepair.blobUrl.length === 0){
+					this.$Message.warning('请填写完整!')
+				}else{
+					if(this.curEditIndex || this.curEditIndex === 0){
+						this.datas[this.curEditIndex] = JSON.parse(JSON.stringify(this.curRepair))
+					}else{
+						this.datas.push(JSON.parse(JSON.stringify(this.curRepair)))
+					}
+					this.isAddRepair = false
 				}
-				console.log(this.relateFileList.map(i => i.url))
 			},
 			
-			onInputChange(val){
-				// console.log(val)
+			/* 编辑当前补救资源 */
+			onEditRepair(item,index){
+				this.isSiteLink = this.curTab === 'site'
+				this.curRepair = JSON.parse(JSON.stringify(item))
+				this.isAddRepair = true
+				this.curEditIndex = this.datas.indexOf(item)
+				this.defaultFiles = this.curTab === 'site' ? this.curRepair.blobUrl : []
+			},
+			
+			/* 删除当前补救资源 */
+			onDeleteRepair(item){
+				this.datas.splice(this.datas.indexOf(item),1)
 			},
 			
+			/* 删除某个链接地址LINK */
+			onDeleteRelateLink(item){
+				this.curRepair.blobUrl.splice(this.curRepair.blobUrl.indexOf(item),1)
+				this.defaultFiles = this.curRepair.blobUrl
+			},
+			
+			/* 选择内容联动 */
 			onSelectFile(val) {
 			    this.relateFileList = val.files
+				this.curRepair.blobUrl = val.files
 			},
 			
 			onConfirmRelate() {
-				this.relateFileList.forEach(i => {
-					if(this.datas.length && this.datas.map(i => i.blobUrl).includes(i.url)){
-						return
-					}else{
-						this.datas.push({
-							blobUrl:i.url,
-							type:'file'
-						})
-					}
-					
-				})
 			    this.isRelatedContent = false
 			},
 			
@@ -142,7 +222,33 @@
 			if(this.$refs.chooseContentRef){
 				this.$refs.chooseContentRef.clickTab('content')
 			}
+
 		},
+		watch:{
+			rapairs:{
+				handler(val){
+					/* 转换补救资源格式 根据描述 汇总分组 */
+					let namesArr = [...new Set(val.map(i => i.name))]
+					let result = []
+					namesArr.forEach(name => {
+						let urls = []
+						let type = ''
+						val.forEach(i => {
+							if(i.name === name){
+								urls.push({ url:i.blobUrl })
+								type = i.type
+							}
+						})
+						result.push({
+							name:name,
+							blobUrl:urls,
+							type:type
+						})
+					})
+					this.datas = result
+				}
+			}
+		}
 	}
 </script>
 
@@ -159,6 +265,23 @@
 </style>
 
 <style lang="less" scoped>
+	
+	.repair-link-item{
+		margin: 10px 0;
+		padding: 4px 5px;
+		background: #a7a7a7;
+		color: #fff;
+		border-radius: 4px;
+		word-break: break-all;
+		
+		.ivu-icon{
+			margin: 5px 10px;
+			vertical-align: sub;
+			color: red;
+			font-weight: bold;
+		}
+	}
+	
 	.repair-wrap {
 		min-height: 300px;
 		
@@ -168,10 +291,24 @@
 			&-item{
 				margin: 20px 0;
 				
-				
 				&-box{
-					display: flex;
-					align-items: center;
+					position: relative;
+					border: 2px dashed #aaaaaa;
+					background-color: #ebf9ff;
+					border-radius: 5px;
+					padding: 10px;
+					font-size: 16px;
+					
+					.repair-link-tools{
+						position: absolute;
+						right: 20px;
+						top: 40%;
+						
+						span{
+							margin-right: 20px;
+							cursor: pointer;
+						}
+					}
 				}
 				
 				.ivu-icon{

+ 8 - 4
TEAMModelOS/ClientApp/src/view/evaluation/index/CreateExercises.vue

@@ -327,7 +327,7 @@
 				}
 				exerciseItem.repair = this.formatRepairResource(this.$refs.repairRef.datas);
 				exerciseItem.field = this.exerciseField + 1;
-				exerciseItem.points = this.exercisePoints;
+				exerciseItem.knowledge = this.exercisePoints; //新知识点
 				exerciseItem.periodId = this.isSchool ? this.schoolInfo.period[this.exercisePeriod].id : null;
 				exerciseItem.gradeIds = this.isSchool ?
 					this.exerciseGrade.length ?
@@ -506,9 +506,13 @@
 				if (list.length) {
 					let arr = [];
 					list.forEach((i, index) => {
-						if (this.$tools.isURL(i.blobUrl)) {
-							arr.push(i);
-						}
+						i.blobUrl.forEach(j => {
+							arr.push({
+								blobUrl:j.url,
+								name:i.name,
+								type:i.type
+							})
+						})
 					});
 					return arr;
 				} else {

+ 5 - 6
TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue

@@ -478,7 +478,7 @@
 								type: item.type,
 								scoring: {
 									score: item.score,
-									knowledge: item.points || [],
+									knowledge: item.knowledge || [],
 									field: item.field || 1,
 									ans: nullType.includes(item.type) ? [] : item.answer
 								}
@@ -774,11 +774,10 @@
 
 								let item = res.files[i]
 								if (item.scope == 'school') {
-									containerClient.copyFolder('paper/' + paperItem.name + '/', 'item/' + item.id, schoolBlob)
+									containerClient.copyFolder('paper/' + paperItem.name + '/', 'item/' + item.id, schoolBlob).then(res => { r(200) })
 								} else {
-									containerClient.copyFolder('paper/' + paperItem.name + '/', 'item/' + item.id, privateBlob)
+									containerClient.copyFolder('paper/' + paperItem.name + '/', 'item/' + item.id, privateBlob).then(res => { r(200) })
 								}
-								r(200)
 							}))
 
 
@@ -857,8 +856,8 @@
 			getPaperPoints(items) {
 				let arr = []
 				items.forEach((i, index) => {
-					if (i.points) {
-						arr = arr.concat(i.points)
+					if (i.knowledge) {
+						arr = arr.concat(i.knowledge)
 					}
 				})
 				return arr

+ 4 - 4
TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue

@@ -3,10 +3,6 @@
         <vuescroll ref="score-main-warp">
             <SimpleAnalysis :examInfo="examInfo" v-show="!showTest" :overviewInfo="overviewInfo"></SimpleAnalysis>
             <div class="ev-target-box dark-iview-select">
-                <span class="filter-label" v-show="examInfo.scope == 'school'">{{$t('learnActivity.score.subjectLabel')}}</span>
-                <Select filterable v-model="chooseSubject" class="filter-select" size="small" @on-change="getCurPaper" v-show="examInfo.scope == 'school'" transfer>
-                    <Option v-for="(item,index) in examInfo.subjects" :value="item.id" :key="index">{{ item.name }}</Option>
-                </Select>
                 <span class="filter-label" v-show="examInfo.scope == 'school'">{{$t('learnActivity.score.gradeLabel')}}</span>
                 <Select filterable v-model="chooseGrade" class="filter-select" size="small" v-show="examInfo.scope == 'school'" style="margin-right:5px" transfer>
                     <Option v-for="(item,index) in examInfo.grades" :value="item.id" :key="index">{{ item.name }}</Option>
@@ -15,6 +11,10 @@
                 <Select filterable v-model="chooseClass" class="filter-select" style="width:140px;" @on-change="getClassStudent" size="small" transfer>
                     <Option v-for="(item,index) in classList" :value="item.id" :key="index">{{ item.name }}</Option>
                 </Select>
+                <span class="filter-label" v-show="examInfo.scope == 'school'">{{$t('learnActivity.score.subjectLabel')}}</span>
+                <Select filterable v-model="chooseSubject" class="filter-select" size="small" @on-change="getCurPaper" v-show="examInfo.scope == 'school'" transfer>
+                    <Option v-for="(item,index) in examInfo.subjects" :value="item.id" :key="index">{{ item.name }}</Option>
+                </Select>
                 <span style="margin-left:5px" v-show="showTest">{{$t('learnActivity.score.stuLabel')}}</span>
                 <Select filterable v-model="chooseStudent.id" label-in-value class="filter-select" style="width:140px;" size="small" clearable @on-change="setStuInfo" v-show="showTest" transfer>
                     <Option v-for="(item,index) in students" :value="item.id" :key="index">

+ 6 - 0
TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.less

@@ -452,4 +452,10 @@
 }
 .item-tools{
     display:none;
+}
+
+.reset-no-btn{
+    display: inline-block;
+    margin-left: 10px;
+    cursor: pointer;
 }

+ 84 - 50
TEAMModelOS/ClientApp/src/view/schoolmgmt/ClassroomSetting/ClassroomSetting.vue

@@ -75,8 +75,6 @@
                                 <span class="primary-text-color">{{$t('schoolBaseInfo.dClass')}}</span>
                             </p>
                         </div>
-                        <!-- 刪除教室 -->
-                        <!--<Icon class="action-btn-icon" :class="curClassIndex == index ? '' : 'hide-icon'" size="19" type="md-trash"/>-->
                     </div>
                     <EmptyData v-if="classroomListShow.length == 0" style="padding-top:120px;"></EmptyData>
                 </vuescroll>
@@ -101,8 +99,8 @@
                 <Button v-if="$access.can('admin.*|student-upd')" class="save-btn" :loading="isSaveLoading" icon="md-add" @click="addStuStatus = true" v-show="currentTabIndex == 2">
                     {{$t('schoolBaseInfo.addStuBtn')}}
                 </Button>
-                <!-- 除学生 -->
-                <Button v-if="$access.can('admin.*|student-upd')" class="save-btn" style="margin-right:10px;" :loading="isSaveLoading" icon="md-trash" @click="delStudent()" v-show="currentTabIndex == 2">
+                <!-- 除学生 -->
+                <Button v-if="$access.can('admin.*|student-upd')" class="save-btn" style="margin-right:10px;" :loading="isSaveLoading" icon="md-remove-circle" @click="removeStudent(-1)" v-show="currentTabIndex == 2">
                     {{$t('schoolBaseInfo.delStuBtn')}}
                 </Button>
             </div>
@@ -261,16 +259,23 @@
                 </div>
 
                 <!--学生名单-->
-                <div id="sut-list-box" class="dark-iview-table" style="width:100%;height:100%;" v-show="currentTabIndex == 2">
+                <div id="sut-list-box" class="dark-iview-table dark-iview-input" style="width:100%;height:100%;" v-show="currentTabIndex == 2">
                     <vuescroll style="height:100%;" v-if="classroomListShow[curClassIndex] && classroomListShow[curClassIndex].openType == '1'">
-                        <Table :columns="studentColumn" :data="students" @on-selection-change="(selections)=>{delSelection = selections}" :height="tableHeight" class="system-classroom-table" :loading="stuLoading" no-data-text="暂无学生">
+                        <Table :columns="studentColumn" :data="students" @on-selection-change="(selections)=>{delSelections = selections}" :height="tableHeight" class="system-classroom-table" :loading="stuLoading" no-data-text="暂无学生">
                             <Loading slot="loading" bgColor="rgba(103, 103, 103, 0.27)"></Loading>
                             <template slot-scope="{ row }" slot="picture">
                                 <PersonalPhoto :name="row.name" :picture="row.picture" />
                             </template>
+                            <template slot-scope="{ row,index }" slot="no">
+                                <span v-show="editIndex !== index">{{row.no}}</span>
+                                <Input v-model="students[index].no" v-show="editIndex == index" style="width: 60px;" type="number" />
+                                <Icon type="md-checkmark" v-show="editIndex == index" @click="confirmSetNo()" class="reset-no-btn" />
+                                <Icon type="md-close" v-show="editIndex == index" @click="cancelSetNo()" class="reset-no-btn" />
+                            </template>
                             <template slot-scope="{ row ,index}" slot="action">
                                 <div class="item-tools" v-if="$access.can('admin.*|student-upd')">
-                                    <Icon type="md-create" size="18" color="white" @click="editStudent(row)" :title="$t('schoolBaseInfo.editSeat')" />
+                                    <Icon type="md-create" size="18" color="white" @click="resetNo(index)" :title="$t('schoolBaseInfo.editSeat')" />
+                                    <Icon type="md-remove-circle" size="18" color="white" style="margin-left:10px" @click="removeStudent(index)" :title="$t('schoolBaseInfo.delStuBtn')" />
                                 </div>
                             </template>
                             <!-- <template slot-scope="{ row, index }" slot="groupId">
@@ -316,7 +321,7 @@ import PersonalPhoto from "@/components/public/personalPhoto/Index.vue"
 import StudentList from '@/components/coursemgt/StudentList.vue'
 export default {
     components: {
-        PersonalPhoto,StudentList
+        PersonalPhoto, StudentList
     },
     data() {
         // 验证只能是字母和数字
@@ -333,12 +338,12 @@ export default {
         }
         return {
             studentColumn: [
-                // {
-                //     title: ' ',
-                //     type: 'selection',
-                //     width: 60,
-                //     align: 'center'
-                // },
+                {
+                    title: ' ',
+                    type: 'selection',
+                    width: 60,
+                    align: 'center'
+                },
                 {
                     title: ' ',
                     slot: 'picture',
@@ -358,7 +363,7 @@ export default {
                 },
                 {
                     title: this.$t('courseManage.classroom.studentTableC1'),
-                    key: 'no',
+                    slot: 'no',
                     align: 'center',
                     sortable: true
                 },
@@ -381,14 +386,17 @@ export default {
                     width: '150'
                 },
             ],
+            editIndex: -1,
+            resetNoBef: 0,
             updHiteachLink: [],
             orgHiteachData: [],
             hiteachData: [],
             schoolBase: {
                 period: []
             },
-            selections:[],
-            addStuStatus:false,
+            delSelections: [],//需要移除的学生
+            selections: [],//添加的学生
+            addStuStatus: false,
             stuLoading: false,
             orderBy: 'id',
             filterHiteachVer: 'ALL',
@@ -568,10 +576,55 @@ export default {
         }
     },
     methods: {
+        resetNo(index) {
+            this.editIndex = index
+            this.resetNoBef = this.students[index].no
+        },
+        confirmSetNo() {
+            this.$api.stuAccount
+            saveAllStudent
+        },
+        cancelSetNo() {
+            this.students[this.editIndex].no = this.resetNoBef
+            this.editIndex = -1
+        },
+        //移除班级里面的学生
+        removeStudent(index) {
+            let requestParams = {
+                schoolId: this.$store.state.userInfo.schoolCode,
+                students: []
+            }
+            if (index > -1) {
+                requestParams.students.push(this.students[index])
+            } else if (this.delSelections.length > 0) {
+                requestParams.students = this.delSelections
+            }
+            if (requestParams.students.length) {
+                let names = requestParams.students.map(item => {
+                    return item.name
+                })
+                this.$Modal.confirm({
+                    title: this.$t('schoolBaseInfo.removeTile'),
+                    content: `${this.$t('schoolBaseInfo.removeContent')}${names.join(', ')}?`,
+                    onOk: () => {
+                        this.$Message.warning('暂未对接API')
+                        // this.$api.stuAccount.removeStudent(requestParams).then(
+                        //     res => {
+                        //         this.$Message.success(this.$t('schoolBaseInfo.removeOk'))
+                        //     },
+                        //     err => {
+                        //         this.$Message.error(this.$t('schoolBaseInfo.removeErr'))
+                        //     }
+                        // )
+                    }
+                })
+            }
+        },
         //确认添加学生
         confirmAddStu() {
             if (this.selections.length > 0) {
                 console.log(this.selections)
+                this.$Message.warning('暂未对接API')
                 //保存操作
                 // this.listLoading = true
                 // this.courseListP[this.curCusIndex].code = this.$store.state.userInfo.TEAMModelId
@@ -597,6 +650,7 @@ export default {
                 // })
             }
         },
+
         dropdownStates(flag) {
             if (!flag) this.filterByPeriod()
         },
@@ -882,7 +936,6 @@ export default {
                 let image = new Image()
                 image.crossOrigin = 'anonymous'
                 image.src = require('../../../assets/image/school_plan.jpg');
-                //image.src = 'https://teammodelstorage.blob.core.chinacloudapi.cn/teammodelos/test/school_plan.jpg'
                 image.onload = function () {
                     _this.schoolPlan.width = image.width
                     _this.schoolPlan.height = image.height
@@ -1005,14 +1058,11 @@ export default {
                                         }
                                     }, err => {
                                         this.$Message.error(this.$t('schoolBaseInfo.bindingErr'))
-                                    }).finally(
-                                        () => {
-                                            this.isSaveLoading = false
-                                            this.isListLoading = false
-                                        }
-                                    )
+                                    }).finally(() => {
+                                        this.isSaveLoading = false
+                                        this.isListLoading = false
+                                    })
                                 }
-
                             } else {
                                 this.$Message.error('API error!')
                             }
@@ -1020,13 +1070,10 @@ export default {
                         err => {
                             this.$Message.error('API error!')
                         }
-                    )
-                        .finally(
-                            () => {
-                                this.isSaveLoading = false
-                                this.isListLoading = false
-                            }
-                        )
+                    ).finally(() => {
+                        this.isSaveLoading = false
+                        this.isListLoading = false
+                    })
                 }
             })
 
@@ -1042,7 +1089,6 @@ export default {
                             this.updateBefore = JSON.stringify(this.classroomList[0])
                         }
                         this.filterClassname()
-
                         // 預設搜尋給第一個
                         // this.filterPeriod = res.school_base.period[0].id
                         if (this.periods) this.filterPeriod = this.periods[0].id
@@ -1050,7 +1096,6 @@ export default {
                     }
                 },
                 (err) => {
-                    console.log(err)
                     this.$Message.error('API error!')
                 }
             ).finally(() => {
@@ -1094,17 +1139,14 @@ export default {
                                     break
                                 }
                             }
-
                             this.$api.schoolSetting.hiteachUnlinkByClassId({
                                 classId: this.classroomListShow[index].id,
                                 school_code: this.$store.state.userInfo.schoolCode
                             })
                             this.unlinkHiteach(this.classroomListShow[index].id) // 刪掉指定的classId                                
                             this.$store.dispatch('user/delSchoolClasses', this.classroomListShow[index].id);
-
                             this.classroomList.splice(originIndex, 1)
                             this.classroomListShow.splice(index, 1)
-
                             this.$Message.success(this.$t('schoolBaseInfo.csTips7'))
                             this.updated = false
                             this.updHiteachLink = []
@@ -1163,13 +1205,8 @@ export default {
                 }
             }
         },
-        isEmpty(obj) {
-            if (typeof obj === 'undefined' || obj == null || obj == '') {
-                return true
-            } else {
-                return false
-            }
-        },
+
+        // 这段代码应该是原来的hiteach序号相关代码,调整之后没用就可以删掉了, 我看没有调用这个方法了
         chooseHiTeach(index) {
             if (this.editStatus) {
                 this.$Message.warning('当前为不可编辑状态')
@@ -1179,7 +1216,7 @@ export default {
                     if (this.hiTeachs[i].using > 0) {
                         this.$Message.warning(this.$t('schoolBaseInfo.csTips6'))
                     } else {
-                        if (!this.isEmpty(this.classroomListShow[this.curClassIndex].sn)) {
+                        if (this.classroomListShow[this.curClassIndex].sn) {
                             let showIndex = -1
                             let allIndex = -1
                             this.hiTeachsShow.forEach((v, i) => {
@@ -1404,7 +1441,6 @@ export default {
     },
     mounted() {
         this.filterClassname()
-        // this.filterCode()
         this.initData()
         this.initHiteachData()
         this.tableHeight = document.getElementById('class-list').clientHeight + 45
@@ -1427,8 +1463,6 @@ export default {
             next()
         }
     },
-    watch: {
-    },
     created() {
         this.initData()
         if (this.$access.can('admin.*|classroom-upd')) this.editStatus = this.noStatus
@@ -1441,8 +1475,8 @@ export default {
 @import "./ClassroomSetting.less";
 </style>
 <style>
-.class-mgt-container .ivu-table-row-hover .item-tools{
-    display:inline-block ;
+.class-mgt-container .ivu-table-row-hover .item-tools {
+    display: inline-block;
     cursor: pointer;
 }
 .class-info-content

+ 10 - 3
TEAMModelOS/Controllers/Analysis/AnalysisController.cs

@@ -1654,12 +1654,15 @@ namespace TEAMModelOS.Controllers.Analysis
                 }
                 foreach (ExamResult result in examResults) {
                     List<double> ClassAverage = new List<double>();
-                    List<string> ClassName = new List<string>();
+                    List<ClassSimple> ClassName = new List<ClassSimple>();
                     Dictionary<string, object> mapSubject = new Dictionary<string, object>();
                     Dictionary<string, object> mapClass = new Dictionary<string, object>();
                     mapClass.Add("subjectId", result.subjectId);
-                    foreach (ClassRange range in result.classes) {                                             
-                        ClassName.Add(range.name);
+                    foreach (ClassRange range in result.classes) {
+                        ClassSimple classSimple = new ClassSimple();
+                        classSimple.id = range.id;
+                        classSimple.name = range.name;
+                        ClassName.Add(classSimple);
                         double totalClass = 0;
                         for (int i = range.range[0]; i<=range.range[1] ;i++) {
                             totalClass += result.studentScores[i].Sum();
@@ -1686,6 +1689,10 @@ namespace TEAMModelOS.Controllers.Analysis
                 return BadRequest();
             }
         }
+        public class ClassSimple { 
+            public string id { get; set; }
+            public string name { get; set; }
+        }
 
 
         [HttpPost("studentAnalysis")]

+ 32 - 2
TEAMModelOS/Controllers/Core/BlobController.cs

@@ -16,6 +16,7 @@ using TEAMModelOS.SDK.Extension;
 using System.IdentityModel.Tokens.Jwt;
 using Microsoft.AspNetCore.Authorization;
 using TEAMModelOS.Filter;
+using StackExchange.Redis;
 
 namespace TEAMModelOS.Controllers.Core
 {
@@ -26,11 +27,14 @@ namespace TEAMModelOS.Controllers.Core
 
         private readonly AzureStorageFactory _azureStorage;
         private readonly IHttpClientFactory _clientFactory;
-
-        public BlobController(AzureStorageFactory azureStorage, IHttpClientFactory clientFactory)
+        private readonly AzureRedisFactory _azureRedis;
+        private readonly AzureServiceBusFactory _serviceBus;
+        public BlobController(AzureStorageFactory azureStorage, AzureServiceBusFactory serviceBus, IHttpClientFactory clientFactory, AzureRedisFactory azureRedis)
         {
             _azureStorage = azureStorage;
             _clientFactory = clientFactory;
+            _serviceBus = serviceBus;
+            _azureRedis = azureRedis;
         }
 
         /// <summary>
@@ -230,8 +234,34 @@ namespace TEAMModelOS.Controllers.Core
         [HttpPost("get-blobsize")]
         public async Task<ActionResult> GetBlobsSize(JsonElement request)
         {
+            
             request.TryGetProperty("containerName", out JsonElement containerName);
             var name =containerName.GetString();
+            RedisValue value = default;
+            value = _azureRedis.GetRedisClient(8).HashGet($"Blob:Record", name);
+            if (value != default && !value.IsNullOrEmpty)
+            {
+                JsonElement record = value.ToString().ToObject<JsonElement>();
+                if (record.TryGetInt64(out long blobsize))
+                {
+                    return Ok(new { size= blobsize });
+                }
+            }
+            var client = _azureStorage.GetBlobContainerClient(name);
+            var size = await client.GetBlobsSize();
+            await _azureRedis.GetRedisClient(8).HashSetAsync($"Blob:Record", name, size);
+            return Ok(new { size });
+        }
+        /// <summary>
+        /// 测试单个文本内容的上传
+        /// </summary>
+        /// <param name="azureBlobSASDto"></param>
+        /// <returns></returns>
+        [HttpPost("update-blobsize")]
+        public async Task<ActionResult> updateBlobsSize(JsonElement request)
+        {
+            request.TryGetProperty("containerName", out JsonElement containerName);
+            var name = containerName.GetString();
             var client = _azureStorage.GetBlobContainerClient(name);
             var size = await client.GetBlobsSize();
             return Ok(new { size });