Jelajahi Sumber

1.個人評量追加統測活動顯示限制 2.追加個人權限架構 3.統測活動顯示根據個人權限限制連動顯示

jeff 9 bulan lalu
induk
melakukan
087c70f970

+ 1 - 0
TEAMModelOS.SDK/Models/Cosmos/Teacher/Teacher.cs

@@ -28,6 +28,7 @@ namespace TEAMModelOS.SDK.Models
 
 
         public string lang { get; set; }
         public string lang { get; set; }
         public double timezone { get; set; } = 8;
         public double timezone { get; set; } = 8;
+        public List<string> permission { get; set; } = new List<string>(); //老師個人權限
 
 
         public class LoginInfo
         public class LoginInfo
         {
         {

+ 2 - 1
TEAMModelOS.SDK/Models/Service/JointService.cs

@@ -106,7 +106,8 @@ namespace TEAMModelOS.SDK.Models.Service
                             actExamInfo.endTime = jointExam.endTime;
                             actExamInfo.endTime = jointExam.endTime;
                             ///是否重複作答
                             ///是否重複作答
                             actExamInfo.overwriteDisable = (jointExam.examOverwrite.Equals(false)) ? true : false;
                             actExamInfo.overwriteDisable = (jointExam.examOverwrite.Equals(false)) ? true : false;
-
+                            ///(前端)是否可見 ※只有決賽不可見
+                            actExamInfo.jointVisiable = (jointExam.examType.Equals("custom")) ? false : true;
                             examList.Add(actExamInfo);
                             examList.Add(actExamInfo);
                         }
                         }
                     }
                     }

+ 2 - 1
TEAMModelOS/ClientApp/public/lang/en-US.js

@@ -3117,7 +3117,8 @@ const LANG_EN_US = {
             dataErr: 'Assessment data has anomalies',
             dataErr: 'Assessment data has anomalies',
             goingNoData: 'Assessment is in progress, statistics cannot be viewed',
             goingNoData: 'Assessment is in progress, statistics cannot be viewed',
             pendingNoData: 'The assessment has not started yet, so cannot check the statistics',
             pendingNoData: 'The assessment has not started yet, so cannot check the statistics',
-            paperErr: 'Exam file data has anomalies'
+            paperErr: 'Exam file data has anomalies',
+            eventNotVisible: 'Assessment is not yet open, data cannot be viewed',
         },
         },
 
 
         mark: {
         mark: {

+ 2 - 1
TEAMModelOS/ClientApp/public/lang/zh-CN.js

@@ -3116,7 +3116,8 @@ const LANG_ZH_CN = {
             dataErr: '评测数据异常',
             dataErr: '评测数据异常',
             goingNoData: '评测进行中,无法查看统计数据',
             goingNoData: '评测进行中,无法查看统计数据',
             pendingNoData: '评测暂未发布,无法查看统计数据',
             pendingNoData: '评测暂未发布,无法查看统计数据',
-            paperErr: '试卷数据异常'
+            paperErr: '试卷数据异常',
+            eventNotVisible: '活动评量尚未开放,无法查看数据',
         },
         },
 
 
         mark: {
         mark: {

+ 2 - 1
TEAMModelOS/ClientApp/public/lang/zh-TW.js

@@ -3119,7 +3119,8 @@ const LANG_ZH_TW = {
             dataErr: '評量數據異常',
             dataErr: '評量數據異常',
             goingNoData: '評量進行中,無法查看統計數據',
             goingNoData: '評量進行中,無法查看統計數據',
             pendingNoData: '評量暫未發布,無法查看統計數據',
             pendingNoData: '評量暫未發布,無法查看統計數據',
-            paperErr: '試卷數據異常'
+            paperErr: '試卷數據異常',
+            eventNotVisible: '活動評量尚未開放,無法查看數據',
         },
         },
 
 
         mark: {
         mark: {

+ 6 - 0
TEAMModelOS/ClientApp/src/api/login.js

@@ -284,4 +284,10 @@ export default {
 		}
 		}
 		return corePost(url + '/oauth2/login', data)
 		return corePost(url + '/oauth2/login', data)
 	},
 	},
+	/*
+	 *取得教師個人權限
+	 */
+	getTeacherPermission: function (data) {
+		return post('/teacher/init/get-teacher-permission', data)
+	},
 }
 }

+ 7 - 6
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -160,7 +160,8 @@
 				hasAnalysisAuth: false,
 				hasAnalysisAuth: false,
 				isShowArtMenu: false,
 				isShowArtMenu: false,
 				versionsPast: true,
 				versionsPast: true,
-				hasArtProd: false
+				hasArtProd: false,
+				privatePermission: [] //個人權限
 			};
 			};
 		},
 		},
 		created() {
 		created() {
@@ -1611,18 +1612,18 @@
 								icon: "iconfont icon-yishu",
 								icon: "iconfont icon-yishu",
 								name: this.$t("system.menu.unifiedPurchasingPlatform"),
 								name: this.$t("system.menu.unifiedPurchasingPlatform"),
 								router: "",
 								router: "",
-								role: "teacher|admin",
-								permission: "",
+								role: "",
+                                permission: "read-joint-event|admin-joint-event",
 								subName: "unifiedPurchasingPlatform",
 								subName: "unifiedPurchasingPlatform",
-								isShow: this.IES5Menu && this.isGlobalSite,
+                                isShow: this.IES5Menu && this.isGlobalSite,
 								child: [
 								child: [
 									{
 									{
 										icon: "iconfont icon-basic-setting",
 										icon: "iconfont icon-basic-setting",
 										name: this.$t("system.menu.eventManagement"),
 										name: this.$t("system.menu.eventManagement"),
 										router: "/home/htMgtHome",
 										router: "/home/htMgtHome",
 										tag: "",
 										tag: "",
-										role: "teacher|admin",
-										permission: "",
+										role: "",
+                                        permission: "admin-joint-event",
 										menuName: "eventManagement",
 										menuName: "eventManagement",
 										isShow: true
 										isShow: true
 									},
 									},

+ 6 - 0
TEAMModelOS/ClientApp/src/store/module/user.js

@@ -640,6 +640,12 @@ export default {
                 let authBySchool = jwtDecode(result.auth_token)
                 let authBySchool = jwtDecode(result.auth_token)
                 info.roles = authBySchool.roles
                 info.roles = authBySchool.roles
                 info.permissions = authBySchool.permissions == null ? [] : authBySchool.permissions
                 info.permissions = authBySchool.permissions == null ? [] : authBySchool.permissions
+                // 取得老師個人權限
+                await apiTools.login.getTeacherPermission().then(res => {
+                    if (res.length > 0) {
+                        info.permissions = info.permissions.concat(res)
+                    }
+                })
 
 
                 let userInfo = JSON.parse(decodeURIComponent(sessionStorage.getItem('userInfo'), "utf-8"))
                 let userInfo = JSON.parse(decodeURIComponent(sessionStorage.getItem('userInfo'), "utf-8"))
                 userInfo.roles = info.roles
                 userInfo.roles = info.roles

+ 7 - 2
TEAMModelOS/ClientApp/src/view/learnactivity/tabs/AnswerTable.vue

@@ -1,6 +1,7 @@
 <template>
 <template>
 	<div class="answer-table-container">
 	<div class="answer-table-container">
-		<vuescroll v-show="!isMarkView">
+		<TipsInfo v-if="isJointExam && !jointVisiable" :msg="$t('learnActivity.simple.eventNotVisible')" style="background:white;height:100%;"></TipsInfo>
+		<vuescroll v-else v-show="!isMarkView">
 			<!-- 概要数字统计-->
 			<!-- 概要数字统计-->
 			<div class="data-count-wrap">
 			<div class="data-count-wrap">
 				<!-- 班级人数 -->
 				<!-- 班级人数 -->
@@ -337,7 +338,9 @@
 				quCount: [],
 				quCount: [],
 				paperInfo: {},
 				paperInfo: {},
 				students: [],
 				students: [],
-				routerScope: ""
+				routerScope: "",
+				isJointExam: false,
+                jointVisiable: false,
 			};
 			};
 		},
 		},
 		computed: {
 		computed: {
@@ -492,6 +495,8 @@
 							// this.$Message.error('API Error')
 							// this.$Message.error('API Error')
 						}
 						}
 					);
 					);
+                    this.isJointExam = (n.jointExamId && typeof n.jointExamId === "string" && n.jointExamId.length > 0) ? true : false
+                    this.jointVisiable = n.jointVisiable
 				},
 				},
 				deep: true,
 				deep: true,
 				immediate: true
 				immediate: true

+ 16 - 3
TEAMModelOS/ClientApp/src/view/learnactivity/tabs/CloudDAS.vue

@@ -1,8 +1,9 @@
 <template>
 <template>
   <div class="cloudas-container">
   <div class="cloudas-container">
     <Spin size="large" v-if="!showAnalysis" style="display: flex;justify-content: center;margin-top:100px"></Spin>
     <Spin size="large" v-if="!showAnalysis" style="display: flex;justify-content: center;margin-top:100px"></Spin>
-    <EmptyData v-if="showAnalysis && isEmpty" :top="120"></EmptyData>
-    <div class="cloudas-content" v-if="showAnalysis && !isEmpty">
+    <EmptyData v-else-if="showAnalysis && isEmpty" :top="120"></EmptyData>
+    <TipsInfo v-else-if="isJointExam && !jointVisiable" :msg="$t('learnActivity.simple.eventNotVisible')" style="background:white;height:100%;">{{currentExamItem.id}}{{isJointExam}}{{jointVisiable}}</TipsInfo>
+    <div class="cloudas-content" v-else-if="showAnalysis && !isEmpty">
       <vuescroll ref="vs">
       <vuescroll ref="vs">
         <div class="basic-info">
         <div class="basic-info">
           <p style="display: flex;align-items: center;">
           <p style="display: flex;align-items: center;">
@@ -81,6 +82,8 @@ export default {
       currentScatterClass: 0,
       currentScatterClass: 0,
       curWarningSubjectIndex: 0,
       curWarningSubjectIndex: 0,
       classList: [],
       classList: [],
+      isJointExam: false, //是否為統測活動評量
+      jointVisiable: false //統測活動是否可見
     }
     }
   },
   },
   created() {
   created() {
@@ -98,7 +101,7 @@ export default {
       })
       })
     },
     },
     initAnalysisJson(evInfo) {
     initAnalysisJson(evInfo) {
-      console.error(evInfo)
+        console.error('evInfo', evInfo)
       // 如果评测活动还没有结束 或者 cloudas为false 则不显示诊断分析数据
       // 如果评测活动还没有结束 或者 cloudas为false 则不显示诊断分析数据
       if (evInfo.progress !== 'finish' || !evInfo.cloudas) {
       if (evInfo.progress !== 'finish' || !evInfo.cloudas) {
         this.showAnalysis = true
         this.showAnalysis = true
@@ -108,6 +111,16 @@ export default {
         this.showAnalysis = false
         this.showAnalysis = false
         this.isEmpty = false
         this.isEmpty = false
       }
       }
+      if (evInfo.jointExamId && typeof evInfo.jointExamId === "string" && evInfo.jointExamId.length > 0) {
+        this.isJointExam = true
+      } else {
+        this.isJointExam = false
+      }
+      if (evInfo.jointVisiable) {
+        this.jointVisiable = true
+      } else {
+        this.jointVisiable = false
+      }
       let item = evInfo
       let item = evInfo
       console.error('切换评测', item, item.name)
       console.error('切换评测', item, item.name)
       this.currentExamItem = item
       this.currentExamItem = item

+ 7 - 2
TEAMModelOS/ClientApp/src/view/learnactivity/tabs/DataView.vue

@@ -1,7 +1,8 @@
 <template>
 <template>
     <div class="data-view-container" :style="{paddingTop:progress && progress === 'finish' && !dataErr? '0px' :'5px'}">
     <div class="data-view-container" :style="{paddingTop:progress && progress === 'finish' && !dataErr? '0px' :'5px'}">
         <!-- 已结束评测 -->
         <!-- 已结束评测 -->
-        <vuescroll ref="chart-container" v-if="progress && progress === 'finish' && !dataErr" @handle-scroll="checkBackTop">
+        <TipsInfo v-if="isJointExam && !jointVisiable" :msg="$t('learnActivity.simple.eventNotVisible')" style="background:white;height:100%;"></TipsInfo>
+        <vuescroll ref="chart-container" v-else-if="progress && progress === 'finish' && !dataErr" @handle-scroll="checkBackTop">
             <!-- 概要数字统计-->
             <!-- 概要数字统计-->
             <div class="data-count-wrap">
             <div class="data-count-wrap">
                 <!-- 学科统计 -->
                 <!-- 学科统计 -->
@@ -170,7 +171,9 @@ export default {
     data() {
     data() {
         return {
         return {
             progress: 'finish',//评测状态
             progress: 'finish',//评测状态
-            showBack:false
+            showBack: false,
+            isJointExam: false, //是否為統測活動評量
+            jointVisiable: false //統測活動是否可見
         }
         }
     },
     },
     computed: {
     computed: {
@@ -347,6 +350,8 @@ export default {
             handler(n, o) {
             handler(n, o) {
                 if (n) {
                 if (n) {
                     this.progress = n.progress
                     this.progress = n.progress
+                    this.isJointExam = (n.jointExamId && typeof n.jointExamId === "string" && n.jointExamId.length > 0) ? true : false
+                    this.jointVisiable = n.jointVisiable
                 }
                 }
             }
             }
         }
         }

+ 17 - 2
TEAMModelOS/ClientApp/src/view/learnactivity/tabs/ExamPaper.vue

@@ -1,6 +1,7 @@
 <template>
 <template>
     <div class="exam-paper-container">
     <div class="exam-paper-container">
-        <vuescroll ref="exam-paper-wrap" @handle-scroll="checkBackTop">
+        <TipsInfo v-if="isJointExam && !jointVisiable" :msg="$t('learnActivity.simple.eventNotVisible')" style="background:white;height:100%;"></TipsInfo>
+        <vuescroll v-else ref="exam-paper-wrap" @handle-scroll="checkBackTop">
             <div class="subjects-wrap" v-if="examInfo && examInfo.subjects && examInfo.owner == 'school' && !examInfo.examPaperErr">
             <div class="subjects-wrap" v-if="examInfo && examInfo.subjects && examInfo.owner == 'school' && !examInfo.examPaperErr">
                 <span>{{$t('learnActivity.mgtScEv.evSubject')}}</span>
                 <span>{{$t('learnActivity.mgtScEv.evSubject')}}</span>
                 <RadioGroup v-model="curSubIndex" type="button" button-style="solid">
                 <RadioGroup v-model="curSubIndex" type="button" button-style="solid">
@@ -57,7 +58,9 @@ export default {
                     name: '数学',
                     name: '数学',
                     id: '2'
                     id: '2'
                 }
                 }
-            ]
+            ],
+            isJointExam: false, //是否為統測活動評量
+            jointVisiable: false //統測活動是否可見
         }
         }
     },
     },
     created(){
     created(){
@@ -86,6 +89,18 @@ export default {
                 this.showBack = false
                 this.showBack = false
             }
             }
         },
         },
+    },
+    watch: {
+        examInfo: {
+            deep: true,
+            immediate: true,
+            handler(n, o) {
+                if (n) {
+                    this.isJointExam = (n.jointExamId && typeof n.jointExamId === "string" && n.jointExamId.length > 0) ? true : false
+                    this.jointVisiable = n.jointVisiable
+                }
+            }
+        }
     }
     }
 }
 }
 </script>
 </script>

+ 23 - 0
TEAMModelOS/Controllers/Teacher/InitController.cs

@@ -1501,6 +1501,29 @@ namespace TEAMModelOS.Controllers
             }
             }
         }
         }
 
 
+        //取得教師權限
+        [ProducesDefaultResponseType]
+        [Authorize(Roles = "IES")]
+        [HttpPost("get-teacher-permission")]
+        public async Task<IActionResult> GetTeacherPermission()
+        {
+            List<string> permission = new List<string>();
+            try
+            {
+                string authtoken = HttpContext.GetXAuth("AuthToken");
+                if (string.IsNullOrEmpty(authtoken)) return Ok(permission);
+                var jwt = new JwtSecurityToken(authtoken);
+                var id = jwt.Payload.Sub;
+                var client = _azureCosmos.GetCosmosClient();
+                Teacher teacher = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>(id, new PartitionKey("Base"));
+                permission = teacher.permission;
+            }
+            catch (Exception ex)
+            {
+            }
+            return Ok(permission);
+        }
+
         //課綱的model先記在下面,待式樣確定後再轉換
         //課綱的model先記在下面,待式樣確定後再轉換
         private List<SyllabusNode> CreateSyllabusTree(List<Syllabus> syllabuses)
         private List<SyllabusNode> CreateSyllabusTree(List<Syllabus> syllabuses)
         {
         {