Pārlūkot izejas kodu

Merge branch 'beta'

SanHQin 1 mēnesi atpakaļ
vecāks
revīzija
77b5b4e817
71 mainītis faili ar 1892 papildinājumiem un 371 dzēšanām
  1. 1 1
      dist/index.html
  2. 0 0
      dist/static/css/app.1a1cf54e58e0216370df30223cfc276a.css
  3. 0 0
      dist/static/css/app.1a1cf54e58e0216370df30223cfc276a.css.map
  4. 0 0
      dist/static/css/app.b39ceb318dedf9e22011234f1aeeee8b.css
  5. 0 0
      dist/static/css/app.b39ceb318dedf9e22011234f1aeeee8b.css.map
  6. BIN
      dist/static/fonts/KaTeX_AMS-Regular.10824af.woff
  7. BIN
      dist/static/fonts/KaTeX_AMS-Regular.5657322.ttf
  8. BIN
      dist/static/fonts/KaTeX_AMS-Regular.66c6782.woff2
  9. BIN
      dist/static/fonts/KaTeX_Caligraphic-Bold.497bf40.ttf
  10. BIN
      dist/static/fonts/KaTeX_Caligraphic-Regular.e6fb499.ttf
  11. BIN
      dist/static/fonts/KaTeX_Fraktur-Bold.40934fc.woff
  12. BIN
      dist/static/fonts/KaTeX_Fraktur-Bold.796f379.woff2
  13. BIN
      dist/static/fonts/KaTeX_Fraktur-Bold.b9d7c44.ttf
  14. BIN
      dist/static/fonts/KaTeX_Fraktur-Regular.97a699d.ttf
  15. BIN
      dist/static/fonts/KaTeX_Fraktur-Regular.e435cda.woff
  16. BIN
      dist/static/fonts/KaTeX_Fraktur-Regular.f9e6a99.woff2
  17. BIN
      dist/static/fonts/KaTeX_Main-Bold.4cdba64.woff
  18. BIN
      dist/static/fonts/KaTeX_Main-Bold.8e431f7.ttf
  19. BIN
      dist/static/fonts/KaTeX_Main-Bold.a9382e2.woff2
  20. BIN
      dist/static/fonts/KaTeX_Main-BoldItalic.52fb39b.ttf
  21. BIN
      dist/static/fonts/KaTeX_Main-BoldItalic.5f875f9.woff
  22. BIN
      dist/static/fonts/KaTeX_Main-BoldItalic.d873734.woff2
  23. BIN
      dist/static/fonts/KaTeX_Main-Italic.39349e0.ttf
  24. BIN
      dist/static/fonts/KaTeX_Main-Italic.6529706.woff2
  25. BIN
      dist/static/fonts/KaTeX_Main-Italic.8ffd28f.woff
  26. BIN
      dist/static/fonts/KaTeX_Main-Regular.818582d.ttf
  27. BIN
      dist/static/fonts/KaTeX_Main-Regular.f1cdb69.woff
  28. BIN
      dist/static/fonts/KaTeX_Main-Regular.f8a7f19.woff2
  29. BIN
      dist/static/fonts/KaTeX_Math-BoldItalic.1320454.woff2
  30. BIN
      dist/static/fonts/KaTeX_Math-BoldItalic.48155e4.woff
  31. BIN
      dist/static/fonts/KaTeX_Math-BoldItalic.6589c4f.ttf
  32. BIN
      dist/static/fonts/KaTeX_Math-Italic.d8b7a80.woff2
  33. BIN
      dist/static/fonts/KaTeX_Math-Italic.ed7aea1.woff
  34. BIN
      dist/static/fonts/KaTeX_Math-Italic.fe5ed58.ttf
  35. BIN
      dist/static/fonts/KaTeX_SansSerif-Bold.0e897d2.woff
  36. BIN
      dist/static/fonts/KaTeX_SansSerif-Bold.ad546b4.woff2
  37. BIN
      dist/static/fonts/KaTeX_SansSerif-Bold.f2ac731.ttf
  38. BIN
      dist/static/fonts/KaTeX_SansSerif-Italic.e934cbc.woff2
  39. BIN
      dist/static/fonts/KaTeX_SansSerif-Italic.ef725de.woff
  40. BIN
      dist/static/fonts/KaTeX_SansSerif-Italic.f60b4a3.ttf
  41. BIN
      dist/static/fonts/KaTeX_SansSerif-Regular.1ac3ed6.woff2
  42. BIN
      dist/static/fonts/KaTeX_SansSerif-Regular.3243452.ttf
  43. BIN
      dist/static/fonts/KaTeX_SansSerif-Regular.5f8637e.woff
  44. BIN
      dist/static/fonts/KaTeX_Script-Regular.a189c37.ttf
  45. BIN
      dist/static/fonts/KaTeX_Script-Regular.a82fa2a.woff
  46. BIN
      dist/static/fonts/KaTeX_Size1-Regular.0d8d920.ttf
  47. BIN
      dist/static/fonts/KaTeX_Size2-Regular.1fdda0e.ttf
  48. BIN
      dist/static/fonts/KaTeX_Size4-Regular.27a23ee.ttf
  49. BIN
      dist/static/fonts/KaTeX_Typewriter-Regular.0e04605.woff
  50. BIN
      dist/static/fonts/KaTeX_Typewriter-Regular.6bf4287.ttf
  51. BIN
      dist/static/fonts/KaTeX_Typewriter-Regular.b8b8393.woff2
  52. 0 0
      dist/static/js/app.615fbbc6a499e52f9dc9.js
  53. 0 0
      dist/static/js/app.615fbbc6a499e52f9dc9.js.map
  54. 0 0
      dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map
  55. 0 0
      dist/static/js/vendor.b2299056e030e9dd4cb8.js
  56. 0 0
      dist/static/js/vendor.b2299056e030e9dd4cb8.js.map
  57. 57 0
      package-lock.json
  58. 1 0
      package.json
  59. 12 1
      src/components/EnglishVoice2/index.vue
  60. 11 1
      src/components/EnglishVoice3/index.vue
  61. 1 1
      src/components/classRoomHelper/index.vue
  62. 615 0
      src/components/classRoomHelper/studentIndex.vue
  63. 10 0
      src/components/components/appStoreC.vue
  64. 21 7
      src/components/components/askStatic2.vue
  65. 81 16
      src/components/components/choseWorksDetailDialog.vue
  66. 4 2
      src/components/easy/studyStudent.vue
  67. 261 111
      src/components/easy2/studyStudent.vue
  68. 291 93
      src/components/easy3/studyStudent.vue
  69. 254 62
      src/components/studyStudent.vue
  70. 270 76
      src/components/studySutdentClass/studyStudent.vue
  71. 2 0
      src/mixins/mixin.js

+ 1 - 1
dist/index.html

@@ -27,7 +27,7 @@
     html,
     body{
       font-family: '黑体';
-    }</style><link href=./static/css/app.b39ceb318dedf9e22011234f1aeeee8b.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.43cd677d9291e0373eea.js></script><script type=text/javascript src=./static/js/app.bd2313dd2b3358e29a06.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.1a1cf54e58e0216370df30223cfc276a.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.b2299056e030e9dd4cb8.js></script><script type=text/javascript src=./static/js/app.615fbbc6a499e52f9dc9.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/static/css/app.1a1cf54e58e0216370df30223cfc276a.css


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/static/css/app.1a1cf54e58e0216370df30223cfc276a.css.map


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/static/css/app.b39ceb318dedf9e22011234f1aeeee8b.css


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/static/css/app.b39ceb318dedf9e22011234f1aeeee8b.css.map


BIN
dist/static/fonts/KaTeX_AMS-Regular.10824af.woff


BIN
dist/static/fonts/KaTeX_AMS-Regular.5657322.ttf


BIN
dist/static/fonts/KaTeX_AMS-Regular.66c6782.woff2


BIN
dist/static/fonts/KaTeX_Caligraphic-Bold.497bf40.ttf


BIN
dist/static/fonts/KaTeX_Caligraphic-Regular.e6fb499.ttf


BIN
dist/static/fonts/KaTeX_Fraktur-Bold.40934fc.woff


BIN
dist/static/fonts/KaTeX_Fraktur-Bold.796f379.woff2


BIN
dist/static/fonts/KaTeX_Fraktur-Bold.b9d7c44.ttf


BIN
dist/static/fonts/KaTeX_Fraktur-Regular.97a699d.ttf


BIN
dist/static/fonts/KaTeX_Fraktur-Regular.e435cda.woff


BIN
dist/static/fonts/KaTeX_Fraktur-Regular.f9e6a99.woff2


BIN
dist/static/fonts/KaTeX_Main-Bold.4cdba64.woff


BIN
dist/static/fonts/KaTeX_Main-Bold.8e431f7.ttf


BIN
dist/static/fonts/KaTeX_Main-Bold.a9382e2.woff2


BIN
dist/static/fonts/KaTeX_Main-BoldItalic.52fb39b.ttf


BIN
dist/static/fonts/KaTeX_Main-BoldItalic.5f875f9.woff


BIN
dist/static/fonts/KaTeX_Main-BoldItalic.d873734.woff2


BIN
dist/static/fonts/KaTeX_Main-Italic.39349e0.ttf


BIN
dist/static/fonts/KaTeX_Main-Italic.6529706.woff2


BIN
dist/static/fonts/KaTeX_Main-Italic.8ffd28f.woff


BIN
dist/static/fonts/KaTeX_Main-Regular.818582d.ttf


BIN
dist/static/fonts/KaTeX_Main-Regular.f1cdb69.woff


BIN
dist/static/fonts/KaTeX_Main-Regular.f8a7f19.woff2


BIN
dist/static/fonts/KaTeX_Math-BoldItalic.1320454.woff2


BIN
dist/static/fonts/KaTeX_Math-BoldItalic.48155e4.woff


BIN
dist/static/fonts/KaTeX_Math-BoldItalic.6589c4f.ttf


BIN
dist/static/fonts/KaTeX_Math-Italic.d8b7a80.woff2


BIN
dist/static/fonts/KaTeX_Math-Italic.ed7aea1.woff


BIN
dist/static/fonts/KaTeX_Math-Italic.fe5ed58.ttf


BIN
dist/static/fonts/KaTeX_SansSerif-Bold.0e897d2.woff


BIN
dist/static/fonts/KaTeX_SansSerif-Bold.ad546b4.woff2


BIN
dist/static/fonts/KaTeX_SansSerif-Bold.f2ac731.ttf


BIN
dist/static/fonts/KaTeX_SansSerif-Italic.e934cbc.woff2


BIN
dist/static/fonts/KaTeX_SansSerif-Italic.ef725de.woff


BIN
dist/static/fonts/KaTeX_SansSerif-Italic.f60b4a3.ttf


BIN
dist/static/fonts/KaTeX_SansSerif-Regular.1ac3ed6.woff2


BIN
dist/static/fonts/KaTeX_SansSerif-Regular.3243452.ttf


BIN
dist/static/fonts/KaTeX_SansSerif-Regular.5f8637e.woff


BIN
dist/static/fonts/KaTeX_Script-Regular.a189c37.ttf


BIN
dist/static/fonts/KaTeX_Script-Regular.a82fa2a.woff


BIN
dist/static/fonts/KaTeX_Size1-Regular.0d8d920.ttf


BIN
dist/static/fonts/KaTeX_Size2-Regular.1fdda0e.ttf


BIN
dist/static/fonts/KaTeX_Size4-Regular.27a23ee.ttf


BIN
dist/static/fonts/KaTeX_Typewriter-Regular.0e04605.woff


BIN
dist/static/fonts/KaTeX_Typewriter-Regular.6bf4287.ttf


BIN
dist/static/fonts/KaTeX_Typewriter-Regular.b8b8393.woff2


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/static/js/app.615fbbc6a499e52f9dc9.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/static/js/app.615fbbc6a499e52f9dc9.js.map


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/static/js/vendor.b2299056e030e9dd4cb8.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
dist/static/js/vendor.b2299056e030e9dd4cb8.js.map


+ 57 - 0
package-lock.json

@@ -25,6 +25,7 @@
         "js-audio-recorder": "^1.0.7",
         "jsmind": "^0.4.8",
         "jszip": "^3.10.1",
+        "katex": "^0.16.22",
         "lamejs": "^1.2.1",
         "markdown-it": "^13.0.1",
         "opencc-js": "^1.0.5",
@@ -13529,6 +13530,31 @@
         "setimmediate": "^1.0.5"
       }
     },
+    "node_modules/katex": {
+      "version": "0.16.22",
+      "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.22.tgz",
+      "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==",
+      "funding": [
+        "https://opencollective.com/katex",
+        "https://github.com/sponsors/katex"
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "commander": "^8.3.0"
+      },
+      "bin": {
+        "katex": "cli.js"
+      }
+    },
+    "node_modules/katex/node_modules/commander": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
+      "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
     "node_modules/killable": {
       "version": "1.0.1",
       "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz",
@@ -35150,6 +35176,21 @@
         "setimmediate": "^1.0.5"
       }
     },
+    "katex": {
+      "version": "0.16.22",
+      "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.22.tgz",
+      "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==",
+      "requires": {
+        "commander": "^8.3.0"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "8.3.0",
+          "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
+          "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="
+        }
+      }
+    },
     "killable": {
       "version": "1.0.1",
       "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz",
@@ -37398,6 +37439,7 @@
         "js-audio-recorder": "^1.0.7",
         "jsmind": "^0.4.8",
         "jszip": "^3.10.1",
+        "katex": "^0.16.22",
         "lamejs": "^1.2.1",
         "markdown-it": "^13.0.1",
         "nightwatch": "^0.9.12",
@@ -48381,6 +48423,21 @@
             "setimmediate": "^1.0.5"
           }
         },
+        "katex": {
+          "version": "0.16.22",
+          "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.22.tgz",
+          "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==",
+          "requires": {
+            "commander": "^8.3.0"
+          },
+          "dependencies": {
+            "commander": {
+              "version": "8.3.0",
+              "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
+              "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="
+            }
+          }
+        },
         "killable": {
           "version": "1.0.1",
           "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz",

+ 1 - 0
package.json

@@ -29,6 +29,7 @@
     "js-audio-recorder": "^1.0.7",
     "jsmind": "^0.4.8",
     "jszip": "^3.10.1",
+    "katex": "^0.16.22",
     "lamejs": "^1.2.1",
     "markdown-it": "^13.0.1",
     "opencc-js": "^1.0.5",

+ 12 - 1
src/components/EnglishVoice2/index.vue

@@ -69,6 +69,8 @@ export default {
             work: [],
             wScore: 0,
             scoreDetail: "",
+            homeWorkLoading : false
+
         }
     },
     methods: {
@@ -148,6 +150,8 @@ export default {
                     text: "",
                 },
             ];
+            if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+            this.homeWorkLoading = true
             this.ajax
                 .post(this.$store.state.api + "addCourseWorks5", params)
                 .then((res) => {
@@ -155,6 +159,10 @@ export default {
                         message: "提交成功",
                         type: "success",
                     });
+                    setTimeout(() => {
+                            this.homeWorkLoading = false
+                        }, 500);
+
                     this.addOp3('1', "", { courseid: this.id,tool:'英语口语',
                     data: JSON.stringify(this.work),
                     type: "course_tool_sub" }, "success")
@@ -166,7 +174,10 @@ export default {
                    
                     this.$message.error("提交失败");
                     console.error(err);
-                    
+                    setTimeout(() => {
+                            this.homeWorkLoading = false
+                        }, 500);
+
                     this.addOp3('1', "", { courseid: this.id,tool:'英语口语',
                     data: JSON.stringify(this.work),
                     type: "course_tool_sub" }, err)

+ 11 - 1
src/components/EnglishVoice3/index.vue

@@ -60,6 +60,8 @@ export default {
             work: [],
             wScore: 0,
             scoreDetail: "",
+            homeWorkLoading : false
+
         }
     },
     methods: {
@@ -134,6 +136,8 @@ export default {
                     text: "",
                 },
             ];
+            if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+            this.homeWorkLoading = true
             this.ajax
                 .post(this.$store.state.api + "addCourseWorks5", params)
                 .then((res) => {
@@ -141,6 +145,9 @@ export default {
                         message: "提交成功",
                         type: "success",
                     });
+                    setTimeout(() => {
+                            this.homeWorkLoading = false
+                        }, 500);
 
                     this.addOp3('1', "", { courseid: this.id,tool:'英语口语',
                     data: JSON.stringify(this.work),
@@ -153,7 +160,10 @@ export default {
                 .catch((err) => {
                     this.$message.error("提交失败");
                     console.error(err);
-                    
+                    setTimeout(() => {
+                            this.homeWorkLoading = false
+                        }, 500);
+
                     this.addOp3('1', "", { courseid: this.id,tool:'英语口语',
                     data: JSON.stringify(this.work),
                     type: "course_tool_sub" }, err)

+ 1 - 1
src/components/classRoomHelper/index.vue

@@ -813,7 +813,7 @@ ${_textData}
     },
     setWidth() {
       let w = this.$refs.ch_box;
-      let w2 = w.offsetWidth + 30 + "px";
+      let w2 = w.offsetWidth + 20 + "px";
       this.$emit("setWidth", w2);
     },
     openSetting() {

+ 615 - 0
src/components/classRoomHelper/studentIndex.vue

@@ -0,0 +1,615 @@
+<template>
+  <div class="ch_box" ref="ch_box">
+    <div class="ch_content_box" v-show="type == 1">
+      <workFlowIframe
+        v-show="itemType == 7 && iframeSrc2.length"
+        :iframeSrc="iframeSrc2"
+      ></workFlowIframe>
+    </div>
+    <div class="ch_nav_box">
+      <div class="ch_nav_box_top">
+        <div @click="$emit('backPage')" class="ch_nav_box_top_item">
+          <el-tooltip class="item" effect="dark" content="返回" placement="top">
+            <img :src="require('../../assets/icon/course/return.png')" alt="" />
+          </el-tooltip>
+        </div>
+
+        <div @click="$emit('refresh')" class="ch_nav_box_top_item">
+          <el-tooltip class="item" effect="dark" content="刷新" placement="top">
+            <img
+              :src="require('../../assets/icon/course/refresh.png')"
+              alt=""
+            />
+          </el-tooltip>
+        </div>
+      </div>
+
+      <div class="ch_nav_box_middle">
+        <div
+          v-if="iframeSrc2.length"
+          :class="[
+            'ch_nav_box_middle_item',
+            itemType == 7 ? 'ch_nav_box_middle_item_active' : ''
+          ]"
+          @click.stop="changeItemType(7)"
+        >
+          <img
+            v-if="itemType == 7"
+            :src="
+              require('../../assets/icon/course/teachingAssistant_active.svg')
+            "
+          />
+          <img
+            v-if="itemType != 7"
+            :src="
+              require('../../assets/icon/course/teachingAssistant_default.svg')
+            "
+          />
+          <div>助教</div>
+        </div>
+      </div>
+      <div class="ch_nav_box_bottom">
+        <div
+          @click.stop="goStep(0)"
+          :class="{
+            disableBtn: IsFollow || IsLookOpen || splitScreenData.isOpen
+          }"
+        >
+          <el-tooltip
+            class="item"
+            effect="dark"
+            content="上一步"
+            placement="top"
+          >
+            <img :src="require('../../assets/icon/course/last.png')" />
+          </el-tooltip>
+        </div>
+
+        <div
+          @click.stop="goStep(1)"
+          :class="{
+            disableBtn: IsFollow || IsLookOpen || splitScreenData.isOpen
+          }"
+        >
+          <el-tooltip
+            class="item"
+            effect="dark"
+            content="下一步"
+            placement="top"
+          >
+            <img :src="require('../../assets/icon/course/next.png')" />
+          </el-tooltip>
+        </div>
+
+        <div @click="openSetting">
+          <el-tooltip
+            class="item"
+            effect="dark"
+            :content="type == 0 ? '展开' : '折叠'"
+            placement="top"
+          >
+            <img :src="require('../../assets/icon/course/menu.png')" />
+          </el-tooltip>
+        </div>
+      </div>
+    </div>
+    <!-- <div
+      v-if="fold"
+      class="itemFold"
+      ref="itemFoldRef"
+      v-click-outside="handleBlur"
+    >
+      <div @click="$emit('backPage')">
+        <img :src="require('../../assets/icon/course/return.png')" alt="" />
+        <span>返回</span>
+      </div>
+
+      <div @click="$emit('refresh')">
+        <img :src="require('../../assets/icon/course/refresh.png')" alt="" />
+        <span>刷新</span>
+      </div>
+    </div> -->
+  </div>
+</template>
+
+<script>
+import workFlowIframe from "./component/workFlowIframe.vue";
+export default {
+  emits: [
+    "refresh",
+    "goStep",
+    "backPage",
+    "authority",
+    "review",
+    "stopRecording",
+    "startRecording"
+  ],
+  components: {
+    workFlowIframe
+  },
+  props: {
+    courseDetail: {
+      type: Object,
+      default: () => {}
+    },
+    tType: {
+      type: String,
+      default: 0
+    },
+    navList: {
+      type: Array,
+      default: () => []
+    },
+    tcid: {
+      type: String,
+      default: ""
+    },
+    courseType: {
+      type: Number,
+      default: 0
+    },
+    taskCount: {
+      type: Number,
+      default: 0
+    },
+    worksStudent: {
+      type: Array,
+      default: () => []
+    },
+    fileList: {
+      type: Array,
+      default: () => []
+    },
+    videoStart: {
+      type: Boolean,
+      default: false
+    },
+    IsFollow: {
+      type: Boolean,
+      default: false
+    },
+    sIsOpen: {
+      type: Boolean,
+      default: false
+    },
+    IsLookOpen: {
+      type: Boolean,
+      default: false
+    },
+    splitScreenData: {
+      type: Object,
+      default: () => {
+        return {
+          isOpen: false,
+          userId: "",
+          uid: "",
+          myUid: ""
+        };
+      }
+    }
+  },
+  data() {
+    return {
+      isBtn: false,
+      userid: this.$route.query.userid,
+      oid: this.$route.query.oid,
+      courseId: this.$route.query.courseId,
+      tcid2: this.$route.query.tcid,
+      type: 0,
+      itemType: 0, //0--无  1-搜索  2-任务 3-对话
+      fileId: [],
+      showTipsLoading: false,
+      tipsList: [],
+      firstEnterTime: null,
+      canGetTips: true,
+      getTipsTimer: null,
+      getWangLoading: false,
+      canUseWangData: false,
+      wangData: "",
+      languageSetting: 0,
+      uploadFileStatus: {
+        file: null,
+        status: "",
+        percent: 0,
+        key: "",
+        uploadid: "",
+        loading: false
+      },
+      iframeSrc2: [],
+      canUseCourseId: [
+        "bfbe1913-2f87-11ef-bf55-005056b86db5",
+        "3a64b199-d2eb-11ef-a2d1-005056b86db5",
+        "bb0b1995-0207-11ef-b534-005056b86db5",
+        "f77921c8-d2f1-11ef-a2d1-005056b86db5"
+      ]
+    };
+  },
+  computed: {
+    showPopover: {
+      get() {
+        // return this.Annot
+        return (
+          this.splitScreenData.isOpen &&
+          this.splitScreenData.uid === this.splitScreenData.myUid
+        );
+      },
+      set(newValue) {
+        console.log(newValue);
+
+        // this.AnnotationCanvasShow = newValue
+      }
+    }
+  },
+  watch: {
+    courseType(newValue, oldValue) {
+      this.getAiApp();
+    },
+    taskCount(newValue) {
+      this.getAiApp();
+    }
+  },
+  mounted() {
+    let setting = this.courseDetail.setting;
+    if (setting) {
+      setting = JSON.parse(setting);
+      if (setting.languageSetting) {
+        this.languageSetting = setting.languageSetting;
+      }
+    }
+    this.setWidth();
+    this.firstEnterTime = new Date().getTime();
+    this.getAiApp();
+  },
+  methods: {
+    setWidth() {
+      let w = this.$refs.ch_box;
+      let w2 = w.offsetWidth + 20 + "px";
+      this.$emit("setWidth", w2);
+    },
+    openSetting() {
+      this.type = this.type == 1 ? 0 : 1;
+      this.$nextTick(() => {
+        if (this.type == 1) {
+          this.$parent.mlDialog = false;
+        }
+        this.setWidth();
+      });
+    },
+    changeItemType(type) {
+      this.type = 0;
+
+      if (this.itemType == type) {
+        this.itemType = 0;
+        this.type = 1;
+        this.openSetting();
+        return;
+      }
+      this.openSetting();
+      // this.$message.info("切换到"+type)
+      this.$nextTick(() => {
+        // if (this.itemType == 1 && type != 1) {
+        //   this.$refs.searchAreaRef.scrollBottom();
+        //   this.$refs.searchAreaRef.getWantSearch();
+        // } else if (this.itemType == 2) {
+        //   this.$refs.taskAreaRef.scrollBottom();
+        // } else if (this.itemType == 3) {
+        //   this.$refs.dialogAreaRef.scrollBottom();
+        // }
+        this.itemType = type;
+      });
+    },
+
+    getLang() {
+      let lang = "";
+      if (this.languageSetting == 0) {
+        lang = "Chinese.";
+      } else if (this.languageSetting == 1) {
+        lang = "Traditional Chinese.";
+      } else if (this.languageSetting == 2) {
+        lang = "English.";
+      }
+      return lang;
+    },
+    getAiApp() {
+      try {
+        let _chapters = JSON.parse(this.courseDetail.chapters);
+        let _list =
+          _chapters[this.courseType].chapterInfo[0].taskJson[this.taskCount]
+            .chapterData;
+        let _app = _list.find(i => i.type == 15);
+        if (_app) {
+          _app.src = _app.url;
+          this.iframeSrc2 = [_app];
+        } else {
+          this.iframeSrc2 = [];
+        }
+      } catch (error) {
+        console.log("👉==", error);
+        this.iframeSrc2 = [];
+      }
+    },
+    goStep(type) {
+      if (this.IsFollow || this.IsLookOpen || this.splitScreenData.isOpen)
+        return;
+      this.$emit("goStep", type);
+    }
+  }
+};
+</script>
+
+<style scoped>
+.ch_box {
+  width: auto;
+  background: rgb(255, 255, 255);
+  position: fixed;
+  height: calc(100% - 40px);
+  border-radius: 10px;
+  box-sizing: border-box;
+  right: 20px;
+  display: flex;
+  top: 20px;
+  z-index: 1000;
+}
+
+.ch_nav_box {
+  height: 100%;
+  width: 65px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  overflow-y: auto !important; /* 上下溢出显示滚动条 */
+  overflow-x: hidden !important; /* 左右溢出正常溢出 */
+  position: relative;
+  box-sizing: border-box;
+}
+
+.ch_content_box {
+  width: 400px;
+  height: 100%;
+  border-right: 2px solid #e7e7e7;
+}
+
+.ch_nav_box_bottom {
+  width: 100%;
+  box-sizing: border-box;
+  border-top: solid 1px #eaeaea;
+  display: flex;
+  flex-direction: column;
+}
+
+.disableBtn {
+  opacity: 0.5;
+  cursor: not-allowed !important;
+}
+
+.ch_nav_box_middle {
+  width: 100%;
+  box-sizing: border-box;
+  border-top: solid 1px #eaeaea;
+  flex-direction: column;
+  justify-content: space-between;
+}
+
+.ch_nav_box_middle_item {
+  width: 100%;
+  height: 80px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
+  transition: 0.3s;
+  font-size: 14px;
+}
+
+.ch_nav_box_middle_item_active {
+  background-color: #3681fc;
+  color: white;
+}
+
+.ch_nav_box_middle_item > img {
+  width: 24px;
+  height: 24px;
+  margin-bottom: 5px;
+}
+
+.ch_nav_box_bottom > div {
+  width: 100%;
+  height: 65px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
+}
+
+.ch_nav_box_bottom > div > img {
+  width: 24px;
+  height: 24px;
+}
+
+.ch_nav_box_top {
+  width: 100%;
+  height: auto;
+  margin-bottom: auto;
+}
+
+.ch_nav_box_top > div {
+  width: 100%;
+  height: 65px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
+  position: relative;
+}
+
+.boxItem {
+  width: 100%;
+  height: 65px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
+  position: relative;
+}
+
+.boxItem > img {
+  width: 24px;
+  height: 24px;
+  transition: 0.3s;
+}
+.ch_nav_box_top > div > img {
+  width: 24px;
+  height: 24px;
+  transition: 0.3s;
+}
+
+.itemFold {
+  position: absolute;
+  width: 130px;
+  right: 65px;
+  top: 0;
+  background: rgb(255, 255, 255);
+  box-sizing: border-box;
+  border: solid 1px #eaeaea;
+  /* border-top: solid 1px #eaeaea; */
+  z-index: 1000; /* 确保二级菜单在主菜单上层 */
+  border-radius: 10px;
+  box-sizing: border-box;
+  padding: 10px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}
+
+.itemFold > div {
+  width: 100%;
+  height: 45px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
+  margin: 5px 0;
+  border-radius: 10px;
+}
+
+.itemFold > div:hover {
+  background: #f3f7fd;
+}
+
+.itemFold > div > img {
+  width: 24px;
+  height: 24px;
+}
+
+.itemFold > div > span {
+  margin-left: 10px;
+}
+
+@media screen and (max-height: 820px) {
+  .ch_nav_box_bottom > div {
+    height: auto;
+    padding: 8px 0;
+  }
+
+  .ch_nav_box_middle_item {
+    height: auto;
+    padding: 8px 0;
+  }
+
+  .ch_nav_box_top > div {
+    height: auto;
+    padding: 8px 0;
+  }
+}
+
+.foldActive {
+  background-color: #f0f2f5;
+  padding: 10px;
+  border-radius: 10px;
+}
+
+.ch_nav_box_topFixed {
+  width: 100%;
+  height: 65px;
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+
+.ch_nav_box_topFixed_item {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+  height: 65px;
+  padding-top: 5px;
+  cursor: pointer;
+  border-radius: 10px 10px 0 0;
+}
+
+.ch_nav_box_topFixed_item > svg {
+  width: 25px;
+  height: 25px;
+  fill: #000;
+}
+
+.ch_nav_box_topFixed_item > span {
+  margin-top: 5px;
+  font-size: 14px;
+}
+
+.ch_nav_box_topFixed_item_active {
+  background-color: #3681fc;
+  color: #fff;
+}
+
+.ch_nav_box_topFixed_item_active > svg {
+  fill: #fff;
+}
+
+.ch_nav_box_topFixed_popover {
+  width: 100%;
+  height: 65px;
+  display: flex;
+}
+
+.ch_nav_box_topFixed_popover_item {
+  width: 100px;
+  height: 65px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
+}
+
+.ch_nav_box_topFixed_popover_item > svg {
+  width: 30px;
+  height: 30px;
+  fill: #000;
+}
+
+.ch_nav_box_topFixed_popover_item > span {
+  margin-top: 5px;
+}
+
+.drawerBox {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  font-weight: bold;
+}
+
+.drawerBox > span {
+  /* 字体竖着排列; */
+  writing-mode: vertical-rl;
+  margin-right: 10px;
+}
+</style>

+ 10 - 0
src/components/components/appStoreC.vue

@@ -42,6 +42,7 @@ import { myMixin } from "@/mixins/mixin.js"
                 userId: '',
                 appDialogVisible: false,
                 id: this.$route.query.courseId,
+                homeWorkLoading:false
             }
         },
         methods: {
@@ -77,6 +78,8 @@ import { myMixin } from "@/mixins/mixin.js"
                 // window.exposed_outputs
                 let Cow = JSON.stringify(_iframe.contentWindow.exposed_outputs)
 
+                if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+                this.homeWorkLoading = true
                 let params = [
                     {
                     uid: this.userId,
@@ -97,6 +100,10 @@ import { myMixin } from "@/mixins/mixin.js"
                         type: "success"
                     });
                         this.dialogVisibleSelectTeacher = false;
+                        setTimeout(() => {
+                            this.homeWorkLoading = false
+                        }, 500);
+
                         this.addOp3('1', "", { courseid: this.id,tool:'AI应用',data:Cow,type: "course_tool_sub" }, "success")
                         // this.selectAnswer = {};
                         this.$emit('selectSWorks');
@@ -104,6 +111,9 @@ import { myMixin } from "@/mixins/mixin.js"
                     })
                     .catch(err => {
                         this.addOp3('1', "", { courseid: this.id,tool:'AI应用',data:Cow,type: "course_tool_sub" }, err)
+                        setTimeout(() => {
+                            this.homeWorkLoading = false
+                        }, 500);
 
                         this.$message.error("提交失败");
                         console.error(err);

+ 21 - 7
src/components/components/askStatic2.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="sjBox" v-if="askJSONC && askJSONC.testJson">
-    <div class="a_add_title">
+    <div class="a_add_title" >
       <div style="font-size: 25px">{{ askJSONC.testTitle }}</div>
     </div>
     <div class="a_addBox">
@@ -33,7 +33,7 @@
                   cursor: pointer;
                 "
               >
-                {{ index + 1 + "、" + item.teststitle }}
+                {{ index + 1 + "、"  }} <span ref="latexElement" v-html="renderedFormula(item.teststitle)"></span>
               </div>
             </el-tooltip>
             <!-- </el-tooltip> -->
@@ -185,6 +185,8 @@
 </template>
 
 <script>
+import katex from 'katex'
+import 'katex/dist/katex.min.css'
 export default {
   props: ["askJSON", "checkJson"],
   data() {
@@ -197,10 +199,17 @@ export default {
       checkJson2: [],
     };
   },
-  watch: {
-    askJSON(val) {
-      this.askJSONC = this.askJSON ? JSON.parse(this.askJSON)[0] : {};
-    },
+  computed: {
+    renderedFormula() {
+      return function(val){
+        try {
+          return katex.renderToString(val,{ throwOnError: false });
+        } catch (e) {
+          console.error('KaTeX渲染错误:', e);
+          return val;
+        }
+      }
+    }
   },
   methods: {
     handleClose(done) {
@@ -229,6 +238,9 @@ export default {
         this.checkJson2 = this.checkJson;
       },
     },
+    askJSON(val) {
+      this.askJSONC = this.askJSON ? JSON.parse(this.askJSON)[0] : {};
+    },
   },
   mounted() {
     // this.askJSONC = this.askJSON ? JSON.parse(this.askJSON)[0] : {};
@@ -267,7 +279,9 @@ export default {
   font-size: 18px;
   width: 100%;
 }
-
+.a_add_head >>> .katex{
+  font-size: 16px;
+}
 .a_add_head .a_add_head_input {
   width: 300px;
 }

+ 81 - 16
src/components/components/choseWorksDetailDialog.vue

@@ -85,7 +85,7 @@
                         >
                           (多选题)
                         </div>
-                        <div>题目:{{ item1.teststitle }}</div>
+                        <div>题目:<span v-html="renderedFormula(item1.teststitle)"></span></div>
                       </div>
                       <img
                         v-if="item1.img"
@@ -1180,15 +1180,25 @@
 
 												<span v-if="[15].includes(toolType)" class="questionsAndAnswersSpan">{{ questionsAndAnswers(item) }}</span>
 
-												<span v-for="(answer,answerIndex) in worksCheckAnswer(item)" :key="item.userid+'-'+answerIndex+'-'+answer.index" v-if="[45].includes(toolType)">
-													<span v-if="answer.type===1" v-for="(item2,indP) in answer.label" :key="indP +'indP'">
-														<span :class="`${item2.right?'answerRight':'answerWrong'}`">{{ item2.label }}</span>
-													</span>
-													<span v-if="answer.type===2" class="answer2" :class="`${answer.isRight?'answerRightLine':'answerWrongLine'}`"
-                          v-for="(item3,indUi) in answer.label" :key="indUi + 'indUi2'">
-														<span :class="`${item3.right?'answerRight':'answerWrong'}`">{{ item3.label }}</span>
-													</span>
-												</span>
+                        <template v-if="[45].includes(toolType)">
+                          <span v-for="(answer,answerIndex) in worksCheckAnswer(item)" :key="item.userid+'-'+answerIndex+'-'+answer.index">
+                            
+                            <template v-if="answer.type===1">
+                              <span  v-for="(item2,indP) in answer.label" :key="indP +'indP'">
+                                <span :class="`${item2.right?'answerRight':'answerWrong'}`">{{ item2.label }}</span>
+                              </span>
+                            </template>
+
+                            <template v-if="answer.type===2">
+                              <span  class="answer2" :class="`${answer.isRight?'answerRightLine':'answerWrongLine'}`"
+                              v-for="(item3,indUi) in answer.label" :key="indUi + 'indUi2'">
+                                <span :class="`${item3.right?'answerRight':'answerWrong'}`">{{ item3.label }}</span>
+                              </span>
+                            </template>
+
+                          </span>
+                        </template>
+												
 
                         <div class="answerSelect "  v-if="[57].includes(toolType)">
                           <!-- <img style="width: 300px;" src="../../assets/icon/word2.png" /> -->
@@ -1356,7 +1366,8 @@ import smarter from './intelligentAnalysis/smarter.vue';
 import { tools as toolsList } from "@/common/tools2.js";
 import { myMixin } from "@/mixins/mixin.js"
 // import html2canvas from "html2canvas";
-
+import katex from 'katex'
+import 'katex/dist/katex.min.css'
 export default {
   mixins: [ myMixin ],
 	components:{
@@ -1418,6 +1429,7 @@ export default {
   },
   data() {
     return {
+      homeWorkLoading:false,
       toolsList:toolsList,
       appStoreUrl:'',
       chapInfoListData2:[],
@@ -1508,6 +1520,16 @@ export default {
   },
 
   computed: {
+    renderedFormula() {
+      return function(val){
+        try {
+          return katex.renderToString(val,{ throwOnError: false });
+        } catch (e) {
+          console.error('KaTeX渲染错误:', e);
+          return val;
+        }
+      }
+    },
     tableData() {
       let _result = [];
       if (this.show && this.toolIndex !== null && [45].includes(this.toolType)) {
@@ -1883,6 +1905,8 @@ export default {
             atool: 72
             }
         ];
+        if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+        this.homeWorkLoading = true
         this.ajax
             .post(this.$store.state.api + "addCourseWorks3-2", params)
             .then(res => {
@@ -1890,6 +1914,10 @@ export default {
                 message: "提交成功",
                 type: "success"
             });
+            setTimeout(() => {
+                this.homeWorkLoading = false
+            }, 500);
+
                 this.$emit('selectSWorks');
                 this.$emit('selectStudent');
                 document.getElementById('loadLi_JieE').children[0].style.display = "none"
@@ -1899,6 +1927,10 @@ export default {
             .catch(err => {
                document.getElementById('loadLi_JieE').children[0].style.display = "none"
                 this.$message.error("提交失败");
+                setTimeout(() => {
+                    this.homeWorkLoading = false
+                }, 500);
+
                 console.error(err);
                this.addOp3('1', "", { courseid: this.id,tool: 'AI应用',data: Cow,type: "course_tool_sub" }, err)
 
@@ -1964,7 +1996,8 @@ export default {
         },
       ];
       //  console.log('params',params);
-
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks5", params)
         .then((res) => {
@@ -1972,6 +2005,10 @@ export default {
             message: "提交成功",
             type: "success",
           });
+          setTimeout(() => {
+              this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool: '英语写作',data:JSON.stringify(myAnList) ,type: "course_tool_sub" }, 'success')
 
           this.englishList = {};
@@ -1979,6 +2016,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+          setTimeout(() => {
+              this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool: '英语写作',data:JSON.stringify(myAnList) ,type: "course_tool_sub" }, err)
         });
     },
@@ -2255,10 +2296,21 @@ export default {
           aTool: this.toolType,
           txt:text
         }]
-
+        if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+        this.homeWorkLoading = true
         this.ajax.post(this.$store.state.api+"addCourseWorks4-u2",params).then(res=>{
           document.getElementById('loadLi_JieE').children[0].style.display = "none"
           this.$message.success('上传成功')
+          setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+        })
+        .catch(err=>{
+          setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+          this.$message.success('上传失败')
+          console.log(err);
         })
         this.addOp3('1', "", { courseid: this.id,tool: 'Cocopi',data:JSON.stringify(text.replaceAll(/%/g, "%25")) ,type: "course_tool_sub" }, 'success')
 
@@ -2296,7 +2348,11 @@ export default {
         text = await this.getEditorContent(iframeWindow);
       }
       console.log('text',text);
-
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
+      setTimeout(() => {
+        this.homeWorkLoading = false
+      }, 1000);
       var _ajs = iframeWindow.document.createElement("script");
             _ajs.type = "text/javascript";
             _ajs.innerHTML =
@@ -2488,7 +2544,8 @@ export default {
           },
         ];
       }
-
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       // return console.log('params',params);
 
         this.ajax
@@ -2498,7 +2555,9 @@ export default {
               message: "提交成功",
               type: "success",
             });
-
+            setTimeout(() => {
+              this.homeWorkLoading = false
+            }, 500);
             // this.askList = [];
             this.$emit("selectStudent")
             this.$emit("selectSWorks")
@@ -2508,6 +2567,9 @@ export default {
           })
           .catch((err) => {
             this.$message.error("提交失败");
+            setTimeout(() => {
+              this.homeWorkLoading = false
+            }, 500);
             console.error(err);
             this.addOp3('1', "", { courseid: this.id,tool: this.toolsList[this.toolType],data:answerData ,type: "course_tool_sub" }, err)
 
@@ -4290,4 +4352,7 @@ ol {
   color: rgb(80, 80, 80);
   margin-bottom: 20px;
 }
+.a_add_head >>> .katex{
+  font-size: 14px;
+}
 </style>

+ 4 - 2
src/components/easy/studyStudent.vue

@@ -243,7 +243,7 @@
                       style="width: 100%; height: 100%; border: none"
                       security="restricted"
 											allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-                      v-if="pptImgUrl1.indexOf('knowledge.cocorobo.cn')!=-1 || pptImgUrl1.indexOf('cloud.cocorobo.cn')!=-1 || pptImgUrl1.indexOf('app.cocorobo.cn')!=-1"
+                      v-if="pptImgUrl1.indexOf('cocorobo.cn')!=-1"
                       :src="pptImgUrl1"
                     ></iframe>
                     <iframe
@@ -1497,8 +1497,9 @@
         </div>
         <iframe
             style="width: 100%; height: 100%; border: none"
+						:key="diffKey"
 						allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-            v-else-if="fulltype == 2 && (fullUrl.indexOf('knowledge.cocorobo.cn')!=-1 || fullUrl.indexOf('cloud.cocorobo.cn')!=-1) || fullUrl.indexOf('app.cocorobo.cn')!=-1"
+            v-else-if="fulltype == 2 && (fullUrl.indexOf('cocorobo')!=-1)"
             :src="fullUrl"
           ></iframe>
           <iframe
@@ -2906,6 +2907,7 @@ export default {
       tool: {},
       isWorkTool: [16, 32, 57, 4, 45, 15, 1, 3, 6, 7, 26, 41, 47, 48, 52, 50, 40],//, 40
       videoJson: {},
+      diffKey:"1",
     };
   },
   methods: {

+ 261 - 111
src/components/easy2/studyStudent.vue

@@ -258,55 +258,10 @@
           </div>
         </div>
       </div>
-      <div
-        class="body_student"
-        :style="{
-          width: mlDialog
-            ? 'calc(100% - ' +
-              `${!['2'].includes(tType) ? classRoomHelperWidth : '10px'}` +
-              ' - 20% - 40px)'
-            : 'calc(100% - ' +
-              `${!['2'].includes(tType) ? classRoomHelperWidth : '10px'}` +
-              ' - 10px)',
-          left: mlDialog ? 'calc(20% + 35px)' : '10px'
-        }"
-      >
-        <div
-          class="new_topFixed"
-          :style="{
-            width: mlDialog
-              ? 'calc(100% - ' +
-                `${!['2'].includes(tType) ? classRoomHelperWidth : '10px'}` +
-                ' - 20% - 40px)'
-              : 'calc(100% - ' +
-                `${!['2'].includes(tType) ? classRoomHelperWidth : '10px'}` +
-                ' - 10px)',
-            left: mlDialog ? 'calc(20% + 35px)' : '10px'
-          }"
-        ></div>
-        <div
-          class="new_top"
-          :style="{
-            width: mlDialog
-              ? 'calc(100% - ' +
-                `${!['2'].includes(tType) ? classRoomHelperWidth : '10px'}` +
-                ' - 20% - 47px)'
-              : 'calc(100% - ' +
-                `${!['2'].includes(tType) ? classRoomHelperWidth : '10px'}` +
-                ' - 18px)',
-            left: mlDialog ? 'calc(20% + 35px)' : '10px'
-          }"
-        >
-          <div
-            class="courseIndex"
-            :style="{
-              width:
-                (orgArray.includes(org) || oidArray.includes(oid)) &&
-                !['2'].includes(tType)
-                  ? '100%'
-                  : 'calc(100% - 745px)'
-            }"
-          >
+      <div class="body_student" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 40px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 10px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }">
+        <div class="new_topFixed" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 40px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 10px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }"></div>
+        <div class="new_top" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 47px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 18px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }">
+          <div class="courseIndex" :style="{width: (orgArray.includes(org) || oidArray.includes(oid))? '100%' : 'calc(100% - 745px)'}">
             <div>任务{{ taskCount + 1 }}</div>
             <el-tooltip
               effect="light"
@@ -326,8 +281,7 @@
           <div
             class="btnAll"
             v-show="
-              (!orgArray.includes(org) && !oidArray.includes(oid)) ||
-                ['2'].includes(tType)
+              (!orgArray.includes(org) && !oidArray.includes(oid))
             "
           >
             <div class="btnLeft">
@@ -657,6 +611,7 @@
                   <iframe
                       style="width: 100%; height: 100%; border: none"
 											allow="camera *; microphone *;display-capture;midi;encrypted-media;"
+                      :key="diffKey"
                       v-if="pptImgUrl1.indexOf('knowledge.cocorobo.cn')!=-1 || pptImgUrl1.indexOf('cloud.cocorobo.cn')!=-1 || pptImgUrl1.indexOf('app.cocorobo.cn')!=-1"
                       :src="pptImgUrl1"
                     ></iframe>
@@ -668,6 +623,16 @@
                       :src="pptImgUrl1"
                     ></iframe>
                   </div>
+                  <div
+                    class="wheel"
+                    v-if="showType === 16"
+                    style="width: 95%; margin: 0 auto"
+                  >
+                    <iframe
+                      style="width: 100%; height: 100%; border: none"
+                      :src="pptImgUrl1"
+                    ></iframe>
+                  </div>
                   <div
                     class="wheel"
                     v-if="showType == 3"
@@ -868,6 +833,24 @@
                               />
                             </div>
                           </div>
+                          <div class="navListItem" v-if="vitem.type == 16">
+                            <div
+                              class="navText"
+                              @click="checkHtml(vitem, vindex)"
+                              :class="isClickNav == vindex ? 'isClickNav' : ''"
+                            >
+                              {{ vitem.name }}
+                            </div>
+                            <div
+                              class="downIcon"
+                              @click="checkFileFull1(vitem.type, vitem)"
+                            >
+                              <img
+                                src="../../assets/icon/newIcon/allScreen.png"
+                                alt
+                              />
+                            </div>
+                          </div>
                         </div>
                         <div
                           class="fileC_box"
@@ -6223,7 +6206,7 @@
                               cursor: pointer;
                             "
                           >
-                            {{ index + 1 + "、" + item.teststitle }}
+                            {{ index + 1 + "、"  }} <span v-html="renderedFormula(item.teststitle)"></span>
                           </div>
                         </el-tooltip>
                       </div>
@@ -11956,6 +11939,22 @@
         )
       "
     ></classRoomHelper>
+    <studentClassRoomHelper v-else-if="['2'].includes(tType)" @studentFreePreview="studentFreePreview" @OpenJobPreview="OpenJobPreview" :videoStart="videoStart" :IsFollow="IsFollow" :sIsOpen="sIsOpen" :IsLookOpen="IsLookOpen" :splitScreenData="splitScreenData" @splitScreenBehavior="splitScreenBehavior" @startRecording="startRecording" @stopRecording="stopRecording" :fileList="vChapterData[taskCount]" :worksStudent="worksStudent" :courseType="parseInt(courseType)" :taskCount="taskCount" :tcid="tcid" :navList="navList" v-show="orgArray.includes(org) || oidArray.includes(oid)" :courseDetail="courseDetail" :tType="tType" @setWidth="setClassRoomHelperWidth" @refresh="refreshCourse" @goStep="nextOrpreSteps" @authority="juriVisible = true" @review="setPz" @backPage="goTo(
+      '/courseDetail?userid=' +
+        userid +
+        '&oid=' +
+        oid +
+        '&org=' +
+        org +
+        '&cid=' +
+        classId +
+        '&courseId=' +
+        id +
+        '&tType=' +
+        tType +
+        '&screenType=' +
+        screenType
+    )"></studentClassRoomHelper>
     <div
       class="pButton"
       @click="(pzDialog = true), selectPz()"
@@ -13885,7 +13884,34 @@
         </el-button>
         <div
           class="wheel"
-          v-if="
+          v-if="fulltype == 1"
+          style="
+            box-shadow: 0 0 6px 1px #f2f2f2;
+						height:100%;
+            width: 100%;
+            background: #f1f1f1;
+          "
+        >
+          <div class="title" style="width: 100%; box-sizing: border-box">
+            查看文档
+          </div>
+          <el-form class="textBox" style="height: 90%">
+            <el-form-item class="textTitle">
+              <div style="font-size: 22px">
+                {{ fullUrl.name }}
+              </div>
+            </el-form-item>
+            <!-- <div style="color: #918f8f; width: 85%">文档内容</div> -->
+            <div
+              v-html="fullUrl.url"
+              class="textContent"
+              style="height: auto"
+            ></div>
+          </el-form>
+        </div>
+        <div
+          class="wheel"
+          v-else-if="
             (fulltype == 2 || fulltype == 4) &&
               fullUrl.indexOf(
                 'https://view.officeapps.live.com/op/view.aspx?src='
@@ -13901,7 +13927,7 @@
         <iframe
             style="width: 100%; height: 100%; border: none"
 						allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-            v-else-if="(fulltype == 2 || fulltype == 4) && (fullUrl.indexOf('knowledge.cocorobo.cn')!=-1 || fullUrl.indexOf('cloud.cocorobo.cn')!=-1) || fullUrl.indexOf('app.cocorobo.cn')!=-1"
+            v-else-if="(fulltype == 2 || fulltype == 4) && (fullUrl.indexOf('cocorobo')!=-1)"
             :src="fullUrl"
           ></iframe>
           <iframe
@@ -13916,33 +13942,14 @@
           :pdfUrl="fullUrl"
           style="width: 100%; height: 100%; overflow: auto"
         ></pdf>
-        <div
-          class="wheel"
-          v-if="fulltype == 1"
-          style="
-            box-shadow: 0 0 6px 1px #f2f2f2;
-						height:100%;
-            width: 100%;
-            background: #f1f1f1;
-          "
-        >
-          <div class="title" style="width: 100%; box-sizing: border-box">
-            查看文档
-          </div>
-          <el-form class="textBox" style="height: 90%">
-            <el-form-item class="textTitle">
-              <div style="font-size: 22px">
-                {{ fullUrl.name }}
-              </div>
-            </el-form-item>
-            <!-- <div style="color: #918f8f; width: 85%">文档内容</div> -->
-            <div
-              v-html="fullUrl.url"
-              class="textContent"
-              style="height: auto"
-            ></div>
-          </el-form>
-        </div>
+        <iframe
+          style="width: 100%; height: 100%; border: none"
+          security="restricted"
+          v-if="(fulltype == 16)"
+          sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts allow-popups"
+          :src="fullUrl"
+        ></iframe>
+
       </div>
       <!-- <div slot="footer">
         <el-button @click="fullDialogVisible = false">关 闭</el-button>
@@ -16246,6 +16253,7 @@ import correctText from "../components/correctText.vue";
 import scoreItem from "../scoreList/scoreItem.vue";
 import scoreZong from "../scoreZong/index.vue";
 import classRoomHelper from "../classRoomHelper/index.vue";
+import studentClassRoomHelper from '../classRoomHelper/studentIndex.vue'
 import markScore from "./commpont/markScore";
 import markDialog from "./commpont/markDialog";
 import evaTable from "./commpont/evaTable";
@@ -16254,7 +16262,8 @@ import statisticalAnalysis from "../components/statisticalAnalysis.vue";
 import choseWorksDetailDialog from "../components/choseWorksDetailDialog.vue";
 import appStoreC from "../components/appStoreC.vue";
 import cocoFlowDia from "../components/cocoFlowDia.vue";
-
+import katex from 'katex'
+import 'katex/dist/katex.min.css'
 
 import choseWordCloud from '../components/choseWordCloud.vue'
 import { myMixin } from "@/mixins/mixin.js"
@@ -16350,10 +16359,12 @@ export default {
     statisticalAnalysis,
     choseWorksDetailDialog,
     appStoreC,
-    cocoFlowDia
+    cocoFlowDia,
+    studentClassRoomHelper
   },
   data() {
     return {
+      homeWorkLoading:false,
       wordCloudKey: 0,
       bg: null,
       drawShow: false,
@@ -16764,7 +16775,8 @@ export default {
         behavior: null
       },
       confirmOpenDig:false,
-      confirmOpenDigData:''
+      confirmOpenDigData:'',
+      diffKey:"1"
     };
   },
   methods: {
@@ -17872,6 +17884,8 @@ export default {
           type: 7
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then(res => {
@@ -17880,7 +17894,10 @@ export default {
             type: "success"
           });
           this.addOp3('1', "", { courseid: this.id,tool:'选择匹配',data: JSON.stringify(this.selectAnswer.answer),type: "course_tool_sub" }, "success")
-          
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.dialogVisibleSelect = false;
           // this.selectAnswer = {};
           this.selectSWorks();
@@ -17889,6 +17906,10 @@ export default {
         .catch(err => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'选择匹配',data: JSON.stringify(this.selectAnswer.answer),type: "course_tool_sub" }, err)
 
         });
@@ -17945,6 +17966,8 @@ export default {
           type: 9
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then(res => {
@@ -17953,6 +17976,9 @@ export default {
             type: "success"
           });
           this.addOp3('1', "", { courseid: this.id,tool:'排序',data: JSON.stringify(this.sentenceList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleSentence = false;
           // this.selectAnswer = {};
@@ -17962,6 +17988,10 @@ export default {
         .catch(err => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'排序',data: JSON.stringify(this.sentenceList),type: "course_tool_sub" }, err)
 
         });
@@ -18018,6 +18048,8 @@ export default {
         .catch(() => {});
     },
     addTableWorks() {
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       let params = [
         {
           uid: this.userid,
@@ -18036,6 +18068,10 @@ export default {
             message: "提交成功",
             type: "success"
           });
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'表格',data:JSON.stringify(this.tableJson),type: "course_tool_sub" }, "success")
 
           this.dialogVisibleTable = false;
@@ -18046,6 +18082,10 @@ export default {
         .catch(err => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'表格',data:JSON.stringify(this.tableJson),type: "course_tool_sub" }, err)
 
         });
@@ -18110,6 +18150,8 @@ export default {
           atool: 52
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks3-2", params)
         .then(res => {
@@ -18118,6 +18160,9 @@ export default {
             type: "success"
           });
           this.addOp3('1', "", { courseid: this.id,tool:'文档',data:JSON.stringify(this.wordJson),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleWord = false;
           // this.selectAnswer = {};
@@ -18127,6 +18172,10 @@ export default {
         .catch(err => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'文档',data:JSON.stringify(this.wordJson),type: "course_tool_sub" }, err)
 
         });
@@ -18207,6 +18256,8 @@ export default {
           type: typesql
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorksR1", params)
         .then(res => {
@@ -18215,6 +18266,9 @@ export default {
             type: "success"
           });
           this.addOp3('1', "", { courseid: this.id,tool:'作业提交',data: this.studyJuri[0].cover[0].url,type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.studyJuri[0].cover = [];
           this.dialogVisible = false;
@@ -18223,6 +18277,10 @@ export default {
         .catch(err => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'作业提交',data: this.studyJuri[0].cover[0].url,type: "course_tool_sub" }, err)
 
         });
@@ -18250,6 +18308,8 @@ export default {
           content: JSON.stringify(_files)
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorksPl", params)
         .then(res => {
@@ -18258,6 +18318,9 @@ export default {
             type: "success"
           });
           this.addOp3('1', "", { courseid: this.id,tool:'批量上传',data: JSON.stringify(_files),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.plworkFile = [];
           this.dialogVisiblePl = false;
@@ -18266,6 +18329,10 @@ export default {
         .catch(err => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'批量上传',data: JSON.stringify(_files),type: "course_tool_sub" }, err)
 
         });
@@ -18303,6 +18370,8 @@ export default {
           text: ""
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks5", params)
         .then(res => {
@@ -18310,6 +18379,10 @@ export default {
             message: "提交成功",
             type: "success"
           });
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'学生分组',data:JSON.stringify({
             type: typesql,
             groupIndex: this.groupIndex,
@@ -18322,6 +18395,9 @@ export default {
         .catch(err => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
           this.addOp3('1', "", { courseid: this.id,tool:'学生分组',data:JSON.stringify({
             type: typesql,
             groupIndex: this.groupIndex,
@@ -18353,6 +18429,8 @@ export default {
           text: ""
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks5", params)
         .then(res => {
@@ -18360,6 +18438,10 @@ export default {
             message: "提交成功",
             type: "success"
           });
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'英语写作',
               data:  JSON.stringify(this.myAnList),
               type: "course_tool_sub" }, "success")
@@ -18372,6 +18454,10 @@ export default {
         })
         .catch(err => {
           this.$message.error("提交失败");
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           console.error(err);
           this.addOp3('1', "", { courseid: this.id,tool:'英语写作',
               data:  JSON.stringify(this.myAnList),
@@ -21423,6 +21509,9 @@ export default {
       this.getHomeWork();
       this.getCourseDetail(2);
       this.$forceUpdate();
+      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+        this.setCTask();
+      }
     },
     openTask(s, n, i) {
       this.refreshAssembly();
@@ -21552,6 +21641,9 @@ export default {
           }</span>`
         );
       }
+      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+        this.setCTask();
+      }
     },
 
     get(i) {
@@ -21584,6 +21676,8 @@ export default {
           type: 3
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then(res => {
@@ -21592,6 +21686,9 @@ export default {
             type: "success"
           });
           this.addOp3('1', "", { courseid: this.id,tool:'问答',data:JSON.stringify(this.answerList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.answerList = [];
           this.answerDialogVisible = false;
@@ -21601,6 +21698,10 @@ export default {
         })
         .catch(err => {
           this.$message.error("提交失败");
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           console.error(err);
           this.addOp3('1', "", { courseid: this.id,tool:'问答',data:JSON.stringify(this.answerList),type: "course_tool_sub" }, err)
 
@@ -22144,9 +22245,9 @@ export default {
           _this.selectStudent();
           _this.selectSLook();
           _this.getPick();
-          if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
-            _this.setCTask();
-          }
+          // if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
+          //   _this.setCTask();
+          // }
           if (_this.dialogVisibleGroup) {
             _this.groupJson =
               _this.chapInfoList[_this.courseType].chapterInfo[0].taskJson[
@@ -22170,9 +22271,9 @@ export default {
             _this.selectSLook();
             _this.getPick();
             // _this.getSplitScreenData();
-            if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
-              _this.setCTask();
-            }
+            // if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
+            //   _this.setCTask();
+            // }
             if (_this.dialogVisibleGroup) {
               _this.groupJson =
                 _this.chapInfoList[_this.courseType].chapterInfo[0].taskJson[
@@ -22900,6 +23001,7 @@ export default {
         url = "https://" + url;
       }
       this.pptImgUrl1 = "";
+      this.diffKey = new Date().getTime();
 
       setTimeout(() => {
         this.pptImgUrl1 = url;
@@ -22919,6 +23021,12 @@ export default {
         }</span>`
       );
     },
+    checkHtml(f, i){
+      this.showType = 16;
+      this.pptImgUrl1 = f.url;
+      this.isClickNav = i;
+      this.$forceUpdate();
+    },
     async downFile(f, i) {
       this.isClickNav = "";
       this.pptImgUrl1 = "";
@@ -22977,6 +23085,8 @@ export default {
           type: 6
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then(res => {
@@ -22985,6 +23095,9 @@ export default {
             type: "success"
           });
           this.addOp3('1', "", { courseid: this.id,tool:'个人评价',data: JSON.stringify(this.eScore),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.eScore = { eBzText: "", eStar: [] };
           this.studentEvalDialogVisible = false;
@@ -22993,6 +23106,10 @@ export default {
         .catch(err => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'个人评价',data: JSON.stringify(this.eScore),type: "course_tool_sub" }, err)
 
         });
@@ -23051,6 +23168,8 @@ export default {
           type: 2
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then(res => {
@@ -23059,6 +23178,9 @@ export default {
             type: "success"
           });
           this.addOp3('1', "", { courseid: this.id,tool:'问卷调查',data:JSON.stringify(this.askList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.askList = [];
           this.dialogVisible5 = false;
@@ -23069,6 +23191,10 @@ export default {
         .catch(err => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'问卷调查',data:JSON.stringify(this.askList),type: "course_tool_sub" }, err)
 
         });
@@ -23143,6 +23269,8 @@ export default {
           type: 8
         }
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then(res => {
@@ -23151,6 +23279,9 @@ export default {
             type: "success"
           });
           this.addOp3('1', "", { courseid: this.id,tool:'选择题',data:JSON.stringify(this.askList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.askList = [];
           this.dialogVisibleChoice = false;
@@ -23161,6 +23292,10 @@ export default {
         .catch(err => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'选择题',data:JSON.stringify(this.askList),type: "course_tool_sub" }, err)
 
         });
@@ -24305,6 +24440,9 @@ export default {
       }else if (t == 15) {
         this.fulltype = 4;
         this.fullUrl = f.url;
+      } else if (t == 16) {
+        this.fulltype = 16;
+        this.fullUrl = f.url;
       } else if (
         t == 3 &&
         f.url.split(".")[f.url.split(".").length - 1].toLocaleUpperCase() ==
@@ -25642,15 +25780,15 @@ export default {
       if (!document.fullscreenElement) {
         this.enterFullScreen();
       }
-      if (this.timer2) {
-        clearInterval(this.timer2);
-        this.timer2 = null;
-        console.log('清除定时器');
+      // if (this.timer2) {
+      //   clearInterval(this.timer2);
+      //   this.timer2 = null;
+      //   console.log('清除定时器');
 
-      }
-      this.timer2 = setInterval(()=> {
-        this.getSplitScreenData();//获取分屏数据
-      }, 1000);
+      // }
+      // this.timer2 = setInterval(()=> {
+      //   this.getSplitScreenData();//获取分屏数据
+      // }, 1000);
       this.IsLookOpen = flase
       this.$message.success("分屏模式已开启");
     },
@@ -25702,13 +25840,13 @@ export default {
               this.splitScreenData.uid = "";
               this.splitScreenData.behavior = null;
               this.$message.error("已结束分屏模式");
-              if (this.timer2) {
-                clearInterval(this.timer2);
-                this.timer2 = null;
-              }
-              this.timer2 = setInterval(()=> {
-                this.getSplitScreenData();//获取分屏数据
-              }, 5000);
+              // if (this.timer2) {
+              //   clearInterval(this.timer2);
+              //   this.timer2 = null;
+              // }
+              // this.timer2 = setInterval(()=> {
+              //   this.getSplitScreenData();//获取分屏数据
+              // }, 5000);
               this.$confirm("教师已结束分屏,确定后自由预览。", "提示", {
                 confirmButtonText: '确定', //确认按钮的文字
                 showCancelButton: false, //是否显示取消按钮
@@ -25978,6 +26116,16 @@ export default {
     this.updateSplitScreenData(1);
   },
   computed: {
+    renderedFormula() {
+      return function(val){
+        try {
+          return katex.renderToString(val,{ throwOnError: false });
+        } catch (e) {
+          console.error('KaTeX渲染错误:', e);
+          return val;
+        }
+      }
+    },
     isAndroid() {
       return /Android/i.test(navigator.userAgent);
     },
@@ -28215,8 +28363,8 @@ export default {
   width: 400px;
 }
 
-.e_add_btn {
-}
+/* .e_add_btn {
+} */
 
 .e_add_content {
   display: flex;
@@ -28829,7 +28977,9 @@ export default {
   display: flex;
   align-items: center;
 }
-
+.tool_right_box >>> .katex {
+  font-size: 16px;
+}
 .tool_right_box + .tool_right_box {
   margin-top: 10px;
 }
@@ -29747,8 +29897,8 @@ ol {
   border-radius: 5px;
 }
 
-.groupBox {
-}
+/* .groupBox {
+} */
 
 .groupContent + .groupContent {
   margin-top: 30px;

+ 291 - 93
src/components/easy3/studyStudent.vue

@@ -235,10 +235,10 @@
           </div>
         </div>
       </div>
-      <div class="body_student" :style="{width: mlDialog ? 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 20% - 40px)' : 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 10px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }">
-        <div class="new_topFixed" :style="{width: mlDialog ? 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 20% - 40px)' : 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 10px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }"></div>
-        <div class="new_top" :style="{width: mlDialog ? 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 20% - 47px)' : 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 18px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }">
-          <div class="courseIndex" :style="{width: (orgArray.includes(org) || oidArray.includes(oid)) && !['2'].includes(tType) ? '100%' : 'calc(100% - 745px)'}">
+      <div class="body_student" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 40px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 10px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }">
+        <div class="new_topFixed" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 40px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 10px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }"></div>
+        <div class="new_top" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 47px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 18px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }">
+          <div class="courseIndex" :style="{width: (orgArray.includes(org) || oidArray.includes(oid))? '100%' : 'calc(100% - 745px)'}">
             <div>任务{{ taskCount + 1 }}</div>
             <el-tooltip
               effect="light"
@@ -256,7 +256,7 @@
             </el-tooltip>
           </div>
 					<!-- v-show="org !== '1973f6c7-1561-11ee-91d8-005056b86db5' || org !== '777559d2-7239-11ee-b98c-005056b86db5'" -->
-          <div class="btnAll" v-show="!orgArray.includes(org) && !oidArray.includes(oid) || ['2'].includes(tType)">
+          <div class="btnAll" v-show="!orgArray.includes(org) && !oidArray.includes(oid)">
             <div class="btnLeft">
               <el-tooltip effect="light" content="刷新" placement="top">
                 <div class="reBtnIcon" @click="refreshCourse">
@@ -620,8 +620,9 @@
 
                   <iframe
                       style="width: 100%; height: 100%; border: none"
+                      :key="diffKey"
 											allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-                      v-if="pptImgUrl1.indexOf('knowledge.cocorobo.cn')!=-1 || pptImgUrl1.indexOf('cloud.cocorobo.cn')!=-1 || pptImgUrl1.indexOf('app.cocorobo.cn')!=-1"
+                      v-if="pptImgUrl1.indexOf('cocorobo')!=-1"
                       :src="pptImgUrl1"
                     ></iframe>
                     <iframe
@@ -632,6 +633,16 @@
                       :src="pptImgUrl1"
                     ></iframe>
 
+                  </div>
+                   <div
+                    class="wheel"
+                    v-if="showType === 16"
+                    style="width: 95%; margin: 0 auto"
+                  >
+                    <iframe
+                      style="width: 100%; height: 100%; border: none"
+                      :src="pptImgUrl1"
+                    ></iframe>
                   </div>
                   <div
                     class="wheel"
@@ -826,6 +837,24 @@
                               />
                             </div>
                           </div>
+                          <div class="navListItem" v-if="vitem.type == 16">
+                            <div
+                              class="navText"
+                              @click="checkHtml(vitem, vindex)"
+                              :class="isClickNav == vindex ? 'isClickNav' : ''"
+                            >
+                              {{ vitem.name }}
+                            </div>
+                            <div
+                              class="downIcon"
+                              @click="checkFileFull1(vitem.type, vitem)"
+                            >
+                              <img
+                                src="../../assets/icon/newIcon/allScreen.png"
+                                alt
+                              />
+                            </div>
+                          </div>
                         </div>
                         <div class="fileC_box" v-if="fileC[0].length > 0">
                           <div class="fileC_title">以下文件不支持预览</div>
@@ -4436,7 +4465,7 @@
                               cursor: pointer;
                             "
                           >
-                            {{ index + 1 + "、" + item.teststitle }}
+                            {{ index + 1 + "、"  }} <span v-html="renderedFormula(item.teststitle)"></span>
                           </div>
                         </el-tooltip>
                       </div>
@@ -8567,21 +8596,37 @@
     </div>
 				<!-- v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5' || org == '884c5665-a453-46f3-b7b6-01d575290aa9'" -->
 		<classRoomHelper v-if="!['2'].includes(tType)" @studentFreePreview="studentFreePreview" @OpenJobPreview="OpenJobPreview" :videoStart="videoStart" :IsFollow="IsFollow" :sIsOpen="sIsOpen" :IsLookOpen="IsLookOpen" :splitScreenData="splitScreenData" @splitScreenBehavior="splitScreenBehavior" @startRecording="startRecording" @stopRecording="stopRecording" :fileList="vChapterData[taskCount]" :worksStudent="worksStudent" :courseType="parseInt(courseType)" :taskCount="taskCount" :tcid="tcid" :navList="navList" v-show="orgArray.includes(org) || oidArray.includes(oid)" ref="classRoomHelperRef" :courseDetail="courseDetail" :tType="tType" @setWidth="setClassRoomHelperWidth" @refresh="refreshCourse" @goStep="nextOrpreSteps" @authority="juriVisible = true" @review="setPz" @backPage="goTo(
-                    '/courseDetail?userid=' +
-                      userid +
-                      '&oid=' +
-                      oid +
-                      '&org=' +
-                      org +
-                      '&cid=' +
-                      classId +
-                      '&courseId=' +
-                      id +
-                      '&tType=' +
-                      tType +
-                      '&screenType=' +
-                      screenType
-                  )"></classRoomHelper>
+        '/courseDetail?userid=' +
+          userid +
+          '&oid=' +
+          oid +
+          '&org=' +
+          org +
+          '&cid=' +
+          classId +
+          '&courseId=' +
+          id +
+          '&tType=' +
+          tType +
+          '&screenType=' +
+          screenType
+      )"></classRoomHelper>
+    <studentClassRoomHelper v-else-if="['2'].includes(tType)" @studentFreePreview="studentFreePreview" @OpenJobPreview="OpenJobPreview" :videoStart="videoStart" :IsFollow="IsFollow" :sIsOpen="sIsOpen" :IsLookOpen="IsLookOpen" :splitScreenData="splitScreenData" @splitScreenBehavior="splitScreenBehavior" @startRecording="startRecording" @stopRecording="stopRecording" :fileList="vChapterData[taskCount]" :worksStudent="worksStudent" :courseType="parseInt(courseType)" :taskCount="taskCount" :tcid="tcid" :navList="navList" v-show="orgArray.includes(org) || oidArray.includes(oid)" :courseDetail="courseDetail" :tType="tType" @setWidth="setClassRoomHelperWidth" @refresh="refreshCourse" @goStep="nextOrpreSteps" @authority="juriVisible = true" @review="setPz" @backPage="goTo(
+    '/courseDetail?userid=' +
+      userid +
+      '&oid=' +
+      oid +
+      '&org=' +
+      org +
+      '&cid=' +
+      classId +
+      '&courseId=' +
+      id +
+      '&tType=' +
+      tType +
+      '&screenType=' +
+      screenType
+  )"></studentClassRoomHelper>
     <div
       class="pButton"
       @click="(pzDialog = true), selectPz()"
@@ -10466,40 +10511,7 @@
         >
           退出全屏
         </el-button>
-        <div
-          class="wheel"
-          v-if="
-            (fulltype == 2 || fulltype == 4) &&
-            fullUrl.indexOf(
-              'https://view.officeapps.live.com/op/view.aspx?src='
-            ) != -1
-          "
-          style="width: 100%;height:100%; margin: 0 auto"
-        >
-          <iframe
-            style="width: 100%; height: 100%; border: none"
-            :src="fullUrl"
-          ></iframe>
-        </div>
-        <iframe
-            style="width: 100%; height: 100%; border: none"
-						allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-            v-else-if="(fulltype == 2 || fulltype == 4) && (fullUrl.indexOf('knowledge.cocorobo.cn')!=-1 || fullUrl.indexOf('cloud.cocorobo.cn')!=-1) || fullUrl.indexOf('app.cocorobo.cn')!=-1"
-            :src="fullUrl"
-          ></iframe>
-          <iframe
-            style="width: 100%; height: 100%; border: none"
-            security="restricted"
-            v-else-if="(fulltype == 2 || fulltype == 4)"
-            sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts allow-popups"
-            :src="fullUrl"
-          ></iframe>
-        <pdf
-          v-else-if="fulltype == 3"
-          :pdfUrl="fullUrl"
-          style="width: 100%; height: 100%; overflow: auto"
-        ></pdf>
-        <div
+         <div
           class="wheel"
           v-if="fulltype == 1"
           style="
@@ -10526,6 +10538,47 @@
             ></div>
           </el-form>
         </div>
+        <div
+          class="wheel"
+          v-else-if="
+            (fulltype == 2 || fulltype == 4) &&
+            fullUrl.indexOf(
+              'https://view.officeapps.live.com/op/view.aspx?src='
+            ) != -1
+          "
+          style="width: 100%;height:100%; margin: 0 auto"
+        >
+          <iframe
+            style="width: 100%; height: 100%; border: none"
+            :src="fullUrl"
+          ></iframe>
+        </div>
+        <iframe
+            style="width: 100%; height: 100%; border: none"
+						allow="camera *; microphone *;display-capture;midi;encrypted-media;"
+            v-else-if="(fulltype == 2 || fulltype == 4) && (fullUrl.indexOf('knowledge.cocorobo.cn')!=-1 || fullUrl.indexOf('cloud.cocorobo.cn')!=-1) || fullUrl.indexOf('app.cocorobo.cn')!=-1"
+            :src="fullUrl"
+        ></iframe>
+        <iframe
+          style="width: 100%; height: 100%; border: none"
+          security="restricted"
+          v-else-if="(fulltype == 2 || fulltype == 4)"
+          sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts allow-popups"
+          :src="fullUrl"
+        ></iframe>
+        <pdf
+          v-else-if="fulltype == 3"
+          :pdfUrl="fullUrl"
+          style="width: 100%; height: 100%; overflow: auto"
+        ></pdf>
+        <iframe
+          style="width: 100%; height: 100%; border: none"
+          security="restricted"
+          v-if="(fulltype == 16)"
+          sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts allow-popups"
+          :src="fullUrl"
+        ></iframe>
+       
       </div>
       <!-- <div slot="footer">
         <el-button @click="fullDialogVisible = false">关 闭</el-button>
@@ -12552,6 +12605,7 @@ import correctText from '../components/correctText.vue'
 import scoreItem from '../scoreList/scoreItem.vue'
 import scoreZong from '../scoreZong/index.vue'
 import classRoomHelper from '../classRoomHelper/index.vue'
+import studentClassRoomHelper from '../classRoomHelper/studentIndex.vue'
 import MarkdownIt from "markdown-it";
 import statisticalAnalysis from '../components/statisticalAnalysis.vue'
 import choseWorksDetailDialog from '../components/choseWorksDetailDialog.vue'
@@ -12562,7 +12616,8 @@ import appStoreC from "../components/appStoreC.vue";
 import cocoFlowDia from "../components/cocoFlowDia.vue";
 import { myMixin } from "@/mixins/mixin.js"
 import { tools as toolsList } from "@/common/tools2.js";
-
+import katex from 'katex'
+import 'katex/dist/katex.min.css'
 let converter = OpenCC.Converter({
   from: "hk",
   to: "cn"
@@ -12648,10 +12703,12 @@ export default {
 		statisticalAnalysis,
 		choseWorksDetailDialog,
     appStoreC,
-    cocoFlowDia
+    cocoFlowDia,
+    studentClassRoomHelper
   },
   data() {
     return {
+      homeWorkLoading:false,
 			toolsList: toolsList,
       wordCloudKey: 0,
       bg: null,
@@ -13029,7 +13086,8 @@ export default {
         behavior:null,
       },
       confirmOpenDig:false,
-      confirmOpenDigData:''
+      confirmOpenDigData:'',
+      diffKey:"1"
     };
   },
   methods: {
@@ -13548,6 +13606,8 @@ export default {
           type: 7,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -13556,6 +13616,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'选择匹配',data: JSON.stringify(this.selectAnswer.answer),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleSelect = false;
           // this.selectAnswer = {};
@@ -13565,6 +13628,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'选择匹配',data: JSON.stringify(this.selectAnswer.answer),type: "course_tool_sub" }, err)
 
         });
@@ -13621,6 +13688,8 @@ export default {
           type: 9,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -13629,6 +13698,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'排序',data: JSON.stringify(this.sentenceList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleSentence = false;
           // this.selectAnswer = {};
@@ -13638,6 +13710,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'排序',data: JSON.stringify(this.sentenceList),type: "course_tool_sub" }, err)
 
         });
@@ -13705,6 +13781,8 @@ export default {
           type: 10,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -13713,6 +13791,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'表格',data:JSON.stringify(this.tableJson),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleTable = false;
           // this.selectAnswer = {};
@@ -13722,6 +13803,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'表格',data:JSON.stringify(this.tableJson),type: "course_tool_sub" }, err)
 
         });
@@ -13786,6 +13871,8 @@ export default {
           atool: 52,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks3-2", params)
         .then((res) => {
@@ -13794,6 +13881,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'文档',data:JSON.stringify(this.wordJson),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleWord = false;
           // this.selectAnswer = {};
@@ -13803,6 +13893,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'文档',data:JSON.stringify(this.wordJson),type: "course_tool_sub" }, err)
 
         });
@@ -13864,6 +13958,8 @@ export default {
           type: typesql,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorksR", params)
         .then((res) => {
@@ -13872,6 +13968,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'作业提交',data: this.studyJuri[0].cover[0].url,type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.studyJuri[0].cover = [];
           this.dialogVisible = false;
@@ -13880,6 +13979,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'作业提交',data: this.studyJuri[0].cover[0].url,type: "course_tool_sub" }, err)
 
         });
@@ -13907,6 +14010,8 @@ export default {
           content: JSON.stringify(_files),
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorksPl", params)
         .then((res) => {
@@ -13915,6 +14020,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'批量上传',data: JSON.stringify(_files),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.plworkFile = [];
           this.dialogVisiblePl = false;
@@ -13923,6 +14031,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'批量上传',data: JSON.stringify(_files),type: "course_tool_sub" }, err)
 
         });
@@ -13960,6 +14072,8 @@ export default {
           text: "",
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks5", params)
         .then((res) => {
@@ -13967,6 +14081,10 @@ export default {
             message: "提交成功",
             type: "success",
           });
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'学生分组',data:JSON.stringify({
             type: typesql,
             groupIndex: this.groupIndex,
@@ -13979,6 +14097,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'学生分组',data:JSON.stringify({
             type: typesql,
             groupIndex: this.groupIndex,
@@ -14005,6 +14127,8 @@ export default {
           text: "",
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks5", params)
         .then((res) => {
@@ -14012,6 +14136,10 @@ export default {
             message: "提交成功",
             type: "success",
           });
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'英语写作',
               data:  JSON.stringify(this.myAnList),
               type: "course_tool_sub" }, "success")
@@ -14025,6 +14153,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'英语写作',
               data:  JSON.stringify(this.myAnList),
               type: "course_tool_sub" }, err)
@@ -16958,6 +17090,9 @@ export default {
       this.getHomeWork();
       this.getCourseDetail(2);
       this.$forceUpdate();
+      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+        this.setCTask();
+      }
     },
     openTask(s, n, i) {
       if (this.IsFollow && this.tType == 2) {
@@ -17067,6 +17202,9 @@ export default {
       this.selectPz();
       this.getHomeWork();
       this.getCourseDetail(2);
+      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+        this.setCTask();
+      }
 			if(flag){
 				this.insertMemorandum(`进入<span class="variable">任务${n+1}${this.navList[s].task[n].taskName?':'+this.navList[s].task[n].taskName:''}</span>`)
 			}else{
@@ -17104,6 +17242,8 @@ export default {
           type: 3,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -17112,6 +17252,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'问答',data:JSON.stringify(this.answerList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.answerList = [];
           this.answerDialogVisible = false;
@@ -17122,6 +17265,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'问答',data:JSON.stringify(this.answerList),type: "course_tool_sub" }, err)
 
         });
@@ -17595,9 +17742,9 @@ export default {
           _this.selectSLook();
           _this.getPick();
 
-          if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
-            _this.setCTask();
-          }
+          // if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
+          //   _this.setCTask();
+          // }
           if (_this.dialogVisibleGroup) {
             _this.groupJson =
               _this.chapInfoList[_this.courseType].chapterInfo[0].taskJson[
@@ -17621,9 +17768,9 @@ export default {
             _this.selectSLook();
             _this.getPick();
 						// _this.getSplitScreenData();//获取分屏数据
-            if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
-              _this.setCTask();
-            }
+            // if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
+            //   _this.setCTask();
+            // }
             if (_this.dialogVisibleGroup) {
               _this.groupJson =
                 _this.chapInfoList[_this.courseType].chapterInfo[0].taskJson[
@@ -18333,6 +18480,7 @@ export default {
         url = "https://" + url;
       }
       this.pptImgUrl1 = "";
+      this.diffKey = new Date().getTime();
 
       setTimeout(() => {
         this.pptImgUrl1 = url;
@@ -18348,6 +18496,12 @@ export default {
       this.$forceUpdate();
 			this.insertMemorandum(`查看文件<span class="variable">任务${this.taskCount+1}:${this.vChapterData[this.taskCount][i].name}</span>`)
     },
+    checkHtml(f, i){
+      this.showType = 16;
+      this.pptImgUrl1 = f.url;
+      this.isClickNav = i;
+      this.$forceUpdate();
+    },
     async downFile(f, i) {
       this.isClickNav = "";
       this.pptImgUrl1 = "";
@@ -18402,6 +18556,8 @@ export default {
           type: 6,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -18410,6 +18566,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'个人评价',data: JSON.stringify(this.eScore),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.eScore = { eBzText: "", eStar: [] };
           this.studentEvalDialogVisible = false;
@@ -18418,6 +18577,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'个人评价',data: JSON.stringify(this.eScore),type: "course_tool_sub" }, err)
 
         });
@@ -18477,6 +18640,8 @@ export default {
           type: 2,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -18485,6 +18650,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'问卷调查',data:JSON.stringify(this.askList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.askList = [];
           this.dialogVisible5 = false;
@@ -18494,6 +18662,9 @@ export default {
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'问卷调查',data:JSON.stringify(this.askList),type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -18569,6 +18740,8 @@ export default {
           type: 8,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -18577,6 +18750,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'选择题',data:JSON.stringify(this.askList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.askList = [];
           this.dialogVisibleChoice = false;
@@ -18587,6 +18763,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'选择题',data:JSON.stringify(this.askList),type: "course_tool_sub" }, err)
 
         });
@@ -19727,11 +19907,17 @@ export default {
       this.fullDialogVisible = true;
       if (t == 6) {
         this.fulltype = 1;
+        console.log('checkFileFull1',f);
+        
         this.fullUrl = JSON.parse(JSON.stringify(f));
+        
       } else if (t == 8) {
         this.fulltype = 2;
         this.fullUrl = f.url;
-      }else if (t == 15) {
+      } else if (t == 16) {
+        this.fulltype = 16;
+        this.fullUrl = f.url;
+      } else if (t == 15) {
         this.fulltype = 4;
         this.fullUrl = f.url;
       } else if (
@@ -21023,13 +21209,13 @@ export default {
       if (!document.fullscreenElement) {
         this.enterFullScreen();
       }
-      if (this.timer2) {
-        clearInterval(this.timer2);
-        this.timer2 = null;
-      }
-      this.timer2 = setInterval(()=> {
-        this.getSplitScreenData();//获取分屏数据
-      }, 1000);
+      // if (this.timer2) {
+      //   clearInterval(this.timer2);
+      //   this.timer2 = null;
+      // }
+      // this.timer2 = setInterval(()=> {
+      //   this.getSplitScreenData();//获取分屏数据
+      // }, 1000);
 
       this.$message.success("分屏模式已开启");
     },
@@ -21080,13 +21266,13 @@ export default {
               this.splitScreenData.uid = "";
               this.splitScreenData.behavior = null;
               this.$message.error("已结束分屏模式");
-              if (this.timer2) {
-                clearInterval(this.timer2);
-                this.timer2 = null;
-              }
-              this.timer2 = setInterval(()=> {
-                this.getSplitScreenData();//获取分屏数据
-              }, 5000);
+              // if (this.timer2) {
+              //   clearInterval(this.timer2);
+              //   this.timer2 = null;
+              // }
+              // this.timer2 = setInterval(()=> {
+              //   this.getSplitScreenData();//获取分屏数据
+              // }, 5000);
               this.$confirm("教师已结束分屏,确定后自由预览。", "提示", {
                 confirmButtonText: '确定', //确认按钮的文字
                 showCancelButton: false, //是否显示取消按钮
@@ -21353,6 +21539,16 @@ export default {
 		this.updateSplitScreenData(1);
   },
   computed: {
+    renderedFormula() {
+      return function(val){
+        try {
+          return katex.renderToString(val,{ throwOnError: false });
+        } catch (e) {
+          console.error('KaTeX渲染错误:', e);
+          return val;
+        }
+      }
+    },
     isAndroid() {
       return /Android/i.test(navigator.userAgent);
     },
@@ -23354,10 +23550,10 @@ export default {
   justify-content: center;
 }
 
-.answerBg > div:nth-child(1) {
-  /* font-size: 22px;
-  padding: 25px 0 10px; */
-}
+/* .answerBg > div:nth-child(1) {
+  font-size: 22px;
+  padding: 25px 0 10px;
+} */
 
 .answerContent {
   width: 215px;
@@ -23526,8 +23722,8 @@ export default {
   width: 400px;
 }
 
-.e_add_btn {
-}
+/* .e_add_btn {
+} */
 
 .e_add_content {
   display: flex;
@@ -24123,7 +24319,9 @@ export default {
   display: flex;
   align-items: center;
 }
-
+.tool_right_box >>> .katex {
+  font-size: 16px;
+}
 .tool_right_box + .tool_right_box {
   margin-top: 10px;
 }
@@ -24919,8 +25117,8 @@ ol {
   top: -25px;
 }
 
-.group_workBox {
-}
+/* .group_workBox {
+} */
 
 .group_workBox + .group_workBox {
   margin-top: 20px;
@@ -25043,8 +25241,8 @@ ol {
   border-radius: 5px;
 }
 
-.groupBox {
-}
+/* .groupBox {
+} */
 
 .groupContent + .groupContent {
   margin-top: 30px;
@@ -25410,11 +25608,11 @@ ol {
   overflow: hidden;
   transition: all 0.5s;
 }
-.toolChild {
+/* .toolChild { */
   /* margin: 0 0 0 17px;
   padding: 0 0 0 20px;
   border-left: 1px solid #d7d7d7; */
-}
+/* } */
 
 .toolChild > div + div{
   margin-top:5px;

+ 254 - 62
src/components/studyStudent.vue

@@ -241,10 +241,10 @@
         </div>
       </div>
       <!-- :class="{ navLeftCss: !mlDialog }" -->
-      <div class="body_student" :style="{width: mlDialog ? 'calc(100% - '+`${(!['2'].includes(tType) || canUseCourseId.includes(id))?classRoomHelperWidth:'10px'}`+' - 20% - 40px)' : 'calc(100% - '+`${(!['2'].includes(tType) || canUseCourseId.includes(id))?classRoomHelperWidth:'10px'}`+' - 10px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }">
-        <div class="new_topFixed" :style="{width: mlDialog ? 'calc(100% - '+`${(!['2'].includes(tType) || canUseCourseId.includes(id))?classRoomHelperWidth:'10px'}`+' - 20% - 40px)' : 'calc(100% - '+`${(!['2'].includes(tType) || canUseCourseId.includes(id))?classRoomHelperWidth:'10px'}`+' - 10px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }"></div>
-        <div class="new_top" :style="{width: mlDialog ? 'calc(100% - '+`${(!['2'].includes(tType) || canUseCourseId.includes(id))?classRoomHelperWidth:'10px'}`+' - 20% - 47px)' : 'calc(100% - '+`${(!['2'].includes(tType) || canUseCourseId.includes(id))?classRoomHelperWidth:'10px'}`+' - 18px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }">
-          <div class="courseIndex" :style="{width: (orgArray.includes(org) || oidArray.includes(oid)) && (!['2'].includes(tType) || canUseCourseId.includes(id)) ? '100%' : 'calc(100% - 745px)'}">
+      <div class="body_student" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 40px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 10px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }">
+        <div class="new_topFixed" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 40px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 10px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }"></div>
+        <div class="new_top" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 47px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 18px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }">
+          <div class="courseIndex" :style="{width: (orgArray.includes(org) || oidArray.includes(oid))? '100%' : 'calc(100% - 745px)'}">
             <div>任务{{ taskCount + 1 }}</div>
             <el-tooltip
               effect="light"
@@ -261,7 +261,7 @@
               </div>
             </el-tooltip>
           </div>
-          <div class="btnAll"  v-show="!orgArray.includes(org) && !oidArray.includes(oid) || (['2'].includes(tType)  && !canUseCourseId.includes(id))"><!--v-show="org !== '1973f6c7-1561-11ee-91d8-005056b86db5' || org !== '777559d2-7239-11ee-b98c-005056b86db5'"-->
+          <div class="btnAll"  v-show="!orgArray.includes(org) && !oidArray.includes(oid)"><!--v-show="org !== '1973f6c7-1561-11ee-91d8-005056b86db5' || org !== '777559d2-7239-11ee-b98c-005056b86db5'"-->
             <div class="btnLeft">
               <el-tooltip effect="light" content="刷新" placement="top">
                 <div class="reBtnIcon" @click="refreshCourse">
@@ -586,7 +586,8 @@
                   <iframe
                       style="width: 100%; height: 100%; border: none"
                       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-                      v-if="pptImgUrl1.indexOf('knowledge.cocorobo.cn')!=-1 || pptImgUrl1.indexOf('cloud.cocorobo.cn')!=-1 || pptImgUrl1.indexOf('app.cocorobo.cn')!=-1"
+                      :key="diffKey"
+                      v-if="pptImgUrl1.indexOf('cocorobo')!=-1"
                       :src="pptImgUrl1"
                     ></iframe>
                     <iframe
@@ -597,6 +598,16 @@
                       :src="pptImgUrl1"
                     ></iframe>
                   </div>
+                  <div
+                    class="wheel"
+                    v-if="showType === 16"
+                    style="width: 95%; margin: 0 auto"
+                  >
+                    <iframe
+                      style="width: 100%; height: 100%; border: none"
+                      :src="pptImgUrl1"
+                    ></iframe>
+                  </div>
                   <div
                     class="wheel"
                     v-if="showType == 3"
@@ -782,7 +793,26 @@
                               <img src="../assets/icon/newIcon/down.png" alt />
                             </div>
                           </div>
+                            <div class="navListItem" v-if="vitem.type == 16">
+                              <div
+                                class="navText"
+                                @click="checkHtml(vitem, vindex)"
+                                :class="isClickNav == vindex ? 'isClickNav' : ''"
+                              >
+                                {{ vitem.name }}
+                              </div>
+                              <div
+                                class="downIcon"
+                                @click="checkFileFull1(vitem.type, vitem)"
+                              >
+                                <img
+                                  src="../assets/icon/newIcon/allScreen.png"
+                                  alt
+                                />
+                              </div>
+                          </div>
                         </div>
+
                         <div
                           class="fileC_box"
                           v-if="fileC[taskCount].length > 0"
@@ -4395,7 +4425,7 @@
                               cursor: pointer;
                             "
                           >
-                            {{ index + 1 + "、" + item.teststitle }}
+                            {{ index + 1 + "、"  }} <span v-html="renderedFormula(item.teststitle)"></span>
                           </div>
                         </el-tooltip>
                       </div>
@@ -8540,6 +8570,22 @@
                       '&screenType=' +
                       screenType
                   )"></classRoomHelper>
+      <studentClassRoomHelper v-else-if="['2'].includes(tType)" @studentFreePreview="studentFreePreview" @OpenJobPreview="OpenJobPreview" :videoStart="videoStart" :IsFollow="IsFollow" :sIsOpen="sIsOpen" :IsLookOpen="IsLookOpen" :splitScreenData="splitScreenData" @splitScreenBehavior="splitScreenBehavior" @startRecording="startRecording" @stopRecording="stopRecording" :fileList="vChapterData[taskCount]" :worksStudent="worksStudent" :courseType="parseInt(courseType)" :taskCount="taskCount" :tcid="tcid" :navList="navList" v-show="orgArray.includes(org) || oidArray.includes(oid)" :courseDetail="courseDetail" :tType="tType" @setWidth="setClassRoomHelperWidth" @refresh="refreshCourse" @goStep="nextOrpreSteps" @authority="juriVisible = true" @review="setPz" @backPage="goTo(
+                    '/courseDetail?userid=' +
+                      userid +
+                      '&oid=' +
+                      oid +
+                      '&org=' +
+                      org +
+                      '&cid=' +
+                      classId +
+                      '&courseId=' +
+                      id +
+                      '&tType=' +
+                      tType +
+                      '&screenType=' +
+                      screenType
+                  )"></studentClassRoomHelper>
     </div>
     <div
       class="pButton"
@@ -10403,7 +10449,34 @@
         </el-button>
         <div
           class="wheel"
-          v-if="
+          v-if="fulltype == 1"
+          style="
+            box-shadow: 0 0 6px 1px #f2f2f2;
+            width: 100%;
+						height:100%;
+            background: #f1f1f1;
+          "
+        >
+          <div class="title" style="width: 100%; box-sizing: border-box">
+            查看文档
+          </div>
+          <el-form class="textBox" style="height: 90%">
+            <el-form-item class="textTitle">
+              <div style="font-size: 22px">
+                {{ fullUrl.name }}
+              </div>
+            </el-form-item>
+            <!-- <div style="color: #918f8f; width: 85%">文档内容</div> -->
+            <div
+              v-html="fullUrl.url"
+              class="textContent"
+              style="height: auto"
+            ></div>
+          </el-form>
+        </div>
+        <div
+          class="wheel"
+          v-else-if="
             (fulltype == 2 || fulltype == 4) &&
             fullUrl.indexOf(
               'https://view.officeapps.live.com/op/view.aspx?src='
@@ -10426,7 +10499,7 @@
           <iframe
             style="width: 100%; height: 100%; border: none"
             allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-            v-else-if="(fulltype == 2 || fulltype == 4) && (fullUrl.indexOf('knowledge.cocorobo.cn')!=-1 || fullUrl.indexOf('cloud.cocorobo.cn')!=-1) || fullUrl.indexOf('app.cocorobo.cn')!=-1"
+            v-else-if="(fulltype == 2 || fulltype == 4) && (fullUrl.indexOf('cocorobo')!=-1)"
             :src="fullUrl"
           ></iframe>
           <iframe
@@ -10441,33 +10514,14 @@
           :pdfUrl="fullUrl"
           style="width: 100%; height: 100%; overflow: auto"
         ></pdf>
-        <div
-          class="wheel"
-          v-if="fulltype == 1"
-          style="
-            box-shadow: 0 0 6px 1px #f2f2f2;
-            width: 100%;
-						height:100%;
-            background: #f1f1f1;
-          "
-        >
-          <div class="title" style="width: 100%; box-sizing: border-box">
-            查看文档
-          </div>
-          <el-form class="textBox" style="height: 90%">
-            <el-form-item class="textTitle">
-              <div style="font-size: 22px">
-                {{ fullUrl.name }}
-              </div>
-            </el-form-item>
-            <!-- <div style="color: #918f8f; width: 85%">文档内容</div> -->
-            <div
-              v-html="fullUrl.url"
-              class="textContent"
-              style="height: auto"
-            ></div>
-          </el-form>
-        </div>
+        <iframe
+          style="width: 100%; height: 100%; border: none"
+          security="restricted"
+          v-if="(fulltype == 16)"
+          sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts allow-popups"
+          :src="fullUrl"
+        ></iframe>
+
       </div>
       <!-- <div slot="footer">
         <el-button @click="fullDialogVisible = false">关 闭</el-button>
@@ -12490,6 +12544,7 @@ import correctText from './components/correctText.vue'
 import scoreItem from './scoreList/scoreItem.vue'
 import scoreZong from './scoreZong/index.vue'
 import classRoomHelper from './classRoomHelper/index.vue'
+import studentClassRoomHelper from './classRoomHelper/studentIndex.vue'
 import statisticalAnalysis from "./components/statisticalAnalysis.vue";
 import choseWorksDetailDialog from './components/choseWorksDetailDialog.vue';
 import { v4 as uuidv4 } from "uuid";
@@ -12499,7 +12554,8 @@ import appStoreC from "./components/appStoreC.vue";
 import cocoFlowDia from "./components/cocoFlowDia.vue";
 import { myMixin } from "@/mixins/mixin.js"
 import { tools as toolsList } from "@/common/tools2.js";
-
+import katex from 'katex'
+import 'katex/dist/katex.min.css'
 let converter = OpenCC.Converter({
   from: "hk",
   to: "cn"
@@ -12584,10 +12640,12 @@ export default {
 		statisticalAnalysis,
 		choseWorksDetailDialog,
     appStoreC,
-    cocoFlowDia
+    cocoFlowDia,
+    studentClassRoomHelper
   },
   data() {
     return {
+      homeWorkLoading:false,
       wordCloudKey: 0,
       bg: null,
       drawShow: false,
@@ -12964,7 +13022,8 @@ export default {
     },
       confirmOpenDig:false,
       confirmOpenDigData:'',
-      canUseCourseId: ['bfbe1913-2f87-11ef-bf55-005056b86db5','3a64b199-d2eb-11ef-a2d1-005056b86db5', 'bb0b1995-0207-11ef-b534-005056b86db5', 'f77921c8-d2f1-11ef-a2d1-005056b86db5']
+      canUseCourseId: ['bfbe1913-2f87-11ef-bf55-005056b86db5','3a64b199-d2eb-11ef-a2d1-005056b86db5', 'bb0b1995-0207-11ef-b534-005056b86db5', 'f77921c8-d2f1-11ef-a2d1-005056b86db5'],
+      diffKey:"1",
     };
   },
   methods: {
@@ -13483,6 +13542,8 @@ export default {
           type: 7,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -13491,6 +13552,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'选择匹配',data: JSON.stringify(this.selectAnswer.answer),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleSelect = false;
           // this.selectAnswer = {};
@@ -13499,6 +13563,9 @@ export default {
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'选择匹配',data: JSON.stringify(this.selectAnswer.answer),type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -13556,6 +13623,8 @@ export default {
           type: 9,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -13564,6 +13633,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'排序',data: JSON.stringify(this.sentenceList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleSentence = false;
           // this.selectAnswer = {};
@@ -13572,6 +13644,9 @@ export default {
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'排序',data: JSON.stringify(this.sentenceList),type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -13629,6 +13704,8 @@ export default {
         .catch(() => {});
     },
     addTableWorks() {
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       let params = [
         {
           uid: this.userid,
@@ -13650,12 +13727,19 @@ export default {
             type: "success",
           });
           this.dialogVisibleTable = false;
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           // this.selectAnswer = {};
           this.selectSWorks();
           this.selectStudent();
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'表格',data:JSON.stringify(this.tableJson),type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -13709,6 +13793,8 @@ export default {
         .catch(() => {});
     },
     addWordWorks() {
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       let params = [
         {
           uid: this.userid,
@@ -13731,12 +13817,19 @@ export default {
             type: "success",
           });
           this.dialogVisibleWord = false;
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           // this.selectAnswer = {};
           this.selectSWorks();
           this.selectStudent();
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'文档',data:JSON.stringify(this.wordJson),type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -13788,6 +13881,8 @@ export default {
         this.$message.error("请上传文件");
         return;
       }
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       let params = [
         {
           uid: this.userid,
@@ -13807,6 +13902,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'作业提交',data: this.studyJuri[0].cover[0].url,type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.studyJuri[0].cover = [];
           this.dialogVisible = false;
@@ -13814,6 +13912,9 @@ export default {
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'作业提交',data: this.studyJuri[0].cover[0].url,type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -13842,6 +13943,8 @@ export default {
           content: JSON.stringify(_files),
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorksPl", params)
         .then((res) => {
@@ -13850,6 +13953,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'批量上传',data: JSON.stringify(_files),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.plworkFile = [];
           this.dialogVisiblePl = false;
@@ -13857,6 +13963,10 @@ export default {
         })
         .catch((err) => {
           this.$message.error("提交失败");
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           console.error(err);
           this.addOp3('1', "", { courseid: this.id,tool:'批量上传',data: JSON.stringify(_files),type: "course_tool_sub" }, err)
         });
@@ -13877,6 +13987,8 @@ export default {
         this.$message.error("请上传文件");
         return;
       }
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       let params = [
         {
           uid: this.userid,
@@ -13901,6 +14013,10 @@ export default {
             message: "提交成功",
             type: "success",
           });
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'学生分组',data:JSON.stringify({
             type: typesql,
             groupIndex: this.groupIndex,
@@ -13912,6 +14028,10 @@ export default {
         })
         .catch((err) => {
           this.$message.error("提交失败");
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           console.error(err);
           this.addOp3('1', "", { courseid: this.id,tool:'学生分组',data:JSON.stringify({
             type: typesql,
@@ -13939,6 +14059,8 @@ export default {
           text: "",
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks5", params)
         .then((res) => {
@@ -13946,6 +14068,10 @@ export default {
             message: "提交成功",
             type: "success",
           });
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'英语写作',
               data:  JSON.stringify(this.myAnList),
               type: "course_tool_sub" }, "success")
@@ -13959,6 +14085,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'英语写作',
               data:  JSON.stringify(this.myAnList),
               type: "course_tool_sub" }, err)
@@ -16894,6 +17024,9 @@ export default {
       this.getHomeWork();
       this.getCourseDetail(2);
       this.$forceUpdate();
+      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+        this.setCTask();
+      }
     },
 
     openTask(s, n, i,ctype) {
@@ -17009,6 +17142,9 @@ export default {
       this.selectPz();
       this.getHomeWork();
       this.getCourseDetail(2);
+      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+        this.setCTask();
+      }
 			if(flag){
 				this.insertMemorandum(`进入<span class="variable">任务${n+1}${this.navList[s].task[n].taskName?':'+this.navList[s].task[n].taskName:''}</span>`)
 			}else{
@@ -17048,6 +17184,8 @@ export default {
           type: 3,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -17056,6 +17194,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'问答',data:JSON.stringify(this.answerList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.answerList = [];
           this.answerDialogVisible = false;
@@ -17065,6 +17206,9 @@ export default {
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'问答',data:JSON.stringify(this.answerList),type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -17539,9 +17683,9 @@ export default {
           _this.selectStudent();
           _this.selectSLook();
           _this.getPick();
-          if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
-            _this.setCTask();
-          }
+          // if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
+          //   _this.setCTask();
+          // }
           if (_this.dialogVisibleGroup) {
             _this.groupJson =
               _this.chapInfoList[_this.courseType].chapterInfo[0].taskJson[
@@ -17566,9 +17710,9 @@ export default {
             _this.getPick();
 						// _this.getSplitScreenData();
 
-            if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
-              _this.setCTask();
-            }
+            // if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
+            //   _this.setCTask();
+            // }
             if (_this.dialogVisibleGroup) {
               _this.groupJson =
                 _this.chapInfoList[_this.courseType].chapterInfo[0].taskJson[
@@ -18278,7 +18422,7 @@ export default {
         url = "https://" + url;
       }
       this.pptImgUrl1 = "";
-
+      this.diffKey = new Date().getTime();
       setTimeout(() => {
         this.pptImgUrl1 = url;
       }, 500);
@@ -18293,6 +18437,12 @@ export default {
       this.$forceUpdate();
 			this.insertMemorandum(`查看文件<span class="variable">任务${this.taskCount+1}:${this.vChapterData[this.taskCount][i].name}</span>`)
     },
+    checkHtml(f, i){
+      this.showType = 16;
+      this.pptImgUrl1 = f.url;
+      this.isClickNav = i;
+      this.$forceUpdate();
+    },
     async downFile(f, i) {
       this.isClickNav = "";
       this.pptImgUrl1 = "";
@@ -18346,6 +18496,8 @@ export default {
           type: 6,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -18354,6 +18506,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'个人评价',data: JSON.stringify(this.eScore),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.eScore = { eBzText: "", eStar: [] };
           this.studentEvalDialogVisible = false;
@@ -18361,6 +18516,9 @@ export default {
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'个人评价',data: JSON.stringify(this.eScore),type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -18422,6 +18580,9 @@ export default {
       ];
       // console.log('params',params);
 
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
+
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -18429,16 +18590,23 @@ export default {
             message: "提交成功",
             type: "success",
           });
-          this.addOp3('1', "", { courseid: this.id,tool:'问卷调查',data:JSON.stringify(this.askList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.askList = [];
           this.dialogVisible5 = false;
           this.selectStudent();
           this.selectSWorks();
           this.selectSLook();
+
+          this.addOp3('1', "", { courseid: this.id,tool:'问卷调查',data:JSON.stringify(this.askList),type: "course_tool_sub" }, "success")
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'问卷调查',data:JSON.stringify(this.askList),type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -18514,6 +18682,8 @@ export default {
           type: 8,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -18522,6 +18692,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'选择题',data:JSON.stringify(this.askList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.askList = [];
           this.dialogVisibleChoice = false;
@@ -18531,6 +18704,9 @@ export default {
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'选择题',data:JSON.stringify(this.askList),type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -19680,8 +19856,12 @@ export default {
         this.fulltype = 2;
         this.fullUrl = f.url;
       }else if (t == 15) {
+        this.diffKey = new Date().getTime();
         this.fulltype = 4;
         this.fullUrl = f.url;
+      } else if (t == 16) {
+        this.fulltype = 16;
+        this.fullUrl = f.url;
       } else if (
         t == 3 &&
         f.url.split(".")[f.url.split(".").length - 1].toLocaleUpperCase() ==
@@ -20967,13 +21147,13 @@ export default {
       if (!document.fullscreenElement) {
         this.enterFullScreen();
       }
-      if (this.timer2) {
-        clearInterval(this.timer2);
-        this.timer2 = null;
-      }
-      this.timer2 = setInterval(()=> {
-        this.getSplitScreenData();//获取分屏数据
-      }, 1000);
+      // if (this.timer2) {
+      //   clearInterval(this.timer2);
+      //   this.timer2 = null;
+      // }
+      // this.timer2 = setInterval(()=> {
+      //   this.getSplitScreenData();//获取分屏数据
+      // }, 5000);
       this.$message.success("分屏模式已开启");
     },
     // 获取分屏数据
@@ -21024,13 +21204,13 @@ export default {
               this.splitScreenData.uid = "";
               this.splitScreenData.behavior = null;
               this.$message.error("已结束分屏模式");
-              if (this.timer2) {
-                clearInterval(this.timer2);
-                this.timer2 = null;
-              }
-              this.timer2 = setInterval(()=> {
-                this.getSplitScreenData();//获取分屏数据
-              }, 5000);
+              // if (this.timer2) {
+              //   clearInterval(this.timer2);
+              //   this.timer2 = null;
+              // }
+              // this.timer2 = setInterval(()=> {
+              //   this.getSplitScreenData();//获取分屏数据
+              // }, 5000);
               this.$confirm("教师已结束分屏,确定后自由预览。", "提示", {
                 confirmButtonText: '确定', //确认按钮的文字
                 showCancelButton: false, //是否显示取消按钮
@@ -21313,6 +21493,16 @@ export default {
 		this.updateSplitScreenData(1);
   },
   computed: {
+    renderedFormula() {
+      return function(val){
+        try {
+          return katex.renderToString(val,{ throwOnError: false });
+        } catch (e) {
+          console.error('KaTeX渲染错误:', e);
+          return val;
+        }
+      }
+    },
     isAndroid() {
       return /Android/i.test(navigator.userAgent);
     },
@@ -24076,7 +24266,9 @@ export default {
   display: flex;
   align-items: center;
 }
-
+.tool_right_box >>> .katex {
+  font-size: 16px;
+}
 .tool_right_box + .tool_right_box {
   margin-top: 10px;
 }

+ 270 - 76
src/components/studySutdentClass/studyStudent.vue

@@ -235,10 +235,10 @@
           </div>
         </div>
       </div>
-      <div class="body_student" :style="{width: mlDialog ? 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 20% - 40px)' : 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 10px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }">
-        <div class="new_topFixed" :style="{width: mlDialog ? 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 20% - 40px)' : 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 10px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }"></div>
-        <div class="new_top" :style="{width: mlDialog ? 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 20% - 47px)' : 'calc(100% - '+`${!['2'].includes(tType)?classRoomHelperWidth:'10px'}`+' - 18px)', left: mlDialog ? 'calc(20% + 35px)' : '10px' }">
-          <div class="courseIndex" :style="{width: (orgArray.includes(org) || oidArray.includes(oid)) && !['2'].includes(tType) ? '100%' : 'calc(100% - 745px)'}">
+      <div class="body_student" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 40px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 10px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }">
+        <div class="new_topFixed" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 40px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 10px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }"></div>
+        <div class="new_top" :style="{width: mlDialog ? 'calc(100% - '+`${classRoomHelperWidth}`+' - 20% - 47px)' : 'calc(100% - '+`${classRoomHelperWidth}`+' - 18px)', left: mlDialog  ? 'calc(20% + 35px)' : '10px' }">
+          <div class="courseIndex" :style="{width: (orgArray.includes(org) || oidArray.includes(oid))? '100%' : 'calc(100% - 745px)'}">
             <div>任务{{ taskCount + 1 }}</div>
             <el-tooltip
               effect="light"
@@ -256,7 +256,7 @@
             </el-tooltip>
           </div>
 					<!-- v-show="org !== '1973f6c7-1561-11ee-91d8-005056b86db5' || org !== '777559d2-7239-11ee-b98c-005056b86db5'" -->
-          <div class="btnAll" v-show="!orgArray.includes(org) && !oidArray.includes(oid) || ['2'].includes(tType)">
+          <div class="btnAll" v-show="!orgArray.includes(org) && !oidArray.includes(oid)">
             <div class="btnLeft">
               <el-tooltip effect="light" content="刷新" placement="top">
                 <div class="reBtnIcon" @click="refreshCourse">
@@ -456,7 +456,7 @@
         >
           <img src="../../assets/icon/isNoMessage.png" alt />
         </div>
-        <div class="study_top" :class="{ pzClass: pzDialog }">
+        <div class="study_top" :style="tType=='2'?'width:calc(100% - 10px)':''" :class="{ pzClass: pzDialog }">
           <!-- chapInfoList[courseType].chapterInfo[0].taskJson[taskCount]
                 .taskDetail3 || -->
           <div
@@ -620,7 +620,8 @@
                   <iframe
                       style="width: 100%; height: 100%; border: none"
                       allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-                      v-if="pptImgUrl1.indexOf('knowledge.cocorobo.cn')!=-1 || pptImgUrl1.indexOf('cloud.cocorobo.cn')!=-1 || pptImgUrl1.indexOf('app.cocorobo.cn')!=-1"
+                      :key="diffKey"
+                      v-if="pptImgUrl1.indexOf('cocorobo')!=-1"
                       :src="pptImgUrl1"
 
                     ></iframe>
@@ -632,6 +633,16 @@
                       :src="pptImgUrl1"
                     ></iframe>
                   </div>
+                  <div
+                    class="wheel"
+                    v-if="showType === 16"
+                    style="width: 95%; margin: 0 auto"
+                  >
+                    <iframe
+                      style="width: 100%; height: 100%; border: none"
+                      :src="pptImgUrl1"
+                    ></iframe>
+                  </div>
                   <div
                     class="wheel"
                     v-if="showType == 3"
@@ -825,6 +836,24 @@
                               />
                             </div>
                           </div>
+                          <div class="navListItem" v-if="vitem.type == 16">
+                            <div
+                              class="navText"
+                              @click="checkHtml(vitem, vindex)"
+                              :class="isClickNav == vindex ? 'isClickNav' : ''"
+                            >
+                              {{ vitem.name }}
+                            </div>
+                            <div
+                              class="downIcon"
+                              @click="checkFileFull1(vitem.type, vitem)"
+                            >
+                              <img
+                                src="../../assets/icon/newIcon/allScreen.png"
+                                alt
+                              />
+                            </div>
+                          </div>
                         </div>
                         <div class="fileC_box" v-if="fileC[0].length > 0">
                           <div class="fileC_title">以下文件不支持预览</div>
@@ -6173,7 +6202,7 @@
                               cursor: pointer;
                             "
                           >
-                            {{ index + 1 + "、" + item.teststitle }}
+                            {{ index + 1 + "、"  }} <span v-html="renderedFormula(item.teststitle)"></span>
                           </div>
                         </el-tooltip>
                       </div>
@@ -11744,21 +11773,37 @@
     </div>
 				<!-- v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5' || org == '884c5665-a453-46f3-b7b6-01d575290aa9'" -->
 		<classRoomHelper v-if="!['2'].includes(tType)" @studentFreePreview="studentFreePreview" @OpenJobPreview="OpenJobPreview" :videoStart="videoStart" :IsFollow="IsFollow" :sIsOpen="sIsOpen" :IsLookOpen="IsLookOpen" :splitScreenData="splitScreenData" @splitScreenBehavior="splitScreenBehavior" @startRecording="startRecording" @stopRecording="stopRecording" :fileList="vChapterData[taskCount]" :worksStudent="worksStudent" :courseType="parseInt(courseType)" :taskCount="taskCount" :tcid="tcid" :navList="navList" v-show="orgArray.includes(org) || oidArray.includes(oid)" ref="classRoomHelperRef" :courseDetail="courseDetail" :tType="tType" @setWidth="setClassRoomHelperWidth" @refresh="refreshCourse" @goStep="nextOrpreSteps" @authority="juriVisible = true" @review="setPz" @backPage="goTo(
-                    '/courseDetail?userid=' +
-                      userid +
-                      '&oid=' +
-                      oid +
-                      '&org=' +
-                      org +
-                      '&cid=' +
-                      classId +
-                      '&courseId=' +
-                      id +
-                      '&tType=' +
-                      tType +
-                      '&screenType=' +
-                      screenType
-                  )"></classRoomHelper>
+      '/courseDetail?userid=' +
+        userid +
+        '&oid=' +
+        oid +
+        '&org=' +
+        org +
+        '&cid=' +
+        classId +
+        '&courseId=' +
+        id +
+        '&tType=' +
+        tType +
+        '&screenType=' +
+        screenType
+    )"></classRoomHelper>
+  <studentClassRoomHelper v-else-if="['2'].includes(tType)" @studentFreePreview="studentFreePreview" @OpenJobPreview="OpenJobPreview" :videoStart="videoStart" :IsFollow="IsFollow" :sIsOpen="sIsOpen" :IsLookOpen="IsLookOpen" :splitScreenData="splitScreenData" @splitScreenBehavior="splitScreenBehavior" @startRecording="startRecording" @stopRecording="stopRecording" :fileList="vChapterData[taskCount]" :worksStudent="worksStudent" :courseType="parseInt(courseType)" :taskCount="taskCount" :tcid="tcid" :navList="navList" v-show="orgArray.includes(org) || oidArray.includes(oid)" :courseDetail="courseDetail" :tType="tType" @setWidth="setClassRoomHelperWidth" @refresh="refreshCourse" @goStep="nextOrpreSteps" @authority="juriVisible = true" @review="setPz" @backPage="goTo(
+    '/courseDetail?userid=' +
+      userid +
+      '&oid=' +
+      oid +
+      '&org=' +
+      org +
+      '&cid=' +
+      classId +
+      '&courseId=' +
+      id +
+      '&tType=' +
+      tType +
+      '&screenType=' +
+      screenType
+  )"></studentClassRoomHelper>
     <div
       class="pButton"
       @click="(pzDialog = true), selectPz()"
@@ -13647,9 +13692,36 @@
         >
           退出全屏
         </el-button>
+                <div
+          class="wheel"
+          v-if="fulltype == 1"
+          style="
+            box-shadow: 0 0 6px 1px #f2f2f2;
+						height:100%;
+            width: 100%;
+            background: #f1f1f1;
+          "
+        >
+          <div class="title" style="width: 100%; box-sizing: border-box">
+            查看文档
+          </div>
+          <el-form class="textBox" style="height: 90%">
+            <el-form-item class="textTitle">
+              <div style="font-size: 22px">
+                {{ fullUrl.name }}
+              </div>
+            </el-form-item>
+            <!-- <div style="color: #918f8f; width: 85%">文档内容</div> -->
+            <div
+              v-html="fullUrl.url"
+              class="textContent"
+              style="height: auto"
+            ></div>
+          </el-form>
+        </div>
         <div
           class="wheel"
-          v-if="
+          v-else-if="
             (fulltype == 2 || fulltype == 4) &&
             fullUrl.indexOf(
               'https://view.officeapps.live.com/op/view.aspx?src='
@@ -13665,7 +13737,7 @@
         <iframe
             style="width: 100%; height: 100%; border: none"
             allow="camera *; microphone *;display-capture;midi;encrypted-media;"
-            v-else-if="(fulltype == 2 || fulltype == 4) && (fullUrl.indexOf('knowledge.cocorobo.cn')!=-1 || fullUrl.indexOf('cloud.cocorobo.cn')!=-1) || fullUrl.indexOf('app.cocorobo.cn')!=-1"
+            v-else-if="(fulltype == 2 || fulltype == 4) && (fullUrl.indexOf('cocorobo.cn')!=-1)"
             :src="fullUrl"
           ></iframe>
           <iframe
@@ -13680,33 +13752,14 @@
           :pdfUrl="fullUrl"
           style="width: 100%; height: 100%; overflow: auto"
         ></pdf>
-        <div
-          class="wheel"
-          v-if="fulltype == 1"
-          style="
-            box-shadow: 0 0 6px 1px #f2f2f2;
-						height:100%;
-            width: 100%;
-            background: #f1f1f1;
-          "
-        >
-          <div class="title" style="width: 100%; box-sizing: border-box">
-            查看文档
-          </div>
-          <el-form class="textBox" style="height: 90%">
-            <el-form-item class="textTitle">
-              <div style="font-size: 22px">
-                {{ fullUrl.name }}
-              </div>
-            </el-form-item>
-            <!-- <div style="color: #918f8f; width: 85%">文档内容</div> -->
-            <div
-              v-html="fullUrl.url"
-              class="textContent"
-              style="height: auto"
-            ></div>
-          </el-form>
-        </div>
+        <iframe
+          style="width: 100%; height: 100%; border: none"
+          security="restricted"
+          v-if="(fulltype == 16)"
+          sandbox="allow-top-navigation allow-same-origin allow-forms allow-scripts allow-popups"
+          :src="fullUrl"
+        ></iframe>
+
       </div>
       <!-- <div slot="footer">
         <el-button @click="fullDialogVisible = false">关 闭</el-button>
@@ -15797,6 +15850,7 @@ import correctText from '../components/correctText.vue'
 import scoreItem from '../scoreList/scoreItem.vue'
 import scoreZong from '../scoreZong/index.vue'
 import classRoomHelper from '../classRoomHelper/index.vue'
+import studentClassRoomHelper from '../classRoomHelper/studentIndex.vue'
 import MarkdownIt from "markdown-it";
 import statisticalAnalysis from '../components/statisticalAnalysis.vue'
 import choseWorksDetailDialog from '../components/choseWorksDetailDialog.vue'
@@ -15809,7 +15863,8 @@ import appStoreC from "../components/appStoreC.vue";
 import cocoFlowDia from "../components/cocoFlowDia.vue";
 import { myMixin } from "@/mixins/mixin.js"
 import { tools as toolsList } from "@/common/tools2.js";
-
+import katex from 'katex'
+import 'katex/dist/katex.min.css'
 var OpenCC = require("opencc-js");
 let converter = OpenCC.Converter({
   from: "hk",
@@ -15899,10 +15954,12 @@ export default {
 		statisticalAnalysis,
 		choseWorksDetailDialog,
     appStoreC,
-    cocoFlowDia
+    cocoFlowDia,
+    studentClassRoomHelper
   },
   data() {
     return {
+      homeWorkLoading:false,
 			toolsList: toolsList,
       wordCloudKey: 0,
       bg: null,
@@ -16300,6 +16357,7 @@ export default {
       languageSetting: 0, //0中文 1繁体 2英文
       toolListS: [],
       commentDetailCopy: "",
+      diffKey:"1"
     };
   },
   methods: {
@@ -17383,6 +17441,8 @@ export default {
           type: 7,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -17391,6 +17451,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'选择匹配',data: JSON.stringify(this.selectAnswer.answer),type: "course_tool_sub" }, "success")
+          setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleSelect = false;
           // this.selectAnswer = {};
@@ -17398,6 +17461,10 @@ export default {
           this.selectStudent();
         })
         .catch((err) => {
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.$message.error("提交失败");
           console.error(err);
           this.addOp3('1', "", { courseid: this.id,tool:'选择匹配',data: JSON.stringify(this.selectAnswer.answer),type: "course_tool_sub" }, err)
@@ -17456,6 +17523,8 @@ export default {
           type: 9,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -17464,6 +17533,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'排序',data: JSON.stringify(this.sentenceList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleSentence = false;
           // this.selectAnswer = {};
@@ -17471,6 +17543,10 @@ export default {
           this.selectStudent();
         })
         .catch((err) => {
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.$message.error("提交失败");
           console.error(err);
           this.addOp3('1', "", { courseid: this.id,tool:'排序',data: JSON.stringify(this.sentenceList),type: "course_tool_sub" }, err)
@@ -17540,6 +17616,8 @@ export default {
           type: 10,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -17548,6 +17626,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'表格',data:JSON.stringify(this.tableJson),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleTable = false;
           // this.selectAnswer = {};
@@ -17557,6 +17638,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'表格',data:JSON.stringify(this.tableJson),type: "course_tool_sub" }, err)
 
         });
@@ -17621,6 +17706,8 @@ export default {
           atool: 52,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks3-2", params)
         .then((res) => {
@@ -17629,6 +17716,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'文档',data:JSON.stringify(this.wordJson),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.dialogVisibleWord = false;
           // this.selectAnswer = {};
@@ -17638,6 +17728,9 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
           this.addOp3('1', "", { courseid: this.id,tool:'文档',data:JSON.stringify(this.wordJson),type: "course_tool_sub" }, err)
 
         });
@@ -17718,6 +17811,8 @@ export default {
           type: typesql,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorksR", params)
         .then((res) => {
@@ -17726,6 +17821,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'作业提交',data: this.studyJuri[0].cover[0].url,type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.studyJuri[0].cover = [];
           this.dialogVisible = false;
@@ -17734,6 +17832,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'作业提交',data: this.studyJuri[0].cover[0].url,type: "course_tool_sub" }, err)
 
         });
@@ -17761,6 +17863,8 @@ export default {
           content: JSON.stringify(_files),
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorksPl", params)
         .then((res) => {
@@ -17769,6 +17873,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'批量上传',data: JSON.stringify(_files),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.plworkFile = [];
           this.dialogVisiblePl = false;
@@ -17777,6 +17884,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'批量上传',data: JSON.stringify(_files),type: "course_tool_sub" }, err)
 
         });
@@ -17814,6 +17925,8 @@ export default {
           text: "",
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks5", params)
         .then((res) => {
@@ -17821,6 +17934,10 @@ export default {
             message: "提交成功",
             type: "success",
           });
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'学生分组',data:JSON.stringify({
             type: typesql,
             groupIndex: this.groupIndex,
@@ -17833,6 +17950,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'学生分组',data:JSON.stringify({
             type: typesql,
             groupIndex: this.groupIndex,
@@ -17859,6 +17980,8 @@ export default {
           text: "",
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks5", params)
         .then((res) => {
@@ -17866,6 +17989,10 @@ export default {
             message: "提交成功",
             type: "success",
           });
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'英语写作',
               data:  JSON.stringify(this.myAnList),
               type: "course_tool_sub" }, "success")
@@ -17879,6 +18006,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'英语写作',
               data:  JSON.stringify(this.myAnList),
               type: "course_tool_sub" }, err)
@@ -20855,6 +20986,9 @@ export default {
       this.getHomeWork();
       this.getCourseDetail(2);
       this.$forceUpdate();
+      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+        this.setCTask();
+      }
     },
     openTask(s, n, i) {
       if (this.IsFollow && this.tType == 2) {
@@ -20969,6 +21103,9 @@ export default {
 			}else{
 				this.insertMemorandum(`进入<span class="variable">阶段${s+1}${this.navList[s].dyName?':'+this.navList[s].dyName:''}</span>→<span class="variable">任务${n+1}${this.navList[s].task[n].taskName?':'+this.navList[s].task[n].taskName:''}</span>`)
 			}
+      if (this.courseDetail.userid == this.userid && this.IsFollow) {
+        this.setCTask();
+      }
     },
 
     get(i) {
@@ -21001,6 +21138,8 @@ export default {
           type: 3,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -21009,6 +21148,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'问答',data:JSON.stringify(this.answerList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.answerList = [];
           this.answerDialogVisible = false;
@@ -21018,6 +21160,9 @@ export default {
         })
         .catch((err) => {
           this.addOp3('1', "", { courseid: this.id,tool:'问答',data:JSON.stringify(this.answerList),type: "course_tool_sub" }, err)
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.$message.error("提交失败");
           console.error(err);
@@ -21569,9 +21714,9 @@ export default {
           _this.selectSLook();
           _this.getPick();
 
-          if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
-            _this.setCTask();
-          }
+          // if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
+          //   _this.setCTask();
+          // }
           if (_this.dialogVisibleGroup) {
             _this.groupJson =
               _this.chapInfoList[_this.courseType].chapterInfo[0].taskJson[
@@ -21594,9 +21739,9 @@ export default {
             _this.selectStudent();
             _this.selectSLook();
             _this.getPick();
-            if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
-              _this.setCTask();
-            }
+            // if (_this.courseDetail.userid == _this.userid && _this.IsFollow) {
+            //   _this.setCTask();
+            // }
             if (_this.dialogVisibleGroup) {
               _this.groupJson =
                 _this.chapInfoList[_this.courseType].chapterInfo[0].taskJson[
@@ -22307,7 +22452,7 @@ export default {
         url = "https://" + url;
       }
       this.pptImgUrl1 = "";
-
+      this.diffKey = new Date().getTime();
       setTimeout(() => {
         this.pptImgUrl1 = url;
       }, 500);
@@ -22322,6 +22467,12 @@ export default {
       this.$forceUpdate();
 			this.insertMemorandum(`查看文件<span class="variable">任务${this.taskCount+1}:${this.vChapterData[this.taskCount][i].name}</span>`)
     },
+    checkHtml(f, i){
+      this.showType = 16;
+      this.pptImgUrl1 = f.url;
+      this.isClickNav = i;
+      this.$forceUpdate();
+    },
     async downFile(f, i) {
       this.isClickNav = "";
       this.pptImgUrl1 = "";
@@ -22376,6 +22527,8 @@ export default {
           type: 6,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -22384,6 +22537,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'个人评价',data: JSON.stringify(this.eScore),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.eScore = { eBzText: "", eStar: [] };
           this.studentEvalDialogVisible = false;
@@ -22392,6 +22548,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'个人评价',data: JSON.stringify(this.eScore),type: "course_tool_sub" }, err)
 
         });
@@ -22451,6 +22611,8 @@ export default {
           type: 2,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -22459,6 +22621,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'问卷调查',data:JSON.stringify(this.askList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.askList = [];
           this.dialogVisible5 = false;
@@ -22469,6 +22634,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'问卷调查',data:JSON.stringify(this.askList),type: "course_tool_sub" }, err)
 
         });
@@ -22543,6 +22712,8 @@ export default {
           type: 8,
         },
       ];
+      if (this.homeWorkLoading) return this.$message.info('点击过快,请稍后...')
+      this.homeWorkLoading = true
       this.ajax
         .post(this.$store.state.api + "addCourseWorks", params)
         .then((res) => {
@@ -22551,6 +22722,9 @@ export default {
             type: "success",
           });
           this.addOp3('1', "", { courseid: this.id,tool:'选择题',data:JSON.stringify(this.askList),type: "course_tool_sub" }, "success")
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
 
           this.askList = [];
           this.dialogVisibleChoice = false;
@@ -22561,6 +22735,10 @@ export default {
         .catch((err) => {
           this.$message.error("提交失败");
           console.error(err);
+           setTimeout(() => {
+            this.homeWorkLoading = false
+          }, 500);
+
           this.addOp3('1', "", { courseid: this.id,tool:'选择题',data:JSON.stringify(this.askList),type: "course_tool_sub" }, err)
 
         });
@@ -23707,6 +23885,10 @@ export default {
       }else if (t == 15) {
         this.fulltype = 4;
         this.fullUrl = f.url;
+
+      } else if (t == 16) {
+        this.fulltype = 16;
+        this.fullUrl = f.url;
       } else if (
         t == 3 &&
         f.url.split(".")[f.url.split(".").length - 1].toLocaleUpperCase() ==
@@ -25003,13 +25185,13 @@ export default {
       if (!document.fullscreenElement) {
         this.enterFullScreen();
       }
-        if (this.timer2) {
-          clearInterval(this.timer2);
-          this.timer2 = null;
-        }
-        this.timer2 = setInterval(()=> {
-          this.getSplitScreenData();//获取分屏数据
-        }, 1000);
+        // if (this.timer2) {
+        //   clearInterval(this.timer2);
+        //   this.timer2 = null;
+        // }
+        // this.timer2 = setInterval(()=> {
+        //   this.getSplitScreenData();//获取分屏数据
+        // }, 1000);
       this.$message.success("分屏模式已开启");
     },
     getSplitScreenData() {
@@ -25059,13 +25241,13 @@ export default {
               this.splitScreenData.uid = "";
               this.splitScreenData.behavior = null;
               this.$message.error("已结束分屏模式");
-              if (this.timer2) {
-                clearInterval(this.timer2);
-                this.timer2 = null;
-              }
-              this.timer2 = setInterval(()=> {
-                this.getSplitScreenData();//获取分屏数据
-              }, 5000);
+              // if (this.timer2) {
+              //   clearInterval(this.timer2);
+              //   this.timer2 = null;
+              // }
+              // this.timer2 = setInterval(()=> {
+              //   this.getSplitScreenData();//获取分屏数据
+              // }, 5000);
               this.$confirm("教师已结束分屏,确定后自由预览。", "提示", {
                 confirmButtonText: '确定', //确认按钮的文字
                 showCancelButton: false, //是否显示取消按钮
@@ -25334,6 +25516,16 @@ export default {
 		this.updateSplitScreenData(1);
   },
   computed: {
+    renderedFormula() {
+      return function(val){
+        try {
+          return katex.renderToString(val,{ throwOnError: false });
+        } catch (e) {
+          console.error('KaTeX渲染错误:', e);
+          return val;
+        }
+      }
+    },
     isAndroid() {
       return /Android/i.test(navigator.userAgent);
     },
@@ -28124,7 +28316,9 @@ export default {
   display: flex;
   align-items: center;
 }
-
+.tool_right_box >>> .katex {
+  font-size: 16px;
+}
 .tool_right_box + .tool_right_box {
   margin-top: 10px;
 }

+ 2 - 0
src/mixins/mixin.js

@@ -34,6 +34,7 @@ export const myMixin = {
       }
     },
     async addOp3(userTime, loadTime, object, status) {
+      if (!this.$route.query.userid) return
       try {
         if(!this.userJson || !this.userJson.accountNumber){
             let res = await this.ajax.get(this.$store.state.api + "selectUser", {
@@ -55,6 +56,7 @@ export const myMixin = {
         accountNumber: this.userJson.accountNumber,
         org: this.userJson.orgName,
         school: this.userJson.schoolName,
+        role: this.userJson.type =='1'?'老师':'学生',
         browser: browser,
         userTime: userTime == "1" ? _time : userTime, // 使用时间 1次的就1 其次传秒
         loadTime: loadTime, //load的时间没有就“”

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels