Browse Source

Merge branch 'louise' into Vue_UnitTest

Louise lin 2 năm trước cách đây
mục cha
commit
1dc116abd0

+ 77 - 0
HiTeachCC/ClientApp/src/components/AddImgBox.vue

@@ -387,11 +387,82 @@ export default {
         }
       })
     },
+    //FromTA 九宮格
+    async addTAImgObj(url, i, length) {
+      console.log(length)
+
+      let colume
+      let row = Math.ceil(length / 3)
+
+      if (length == 1) colume = 1 
+      else if (length == 4 || length == 2) colume = 2
+      else colume = 3
+
+      let that = this
+      let blobUrl = this.classInfo.blob
+      let stage = this.$store.state.stage
+      let layer = this.$store.state.layer
+      let stageX = parseInt(stage.width() / colume)
+      let stageY = parseInt(stage.height() / row)
+
+      let fileUrl = url
+      // console.log(fileUrl)
+      // console.log(stage)
+      that.$q.loading.show()
+
+      let mockLayer = {
+        width: () => { return stageX },
+        height: () => { return stageY }
+      }
+
+      await Konva.Image.fromURL(fileUrl + '?' + blobUrl.sas_read, function (image) {
+        let scaleRatio = that.ratioCalc(image, mockLayer)
+        let scaleX = Number(20+ stageX/2-image.width() * scaleRatio/2 + (i % colume) * stageX)
+        let scaleY = Number(10+ stageY/2-image.height() * scaleRatio/2 + parseInt(i /(length == 4?2:3)) * stageY)
+
+        // image is Konva.Image instance
+        image.setAttrs({
+          x: stage.getAbsoluteTransform().copy().invert().point({ x: scaleX, y: scaleY }).x,
+          y: stage.getAbsoluteTransform().copy().invert().point({ x: scaleX, y: scaleY }).y,
+          width: image.width() * scaleRatio * 0.8,
+          height: image.height() * scaleRatio * 0.8,
+          draggable: true,
+          src: fileUrl
+        })
+
+        // stage.find('Transformer').destroy()
+        let tr = new Konva.Transformer({
+          anchorStroke: '#00a6ff',
+          anchorFill: '#fff',
+          anchorSize: 12,
+          anchorCornerRadius: 5,
+          anchorStrokeWidth: 2,
+          borderStroke: '#6ac9fc',
+          borderStrokeWidth: 2,
+          borderDash: [3, 3],
+          padding: 10,
+          name: 'default'
+        })
+        stage.find('Transformer').forEach(function (ele, i) {
+          if (ele.attrs.name == 'default') {
+            ele.destroy()
+          }
+        })
+        layer.add(image)
+        layer.add(tr)
+        tr.nodes([image])
+        that.$parent.addMenuBtnToTr(tr, image)
+        layer.draw()
+        that.$q.loading.hide()
+      })
+    },
 
     //加入HTML連結圖片,來源跨域檔的話無法貼
     addHTMLImgObjFromClipBoard(Imgurl) {
+      return new Promise((r,j)=>{
       let that=this
       let layer = this.$store.state.layer
+      let stage = this.$store.state.stage
       let imageObj = new Image()
       imageObj.setAttribute('crossOrigin', 'anonymous')
       let finallink = Imgurl
@@ -427,9 +498,15 @@ export default {
         tr.nodes([image])
         that.$parent.addMenuBtnToTr(tr, image) 
         layer.batchDraw()
+        r(200)
+      }
+      imageObj.onerror =function(){
+        j('err')
       }
       imageObj.src = finallink
       this.$store.state.showAddImgBox = false
+      })
+      
     },
     //剪貼簿文字
     addTextBox(target) {

+ 1 - 1
HiTeachCC/ClientApp/src/components/Card.vue

@@ -4,7 +4,7 @@
       <div class="tl" :style="styleObject">
         <!--<q-dialog v-model="styleObject.isShow" @hide="handleHide" @show="handleShow">-->
         <!--<q-card :style="styleObject">-->
-        <OptionView v-if="conIndex == 1" @styleObjScreen="getMsgFormSon" @close="getclose"></OptionView>
+        <OptionView v-if="conIndex == 1" @styleObjScreen="getMsgFormSon" @close="getclose" ref='optionView'></OptionView>
         <Bar v-else-if="conIndex == 4"></Bar>
         <Pie v-else-if="conIndex == 5"></Pie>
         <Question v-else-if="conIndex == 6"></Question>

+ 3 - 3
HiTeachCC/ClientApp/src/components/Chart/Bar.vue

@@ -199,7 +199,7 @@ export default {
       let color = this.defaultcolor
       if (this.AnswerValuebox) {
         let rightanswer = this.transRightAnsNum(this.AnswerValuebox[0])
-        color.splice(rightanswer, rightanswer, '#6da031')
+        color.splice(rightanswer, 1, '#6da031')
       } else {
         this.BarData = this.$store.state.echartbaranswer
       }
@@ -217,7 +217,7 @@ export default {
 
         // console.log(rightanswer, '答案数字')
         theColor = ['#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762']
-        theColor.splice(rightanswer, rightanswer, '#6da031')
+        theColor.splice(rightanswer, 1, '#6da031')
       }
       let echartsanswer = this.$store.state.echartbaranswer
 
@@ -244,7 +244,7 @@ export default {
         let rightanswer = this.transRightAnsNum(newVal)
 
         theColor = ['#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762', '#fc5762']
-        theColor.splice(rightanswer, rightanswer, '#6da031')
+        theColor.splice(rightanswer, 1, '#6da031')
       }
       let echartsanswer = this.$store.state.echartbaranswer
 

+ 1 - 1
HiTeachCC/ClientApp/src/components/Chart/OptionView.vue

@@ -51,7 +51,7 @@
           <div :title="$t('board.optionView.設定答案')" v-show="currentIRS() == 'irsImmediately'" :class="['listicon', current === 'num' ? 'clickicon' : '']" v-if="AnswerIconstyle === 'letter'"><svg-icon icon-class="setAnsNew" /></div>
           <div :title="$t('board.optionView.設定答案')" v-show="currentIRS() == 'irsImmediately'" :class="['listicon', current === 'num' ? 'clickicon' : '']" v-if="AnswerIconstyle === 'number'"><svg-icon icon-class="setAnsNew" /></div>
           <div class="api" slot="content">
-            <Result @poptipwidth="getpoptipwidth" @closeResultPop="closeResultPop" />
+            <Result @poptipwidth="getpoptipwidth" @closeResultPop="closeResultPop" ref='ansResult' />
           </div>
         </Poptip>
         <div :title="$t('board.optionView.設定答案')" class="listicon" v-show="currentIRS() == 'irsText'" @click="openSetTextAnspop()"><svg-icon icon-class="setAnsNew" /></div>

+ 159 - 67
HiTeachCC/ClientApp/src/components/ToolBox.vue

@@ -39,7 +39,7 @@
               <svg-icon v-if="shapeTypeIcon == 'shapes' || shapeTypeIcon == ''" icon-class="shap" class="stroke-icon" />
               <svg-icon v-if="shapeType == 'long-arrow-alt-right' && shapeTypeIcon != 'shapes'" icon-class="add_arrow2" class="fill-icon" />
               <q-icon v-else-if="shapeTypeIcon == 'trending_flat' || shapeTypeIcon == 'remove'" :name="shapeTypeIcon" style="transform: rotate(-45deg)" />
-              <q-icon v-else-if="shapeType == 'ellipse'" style="transform: scaleX(1.2);" :name="shapeTypeIcon" />
+              <q-icon v-else-if="shapeType == 'ellipse'" style="transform: scaleX(1.2)" :name="shapeTypeIcon" />
               <q-icon v-if="shapeType != 'long-arrow-alt-right' && shapeType != 'ellipse' && shapeType != 'line'" :name="shapeTypeIcon" />
             </span>
 
@@ -255,7 +255,7 @@
       </div>
     </div>
 
-    <Card :styleObj="styleObj" :componentIndex="componentIndex" v-if="isShowCard"></Card>
+    <Card :styleObj="styleObj" :componentIndex="componentIndex" v-if="isShowCard" ref="card"></Card>
   </div>
 </template>
 
@@ -316,12 +316,14 @@ export default {
       students: this.$store.state.students,
       irsModel: this.$store.state.irsModel,
       preventfastChangePage: false,
-      preventfastChangePageTimeOut:'',
+      preventfastChangePageTimeOut: '',
       irsToolPopVisible: false,
       zoomPopVisible: false,
       penPopVisible: false,
       shapePopVisible: false,
       isSendIRS: false, //避免doubled click,
+      waitingCopyPageTimer: '',
+      skipCopyPageAskbyTA: false,
       //存放Undo動作
       undoHistory:[],
       doUndoIndex:0,
@@ -614,9 +616,9 @@ export default {
     //判斷是否要加推送畫面,上傳畫面,搭配作品收集,單選題文字題
     async genePushStageImg() {
       let layer = this.$store.state.layer
-      if(layer.children.length>0){
-      await this.pushStageImg()
-    }
+      if (layer.children.length > 0) {
+        await this.pushStageImg()
+      }
     },
     dataURLtoFile(dataurl, filename) {
       const arr = dataurl.split(',')
@@ -694,34 +696,34 @@ export default {
     },
     zoomToDefault() {
       this.$store.state.zoomType = 'same'
-      if(this.$store.state.zoom==1){
-      //Board原本用Watch無偵測改變,直接處理歸位
-      let zoom=  this.$store.state.zoom
-      let stage= this.$store.state.stage
-      stage.absolutePosition({
+      if (this.$store.state.zoom == 1) {
+        //Board原本用Watch無偵測改變,直接處理歸位
+        let zoom = this.$store.state.zoom
+        let stage = this.$store.state.stage
+        stage.absolutePosition({
           x: (-stage.width() / 2) * (zoom - 1),
           y: (-stage.height() / 2) * (zoom - 1)
         })
-      stage.position({
+        stage.position({
           x: (-stage.width() / 2) * (zoom - 1),
           y: (-stage.height() / 2) * (zoom - 1)
         })
-      stage.batchDraw()
-      }else{
+        stage.batchDraw()
+      } else {
         //跳到Board原本用Watch處理ZoomFunc
-         this.$store.state.zoom = 1
+        this.$store.state.zoom = 1
       }
     },
     async irsstart(name) {
       // console.log(this.$parent.irshint)
       if (this.isSendIRS == false && this.currentstudents() != '') {
-        if (this.$store.state.irsModel!='normal') {
+        if (this.$store.state.irsModel != 'normal') {
           if (name === 'irsGather' && this.$store.state.workNum == this.limitCollate) {
             this.$Message.info(this.$t("board['無法使用,已達您的權限作品收集數上限']") + ':' + this.limitCollate)
           } else {
             await this.addNew()
             this.$Message.info(this.$t("board.toolbox['此页已有题目,自動新增一页开启互动']"))
-            this.$store.state.isShowAskCopyPage = true
+            if (!this.skipCopyPageAskbyTA) this.$store.state.isShowAskCopyPage = true
             this.$store.state.isShowAskCopyPageIRSName = name
             this.$store.state.isLightPieChart = false
             this.$parent.irshint = true
@@ -732,7 +734,7 @@ export default {
         } else {
           this.$parent.opennewpage()
 
-          let that=this
+          let that = this
           let times = new Date().getTime()
           //关于irs即问即答和文字
           let msgInitiative = {
@@ -747,7 +749,6 @@ export default {
           if (name === 'irs') {
             console.log(this.$parent, '父级内容')
             this.handleFan()
-            
 
             this.$store.state.irsModel = 'irsImmediately'
 
@@ -758,18 +759,18 @@ export default {
             //  this.$store.state.beforeSaveStageGenID=true
 
             this.$parent.singnalRMessage(msgInitiative, '8888', '', 'irsImmediately')
-            setTimeout(()=>{
-               that.genePushStageImg()
-               that.$store.state.timeLineEvent.push({
-                  "Time":  (Math.floor(Date.now()) - that.$store.state.startTime)/1000,
-                  "Pgid": that.$parent.nowpageRender.nowpageIds,
-                  "EventId": 786435,
-                  "Event": "PopQuesLoad",
-                  "PopOpitonCount": 9
-                })
-            },1000)
+            setTimeout(() => {
+              that.genePushStageImg()
+              that.$store.state.timeLineEvent.push({
+                Time: (Math.floor(Date.now()) - that.$store.state.startTime) / 1000,
+                Pgid: that.$parent.nowpageRender.nowpageIds,
+                EventId: 786435,
+                Event: 'PopQuesLoad',
+                PopOpitonCount: 9
+              })
+            }, 1000)
             //儲存mqttIoTData,有使用互動
-            this.$store.state.mqtt.mqttIoTData.IRSType_Interact=1
+            this.$store.state.mqtt.mqttIoTData.IRSType_Interact = 1
             this.$store.dispatch('mqtt/saveMqttIoTsessionStorage')
 
             this.$parent.irshint = false
@@ -780,18 +781,18 @@ export default {
             // this.$parent.irsModel = 'irsText'
             // this.$store.state.beforeSaveStageGenID=true
             this.$parent.singnalRMessage(msgInitiative, '8888', '', 'irsText')
-            setTimeout(()=>{
-               that.genePushStageImg()
-               that.$store.state.timeLineEvent.push({
-                  "Time":  (Math.floor(Date.now()) - that.$store.state.startTime)/1000,
-                  "Pgid": that.$parent.nowpageRender.nowpageIds,
-                  "EventId": 786435,
-                  "Event": "PopQuesLoad",
-                  "PopOpitonCount": 9
-                })
-            },1000)
+            setTimeout(() => {
+              that.genePushStageImg()
+              that.$store.state.timeLineEvent.push({
+                Time: (Math.floor(Date.now()) - that.$store.state.startTime) / 1000,
+                Pgid: that.$parent.nowpageRender.nowpageIds,
+                EventId: 786435,
+                Event: 'PopQuesLoad',
+                PopOpitonCount: 9
+              })
+            }, 1000)
             //儲存mqttIoTData,有使用互動
-            this.$store.state.mqtt.mqttIoTData.IRSType_Interact=1
+            this.$store.state.mqtt.mqttIoTData.IRSType_Interact = 1
             this.$store.dispatch('mqtt/saveMqttIoTsessionStorage')
 
             this.$parent.irshint = false
@@ -800,19 +801,19 @@ export default {
             this.$store.state.irsModel = 'irsBuzz'
             this.$parent.isOpenBuzzPop = true
             this.$store.state.buzzInStudents = []
-            setTimeout(()=>{
+            setTimeout(() => {
               that.$store.state.timeLineEvent.push({
-                "Time":  (Math.floor(Date.now()) - that.$store.state.startTime)/1000,
-                "Pgid": that.$parent.nowpageRender.nowpageIds,
-                "EventId": 786458,
-                "Event": "BuzrAns",
+                Time: (Math.floor(Date.now()) - that.$store.state.startTime) / 1000,
+                Pgid: that.$parent.nowpageRender.nowpageIds,
+                EventId: 786458,
+                Event: 'BuzrAns'
               })
-            },1000)
+            }, 1000)
             this.$parent.singnalRMessage(msgInitiative, '8888', '', 'irsBuzz')
             // this.$store.state.beforeSaveStageGenID=true
 
             //儲存mqttIoTData,有使用互動
-            this.$store.state.mqtt.mqttIoTData.IRSType_Interact=1
+            this.$store.state.mqtt.mqttIoTData.IRSType_Interact = 1
             this.$store.dispatch('mqtt/saveMqttIoTsessionStorage')
 
             this.$parent.irshint = false
@@ -828,18 +829,18 @@ export default {
             // this.$store.state.beforeSaveStageGenID = true
 
             this.$parent.singnalRMessage(msgInitiative, '8888', '', 'irsGather')
-            setTimeout(()=>{
-                that.genePushStageImg()
-                that.$store.state.timeLineEvent.push({
-                  "Time":  (Math.floor(Date.now()) - that.$store.state.startTime)/1000,
-                  "Pgid": that.$parent.nowpageRender.nowpageIds,
-                  "EventId": 917505,
-                  "Event": "WrkSpaceLoad"
-                })
-            },1000)
+            setTimeout(() => {
+              that.genePushStageImg()
+              that.$store.state.timeLineEvent.push({
+                Time: (Math.floor(Date.now()) - that.$store.state.startTime) / 1000,
+                Pgid: that.$parent.nowpageRender.nowpageIds,
+                EventId: 917505,
+                Event: 'WrkSpaceLoad'
+              })
+            }, 1000)
 
             //儲存mqttIoTData,有使用作品任務
-            this.$store.state.mqtt.mqttIoTData.IRSType_CollateTask=1
+            this.$store.state.mqtt.mqttIoTData.IRSType_CollateTask = 1
             this.$store.dispatch('mqtt/saveMqttIoTsessionStorage')
 
             this.$parent.irshint = false
@@ -852,6 +853,7 @@ export default {
         setTimeout(() => {
           this.isSendIRS = false
         }, 1000)
+        clearTimeout(this.waitingCopyPageTimer)
       }
       if (this.currentstudents() == '') {
         this.$Message.info(this.$t("board.toolbox['IRS沒有學生提示訊息']"))
@@ -886,7 +888,7 @@ export default {
     },
     // 挑人
     handlePick() {
-      this.$store.state.turnTableMode='Normal'
+      this.$store.state.turnTableMode = 'Normal'
       this.$emit('handleToolPick', 1)
       document.body.classList.remove('cursor-fdj')
       this.$parent.mode = 'check'
@@ -961,8 +963,8 @@ export default {
     },
     //下一页
     async nextPage() {
-       let that=this
-      if(this.preventfastChangePage) return
+      let that = this
+      if (this.preventfastChangePage) return
       if (this.$store.state.isRenderingPDFNow == false) {
         clearTimeout(this.preventfastChangePageTimeOut)
         this.closeFan()
@@ -989,7 +991,7 @@ export default {
           this.$q.loading.show()
         }
         //控制最快只能1秒切一頁,太快切換會造成舞台渲染側邊欄縮圖不正確
-        this.preventfastChangePageTimeOut=setTimeout(() => {
+        this.preventfastChangePageTimeOut = setTimeout(() => {
           that.$q.loading.hide()
           that.preventfastChangePage = false
         }, 600)
@@ -997,8 +999,8 @@ export default {
     },
     //上一页
     async previousPage() {
-      let that=this
-      if(this.preventfastChangePage) return
+      let that = this
+      if (this.preventfastChangePage) return
       if (this.$store.state.isRenderingPDFNow == false) {
         clearTimeout(this.preventfastChangePageTimeOut)
         this.closeFan()
@@ -1024,7 +1026,7 @@ export default {
           this.$q.loading.show()
         }
         //控制最快只能1秒切一頁,太快切換會造成舞台渲染側邊欄縮圖不正確
-        this.preventfastChangePageTimeOut=setTimeout(() => {
+        this.preventfastChangePageTimeOut = setTimeout(() => {
           that.$q.loading.hide()
           that.preventfastChangePage = false
         }, 600)
@@ -1039,6 +1041,96 @@ export default {
     },
     hb() {
       document.body.classList.remove('cursor-fdj')
+    },
+    boardCtrlbyTA(BoardAction) {
+      console.log(BoardAction, 'Board.Ctrl!')
+      switch (BoardAction) {
+        case 'Up': {
+          this.previousPage()
+          break
+        }
+        case 'Down': {
+          this.nextPage()
+          break
+        }
+        case 'Add': {
+          this.addNew()
+          break
+        }
+        case 'PagePush': {
+          this.pushStageImg()
+          break
+        }
+      }
+    },
+    irsCtrlbyTA(irsPayload) {
+      console.log(irsPayload, 'IRS.Ctrl!')
+      let irsName = ''
+      let waitingPopupTimer
+      clearTimeout(waitingPopupTimer)
+      switch (irsPayload.action) {
+        case 'Quiz': {
+          irsName = 'irs'
+          this.callIrsStartByTA(irsName)
+          break
+        }
+        case 'Flip': {
+          if (this.$store.state.irsModel == 'irsImmediately' && !this.styleObj.isShow) this.popuphd()
+          waitingPopupTimer = setTimeout(() => {
+            if (this?.$refs?.card?.$refs?.optionView) this?.$refs?.card?.$refs?.optionView.listbtn('default')
+          }, 200)
+          break
+        }
+        case 'Quiz_Buzz': {
+          irsName = 'irsBuzz'
+          if (irsPayload.buzzAction == 'none') this.callIrsStartByTA(irsName)
+          else if (irsPayload.buzzAction == 'Start') {
+            this.$parent.isOpenBuzzPop = true
+            this.$store.state.answervalue != '' ? this.$parent.reStartBuzz() : this.$parent.startBuzz()
+          }
+          break
+        }
+        case 'PieChart': {
+          if (this.$store.state.irsModel == 'irsImmediately' && !this.styleObj.isShow) this.popuphd()
+          waitingPopupTimer = setTimeout(() => {
+            if (this?.$refs?.card?.$refs?.optionView) this?.$refs?.card?.$refs?.optionView.listbtn('pie')
+          }, 200)
+          break
+        }
+        case 'BarChart': {
+          if (this.$store.state.irsModel == 'irsImmediately' && !this.styleObj.isShow) this.popuphd()
+          waitingPopupTimer = setTimeout(() => {
+            if (this?.$refs?.card?.$refs?.optionView) this?.$refs?.card?.$refs?.optionView.listbtn('bar')
+          }, 200)
+          break
+        }
+        case 'SetAnswer': {
+          if (this.$store.state.irsModel == 'irsImmediately' && !this.styleObj.isShow) this.popuphd()
+          waitingPopupTimer = setTimeout(() => {
+            if (this?.$refs?.card?.$refs?.optionView?.$refs.ansResult) {
+              const numbtndata = this.$refs.card.$refs.optionView.$refs.ansResult.numbtndata
+              const btnIndex = numbtndata.findIndex(item => this.$store.state.currentAnsOption=='En'?item.english == irsPayload.answerList[0]:item.num == irsPayload.answerList[0])
+              console.log(irsPayload)
+              this?.$refs?.card?.$refs?.optionView?.$refs.ansResult.ClickAnswer(this.$store.state.currentAnsOption=='En'?numbtndata[btnIndex].english:numbtndata[btnIndex].num, btnIndex, numbtndata[btnIndex].classname)
+            }
+          }, 200)
+          break
+        }
+        case 'SwitchSize': {
+          this.controlView()
+          break
+        }
+      }
+    },
+    callIrsStartByTA(irsName) {
+      if (this.$store.state.irsModel != 'normal') this.skipCopyPageAskbyTA = true
+      this.irsstart(irsName)
+      this.waitingCopyPageTimer = setTimeout(() => {
+        if (this.skipCopyPageAskbyTA) {
+          this.$parent.copyPageIRSAct()
+          this.skipCopyPageAskbyTA = false
+        }
+      }, 200)
     }
   },
   created() {},
@@ -1046,8 +1138,8 @@ export default {
      Vue.prototype.$toolbox = this
   },
   computed: {
-   ...mapGetters({
-      classInfo: 'classInfo/getInfo', // 取得課堂設定
+    ...mapGetters({
+      classInfo: 'classInfo/getInfo' // 取得課堂設定
     }),
     watchUrl() {
       return this.$store.state.penType

+ 405 - 185
HiTeachCC/ClientApp/src/views/Board.vue

@@ -760,7 +760,8 @@ export default {
       showClassNum: false,
       showMemberlist: true,
       currentMemberList: {},
-      customMemberlist: [], //最後存到偏好設定的自訂名單      
+      customMemberlist: [], //最後存到偏好設定的自訂名單,
+      currentTA:'',
       showGptBox:false,
       checkGptExtensionInstalled:false,
       isWaitingGptFeedbackDone:false,
@@ -1384,14 +1385,14 @@ export default {
       let classnum = sessionStorage.getItem("classNum");
       // let classname = sessionStorage.getItem('classname')
       // let TeachDeviceId = sessionStorage.getItem('deviceId')
-      this.shareQRInfo.gn = classnum; //教室編號
-      this.shareQRInfo.pin = "8888"; //4數字驗證碼
-      this.shareQRInfo.host = "CC"; //必須是大寫的CC代表教師端類型
-      let serverLocation = this.$jsFn.isCN() ? "cn" : "global";
-      this.shareQRCode = profile.irs5Url[serverLocation] + "/?m=" + encodeURIComponent(this.$t("login.loginBox.qrcode.text4"), "utf-8") + "&o=1"; // 配合HiTA5新掃碼的功能
-      this.shareQRCode += "&s=" + this.encode64(JSON.stringify(this.shareQRInfo)); //大陸數據中心, 全球就要另外換
-      this.qrcodeIRS5link = profile.irs5Url[serverLocation].replace("https://", "");
-      this.innerVisible = true;
+      this.shareQRInfo.gn = classnum //教室編號
+      this.shareQRInfo.pin = '8888' //4數字驗證碼
+      this.shareQRInfo.ip = '' 
+      let serverLocation = this.$jsFn.isCN() ? 'cn' : 'global'
+      this.shareQRCode = profile.irs5Url[serverLocation]
+      this.shareQRCode += '/?s=' + this.encode64(JSON.stringify(this.shareQRInfo)) //大陸數據中心, 全球就要另外換
+      this.qrcodeIRS5link = profile.irs5Url[serverLocation].replace('https://', '')
+      this.innerVisible = true
       // 二维码内容 地址內容
       this.qrcode = this.shareQRCode;
       // 使用$nextTick确保数据渲染
@@ -3616,13 +3617,13 @@ export default {
         if (fileType === "pdf") {
           this.stageScreenShotToImgArr(slide, 1);
 
-          let layerInfo = await that.layer.clone(); // 画布内容提取
+          let layerInfo = await that.layer.clone() // 画布内容提取
 
           console.log(layerInfo, "最新的背景圖次序");
 
-          that.saveArr[slide - 1 + ""] = layerInfo;
-          console.log(that.saveArr, "页面的提取");
-          await sessionStorage.setItem("stageInfo", JSON.stringify(that.saveArr));
+          that.saveArr[slide - 1 + ''] = layerInfo
+          console.log(that.saveArr, '页面的提取')
+          await sessionStorage.setItem('stageInfo', JSON.stringify(that.saveArr))
 
           that.stage.clear();
           console.log(slideNext, "页数页数页数");
@@ -3901,8 +3902,8 @@ export default {
         //避免无线循环发送接收消息
         if (stateinfo && stateinfo.sender != userSub) {
           //因为频道10秒广播一次state,所以这里要屏蔽掉自己的发的广播
-          console.log("收到消息后调用发送消息方法了!!");
-          that.singnalRMessage(stateinfo, "8888", message.ConnectionId);
+            console.log('收到消息后调用发送消息方法了!!')
+            that.singnalRMessage(stateinfo, '8888', message.ConnectionId)
         }
       }
       function onDisconnected(message) {
@@ -3910,7 +3911,39 @@ export default {
         message.id = this.IMcounter++; // vue transitions need an id
       }
     },
-    //防止當頁狀態跑掉獨立送normal 給webIRS
+    sendAcktoTA(messages){
+      let user = JSON.parse(sessionStorage.getItem("user"));
+      let channelapi = this.imConnect.channel_api + "/messages";
+      let sender = user.sub;
+      let receive=[this.currentTA]
+      let messageText = {
+          action: "Ack",
+          clientType: "HiTeachCC",
+          sender: "HiTeachCC-" + sender,
+          timestamp: new Date().getTime(),
+          waitReturn: false,
+          payload: {
+            ack_Action: messages.action,
+            ack_Timestamp: messages.timestamp,
+            error: "",
+          },
+        };
+       this.$api
+          .tomessage(channelapi, {
+            connectionId: "",
+            sender: sender,
+            isPrivate: true,
+            groupname: null,
+            to: receive,
+            Text: JSON.stringify(messageText),
+          })
+          .then((res) => {
+            console.log(res, "消息发送成功");
+          })
+          .catch((res) => {
+            console.log(res, "消息发送失败");
+       });  
+    },
     sendCloseClass() {
       let user = JSON.parse(sessionStorage.getItem("user"));
       let channelapi = this.imConnect.channel_api + "/messages";
@@ -3948,8 +3981,9 @@ export default {
         });
       this.$store.state.currentState = "Class.Close";
     },
-
+    //防止當頁狀態跑掉獨立送normal 給webIRS
     sendNormalInCurrentPage() {
+      let randomId = this.genID();
       let messages = {
         action: "State.Get",
         clientType: "HiTeachCC",
@@ -3974,10 +4008,67 @@ export default {
           collateType: "None",
           examFileURL: "",
           mode: "Normal",
+          content: {
+              id: randomId,
+              exercise: {
+                answer: [],
+                blankCount: 0,
+                children: [],
+                createTime: 0,
+                creator: "",
+                explain: "",
+                type: "Single",
+                knowledges: [],
+                objective: false,
+                order: 0,
+                opts: 4,
+                field: 1,
+                level: 3,
+                periodId: "",
+                gradeIds: [],
+                repair: [],
+                subjectId: "",
+                scope: null,
+                score: 10,
+              },
+              render: 0,
+              item: [
+                {
+                  question: "_popquiz_",
+                  option: [
+                    { code: "A", timeStamp: 0 },
+                    { code: "B", timeStamp: 0 },
+                    { code: "C", timeStamp: 0 },
+                    { code: "D", timeStamp: 0 },
+                    { code: "E", timeStamp: 0 },
+                    { code: "F", timeStamp: 0 },
+                    { code: "G", timeStamp: 0 },
+                    { code: "H", timeStamp: 0 },
+                    { code: "I", timeStamp: 0 },
+                  ],
+                },
+              ],
+              blob: null,
+              lite: false,
+              repair: [],
+              contentQuestionCategory: "Knowledge",
+              concept: "",
+              keyword: "",
+              questionAnsweredState: "Unanswered",
+              questionDurationTime: "00:00:00",
+              questionIndex: 0,
+              questionLocationType: "Local",
+              questionRenderType: "Htex",
+              questionSpendTime: "00:00:00",
+              shaCode: "",
+              totalAnsweredMemberCount: 0,
+          },
           pageID: this.nowpageRender.nowpageIds,
           pagePushHistory: this.pagePushHistory,
           resourcePushHistory: [],
           messagePushHistory: this.messagePushHistory,
+          currentTA:this.currentTA,
+          
         };
         //学生加入教室一系列操作
         let messageText = {
@@ -4008,6 +4099,7 @@ export default {
     },
     /*signalR发送消息*/
     async singnalRMessage(message, pincode, connectionId, statusname) {
+      let that=this
       //發給之後廣播使用
       if (statusname != undefined) {
         this.$store.state.currentState = statusname;
@@ -4032,9 +4124,98 @@ export default {
       let classnum = sessionStorage.getItem("classNum");
       let time = Math.floor(Date.now());
       //学生加入教室一系列操作
-      var messageText = {};
-      if (messages.action === "Announce.Ask") {
+      var messageText = {}
+      if (messages.clientType == 'TA') {
+        that.currentTA=messages.sender
+        //針對TA畫板控制獨立動作
+        switch (messages.action) {
+          case 'Board.Ctrl': {
+            this.$refs.hd.boardCtrlbyTA(messages.payload.BoardAction)
+            break
+          }
+          case 'IRS.Ctrl': {
+            this.$refs.hd.irsCtrlbyTA(messages.payload)
+            break
+          }
+          case 'Timer.Ctrl': {
+            let waitingPopupTimer
+            clearTimeout(waitingPopupTimer)
+            if (messages.payload.Operation.toLowerCase() == 'start') {
+              this.toolIndexList.push(2)
+
+              let timer = Number(messages.payload.Time) / 1000
+              let hours = Math.floor(timer / 3600)
+              let minutes = Math.floor((timer % 3600) / 60)
+              let seconds = Math.floor(timer % 60)
+
+              hours = minutes < 10 ? '0' + hours : hours
+              minutes = minutes < 10 ? '0' + minutes : minutes
+              seconds = seconds < 10 ? '0' + seconds : seconds
+
+              waitingPopupTimer = setTimeout(() => {
+                if (this.$refs?.ButtonTimer) {
+                  this.$refs.ButtonTimer.handleReset()
+                  setTimeout(() => {
+                    if (this.$refs?.ButtonTimer) {
+                      this.$refs.ButtonTimer.minuteVal = minutes.toString()
+                      this.$refs.ButtonTimer.secondVal = seconds.toString()
+                      this.$refs.ButtonTimer.countDown()
+                    }
+                  }, 1000)
+                }
+              }, 1000)
+            }
+            if (messages.payload.Operation.toLowerCase() == 'stop') {
+              if (this.$refs?.ButtonTimer) this.$refs.ButtonTimer.onhandlePause()
+            } else if (messages.payload.Operation.toLowerCase() == 'close') {
+              if (this.$refs?.ButtonTimer) this.$refs.ButtonTimer.handleReset()
+              this.toolIndexList.splice(this.toolIndexList.indexOf(2, 1))
+              this.$store.state.timerIsStart = false
+            }
+            break
+          }
+          case 'Pickup.Ctrl': {
+            if (!this.toolIndexList.includes(1)) {
+              this.toolIndexList.push(1)
+              let waitingPopupTimer
+              clearTimeout(waitingPopupTimer)
+
+              waitingPopupTimer = setTimeout(() => {
+                 that.$refs.TurnTable.pickOne()
+              }, 1000)
+             
+            }
+            else{
+              this.handleCloseTool(1) 
+            }
+             break
+          }
+           case 'Media.Push': {
+            const works= messages.payload.MediaList.map(item=>item.source)
+            this.$store.state.timeLineEvent.push({
+              Time: (Math.floor(Date.now()) - this.$store.state.startTime) / 1000,
+              Pgid: this.nowpageRender.nowpageIds,
+              EventId: 917529,
+              Event: "WrkCmp",
+              WrkCmpSrcTypeId: 655440,
+              WrkCmpSrcType: "HitaClientCmp",
+              WrkCmpCount: messages.payload.MediaList.length,
+              WrkType: 0,
+              Works:works,
+            });
+
+            for (let i in messages.payload.MediaList) {
+              let link=messages.payload.MediaList[i]
+              that.$refs.addImgBox.addTAImgObj(that.classInfo.blob.url + '/records/' + that.activityRecordNumberS + link.source, i,messages.payload.MediaList.length )
+            } 
+            break 
+          }
+        }
+      }
+
+      if (messages.action === 'Announce.Ask') {
         //加入教室返回相应课程相关信息
+        if(messages.clientType=='TA') this.sendAcktoTA(messages)
         messageText = {
           payload: {
             announceURL: "",
@@ -4063,39 +4244,22 @@ export default {
           clientType: "HiTeachCC",
           sender: "HiTeachCC-" + sender,
           timestamp: time,
-          waitReturn: false,
-        };
-      } else if (messages.action === "MemberBinding") {
-        // 過濾是否為先前登入
-        console.log(this.students, "this.students");
-        console.log(this.currentMemberList, "currentMemberList");
-        this.students = this.$store.state.students;
-        let filterStudy = this.students.filter((item) => {
-          return item.accountid == messages.payload.memberID;
-        });
-
-        let onlineClients = this.students.filter((item) => {
-          return item.status == "online";
-        });
+          waitReturn: false
+        }
+      } else if (messages.action === 'MemberBinding') {
+        console.log('MemberBinding')
+        if (messages.clientType == 'TA') {
+          this.sendAcktoTA(messages)
+          console.log(messages, 'MemberBinding')
 
-        if (onlineClients.length >= this.limitClient && filterStudy.length == 0) {
-          // 額滿
-          if (this.limitClientHint === false) {
-            this.$Message.info({
-              content: this.$t("board['偵測到有請求加入,但加入教室人數已達您的權限人數上限']") + ":" + this.limitClient,
-              duration: 5,
-            });
-            this.limitClientHint = true;
-          }
+          let blobUrl = this.classInfo.blob
 
-          let blobUrl = this.classInfo.blob;
-          // this.seatNum = Number(this.seatNum) + 1
           messageText = {
             payload: {
               activityRecordNumber: this.activityRecordNumberS,
-              id: null,
+              id: messages.payload.hostID,
               seatID: 0,
-              name: messages.payload.memberName,
+              name: messages.payload.hostName,
               className: this.className,
               schoolId: this.schoolId,
               schoolName: this.schoolName,
@@ -4104,132 +4268,76 @@ export default {
               blobSAS: blobUrl.sas,
               blobSAS_Write: blobUrl.sas_write,
               blobSAS_Read: blobUrl.sas_read,
-              errorCode: 307,
-              resourcePushHistory: [],
-              messagePushHistory: this.messagePushHistory,
+              errorCode: 0
             },
-            action: "BindingResult",
-            clientType: "HiTeachCC",
-            sender: "HiTeachCC-" + sender,
+            action: 'BindingResult',
+            clientType: 'HiTeachCC',
+            sender: 'HiTeachCC-' + sender,
             timestamp: time,
             waitReturn: false,
-          };
-        } else if (onlineClients.length <= this.limitClient) {
-          // 加入
-          console.log(onlineClients.length, this.limitClient);
-          //绑定request(座位号及相关学生个人信息)
-          this.seatNum = Number(this.seatNum) + 1;
-          let blobUrl = this.classInfo.blob;
-          console.log(blobUrl, "BLOB相关信息");
-          messageText = {
-            payload: {
-              activityRecordNumber: this.activityRecordNumberS,
-              id: messages.payload.memberID,
-              seatID: this.seatNum,
-              name: messages.payload.memberName,
-              className: this.className,
-              schoolId: this.schoolId,
-              schoolName: this.schoolName,
-              hostBlobUrl: blobUrl.url,
-              clientBlobUrl: blobUrl.url,
-              blobSAS: blobUrl.sas,
-              blobSAS_Write: blobUrl.sas_write,
-              blobSAS_Read: blobUrl.sas_read,
-              errorCode: 0,
-              resourcePushHistory: [],
-              messagePushHistory: this.messagePushHistory,
-            },
-            action: "BindingResult",
-            clientType: "HiTeachCC",
-            sender: "HiTeachCC-" + sender,
-            timestamp: time,
-            waitReturn: false,
-          };
-          //确认学生加入和把学生加入到 学生列表
-          this.studentAlone = {
-            id: messages.sender,
-            accountid: messages.payload.memberID,
-            studentName: messages.payload.memberName,
-            sendTime: time,
-            headImg: "",
-          };
+            isNewTA: false
+          }
+        } else {
+          // 不是TA,其餘視為IRS學生
+          // 過濾是否為先前登入
+          this.students = this.$store.state.students
+          let filterStudy = this.students.filter(item => {
+            return item.accountid == messages.payload.memberID
+          })
 
-          let oneStudent = {
-            sort: this.seatNum,
-            id: this.studentAlone.id,
-            accountid: this.studentAlone.accountid,
-            studentName: this.studentAlone.studentName,
-            sendTime: this.studentAlone.sendTime,
-            headImg: this.studentAlone.headImg,
-            option: "",
-            done: true,
-            score: 0,
-            rank: "",
-            class: "studyboxone",
-            showcardclass: "brand",
-            answerclass: "studyboxone",
-            answerbrand: "brand",
-            statement: "", //发言,
-            status: "online",
-            type: 0,
-          };
+          let onlineClients = this.students.filter(item => {
+            return item.status == 'online'
+          })
 
-          console.log(filterStudy, "filter的返回值, 若有找到表示重新加入原本就在名單裡");
-          if (filterStudy.length == 0) {
-            // 全新加入
-            this.students.push(oneStudent);
-            this.memberList.push({
-              memberID: oneStudent.accountid,
-              memberName: oneStudent.studentName,
-              seatID: oneStudent.sort,
-              groupName: null,
-              groupID: null,
-              isHiGroup: false,
-            });
-          } else {
-            this.seatNum = Number(this.seatNum) - 1; //Reclaim exist Seat Number
-            // 如果 accountid 已經存在, 但是 deviceid 不同踢掉先前加入的
-            if (filterStudy[0].id != this.studentAlone.id && filterStudy[0].id != "") {
-              messageText = {
-                action: "FuckOff",
-                clientType: "HiTeachCC",
-                sender: "HiTeachCC-" + sender,
-                timestamp: time,
-                waitReturn: false,
-                isNewTA: false,
-              };
-              console.log(messageText, filterStudy[0].id, "發送踢人消息");
-              this.$api
-                .tomessage(channelapi, {
-                  connectionId: connectionId,
-                  sender: sender,
-                  isPrivate: true,
-                  groupname: null,
-                  to: [filterStudy[0].id],
-                  Text: JSON.stringify(messageText),
-                })
-                .then((res) => {
-                  console.log(res, "消息发送成功");
-                })
-                .catch((res) => {
-                  console.log(res, "消息发送失败");
-                });
+          if (onlineClients.length >= this.limitClient && filterStudy.length == 0) {
+            // 額滿
+            if (this.limitClientHint === false) {
+              this.$Message.info({
+                content: this.$t("board['偵測到有請求加入,但加入教室人數已達您的權限人數上限']") + ':' + this.limitClient,
+                duration: 5
+              })
+              this.limitClientHint = true
             }
-            //處理 device id 可能有重複的狀況
-            this.students.forEach((item) => {
-              if (item.id == this.studentAlone.id) {
-                item.id = "";
-                item.status = "offline";
-              }
-            });
 
-            // 回應加入
+            let blobUrl = this.classInfo.blob
+            // this.seatNum = Number(this.seatNum) + 1
+            messageText = {
+              payload: {
+                activityRecordNumber: this.activityRecordNumberS,
+                id: null,
+                seatID: 0,
+                name: messages.payload.memberName,
+                className: this.className,
+                schoolId: this.schoolId,
+                schoolName: this.schoolName,
+                hostBlobUrl: blobUrl.url,
+                clientBlobUrl: blobUrl.url,
+                blobSAS: blobUrl.sas,
+                blobSAS_Write: blobUrl.sas_write,
+                blobSAS_Read: blobUrl.sas_read,
+                errorCode: 307,
+                resourcePushHistory: [],
+                messagePushHistory: this.messagePushHistory
+              },
+              action: 'BindingResult',
+              clientType: 'HiTeachCC',
+              sender: 'HiTeachCC-' + sender,
+              timestamp: time,
+              waitReturn: false
+            }
+          } else if (onlineClients.length <= this.limitClient) {
+            // 加入
+            console.log(onlineClients.length, this.limitClient)
+            //绑定request(座位号及相关学生个人信息)
+            this.seatNum = Number(this.seatNum) + 1
+            let blobUrl = this.classInfo.blob
+            console.log(blobUrl, 'BLOB相关信息')
             messageText = {
               payload: {
                 activityRecordNumber: this.activityRecordNumberS,
-                id: filterStudy[0].accountid,
-                seatID: filterStudy[0].sort,
-                name: filterStudy[0].studentName,
+                id: messages.payload.memberID,
+                seatID: this.seatNum,
+                name: messages.payload.memberName,
                 className: this.className,
                 schoolId: this.schoolId,
                 schoolName: this.schoolName,
@@ -4240,34 +4348,139 @@ export default {
                 blobSAS_Read: blobUrl.sas_read,
                 errorCode: 0,
                 resourcePushHistory: [],
-                messagePushHistory: this.messagePushHistory,
+                messagePushHistory: this.messagePushHistory
               },
-              action: "BindingResult",
-              clientType: "HiTeachCC",
-              sender: "HiTeachCC-" + sender,
+              action: 'BindingResult',
+              clientType: 'HiTeachCC',
+              sender: 'HiTeachCC-' + sender,
               timestamp: time,
-              waitReturn: false,
-            };
-          }
+              waitReturn: false
+            }
+            //确认学生加入和把学生加入到 学生列表
+            this.studentAlone = {
+              id: messages.sender,
+              accountid: messages.payload.memberID,
+              studentName: messages.payload.memberName,
+              sendTime: time,
+              headImg: ''
+            }
 
-          // replace device id/status for reclaim
-          for (let ii = 0; ii < this.students.length; ++ii) {
-            if (this.students[ii].accountid == this.studentAlone.accountid) {
-              this.students[ii].id = this.studentAlone.id;
-              if (this.studentAlone.studentName) (this.students[ii].studentName = this.studentAlone.studentName), (this.students[ii].status = "online");
-              break;
+            let oneStudent = {
+              sort: this.seatNum,
+              id: this.studentAlone.id,
+              accountid: this.studentAlone.accountid,
+              studentName: this.studentAlone.studentName,
+              sendTime: this.studentAlone.sendTime,
+              headImg: this.studentAlone.headImg,
+              option: '',
+              done: true,
+              score: 0,
+              rank: '',
+              class: 'studyboxone',
+              showcardclass: 'brand',
+              answerclass: 'studyboxone',
+              answerbrand: 'brand',
+              statement: '', //发言,
+              status: 'online',
+              type: 0
+            }
+
+            console.log(filterStudy, 'filter的返回值, 若有找到表示重新加入原本就在名單裡')
+            if (filterStudy.length == 0) {
+              // 全新加入
+              this.students.push(oneStudent)
+              this.memberList.push({
+                memberID: oneStudent.accountid,
+                memberName: oneStudent.studentName,
+                seatID: oneStudent.sort,
+                groupName: null,
+                groupID: null,
+                isHiGroup: false
+              })
+            } else {
+              this.seatNum = Number(this.seatNum) - 1 //Reclaim exist Seat Number
+              // 如果 accountid 已經存在, 但是 deviceid 不同踢掉先前加入的
+              if (filterStudy[0].id != this.studentAlone.id && filterStudy[0].id != '') {
+                messageText = {
+                  action: 'FuckOff',
+                  clientType: 'HiTeachCC',
+                  sender: 'HiTeachCC-' + sender,
+                  timestamp: time,
+                  waitReturn: false,
+                  isNewTA: false
+                }
+                console.log(messageText, filterStudy[0].id, '發送踢人消息')
+                this.$api
+                  .tomessage(channelapi, {
+                    connectionId: connectionId,
+                    sender: sender,
+                    isPrivate: true,
+                    groupname: null,
+                    to: [filterStudy[0].id],
+                    Text: JSON.stringify(messageText)
+                  })
+                  .then(res => {
+                    console.log(res, '消息发送成功')
+                  })
+                  .catch(res => {
+                    console.log(res, '消息发送失败')
+                  })
+              }
+              //處理 device id 可能有重複的狀況
+              this.students.forEach(item => {
+                if (item.id == this.studentAlone.id) {
+                  item.id = ''
+                  item.status = 'offline'
+                }
+              })
+
+              // 回應加入
+              messageText = {
+                payload: {
+                  activityRecordNumber: this.activityRecordNumberS,
+                  id: filterStudy[0].accountid,
+                  seatID: filterStudy[0].sort,
+                  name: filterStudy[0].studentName,
+                  className: this.className,
+                  schoolId: this.schoolId,
+                  schoolName: this.schoolName,
+                  hostBlobUrl: blobUrl.url,
+                  clientBlobUrl: blobUrl.url,
+                  blobSAS: blobUrl.sas,
+                  blobSAS_Write: blobUrl.sas_write,
+                  blobSAS_Read: blobUrl.sas_read,
+                  errorCode: 0,
+                  resourcePushHistory: [],
+                  messagePushHistory: this.messagePushHistory
+                },
+                action: 'BindingResult',
+                clientType: 'HiTeachCC',
+                sender: 'HiTeachCC-' + sender,
+                timestamp: time,
+                waitReturn: false,
+                isNewTA: false
+              }
+            }
+
+            // replace device id/status for reclaim
+            for (let ii = 0; ii < this.students.length; ++ii) {
+              if (this.students[ii].accountid == this.studentAlone.accountid) {
+                this.students[ii].id = this.studentAlone.id
+                if (this.studentAlone.studentName) (this.students[ii].studentName = this.studentAlone.studentName), (this.students[ii].status = 'online')
+                break
+              }
             }
+            let Ss = 0
+            this.students.forEach(item => {
+              if (item.status == 'online') Ss++
+              if (item.headImg === undefined || item.headImg === '') item.headImg = require('../assets/img/profile-user.svg')
+            })
+            this.onlineSs = Ss
+            console.log(this.students, '学生情况')
+            this.$store.state.students = this.students
           }
-          let Ss = 0;
-          this.students.forEach((item) => {
-            if (item.status == "online") Ss++;
-            if (item.headImg === undefined || item.headImg === "") item.headImg = require("../assets/img/profile-user.svg");
-          });
-          this.onlineSs = Ss;
-          console.log(this.students, "学生情况");
-          this.$store.state.students = this.students;
         }
-      } else if (messages.action === "Leave") {
+      } else if (messages.action === 'Leave') {
         // 登出
         console.log("Leave ask", messages.sender);
         this.students = this.$store.state.students;
@@ -4282,6 +4495,10 @@ export default {
         }
         this.onlineSs = Ss;
         this.$store.state.students = this.students;
+
+        if(messages.clientType=='TA'){
+          this.currentTA=''
+        }
       } else if (messages.action === "State.Get") {
         if (sessionStorage.getItem("fileType") == "pdf") {
           let pagenums = sessionStorage.getItem("slide") ? sessionStorage.getItem("slide") - 1 : 0;
@@ -4645,6 +4862,8 @@ export default {
           console.log(payloadContent, "重啟作品收集");
           this.irsModel = "irsGather";
         }
+        //加入當前TA發送到State
+        payloadContent.currentTA=that.currentTA
 
         messageText = {
           action: "State",
@@ -4893,6 +5112,7 @@ export default {
           PushPgNo: this.slidenum,
         });
       }
+    
 
       if (JSON.stringify(messageText) != "{}") {
         console.log(messageText, "发送的消息");
@@ -6703,7 +6923,7 @@ export default {
       }
     },
     isAuthWordCloud() {
-      return this.getFunc("clients").get > 50;
+      return this.getFunc('clients').get > 50
     },
     isAuthAccount() {
       //17.授權:(0: 無, 1: ID, 2: 機器, 3: ID+機器) 0不是IES5也沒權益的純登入 1:ID有包含權益, 2.IES5過來的CC就是機器授權  3.:1和2都有

+ 1 - 0
HiTeachCC/ClientApp/src/views/Login.vue

@@ -302,6 +302,7 @@
                 this.loginErrText = ''
                 await this.$api.ies5Api.getUserBlob().then(res => {
                     console.log(res, '成功blob')
+                    console.log(res.blob_sas, 'blob_sas')
                     // 儲存blobConnect
                     this.blobConnect.sas = ''
                     this.blobConnect.sas_write = res.blob_sas_write,