Ver Fonte

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

zhouj1203@hotmail.com há 4 anos atrás
pai
commit
5a1b543f37
33 ficheiros alterados com 480 adições e 469 exclusões
  1. 4 0
      TEAMModelOS/ClientApp/src/api/schoolSetting.js
  2. 1 1
      TEAMModelOS/ClientApp/src/assets/student-web/component_styles/app-nav.css
  3. 10 9
      TEAMModelOS/ClientApp/src/assets/student-web/component_styles/paper-test.css
  4. 4 3
      TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue
  5. 11 7
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperTest.vue
  6. 6 3
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue
  7. 8 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue
  8. 7 67
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue
  9. 6 2
      TEAMModelOS/ClientApp/src/utils/editorTools.js
  10. 3 2
      TEAMModelOS/ClientApp/src/utils/evTools.js
  11. 4 4
      TEAMModelOS/ClientApp/src/view/evaluation/bank/TestPaperList.vue
  12. 1 0
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseCreateChild.vue
  13. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseDiffPie.vue
  14. 1 0
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue
  15. 3 10
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseObjectivePie.vue
  16. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BasePointPie.vue
  17. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseTypePie.vue
  18. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreateExercises.less
  19. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/index/TestPaper.vue
  20. 2 0
      TEAMModelOS/ClientApp/src/view/evaluation/types/BaseMultiple.vue
  21. 10 13
      TEAMModelOS/ClientApp/src/view/learnactivity/AutoCreateNew.vue
  22. 2 2
      TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue
  23. 8 0
      TEAMModelOS/ClientApp/src/view/learnactivity/ExamPaperAnalysis.less
  24. 16 82
      TEAMModelOS/ClientApp/src/view/learnactivity/ExamPaperAnalysis.vue
  25. 2 0
      TEAMModelOS/ClientApp/src/view/learnactivity/ManualCreate.vue
  26. 194 146
      TEAMModelOS/ClientApp/src/view/learnactivity/ManualPaper.vue
  27. 5 3
      TEAMModelOS/ClientApp/src/view/learnactivity/MgtPrivEva.vue
  28. 2 47
      TEAMModelOS/ClientApp/src/view/learnactivity/MgtSchoolEva.vue
  29. 67 19
      TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.vue
  30. 70 27
      TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue
  31. 21 13
      TEAMModelOS/ClientApp/src/view/student-web/App.vue
  32. 2 2
      TEAMModelOS/Controllers/Common/ExamController.cs
  33. 5 1
      TEAMModelOS/Controllers/Item/ItemController.cs

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

@@ -59,4 +59,8 @@ export default {
     upsertGroup: function (data) {
         return post('/school/classroom/upsert-group', data)
     },
+    //根据私有班级id集合查询班级详细信息
+    getClassByIds: function (data) {
+        return post('/school/classroom/name', data)
+    },
 }

+ 1 - 1
TEAMModelOS/ClientApp/src/assets/student-web/component_styles/app-nav.css

@@ -213,7 +213,7 @@
   margin: 0px 20px;
   margin-right: 48px;
   cursor: pointer;
-  background-color:#00AD6C;
+  /*background-color:#00AD6C;*/
 }
 .myNav .ivu-avatar.ivu-avatar-circle.ivu-avatar-image.ivu-avatar-default {
   height: 24px !important;

+ 10 - 9
TEAMModelOS/ClientApp/src/assets/student-web/component_styles/paper-test.css

@@ -78,31 +78,31 @@
     margin-top:50px;
 }
 .compose-box {
-    background-color: #24b880;
-    color: white;
-    width: 85%;
+/*    background-color: #24b880;
+    color: white;*/
+    width: 100%;
     border-radius: 6px;
 }
 .compose-item {
     display: flex;
     margin-left: 10px;
-    max-height: 350px;
+    max-height: 300px;
     overflow-y: scroll;
 }
 .compose-content {
     margin-top:30px;
-    width: 85%;
+    width: 100%;
     height: 200px;
     z-index: 0;
 }
 .que-content {
     display:flex;
     margin-top:20px;
-    width:85%;
+    width:100%;
 }
 .que-item{
     width:100%;
-    max-height:400px;
+    max-height:200px;
     overflow-y:scroll;
 }
 .lesson-test-pop .warmMessage {
@@ -244,7 +244,7 @@
 }
 
 .lesson-test-pop .questionContent {
-  padding: 40px 50px;
+  padding: 10px 50px;
 }
 .lesson-test-pop .questionType {
   border: 2px solid #979797;
@@ -253,6 +253,7 @@
   text-align: center;
   max-width: 100px;
   margin-bottom: 12px;
+  margin-top:25px;
 }
 .lesson-test-pop .questioDes {
     font-weight: 900;
@@ -357,7 +358,7 @@
 .lesson-test-pop .checkAnswers {
     margin-top: 30px;
     max-height: 400px;
-    width: 85%;
+    width: 100%;
     overflow-y: scroll;
 }
 .checkAnswers .select-box {

+ 4 - 3
TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue

@@ -9,9 +9,10 @@
 						{{ getRoleName(curRole) }}
 						<Icon type="ios-arrow-down"></Icon>
 					</a>
-					<DropdownMenu slot="list" v-if="user.roles.length > 1">
-						<DropdownItem v-if="curRole != 'teacher' && curRole != 'admin'" :name="'teacher'">教师</DropdownItem>
-						<DropdownItem v-if="curRole != 'student'" :name="'student'">學生</DropdownItem>
+					<DropdownMenu slot="list">
+						<DropdownItem v-if="curRole != 'teacher' && curRole != 'admin'" name="teacher">教师</DropdownItem>
+						<DropdownItem v-if="curRole != 'student'" name="student">學生</DropdownItem>
+						<!-- <DropdownItem  name="student">學生</DropdownItem> -->
 					</DropdownMenu>
 				</Dropdown>
 			</div>

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

@@ -74,7 +74,7 @@
                         <span>{{getTestType(getQue(queNo).type)}}</span>
                     </div>
                     <div class="questioDes">
-                        <div v-if="getQue(queNo).type != 'compose' && getQue(queNo).parent == undefined" style="display:flex;width:85%">
+                        <div v-if="getQue(queNo).type != 'compose' && getQue(queNo).parent == undefined" style="display:flex;width:100%">
                             <span>{{ queNo +1 }}.</span>
                             <!--题目渲染-->
                             <div class="que-item" v-html="getQue(queNo).question"></div>
@@ -103,7 +103,7 @@
                         </div>
                         <!--问答题-->
                         <div class="compose-content" v-if="getQue(queNo).type == 'subjective' || getQue(queNo).type == 'complete'">
-                            <Compose ref="compose" :itemInfo="getQue(queNo)" :textData="checkers[queNo]" :index="queNo" @dataGet="getComposeAns"></Compose>
+                            <Compose ref="compose" :itemInfo="getQue(queNo)" :close="!closeTest" :textData="checkers[queNo]" :index="queNo" @dataGet="getComposeAns"></Compose>
                         </div>
                         <!--填空题-->
                         <!--<div v-if="getQue(queNo).type == 'complete'">
@@ -117,13 +117,13 @@
                         <!--判断题选项-->
                         <div v-if="getQue(queNo).type == 'judge'" align="center">
                             <label class="testBtn yesNoBtn">
-                                <input type="radio" value="A" v-model="checkers[queNo][0]" />
+                                <input type="radio" value="A" v-model="checkers[queNo][0]"  :disabled="!closeTest" />
                                 <div class="testbg">
                                     <Icon type="ios-radio-button-off" />
                                 </div>
                             </label>
                             <label class="testBtn yesNoBtn">
-                                <input type="radio" value="B" v-model="checkers[queNo][0]" />
+                                <input type="radio" value="B" v-model="checkers[queNo][0]"  :disabled="!closeTest" />
                                 <div class="testbg">
                                     <Icon type="md-close" />
                                 </div>
@@ -137,7 +137,9 @@
                                 <input type="checkbox"
                                        :value="getQue(queNo).option[index].code"
                                        v-model="checkers[queNo]"
-                                       @click="getAns(queNo,index)" />
+                                       @click="getAns(queNo,index)"
+                                        :disabled="!closeTest"
+                                       />    
                                 <div class="testbg">
                                     <Row :gutter="10">
                                         <i-col :xs="16" :sm="16" :md="16" :lg="16">
@@ -391,17 +393,19 @@
             },
             closetest: function () {
                 this.WarmMessageisOpen = false
+                console.log('保存信息')
                 if (this.checkers.length) {
                     this.isLoading = true;
+                    let codes = this.$store.getters.getItemTitle.code.split('-')
                     let req = {
                         id: this.$store.getters.getItemTitle.id,
                         answer: this.checkers,
                         studentId: this.$store.state.userInfo.sub,
                         classId: this.$store.state.user.studentProfile.classinfo.id,
-                        subjectId: this.$store.getters.getPaperInfo.subjectId,
+                        subjectId: this.$store.getters.getExamInfo.subject.id,
                         multipleRule: this.$store.getters.getExamInfo.multipleRule,
                         paperId: this.$store.getters.getPaperInfo.id,
-                        school: this.$store.getters.getItemTitle.school
+                        code: codes[1]
                     }
                     this.$api.studentWeb.SaveStuExamPaper(req).then(res => {
                         if (res) {

+ 6 - 3
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue

@@ -97,11 +97,12 @@
                 this.chooseData = {}
                 if (this.$store.getters.getItemTitle.name !== undefined) {
                     let paper = this.$store.getters.getItemTitle
+                    let codes = this.$store.getters.getItemTitle.code.split('-')
                     let req = {
                         id: paper.id,
-                        code: paper.code,
+                        //code: paper.code,
                         studentId: this.$store.state.userInfo.sub,
-                        school: paper.school
+                        code: codes[1]
                     }
                     this.$api.studentWeb.FindStudentPaper(req).then(res => {
                         let resData = res
@@ -133,7 +134,8 @@
                 this.$store.commit("ToggleLessonTestPop");
             },
             opentestWithSubject(item) {
-                if (item.code !== '') {
+                console.log(item)
+                if (item !== undefined) {
                     this.getPaper(item)
                 }
             },
@@ -143,6 +145,7 @@
                 this.selectData = {}
                 this.chooseData = {}
                 if (data.blob !== undefined && data.blob !== "") {
+                    console.log('试卷数据',data)
                     let key = data.code.split('-')
                     let code = {
                         scope: data.scope,

+ 8 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue

@@ -25,6 +25,10 @@
                 default: () => {
                     return {}
                 }
+            },     
+            close: {
+                type: Boolean,
+                default: false
             }
         },
         data() {
@@ -66,12 +70,15 @@
                 //    return true; // 返回 true 表示校验成功
                 //};
                 this.editor.config.placeholder = '请输入作答结果'
-                this.editor.config.height = 200
+                this.editor.config.height = 300
                 this.editor.config.showLinkImg = false;
                 this.editor.config.uploadImgShowBase64 = true; // 使用 base64 保存图片不建议使用这种,我只是图个方便
                 // editor.customConfig.uploadImgServer = '/upload'  // 上传图片到服务器
                 this.$editorTools.addCanvas(this, this.editor)
                 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])

+ 7 - 67
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue

@@ -19,12 +19,11 @@
                 <div>
                     <Dropdown>
                         <a href="javascript:void(0)" class="list-title">
-                            <span v-if="getCurrentLang() == 'tw'">{{ selectedEventStatusNow }}</span>
-                            <span v-if="getCurrentLang() == 'en'">{{ transStatustoEn(selectedEventStatusNow) }}</span>
+                            <span >{{ selectedEventStatusNow }}</span>
                             <Icon type="ios-arrow-down"></Icon>
                         </a>
                         <DropdownMenu slot="list">
-                            <div @click="sentEventStatus('所有活動狀態')">
+                            <div @click="sentEventStatus('所有活动状态')">
                                 <DropdownItem>{{ $t("studentWeb.allStatus") }}</DropdownItem>
                             </div>
                             <div @click="sentEventStatus('未完成')">
@@ -33,13 +32,13 @@
                             <div @click="sentEventStatus('已完成')">
                                 <DropdownItem>{{ $t("studentWeb.Fineshed") }}</DropdownItem>
                             </div>
-                            <div @click="sentEventStatus('已逾')">
+                            <div @click="sentEventStatus('已逾')">
                                 <DropdownItem>{{ $t("studentWeb.Timeout") }}</DropdownItem>
                             </div>
-                            <div @click="sentEventStatus('評量補考')">
+                            <div @click="sentEventStatus('评测补考')">
                                 <DropdownItem divided>{{ $t("studentWeb.makeupExam") }}</DropdownItem>
                             </div>
-                            <div @click="sentEventStatus('作業補交')">
+                            <div @click="sentEventStatus('作业补交')">
                                 <DropdownItem>{{ $t("studentWeb.makeupHW") }}</DropdownItem>
                             </div>
                         </DropdownMenu>
@@ -77,65 +76,6 @@
                     <br />
                     {{ $t("studentWeb.empty") }}
                 </div>
-                <!---剛剛完成的-->
-                <!--v-show="
-                dropDownShowCondition(selectedEventStatusNow, item) &&
-                finishedcondition(item) &&
-                item.isDone == false &&
-                eventPageType.includes(item.eventType) == true &&
-                showSelected(item)
-                "-->
-                <!--<li class="list-item"
-                    :class="{ 'list-item-selected': selectedCondition(item) }"
-                    v-for="(item, index) in eventList"
-                    :key="'a' + index"
-                    @click="sentSelectedEventTitle(item)">
-                    <ul>
-                        <li class="list-item-icon">
-                            <svg-icon v-if="item.eventType == '作業'" icon-class="doc" />
-                            <svg-icon v-if="item.eventType == '課前預習'"
-                                      icon-class="selflearninginTime" />-->
-                <!--<svg-icon v-if="item.eventType == 'exam'"
-                          icon-class="test"
-                          class="reset-testIcon" />-->
-                <!--<svg-icon v-if=" item.eventType == 'exam'"
-                                  icon-class="multiTest"
-                                  class="reset-testIcon" />
-                        <svg-icon v-if="item.eventType == '投票'" icon-class="vote" />
-                        <svg-icon v-if="item.eventType == '問卷'"
-                                  icon-class="quesnaire" />
-                    </li>
-                    <li class="list-item-info"
-                        :class="{
-                  'list-item-infonofeedback':
-                    isNoFeedback(item) && finishedcondition(item) == false,
-                }">
-                        <p class="list-item-title"
-                           :class="{ 'list-item-titleEn': getCurrentLang() == 'en' }">-->
-                <!--<span
-                  class="list-item-typeMark"
-                  v-if="getCurrentLang() == 'tw'"
-                  >{{ item.eventType }}</span
-                >-->
-                <!--<span class="list-item-typeMark">评量</span>
-                    <span class="list-item-typeMark"
-                          v-if="getCurrentLang() == 'en'">{{ transTypetoEn(item.eventType) }}</span>
-
-                    <span>{{ item.name }}</span>
-                </p>-->
-                <!--<p class="list-item-time">{{ finishedItemtime(item) }} 完成</p>-->
-                <!--</li>-->
-                <!--<li class="list-item-isDone">
-                    <svg-icon icon-class="isDone" class="isDone-Icon" />
-                </li>-->
-                <!--</ul>
-                </li>-->
-                <!--剛剛完成的-->
-                <!--v-show="
-                dropDownShowCondition(selectedEventStatusNow, item) &&
-                showSelected(item) &&
-                eventPageType.includes(item.eventType) == true &&
-                !finishedcondition(item) "-->
                 <li :id="`event${item.eventID}`"
                     class="list-item"
                     @click="sentSelectedEventTitle(item)"
@@ -159,7 +99,7 @@
                             :class="{'list-item-infonofeedback': isNoFeedback(item) && finishedcondition(item) == false}"
                             v-if="item.eventType == 'exam'">
                             <p class="list-item-title">
-                                <span class="list-item-typeMark">评量</span>
+                                <span class="list-item-typeMark">{{item.scope == 'school' ? '校级评测' : '评测'}}</span>
                                 <span class="list-item-typeMark"
                                       v-if="getCurrentLang() == 'en'">{{ transTypetoEn(item.eventType) }}</span>
                                 <span>{{ item.name }}</span>
@@ -242,7 +182,7 @@
                 search: "",
                 alreadyScrolltimes: 0,
                 defaultFirstItem: "",
-                selectedEventStatusNow: "所有活動狀態",
+                selectedEventStatusNow: "所有活动状态",
                 hideIconbtn: false,
                 isListNoItem: false, //清單為空
                 eventList: []

+ 6 - 2
TEAMModelOS/ClientApp/src/utils/editorTools.js

@@ -361,6 +361,7 @@ export default {
 	},
 
 	
+	/* 移除上传的音视频富文本src中的HOST */
 	doRemoveMideaHost(exerciseItem) {
 		console.log(exerciseItem)
 		let isSubjective = exerciseItem.type === 'complete' || exerciseItem.type === 'subjective' || exerciseItem.type === 'compose'
@@ -399,7 +400,7 @@ export default {
 		})
 	},
 
-
+	/* 转换富文本内容中的base64数据 进行压缩处理 */
 	transBase64Src(exerciseItem) {
 		var srcReg = /<img [^>]*src=['"]([^'"]+)[^>]*>/g;
 		var heightReg = /<img [^>]*height=['"]([^'"]+)[^>]*>/g;
@@ -483,6 +484,9 @@ export default {
 						if(!item){
 							r('')
 							return
+						}else if(Array.isArray(item) && !item.length){
+							r('')
+							return
 						}
 						item.replace(srcReg, async (match, capture) => {
 							imgList.push(match);
@@ -539,7 +543,7 @@ export default {
 
 	/**
 	 * 压缩图片
-	 *@param img 被压缩的img对象
+	 * @param img 被压缩的img对象
 	 * @param type 压缩后转换的文件类型
 	 * @param mx 触发压缩的图片最大宽度限制
 	 * @param mh 触发压缩的图片最大高度限制

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

@@ -292,9 +292,9 @@ export default {
 								itemJson.exercise.option = itemJson.item[0].option
 								itemJson.exercise.id = itemJson.id 
 								itemJson.exercise.pid = itemJson.pid 
-								itemJson.exercise.blob = path + '/' + item.url
+								itemJson.exercise.blob = path + '/' + item.url // 添加blob是方便在保存试卷是 refresh 与导入的试题区分开
 								itemJson.exercise.score = item.scoring ? item.scoring.score : 0,
-								itemJson.exercise = await this.doAddHost(itemJson.exercise,paper.name)
+								itemJson.exercise = await this.doAddHost(itemJson.exercise,paper.name) // 检测试题中的富文本 为有src为相对路径的音视频文件添加blob的HOST地址
 								resolve(itemJson.exercise)
 							}catch(e){
 								reject(e)
@@ -377,6 +377,7 @@ export default {
 		return new Promise(async (r, j) => {
 			// 根据试卷的Blob地址 去读取JSON文件
 			let sasString = paper.scope === 'school' ? await $tools.getSchoolSas(paper.code) : await $tools.getPrivateSas(paper.code)
+			console.log(sasString)
 			try {
 				console.log(paper.blob + sasString.sas)
 				let jsonInfo = await $tools.getFile(paper.blob + sasString.sas)

+ 4 - 4
TEAMModelOS/ClientApp/src/view/evaluation/bank/TestPaperList.vue

@@ -13,7 +13,7 @@
 		<div class="pl-content-wrap" v-else>
 			<Loading :top="100" v-show="dataLoading" type="1" hideMask></Loading>
 			<div style="width: 100%;" v-if="!isPreview">
-				<div class="paper-item" v-for="(paper,index) in paperList" :key="index">
+				<div class="paper-item" v-for="(paper,index) in paperList" :key="index"  @click="onPreviewPaper(paper)">
 					<div class="paper-item-name">
 						<span class="paper-item-tag" v-if="isSchool">{{ getSubjectName(paper.subjectId) }}</span>
 						<span style="margin-left: 8px;">{{ paper.name }}</span>
@@ -26,11 +26,11 @@
 						<!-- <span class="info-item">难度系数:<span class="info-bold">{{ paper.item ? handleDiffCalc(paper.item) : 0 }}</span></span> -->
 					</div>
 					<div class="paper-item-tools">
-						<span class="paper-item-tools-edit" @click="onPreviewPaper(paper)">
+						<!-- <span class="paper-item-tools-edit">
 							<Icon type="md-eye" />
 							<span>预览</span>
-						</span>
-						<span class="paper-item-tools-edit" @click="goToPaper(paper)" v-if="($access.can('admin.*||exercise-upd') || !isSchool)">
+						</span> -->
+						<span class="paper-item-tools-edit" @click.stop="goToPaper(paper)" v-if="($access.can('admin.*||exercise-upd') || !isSchool)">
 							<Icon type="ios-create" />
 							<span>编辑</span>
 						</span>

+ 1 - 0
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseCreateChild.vue

@@ -493,6 +493,7 @@
 			},
 			this.$editorTools.addVideoUpload(this, analysisEditor)
 			this.$editorTools.addAudio(this, analysisEditor)
+			this.$editorTools.addCanvas(this, analysisEditor)
 			this.$editorTools.initMyEditor(analysisEditor)
 			analysisEditor.create();
 			this.analysisEditor = analysisEditor;

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseDiffPie.vue

@@ -92,7 +92,7 @@
 
     #myDiffPie {
         width: 100%;
-        height: 300px;
+        height: 320px;
         margin: 20px auto;
         display: block;
     }

+ 1 - 0
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue

@@ -729,6 +729,7 @@
 			},
 			this.$editorTools.addVideoUpload(this, analysisEditor)
 			this.$editorTools.addAudio(this, analysisEditor)
+			this.$editorTools.addCanvas(this, analysisEditor)
 			this.$editorTools.initMyEditor(analysisEditor)
 			
 			analysisEditor.create();

+ 3 - 10
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseObjectivePie.vue

@@ -38,15 +38,8 @@
                     },
 					legend: {
 						left: 'center',
-						bottom: 24,
-						itemWidth: 15,
-						itemHeight: 11,
-						itemGap: 20,
-						borderRadius: 4,
-						textStyle: {
-							color: '#262C41',
-							fontSize: 14
-						},
+						bottom: 0,
+						type: 'scroll',
 						formatter: function (name,val) {
 						    return name + ' (' + data.filter(i => i.name === name)[0].value + '道)';
 						}
@@ -116,7 +109,7 @@
 
     #myObjectivePie {
         width: 100%;
-        height: 300px;
+        height: 320px;
         margin: 20px auto;
         display: block;
     }

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BasePointPie.vue

@@ -105,7 +105,7 @@
 <style scoped>
 	#myPointPie {
 		width: 100%;
-		height: 300px;
+		height: 320px;
 		margin: 20px auto;
 		display: block;
 	}

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseTypePie.vue

@@ -101,7 +101,7 @@
 
     #myTypePie {
         width: 100%;
-        min-height: 320px;
+        height: 320px;
         margin: 20px auto;
         display: block;
     }

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/index/CreateExercises.less

@@ -138,7 +138,7 @@ exersices-attr-diff {
 
 .ev-container .w-e-toolbar{
     font-size:14px;
-    z-index:1000 !important;
+    z-index:auto !important;
 	background-color: #f1f1f1;
 }
 .ev-container .w-e-toolbar .w-e-menu {

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/index/TestPaper.vue

@@ -42,7 +42,7 @@
 						<p class="paper-title">{{paperInfo.name}}</p>
 					</div>
 
-					<ExamPaperAnalysis :testPaper="paperInfo" v-show="isShowAnalysis"></ExamPaperAnalysis>
+					<ExamPaperAnalysis :testPaper="paperInfo" v-if="isShowAnalysis"></ExamPaperAnalysis>
 
 					<!-- 题目类型及列表 -->
 					<BaseExerciseList :paper="paperInfo" @dataUpdate="onListUpdate" v-show="!isShowAnalysis" ref="exList" :isShowTools="!isPreview" :isExamPaper="isExamPaper"

+ 2 - 0
TEAMModelOS/ClientApp/src/view/evaluation/types/BaseMultiple.vue

@@ -69,6 +69,7 @@
 						
 						editor.config.uploadImgShowBase64 = true;
 						this.$editorTools.addAudio(this, editor)
+						this.$editorTools.addCanvas(this, editor)
 						this.$editorTools.initMyEditor(editor)
 
 							// 选项编辑器内容发生变化时
@@ -111,6 +112,7 @@
 					this.$nextTick(() => {
 						let editor = new E(that.$refs['singleOption' + newIndex][0])
 						this.$editorTools.addAudio(this, editor)
+						this.$editorTools.addCanvas(this, editor)
 						this.$editorTools.initMyEditor(editor)
 						editor.config.onchange = (html) => {
 							let key = String.fromCharCode(64 + parseInt(newIndex + 1))

+ 10 - 13
TEAMModelOS/ClientApp/src/view/learnactivity/AutoCreateNew.vue

@@ -156,19 +156,6 @@
 				]
 			}
 		},
-		created() {
-			this.getSchoolBaseInfo().then(res => {
-				if (!res) return
-				if (res.period.length) {
-					this.periodList = res.period
-					this.periodCode = res.period[0].id
-					this.subjectList = res.period[0].subjects
-					this.subjectCode = this.subjectList.length ? this.subjectList[0].id : ''
-				}
-				
-				
-			})
-		},
 		methods: {
 
 			/** 获取当前学校基础数据 */
@@ -263,6 +250,16 @@
 				this.filterOrigin = ['school']
 				this.schoolRate = 100
 			}
+			
+			this.getSchoolBaseInfo().then(res => {
+				if (!res) return
+				if (res.period.length) {
+					this.periodList = res.period
+					this.periodCode = this.period || res.period[0].id
+					this.subjectList = res.period.filter(i => i.id === this.periodCode)[0].subjects
+					this.subjectCode = this.subject ? this.subject : (this.subjectList.length ? this.subjectList[0].id : '')
+				}
+			})
 		},
 		computed: {
 			includeSchool() {

+ 2 - 2
TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue

@@ -482,10 +482,10 @@ export default {
                         requestData.papers.forEach(async item => {
                             if (item.scope == 'school') {
                                 if (!schoolBlob) schoolBlob = new BlobTool(schoolSas.url, schoolSas.name, schoolSas.sas, 'school')
-                                privateBlob.copyFolder(targetFolder + item.id + '/', item.blob.substring(1))
+                                privateBlob.copyFolder(targetFolder + item.id + '/', item.blob.substring(1), schoolBlob)
                             } else if (item.scope == 'private') {
                                 if (!privateBlob) privateBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, 'private')
-                                privateBlob.copyFolder(targetFolder + item.id + '/', item.blob.substring(1), privateBlob)
+                                privateBlob.copyFolder(targetFolder + item.id + '/', item.blob.substring(1))
                             }
                         })
                         setTimeout(() => {

+ 8 - 0
TEAMModelOS/ClientApp/src/view/learnactivity/ExamPaperAnalysis.less

@@ -7,6 +7,14 @@
 
 .exam-analysis-wrap{
     background:#FFFFFF;
+	display: flex;
+	flex-wrap: wrap;
+	justify-content: space-between;
+	
+	.exam-analysis-echarts-item{
+		width: 30%;
+		margin-top: 40px;
+	}
 }
 .exam-analysis-title-wrap {
     width: 100%;

+ 16 - 82
TEAMModelOS/ClientApp/src/view/learnactivity/ExamPaperAnalysis.vue

@@ -1,83 +1,17 @@
 <template>
     <div class="exam-analysis-wrap">
-        <div class="exam-analysis-title-wrap">
-            <span class="exam-analysis-title">试卷整体分析</span>
-        </div>
-        <div class="whole-analysis-table">
-            <p class="whole-exam-score">总分:{{examAnalysisData.whole.score}}</p>
-            <div class="whole-table-body">
-                <div class="whole-table-col">
-                    <p class="whole-table-col-header">分值分布</p>
-                    <p class="whole-table-col-header">题量分布</p>
-                </div>
-                <div class="whole-table-col">
-                    <p class="while-table-question-type">客观题(占比)</p>
-                    <p class="while-table-question-type">主观题(占比)</p>
-                    <p class="while-table-question-type">客观题(占比)</p>
-                    <p class="while-table-question-type">主观题(占比)</p>
-                </div>
-                <div class="whole-table-col">
-                    <p class="while-table-question-type">{{examAnalysisData.whole.objectiveScore}}({{examAnalysisData.whole.objectiveScoreP}}%)</p>
-                    <p class="while-table-question-type">{{examAnalysisData.whole.subjectiveScore}}({{examAnalysisData.whole.subjectiveScoreP}}%)</p>
-					<p class="while-table-question-type">{{examAnalysisData.whole.objectiveNum}}({{examAnalysisData.whole.objectiveNumP}}%)</p>
-                    <p class="while-table-question-type">{{examAnalysisData.whole.subjectiveNum}}({{examAnalysisData.whole.subjectiveNumP}}%)</p>
-                </div>
-            </div>
-        </div>
-        <div class="quesiotn-distribution">
-            <div class="question-type-distribution">
-                <div class="exam-analysis-title-wrap">
-                    <span class="exam-analysis-title">试卷题量分布</span>
-                </div>
-                <div class="question-type-table-row" style="margin-top:15px;font-weight:800;">
-                    <div class="question-type-table-td">
-                        题型
-                    </div>
-                    <div class="question-type-table-td">
-                        题目量(占比)
-                    </div>
-                    <div class="question-type-table-td">
-                        分值(占比)
-                    </div>
-                </div>
-                <div class="question-type-table-row" v-for="(item, index) in examAnalysisData.question" :key="index">
-                    <div class="question-type-table-td">
-                        {{getQuestionLabel(index)}}
-                    </div>
-                    <div class="question-type-table-td">
-                        {{item.count}}({{item.countPercent}}%)
-                    </div>
-                    <div class="question-type-table-td">
-                        {{item.score}}({{item.scorePercent}}%)
-                    </div>
-                </div>
-
-            </div>
-            <div class="question-diff-distribution">
-                <div class="exam-analysis-title-wrap">
-                    <span class="exam-analysis-title">试卷难度结构</span>
-                    <!--<RadioGroup v-model="button4" type="button" size="small" style="float:right;">
-                      <Radio label="北京">分数</Radio>
-                      <Radio label="上海">题量</Radio>
-                    </RadioGroup>-->
-                </div>
-                <div class="exam-diff-chart" id="exam-diff-chart"></div>
-            </div>
-        </div>
-        <div class="exam-analysis-title-wrap" style="margin-top:25px;">
-            <span class="exam-analysis-title">试卷知识点分析</span>
-        </div>
-        <Table :columns="columns1" :data="examAnalysisData.point" border style="margin-top:15px;color:white;">
-            <template slot="index" slot-scope="{ row, index }">
-                <span>{{index + 1}}</span>
-            </template>
-            <template slot="score" slot-scope="{ row, index }">
-                <span>{{row.score}}({{getScorePercent(row.score)}}%)</span>
-            </template>
-            <template slot="questionIndex" slot-scope="{ row, index }">
-                <span>{{row.questionIndex.join(',')}}</span>
-            </template>
-        </Table>
+		<div class="exam-analysis-echarts-item">
+			<BaseTypePie :echartsData="testPaper"></BaseTypePie>
+		</div>
+		<div class="exam-analysis-echarts-item">
+			<BaseObjectivePie :echartsData="testPaper"></BaseObjectivePie>
+		</div>
+		<div class="exam-analysis-echarts-item">
+			<BaseDiffPie :echartsData="testPaper"></BaseDiffPie>
+		</div>
+		<div class="exam-analysis-echarts-item">
+			<BasePointPie :echartsData="testPaper"></BasePointPie>
+		</div>
     </div>
 </template>
 <script>
@@ -359,14 +293,14 @@
             }
         },
         mounted() {
-            this.myPie = this.$echarts.init(document.getElementById('exam-diff-chart'))
-            this.groupQuestionByType()
+            // this.myPie = this.$echarts.init(document.getElementById('exam-diff-chart'))
+            // this.groupQuestionByType()
         },
         watch: {
             testPaper: {
                 handler(n, o) {
-                    this.groupQuestionByType()
-                    this.drawDiffChart()
+                    // this.groupQuestionByType()
+                    // this.drawDiffChart()
                 },
                 deep: true
             }

+ 2 - 0
TEAMModelOS/ClientApp/src/view/learnactivity/ManualCreate.vue

@@ -79,6 +79,8 @@
                             <Checkbox label="judge">判断</Checkbox>
                             <Checkbox label="complete">填空</Checkbox>
                             <Checkbox label="subjective">问答</Checkbox>
+                            <Checkbox label="connector">连线</Checkbox>
+                            <Checkbox label="correct">改错</Checkbox>
                             <Checkbox label="compose">综合</Checkbox>
                         </CheckboxGroup>
                     </div>

+ 194 - 146
TEAMModelOS/ClientApp/src/view/learnactivity/ManualPaper.vue

@@ -3,12 +3,36 @@
         <vuescroll>
             <div class="manual-filter-wrap">
                 <Row style="width:100%;">
-                    <Col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                    <Col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
                     <div class="manual-filter-item">
                         <span class="manual-filter-label">来源:</span>
                         <RadioGroup v-model="scope" style="display:inline-block;" @on-change="checkFirst">
-                            <Radio  :label="$store.state.userInfo.TEAMModelId">个人试卷库</Radio>
-                            <Radio  :label="$store.state.userInfo.schoolCode">校本试卷库</Radio>
+                            <Radio :label="$store.state.userInfo.TEAMModelId">个人试卷库</Radio>
+                            <Radio :label="$store.state.userInfo.schoolCode">校本试卷库</Radio>
+                        </RadioGroup>
+                    </div>
+                    </Col>
+                    <Col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="routeScope == 'private'" v-show="scope == $store.state.userInfo.schoolCode">
+                    <div class="manual-filter-item">
+                        <span class="manual-filter-label">学段:</span>
+                        <RadioGroup v-model="periodId" style="display:inline-block;" @on-change="checkFirst">
+                            <Radio :label="item.id" v-for="(item,index) in schoolBase.period" :key="index">{{item.name}}</Radio>
+                        </RadioGroup>
+                    </div>
+                    </Col>
+                    <Col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="routeScope == 'private'"  v-show="scope == $store.state.userInfo.schoolCode">
+                    <div class="manual-filter-item">
+                        <span class="manual-filter-label">学科:</span>
+                        <RadioGroup v-model="subjectId" style="display:inline-block;" @on-change="checkFirst">
+                            <Radio :label="item.id" v-for="(item,index) in subjectList" :key="index">{{item.name}}</Radio>
+                        </RadioGroup>
+                    </div>
+                    </Col>
+                    <Col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" v-if="routeScope == 'private'"  v-show="scope == $store.state.userInfo.schoolCode">
+                    <div class="manual-filter-item">
+                        <span class="manual-filter-label">年级:</span>
+                        <RadioGroup v-model="gradesObj" style="display:inline-block;" @on-change="checkFirst">
+                            <Radio :label="item.id" v-for="(item,index) in gradeList" :key="index">{{item.name}}</Radio>
                         </RadioGroup>
                     </div>
                     </Col>
@@ -28,7 +52,7 @@
                     </div>
 
                     <span v-if="item.id == selectedId" style="margin-left:20px;display:block;" class="paper-item-tools">
-                        <Icon custom="iconfont icon-choose" style="margin-right:5px;" title="已选试卷"/>
+                        <Icon custom="iconfont icon-choose" style="margin-right:5px;" title="已选试卷" />
                     </span>
                     <div v-else class="paper-item-tools">
                         <span @click.stop="choosePaper(index)">
@@ -48,174 +72,198 @@
                 <Page :current.sync="currentPage" :total="paperList.length" show-total :page-size="pageSize" size="small" show-sizer @on-change="getCurrentPageData" />
             </div>
         </vuescroll>
-        <Modal v-model="previewStatus"
-               title="试卷预览"
-               width="1100">
+        <Modal v-model="previewStatus" title="试卷预览" width="1100">
             <Loading v-if="paperLoading" :top="350"></Loading>
             <TestPaper :paper="previewPaper" isExamPaper></TestPaper>
         </Modal>
     </div>
 </template>
 <script>
-    import TestPaper from '@/view/evaluation/index/TestPaper.vue'
-    export default {
-        components: {
-            TestPaper
+import TestPaper from '@/view/evaluation/index/TestPaper.vue'
+export default {
+    components: {
+        TestPaper
+    },
+    props: {
+        selectedId: {
+            type: String,
+            default: ''
+        },
+        periodId: {
+            type: String,
+            default: ''
         },
-        props: {
-            selectedId: {
-                type: String,
-                default: ''
+        subjectId: {
+            type: String,
+            defualt: ''
+        },
+        gradesObj: {
+            type: Array,
+            defualt: []
+        }
+    },
+    data() {
+        return {
+            schoolBase: {
+                period: []
             },
-            periodId: {
-                type: String,
-                default: ''
+            paperLoading: false,
+            previewStatus: false,
+            previewPaper: {
+                name: '暂无试卷',
+                score: 0,
+                item: []
             },
-            subjectId: {
-                type: String,
-                defualt: ''
+            isLoading: false,
+            pageSize: 10,
+            currentPage: 1,
+            dataLoading: false,
+            paperList: [],
+            scope: '',
+            allPaper: {
+                private: undefined,
+                school: undefined
             },
-            gradesObj: {
-                type: Array,
-                defualt: []
-            }
+            routeScope: ''
+        }
+    },
+    methods: {
+        /**挑选试卷 */
+        choosePaper(index) {
+            let simplePaper = this.paperList[index]
+            //确认导入后再获取完整试卷信息
+            //let fullPaper = await this.$evTools.getFullPaper(this.paperList[index])
+            //this.$emit('selectPaper', simplePaper, fullPaper)
+            this.$emit('selectPaper', simplePaper)
         },
-        data() {
-            return {
-                schoolBase: {
-                    period:[]
-                },
-                paperLoading: false,
-                previewStatus: false,
-                previewPaper: {
-                    name: '暂无试卷',
-                    score: 0,
-                    item:[]
-                },
-                isLoading: false,
-                pageSize: 10,
-                currentPage: 1,
-                dataLoading: false,
-                paperList: [],
-                scope: '',
-                allPaper: {
-                    private: undefined,
-                    school: undefined
-                }
+        /**
+         * 预览试卷
+         * @param index
+         */
+        async previewTestPaper(index) {
+            this.previewPaper = {}
+            this.paperLoading = true
+            this.previewStatus = true
+            try {
+                this.previewPaper = await this.$evTools.getFullPaper(this.paperList[index])
+                setTimeout(() => {
+                    this.paperLoading = false
+                }, 400)
+            } catch (e) {
+                setTimeout(() => {
+                    this.paperLoading = false
+                }, 400)
             }
         },
-        methods: {
-            /**挑选试卷 */
-            choosePaper(index) {
-                let simplePaper = this.paperList[index]
-                //确认导入后再获取完整试卷信息
-                //let fullPaper = await this.$evTools.getFullPaper(this.paperList[index])
-                //this.$emit('selectPaper', simplePaper, fullPaper)
-                this.$emit('selectPaper', simplePaper)
-            },
-            /**
-             * 预览试卷
-             * @param index
-             */
-            async previewTestPaper(index) {
-                this.previewPaper = {}
-                this.paperLoading = true
-                this.previewStatus = true
-                try {
-                    this.previewPaper = await this.$evTools.getFullPaper(this.paperList[index])
-                    setTimeout(() => {
-                        this.paperLoading = false
-                    },400)
-                } catch (e) {
-                    setTimeout(() => {
-                        this.paperLoading = false
-                    }, 400)
-                }
-            },
-            getCurrentPageData() {
-                this.getPaperList()
-            },
-            checkFirst() {
-                let scope = this.scope == this.$store.state.userInfo.TEAMModelId ? 'private' : 'school'
-                if (!this.allPaper[scope]) {
-                    this.getPaperList()
-                } else {
-                    if (scope == 'school') {
-                        this.paperList = this.allPaper[scope].filter(item => {
-                            return item.subjectId == this.subjectId
-                        })
-                    } else {
-                        this.paperList = this.allPaper[scope]
-                    }
-                }
-                
-            },
-            /** 获取试卷列表 */
-            getPaperList() {
-                this.isLoading = true
-                let scope = this.scope == this.$store.state.userInfo.TEAMModelId ? 'private' : 'school'
-                let params = {
-                    '@DESC': 'createTime',
-                    'code': this.scope,
-                    "scope": scope,
-                    //'gradeIds[*]': scope == 'school' ? this.gradeIds : [],
-                    'gradeIds[*]': [],
-                    'periodId': scope == 'school' ? this.periodId : [],
-                    'subjectId': [],
-                }
-                this.$api.learnActivity.FindExamPaper(params).then(res => {
-                    this.allPaper[scope] = res.papers
-                    if (this.subjectId && scope == 'school') {
-                        this.paperList = this.allPaper[scope].filter(item => {
-                            return item.subjectId == this.subjectId
-                        })
-                    } else {
-                        this.paperList = res.papers
-                    }
-                }).finally(() => {
-                    setTimeout(() => {
-                        this.isLoading = false
-                    }, 500)
-                })
-            },
+        getCurrentPageData() {
+            this.getPaperList()
         },
-        created() {
-            this.scope = this.$store.state.userInfo.TEAMModelId
-            this.$store.dispatch('user/getSchoolProfile').then(
-                res => {
-                    this.schoolBase = res.school_base
-                }
-            )
+        checkFirst() {
+            let scope = this.scope == this.$store.state.userInfo.TEAMModelId ? 'private' : 'school'
             this.getPaperList()
+            // if (!this.allPaper[scope]) {
+            //     this.getPaperList()
+            // } else {
+            //     if (scope == 'school') {
+            //         this.paperList = this.allPaper[scope].filter(item => {
+            //             return item.subjectId == this.subjectId
+            //         })
+            //     } else {
+            //         this.paperList = this.allPaper[scope]
+            //     }
+            // }
+
         },
-        computed: {
-            gradeIds() {
-                if (this.gradesObj) {
-                    return this.gradesObj.map(item => {
-                        return item.id
+        /** 获取试卷列表 */
+        getPaperList() {
+            this.isLoading = true
+            let scope = this.scope == this.$store.state.userInfo.TEAMModelId ? 'private' : 'school'
+            let params = {
+                '@DESC': 'createTime',
+                'code': this.scope,
+                "scope": scope,
+                //'gradeIds[*]': scope == 'school' ? this.gradeIds : [],
+                'gradeIds[*]': [],
+                'periodId': scope == 'school' ? this.periodId : [],
+                'subjectId': [],
+            }
+            this.$api.learnActivity.FindExamPaper(params).then(res => {
+                this.allPaper[scope] = res.papers
+                if (this.subjectId && scope == 'school') {
+                    this.paperList = this.allPaper[scope].filter(item => {
+                        return item.subjectId == this.subjectId
                     })
                 } else {
-                    return []
+                    this.paperList = res.papers
                 }
-            }
+            }).finally(() => {
+                setTimeout(() => {
+                    this.isLoading = false
+                }, 500)
+            })
         },
-        watch: {
-            periodId: {
-                handler() {
-                    this.getPaperList()
-                }
-            },
-            subjectId: {
-                handler() {
-                    this.checkFirst()
+    },
+    created() {
+        this.routeScope = this.$route.name == 'createPrivEva' ? 'private' : 'school'
+        this.scope = this.$store.state.userInfo.TEAMModelId
+        this.$store.dispatch('user/getSchoolProfile').then(
+            res => {
+                this.schoolBase = res.school_base
+                if (this.routeScope == 'private' && this.schoolBase.period.length) {
+                    this.periodId = this.schoolBase.period[0].id
                 }
             }
-
+        )
+        this.getPaperList()
+    },
+    computed: {
+        gradeIds() {
+            if (this.gradesObj) {
+                return this.gradesObj.map(item => {
+                    return item.id
+                })
+            } else {
+                return []
+            }
+        },
+        subjectList(){
+            let res = this.schoolBase.period.find((item)=>{
+                return item.id == this.periodId
+            })
+            if(res){
+                return res.subjects
+            }else{
+                return []
+            }
+        },
+        gradeList(){
+            let res = this.schoolBase.period.find((item)=>{
+                return item.id == this.periodId
+            })
+            if(res){
+                return res.grades
+            }else{
+                return []
+            }
         }
+    },
+    watch: {
+        periodId: {
+            handler() {
+                this.getPaperList()
+            }
+        },
+        subjectId: {
+            handler() {
+                this.checkFirst()
+            }
+        }
+
     }
+}
 </script>
 <style scoped lang="less">
-    @import "./ManualPaper.less";
+@import "./ManualPaper.less";
 </style>
 <style>
 </style>

+ 5 - 3
TEAMModelOS/ClientApp/src/view/learnactivity/MgtPrivEva.vue

@@ -1,5 +1,6 @@
 <template>
     <div class="manage-evaluation-container dark-iview-split">
+        <Loading :top="200" type="1" style="text-align:center" v-show="isLoading"></Loading>
         <Split v-model="split1">
             <!--评测列表-->
             <div class="evaluation-list-wrap" slot="left">
@@ -60,7 +61,7 @@
                 <div :class="curBarIndex == 0 ? 'animated fadeIn evaluation-base-info':'evaluation-base-info animated fadeOutRight'" v-show="curBarIndex == 0">
                     <Scoring :examInfo="examDetaiInfo" ref="score-box"></Scoring>
                 </div>
-                <Loading :top="200" type="1" style="text-align:center" v-show="isLoading"></Loading>
+                
             </div>
         </Split>
         <Modal v-model="editEvaluationStatus" title="编辑评测" @on-ok="confirmEdit">
@@ -174,7 +175,8 @@ export default {
                 onOk: () => {
                     let params = {
                         id: this.evaListShow[this.curEvaIndex].id,
-                        code: this.evaListShow[this.curEvaIndex].code.replace('Exam-', '')
+                        code: this.evaListShow[this.curEvaIndex].code.replace('Exam-', ''),
+                        scope: this.evaListShow[this.curEvaIndex].scope
                     }
                     this.isLoading = true
                     this.$api.learnActivity.DeleteExamInfo(params).then(
@@ -254,7 +256,7 @@ export default {
                         })
                         this.evaluationList = res.examInfo
                         this.evaListShow = res.examInfo
-                        if(res.examInfo.length) this.selectEvaluation(0)
+                        if (res.examInfo.length) this.selectEvaluation(0)
 
                     } else {
                         this$Message.error('API ERROR!')

+ 2 - 47
TEAMModelOS/ClientApp/src/view/learnactivity/MgtSchoolEva.vue

@@ -1,5 +1,6 @@
 <template>
     <div class="manage-evaluation-container dark-iview-split">
+        <Loading :top="200" type="1" style="text-align:center" v-show="isLoading"></Loading>
         <Split v-model="split1">
             <!--评测列表-->
             <div class="evaluation-list-wrap" slot="left">
@@ -74,55 +75,9 @@
                 </div>
                 <!-- 试卷评测打分 -->
                 <div :class="curBarIndex == 0 ? 'animated fadeIn evaluation-base-info':'evaluation-base-info animated fadeOutRight'" v-show="curBarIndex == 0">
-                    <div class="overview-box" style="display:none;">
-                        <div class="count-box">
-                            <span class="count-subject-num">1</span>
-                            <span class="count-subject-text">
-                                <Icon custom="iconfont icon-kecheng" class="count-icon" size="14" style="vertical-align: text-top;" />
-                                学科
-                            </span>
-                        </div>
-                        <div class="count-box">
-                            <span class="count-subject-num">2</span>
-                            <span class="count-subject-text">
-                                <Icon custom="iconfont icon-schedule" class="count-icon" size="14" style="vertical-align: text-top;" />
-                                年级
-                            </span>
-
-                        </div>
-                        <div class="count-box">
-                            <span class="count-subject-num">5</span>
-                            <span class="count-subject-text">
-                                <Icon custom="iconfont icon-class-self" class="count-icon" />
-                                班级
-                            </span>
-
-                        </div>
-                        <div class="count-box">
-                            <span class="count-subject-num">752</span>
-                            <span class="count-subject-text">
-                                <Icon type="ios-people" class="count-icon" />
-                                人数
-                            </span>
-                        </div>
-                        <div class="count-box">
-                            <span class="count-subject-num">602</span>
-                            <span class="count-subject-text">
-                                <Icon type="ios-paper" class="count-icon" />
-                                已作答
-                            </span>
-                        </div>
-                        <div class="count-box">
-                            <span class="count-subject-num">600</span>
-                            <span class="count-subject-text">
-                                <Icon type="md-star" class="count-icon" />
-                                已评分
-                            </span>
-                        </div>
-                    </div>
                     <Scoring :examInfo="examDetaiInfo" ref="score-box"></Scoring>
                 </div>
-                <Loading :top="200" type="1" style="text-align:center" v-show="isLoading"></Loading>
+                
             </div>
         </Split>
         <Modal v-model="editEvaluationStatus" title="编辑评测" @on-ok="confirmEdit">

+ 67 - 19
TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.vue

@@ -59,25 +59,33 @@
                         <div v-if="item.type != 'compose'" style="display:flex;width:100%;" class="not-compose-box" :id="'qustion'+ getScoreIndex(typeIndex,index)">
                             <div class="scoring-input-box" @click.stop v-if="studentAnswer.scores && studentAnswer.scores.length">
                                 <InputNumber v-model="studentAnswer.scores[getScoreIndex(typeIndex,index)]" size="small" :formatter="value => value < 0 ? '' : `${value}分`" :parser="value => value.replace('分', '')" :min="0" :max="item.score" placeholder="0分" class="score-input" />
+                                <!-- 快速打分 满分 零分 -->
                                 <div style="display:flex;justify-content: space-evenly;margin-top:5px;">
                                     <span class="fast-score-tag" title="满分" @click="fastSetScore((typeIndex + index),item.score)">
                                         <!-- 题目分数 -->{{item.score}}
                                     </span>
-                                    <span class="fast-score-tag" title="零分" @click="fastSetScore((typeIndex + index),0)">
+                                    <span class="fast-score-tag" title="零分" @click="fastSetScore((typeIndex + index),0)" style="background:#ed4014">
                                         0
                                     </span>
                                 </div>
-                                <div style="display:flex;justify-content: space-evenly;margin-top:5px;" v-show="showQu">
+                                <!-- 加分 减分 -->
+                                <div style="display:flex;justify-content: space-evenly;margin-top:5px;">
+                                    <span class="fast-score-tag" @click="scoreUp((typeIndex + index),item.score)">
+                                        <Icon type="md-add" />
+                                    </span>
+                                    <span class="fast-score-tag" @click="scoreDown(typeIndex + index)" style="background:#ed4014">
+                                        <Icon type="md-remove" />
+                                    </span>
+                                </div>
+                                <!-- 滚动上下题目去掉 -->
+                                <!-- <div style="display:flex;justify-content: space-evenly;margin-top:5px;display:none;" v-show="showQu">
                                     <span class="fast-score-tag" title="上一题" :style="{'background':'#aeaeae','cursor':(typeIndex + index) == 0 ? 'not-allowed':''}" @click="goToQuestion(getQuIndex(typeIndex,index) - 1)">
-                                        <!-- 上一题-->
                                         <Icon type="md-arrow-round-back" />
                                     </span>
                                     <span class="fast-score-tag" title="下一题" :style="{'background':'#aeaeae','cursor':(typeIndex + index + 1) == studentAnswer.scores.legnth ? 'not-allowed':''}" @click="goToQuestion(getQuIndex(typeIndex,index) + 1)">
-                                        <!-- 下一题 -->
                                         <Icon type="md-arrow-round-forward" />
                                     </span>
-                                </div>
-                                <!-- <p>{{getScoreIndex(typeIndex,index)}}</p> -->
+                                </div> -->
                             </div>
                             <div class="qu-info-box">
                                 <!-- 题干部分 -->
@@ -184,6 +192,7 @@
                             <div class="child-item" v-for="(childItem,childIndex) in item.children" :key="childIndex" :id="'qustion'+getScoreIndex(typeIndex,index,childIndex)">
                                 <div class="scoring-input-box" @click.stop v-if="item.type == 'compose' && studentAnswer.scores && studentAnswer.scores.length">
                                     <InputNumber v-model="studentAnswer.scores[getScoreIndex(typeIndex,index,childIndex)]" size="small" :formatter="value => value < 0 ? '' : `${value}分`" :parser="value => value.replace('分', '')" :min="0" :max="childItem.score" placeholder="0分" class="score-input" />
+                                    <!-- 快速打分 满分 零分 -->
                                     <div style="display:flex;justify-content: space-evenly;margin-top:5px;">
                                         <span class="fast-score-tag" title="满分" @click="fastSetScore((typeIndex + index + childIndex),childItem.score)">
                                             <!-- 题目分数 -->{{childItem.score}}
@@ -192,17 +201,24 @@
                                             0
                                         </span>
                                     </div>
-                                    <div style="display:flex;justify-content: space-evenly;margin-top:5px;" v-show="showQu">
+                                    <!-- 加分 减分 -->
+                                    <div style="display:flex;justify-content: space-evenly;margin-top:5px;">
+                                        <span class="fast-score-tag" @click="scoreUp((typeIndex + index + childIndex),item.score)">
+                                            <Icon type="md-add" />
+                                        </span>
+                                        <span class="fast-score-tag" @click="scoreDown(typeIndex + index + childIndex)" style="background:#ed4014">
+                                            <Icon type="md-remove" />
+                                        </span>
+                                    </div>
+                                    <!-- 滚动上下题目去掉 -->
+                                    <!-- <div style="display:flex;justify-content: space-evenly;margin-top:5px;display:none;" v-show="showQu">
                                         <span class="fast-score-tag" title="上一题" :style="{'background':'#aeaeae','cursor':(typeIndex + index + childIndex) == 0 ? 'not-allowed':''}" @click="goToQuestion((getQuIndex(typeIndex,index) + childIndex) - 1)">
-                                            <!-- 上一题-->
                                             <Icon type="md-arrow-round-back" />
                                         </span>
                                         <span class="fast-score-tag" title="下一题" :style="{'background':'#aeaeae','cursor':(typeIndex + index + childIndex + 1) == studentAnswer.scores.length ? 'not-allowed':''}" @click="goToQuestion((getQuIndex(typeIndex,index) + childIndex) + 1)">
-                                            <!-- 下一题 -->
                                             <Icon type="md-arrow-round-forward" />
                                         </span>
-                                    </div>
-                                    <!-- <p>{{getScoreIndex(typeIndex,index,childIndex)}}</p> -->
+                                    </div> -->
                                 </div>
                                 <div class="qu-info-box">
                                     <div class="child-item-question" v-show="showQu">
@@ -316,6 +332,11 @@ export default {
             default: '',
             required: true
         },
+        subjectId: {
+            type: String,
+            default: '',
+            required: true
+        },
         paper: {
             type: Object,
             default: () => { }
@@ -343,16 +364,16 @@ export default {
                 complete: '填空题',
                 subjective: '问答题',
                 compose: '综合题',
-                correct:'改错题',
-                connector:'连线题'
+                correct: '改错题',
+                connector: '连线题'
             },
             collapseList: [],
             groupList: [],
-            typeList: ['single', 'multiple', 'judge', 'complete', 'subjective', 'connector', 'correct','compose'],
+            typeList: ['single', 'multiple', 'judge', 'complete', 'subjective', 'connector', 'correct', 'compose'],
             showAnswer: false,
             showQu: false,
-            showOption: false
-
+            showOption: false,
+            scope: ''
         }
     },
     methods: {
@@ -406,6 +427,22 @@ export default {
         fastSetScore(index, score) {
             this.$set(this.studentAnswer.scores, index, score)
         },
+        // 加分
+        scoreUp(index, totalScore) {
+            if (this.studentAnswer.scores[index] < totalScore) {
+                this.$set(this.studentAnswer.scores, index, ++this.studentAnswer.scores[index])
+            } else {
+                this.$Message.warning('已经是小题满分了')
+            }
+        },
+        // 减分
+        scoreDown(index) {
+            if (this.studentAnswer.scores[index] > 0) {
+                this.$set(this.studentAnswer.scores, index, --this.studentAnswer.scores[index])
+            } else {
+                this.$Message.warning('已经是零分了')
+            }
+        },
         // 批注学生作答数据
         markStuAnswer(index) {
             this.$Message.warning('暂未处理批注功能!')
@@ -430,7 +467,7 @@ export default {
             context.lineTo(150, 150);  //下一点坐标
             context.stroke();
         },
-        //保存学生作答信息
+        //保存学生分数
         saveScore() {
             let requestData = {
                 "id": this.examId,
@@ -439,7 +476,7 @@ export default {
                 "studentId": this.studentAnswer.id,
                 "classId": this.studentAnswer.classId,
                 "school": this.paperInfo.code,
-                "subjectId": this.paperInfo.subjectId
+                "subjectId": this.subjectId
             }
             this.$api.learnActivity.UpsertAllRecord(requestData).then(res => {
                 if (res.error == null) {
@@ -499,6 +536,7 @@ export default {
     watch: {
         paper: {
             handler(newValue, oldValue) {
+                console.log('newValue', newValue)
                 this.paperInfo = newValue
             },
             deep: true
@@ -544,7 +582,9 @@ export default {
                 if (!this.studentAnswer.status) {
                     if (newValue.answers.length) {
                         try {
-                            let a = await this.$tools.getFile(newValue.answers[0] + this.$store.state.schoolSas.sas)
+                            console.log(this.scope)
+                            let sas = this.scope == 'school' ? this.$store.state.user.schoolProfile.blob_sas : this.$store.state.user.userProfile.blob_sas
+                            let a = await this.$tools.getFile(newValue.answers[0] + '?' + sas)
                             console.log('a', JSON.parse(a))
                             if (a) {
                                 this.$set(this.studentAnswer, 'answers', JSON.parse(a))
@@ -583,6 +623,14 @@ export default {
             return 0
         }
     },
+    created() {
+        console.log('router', this.$route)
+        if (this.$route.name == 'privateEvaluation') {
+            this.scope = 'private'
+        } else {
+            this.scope = 'school'
+        }
+    }
 }
 </script>
 

+ 70 - 27
TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue

@@ -26,7 +26,7 @@
             </span>
         </div>
         <div class="scoring-main-wrap dark-iview-table">
-            <Table v-show="!showTest" class="score-box" border :columns="tableColumn" :data="studentScore" :loading="tableLoading" :max-height="tableHeight">
+            <Table v-show="!showTest" class="score-box" border :columns="tableColumn" :data="studentScore" :loading="tableLoading" :max-height="tableHeight" no-data-text="班级暂无学生">
                 <template slot-scope="{ row,index }" :slot="'qu'+qIndex" v-for="(item,qIndex) in quCount">
                     <div :key="'qu'+qIndex" @click="getStuScore(row,qIndex)">
                         <span style="cursor:pointer;" @click="noAnswer" v-if="row.data[qIndex] == -1 && row.status == 1">- -</span>
@@ -39,14 +39,15 @@
                 </template>
                 <!-- 1: 未作答 2:未评分 3:已评分 -->
                 <template slot-scope="{ row,index }" slot="status">
-                    <span class="stu-status-tag" @click="getStuScore(row,0)" :style="{'background':row.status == 1 ? '#ed4014' : row.status == 2 ? '#ff9900' : '#19be6b', 'cursor':row.status == 2 ? 'pointer':'text'}">
-                        {{row.status == 1 ? '暂未作答' : row.status == 2 ? '前往评分' : '查看分'}}
+                    <span class="stu-status-tag" @click="getStuScore(row,0)" :style="{'background':row.status == 1 ? '#ed4014' : row.status == 2 ? '#ff9900' : '#19be6b', 'cursor':row.status == 1 ? 'text':'pointer'}">
+                        {{row.status == 1 ? '暂未作答' : row.status == 2 ? '前往评分' : '查看分'}}
                     </span>
                 </template>
                 <Loading slot="loading" :top="-50"></Loading>
             </Table>
             <div class="dark-iview-table scoring-handle-box" v-show="showTest">
-                <PaperScore ref="paperScore" :defaultIndex="defaultIndex" :examId="examInfo.id" :paper="paperInfo" :studentAnswer="chooseStudent" @nextStu="getNextStu" style="color:#515a6e;"></PaperScore>
+                <PaperScore ref="paperScore" :defaultIndex="defaultIndex" :examId="examInfo.id" :paper="paperInfo" :studentAnswer="chooseStudent" :subjectId="chooseSubject"
+                @nextStu="getNextStu" style="color:#515a6e;"></PaperScore>
                 <Loading :top="200" type="1" style="text-align:center" v-show="dataLoading"></Loading>
             </div>
         </div>
@@ -110,7 +111,9 @@ export default {
             studentScore: [],
             quCount: [],
             paperInfo: {},
-            students: []
+            students: [],
+            privClassList: undefined,
+
         };
     },
     methods: {
@@ -215,14 +218,15 @@ export default {
                 } else {
                     this.$Message.error("API ERROR!");
                 }
-            });
+            })
         },
 
         getStudentAnswer() {
             this.dataLoading = true;
+            console.log('哈哈', this.chooseClass)
             let requestData = {
                 id: this.examInfo.id,
-                school: this.$store.state.user.schoolCode,
+                code: this.examInfo.scope == 'school' ? this.$store.state.user.schoolCode : this.$store.state.userInfo.TEAMModelId,
                 subjectId: this.chooseSubject,
                 classId: this.chooseClass,
             };
@@ -238,6 +242,18 @@ export default {
                 }
             ).finally(() => {
                 setTimeout(() => {
+                    this.$nextTick(() => {
+                        let tableBody = document.getElementsByClassName('ivu-table-tbody')
+                        console.log('tableBody', tableBody)
+                        let fixed = document.getElementsByClassName('ivu-table-fixed-body')
+                        console.log(fixed)
+                        for (let iterator of fixed) {
+                            console.log(iterator)
+                            let max = (this.tableHeight - 50) > (48 * this.studentScore.length) ? (48 * this.studentScore.length) : (this.tableHeight - 50)
+                            // iterator.style.maxHeight =  (this.tableHeight - 40) + 'px'
+                            iterator.style.maxHeight = max + 'px'
+                        }
+                    })
                     this.dataLoading = false
                     this.tableLoading = false
                 }, 500);
@@ -357,32 +373,38 @@ export default {
         examInfo: {
             handler(n, o) {
                 console.log("接收数据examInfo:", n);
+                this.privClassList = undefined
                 if (n.subjects && n.subjects.length) {
                     this.chooseSubject = n.subjects[0].id;
                 }
+
                 if (n.grades && n.grades.length) {
                     this.chooseGrade = n.grades[0].id;
                 }
-                // if (n.targetClassIds && n.targetClassIds.length) {
-                //     this.chooseClass = n.targetClassIds[0];
-                // }
+
                 if (n.papers && n.papers.length) {
-                    let res = n.papers.find((item) => {
-                        return item.subjectId == this.chooseSubject;
-                    });
-                    this.paperInfo = res ? this._.cloneDeep(res) : {};
+                    if (n.scope == 'school') {
+                        let res = n.papers.find((item) => {
+                            return item.subjectId == this.chooseSubject;
+                        });
+                        this.paperInfo = res ? this._.cloneDeep(res) : {};
+                    } else {
+                        this.paperInfo = n.papers[0]
+                    }
                 } else {
                     this.paperInfo = {};
                 }
-                // this.getClassStudent();
             },
             deep: true,
         },
         classList: {
             handler(n, o) {
-                if (this.classList.length) {
+                if (n && n.length) {
                     this.chooseClass = n[0].id;
+                    console.log('呵呵呵',this.chooseClass)
                     this.getClassStudent();
+                }else{
+                    this.chooseClass = undefined
                 }
             },
             deep: true,
@@ -397,27 +419,44 @@ export default {
                         (item) => {
                             return (this.examInfo.targetClassIds.indexOf(item.id) >= 0 && item.gradeId == this.chooseGrade);
                         }
-                    );
+                    )
                     return classes;
-                } else {
-                    let list = this.examInfo.targetClassIds.map(item => {
-                        return {
-                            id: item,
-                            name: item
+                } else if (this.examInfo.scope == 'teacher') {
+                    this.showTest = false
+                    let classes = this.$store.state.user.schoolProfile.school_classes.filter(
+                        (item) => {
+                            return (this.examInfo.targetClassIds.indexOf(item.id) >= 0);
                         }
-                    })
-                    console.log('list',list)
-                    return list
+                    )
+                    return classes;
+                } else {
                     //根据targetClassIds查询班级信息
+                    if (!this.privClassList) {
+                        this.$api.schoolSetting.getClassByIds({
+                            code: this.$store.state.userInfo.TEAMModelId,
+                            ids: this.examInfo.targetClassIds
+                        }).then(
+                            res => {
+                                console.log('list', res)
+                                if (res.className && res.className.length) this.chooseClass = res.className[0].id
+                                this.privClassList = res.className
+                            },
+                            err => {
+                                console.log(err)
+                            }
+                        )
+                    }
+                    return this.privClassList
                 }
             } else {
-                return [];
+                return []
             }
         },
     },
     mounted() {
         let tableWrap = document.getElementsByClassName('scoring-main-wrap')
         this.tableHeight = tableWrap[0].offsetHeight - 27
+
     }
 };
 </script>
@@ -428,7 +467,11 @@ export default {
 <style lang="less">
 .scoring-main-wrap .ivu-table-fixed-body {
     background: #2b2b2e;
-    max-height: 701px;
+    // max-height: 701px;
+}
+.scoring-main-wrap .ivu-table-tip {
+    position: relative;
+    z-index: 9999;
 }
 .scoring-main-wrap .ivu-table-fixed-right::before,
 .scoring-main-wrap .ivu-table-fixed::before {

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

@@ -13,15 +13,11 @@
                 <span class="mytitle">{{ MyName }}</span>
                 <span class="pixel">{{ windowWidth }} * {{ windowHeight }} px</span>
                 <span class="profile-dropdown">
-                    <!--<Avatar
-                      class="avatar-link"
-                      src="../assets/image/tmd_logo.png"
-                    />-->
-                    <Avatar class="avatar-link">U</Avatar>
+                    <PersonalPhoto v-if="userInfo.name !== undefined" class="avatar-link" :width="'35px'" :height="'35px'" :fontSize="'0.8rem'" :name="userInfo.name" color="#00AD6C" />
                     <div id="profile-pop">
                         <span class="profile-pop-triangle"></span>
                         <h5 class="profileName">{{userInfo.name}} ({{userInfo.studentId}})</h5>
-                        <Dropdown v-if="users.roles" @on-click="onRoleSelect" trigger="click" style="width: 100%;" transfer-class-name="test">
+                        <Dropdown v-if="isTeacher" @on-click="onRoleSelect" trigger="click" style="width: 100%;" transfer-class-name="test">
                             <li class="profile-pop-item">
                                 <a href="javascript:void(0)">
                                     <Icon size="15" type="ios-person" class="profile-pop-itemIcon3" />
@@ -30,17 +26,14 @@
                                 </a>
                             </li>
                             <DropdownMenu slot="list">
-                                <DropdownItem v-if="curRole == 'teacher' || curRole == 'admin'" :name="'teacher'">教师</DropdownItem>
-                                <DropdownItem v-if="curRole != 'student'" :name="'student'">{{ '學生' }}{{curRole}}</DropdownItem>
+                                <DropdownItem :name="'teacher'">教师</DropdownItem>
+                                <DropdownItem :name="'student'">{{ '學生' }}</DropdownItem>
                             </DropdownMenu>
                         </Dropdown>
-
                         <li class="profile-pop-item">
                             <svg-icon icon-class="setting"
                                       class="profile-pop-itemIcon1" />{{ $t("studentWeb.setting") }}
                         </li>
-                        <!--<router-link>
-                        </router-link>-->
                         <li class="profile-pop-item" @click="onQuit">
                             <svg-icon icon-class="logout" class="profile-pop-itemIcon2" />{{$t("studentWeb.logout")}}
                         </li>
@@ -226,12 +219,13 @@
     import mockdata from "@/api/newData";
     import mockdataEn from "@/api/newDataEn";
     import SmallNavBar from "@/components/student-web/SmallNavBar";
-
+    import PersonalPhoto from '@/components/public/personalPhoto/Index.vue'
     export default {
         name: "App",
         components: {
             SmallNavBar,
-            jwtDecode
+            jwtDecode,
+            PersonalPhoto
         },
         provide() {
             return {
@@ -264,6 +258,17 @@
                 return val => {
                     return val === 'student' ? '学生' : '教师'
                 }
+            },
+            isTeacher() {
+                let state = false
+                if (this.users.roles.length) {
+                    for (let item of this.users.roles) {
+                        if (item == 'teacher' || item == 'admin') {
+                            state = true
+                        }
+                    }
+                }
+                return state
             }
         },
         watch: {
@@ -411,14 +416,17 @@
                     this.$store.commit("setUserInfo", data)
                 }
                 if (this.users.roles.length) {
+                    //console.log(this.user)
                     this.curRole = localStorage.getItem('identity')
                     console.log('role...............')
+                    console.log(this.$store.getters.getUsers)
                     console.log(this.curRole)
                     console.log(this.$store)
                 }
             },
             getStudentData() {
                 this.userInfo = this.$store.state.studentWeb.userInfo
+                console.log(this.userInfo)
             },
             onRoleSelect(val) {
                 if (localStorage.getItem('identity') != val) {

+ 2 - 2
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -244,7 +244,7 @@ namespace TEAMModelOS.Controllers
                 var client = _azureCosmos.GetCosmosClient();
                 List<ExamInfo> examInfo = new List<ExamInfo>();
                 //var query = $"select value(c) from c ";
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.id = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Exam-{code}") }))
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.id = '{id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{code}") }))
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -339,7 +339,7 @@ namespace TEAMModelOS.Controllers
                         result.studentAnswers.Add(new List<string>());
                     }
                     string FileName = result.examId + "/" + result.subjectId+"/" +studentId ;
-                    string blob = await _azureStorage.UploadFileByContainer("hbcn", ans.ToJsonString(), "exam", FileName +"/"+ "ans.json");
+                    string blob = await _azureStorage.UploadFileByContainer(school.ToString(), ans.ToJsonString(), "exam", FileName +"/"+ "ans.json");
                     result.studentAnswers[index].Add(blob);
 
                     for (int i = 0; i < ans.Count; i++)

+ 5 - 1
TEAMModelOS/Controllers/Item/ItemController.cs

@@ -62,7 +62,11 @@ namespace TEAMModelOS.Controllers
                 {
                     itemInfo.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                     //DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                    itemInfo.code = "Item-" + itemInfo.code;
+                    if (!itemInfo.code.Contains("Item"))
+                    {
+                        itemInfo.code = "Item-" + itemInfo.code;
+                        // itemInfo = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(itemInfo, itemInfo.id, new PartitionKey($"{itemInfo.code}"));
+                    }
                     var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(itemInfo.id, new PartitionKey($"{itemInfo.code}"));
                     if (response.Status == 200)
                     {