Explorar o código

Merge branch 'beta'

lsc hai 2 semanas
pai
achega
2c09e414fe

+ 1 - 1
dist/index.html

@@ -27,7 +27,7 @@
     html,
     body{
       font-family: '黑体';
-    }</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() {
+    }</style><link href=./static/css/app.4390469f408660c3ae79f261bf69c88c.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.44c91e92254f017d3b21.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/app.1a1cf54e58e0216370df30223cfc276a.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/app.1a1cf54e58e0216370df30223cfc276a.css.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/app.4390469f408660c3ae79f261bf69c88c.css


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/css/app.4390469f408660c3ae79f261bf69c88c.css.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/app.44c91e92254f017d3b21.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/app.44c91e92254f017d3b21.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map


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

@@ -18,6 +18,7 @@
                     scrolling = "no"
                     :src="urlData"
                     ref="appStore"
+                    :class="[urlData.indexOf('story-telling') ? 'minH':'']"
                     style="width: 100%;height: 99%;"
                 ></iframe>
             </div>
@@ -132,4 +133,7 @@ import { myMixin } from "@/mixins/mixin.js"
   padding: 0 !important;
   height: 100% !important;
 }
+.minH{
+    min-height: 800px;
+}
 </style>

+ 2 - 2
src/components/components/choseWorksDetailDialog.vue

@@ -57,7 +57,7 @@
                     @click="upLoadApp">作业提交</el-button>
                   </div>
 
-                  <span v-if="testData.toolDetail">{{ testData.toolDetail }}</span>
+                  <span v-if="testData.toolDetail"><span v-html="renderedFormula(testData.toolDetail)"></span></span>
 									<span v-else>无</span>
                 </div>
 
@@ -1044,7 +1044,7 @@
                         typeof item.answer === "number"
                           ? "单选题:"
                           : "多选题:"
-                      }}{{ item.title }}</span
+                      }}<span v-html="renderedFormula(item.title)"></span></span
                     >
                   </div>
 

+ 22 - 13
src/components/components/cocoFlowDia.vue

@@ -15,23 +15,32 @@
             </div>
            
             <div class="markDialog">
-                <template  v-for="(item,index) in listData">
-                    <div class="BodyCon" v-if="item.messages.length"  :key="index">
-                        <div class="BodyConTit">节点{{ index + 1}}</div>
-
-                        <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
-                            <div class="left" v-if="po.role == 'assistant'">
-                                    <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
-                                    <div class="con" v-html="MarkdownT(po.content)"></div>
-                            </div>
-
-                            <div class="left" v-if="po.role == 'user'">
-                                    <div class="TName" style="background-color: #9747FF;">{{ username }}</div>
-                                    <div class="con" v-html="po.content"></div>
+                <template v-if="listData.length && listData[0].messages.length">
+                    <div v-for="(item,index) in listData" :key="index">
+                        <div class="BodyCon" v-if="item.messages.length"  >
+                            <div class="BodyConTit">节点{{ index + 1}}</div>
+                            <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
+                                <div class="left" v-if="po.role == 'assistant'">
+                                        <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
+                                        <div class="con" v-html="MarkdownT(po.content)"></div>
+                                </div>
+
+                                <div class="left" v-if="po.role == 'user'">
+                                        <div class="TName" style="background-color: #9747FF;">{{ username }}</div>
+                                        <div class="con" v-html="po.content"></div>
+                                </div>
                             </div>
                         </div>
                     </div>
                 </template>
+                <div v-else style="text-align: center;
+                    display: flex;
+                    justify-content: center;
+                    align-items: center;
+                    height: 100%;
+                    min-height: 500px;">
+                    作业暂时只能展示对话文字哦~
+                </div>
             </div>
             
 

+ 39 - 32
src/components/components/studentWorkPreviewDialog.vue

@@ -38,7 +38,7 @@
 
                   <span
                     >{{ item.type == 1 ? "单选题:" : "多选题:"
-                    }}{{ item.teststitle }}</span
+                    }}<span v-html="renderedFormula(item.teststitle)"></span> </span
                   >
                 </div>
                 <div
@@ -270,38 +270,32 @@
               </div>
             </div>
             <div class="s_b_m_tool40" v-if="[72].includes(tool)">
-              <!-- <div  style="margin-bottom: 20px;" v-for="(item,index) in JSON.parse(studentWork.works)" :key="index">
-                <div style="margin-bottom: 15px;font-size: 20px;font-weight: 600;color: #000;">第{{ index + 1}}阶段</div>
-                <div v-for="(po,pInd) in item.messages" :key="pInd+'pInd'">
-                    <div class="left" v-if="po.role == 'assistant'">
-                            <div class="TName">小可AI助手</div>:
-                            <div class="con"  v-html="MarkdownT(po.content)"></div>
-                    </div> -->
-                    <!-- <div class="left" v-if="po.role == 'user'">
-                            <div class="TName">{{ studentWork.sName }}</div>:
-                            <div class="con" v-html="po.content"></div>
+              <template v-if="JSON.parse(studentWork.works).length && JSON.parse(studentWork.works)[0].messages.length">
+                <div v-for="(item,index) in JSON.parse(studentWork.works)" :key="index">
+                    <div class="BodyCon" v-if="item.messages.length" >
+                        <div class="BodyConTit">节点{{ index + 1}}</div>
+                        <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
+                            <div class="left" v-if="po.role == 'assistant'">
+                                    <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
+                                    <div class="con" v-html="MarkdownT(po.content)"></div>
+                            </div>
+
+                            <div class="left" v-if="po.role == 'user'">
+                                    <div class="TName" style="background-color: #9747FF;">{{ studentWork.sName }}</div>
+                                    <div class="con" v-html="po.content"></div>
+                            </div>
+                        </div>
                     </div>
                 </div>
-            </div> -->
-
-              <template v-for="(item,index) in JSON.parse(studentWork.works)">
-                  <div class="BodyCon" v-if="item.messages.length"  :key="index">
-                      <div class="BodyConTit">节点{{ index + 1}}</div>
-
-                      <div class="BodyConChat" v-for="(po, index2) in item.messages" :key="index+'-'+index2">
-                          <div class="left" v-if="po.role == 'assistant'">
-                                  <div class="TName" style="background-color: #0560FD;">小可AI助手</div>
-                                  <div class="con" v-html="MarkdownT(po.content)"></div>
-                          </div>
-
-                          <div class="left" v-if="po.role == 'user'">
-                                  <div class="TName" style="background-color: #9747FF;">{{ studentWork.sName }}</div>
-                                  <div class="con" v-html="po.content"></div>
-                          </div>
-                      </div>
-                  </div>
               </template>
-
+              <div v-else style="text-align: center;
+                    display: flex;
+                    justify-content: center;
+                    align-items: center;
+                    height: 100%;
+                    min-height: 500px;">
+                  作业暂时只能展示对话文字哦~
+              </div>
             </div>
           </div>
         </div>
@@ -312,7 +306,8 @@
 
 <script>
 import MarkdownIt from "markdown-it";
-
+import katex from 'katex'
+import 'katex/dist/katex.min.css'
 export default {
   components: {},
   data() {
@@ -404,6 +399,16 @@ export default {
     }
   },
   computed: {
+    renderedFormula() {
+      return function(val){
+        try {
+          return katex.renderToString(val,{ throwOnError: false });
+        } catch (e) {
+          console.error('KaTeX渲染错误:', e);
+          return val;
+        }
+      }
+    },
     MarkdownT() {
       return function (c) {
         let md = new MarkdownIt();
@@ -468,7 +473,9 @@ export default {
   width: 100vw;
   overflow: auto;
 }
-
+.studentWorkPreviewDialog >>> .katex{
+  font-size: 20px;
+}
 .s_body {
   width: 100%;
   height: 100%;

+ 130 - 91
src/components/easy2/studyStudent.vue

@@ -522,9 +522,9 @@
                   v-html="
                     chapInfoList[courseType].chapterInfo[0].taskJson[taskCount]
                       .taskDetail
-                      ? chapInfoList[courseType].chapterInfo[0].taskJson[
+                      ? renderedFormula(chapInfoList[courseType].chapterInfo[0].taskJson[
                           taskCount
-                        ].taskDetail
+                        ].taskDetail)
                       : '暂无描述'
                   "
                 ></div>
@@ -1020,7 +1020,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">电子白板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1032,7 +1032,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">思维导图</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1053,7 +1053,7 @@
                             />
                             <div style="margin: 5px 0">思维网格</div>
                             <!-- && worksStudent[toolIndex].length>0 -->
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1089,7 +1089,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问卷调查</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
                             style="position: absolute;right: 153px;top: -30px;">
                               分析
                             </div>
@@ -1118,7 +1118,7 @@
                             <div style="margin: 5px 0">选择题</div>
                             <div
                               class="upload_toolBtn"
-
+                              v-if="tType == 1"
                               @click="
                                 openChoseWorksDetailDialog(
                                   tooC,
@@ -1155,7 +1155,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问答</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
                               style="position: absolute;right: 135px;top: -45px;height: 40px;display: flex;align-items: center;justify-content: center;background: #409EFF;">
                               分析
                             </div>
@@ -1175,7 +1175,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">训练服务器</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1203,7 +1203,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AIoT Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1223,7 +1223,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Python</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1235,7 +1235,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
+                            <div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1255,7 +1255,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">数学画板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1267,7 +1267,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">翻译</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1295,7 +1295,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">GeoGebra</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1307,7 +1307,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">源码编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
                               style="position: absolute;right: 153px;top: -42px;">
                               分析
                             </div>
@@ -1325,7 +1325,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">个人评价</div>
-														<div class="upload_toolBtn"   @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
+														<div class="upload_toolBtn"  v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1337,7 +1337,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">选择匹配</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1357,7 +1357,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">排序</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
+														<div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1369,7 +1369,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">表格</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
+														<div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1381,7 +1381,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">文档</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1393,7 +1393,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">学生分组</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1405,7 +1405,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">CocoPi</div>
-                            <div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
+                            <div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1457,7 +1457,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">海龟编程</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1469,7 +1469,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI智能体</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1494,7 +1494,7 @@
                               {{tool.appJson && tool.appJson.name ? tool.appJson.name : '应用中心'}}
                             </div>
                             </el-tooltip>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1514,7 +1514,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">公式编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1546,7 +1546,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语写作</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1558,7 +1558,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语口语</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1577,7 +1577,7 @@
                       <!-- @click.stop="updateToolDetail(toolIndex, 2)" -->
                       <div
                         style="height:100%;"
-                        v-html="contentConvent(tool.toolDetail)"
+                        v-html="renderedFormula(tool.toolDetail)"
                         v-if="toolDetailIndex != toolIndex"
                       ></div>
                       <div v-else @click.stop="" style="height:100%;">
@@ -1968,7 +1968,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -2106,7 +2106,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -2180,7 +2180,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -3447,7 +3447,7 @@
                               <img
                                 style="cursor: pointer"
                                 :src="word2"
-                                @click="downloadFile(w.works)"
+                                @click="downloadFile(w.works,w.userid)"
                                 alt
                               />
                               <!--  @click="openVideo(w.works)" -->
@@ -3991,7 +3991,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <!--  @click="openVideo(w.works)" -->
@@ -4431,7 +4431,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -4609,7 +4609,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -10664,7 +10664,7 @@
                                 <img
                                   style="cursor: pointer"
                                   :src="word2"
-                                  @click="downloadFile(w.works)"
+                                  @click="downloadFile(w.works,w.userid)"
                                   alt
                                 />
                                 <!--  @click="openVideo(w.works)" -->
@@ -13031,7 +13031,7 @@
                 >
                   (多选题)
                 </div>
-                <div>题目:{{ testJson.testJson[index1].teststitle }}</div>
+                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -14333,7 +14333,7 @@
         <div
           class="worksAnswer codeFileBox"
           v-if="commentDetail.works && commentDetail.type == 12"
-          @click="downloadFile(commentDetail.works)"
+          @click="downloadFile(commentDetail.works,w.userid)"
         >
           <img src="../../assets/icon/codeFile.png" />
           <div>点击下载文件</div>
@@ -24616,59 +24616,60 @@ export default {
       };
       x.send();
     },
-    downloadFile(url) {
-      let hz = url.substring(url.lastIndexOf(".") + 1);
+    downloadFile(url,uid) {
+      if (this.tType == 1 || this.userid == uid) {
+        let hz = url.substring(url.lastIndexOf(".") + 1);
 
-      if (hz == "txt" || hz == "md") {
-        this.lookTxt(url);
-        return;
-      }
+        if (hz == "txt" || hz == "md") {
+          this.lookTxt(url);
+          return;
+        }
 
-      var credentials = {
-        accessKeyId: "AKIATLPEDU37QV5CHLMH",
-        secretAccessKey: "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"
-      }; //秘钥形式的登录上传
-      window.AWS.config.update(credentials);
-      window.AWS.config.region = "cn-northwest-1"; //设置区域
-      let url2 = url;
-      let _url2 = "";
-      if (
-        url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
-      ) {
-        _url2 = url2.split(
-          "https://view.officeapps.live.com/op/view.aspx?src="
-        )[1];
-      } else {
-        _url2 = url2;
+        var credentials = {
+          accessKeyId: "AKIATLPEDU37QV5CHLMH",
+          secretAccessKey: "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"
+        }; //秘钥形式的登录上传
+        window.AWS.config.update(credentials);
+        window.AWS.config.region = "cn-northwest-1"; //设置区域
+        let url2 = url;
+        let _url2 = "";
+        if (
+          url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+        ) {
+          _url2 = url2.split(
+            "https://view.officeapps.live.com/op/view.aspx?src="
+          )[1];
+        } else {
+          _url2 = url2;
+        }
+        const loading2 = this.$loading.service({
+          background: "rgba(255, 255, 255, 0.7)",
+          target: document.body,
+          text: "文件加载中..."
+        });
+        var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
+        let name = decodeURIComponent(
+          _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+        );
+        var params = {
+          Bucket: "ccrb",
+          Key: name
+        };
+        s3.getObject(params, function(err, data) {
+          loading2.close();
+          if (err) console.log(err, err.stack);
+          // an error occurred
+          else {
+            let url = window.URL.createObjectURL(new Blob([data.Body]));
+            let a = document.createElement("a");
+            a.name = name;
+            a.href = url;
+            a.download = name;
+            a.click();
+            console.log(data);
+          } // sxuccessful response
+        });
       }
-      const loading2 = this.$loading.service({
-        background: "rgba(255, 255, 255, 0.7)",
-        target: document.body,
-        text: "文件加载中..."
-      });
-      var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-      let name = decodeURIComponent(
-        _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
-      );
-      var params = {
-        Bucket: "ccrb",
-        Key: name
-      };
-      s3.getObject(params, function(err, data) {
-        loading2.close();
-        if (err) console.log(err, err.stack);
-        // an error occurred
-        else {
-          let url = window.URL.createObjectURL(new Blob([data.Body]));
-          let a = document.createElement("a");
-          a.name = name;
-          a.href = url;
-          a.download = name;
-          a.click();
-          console.log(data);
-        } // sxuccessful response
-      });
-
       return;
       let _this = this;
       let _url = "";
@@ -26119,7 +26120,42 @@ export default {
     renderedFormula() {
       return function(val){
         try {
-          return katex.renderToString(val,{ throwOnError: false });
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              // 纯文本,整体渲染
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                   val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
         } catch (e) {
           console.error('KaTeX渲染错误:', e);
           return val;
@@ -30842,4 +30878,7 @@ div::-webkit-scrollbar {
   overflow: hidden;
   text-overflow: ellipsis;
 }
+.pb_content >>> .katex {
+  font-size: 16px;
+}
 </style>

+ 123 - 83
src/components/easy3/studyStudent.vue

@@ -537,9 +537,9 @@
                   v-html="
                     chapInfoList[courseType].chapterInfo[0].taskJson[taskCount]
                       .taskDetail
-                      ? chapInfoList[courseType].chapterInfo[0].taskJson[
+                      ? renderedFormula(chapInfoList[courseType].chapterInfo[0].taskJson[
                           taskCount
-                        ].taskDetail
+                        ].taskDetail)
                       : '暂无描述'
                   "
                 ></div>
@@ -1021,7 +1021,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">电子白板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1033,7 +1033,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">思维导图</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1054,7 +1054,7 @@
                             />
                             <div style="margin: 5px 0">思维网格</div>
                             <!-- && worksStudent[toolIndex].length>0 -->
-														<div class="upload_toolBtn"   @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
+														<div class="upload_toolBtn" v-if="tType == 1"   @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1090,7 +1090,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问卷调查</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
                             style="position: absolute;right: 153px;top: -30px;">
                               分析
                             </div>
@@ -1107,7 +1107,7 @@
                             />
                             <div style="margin: 5px 0">选择题</div>
 
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,45)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,45)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1136,7 +1136,7 @@
                             />
                             <div style="margin: 5px 0">问答</div>
 
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
                               style="position: absolute;right: 135px;top: -45px;height: 40px;display: flex;align-items: center;justify-content: center;background: #409EFF;">
                               分析
                             </div>
@@ -1156,7 +1156,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">训练服务器</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1184,7 +1184,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AIoT Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1204,7 +1204,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Python</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1216,7 +1216,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1236,7 +1236,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">数学画板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1248,7 +1248,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">翻译</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1276,7 +1276,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">GeoGebra</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1288,7 +1288,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">源码编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
                               style="position: absolute;right: 153px;top: -42px;">
                               分析
                             </div>
@@ -1306,7 +1306,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">个人评价</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1318,7 +1318,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">选择匹配</div>
-														<div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
+														<div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1338,7 +1338,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">排序</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1350,7 +1350,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">表格</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1362,7 +1362,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">文档</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1374,7 +1374,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">学生分组</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1386,7 +1386,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">CocoPi</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1438,7 +1438,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">海龟编程</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1450,7 +1450,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI智能体</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1475,7 +1475,7 @@
                                 {{tool.appJson && tool.appJson.name ? tool.appJson.name : '应用中心'}}
                               </div>
                             </el-tooltip>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1495,7 +1495,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">公式编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1527,7 +1527,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语写作</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1539,7 +1539,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语口语</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1551,7 +1551,7 @@
                       <!-- <div class="toolTitle">工具描述</div> -->
                       <!-- @click.stop="updateToolDetail(toolIndex, 2)" 点击开启修改-->
                       <div style="height:100%;"
-                        v-html="contentConvent(tool.toolDetail)"
+                        v-html="renderedFormula(tool.toolDetail)"
                         v-if="toolDetailIndex != toolIndex"
                       ></div>
                       <div v-else @click.stop="" style="height:100%;">
@@ -1738,7 +1738,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -1812,7 +1812,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -1886,7 +1886,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -2875,7 +2875,7 @@
                               <img
                                 style="cursor: pointer"
                                 :src="word2"
-                                @click="downloadFile(w.works)"
+                                @click="downloadFile(w.works,w.userid)"
                                 alt
                               />
                               <!--  @click="openVideo(w.works)" -->
@@ -3128,7 +3128,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <!--  @click="openVideo(w.works)" -->
@@ -3442,7 +3442,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -3603,7 +3603,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -7491,7 +7491,7 @@
                                 <img
                                   style="cursor: pointer"
                                   :src="word2"
-                                  @click="downloadFile(w.works)"
+                                  @click="downloadFile(w.works,w.userid)"
                                   alt
                                 />
                                 <!--  @click="openVideo(w.works)" -->
@@ -9663,7 +9663,7 @@
                 >
                   (多选题)
                 </div>
-                <div>题目:{{ testJson.testJson[index1].teststitle }}</div>
+                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -20091,49 +20091,52 @@ export default {
       };
       x.send();
     },
-    downloadFile(url) {
-      var credentials = {
-        accessKeyId: "AKIATLPEDU37QV5CHLMH",
-        secretAccessKey: "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",
-      }; //秘钥形式的登录上传
-      window.AWS.config.update(credentials);
-      window.AWS.config.region = "cn-northwest-1"; //设置区域
-      let url2 = url;
-      let _url2 = "";
-      if (
-        url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
-      ) {
-        _url2 = url2.split(
-          "https://view.officeapps.live.com/op/view.aspx?src="
-        )[1];
-      } else {
-        _url2 = url2;
+    downloadFile(url,uid) {
+      if (this.tType == 1 || this.userid == uid) {
+        var credentials = {
+          accessKeyId: "AKIATLPEDU37QV5CHLMH",
+          secretAccessKey: "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",
+        }; //秘钥形式的登录上传
+        window.AWS.config.update(credentials);
+        window.AWS.config.region = "cn-northwest-1"; //设置区域
+        let url2 = url;
+        let _url2 = "";
+        if (
+          url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+        ) {
+          _url2 = url2.split(
+            "https://view.officeapps.live.com/op/view.aspx?src="
+          )[1];
+        } else {
+          _url2 = url2;
+        }
+        const loading2 = this.$loading.service({
+          background: "rgba(255, 255, 255, 0.7)",
+          target: document.body,
+          text: "文件加载中...",
+        });
+        var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
+        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+        var params = {
+          Bucket: "ccrb",
+          Key: name
+        };
+        s3.getObject(params, function (err, data) {
+          loading2.close();
+          if (err) console.log(err, err.stack); // an error occurred
+          else {
+            let url = window.URL.createObjectURL(new Blob([data.Body]));
+            let a = document.createElement("a");
+            a.name = name;
+            a.href = url;
+            a.download = name;
+            a.click();
+            console.log(data);
+          }          // sxuccessful response
+
+        });
       }
-      const loading2 = this.$loading.service({
-        background: "rgba(255, 255, 255, 0.7)",
-        target: document.body,
-        text: "文件加载中...",
-      });
-      var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-      let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
-      var params = {
-        Bucket: "ccrb",
-        Key: name
-      };
-      s3.getObject(params, function (err, data) {
-        loading2.close();
-        if (err) console.log(err, err.stack); // an error occurred
-        else {
-          let url = window.URL.createObjectURL(new Blob([data.Body]));
-          let a = document.createElement("a");
-          a.name = name;
-          a.href = url;
-          a.download = name;
-          a.click();
-          console.log(data);
-        }          // sxuccessful response
 
-      });
 
       return;
       let _this = this;
@@ -21542,7 +21545,42 @@ export default {
     renderedFormula() {
       return function(val){
         try {
-          return katex.renderToString(val,{ throwOnError: false });
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+              // 纯文本,整体渲染
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                  val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
         } catch (e) {
           console.error('KaTeX渲染错误:', e);
           return val;
@@ -21561,7 +21599,7 @@ export default {
           ? c
               .replaceAll(/\r\n/g, "<br/>")
               .replaceAll(/\n/g, "<br/>")
-              .replaceAll(/\s/g, " &nbsp")
+              .replaceAll(/\s/g, "&nbsp")
           : "";
       };
     },
@@ -22010,7 +22048,9 @@ export default {
   overflow:hidden;
   box-sizing:border-box;
 }
-
+.pb_content >>> .katex {
+  font-size: 16px;
+}
 .file {
   display: flex;
   flex-direction: column;

+ 122 - 84
src/components/studyStudent.vue

@@ -500,9 +500,9 @@
                   v-html="
                     chapInfoList[courseType].chapterInfo[0].taskJson[taskCount]
                       .taskDetail
-                      ? chapInfoList[courseType].chapterInfo[0].taskJson[
+                      ? renderedFormula(chapInfoList[courseType].chapterInfo[0].taskJson[
                           taskCount
-                        ].taskDetail
+                        ].taskDetail)
                       : '暂无描述'
                   "
                 ></div>
@@ -981,7 +981,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">电子白板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -993,7 +993,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">思维导图</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1014,7 +1014,7 @@
                             />
                             <div style="margin: 5px 0">思维网格</div>
                             <!-- && worksStudent[toolIndex].length>0 -->
-														<div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
+														<div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1050,7 +1050,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问卷调查</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
                             style="position: absolute;right: 153px;top: -30px;">
                               分析
                             </div>
@@ -1068,7 +1068,7 @@
                             />
                             <div style="margin: 5px 0">选择题</div>
 
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,45)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,45)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1096,7 +1096,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问答</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
                               style="position: absolute;right: 135px;top: -45px;height: 40px;display: flex;align-items: center;justify-content: center;background: #409EFF;">
                               分析
                             </div>
@@ -1116,7 +1116,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">训练服务器</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1144,7 +1144,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AIoT Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1164,7 +1164,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Python</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1176,7 +1176,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1196,7 +1196,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">数学画板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1208,7 +1208,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">翻译</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1236,7 +1236,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">GeoGebra</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1248,7 +1248,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">源码编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
                               style="position: absolute;right: 153px;top: -42px;">
                               分析
                             </div>
@@ -1266,7 +1266,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">个人评价</div>
-														<div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
+														<div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1278,7 +1278,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">选择匹配</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1298,7 +1298,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">排序</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1310,7 +1310,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">表格</div>
-														<div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
+														<div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1322,7 +1322,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">文档</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1334,7 +1334,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">学生分组</div>
-                            <div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
+                            <div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1346,7 +1346,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">CocoPi</div>
-                            <div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
+                            <div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1398,7 +1398,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">海龟编程</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1410,7 +1410,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI智能体</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1434,7 +1434,7 @@
                               <div class="Ovh">
                                 {{tool.appJson && tool.appJson.name ? tool.appJson.name : '应用中心'}}
                               </div>
-                              <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
+                              <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1455,7 +1455,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">公式编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,66)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1487,7 +1487,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语写作</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1499,7 +1499,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语口语</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1511,7 +1511,7 @@
                       <!-- <div class="toolTitle">工具描述</div> -->
                         <!-- @click.stop="updateToolDetail(toolIndex, 2)" -->
                       <div style="height:100%;"
-                        v-html="contentConvent(tool.toolDetail)"
+                        v-html="renderedFormula(tool.toolDetail)"
                         v-if="toolDetailIndex != toolIndex"
                       ></div>
                       <div v-else @click.stop="" style="height:100%;">
@@ -1698,7 +1698,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -1772,7 +1772,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -1846,7 +1846,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -2835,7 +2835,7 @@
                               <img
                                 style="cursor: pointer"
                                 :src="word2"
-                                @click="downloadFile(w.works)"
+                                @click="downloadFile(w.works,w.userid)"
                                 alt
                               />
                               <!--  @click="openVideo(w.works)" -->
@@ -3088,7 +3088,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <!--  @click="openVideo(w.works)" -->
@@ -3402,7 +3402,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -3563,7 +3563,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -7451,7 +7451,7 @@
                                 <img
                                   style="cursor: pointer"
                                   :src="word2"
-                                  @click="downloadFile(w.works)"
+                                  @click="downloadFile(w.works,w.userid)"
                                   alt
                                 />
                                 <!--  @click="openVideo(w.works)" -->
@@ -9599,7 +9599,7 @@
                 >
                   (多选题)
                 </div>
-                <div>题目:{{ testJson.testJson[index1].teststitle }}</div>
+                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -20028,51 +20028,52 @@ export default {
       };
       x.send();
     },
-    downloadFile(url) {
-			// this.$message.info("查看作业-下载文件")
-      var credentials = {
-        accessKeyId: "AKIATLPEDU37QV5CHLMH",
-        secretAccessKey: "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",
-      }; //秘钥形式的登录上传
-      window.AWS.config.update(credentials);
-      window.AWS.config.region = "cn-northwest-1"; //设置区域
-      let url2 = url;
-      let _url2 = "";
-      if (
-        url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
-      ) {
-        _url2 = url2.split(
-          "https://view.officeapps.live.com/op/view.aspx?src="
-        )[1];
-      } else {
-        _url2 = url2;
-      }
-      const loading2 = this.$loading.service({
-        background: "rgba(255, 255, 255, 0.7)",
-        target: document.body,
-        text: "文件加载中...",
-      });
-      var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-      let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
-      var params = {
-        Bucket: "ccrb",
-        Key: name
-      };
-      s3.getObject(params, function (err, data) {
-        loading2.close();
-        if (err) console.log(err, err.stack); // an error occurred
-        else {
-          let url = window.URL.createObjectURL(new Blob([data.Body]));
-          let a = document.createElement("a");
-          a.name = name;
-          a.href = url;
-          a.download = name;
-          a.click();
-          console.log(data);
-        }          // sxuccessful response
-
-      });
+    downloadFile(url,uid) {
+      if (this.tType == 1 || this.userid == uid) {
+        // this.$message.info("查看作业-下载文件")
+        var credentials = {
+          accessKeyId: "AKIATLPEDU37QV5CHLMH",
+          secretAccessKey: "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",
+        }; //秘钥形式的登录上传
+        window.AWS.config.update(credentials);
+        window.AWS.config.region = "cn-northwest-1"; //设置区域
+        let url2 = url;
+        let _url2 = "";
+        if (
+          url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+        ) {
+          _url2 = url2.split(
+            "https://view.officeapps.live.com/op/view.aspx?src="
+          )[1];
+        } else {
+          _url2 = url2;
+        }
+        const loading2 = this.$loading.service({
+          background: "rgba(255, 255, 255, 0.7)",
+          target: document.body,
+          text: "文件加载中...",
+        });
+        var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
+        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+        var params = {
+          Bucket: "ccrb",
+          Key: name
+        };
+        s3.getObject(params, function (err, data) {
+          loading2.close();
+          if (err) console.log(err, err.stack); // an error occurred
+          else {
+            let url = window.URL.createObjectURL(new Blob([data.Body]));
+            let a = document.createElement("a");
+            a.name = name;
+            a.href = url;
+            a.download = name;
+            a.click();
+            console.log(data);
+          }          // sxuccessful response
 
+        });
+      }
       return;
       let _this = this;
       let _url = "";
@@ -21496,7 +21497,41 @@ export default {
     renderedFormula() {
       return function(val){
         try {
-          return katex.renderToString(val,{ throwOnError: false });
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+              // 纯文本,整体渲染
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                  val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
         } catch (e) {
           console.error('KaTeX渲染错误:', e);
           return val;
@@ -26145,4 +26180,7 @@ div::-webkit-scrollbar {
   overflow: hidden;
   text-overflow: ellipsis;
 }
+.pb_content >>> .katex {
+  font-size: 16px;
+}
 </style>

+ 127 - 88
src/components/studySutdentClass/studyStudent.vue

@@ -537,9 +537,9 @@
                   v-html="
                     chapInfoList[courseType].chapterInfo[0].taskJson[taskCount]
                       .taskDetail
-                      ? chapInfoList[courseType].chapterInfo[0].taskJson[
+                      ? renderedFormula(chapInfoList[courseType].chapterInfo[0].taskJson[
                           taskCount
-                        ].taskDetail
+                        ].taskDetail)
                       : '暂无描述'
                   "
                 ></div>
@@ -1020,7 +1020,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">电子白板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,1)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1032,7 +1032,7 @@
                               @click="addTools(tooC, toolIndex, taskCount)"
                             />
                             <div style="margin: 5px 0">思维导图</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,3)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1053,7 +1053,7 @@
                             />
                             <div style="margin: 5px 0">思维网格</div>
                             <!-- && worksStudent[toolIndex].length>0 -->
-                            <div class="upload_toolBtn"   @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
+                            <div class="upload_toolBtn" v-if="tType == 1"   @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,7)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1089,7 +1089,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问卷调查</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,4)"
                             style="position: absolute;right: 153px;top: -30px;">
                               分析
                             </div>
@@ -1119,7 +1119,7 @@
                             <!-- &&worksStudent[toolIndex].length > 0 -->
                             <div
                               class="upload_toolBtn"
-
+                              v-if="tType == 1"
                               @click="
                                 openChoseWorksDetailDialog(
                                   tooC,
@@ -1155,7 +1155,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">问答</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,15)"
                               style="position: absolute;right: 135px;top: -45px;height: 40px;display: flex;align-items: center;justify-content: center;background: #409EFF;">
                               分析
                             </div>
@@ -1175,7 +1175,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">训练服务器</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,18)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1203,7 +1203,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AIoT Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,21)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1231,7 +1231,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI Blockly</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,24)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1251,7 +1251,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">数学画板</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,31)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1263,7 +1263,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">翻译</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,28)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1291,7 +1291,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">GeoGebra</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,39)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1303,7 +1303,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">源码编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,32)"
                               style="position: absolute;right: 153px;top: -42px;">
                               分析
                             </div>
@@ -1321,7 +1321,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">个人评价</div>
-                            <div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,40)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1333,7 +1333,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">选择匹配</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
+														<div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,41)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1353,7 +1353,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">排序</div>
-														<div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
+														<div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,47)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1365,7 +1365,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">表格</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,48)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1377,7 +1377,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">文档</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,52)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1389,7 +1389,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">学生分组</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,49)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1401,7 +1401,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">CocoPi</div>
-                            <div class="upload_toolBtn" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
+                            <div class="upload_toolBtn" v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,57)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1453,7 +1453,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">海龟编程</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,63)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1465,7 +1465,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">AI智能体</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,71)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1490,7 +1490,7 @@
                                 {{tool.appJson && tool.appJson.name ? tool.appJson.name : '应用中心'}}
                               </div>
                             </el-tooltip>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,72)"
                               style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1510,7 +1510,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">公式编辑</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,36)"
+                            <div class="upload_toolBtn"  v-if="tType == 1" @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,36)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1542,7 +1542,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语写作</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,69)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1554,7 +1554,7 @@
                               alt
                             />
                             <div style="margin: 5px 0">英语口语</div>
-                            <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
+                            <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,70)"
                             style="position: absolute;right: 33px;top: -30px;">
                               分析
                             </div>
@@ -1573,7 +1573,7 @@
                       <!-- @click.stop="updateToolDetail(toolIndex, 2)" -->
                       <div
                         style="height:100%;"
-                        v-html="contentConvent(tool.toolDetail)"
+                        v-html="renderedFormula(tool.toolDetail)"
                         v-if="toolDetailIndex != toolIndex"
                       ></div>
                       <div v-else @click.stop="" style="height:100%;">
@@ -1964,7 +1964,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -2102,7 +2102,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -2176,7 +2176,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -3443,7 +3443,7 @@
                               <img
                                 style="cursor: pointer"
                                 :src="word2"
-                                @click="downloadFile(w.works)"
+                                @click="downloadFile(w.works,w.userid)"
                                 alt
                               />
                               <!--  @click="openVideo(w.works)" -->
@@ -3987,7 +3987,7 @@
                           <img
                             style="cursor: pointer"
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <!--  @click="openVideo(w.works)" -->
@@ -4427,7 +4427,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             alt
                           />
                           <div
@@ -4605,7 +4605,7 @@
                         <div class="workImg">
                           <img
                             :src="word2"
-                            @click="downloadFile(w.works)"
+                            @click="downloadFile(w.works,w.userid)"
                             v-if="w.type == 12"
                             alt
                           />
@@ -10660,7 +10660,7 @@
                                 <img
                                   style="cursor: pointer"
                                   :src="word2"
-                                  @click="downloadFile(w.works)"
+                                  @click="downloadFile(w.works,w.userid)"
                                   alt
                                 />
                                 <!--  @click="openVideo(w.works)" -->
@@ -12213,7 +12213,7 @@
                   alt
                 />
                 <div style="margin: 5px 0">AI Python</div>
-                <div class="upload_toolBtn"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
+                <div class="upload_toolBtn" v-if="tType == 1"  @click="openChoseWorksDetailDialog(tooC,toolIndex,taskCount,23)"
                   style="position: absolute;right: 33px;top: -30px;">
                   分析
                 </div>
@@ -12844,7 +12844,7 @@
                 >
                   (多选题)
                 </div>
-                <div>题目:{{ testJson.testJson[index1].teststitle }}</div>
+                <div>题目:<span v-html="renderedFormula(testJson.testJson[index1].teststitle)"></span></div>
               </div>
               <img
                 v-if="testJson.testJson[index1].img"
@@ -24061,56 +24061,57 @@ export default {
       };
       x.send();
     },
-    downloadFile(url) {
-      let hz = url.substring(url.lastIndexOf(".") + 1);
-
-      if (hz == "txt" || hz == "md") {
-        this.lookTxt(url);
-        return;
-      }
-      var credentials = {
-        accessKeyId: "AKIATLPEDU37QV5CHLMH",
-        secretAccessKey: "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",
-      }; //秘钥形式的登录上传
-      window.AWS.config.update(credentials);
-      window.AWS.config.region = "cn-northwest-1"; //设置区域
-      let url2 = url;
-      let _url2 = "";
-      if (
-        url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
-      ) {
-        _url2 = url2.split(
-          "https://view.officeapps.live.com/op/view.aspx?src="
-        )[1];
-      } else {
-        _url2 = url2;
-      }
-      const loading2 = this.$loading.service({
-        background: "rgba(255, 255, 255, 0.7)",
-        target: document.body,
-        text: "文件加载中...",
-      });
-      var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
-      let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
-      var params = {
-        Bucket: "ccrb",
-        Key: name
-      };
-      s3.getObject(params, function (err, data) {
-        loading2.close();
-        if (err) console.log(err, err.stack); // an error occurred
-        else {
-          let url = window.URL.createObjectURL(new Blob([data.Body]));
-          let a = document.createElement("a");
-          a.name = name;
-          a.href = url;
-          a.download = name;
-          a.click();
-          console.log(data);
-        }          // sxuccessful response
+    downloadFile(url,uid) {
+      if (this.tType == 1 || this.userid == uid) {
+        let hz = url.substring(url.lastIndexOf(".") + 1);
 
-      });
+        if (hz == "txt" || hz == "md") {
+          this.lookTxt(url);
+          return;
+        }
+        var credentials = {
+          accessKeyId: "AKIATLPEDU37QV5CHLMH",
+          secretAccessKey: "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",
+        }; //秘钥形式的登录上传
+        window.AWS.config.update(credentials);
+        window.AWS.config.region = "cn-northwest-1"; //设置区域
+        let url2 = url;
+        let _url2 = "";
+        if (
+          url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+        ) {
+          _url2 = url2.split(
+            "https://view.officeapps.live.com/op/view.aspx?src="
+          )[1];
+        } else {
+          _url2 = url2;
+        }
+        const loading2 = this.$loading.service({
+          background: "rgba(255, 255, 255, 0.7)",
+          target: document.body,
+          text: "文件加载中...",
+        });
+        var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
+        let name = decodeURIComponent(_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1])
+        var params = {
+          Bucket: "ccrb",
+          Key: name
+        };
+        s3.getObject(params, function (err, data) {
+          loading2.close();
+          if (err) console.log(err, err.stack); // an error occurred
+          else {
+            let url = window.URL.createObjectURL(new Blob([data.Body]));
+            let a = document.createElement("a");
+            a.name = name;
+            a.href = url;
+            a.download = name;
+            a.click();
+            console.log(data);
+          }          // sxuccessful response
 
+        });
+      }
       return;
       let _this = this;
       let _url = "";
@@ -25519,7 +25520,42 @@ export default {
     renderedFormula() {
       return function(val){
         try {
-          return katex.renderToString(val,{ throwOnError: false });
+           // 判断是否含有HTML标签,<tag ...>...</tag>
+            const hasTag = /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g.test(val);
+            if (!hasTag) {
+              // 纯文本,整体渲染
+              val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+              try {
+                return katex.renderToString(val.trim(), {
+                  throwOnError: false,
+                  strict: false,
+                  output: "htmlAndMathml"
+                });
+              } catch (e) {
+                return val; // 渲染失败原样输出
+              }
+            } else {
+              // 有标签,对每个标签内容渲染
+              return val.replace(
+                /<([a-zA-Z][\w\-]*)([^>]*)>([\s\S]*?)<\/\1>/g,
+                (match, tag, attrs, inner) => {
+                  let html;
+                  val = val.trim().replace(/[\u200B-\u200D\uFEFF]/g, '');
+
+                  try {
+                    html = katex.renderToString(inner.trim(), {
+                      throwOnError: false,
+                      strict: false,
+                      output: "htmlAndMathml"
+                    });
+                  } catch (e) {
+                    html = inner;
+                  }
+                  return `<${tag}${attrs}>${html}</${tag}>`;
+                }
+              );
+            }
         } catch (e) {
           console.error('KaTeX渲染错误:', e);
           return val;
@@ -30199,4 +30235,7 @@ div::-webkit-scrollbar {
 
   text-overflow: ellipsis;
 }
+.pb_content >>> .katex {
+  font-size: 16px;
+}
 </style>

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio