Browse Source

Merge branch 'develop5.0-tmd' of http://106.12.23.251:10000/TEAMMODEL/TEAMModelOS into develop5.0-tmd

zhouj1203@hotmail.com 3 years ago
parent
commit
d0a6f39318

+ 29 - 29
TEAMModelOS/ClientApp/src/api/studentWeb.js

@@ -1,5 +1,5 @@
 import { Random } from 'mockjs'
-import {  post } from '@/api/http'
+import { post } from '@/api/http'
 //----------
 // 使用 Mock 測試
 
@@ -100,17 +100,17 @@ for (var i = 1; i <= 30; i++) {
 
         'rightAns|1': ['A', 'B', 'C', 'D'],
         'MyAns|1': ['A', 'B', 'C', 'D', ''],
-        'ansDesc': localStorage.getItem('lang')=='tw'?[Random.cparagraph(1, 3), Random.cparagraph(1, 3), Random.cparagraph(1, 3), Random.cparagraph(1, 3)]:[Random.paragraph(1, 3), Random.paragraph(1, 3), Random.paragraph(1, 3), Random.paragraph(1, 3)],
+        'ansDesc': localStorage.getItem('lang') == 'tw' ? [Random.cparagraph(1, 3), Random.cparagraph(1, 3), Random.cparagraph(1, 3), Random.cparagraph(1, 3)] : [Random.paragraph(1, 3), Random.paragraph(1, 3), Random.paragraph(1, 3), Random.paragraph(1, 3)],
         'qtype|1': ['單選', '多選'],
-        'questionDesc': localStorage.getItem('lang')=='tw'?Random.cparagraph(1, 8):Random.paragraph(1, 8),
-        'relatedQ1': localStorage.getItem('lang')=='tw'?Random.cparagraph(1, 8):Random.paragraph(1, 8),
-        'relatedQ2': localStorage.getItem('lang')=='tw'?Random.cparagraph(1, 8):Random.paragraph(1, 8),
+        'questionDesc': localStorage.getItem('lang') == 'tw' ? Random.cparagraph(1, 8) : Random.paragraph(1, 8),
+        'relatedQ1': localStorage.getItem('lang') == 'tw' ? Random.cparagraph(1, 8) : Random.paragraph(1, 8),
+        'relatedQ2': localStorage.getItem('lang') == 'tw' ? Random.cparagraph(1, 8) : Random.paragraph(1, 8),
         "rightrate|1-100": 100,
         'img1|1-10': 'https://source.unsplash.com/random/300x200/?water',
         'img2|1-10': 'https://source.unsplash.com/random/300x200/?line',
         "haveImgAns|1-2": true,
-        'AnsImgs|1-10':'https://source.unsplash.com/random/300x200/?green',
-       
+        'AnsImgs|1-10': 'https://source.unsplash.com/random/300x200/?green',
+
     });
 
 
@@ -194,37 +194,37 @@ export default {
     },
     //查詢學生端活動信息
     getActivityInfo: function (data) {
-        return post('/student/stu-activity',data)
+        return post('/student/stu-activity', data)
     },
     //查詢學生端投票活动
     getVoteInfo: function (data) {
-        return post('/common/vote/find-id',data)
+        return post('/common/vote/find-id', data)
     },
     //查詢學生端个人投票结果
     getVoteResult: function (data) {
-        return post('/common/vote/decided',data)
+        return post('/common/vote/decided', data)
     },
     //查詢活动投票结果
     getVoteRecord: function (data) {
-        return post('/common/vote/record',data)
+        return post('/common/vote/record', data)
     },
     //提交投票结果数据
     sendVoteResult: function (data) {
-        return post('/common/vote/decide',data)
+        return post('/common/vote/decide', data)
+    },
+    //查詢學生端问卷活动
+    getSurveyInfo: function (data) {
+        return post('/common/survey/find-id', data)
+    },
+
+    //查詢學生端问卷活动
+    answerSurvey: function (data) {
+        return post('/common/survey/answer', data)
+    },
+
+    isAnswerd: function (data) {
+        return post('/common/survey/answered', data)
     },
-	//查詢學生端问卷活动
-	getSurveyInfo: function (data) {
-	    return post('/common/survey/find-id',data)
-	},
-	
-	//查詢學生端问卷活动
-	answerSurvey: function (data) {
-	    return post('/common/survey/answer',data)
-	},
-	
-	isAnswerd: function (data) {
-	    return post('/common/survey/answered',data)
-	},
 
     // 删除不存在的投票和问卷
     delActivity: function (data) {
@@ -241,22 +241,22 @@ export default {
         return post("/student/get-school-info", data)
     },
 
-    // 获取教室关联的学生(教师端)
+    // 获取教室关联的学生(教师端接口)
     getClassroomStudent: function (data) {
         return post('/school/classroom/find-students', data)
     },
 
-    // 根据stulist ids换取详细信息(教师端)
+    // 根据stulist ids换取详细信息(教师端接口)
     findListSummary: function (data) {
         return post('/school/course/get-summary-list', data)
     },
 
-    // 根据学生id换取详细信息(教师端)
+    // 根据学生id换取详细信息(教师端接口)
     findStuSummary: function (data) {
         return post('/student/get-summary-student', data)
     },
 
-    // 获取教师列表(教师端)
+    // 获取教师列表(教师端接口)
     getSchoolTeacher: function (data) {
         return post('/school/teacher/get-teacher-all', data)
     },

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

@@ -113,7 +113,7 @@
                 this.isLoad = true
                 if (this.getItemTitle.name !== undefined && this.getItemTitle) {
                     let paper = this.getItemTitle
-                    let codes = this.getItemTitle.scope == 'school' ? this.getItemTitle.school : this.getItemTitle.creatorId
+                    let codes = paper.scope == 'school' ? paper.school : paper.creatorId
                     let req = {
                         id: paper.id,
                         studentId: this.$store.state.userInfo.sub,
@@ -225,7 +225,7 @@
                             exam = item
                         }
                     }
-                    if (exam.id == undefined) { 
+                    if (exam.id == undefined) {
                         this.selectData = await this.$evTools.getStuPaper(code)
                         this.examData.push(this.selectData)
                     } else {

+ 7 - 3
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/QuesNaire.vue

@@ -290,8 +290,10 @@
 			// 获取blob里的问卷内容
 			getBlobItems(qnItem) {
 				return new Promise(async (resolve, reject) => {
-					let schoolBlobHost = JSON.parse(decodeURIComponent(localStorage.student_profile, "utf-8")).blob_uri
-					let privateBlobHost = schoolBlobHost.slice(0, schoolBlobHost.lastIndexOf('/')) + '/' +  qnItem.creatorId
+					let profile = localStorage.student_profile || localStorage.user_profile
+					let curBlobHost = JSON.parse(decodeURIComponent(profile, "utf-8")).blob_uri
+					let schoolBlobHost = curBlobHost.slice(0, curBlobHost.lastIndexOf('/')) + '/' +  localStorage.getItem('login_schoolCode')
+					let privateBlobHost = curBlobHost.slice(0, curBlobHost.lastIndexOf('/')) + '/' +  qnItem.creatorId
 					let cntr = qnItem.scope === 'school' ? this.$store.state.userInfo.azp : qnItem.creatorId
 					let blobHost = qnItem.scope === 'school' ?  schoolBlobHost : privateBlobHost
 					// 根据试卷的Blob地址 去读取JSON文件
@@ -325,7 +327,9 @@
 			// 获取blob里的问卷信息
 			getBlobJsonFile(scope, url, container) {
 				return new Promise(async (resolve, reject) => {
-					let blobUrl = JSON.parse(decodeURIComponent(localStorage.student_profile, "utf-8")).blob_uri
+					console.log(...arguments)
+					let profile = localStorage.student_profile || localStorage.user_profile
+					let blobUrl = JSON.parse(decodeURIComponent(profile, "utf-8")).blob_uri
 					let blobHost = blobUrl.slice(0, blobUrl.lastIndexOf('/')) + '/' +  container
 					// 根据试卷的Blob地址 去读取JSON文件
 					let sasString = scope === 'private' ? await this.$tools.getPrivateSas(container) : await this.$tools.getSchoolSas(container)

+ 29 - 86
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue

@@ -144,69 +144,6 @@
                         </div>
                     </div>
                 </vuescroll>
-                
-
-
-                <!-- <div :id="`event${item.id}`"
-                     class="list-item"
-                     @click="sentSelectedEventTitle(item)"
-                     :class="{ 'list-item-selected': selectedCondition(item) }"
-                     v-for="(item, index) in eventShow"
-                     v-if="isListNoItem == false"
-                     :key="index"
-                >
-                    <ul>
-                        <li class="list-item-icon">
-                            <svg-icon v-if="item.eventType == 'HomeWork'" icon-class="doc" />
-                            <svg-icon v-if="item.eventType == 'Preview'"  icon-class="selflearninginTime" />
-                            <svg-icon v-if="item.eventType == 'Exam'" icon-class="multiTest" />
-                            <svg-icon v-if="item.eventType == 'Vote'" icon-class="vote" />
-                            <svg-icon v-if="item.eventType == 'Survey'" icon-class="quesnaire" />
-                        </li>
-                        <li class="list-item-info"
-                            v-if="item.eventType == 'Exam'">
-                            <p class="list-item-title">
-                                <span class="list-item-typeMark">{{item.owner == 'school' ? $t('studentWeb.public.schoolExam'):$t('studentWeb.public.privateExam')}}</span>
-                                <span>{{ item.name }}</span>
-                            </p>
-                            <p class="list-item-time">
-                                {{ dateFormat(item.startTime) }} ~ {{ dateFormat(item.endTime) }}
-                            </p>
-                            <p class="list-item-time" v-show="timeStatus(item) == 'finish'">
-                                得分率:20%
-                            </p>
-                        </li>
-                        <li class="list-item-info"
-                            v-if="item.eventType == 'Vote'">
-                            <p class="list-item-title">
-                                <span class="list-item-typeMark">{{item.owner == 'school' ? $t('studentWeb.public.schoolVote'):$t('studentWeb.public.privateVote')}}</span>
-                                <span>{{ item.name }}</span>
-                            </p>
-                            <p class="list-item-time">
-                                {{ dateFormat(item.startTime) }} ~ {{ dateFormat(item.endTime) }}
-                            </p>
-                        </li>
-                        <li class="list-item-info"
-                            v-if="item.eventType == 'Survey'">
-                            <p class="list-item-title">
-                                <span class="list-item-typeMark">{{item.owner == 'school' ? $t('studentWeb.public.schoolSurvey'):$t('studentWeb.public.privateSurvey')}}</span>
-                                <span>{{ item.name }}</span>
-                            </p>
-                            <p class="list-item-time">
-                                {{ dateFormat(item.startTime) }} ~ {{ dateFormat(item.endTime) }}
-                            </p>
-                        </li>
-                        <li class="list-item-unDone" v-show="timeStatus(item) == 'going'">
-                            <div class="isAllowRetry">{{$t("studentWeb.public.going")}}</div>
-                        </li>
-                        <li class="list-item-unDone" v-show="timeStatus(item) == 'finish'">
-                            <div class="isOvertime">{{$t("studentWeb.public.finish")}}</div>
-                        </li>
-                        <li class="list-item-unDone" v-show="timeStatus(item) == 'finish' && item.eventType == 'Exam'">
-                            <div class="">{{$t("studentWeb.exam.report.wrongPractice")}}</div>
-                        </li>
-                    </ul>
-                </div> -->
                 <div class="list-end"></div>
             </div>
         </div>
@@ -332,35 +269,41 @@ import { mapGetters, mapState } from 'vuex';
             getActivityInfo() {
                 this.eventList.length = 0
                 this.isListNoItem = true;
-                if (this.studentProfile.classinfo.id !== "") {
-                    let classInfo = [this.studentProfile.classinfo.id]
-                    if (this.studentProfile.courses.length) {
-                        for (let item of this.studentProfile.courses) {
-                            classInfo.push(item.id)
-                        }
+
+                let params = {}
+                // 醍摩豆登陆——> roles有teacher
+                if (this.$store.state.userInfo.roles.includes("teacher")) {
+                    params = {
+                        userid: this.userInfo.sub,
+                        userType: "tmdid",
+                        school: this.schoolCode
                     }
-                    let params = {
+                }
+                // 学生账号登陆
+                else {
+                    params = {
                         userid: this.userInfo.sub,
                         userType: "schoolid",
                         school: this.schoolCode
                     }
-                    this.$api.studentWeb.getActivityInfo(params).then(res => {
-                        if (res) {
-                            let data = []
-                            for (let item of res.datas) {
-                                item.eventType = item.type
-                                item.progress = this.timeStatus(item)
-                                data.push(item)
-                            }
-                            this.eventList = [...data]
-                            this.eventList = this.eventList.sort(function (a, b) {
-                                return b.startTime - a.startTime //时间正序
-                            });
-                            this.eventShow = [...this.eventList]
-                            this.isListNoItem = false
-                        }
-                    })
+                    
                 }
+                this.$api.studentWeb.getActivityInfo(params).then(res => {
+                    if (res) {
+                        let data = []
+                        for (let item of res.datas) {
+                            item.eventType = item.type
+                            item.progress = this.timeStatus(item)
+                            data.push(item)
+                        }
+                        this.eventList = [...data]
+                        this.eventList = this.eventList.sort(function (a, b) {
+                            return b.startTime - a.startTime //时间正序
+                        });
+                        this.eventShow = [...this.eventList]
+                        this.isListNoItem = false
+                    }
+                })
             },
             //时间格式化处理
             dateFormat(timestamp) {

+ 6 - 1
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseList.vue

@@ -321,8 +321,13 @@ export default {
                 userid: this.$store.state.userInfo.sub,
                 school: this.$store.state.userInfo.azp
             }
+            if(this.$store.state.userInfo.roles.includes("teacher")) {
+                param.userType = "tmdid"
+            } else {
+                param.userType = "schoolid"
+            }
             this.$api.studentWeb.getClassList(param).then(res => {
-                if(res.courses.length > 0) {
+                if(res.courses.length) {
                     // 表定课程
                     var fixList = []
                     // 临时课程

+ 10 - 1
TEAMModelOS/ClientApp/src/components/student-web/HomeView/CourseListView.vue

@@ -37,7 +37,16 @@ export default {
   methods: {
     // 查找班级
     findSchoolInfo() {
-      this.$api.studentWeb.getSchoolInfo({}).then(res => {
+      let params = {}
+      // 醍摩豆登陆——> roles有teacher
+      if (this.$store.state.userInfo.roles.includes("teacher")) {
+          params = {userType: "tmdid"}
+      }
+      // 学生账号登陆
+      else {
+          params = {userType: "schoolid"}
+      }
+      this.$api.studentWeb.getSchoolInfo(params).then(res => {
         if(res.status == 200) {
           this.period = res.school_base.period
           this.roomList = res.school_rooms

+ 41 - 57
TEAMModelOS/ClientApp/src/components/student-web/HomeView/MissionListCard.vue

@@ -47,43 +47,6 @@
                         </div> -->
                     </div>
                 </div>
-
-                <!-- <div :id="`event${item.eventID}`"
-                    class="list-item"
-                    @click="sentSelectedEventTitle(item)"
-                    v-for="(item, index) in testData" :key="index">
-                    <ul>
-                        <li class="list-item-icon">
-                            <svg-icon v-if="item.eventType == 'Homework'" icon-class="doc" />
-                            <svg-icon v-if="item.eventType == 'Learn'"
-                                      icon-class="selflearninginTime" />
-                            <svg-icon v-if="item.eventType == 'Exam'"
-                                      icon-class="test"
-                                      class="reset-testIcon" />
-                            <svg-icon v-if="item.eventType == 'Vote'" icon-class="vote" />
-                            <svg-icon v-if="item.eventType == 'Survey'" icon-class="quesnaire" />
-                        </li>
-                        <li class="list-item-info">
-                            <p class="list-item-title">
-                                <span v-show="item.eventType == 'Exam'" class="list-item-typeMark">{{item.owner == 'school'? $t('studentWeb.public.schoolExam'):$t('studentWeb.public.privateExam')}}</span>
-                                <span v-show="item.eventType == 'Vote'" class="list-item-typeMark">{{item.owner == 'school'? $t('studentWeb.public.schoolVote'):$t('studentWeb.public.privateVote')}}</span>
-                                <span v-show="item.eventType == 'Survey'" class="list-item-typeMark">{{item.owner == 'school'? $t('studentWeb.public.schoolSurvey'):$t('studentWeb.public.privateSurvey')}}</span>
-                                <span>{{ item.name }}</span>
-                                <div style="float:right;margin-top:-20px">
-                                    <div class="list-item-unDone" v-show="timeStatus(item) == 'going'">
-                                        <span class="isAllowRetry">{{$t("studentWeb.public.going")}}</span>
-                                    </div>
-                                    <div class="list-item-unDone" v-show="timeStatus(item) == 'finish'">
-                                        <span class="isOvertime">{{$t("studentWeb.public.finish")}}</span>
-                                    </div>
-                                </div>
-                            </p>
-                            <p class="list-item-time">
-                                {{ dateFormat(item.startTime) }} ~ {{ dateFormat(item.endTime) }}
-                            </p>
-                        </li>
-                    </ul>
-                </div> -->
             </Scroll>
             <div class="list-end"></div>
         </Card>
@@ -91,6 +54,7 @@
 </template>
 
 <script>
+    import { mapState } from 'vuex';
     import PreviewProgressPie from "../EventView/PreviewProgressPie";
     export default {
         name: "MissionListCard",
@@ -133,32 +97,46 @@
         methods: {
             //获取新活动信息数据
             getActivityInfo() {
-                if (this.$store.state.user.studentProfile.classinfo.id !== "") {
+                let params = {}
+                // 醍摩豆登陆——> roles有teacher
+                if (this.$store.state.userInfo.roles.includes("teacher")) {
+                    params = {
+                        userid: this.userInfo.sub,
+                        userType: "tmdid",
+                        school: this.user.schoolCode
+                    }
+                }
+                // 学生账号登陆
+                else {
+                    params = {
+                        userid: this.userInfo.sub,
+                        userType: "schoolid",
+                        school: this.user.schoolCode
+                    }
+                    
+                }
+                this.$api.studentWeb.getActivityInfo(params).then(res => {
+                    if (res.datas.length) {
+                        let data = []
+                        for (let item of res.datas) {
+                            item.eventType = item.type
+                            data.push(item)
+                        }
+                        this.testData = [...this.testData, ...data]
+                        this.testData = this.testData.sort(function (a, b) {
+                            return b.startTime - a.startTime //时间正序
+                        });
+                    }
+                })
+                /* if (this.$store.state.user.studentProfile.classinfo.id !== "") {
                     let classInfo = [this.$store.state.user.studentProfile.classinfo.id]
                     if (this.$store.state.user.studentProfile.courses.length) {
                         for (let item of this.$store.state.user.studentProfile.courses){
                             classInfo.push(item.id)
                         }
                     }
-                    let params = {
-                        userid: this.$store.state.userInfo.sub,
-                        userType: "schoolid",
-                        school: this.$store.state.user.schoolCode
-                    }
-                    this.$api.studentWeb.getActivityInfo(params).then(res => {
-                        if (res.datas.length) {
-                            let data = []
-                            for (let item of res.datas) {
-                                item.eventType = item.type
-                                data.push(item)
-                            }
-                            this.testData = [...this.testData, ...data]
-                            this.testData = this.testData.sort(function (a, b) {
-                                return b.startTime - a.startTime //时间正序
-                            });
-                        }
-                    })
-                }
+                    
+                } */
             },
             //处理时间结构
             dateFormat(timestamp) {
@@ -219,6 +197,12 @@
                 }
             },
         },
+        computed: {
+            ...mapState({
+                userInfo: state => state.userInfo,
+                user: state => state.user,
+            })
+        }
     };
 </script>
 

+ 1 - 0
TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.less

@@ -8,6 +8,7 @@
 
 .component-vote-form {
     padding: 20px 20px 50px 20px;
+	font-family: 'NotoSerif', '΢ÈíÕýºÚÌå', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Sans-serif;
 	
 	.vote-class{
 		display: flex;

+ 12 - 5
TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.vue

@@ -260,11 +260,12 @@
 								this.voteForm.repeat = []
 							}
 							console.log(this.voteForm)
+							let classSelectScope = this.$refs.classSelectRef.evaluationInfo.scope
 							let params = Object.assign({}, this.defaultParams)
 							let target = []
 							let fileName = this.$tools.guid()
 							let isReset = this.voteForm.isReset.length > 0
-							let isPersonal = this.$route.name === 'personalVote' && this.$refs.classSelectRef.evaluationInfo.scope  === 'private'
+							let isPersonal = this.$route.name === 'personalVote' &&  classSelectScope === 'private'
 							params.code = this.getCurCode
 							params.scope = isPersonal ? 'private' : 'school'
 							params.name = this.voteForm.name
@@ -286,8 +287,13 @@
 							if (this.isEdit && this.editInfo.id && this.editInfo.code) {
 								params.id = this.editInfo.id
 							}
-							params.classes = this.voteForm.classes
-							console.log(params)
+							if(classSelectScope === 'school'){
+								params.classes = this.voteForm.classes
+							}else{
+								params.stuLists = this.voteForm.classes
+							}
+							console.log('提交的投票对象',params)
+							// return
 							/* 保存BLOB以及COSMOS */
 							this.saveorUpdateVote(params).then(res => {
 								this.$Message.success((this.isEdit && this.editInfo.id) ? this.$t('vote.form.editSuc') : this.$t(
@@ -523,9 +529,10 @@
 				// if(!this.classRooms.length){
 				// 	this.classRooms = await this.getClassrooms(this.userInfo.TEAMModelId)
 				// }
-				if(item.classes.length){
-					this.classNameArr = await this.getClassNameByIds(item.classes)
+				if(item.id){
+					this.classNameArr = item.classes.length ? await this.getClassNameByIds(item.classes) : await this.getClassNameByIds(item.stuLists)
 				}
+				console.log(this.classNameArr)
 				this.voteForm = null
 				this.voteOptionsContent = []
 				this.voteOptions = []

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

@@ -188,6 +188,7 @@ export default{
         stStuWarning: '请先选择学生!',
         lastQu: '上一题',
         nextQu: '下一题',
+        view:'查看'
     },
 
     //SimpleAnalysis.vue

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

@@ -496,8 +496,9 @@ export default {
 	/* 获取完整的试卷数据 */
 	getStuPaper(paper, examScope) {
 		let curScope = examScope || paper.scope
-		return new Promise(async (r,j) => {
-			let blobHost = JSON.parse(decodeURIComponent(localStorage.student_profile, "utf-8")).blob_uri
+		return new Promise(async (r, j) => {
+			let profile = localStorage.student_profile || localStorage.user_profile
+			let blobHost = JSON.parse(decodeURIComponent(profile, "utf-8")).blob_uri
 			let splitHost = blobHost.split('/')
 			// 根据试卷的Blob地址 去读取JSON文件
 			let sasString = curScope === 'school' ? await $tools.getSchoolSas(paper.code) : await $tools.getPrivateSas(paper.code)

+ 0 - 2
TEAMModelOS/ClientApp/src/view/answersheet/index.vue

@@ -375,7 +375,6 @@
 			goBack() {
 				let params = {}
 				let curEditPaper = localStorage.getItem('c_edit_paper')
-				console.log(curEditPaper.paperGrade)
 				// 如果是从新建试卷或者编辑试卷 跳转过来的 则返回过去的时候带上编辑的信息
 				if (this.$route.params.paper && (this.fromRouter === 'newSchoolPaper' || this.fromRouter ===
 						'newPrivatePaper') && curEditPaper) {
@@ -383,7 +382,6 @@
 						paper: JSON.parse(curEditPaper)
 					}
 				}
-				console.log(params.paper.paperGrade)
 				// 如果是从试卷库预览试卷跳转过来的 就返回试卷库
 				if (this.$route.params.paper && (this.fromRouter === 'schoolBank' || this.fromRouter === 'personalBank')) {
 					params = {

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

@@ -13,11 +13,12 @@
 					<div class="child-item-option-text" v-html="option.value"></div>
 				</div>
 			</div>
-			<div class="item-btn-toggle" v-if="isShowScore">
+			<div class="item-btn-toggle">
 				<template>
-					<InputNumber  :min="0" v-model="item.score"
+					<InputNumber  :min="0" v-model="item.score"  v-if="isShowScore"
 						style="display: inline-block ;width: 50px;margin-right: 10px;height: 30px;" @click.stop>
 					</InputNumber>
+					<span v-if="!isShowScore" style="margin-right: 10px;color: #2db7f5;font-weight: bold;">{{ item.score }}</span>
 					<span style="margin-right: 20px;">{{$t('evaluation.paperList.score')}}</span>
 				</template>
 			</div>

+ 2 - 0
TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue

@@ -1137,6 +1137,8 @@
 											this.isLoading = false
 										}
 									)
+								}else{
+									console.error(blobFile)
 								}
 							
 								}catch(e) {

+ 9 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.less

@@ -98,7 +98,7 @@
     display: none;
     color: white;
     padding: 2px 5px;
-    background: #1cc0f3;
+    // background: red;
     cursor: pointer;
 }
 .scoring-exercise-wrap .exercise-item {
@@ -383,4 +383,12 @@
 
     .paper-score-container .item-option-content, .item-question-flex, .child-item-question-flex {
         display: flex;
+    }
+
+    .mark-action-item{
+        padding: 5px 12px;
+    }
+    .mark-label{
+        color: #2d8cf0;
+        margin-bottom: 5px;
     }

+ 55 - 36
TEAMModelOS/ClientApp/src/view/learnactivity/PaperScore.vue

@@ -48,7 +48,6 @@
             </div>
         </div>
         <div class="qu-list-wrap scoring-exercise-wrap" ref="mathJaxContainer" v-show="!dataLoading">
-            <!-- <vuescroll ref="question-scrool" > -->
             <!-- 按题型排序 -->
             <div v-show="!isComplete" class="list-view" :key="'group'+ typeIndex" v-for="(typeItem,typeIndex) in groupList">
                 <p class="type-name">
@@ -79,15 +78,6 @@
                                     <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="$t('learnActivity.score.lastQu')" :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="$t('learnActivity.score.nextQu')" :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> -->
                         </div>
                         <div class="qu-info-box">
                             <!-- 题干部分 -->
@@ -106,16 +96,23 @@
                                 <p class="answer-title">
                                     <span v-show="!showQu" class="item-question-order">{{$t('learnActivity.score.quIndex1')}} {{ getQuIndex(typeIndex,index)}} .</span>
                                     {{$t('learnActivity.score.stuAns')}}
-                                    <Icon type="md-checkmark" v-show="studentAnswer.scores[item.index] == item.score" />
+                                    <!-- <Icon type="md-checkmark" v-show="studentAnswer.scores[item.index] == item.score" />
                                     <Icon type="md-close" color="#ed4014" v-show="studentAnswer.scores[item.index] == 0" />
-                                    <Icon custom="iconfont icon-half-right" color="#ff9900" v-show="studentAnswer.scores[item.index] > 0 && studentAnswer.scores[item.index] < item.score" />
+                                    <Icon custom="iconfont icon-half-right" color="#ff9900" v-show="studentAnswer.scores[item.index] > 0 && studentAnswer.scores[item.index] < item.score" /> -->
+                                    <Icon custom="iconfont icon-mark" color="#1cc0f3" @click="viewMark(item.index)" v-show="studentAnswer.mark && studentAnswer.mark[item.index].length" style="margin-left:10px" />
                                 </p>
                                 <!--学生作答答案显示区域-->
                                 <div class="stu-answer-box item-explain-details" v-if="studentAnswer.answers && studentAnswer.answers.length">
                                     <!-- 批注 主观题才会有批注功能 -->
-                                    <div class="mark-btn-box" @click="markStuAnswer(item.index)" v-if="item.type !== 'single' && item.type !== 'multiple' && item.type !== 'judge'">
-                                        <Icon type="md-create" />
-                                        <span style="margin-left:5px;">{{$t('learnActivity.score.mark')}}</span>
+                                    <div class="mark-btn-box" v-if="item.type !== 'single' && item.type !== 'multiple' && item.type !== 'judge'">
+                                        <span class="mark-action-item" v-show="studentAnswer.mark && studentAnswer.mark[item.index].length" style="background:#19be6b" @click="viewMark(item.index)">
+                                            <Icon type="md-eye" />
+                                            <span style="margin-left:5px;">{{$t('learnActivity.score.view')}}</span>
+                                        </span>
+                                        <span class="mark-action-item" style="background:#ed4014" @click="markStuAnswer(item.index)">
+                                            <Icon type="md-create" />
+                                            <span style="margin-left:5px;">{{$t('learnActivity.score.mark')}}</span>
+                                        </span>
                                     </div>
                                     <!--多选题答案-->
                                     <div v-if="item.type === 'multiple'" :id="'answer'+ getScoreIndex(typeIndex,index)">
@@ -205,15 +202,6 @@
                                         <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="$t('learnActivity.score.lastQu')" :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="$t('learnActivity.score.nextQu')" :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> -->
                             </div>
                             <div class="qu-info-box">
                                 <div class="child-item-question child-item-question-flex" v-show="showQu">
@@ -231,16 +219,23 @@
                                     <p class="answer-title">
                                         <span class="child-item-question-order" v-show="!showQu">{{$t('learnActivity.score.quIndexLabel')}} {{getQuIndex(typeIndex,index)+'-'+ (childIndex + 1) }}{{$t('learnActivity.score.sQuLabel2')}}</span>
                                         {{$t('learnActivity.score.stuAns')}}
-                                        <Icon type="md-checkmark" v-show="studentAnswer.scores[childItem.index] == childItem.score" />
+                                        <!-- <Icon type="md-checkmark" v-show="studentAnswer.scores[childItem.index] == childItem.score" />
                                         <Icon type="md-close" color="#ed4014" v-show="studentAnswer.scores[childItem.index] == 0" />
-                                        <Icon custom="iconfont icon-half-right" color="#ff9900" v-show="studentAnswer.scores[childItem.index] > 0 && studentAnswer.scores[childItem.index] < childItem.score" />
+                                        <Icon custom="iconfont icon-half-right" color="#ff9900" v-show="studentAnswer.scores[childItem.index] > 0 && studentAnswer.scores[childItem.index] < childItem.score" /> -->
+                                        <Icon custom="iconfont icon-mark" color="#1cc0f3" @click="viewMark(childItem.index)" v-show="studentAnswer.mark && studentAnswer.mark[childItem.index].length" style="margin-left:10px" />
                                     </p>
                                     <!--学生作答答案显示区域-->
                                     <div class="stu-answer-box item-explain-details" v-if="studentAnswer.answers && studentAnswer.answers.length">
                                         <!-- 批注 主观题才会有批注功能 -->
-                                        <div class="mark-btn-box" @click="markStuAnswer(childItem.index)" v-if="childItem.type !== 'single' && childItem.type !== 'multiple' && childItem.type !== 'judge'">
-                                            <Icon type="md-create" />
-                                            <span style="margin-left:5px;">{{$t('learnActivity.score.mark')}}</span>
+                                        <div class="mark-btn-box" v-if="childItem.type !== 'single' && childItem.type !== 'multiple' && childItem.type !== 'judge'">
+                                            <span v-show="studentAnswer.mark && studentAnswer.mark[childItem.index].length" class="mark-action-item" style="background:#19be6b" @click="viewMark(childItem.index)">
+                                                <Icon type="md-eye" />
+                                                <span style="margin-left:5px;">{{$t('learnActivity.score.view')}}</span>
+                                            </span>
+                                            <span class="mark-action-item" style="background:#ed4014" @click="markStuAnswer(childItem.index)">
+                                                <Icon type="md-create" />
+                                                <span style="margin-left:5px;">{{$t('learnActivity.score.mark')}}</span>
+                                            </span>
                                         </div>
                                         <!--多选题答案-->
                                         <div v-if="childItem.type === 'multiple'" :id="'answer'+ getScoreIndex(typeIndex,index,childIndex)">
@@ -296,9 +291,6 @@
                     </div>
                 </div>
             </div>
-            <!-- 默认排序 -->
-
-            <!-- </vuescroll> -->
             <div v-show="isComplete" class="complete-score-box">
                 <Icon class="complete-icon" type="md-checkmark-circle" />
                 <p class="complete-stu-info">{{studentAnswer.name}} ({{scoreTotal}}{{$t('learnActivity.score.scoreUnit')}})</p>
@@ -310,7 +302,12 @@
         </Modal>
         <!-- 用来单独渲染学生作答数据,提高tocanvas 的效率 -->
         <iframe id="answerIframe" :srcdoc="studentAnswer.answers[curAnIndex]" v-if="studentAnswer.answers"></iframe>
-
+        <Modal v-model="viewStatus" title="查看批注" width='600'>
+            <div v-for="(item,index) in viewMarks" :key="index">
+                <p class="mark-label" v-show="viewMarks.length > 1">批注{{index + 1}}:</p>
+                <img :src="item.url" style="width:100%;margin-bottom:20px">
+            </div>
+        </Modal>
     </div>
 </template>
 <script>
@@ -356,6 +353,8 @@ export default {
     },
     data() {
         return {
+            viewIndex: 0,
+            viewStatus: false,
             isDefOrder: false, //是否默认排序  默认/题型
             activeIndex: 0,
             curAnIndex: -1,
@@ -373,10 +372,28 @@ export default {
             showQu: false,
             showOption: false,
             scope: '',
-            markBg: undefined
+            markBg: undefined,
+            viewMarks: []
         }
     },
     methods: {
+        viewMark(index) {
+            this.viewIndex = index
+            this.viewStatus = true
+            if (this.studentAnswer.mark && this.studentAnswer.mark[this.viewIndex]) {
+                let sas = this.examScope == 'school' ? this.$store.state.user.schoolProfile.blob_sas : this.$store.state.user.userProfile.blob_sas
+                let blobUrl = this.examScope == 'school' ? JSON.parse(decodeURIComponent(localStorage.school_profile, "utf-8")).blob_uri : JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8")).blob_uri
+                let d = this._.cloneDeep(this.studentAnswer.mark[this.viewIndex])
+                d.forEach(item => {
+                    item.url = blobUrl + '/' + item.mark + '?' + sas
+                })
+                this.viewMarks = d
+            } else {
+                this.viewMarks = []
+            }
+
+            console.log('学生作答数据', this.studentAnswer)
+        },
         closeModal() {
             this.markStatus = false
             this.curAnIndex = -1
@@ -397,8 +414,9 @@ export default {
             let path = `exam/${this.examId}/${this.subjectId}/${this.studentAnswer.id}`
             blobTool.upload(markPng, path).then(
                 res => {
-                    console.log('保存成功', res)
-                    this.$set(this.studentAnswer.answers, this.curAnIndex, [img.outerHTML])
+                    this.studentAnswer.mark[this.curAnIndex].push({
+                        mark: path + '/' + fileName
+                    })
                     this.markStatus = false
                     //保存批注数据
                     this.$api.learnActivity.upsertAnswer({
@@ -456,6 +474,7 @@ export default {
                     this.markStatus = true
                 })
             }
+
         },
 
         // 获取题号

+ 1 - 0
TEAMModelOS/ClientApp/src/view/vote/ManageVote.less

@@ -14,6 +14,7 @@
     height: 100%;
     display: flex;
     flex-direction: column;
+	font-family: 'NotoSerif', '微软正黑体', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Sans-serif;
 	
 	.hw-header{
 		height: 50px;

+ 1 - 0
TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue

@@ -177,6 +177,7 @@
 						code: this.tabIndex === 0 ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo
 							.TEAMModelId,
 						classes: [],
+						stuLists:[],
 						options: [{
 							code: 'A',
 							value: ''

+ 46 - 54
TEAMModelOS/Controllers/School/StudentController.cs

@@ -2109,79 +2109,71 @@ namespace TEAMModelOS.Controllers
         }
         //TODO 此API需處理對應前端返回的相關數據
         [ProducesDefaultResponseType]
-        [AuthToken(Roles = "student")]
+        [AuthToken(Roles = "student,teacher")]
         [HttpPost("get-school-info")]
-
-        public async Task<IActionResult> GetSchoolInfo(JsonElement requert)
+        public async Task<IActionResult> GetSchoolInfo(JsonElement request)
         {
             try
             {
                 var (id, _, _, school) = HttpContext.GetAuthTokenInfo();
                 var client = _azureCosmos.GetCosmosClient();
-                List<string> roles = new List<string>();
-                List<string> permissions = new List<string>();
-                int size = 0;
-                var response = await client.GetContainer("TEAMModelOS", "Student").ReadItemStreamAsync(id, new PartitionKey($"Base-{school}"));
-                if (response.Status == 200)
+                /// tmdid, schoolid
+                var userType = "schoolid";
+                if (request.TryGetProperty("userType", out JsonElement usertype))
                 {
-                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                    if (json.RootElement.TryGetProperty("size", out JsonElement _size) && _size.ValueKind == JsonValueKind.Number)
+                    if (!usertype.ValueKind.Equals(JsonValueKind.Undefined) && !usertype.ValueKind.Equals(JsonValueKind.Null) && usertype.ValueKind.Equals(JsonValueKind.String))
                     {
-                        size = _size.GetInt32();
+                        userType = usertype.GetString();
                     }
-                    if (json.RootElement.TryGetProperty("roles", out JsonElement _roles) && _roles.ValueKind != JsonValueKind.Null)
-                    {
-                        foreach (var obj in _roles.EnumerateArray())
-                        {
-                            roles.Add(obj.GetString());
+                }
+                if (string.IsNullOrEmpty(school)) {
+                    if (userType.Equals("tmdid")) {
+                        Teacher teacher = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<Teacher>(id, new PartitionKey("Base"));
+                        if (teacher.schools.IsNotEmpty()) {
+                           var tech= teacher.schools.Find(x => x.status.Equals("join"));
+                            if (tech == null)
+                            {
+                                school = teacher.schools[0].schoolId;
+                            }
+                            else { 
+                                school = tech.schoolId; 
+                            }
                         }
                     }
-                    if (json.RootElement.TryGetProperty("permissions", out JsonElement _permissions) && _permissions.ValueKind != JsonValueKind.Null)
+                }
+                if (!string.IsNullOrEmpty(school))
+                {
+                    object school_base = null;
+                    var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(school, new PartitionKey("Base"));
+                    if (response.Status == 200)
                     {
-                        foreach (var obj in _permissions.EnumerateArray())
+                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                        school_base = json.RootElement.ToObject<object>();
+                    }
+
+                    //取得班级
+                    List<object> school_classes = new List<object>();
+                    await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"SELECT c.id,c.x,c.y,c.name,c.year,c.teacher,c.periodId,c.gradeId,c.room,c.sn,c.no,c.style,c.status,c.openType,c.scope, ARRAY_LENGTH(c.students) AS studCount FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school}") }))
+                    {
+                        var jsonc = await JsonDocument.ParseAsync(item.ContentStream);
+                        foreach (var classeinfo in jsonc.RootElement.GetProperty("Documents").EnumerateArray())
                         {
-                            permissions.Add(obj.GetString());
+                            school_classes.Add(classeinfo.ToObject<object>());
                         }
                     }
-                }
-                else //無此學校資料
-                {
-                    return Ok(new { status = 404 });
-                }
-                if (roles.Count == 0)
-                {
-
-                    roles.Add("student");
-                }
-
-                //TODO JJ,调整为取得学校基础设置数据,取代下方學校學制、年級
-                object school_base = null;
-                response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(school, new PartitionKey("Base"));
-                if (response.Status == 200)
-                {
-                    using var json = await JsonDocument.ParseAsync(response.ContentStream);
-                    school_base = json.RootElement.ToObject<object>();
-                }
-
-                //取得班级
-                List<object> school_classes = new List<object>();
-                await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"SELECT c.id,c.x,c.y,c.name,c.year,c.teacher,c.periodId,c.gradeId,c.room,c.sn,c.no,c.style,c.status,c.openType,c.scope, ARRAY_LENGTH(c.students) AS studCount FROM c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school}") }))
-                {
-                    var jsonc = await JsonDocument.ParseAsync(item.ContentStream);
-                    foreach (var classeinfo in jsonc.RootElement.GetProperty("Documents").EnumerateArray())
+                    //取得教室
+                    List<Room> school_rooms = new List<Room>();
+                    await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Room>(queryText: $"select value(c) from c ",
+                    requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Room-{school}") }))
                     {
-                        school_classes.Add(classeinfo.ToObject<object>());
+                        school_rooms.Add(item);
                     }
+
+                    return Ok(new { school_base, school_classes, school_rooms, status = 200 });
                 }
-                //取得教室
-                List<Room> school_rooms = new List<Room>();
-                await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Room>(queryText: $"select value(c) from c ",
-                requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"Room-{school}") }))
-                {
-                    school_rooms.Add(item);
+                else {
+                    return Ok(new { status = 404 }); ;
                 }
-
-                return Ok(new { school_base, school_classes, school_rooms, status = 200 });
             }
             catch (CosmosException ex)
             {