Quellcode durchsuchen

Merge branch 'beta'

lsc vor 3 Monaten
Ursprung
Commit
fde20e12d3
42 geänderte Dateien mit 3608 neuen und 799 gelöschten Zeilen
  1. 1 1
      dist/index.html
  2. 0 0
      dist/static/css/app.2b5d26585cec8c72398d534cabb52fbc.css
  3. 0 0
      dist/static/css/app.5867ee582fe0736091607d039848a150.css
  4. 0 0
      dist/static/css/app.5867ee582fe0736091607d039848a150.css.map
  5. 0 0
      dist/static/js/app.fb13802f05d7f40e14e7.js
  6. 0 0
      dist/static/js/app.fb13802f05d7f40e14e7.js.map
  7. 0 0
      dist/static/js/manifest.161e82026ac2ae03ab6f.js.map
  8. 1 0
      package-lock.json
  9. 9 0
      src/assets/css/button.css
  10. 1 0
      src/assets/icon/appStore/agent.svg
  11. 3 0
      src/assets/icon/appStore/collect_active.svg
  12. 3 0
      src/assets/icon/appStore/collect_default.svg
  13. 4 0
      src/assets/icon/appStore/copy.svg
  14. 6 0
      src/assets/icon/appStore/del.svg
  15. 6 0
      src/assets/icon/appStore/edit.svg
  16. 3 0
      src/assets/icon/appStore/praise_active.svg
  17. 3 0
      src/assets/icon/appStore/praise_default.svg
  18. 1 0
      src/assets/icon/appStore/user_copy.svg
  19. 4 0
      src/assets/icon/appStore/workflow.svg
  20. 1 0
      src/assets/icon/course/save.svg
  21. 530 251
      src/components/pages/aiAddCourse/addCourse.vue
  22. 60 2
      src/components/pages/aiAddCourse/aiBoxRight.vue
  23. 68 8
      src/components/pages/aiEasy/addCourse.vue
  24. 1 1
      src/components/pages/aiEasy/aiBoxRight.vue
  25. 7 2
      src/components/pages/appStore/components/saveCard.vue
  26. 46 8
      src/components/pages/appStore/dialog/addAppDialog.vue
  27. 292 0
      src/components/pages/appStore/dialog/releaseAppDialog.vue
  28. 307 0
      src/components/pages/appStore/dialog/selectAppDialog.vue
  29. 707 204
      src/components/pages/appStore/views/appManagement.vue
  30. 556 38
      src/components/pages/appStore/views/workSpace.vue
  31. 1 1
      src/components/pages/classroomObservation/components/baseMessage.vue
  32. 5 5
      src/components/pages/classroomObservation/components/wangEnduit.vue
  33. 134 3
      src/components/pages/components/lookWork.vue
  34. 10 3
      src/components/pages/course.vue
  35. 2 2
      src/components/pages/kindStudentEva/test/component/sharePdf.vue
  36. 125 28
      src/components/pages/test/check/docxTemplateDialog.vue
  37. 35 21
      src/components/pages/test/check/index.vue
  38. 537 182
      src/components/pages/test/checkAi/aiLeader.vue
  39. 46 0
      src/components/pages/test/checkAi/eChartTemplate.vue
  40. 36 16
      src/components/pages/test/choseCheck/csvTableView.vue
  41. 51 17
      src/components/pages/test/smarter.vue
  42. 6 6
      src/components/pages/testStudent/view/preview.vue

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.2b5d26585cec8c72398d534cabb52fbc.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.de15001ce66f032e9274.js></script><script type=text/javascript src=./static/js/app.c8c9c5693bab676481f2.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.5867ee582fe0736091607d039848a150.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.de15001ce66f032e9274.js></script><script type=text/javascript src=./static/js/app.fb13802f05d7f40e14e7.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/static/css/app.2b5d26585cec8c72398d534cabb52fbc.css


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/static/css/app.5867ee582fe0736091607d039848a150.css


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/static/css/app.5867ee582fe0736091607d039848a150.css.map


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/static/js/app.fb13802f05d7f40e14e7.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/static/js/app.fb13802f05d7f40e14e7.js.map


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/static/js/manifest.161e82026ac2ae03ab6f.js.map


+ 1 - 0
package-lock.json

@@ -17788,6 +17788,7 @@
       "version": "1.8.0",
       "resolved": "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
       "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
+      "deprecated": "package has been renamed to acorn-import-attributes",
       "peer": true,
       "peerDependencies": {
         "acorn": "^8"

+ 9 - 0
src/assets/css/button.css

@@ -1,3 +1,4 @@
+.c_pub_button_stopeped,
 .c_pub_button_confirm {
   color: #fff;
   background-color: #0061FF;
@@ -17,10 +18,18 @@
   line-height: 1;
 }
 
+.c_pub_button_stopeped {
+  background-color: #f56c6c;
+}
+
 .c_pub_button_confirm:hover {
   background-color: #3681FC !important;
 }
 
+.c_pub_button_stopeped:hover {
+  background-color: #f57676 !important;
+}
+
 .c_pub_button_confirm + .c_pub_button_confirm {
   margin-left: 20px;
 }

Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 0
src/assets/icon/appStore/agent.svg


+ 3 - 0
src/assets/icon/appStore/collect_active.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8 2L10.0086 5.95016L14.5 6.58359L11.25 9.65836L12.0172 14L8 11.9502L3.98278 14L4.75 9.65836L1.5 6.58359L5.99139 5.95016L8 2Z" fill="#FFD324"/>
+</svg>

+ 3 - 0
src/assets/icon/appStore/collect_default.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.00001 1.5C8.1894 1.5 8.36253 1.61128 8.44723 1.78745L10.3276 5.69853L14.062 6.18401C14.2515 6.20865 14.411 6.34338 14.4729 6.53124C14.5349 6.71909 14.4886 6.92726 14.3536 7.06769L11.5537 9.9795L12.4851 13.8539C12.5302 14.0413 12.4715 14.2393 12.3329 14.368C12.1942 14.4967 11.9984 14.5347 11.8245 14.4669L8.00001 12.9754L4.17558 14.4669C4.0016 14.5347 3.80578 14.4967 3.66714 14.368C3.52849 14.2393 3.46988 14.0413 3.51494 13.8539L4.44628 9.9795L1.64646 7.06769C1.51143 6.92726 1.4651 6.71909 1.52708 6.53124C1.58905 6.34338 1.7485 6.20865 1.938 6.18401L5.67247 5.69853L7.5528 1.78745C7.6375 1.61128 7.81063 1.5 8.00001 1.5ZM8.00001 3.18275L6.44723 6.41255C6.37246 6.56806 6.22792 6.67442 6.06203 6.69598L3.07646 7.08411L5.35357 9.4523C5.47776 9.58146 5.52768 9.76891 5.48509 9.94611L4.71603 13.1454L7.82445 11.9331C7.93764 11.889 8.06238 11.889 8.17558 11.9331L11.284 13.1454L10.5149 9.94611C10.4723 9.76891 10.5223 9.58146 10.6465 9.4523L12.9236 7.08411L9.938 6.69598C9.77211 6.67442 9.62756 6.56806 9.5528 6.41255L8.00001 3.18275Z" fill="black" fill-opacity="0.6"/>
+</svg>

+ 4 - 0
src/assets/icon/appStore/copy.svg

@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2 2.5C2 2.22386 2.22386 2 2.5 2H10C10.2761 2 10.5 2.22386 10.5 2.5C10.5 2.77614 10.2761 3 10 3H3V10C3 10.2761 2.77614 10.5 2.5 10.5C2.22386 10.5 2 10.2761 2 10V2.5Z" fill="black" fill-opacity="0.9"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5 5.5C5 5.22386 5.22386 5 5.5 5H13.5C13.7761 5 14 5.22386 14 5.5V13.5C14 13.7761 13.7761 14 13.5 14H5.5C5.22386 14 5 13.7761 5 13.5V5.5ZM6 6V13H13V6H6Z" fill="black" fill-opacity="0.9"/>
+</svg>

+ 6 - 0
src/assets/icon/appStore/del.svg

@@ -0,0 +1,6 @@
+<svg t="1735179126172" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7200"
+  width="200" height="200">
+  <path
+    d="M623.077 748.923c-17.598 0-31.82-14.223-31.82-31.82V367.025c0-17.598 14.222-31.827 31.82-31.827s31.827 14.23 31.827 31.827v350.075c0 17.6-14.228 31.822-31.827 31.822z m-190.945 0c-17.604 0-31.827-14.223-31.827-31.82V367.025c0-17.598 14.223-31.827 31.827-31.827 17.598 0 31.82 14.23 31.82 31.827v350.075c0 17.6-14.222 31.822-31.82 31.822z m509.193-541.02H782.201v-63.65c0-52.64-42.486-95.475-94.742-95.475H368.477c-52.634 0-95.47 42.836-95.47 95.475v63.65H113.885c-17.604 0-31.827 14.222-31.827 31.826 0 17.598 14.223 31.82 31.827 31.82h827.441c17.598 0 31.827-14.222 31.827-31.82 0-17.604-14.228-31.827-31.827-31.827z m-604.669-63.65c0-17.536 14.287-31.826 31.821-31.826H687.46c17.444 0 31.094 13.972 31.094 31.826v63.65H336.656v-63.65z m413.85 795.621H304.892c-52.635 0-95.47-42.836-95.47-95.475V366.55c0-17.569 14.257-31.826 31.822-31.826 17.57 0 31.826 14.257 31.826 31.826V844.4c0 17.569 14.288 31.826 31.823 31.826h445.613c17.565 0 31.823-14.257 31.823-31.826V367.852c0-17.565 14.228-31.823 31.826-31.823 17.599 0 31.827 14.258 31.827 31.823v476.547c0 52.64-42.841 95.475-95.476 95.475z"
+    p-id="7201" fill="#000000" fill-opacity="0.9"></path>
+</svg>

+ 6 - 0
src/assets/icon/appStore/edit.svg

@@ -0,0 +1,6 @@
+<svg t="1735179175069" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9354"
+  width="200" height="200">
+  <path
+    d="M128 544a32 32 0 0 1 10.176-23.424l480-448a32 32 0 0 1 44.48 0.768l192 192a32 32 0 0 1-0.832 46.08l-480 448A32 32 0 0 1 352 768h-192a32 32 0 0 1-32-32v-192z m64 13.888V704h147.392l446.528-416.768-146.688-146.752L192 557.888zM64 928v-64h896v64H64z"
+    fill="#000000" p-id="9355" fill-opacity="0.9"></path>
+</svg>

+ 3 - 0
src/assets/icon/appStore/praise_active.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M10 6H13.2192C13.8698 6 14.3472 6.61139 14.1894 7.24254L12.6894 13.2425C12.5781 13.6877 12.1781 14 11.7192 14H3C2.44772 14 2 13.5523 2 13V8C2 7.44772 2.44772 7 3 7H5L7 2H9C9.55228 2 10 2.44772 10 3V6ZM6 7H9V13H6Z" fill="#FFD324" fill-rule="nonzero"/>
+</svg>

+ 3 - 0
src/assets/icon/appStore/praise_default.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10 6H13.2192C13.8698 6 14.3472 6.61139 14.1894 7.24254L12.6894 13.2425C12.5781 13.6877 12.1781 14 11.7192 14H3C2.44772 14 2 13.5523 2 13V8C2 7.44772 2.44772 7 3 7H5L7 2H9C9.55228 2 10 2.44772 10 3V6ZM6 7.19258V13H11.7192L13.2192 7H9V3H7.67703L6 7.19258ZM5 8H3V13H5V8Z" fill="black" fill-opacity="0.6"/>
+</svg>

Datei-Diff unterdrückt, da er zu groß ist
+ 1 - 0
src/assets/icon/appStore/user_copy.svg


+ 4 - 0
src/assets/icon/appStore/workflow.svg

@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5 2.5C5 2.22386 5.22386 2 5.5 2H13.5C13.7761 2 14 2.22386 14 2.5V4.5C14 4.77614 13.7761 5 13.5 5H5.5C5.22386 5 5 4.77614 5 4.5V4H3V7H5.5C5.77614 7 6 7.22386 6 7.5C6 7.77614 5.77614 8 5.5 8H2.5C2.22386 8 2 7.77614 2 7.5V3.5C2 3.22386 2.22386 3 2.5 3H5V2.5ZM6 4H13V3H6V4ZM10 8.5C10 8.22386 10.2239 8 10.5 8H13.5C13.7761 8 14 8.22386 14 8.5V12.5C14 12.7761 13.7761 13 13.5 13H11V13.5C11 13.7761 10.7761 14 10.5 14H4.5C4.22386 14 4 13.7761 4 13.5V11.5C4 11.2239 4.22386 11 4.5 11H10.5C10.7761 11 11 11.2239 11 11.5V12H13V9H10.5C10.2239 9 10 8.77614 10 8.5ZM10 12H5V13H10V12Z" fill="black" fill-opacity="0.4"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.3 6.1C7.14849 5.98637 6.94579 5.96809 6.77639 6.05279C6.607 6.13749 6.5 6.31062 6.5 6.5V9.5C6.5 9.68939 6.607 9.86252 6.77639 9.94722C6.94579 10.0319 7.14849 10.0136 7.3 9.9L9.3 8.4C9.4259 8.30558 9.5 8.15738 9.5 8C9.5 7.84262 9.4259 7.69443 9.3 7.6L7.3 6.1Z" fill="#0354D7"/>
+</svg>

+ 1 - 0
src/assets/icon/course/save.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1733971271920" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11411" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><path d="M349.090909 372.363636V46.545455h349.090909v325.818181H349.090909zM823.319273 46.545455A131.002182 131.002182 0 0 1 954.181818 177.408v692.456727A131.002182 131.002182 0 0 1 823.319273 1000.727273H223.953455A131.025455 131.025455 0 0 1 93.090909 869.864727V177.408A131.025455 131.025455 0 0 1 223.953455 46.545455H279.272727v360.727272a34.909091 34.909091 0 0 0 34.909091 34.909091h418.909091a34.909091 34.909091 0 0 0 34.909091-34.909091V46.545455h55.319273zM593.454545 314.181818a46.545455 46.545455 0 1 0-0.023272-93.114182A46.545455 46.545455 0 0 0 593.454545 314.181818z" fill="#8a8a8a" p-id="11412"></path></svg>

Datei-Diff unterdrückt, da er zu groß ist
+ 530 - 251
src/components/pages/aiAddCourse/addCourse.vue


+ 60 - 2
src/components/pages/aiAddCourse/aiBoxRight.vue

@@ -51,6 +51,12 @@
               src="../../../assets/icon/course/pasete.png"
               @click="onCopy(item.aiContent)"
             />
+            <el-tooltip content="点击可将该内容以docx文件保存至附录栏" placement="top" effect="dark">
+              <img
+              src="../../../assets/icon/course/save.svg"
+              @click="onSave(item.aiContent, item)"
+            />
+            </el-tooltip>
           </div>
           <div class="ai_tips_btn_box" v-if="item.promptArray && item.promptArray.length">
             <span v-for="(pr, pindex) in item.promptArray" :key="pindex" @click="quickAdd(item.addedData, pr)">{{ pr.name }}</span>
@@ -640,7 +646,7 @@ export default {
               return JSON.stringify(oldItem) === JSON.stringify(item);
             });
           });
-          if (addedData[0].string.includes('aiDetail') || 
+        if ((addedData[0].string.includes('aiDetail') && !addedData[0].string.includes('aiDetail2') && !addedData[0].string.includes('aiDetail3')) || 
               addedData[0].string.includes('aitargetTextDetail2') || 
               addedData[0].string.includes('aiDetail1') || 
               addedData[0].string.includes('teacherDetail2')) {
@@ -1794,6 +1800,52 @@ ${message}`;
         type: "success"
       });
     },
+    onSave(content, item) {
+      this.$emit('addCourseBehavior', 'courseBehavior', '点击对话框-保存信息成附件')
+
+      var str = content
+      str = str.replace(/<xml>[\s\S]*?<\/xml>/ig, '')
+      str = str.replace(/<style>[\s\S]*?<\/style>/ig, '')
+      str = str.replace(/<\/?[^>]*>/g, '')
+      str = str.replace(/[ | ]*\n/g, '\n')
+      str = str.replace(/&nbsp;/ig, '')
+      item.loading = true
+      let params = JSON.stringify({
+        // model: "gpt-3.5-turbo",
+        model: "gpt-4o-2024-11-20",
+        // model: "qwen-plus",
+        temperature: 0,
+        max_tokens: 4096,
+        top_p: 1,
+        frequency_penalty: 0,
+        presence_penalty: 0,
+        messages: [
+          {
+            role: "user",
+            content: `帮一下内容想一个名字命名作为word文档的名字,仅输出字符串即可 内容:${str}`
+          }
+        ],
+        stream: false,
+        uid: this.userid,
+        mind_map_question: ""
+      });
+
+      this.ajax.post("https://gpt4.cocorobo.cn/chat", params).then(response => {
+        let data = response.data.FunctionResponse
+        if (data.choices && data.choices.length && data.choices[0].message) {
+          // 处理成功的情况
+          let ss = data.choices[0].message.content.replace(/^[‘“"']|[’”"']$/g, '');
+          this.$emit("addChatAppendixFile", ss, content)
+        }else{
+          this.$message.error('保存失败')
+        }
+        item.loading = false
+      }).catch(e => {
+        item.loading = false
+        this.$message.error('保存失败')
+        console.log(e);
+      });
+    },
     stopSend() {
       if (this.fasource) {
         this.fasource.close();
@@ -2336,7 +2388,7 @@ ${message}`;
   word-break: break-word;
   box-sizing: border-box;
   /* white-space: pre-line; */
-  max-width: calc(100% - 85px);
+  max-width: calc(100% - 100px);
   background: #f6f9ff;
   /* overflow: hidden; */
   margin: 0 10px;
@@ -2577,6 +2629,8 @@ ${message}`;
 .ai_btn_box {
   min-width: fit-content;
   margin-top: auto;
+  display: flex;
+  align-items: center;
 }
 
 .ai_btn_box > img {
@@ -2584,6 +2638,10 @@ ${message}`;
   width: 15px;
 }
 
+.ai_btn_box > img + img{
+  margin-left: 5px;
+}
+
 .ai_tips_btn_box{
   width: 100%;
   padding: 0 20px 0 50px;

+ 68 - 8
src/components/pages/aiEasy/addCourse.vue

@@ -2341,7 +2341,7 @@
                 ? istemplate == 1 ? 'auto' : 'auto'
                 : istemplate == 1 ? 'auto' : 'auto',
           }">
-            <div class="rb_c_box">
+            <div class="rb_c_box" v-loading="unitLoading">
               <div class="rb_c_box_left" v-if="(steps == 3 || istemplate == 1)" :style="{width: stepShow ? '270px' : '0',minWidth: stepShow ? '270px' : '0',height: stepShow ? '100%' : '0',marginRight: stepShow ? '10px' : '0'}">
                 <div class="rb_c_box_left stepsBottom2" :style="{width: stepShow ? '270px' : '0',minWidth: stepShow ? '270px' : '0',height: stepShow ? 'calc(100% - 120px)' : '0',marginRight: stepShow ? '0' : '0'}">
                   <div></div>
@@ -3555,6 +3555,8 @@
                                     @contextmenu.prevent="openAiDialog(1, 'aiTaskG2', itemTaskIndex)"
                                     @click="openAiDialog(2, 'aiTaskG2', itemTaskIndex)">{{ panDanTool(itemTask) > 0 ? '重新生成工具' : '生成工具' }}</div>
                                 </el-tooltip>
+                                <div class="r_pub_button_op" style="margin-left:10px;" @click="allEvaCan2(itemTaskIndex)"  v-if="panDanTool(itemTask) > 0">{{ panDanToolEva(itemTask) > 0 ?
+                                    '重新生成工具评价' : '生成工具评价' }}</div>
                               </div>
                               <!-- <div class="line" style="width: 90%"></div> -->
                             </div>
@@ -7550,6 +7552,7 @@ export default {
       anLoading: [],
       heightPx: '100%',
       newWidth: 350,
+      unitLoading: false
     };
   },
   directives: {
@@ -7820,6 +7823,18 @@ export default {
         return count;
       };
     },
+    panDanToolEva(){
+      return function (array) {
+        let count = 0;
+        let tool = array.toolChoose
+        for(var k = 0; k < tool.length; k++){
+          if(tool[k].eList && tool[k].eList.length){
+            count++
+          }
+        }
+        return count;
+      };
+    },
     panTool(){
       return function () {
         let count = 0;
@@ -7902,7 +7917,7 @@ export default {
             delete this.unitJson[i].isUpdate;
           }
         }
-        this.$refs.rightboxR.scrollTop = 0;
+        // this.$refs.rightboxR.scrollTop = 0;
         this.addindex = -1;
         let params = [
           {
@@ -8682,6 +8697,7 @@ export default {
             setTimeout(() => {
               this.loading = false
               this.steps = 3;
+              this.openAiDialog(2, 'aiTask3','all', '');
             }, 0)
             this.isClickColor = 1;
             this.unitJson[
@@ -8738,7 +8754,7 @@ export default {
                     }
                   }
                   if (this.cid) {
-                    this.loading = true
+                    // this.loading = true
                     functionA()
                     this.addCourseBehavior('courseBehavior2', `点击学历案-下一步按钮`)
                   } else {
@@ -8759,9 +8775,11 @@ export default {
             return;
           }
           if (this.cid && this.panTask() > 0) {
-            this.loading = true
+            // this.loading = true
             functionA()
           } else {
+            this.steps = 3;
+
             // if(ttype == 2){
             this.openAiDialog(clickType, "aiTaskName", functionA)
             // }else {
@@ -8900,7 +8918,7 @@ export default {
       //     }
       //   }
       // }
-      this.$refs.stepBox.scrollTop = 0;
+      // this.$refs.stepBox.scrollTop = 0;
     },
     unitSet(i) {
       if (this.unitIndex == i) {
@@ -17147,6 +17165,48 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
         this.setTipsIndex()
       }, 500)
     },
+    allEvaCan2(index) {
+      if (this.taskLoading.length) {
+        let _pan = 1
+        for (var k = 0; k < this.taskLoading.length; k++) {
+          if (this.taskLoading[k]) {
+            this.$message({
+              message: `请等待任务${k + 1}回答完毕后再继续`,
+              type: "warning"
+            });
+            _pan = 2
+          }
+        }
+        if (_pan == 2) {
+          return
+        }
+      }
+      if (this.taskGLoading.length) {
+        let _pan = 1
+        for (var k = 0; k < this.taskGLoading.length; k++) {
+          if (this.taskGLoading[k] && (this.taskGLoading[k][0] || this.taskGLoading[k][1] || this.taskGLoading[k][2])) {
+            this.$message({
+              message: `请等待任务${k + 1}回答完毕后再继续`,
+              type: "warning"
+            });
+            _pan = 2
+          }
+        }
+        if (_pan == 2) {
+          return
+        }
+      }
+      let taskJson = this.unitJson[0].chapterInfo[0].taskJson
+      for (var j = 0; j < taskJson[index].toolChoose.length; j++) {
+        if (this.panTaskElist() == 0 && this.pjIndex.indexOf(taskJson[index].toolChoose[j].tool[0]) != -1) {
+          this.$refs['evalist' + index + j][0].openAiDialog('elist');
+        }
+      }
+      this.$message({
+        message: `执行成功`,
+        type: "success"
+      });
+    },
     setAiJson(pan,string,string2,string3){
       if(pan == 'aiTeacher2'){
         this.aiJson['teacherDetail2'] = string
@@ -18554,7 +18614,7 @@ ${msg}
 
 # Format example
 [{"task":"活动名/任务名/环节名","taskDetail":"活动描述/任务描述/环节描述"},{"task":"活动名/任务名/环节名","taskDetail":"活动描述/任务描述/环节描述"},{"task":"活动名/任务名/环节名","taskDetail":"活动描述/任务描述/环节描述"},{"task":"活动名/任务名/环节名","taskDetail":"活动描述/任务描述/环节描述"}]`
-        this.loading = true
+        this.unitLoading = true
         this.aiGetTaskName(message, this.aiCallBack)
       } else if (this.aitype == "aiDetail1") {
         this.aiDetail(msg, this.aiIndex)
@@ -20401,10 +20461,10 @@ ${this.courseText && this.aiCallBack[0] == 2 ? '注意,优化原有的<参考
           }
           
           callback ? callback() : ''
-          _this.loading = false
+          _this.unitLoading = false
         })
         .catch((error) => {
-          _this.loading = false
+          _this.unitLoading = false
           console.log(error);
         });
     },

+ 1 - 1
src/components/pages/aiEasy/aiBoxRight.vue

@@ -654,7 +654,7 @@ export default {
               return JSON.stringify(oldItem) === JSON.stringify(item);
             });
           });
-          if (addedData[0].string.includes('aiDetail') || 
+          if ((addedData[0].string.includes('aiDetail') && !addedData[0].string.includes('aiDetail2') && !addedData[0].string.includes('aiDetail3')) || 
               addedData[0].string.includes('aitargetTextDetail2') || 
               addedData[0].string.includes('aiDetail1') || 
               addedData[0].string.includes('teacherDetail2')) {

+ 7 - 2
src/components/pages/appStore/dialog/saveCard.vue → src/components/pages/appStore/components/saveCard.vue

@@ -54,7 +54,11 @@ export default {
     data: {
       type: Array,
       default: () => []
-    }
+    },
+		type:{
+			type:Number,
+			default:0
+		},
   },
   data() {
     return {};
@@ -80,7 +84,8 @@ export default {
   },
 	methods: {
 		openAppUrl(item){
-			window.open(item.url, "_blank");
+			this.$emit("saveClick",item,this.type)
+			// window.open(item.url, "_blank");
 		}
 	},
 };

+ 46 - 8
src/components/pages/appStore/dialog/addAppDialog.vue

@@ -24,7 +24,7 @@
             <el-form-item label="应用图标" prop="icon">
               <el-input
                 v-model="form.json.icon"
-                placeholder="请输入应用图标(可直接粘贴svg或者点击右侧图标上传图片)"
+                placeholder="请输入应用图标(可直接粘贴链接或者点击右侧图标上传图片)"
                 style="width: 500px;"
               ></el-input>
             </el-form-item>
@@ -81,11 +81,24 @@
             style="display: flex;width: 100%;justify-content: space-between;"
           >
             <el-form-item label="应用标签" prop="label">
-              <el-input
+              <!-- <el-input
                 v-model="form.label"
                 placeholder="请输入应用标签"
                 style="width: 300px;"
-              ></el-input>
+              ></el-input> -->
+              <el-select
+                v-model="form.label"
+                placeholder="请选择应用标签"
+                style="width: 300px;"
+              >
+                <el-option
+                  v-for="item in selectLabelList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
             </el-form-item>
             <el-form-item label="应用类型" prop="type">
               <el-select
@@ -130,6 +143,16 @@
             </el-radio-group>
           </el-form-item>
 
+          <el-form-item
+            label="应用状态"
+            style="display: flex;flex-direction: column;align-items: flex-start;"
+          >
+            <el-radio-group v-model="form.json.status">
+              <el-radio label="1">测试</el-radio>
+              <el-radio label="2">稳定</el-radio>
+            </el-radio-group>
+          </el-form-item>
+
 
 					<el-form-item label="权限设置"  style="display: flex;flex-direction: column;align-items: flex-start;">
 						<el-radio-group v-model="form.json.copy" style="display: flex;flex-direction: column;">
@@ -176,6 +199,10 @@ export default {
       show: false,
       uploadIconLoading: false,
       type: 1, //1添加,2编辑
+      selectLabelList:[
+        {value:"agent",label:"智能体"},
+        {value:"workflow",label:"工作流"},
+      ],
       form: {
         name: "",
         label: "",
@@ -186,7 +213,9 @@ export default {
         stand: "cn",
         json: {
           icon: "",
-          copy: "0"
+          copy: "0",
+          status:"",
+          model:""
         }
       },
       rules: {
@@ -237,7 +266,11 @@ export default {
 					data.form.json.copy = "0"
 				}
 
-        this.form = data.form;
+        if(!data.form.json.status){
+					data.form.json.status = ""
+				}
+
+        this.form = JSON.parse(JSON.stringify(data.form));
         this.type = data.type;
       } else {
         this.form = {
@@ -250,7 +283,9 @@ export default {
           stand: "cn",
           json: {
             icon: "",
-            copy: "0"
+            copy: "0",
+            status:"",
+            model:""
           }
         };
       }
@@ -297,7 +332,9 @@ export default {
         stand: "cn",
         json: {
           icon: "",
-          copy: "0"
+          copy: "0",
+          status:"",
+          model:""
         }
       };
       this.loading = false;
@@ -367,7 +404,7 @@ export default {
 .addNewAppDialog >>> .el-dialog {
   min-width: 700px;
 
-  height: 900px;
+  height: 1020px;
 	/* height: 780px; */
   box-shadow: 0px 0 8px 0px #555555;
   border-radius: 8px;
@@ -383,6 +420,7 @@ export default {
   box-sizing: border-box;
   padding-bottom: 50px;
   padding-top: 10px;
+  overflow: auto;
 }
 .addNewAppDialog >>> .el-dialog__header {
   display: none !important;

+ 292 - 0
src/components/pages/appStore/dialog/releaseAppDialog.vue

@@ -0,0 +1,292 @@
+<template>
+  <div>
+    <el-dialog
+      :center="true"
+      :visible.sync="show"
+      :close-on-click-modal="false"
+      width="500px"
+      class="releaseAppDialog"
+    >
+      <div class="a-d-top">
+        <div class="a-d-topTit">
+          <div>发布应用</div>
+        </div>
+        <div class="a-d-t-right">
+          <span @click="close()">×</span>
+        </div>
+      </div>
+      <div class="bfd_box" v-loading="loading" label-position="top">
+        <el-form :model="form" :rules="rules" ref="ruleForm">
+
+          <el-form-item
+            label="选择模式"
+            style="display: flex;flex-direction: column;align-items: flex-start;"
+          >
+            <el-radio-group v-model="form.json.model">
+              <el-radio label="1">对话式</el-radio>
+              <el-radio label="2">卡片式</el-radio>
+              <el-radio label="3">沉浸式</el-radio>
+            </el-radio-group>
+          </el-form-item>
+
+          <el-form-item
+            label="可见范围"
+            style="display: flex;flex-direction: column;align-items: flex-start;"
+          >
+            <el-radio-group v-model="form.juri">
+              <el-radio label="3">所有人可见</el-radio>
+              <el-radio label="2">组织内可见</el-radio>
+              <el-radio label="1">仅自己可见</el-radio>
+            </el-radio-group>
+          </el-form-item>
+
+
+					<el-form-item label="权限设置"  style="display: flex;flex-direction: column;align-items: flex-start;">
+						<el-radio-group v-model="form.json.copy" style="display: flex;flex-direction: column;">
+              <el-radio label="0" class="radioItem">仅体验(用户仅能使用,不可查看设置内容)</el-radio>
+              <el-radio label="1" class="radioItem">允许其他用户复制并进行二次创作</el-radio>
+            </el-radio-group>
+          </el-form-item>
+
+          <div
+            style="display: flex;width: 100%;justify-content: space-between;align-items: center;"
+          >
+            <el-form-item label="应用分类" prop="type">
+              <el-select
+                v-model="form.type"
+                placeholder="请选择应用类型"
+                style="width: 300px;"
+              >
+                <el-option
+                  v-for="item in typeList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </div>
+        </el-form>
+      </div>
+      <div class="bfd_bottom">
+        <el-button @click="close()">取消</el-button>
+        <el-button type="primary" @click="submitBtn('ruleForm')"
+          >确认发布</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+let validUrl = (rule, value, callback) => {
+  if (value) {
+    // 验证链接是否有效
+    try {
+      new URL(value);
+      callback();
+    } catch (error) {
+      return callback(new Error("请输入有效的链接"));
+    }
+  }
+};
+export default {
+  props: {
+    typeList: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      show: false,
+      form: {
+        name: "",
+        label: "",
+        detail: "",
+        url: "",
+        type: "",
+        juri: "1",
+        stand: "cn",
+        json: {
+          icon: "",
+          copy: "0"
+        }
+      },
+      rules: {
+
+        juri: [{ required: true, message: "请选择权限管理", trigger: "blur" }],
+        url: [
+          { required: true, message: "请输入应用链接", trigger: "blur" },
+          { validator: validUrl, trigger: "blur" }
+        ]
+      }
+    };
+  },
+  methods: {
+    open(data) {
+      if (!data.form.json) {
+        data.form.json = { icon: "", copy: "0" };
+      }
+			if(!data.form.json.icon){
+				data.form.json.icon = ""
+			}
+			if(!data.form.json.copy){
+				data.form.json.copy = "0"
+			}
+      if(!data.form.json.model){
+        data.form.json.model = "1"
+      }
+
+      data.form.juri = '3'
+      this.form = data.form;
+      this.loading = false;
+      this.show = true;
+    },
+    close() {
+      this.show = false;
+      this.init();
+    },
+    init() {
+      this.form = {
+        name: "",
+        label: "",
+        detail: "",
+        url: "",
+        type: "",
+        juri: "1",
+        stand: "cn",
+        json: {
+          icon: "",
+          copy: "0"
+        }
+      };
+      this.loading = false;
+    },
+    submitBtn(ref) {
+      if (this.loading) return this.$message.info("请稍等...");
+      this.$refs[ref].validate(valid => {
+        if (valid) {
+          this.$emit("success", this.form);
+        }
+      });
+    },
+  }
+};
+</script>
+
+<style scoped>
+.releaseAppDialog >>> .el-dialog {
+  min-width: 700px;
+
+  height: 550px;
+	/* height: 780px; */
+  box-shadow: 0px 0 8px 0px #555555;
+  border-radius: 8px;
+  background-color: #fff;
+  /* top: 0px; */
+  /* margin: 0 auto; */
+  overflow: hidden;
+}
+.releaseAppDialog >>> .el-dialog__body {
+  height: 100%;
+  min-width: 550px;
+  flex-shrink: 0;
+  box-sizing: border-box;
+  padding-bottom: 50px;
+  padding-top: 10px;
+}
+.releaseAppDialog >>> .el-dialog__header {
+  display: none !important;
+}
+
+.a-d-top {
+  /* background: #adadad; */
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: space-between;
+  height: 54px;
+  border-radius: 8px 8px 0 0;
+  user-select: none;
+  border-bottom: 1px #ccc solid;
+}
+.a-d-top >>> .el-input__inner {
+  width: 320px;
+  height: 32px;
+}
+.a-d-top >>> .el-input__icon {
+  line-height: 32px;
+}
+
+.a-d-topTit {
+  /* width: 171px; */
+  /* margin-left: 20px; */
+  height: 32px;
+  display: flex;
+  font-weight: bold;
+  font-size: 20px;
+  align-items: center;
+  font-family: PingFang SC;
+  box-sizing: border-box;
+  padding: 5px;
+  line-height: 22px;
+  justify-content: center;
+  /* text-align: left; */
+}
+
+.a-d-t-right > span {
+  font-size: 18px;
+  font-weight: bold;
+  cursor: pointer;
+}
+
+.bfd_bottom {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.bfd_icon {
+  width: 70px;
+  height: 70px;
+  box-sizing: border-box;
+  padding: 5px;
+  margin-right: 40px;
+  cursor: pointer;
+}
+
+.bfd_icon > svg {
+  width: 100%;
+  height: 100%;
+}
+
+.bfd_icon > span {
+  width: 100%;
+  height: 100%;
+
+  display: block;
+}
+
+.bfd_icon > span >>> svg {
+  width: 100%;
+  height: 100%;
+}
+
+.switchForm{
+	display: flex;
+	align-items: center;
+}
+
+.switchForm>span{
+	margin-left: 10px;
+}
+
+.radioItem{
+	margin-bottom: 10px;
+}
+</style>

+ 307 - 0
src/components/pages/appStore/dialog/selectAppDialog.vue

@@ -0,0 +1,307 @@
+<template>
+  <div>
+    <el-dialog
+      :center="true"
+      :visible.sync="show"
+      :close-on-click-modal="false"
+      width="500px"
+      class="addNewAppDialog"
+    >
+      <div class="a-d-top">
+        <div class="a-d-topTit">
+          <div>选择应用</div>
+        </div>
+        <div class="a-d-t-right">
+          <span @click="close()">×</span>
+        </div>
+      </div>
+      <div class="box" v-loading="loading">
+        <div class="b_search">
+          <el-input
+              v-model="search"
+              style="margin-right: 10px;"
+              placeholder="请输入应用名称"
+              @keyup.enter.native="getData"
+              clearable
+            />
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              @click="getData"
+            ></el-button>
+        </div>
+
+        <div class="b_list">
+          <div class="b_l_item" v-for="item in dataList" :key="item.id" @click="choseItem(item)">
+            <div class="b_l_i_icon">
+              <img v-if="item.json.icon" :src="item.json.icon" />
+              <svg
+                v-else
+                t="1732605901531"
+                class="icon"
+                viewBox="0 0 1024 1024"
+                version="1.1"
+                xmlns="http://www.w3.org/2000/svg"
+                p-id="4275"
+                width="200"
+                height="200"
+              >
+                <path
+                  d="M179.2 153.6a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V204.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V204.8a153.6 153.6 0 0 1 153.6-153.6z m0 614.4a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V716.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V716.8a153.6 153.6 0 0 1 153.6-153.6z m611.84-403.4048a51.2 51.2 0 0 0-72.3968 0L646.144 232.2432a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968L791.04 159.744z m72.3968-72.3968l72.3968 72.3968a153.6 153.6 0 0 1 0 217.2416l-72.3968 72.3968a153.6 153.6 0 0 1-217.2416 0l-72.3968-72.3968a153.6 153.6 0 0 1 0-217.2416l72.3968-72.3968a153.6 153.6 0 0 1 217.2416 0zM699.7504 896a51.2 51.2 0 0 1 0 102.4A162.1504 162.1504 0 0 1 537.6 836.2496v-110.8992A162.1504 162.1504 0 0 1 699.7504 563.2h110.8992a162.1504 162.1504 0 0 1 162.1504 162.1504v8.448a51.2 51.2 0 0 1-102.4 0v-8.448c0-33.024-26.7264-59.7504-59.7504-59.7504h-110.8992c-33.024 0-59.7504 26.7264-59.7504 59.7504v110.8992c0 33.024 26.7264 59.7504 59.7504 59.7504z"
+                  fill="#2C6DD2"
+                  p-id="4276"
+                ></path>
+                <path
+                  d="M791.4496 160a51.2 51.2 0 0 0-72.3968 0l-72.448 72.3968a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968l-72.3968-72.3968z"
+                  fill="#20C997"
+                  p-id="4277"
+                ></path>
+              </svg>
+            </div>
+            <div class="b_l_i_message">
+              <div>{{ item.name }}</div>
+              <span>{{ item.detail }}</span>
+            </div>
+          </div>
+        </div>
+
+      </div>
+      <div class="box_bottom">
+        <el-button @click="close()">取消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+
+  },
+  data() {
+    return {
+      loading: false,
+      show: false,
+      search:'',
+      userId: this.$route.query["userid"],
+      org: this.$route.query["org"],
+      oid: this.$route.query["oid"],
+      dataList:[],
+    };
+  },
+  methods: {
+    open() {
+      this.dataList = [];
+      this.search = ""
+      this.loading = false;
+      this.getData();
+      this.show = true;
+    },
+    close(flag = false) {
+      this.show = false;
+      this.init();
+    },
+    init() {
+      this.search = ""
+      this.loading = false;
+      this.dataList = [];
+    },
+    getData() {
+      this.loading = true;
+      let params = {
+        uid: this.userId, //用户ID
+        name: this.search, //应用名称搜索
+        label: "", //应用的标签搜索
+        type: "", //应用的类型
+        juri: 99, //应用权限 1:我的  2:组织内  3:所有人   99:未发布
+        stand: "cn" //cn站还是hk站
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "select_appStore", params)
+        .then(res => {
+          let _data = res.data[0];
+          if (_data.length > 0) {
+            _data.forEach(i => {
+              if (i.json) {
+                i.json = JSON.parse(i.json);
+              }
+            });
+            this.dataList = _data;
+          } else {
+            this.dataList = [];
+          }
+          this.loading = false;
+        })
+        .catch(err => {
+          this.loading = false;
+          console.log(err);
+          this.$message.error("获取应用失败");
+        });
+    },
+    choseItem(item){
+      this.$emit("success",item)
+    }
+  }
+};
+</script>
+
+<style scoped>
+.addNewAppDialog >>> .el-dialog {
+  min-width: 500px;
+
+  height: 700px;
+	/* height: 780px; */
+  box-shadow: 0px 0 8px 0px #555555;
+  border-radius: 8px;
+  background-color: #fff;
+  /* top: 0px; */
+  /* margin: 0 auto; */
+  overflow: hidden;
+}
+.addNewAppDialog >>> .el-dialog__body {
+  height: 100%;
+  min-width: 500px;
+  flex-shrink: 0;
+  box-sizing: border-box;
+  padding-bottom: 50px;
+  padding-top: 10px;
+}
+.addNewAppDialog >>> .el-dialog__header {
+  display: none !important;
+}
+
+.a-d-top {
+  /* background: #adadad; */
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: space-between;
+  height: 54px;
+  border-radius: 8px 8px 0 0;
+  user-select: none;
+  border-bottom: 1px #ccc solid;
+}
+.a-d-top >>> .el-input__inner {
+  width: 320px;
+  height: 32px;
+}
+.a-d-top >>> .el-input__icon {
+  line-height: 32px;
+}
+
+.a-d-topTit {
+  /* width: 171px; */
+  /* margin-left: 20px; */
+  height: 32px;
+  display: flex;
+  font-weight: bold;
+  font-size: 20px;
+  align-items: center;
+  font-family: PingFang SC;
+  box-sizing: border-box;
+  padding: 5px;
+  line-height: 22px;
+  justify-content: center;
+  /* text-align: left; */
+}
+
+.a-d-t-right > span {
+  font-size: 18px;
+  font-weight: bold;
+  cursor: pointer;
+}
+
+.box{
+  width: 100%;
+  height: calc(100% - 60px - 20px);
+  display: flex;
+  flex-direction: column;
+}
+
+.box_bottom{
+  width: 100%;
+  height: 60px;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+}
+
+.b_search{
+  display: flex;
+  height: 40px;
+  margin-top: 10px;
+}
+
+.b_list{
+  width: 100%;
+  height: calc(100% - 40px);
+  overflow: auto;
+  box-sizing: border-box;
+  padding: 10px 0 10px 0;
+}
+
+.b_l_item{
+  width: 100%;
+  height: 100px;
+  display: flex;
+  align-items: center;
+  margin-bottom: 10px;
+  background-color: #fff;
+  transition: .2s;
+  border-radius: 4px;
+  cursor: pointer;
+}
+
+.b_l_item:hover{
+  background-color: #f2f4f7;
+}
+
+.b_l_item:hover .b_l_i_message>div{
+  color: #0354D7;
+}
+
+.b_l_i_icon{
+  width: 80px;
+  height: 80px;
+  margin-left: 10px;
+  box-sizing: border-box;
+  padding: 5px;
+  margin-right: 10px;
+}
+
+.b_l_i_icon>img{
+  width: 100%;
+  height: 100%;
+}
+
+.b_l_i_icon>svg{
+  width: 100%;
+  height: 100%;
+}
+
+.b_l_i_message{
+  width: calc(100% - 100px);
+  height: 80px;
+  box-sizing: border-box;
+  padding: 10px 0;
+}
+
+.b_l_i_message>div{
+  transition: .2s;
+  font-size: 1.4em;
+  color: #000;
+  /* font-weight: bold; */
+}
+
+.b_l_i_message>span{
+  font-size: 1.2em;
+  margin-top: 15px;
+  display: block;
+  max-width: 100%;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+</style>

Datei-Diff unterdrückt, da er zu groß ist
+ 707 - 204
src/components/pages/appStore/views/appManagement.vue


+ 556 - 38
src/components/pages/appStore/views/workSpace.vue

@@ -1,29 +1,312 @@
 <template>
   <div class="workSpace">
-    <div class="ac_header">
-      <div class="ac_h_top">
-        <span @click="changeShowPage(0)">应用管理</span>
-				<span class="ac_h_t_active">工作空间</span>
-      </div>
+    <div class="ac_left">
+      <saveCard
+        title="最近使用"
+        :data="recentUse"
+        :type="0"
+        @saveClick="openApp"
+      />
+      <saveCard title="收藏" :data="collect" :type="1" @saveClick="openApp" />
     </div>
-		<div class="ac_content">
+    <div class="ac_right">
+      <div class="ac_header">
+        <div class="ac_h_top">
+          <span @click="changeShowPage(0)">
+            <svg
+              width="20"
+              height="20"
+              viewBox="0 0 20 20"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <path
+                d="M14.0625 2.1875C11.9914 2.1875 10.3125 3.86643 10.3125 5.9375C10.3125 8.00857 11.9914 9.6875 14.0625 9.6875C16.1336 9.6875 17.8125 8.00857 17.8125 5.9375C17.8125 3.86643 16.1336 2.1875 14.0625 2.1875ZM11.5625 5.9375C11.5625 4.55679 12.6818 3.4375 14.0625 3.4375C15.4432 3.4375 16.5625 4.55679 16.5625 5.9375C16.5625 7.31821 15.4432 8.4375 14.0625 8.4375C12.6818 8.4375 11.5625 7.31821 11.5625 5.9375Z"
+              />
+              <path
+                d="M2.5 3.75C2.5 3.05964 3.05964 2.5 3.75 2.5H8.125C8.81536 2.5 9.375 3.05964 9.375 3.75V8.125C9.375 8.81536 8.81536 9.375 8.125 9.375H3.75C3.05964 9.375 2.5 8.81536 2.5 8.125V3.75ZM3.75 3.75V8.125H8.125V3.75H3.75Z"
+              />
+              <path
+                d="M2.5 11.875C2.5 11.1846 3.05964 10.625 3.75 10.625H8.125C8.81536 10.625 9.375 11.1846 9.375 11.875V16.25C9.375 16.9404 8.81536 17.5 8.125 17.5H3.75C3.05964 17.5 2.5 16.9404 2.5 16.25V11.875ZM3.75 11.875V16.25H8.125V11.875H3.75Z"
+              />
+              <path
+                d="M10.625 11.875C10.625 11.1846 11.1846 10.625 11.875 10.625H16.25C16.9404 10.625 17.5 11.1846 17.5 11.875V16.25C17.5 16.9404 16.9404 17.5 16.25 17.5H11.875C11.1846 17.5 10.625 16.9404 10.625 16.25V11.875ZM11.875 16.25H16.25V11.875H11.875V16.25Z"
+              />
+            </svg>
+            应用管理</span
+          >
+          <span class="ac_h_t_active">
+            <svg
+              width="20"
+              height="20"
+              viewBox="0 0 20 20"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <rect width="20" height="20" fill="white" />
+              <path
+                fill-rule="evenodd"
+                clip-rule="evenodd"
+                d="M9.70072 1.32632C9.88727 1.22456 10.1127 1.22456 10.2993 1.32632L17.1743 5.07632C17.3751 5.18584 17.5 5.39628 17.5 5.625V14.375C17.5 14.6037 17.3751 14.8142 17.1743 14.9237L10.2993 18.6737C10.1127 18.7754 9.88727 18.7754 9.70072 18.6737L2.82572 14.9237C2.62493 14.8142 2.5 14.6037 2.5 14.375V5.625C2.5 5.39628 2.62493 5.18584 2.82572 5.07632L9.70072 1.32632ZM3.75 6.79282V14.004L9.375 17.0722V14.1039L6.55344 12.4109C6.36519 12.298 6.25 12.0945 6.25 11.875V8.45949L3.75 6.79282ZM7.5 8.47887V10.7711L9.375 9.64613V7.35387L7.5 8.47887ZM10.625 7.35387V9.64613L12.5 10.7711V8.47887L10.625 7.35387ZM13.75 8.45949V11.875C13.75 12.0945 13.6348 12.298 13.4466 12.4109L10.625 14.1039V17.0722L16.25 14.004V6.79282L13.75 8.45949ZM15.668 5.67854L10 2.58693L4.33205 5.67854L6.8926 7.38557L9.67844 5.71407C9.87637 5.59531 10.1236 5.59531 10.3216 5.71407L13.1074 7.38557L15.668 5.67854ZM10 13.0211L11.9102 11.875L10 10.7289L8.08978 11.875L10 13.0211Z"
+              />
+            </svg>
+            工作空间</span
+          >
+        </div>
+				<div class="ac_h_banner" v-if="bannerObj">
+          <img
+            :src="bannerObj.poster"
+            alt="banner图"
+          />
+        </div>
+        <div class="ac_h_bottom">
+          <div class="ac_h_b_typeList">
+            <span
+              :class="{ ac_h_b_typeList_active: showType === '' }"
+              @click="changeShowType('')"
+            >
+              全部
+            </span>
+            <span
+              :class="{ ac_h_b_typeList_active: showType === '1' }"
+              @click="changeShowType('1')"
+            >
+              智能体
+            </span>
+            <span
+              :class="{ ac_h_b_typeList_active: showType === '2' }"
+              @click="changeShowType('2')"
+            >
+              工作流
+            </span>
+          </div>
+          <div class="ac_h_b_selectList">
+            <el-select
+              v-model="statusSelect"
+              placeholder="请选择"
+              @change="changeSelectType"
+              style="width: 150px;margin-right: 10px;"
+            >
+              <el-option
+                v-for="item in statusSelectList"
+                :key="item.index"
+                :label="item.label"
+                :value="item.index"
+              ></el-option>
+            </el-select>
+
+            <el-select
+              v-model="tagSelect"
+              placeholder="请选择"
+              @change="changeSelectType"
+              style="width: 150px;margin-right: 10px;"
+            >
+              <el-option
+                v-for="item in tagSelectList"
+                :key="item.index"
+                :label="item.label"
+                :value="item.index"
+              ></el-option>
+            </el-select>
+
+            <el-input
+              v-model="searchText"
+              style="width: 200px;"
+              placeholder="请输入名称"
+              @keyup.enter.native="getData"
+              clearable
+            />
+            <el-button
+              type="primary"
+              style="margin-left: 10px;"
+              icon="el-icon-search"
+              @click="getData"
+              clearable
+            ></el-button>
+          </div>
+        </div>
+      </div>
 
-		</div>
+      <div class="ac_content">
+        <!-- <div class="ac_c_item" v-for="item in 0">
+          <div class="ac_c_i_top">
+            <img
+              src="https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E6%B5%8B%E8%AF%951733981587859.jpg"
+              alt="封面"
+            />
+            <div>
+              <div>名称名称名称名称名称名称名称名称</div>
+              <span class="ac_c_i_t_brief">简介简介简介简介简介</span>
+              <span class="ac_c_i_t_time">2024-12-12 10:22:04 编辑</span>
+            </div>
+          </div>
+          <div class="ac_c_i_t_popover">
+            <div
+              class="ac_c_i_t_p_box"
+              v-if="editAppCard"
+              v-click-outside="handleBlur"
+            >
+              <div>编辑</div>
+              <div>收藏</div>
+              <div>复制</div>
+              <div>删除</div>
+            </div>
+
+            <svg
+              t="1732786015570"
+              @click.stop="updateCard(!editAppCard)"
+              class="icon"
+              viewBox="0 0 1024 1024"
+              version="1.1"
+              xmlns="http://www.w3.org/2000/svg"
+              p-id="9199"
+              width="200"
+              height="200"
+            >
+              <path
+                d="M192 443.733333c-38.4 0-68.266667 29.866667-68.266667 68.266667 0 38.4 29.866667 68.266667 68.266667 68.266667s68.266667-29.866667 68.266667-68.266667c0-38.4-29.866667-68.266667-68.266667-68.266667zM512 443.733333c-38.4 0-68.266667 29.866667-68.266667 68.266667 0 38.4 29.866667 68.266667 68.266667 68.266667s68.266667-29.866667 68.266667-68.266667c0-38.4-29.866667-68.266667-68.266667-68.266667zM832 443.733333c-38.4 0-68.266667 29.866667-68.266667 68.266667 0 38.4 29.866667 68.266667 68.266667 68.266667s68.266667-29.866667 68.266667-68.266667c0-38.4-34.133333-68.266667-68.266667-68.266667z"
+                fill="#111111"
+                p-id="9200"
+              ></path>
+            </svg>
+          </div>
+          <div class="ac_c_i_bottom">
+            <div>标签</div>
+            <span>工作流</span>
+          </div>
+        </div> -->
+        <div class="ac_c_empty" v-if="dataList.length === 0">
+          <span>暂无数据...</span>
+        </div>
+      </div>
+    </div>
+    <!-- <addAppDialog
+      ref="addAppDialogRef"
+      :typeList="typeList"
+      @success="addAppSuccess"
+    />-->
   </div>
 </template>
 
 <script>
+const clickOutside = {
+  bind(el, binding) {
+    // 在元素上绑定一个点击事件监听器
+    el.clickOutsideEvent = function(event) {
+      // 检查点击事件是否发生在元素的内部
+      if (!(el === event.target || el.contains(event.target))) {
+        // 如果点击事件发生在元素的外部,则触发指令绑定的方法,将点击的event数据传过去
+        binding.value(event);
+      }
+    };
+    // 在文档上添加点击事件监听器
+    document.addEventListener("click", el.clickOutsideEvent);
+  },
+  unbind(el) {
+    // 在元素上解除点击事件监听器
+    document.removeEventListener("click", el.clickOutsideEvent);
+  }
+};
+import saveCard from "../components/saveCard.vue";
 export default {
-	data(){
-		return{
-
-		}
-	},
-	methods:{
-		changeShowPage(newPage){
-			this.$emit("changeShowCard",newPage)
-		}
-	}
+  components: {
+    saveCard
+  },
+  directives: {
+    "click-outside": clickOutside // 注册自定义指令
+  },
+  data() {
+    return {
+      showType: "",
+      searchText: "",
+      statusSelect: "",
+      statusSelectList: [
+        { index: "", label: "全部状态" },
+        { index: 1, label: "未发布" },
+        { index: 2, label: "已发布" }
+      ],
+      tagSelect: "",
+      tagSelectList: [
+        { index: "", label: "全部标签" },
+        { index: 1, label: "标签1" },
+        { index: 2, label: "标签2" },
+        { index: 3, label: "标签3" },
+        { index: 4, label: "标签4" },
+        { index: 5, label: "标签5" }
+      ],
+      userId: this.$route.query["userid"],
+      org: this.$route.query["org"],
+      oid: this.$route.query["oid"],
+      getDataLoading: false,
+      dataList: [],
+      recentUse: [],
+      collect: [],
+      editAppCard: null,
+      bannerObj:null
+    };
+  },
+  computed: {},
+  methods: {
+    changeType(newIndex) {
+      let flag = this.showType === newIndex;
+      this.showType = newIndex;
+      if (!flag) {
+        this.getData();
+      }
+    },
+    changeShowType(newType) {
+      if (this.showType === newType) return;
+      this.showType = newType;
+      this.getData();
+    },
+    changeSelectType() {
+      this.getData();
+    },
+    getData() {
+      // this.$message.info("获取数据暂未开发...");
+    },
+    updateCard(newValue) {
+      // if (this.editAppCard === id) return (this.editAppCard = null);
+      this.editAppCard = newValue;
+    },
+    handleBlur() {
+      this.updateCard(null);
+    },
+    openApp(item, type = 0) {
+      console.log("👉", item);
+    },
+    resetData() {
+      this.searchText = "";
+      this.statusSelect = "";
+      this.tagSelectList = "";
+      this.showType = "";
+      this.getData();
+    },
+    changeShowPage(newPage) {
+      this.$emit("changeShowCard", newPage);
+    },
+    getBanner(){
+      let params = {
+        uid:this.userId,
+        oid:this.oid,
+        org:this.org,
+        type:4
+      }
+
+      this.ajax.get(this.$store.state.api+"select_bannerByoidORorg",params).then(res=>{
+        let _data = res.data[0];
+        if(_data[0]){
+          this.bannerObj = _data[0];
+        }else{
+          this.bannerObj = null
+        }
+      }).catch(e=>{
+        console.log("获取banner图失败")
+        console.log(e)
+      })
+    }
+  },
+  mounted() {
+    this.getBanner()
+  }
 };
 </script>
 
@@ -39,12 +322,35 @@ export default {
   display: flex;
   justify-content: space-between;
 }
+
+.ac_left {
+  width: clamp(150px,12vw,280px);
+  min-width: 150px;
+  margin-right: 20px;
+  height: 100%;
+  border-radius: 5px;
+  background-color: #fff;
+  box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+  box-sizing: border-box;
+  padding: 10px;
+  overflow: auto;
+}
+
+.ac_right {
+  flex: 1;
+  min-width: 800px;
+  height: 100%;
+  overflow-y: hidden;
+  display: flex;
+  flex-direction: column;
+}
+
 .ac_header {
   width: 100%;
   height: auto;
   border-radius: 5px;
-  background-color: #fff;
   box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+  background-color: #fff;
 }
 
 .ac_h_top {
@@ -55,41 +361,68 @@ export default {
   box-sizing: border-box;
   padding: 0 15px;
   border-bottom: 1px solid #eeeeee;
+
   position: relative;
-	padding-left: 315px;
+  justify-content: center;
 }
 
 .ac_h_top > span {
-  font-size: 26px;
-	position: relative;
-	margin-right: 25px;
-	cursor: pointer;
+  font-size: 22px;
+  position: relative;
+  margin-right: 25px;
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+}
+
+.ac_h_top > span > svg {
+  width: 22px;
+  height: 22px;
+  fill: #1a1a1a;
+  margin-right: 10px;
 }
 
-.ac_h_t_active::after{
-	content: "";
-	position: absolute;
-	width: 100%;
-	height: 3px;
-	border-radius: 4px;
-	background-color: #409EFF;
-	left: 0;
-	bottom: -5px;
+.ac_h_t_active {
+  color: #0354d7;
+}
+
+.ac_h_t_active > svg {
+  fill: #0354d7 !important;
+}
+
+.ac_h_banner {
+  width: 100%;
+  height: clamp(100px,20vh,300px);
+  border-radius: 5px;
+  overflow: hidden;
+  box-sizing: border-box;
+  padding: 10px;
+}
+
+.ac_h_banner > img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+  border-radius: 5px;
 }
 
 .ac_h_bottom {
   width: 100%;
   height: auto;
-  padding: 10px 0 20px 0;
+  padding: 10px 15px 10px 15px;
+  box-sizing: border-box;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
 }
 
 .ac_h_b_typeList {
-  width: 100%;
+  width: calc(100% - 666px);
   height: auto;
   display: flex;
   flex-wrap: wrap;
   box-sizing: border-box;
-  padding: 0 15px;
+  align-items: center;
 }
 
 .ac_h_b_typeList > span {
@@ -107,13 +440,198 @@ export default {
 .ac_h_b_selectList {
   margin-left: 15px;
   margin-bottom: 10px;
+  display: flex;
+  align-items: center;
 }
 
-.ac_content{
-	width: 100%;
+.ac_content {
+  width: 100%;
   flex: 1;
   height: auto;
-  margin-top: 20px;
+  margin-top: 10px;
   overflow: auto;
+	min-height: 200px;
+}
+
+.ac_c_item {
+  width: calc(100% / 5 - (15px * 4) / 5);
+  height: auto;
+  background-color: #fff;
+  border-radius: 10px;
+  box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+  box-sizing: border-box;
+  padding: 15px;
+  margin-right: 15px;
+  margin-bottom: 15px;
+  float: left;
+  position: relative;
+  overflow: hidden;
+  /* cursor: pointer; */
+}
+
+@media screen and (min-width: 1400px) {
+  .ac_c_item {
+    width: calc(100% / 5 - (15px * 4) / 5) !important;
+  }
+  .ac_c_item:nth-child(5n) {
+    margin-right: 0px !important;
+    /* background-color: red; */
+  }
+}
+
+@media screen and (max-width: 1380px) {
+  .ac_c_item {
+    width: calc(100% / 4 - (15px * 3) / 4) !important;
+  }
+
+  .ac_c_item:nth-child(4n) {
+    margin-right: 0px !important;
+  }
+  /* .ac_c_item:nth-child(5n) {
+    margin-right: 0 !important;
+  } */
+}
+
+@media screen and (max-width: 1080px) {
+  .ac_c_item {
+    width: calc(100% / 3 - (15px * 2) / 3) !important;
+  }
+
+  .ac_c_item:nth-child(5n) {
+    margin-right: 15px !important;
+  }
+
+  .ac_c_item:nth-of-type(4n) {
+    margin-right: 15px !important;
+  }
+
+  .ac_c_item:nth-child(3n) {
+    margin-right: 0 !important;
+  }
+}
+
+.ac_c_i_top {
+  width: 100%;
+  height: clamp(100px,10vw,180px);
+  display: flex;
+  justify-content: space-between;
+  position: relative;
+}
+
+.ac_c_i_top > img {
+  width: clamp(80px,8vw,130px);
+  height:clamp(80px,8vw,130px);
+  object-fit: cover;
+  border-radius: 10px;
+  margin: 10px 15px 10px 10px;
+}
+
+.ac_c_i_top > div {
+  box-sizing: border-box;
+  padding: 20px 0px 10px 0px;
+  flex: 1;
+  height: 100%;
+  width: calc(100% - 130px - 10px - 15px);
+}
+
+.ac_c_i_top > div > div {
+  font-size: 18px;
+  width: calc(100%);
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.ac_c_i_t_brief {
+  margin: 5px 0;
+  font-size: 1em;
+  color: #8991a1;
+  width: calc(100%);
+  height: clamp(2em,7vh,4em);
+  /* 第四行溢出显示... */
+  display: -webkit-box;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 4;
+  -webkit-box-orient: vertical;
+}
+
+.ac_c_i_t_time {
+  margin: 5px 0;
+  font-size: .9em !important;
+  color: #8991a1;
+  width: 100%;
+  height: auto;
+	white-space: nowrap;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+
+.ac_c_i_bottom {
+  width: 100%;
+  height: 30px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  box-sizing: border-box;
+  padding: 0 10px;
+}
+
+.ac_c_empty {
+  width: 100%;
+  height: 40%;
+  display: flex;
+  box-sizing: border-box;
+  padding-top: 2%;
+  justify-content: center;
+  /* align-items: center; */
+}
+
+.ac_c_i_t_popover {
+  width: 30px;
+  height: 30px;
+  position: absolute;
+  right: 10px;
+  top: 10px;
+}
+
+.ac_c_i_t_popover svg {
+  width: 30px;
+  height: 25px;
+  cursor: pointer;
+  background-color: #f2f2f2;
+  border-radius: 4px;
+}
+
+.ac_c_i_t_p_box {
+  position: absolute;
+  height: auto;
+  top: 100%;
+  right: 0;
+  padding: 8px;
+  border-radius: 8px 0 8px 8px;
+  background-color: #fff;
+  box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+  width: auto;
+}
+
+.ac_c_i_t_p_box > div {
+  width: 80px;
+  height: 30px;
+  cursor: pointer;
+  transition: 0.3s;
+  font-weight: bold;
+  font-size: 0.9em;
+  border-radius: 5px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  position: relative;
+  box-sizing: border-box;
+}
+
+.ac_c_i_t_p_box > div:hover {
+  background-color: #f2f4f7;
 }
 </style>

+ 1 - 1
src/components/pages/classroomObservation/components/baseMessage.vue

@@ -722,7 +722,7 @@ ${this.data.editorBarData?this.data.editorBarData.content:""}
 `;			
 				const _uuid = uuidv4();
 				let params = {
-					model: "gpt-3.5-turbo",
+					// model: "gpt-3.5-turbo",
 					temperature: 0,
 					max_tokens: 4096,
 					top_p: 1,

+ 5 - 5
src/components/pages/classroomObservation/components/wangEnduit.vue

@@ -13,8 +13,8 @@
       </div>
     </div>
   </div>
-</template>  
-  
+</template>
+
 <script>
 import E from "wangeditor";
 import "../../../../common/aws-sdk-2.235.1.min";
@@ -190,8 +190,8 @@ export default {
     },
   },
 };
-</script>  
-  
+</script>
+
 <style lang="css" scoped>
 .editor {
    width: 100%;
@@ -327,4 +327,4 @@ export default {
   width: 40px;
   margin-right: 20px;
 }
-</style>  
+</style>

+ 134 - 3
src/components/pages/components/lookWork.vue

@@ -192,7 +192,45 @@
                       </div>
                     </div>
                     <div v-for="(i, codex) in l.content" :key="codex + 'co'">
-                      <div class="answerTxt" v-html="i"></div>
+                      <iframe
+                        v-if="getFileExtension(i) == 'PDF'"
+                        style="width: 90%; height: 500px; border: none"
+                        :src="
+                          'https://cloud.cocorobo.cn/pdf.js/web/viewer.html?file=' +
+                            encodeURIComponent(i)
+                        "
+                      ></iframe>
+
+                      <iframe
+                        v-if="words.indexOf(getFileExtension(i)) != -1"
+                        style="width: 90%; height: 500px; border: none"
+                        :src="
+                          'https://view.officeapps.live.com/op/view.aspx?src=' +
+                            encodeURIComponent(i)
+                        "
+                        frameborder="0"
+                      ></iframe>
+
+
+                      <img    
+                        @click.stop="previewImg(i)"
+                        style="max-width: 200px" 
+                        v-if="pictures.indexOf(getFileExtension(i)) != -1 " 
+                        :src="i" alt="">
+
+                      <div v-if="xianObj.indexOf(getFileExtension(i)) != -1 && TxtMd" >{{ TxtMd }}</div>
+                      
+                      <video-player
+                          v-if="getFileExtension(i) == 'MP4'"
+                          class="video-player vjs-custom-skin"
+                          :playsinline="true"
+                          :options="playerOptions"
+                          @play="onPlayerPlay($event)"
+                          style="width: 600px; height: 400px; margin: 0 0 0 30px"
+                        ></video-player>
+
+                        <div class="answerTxt" v-html="i"></div>
+
                     </div>
                   </div>
                   <div
@@ -748,6 +786,46 @@
 </template>
 
 <script>
+
+const getFile = url => {
+  return new Promise((resolve, reject) => {
+    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 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) {
+      if (err) {
+        console.log(err, err.stack);
+        resolve({ data: 1 });
+      } else {
+        const fileContent = data.Body.toString("utf-8");
+        resolve({ data: fileContent });
+      } // sxuccessful response
+    });
+    // axios({
+  });
+};
 export default {
   props: {
     id: {
@@ -776,14 +854,42 @@ export default {
       workEvaList: [],
       // 上一个下一个学生位置
       positP: 0,
-
+      TxtMd:'',
       dyList: [],
       courseName: "",
       workList: [],
       CState: 0,
       tableData: [],
       loading: false,
-      resData: {}
+      resData: {},
+      playerOptions: {
+        playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
+        autoplay: false, //如果true,浏览器准备好时开始回放。
+        muted: false, // 默认情况下将会消除任何音频。
+        loop: false, // 导致视频一结束就重新开始。
+        preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
+        language: "zh-CN",
+        aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
+        fluid: false, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
+        sources: [
+          {
+            type: "video/mp4", //这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目   || "video/ogg"|| "video/webm"
+            src: "" //url地址require("../../../assets/media/aaa.mp4")
+          }
+        ],
+        // poster: require("../../../assets/tu31.png"), //你的封面地址
+        // poster: dataRes.imgUrl, //你的封面地址
+        notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
+        controlBar: {
+          timeDivider: true, //当前时间和持续时间的分隔符
+          durationDisplay: true, //显示持续时间
+          remainingTimeDisplay: false, //是否显示剩余时间功能
+          fullscreenToggle: true //全屏按钮
+        }
+      },
+      xianObj: [ "MD", "TXT"],
+      words:["DOCX","XLSX", "PPT" ,"PPTX"],
+      pictures:["JPG", "PNG" ,"JPEG"]
     };
   },
 
@@ -895,6 +1001,27 @@ export default {
     }
   },
   methods: {
+    onPlayerPlay() {},
+
+    // 作业提交进行判断展示
+    getFileExtension(fileName) {
+      let der = fileName.slice(fileName.lastIndexOf(".") + 1).toUpperCase()
+      console.log('getFileExtension',der);
+
+      if (der == 'MP4') {
+        this.playerOptions.sources[0].src = fileName;
+        return der;
+      }
+
+      if (this.xianObj.indexOf(der) != -1) {
+        getFile(fileName).then(res => {
+          this.TxtMd = res.data;
+        });
+        return der;
+      }
+      
+      return der;
+    },
      // 时间戳转时间
      convertToTimestamp(val) {
       const date = new Date(val);
@@ -1687,4 +1814,8 @@ export default {
 .item {
   margin: 4px;
 }
+.video-player >>> .video-js {
+  height: 100%;
+  padding: 0 !important;
+}
 </style>

+ 10 - 3
src/components/pages/course.vue

@@ -230,7 +230,7 @@
     					</el-tooltip>
 
 							<el-tooltip effect="dark" content="复制" placement="top">
-    					  <div class="t_b_Item" @click="copyCourse(item.courseId)">
+    					  <div class="t_b_Item" @click="copyCourse(item.courseId, item.setting)">
 									<img src="../../assets/icon/course/copy.svg">
 								</div>
     					</el-tooltip>
@@ -419,6 +419,7 @@ import CourseProblem from "./components/courseProblem";
 import shareDialog from './dialog/shareDialog.vue'
 import templateDialog from "./aiAddCourse/templateDialog.vue";
 import templateDialogE from "./aiEasy/templateDialog.vue";
+import { v4 as uuidv4 } from "uuid";
 
 export default {
   components: { EditorBar, CourseProblem,shareDialog,templateDialog,templateDialogE },
@@ -1431,15 +1432,21 @@ export default {
       this.problemCourse = res;
       this.dialogVisible = true;
     },
-    copyCourse(cid) {
+    copyCourse(cid, setting) {
+      let settingJson = ''
+      if(setting && JSON.parse(setting)){
+        settingJson = JSON.parse(setting)
+        settingJson.chatid = uuidv4()
+      }
       let params = [
         {
           cid: cid,
           uid: this.userid,
+          setting: JSON.stringify(settingJson),
         },
       ];
       this.ajax
-        .post(this.$store.state.api + "copyCourse", params)
+        .post(this.$store.state.api + "copyCourse2", params)
         .then((res) => {
           this.page = 1;
           if (this.role == "1") {

+ 2 - 2
src/components/pages/kindStudentEva/test/component/sharePdf.vue

@@ -102,7 +102,7 @@ export default {
     },
     setQr() {
       setTimeout(() => {
-        let url = `https://beta.cloud.cocorobo.cn/#/echarts?cid=${this.cid}&userid=${this.userid}&oid=${this.oid}&org=${this.org}`;
+        let url = `https://beta.cloud.cocorobo.cn/#/echarts?cid=${this.cid}&userid=${this.userid}&oid=${this.oid}`;       
         this.origin = url;
         this.$refs.qrCodeUrl.innerHTML = "";
         var qrcode = new QRCode(this.$refs.qrCodeUrl, {
@@ -125,7 +125,7 @@ export default {
       link.click();
     },
     copy() {
-      this.copyText = `https://beta.cloud.cocorobo.cn/#/echarts?cid=${this.cid}&userid=${this.userid}&oid=${this.oid}&org=${this.org}`;
+      this.copyText = `https://beta.cloud.cocorobo.cn/#/echarts?cid=${this.cid}&userid=${this.userid}&oid=${this.oid}`;
       var clipboard = new Clipboard(".tag-read");
       clipboard.on("success", e => {
         this.$message.success("复制成功");

+ 125 - 28
src/components/pages/test/check/docxTemplateDialog.vue

@@ -306,6 +306,7 @@ export default {
       for (let i = 0; i < array.length; i++) {
         let _item = array[i];
         if (_item.type == 3) {
+          //问答题
           let _item2 = _item.json;
           _list.push({
             name: _item2.title,
@@ -315,6 +316,7 @@ export default {
           });
           _index++;
         } else if (_item.type == 1) {
+          //单选题
           let _item2 = _item.json;
           let choseTxt = ``;
           _item2.array.forEach((i, index2) => {
@@ -331,6 +333,56 @@ export default {
             value: choseTxt
           });
           _index++;
+        } else if (_item.type == 8) {
+          //日期
+          let _item2 = _item.json;
+          _list.push({
+            name: _item2.title,
+            field: `ti_${_index}`,
+            type: "text",
+            value: _item2.answer2
+          });
+          _index++;
+        } else if (_item.type == 12) {
+          //扫一扫
+          let _item2 = _item.json;
+          _list.push({
+            name: _item2.title,
+            field: `ti_${_index}`,
+            type: "text",
+            value: _item2.answer2
+          });
+          _index++;
+        } else if (_item.type == 7) {
+          //评分
+          let _item2 = _item.json;
+          _list.push({
+            name: _item2.title,
+            field: `ti_${_index}`,
+            type: "text",
+            value: _item2.answer2
+          });
+          _index++;
+        } else if (_item.type == 5) {
+          //附件
+          let _item2 = _item.json;
+          // let _value = ``;
+          // _item2.file.forEach(f => {
+          //   if (/\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i.test(f.url)) {
+          //     _value += `<img src="${f.url}" alt="${f.name}" width="100" height="100"/>
+          // 		`;
+          //   } else {
+          //     _value += `<a href="${f.url}" target="_blank">${f.name}</a>
+          // 		`;
+          //   }
+          // });
+          _list.push({
+            name: _item2.title,
+            field: `ti_${_index}`,
+            type: "file",
+            value: _item2.file
+          });
+          _index++;
         }
       }
       return _list;
@@ -469,6 +521,24 @@ export default {
               `{${fieldList[i].field}}`,
               fieldList[i].value
             );
+          } else if (this.fieldList[i].type == "file") {
+            let _text = ``;
+            // this.fieldList[i].value.forEach(async f => {
+            for (let j = 0; j < this.fieldList[i].value.length; j++) {
+              let f = this.fieldList[i].value[j];
+              if (/\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i.test(f.url)) {
+                // const img = await this.convertImageUrlToBase64(f.url);
+                // _text += `<img src="${f.url}" width="${100}" height="100" style="object-fit:contain"/><br/>`;
+                let _imageWidthAndHeight = await this.getImageWidthAndHeight(f.url);
+                let _setWidth = 100;
+                let _setHeight = (_imageWidthAndHeight.height / _imageWidthAndHeight.width) * _setWidth; // 根据比例计算高度
+                _text += `<img src="${f.url}" width="${_setWidth}" height="${_setHeight}" style="object-fit:contain"/><br/>`;
+              } else {
+                _text += `<a href="${f.url}" target="_blank">${f.name}</a><br/>`;
+              }
+            }
+            _html = _html.replaceAll(`{${this.fieldList[i].field}}`, _text);
+            // });
           }
         }
 
@@ -504,8 +574,25 @@ export default {
             `{${this.fieldList[i].field}}`,
             this.fieldList[i].value
           );
+        } else if (this.fieldList[i].type == "file") {
+          let _text = ``;
+          console.log(this.fieldList[i].value);
+          // this.fieldList[i].value.forEach(async f=>{
+          // for (let j = 0; j < this.fieldList[i].value.length; j++) {
+          //   let f = this.fieldList[i].value[j];
+          // 	console.log("👉f",f)
+          //   if (/\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i.test(f.url)) {
+          //     const img = await this.convertImageUrlToBase64(f.url);
+          //     _text += `<img src="${img.url}" width="${img.width}" height="${img.height}" />\n`;
+          //   } else {
+          //     _text += `<a href="${f.url}" target="_blank">${f.name}</a>\n`;
+          //   }
+          // }
+          // _html = _html.replaceAll(`{${this.fieldList[i].field}}`, _text);
+          // })
         }
       }
+      return;
       // this.fieldList.forEach(i => {
       // _html = _html.replace(`{${i.field}}`,i.value)
       // })
@@ -790,6 +877,15 @@ export default {
         };
       });
     },
+    getImageWidthAndHeight(imageUrl){
+      return new Promise((resolve)=>{
+        let _img = new Image();
+        _img.src = imageUrl;
+        _img.onload = () =>{
+          resolve({width:_img.width,height:_img.height})
+        }
+      })
+    },
     base64DataURLToArrayBuffer(dataURL) {
       const base64Regex = /^data:image\/(png|jpg|svg|svg\+xml);base64,/;
       if (!base64Regex.test(dataURL)) {
@@ -1197,8 +1293,8 @@ ${html}
     getTxtContent(txt) {
       this.downFileData.txt = txt;
     },
-		uploadWord(){
-			let input = document.createElement("input");
+    uploadWord() {
+      let input = document.createElement("input");
       input.type = "file";
       // input.accept = ".wav";
       // input.accept = "audio/*, .txt, .pdf, .xlsx";
@@ -1216,25 +1312,26 @@ ${html}
           this.loading = false;
           return this.$message.error("文件上传失败");
         }
-				let obj = {
-					fileName:file.name,
-					url:uploadData,
-				}
-				this.downFileData = obj;
-				this.changeDownFileData(this.downFileData);
-				this.loading = false;
-				console.log(uploadData)
-			}
-		},
-		formatTime(timeString) {
-    let [datePart, timePart] = timeString.split(' ');
-    let formattedTime = timePart.replace(/:/g, (match, offset) => {
-      if (offset === 2) return '时';
-      if (offset === 5) return '分';
-      return match;
-    }) + '秒';
-    return datePart + ' ' + formattedTime;
-  },
+        let obj = {
+          fileName: file.name,
+          url: uploadData
+        };
+        this.downFileData = obj;
+        this.changeDownFileData(this.downFileData);
+        this.loading = false;
+        console.log(uploadData);
+      };
+    },
+    formatTime(timeString) {
+      let [datePart, timePart] = timeString.split(" ");
+      let formattedTime =
+        timePart.replace(/:/g, (match, offset) => {
+          if (offset === 2) return "时";
+          if (offset === 5) return "分";
+          return match;
+        }) + "秒";
+      return datePart + " " + formattedTime;
+    }
   },
   computed: {
     dialogTitle() {
@@ -1260,8 +1357,8 @@ ${html}
 
 .dialog_diy >>> .el-dialog__header {
   padding: 15px 20px;
-	background-color: #454545 !important;
-	color: #fff !important;
+  background-color: #454545 !important;
+  color: #fff !important;
 }
 
 .dialog_diy >>> .el-dialog__body {
@@ -1297,16 +1394,16 @@ ${html}
   padding: 0 20px 15px;
   display: flex;
   box-sizing: border-box;
-	overflow: auto;
+  overflow: auto;
 }
 
 .b_left {
-	flex: 1;
-	height: 100%;
+  flex: 1;
+  height: 100%;
   border: none;
   outline: none;
-	box-sizing: border-box;
-	padding-top: 20px;
+  box-sizing: border-box;
+  padding-top: 20px;
 }
 
 .b_right {

+ 35 - 21
src/components/pages/test/check/index.vue

@@ -114,7 +114,7 @@
                   <el-input v-model="courseName" class="student_input" :disabled="!(!peopleId)" placeholder="请输入需要搜索的姓名"></el-input>
                   <span class="serach_icon" @click="searchCourse" ></span>
                 </div>
-                
+
                 <div class="btnA" v-if="stype == 1 && !pdfLoading" @click="exportPDF">导出PDF</div>
                 <div class="btnA" v-if="stype == 2" @mouseenter="btnDisplay = true" @mouseleave="btnDisplay = false">
                   导出数据
@@ -124,10 +124,10 @@
 										<div type="primary" v-if="stype == 2" @click="exportWordData">word导出</div>
                   </div>
                 </div>
-								
+
                 <div class="btnA" v-if="stype == 3" @click="exportAllWord2">导出人员数据</div>
                 <div class="btnA" @click="openChat" v-if="this.worksArray.length && !peopleId">AI分析</div><!--v-if="this.worksArray.length"-->
-								
+
               </div>
             </div>
              <!-- 手机端 查看切换 isDesktop-->
@@ -373,7 +373,7 @@
                     <div style="width: 100px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">{{ item.title }}</div>
                   </el-tooltip>
 
-                  
+
                 </div>
                 <div style="display: flex;">
                   <!-- <div v-if="item.type==7" style="right:0;position: absolute;">平均分:{{ getAverageScore(index) }}</div> -->
@@ -578,7 +578,12 @@
           <div class="table_content" v-if="stype == 2 && isDesktop">
             <el-table class="el-table" ref="table" :data="worksArray" border :fit="true" :key="2" v-loading="isLoading"
               style="width: 100%" :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }"
-              @filter-change="handleFilterChange">
+              @filter-change="handleFilterChange"  @selection-change="handleSelectionChange">
+              <el-table-column
+              label="序号"
+                type="selection"
+                width="55">
+              </el-table-column>
               <el-table-column fixed label="序号" width="80px" align="left">
                 <template slot-scope="scope">
                   {{ scope.$index + 1 }}
@@ -592,7 +597,7 @@
 								</template>
               </el-table-column>
               <el-table-column v-for="(item, index) in chapters" :key="index" :label="item.json.title"
-                :min-width="item.type == 5 ? 200 : 150" align="left" 
+                :min-width="item.type == 5 ? 200 : 150" align="left"
 								:filters="item.type == 1 ? item.nameFilters : (item.type ==  6 || item.type ==  11)? item.nameFilters : item.type==8?getTimeFilterText(item,index):null"
                 :filter-method="item.type == 1 ? (value, row) => { return filterName(value, row, index) } : (item.type == 6 || item.type == 11)?(value, row) => { return filterCourse(value, row, index)}:item.type==8?(value,row)=>{return filterTime(value,row,index)}:null"
                 :filter-placement="item.type == 8 ||item.type == 1 || item.type ==6|| item.type ==11 ? filterPlacement : null">
@@ -630,6 +635,9 @@
                   </div>
                   <div v-if="scope.row.array[index].type == 11" style="display: flex; flex-wrap: wrap;">
                     {{ scope.row.array[index].json.answer2}}
+                  </div>
+									<div v-if="scope.row.array[index].type == 12" style="display: flex; flex-wrap: wrap;">
+                    {{ scope.row.array[index].json.answer2}}
                   </div>
                 </template>
               </el-table-column>
@@ -674,7 +682,7 @@
                               {{ k.json.title }}
                             </div>
                           </div>
-                          <div style="color: rgba(0, 0, 0, 0.4);">[{{ selectType2(k.type,k.json.type) }}]</div>  
+                          <div style="color: rgba(0, 0, 0, 0.4);">[{{ selectType2(k.type,k.json.type) }}]</div>
                         </div>
                         <div class="IsDAnswer">
                           <div v-for="(r, index2) in i.array[kin].json.answer2"
@@ -781,7 +789,7 @@
                   </div>
 
                 </div>
-                
+
                 <div style="width: 100%;display: flex;justify-content: end;">
                   <div @click="i.cut=!i.cut" style="display: flex;flex-direction: column;align-items: center">
                     <img src="../../../../assets/icon/fileIcon/retractImg.png" alt="">
@@ -894,7 +902,7 @@
       </div>
     </div>
 
-   
+
     <share-box :testJson="testJson" :TeachingValue="TeachingValue" :TeachName="TeachNameCpt"   :dialogVisibleShare.sync="dialogVisibleShare"></share-box>
     <wpdf :dialogVisiblePdf.sync="dialogVisiblePdf" :url="wurl"></wpdf>
     <wVideo :dialogVisibleVideo.sync="dialogVisibleVideo" :url="wurl"></wVideo>
@@ -925,7 +933,7 @@ import XLSX from "xlsx-js-style";
 import aiBoxRight from './aiBoxRight.vue'
 
 // word模板
-import docxTemplateDialog from './docxTemplateDialog' 
+import docxTemplateDialog from './docxTemplateDialog'
 
 const getFile = (url) => {
     return new Promise((resolve, reject) => {
@@ -1034,6 +1042,7 @@ export default {
       btnDisplay: false,
 
       fileLoading: [],
+      selectWorkList:[]
       // fileLoadCount: [],
       // fileLoadNum: [],
       // infoprogress: [],
@@ -1478,7 +1487,7 @@ export default {
             } else if (topic.type == 11) {
               const uniqueArray = courseCount11.filter((item, index) => courseCount11.indexOf(item) === index);
               let _answer = uniqueArray
-              
+
               allCourseIds = allCourseIds.concat(_answer);
             }
             for (var j = 0; j < array.length; j++) {
@@ -1563,7 +1572,7 @@ export default {
                 result.forEach(elc=>{
                   if(this.chapters.find((f, index)=>index==i).nameFilters.find(c=>c.value==elc.title)==undefined && topic.answer2.includes(elc.courseId)){
                     this.chapters.find((c, index)=>index==i).nameFilters.push({text:elc.title,value:elc.title})
-                  }                
+                  }
                 })
               }
 
@@ -1582,7 +1591,7 @@ export default {
           this.testArray = testArray
           this.worksArray = array
           this.isLoading = false;
-          
+
         })
         .catch((err) => {
           console.error(err);
@@ -2038,7 +2047,7 @@ export default {
         } else if (item.type == 11 && item.json.answer2) {
             let _option = `<div style='margin:10px 0 0 40px;'>打分课程:${item.json.answer2}</div>`
             _test += _option
-        } 
+        }
       }
       _test += `</div>`
       let _html = _title + _content + _detail + _test;
@@ -2100,7 +2109,7 @@ export default {
             result.forEach(i=>{
               _title.push(i.title)
             })
-            
+
             let _option = `<div style='margin:10px 0 0 40px;'>打分课程:${ _title.length ? _title.join(',') : '' }</div>`
             _test += _option
         }
@@ -2140,8 +2149,9 @@ export default {
       return blob;
     },
     exportAllWord() {
+      if(this.selectWorkList.length<=0)return this.$message.info("请先选择需要导出的表单数据")
       this.pdfLoading = true;
-      const _chapInfo = this.worksArray;
+      const _chapInfo = this.selectWorkList;//this.worksArray
       let url = [];
       for (let i = 0; i < _chapInfo.length; i++) {
         url.push({
@@ -2335,10 +2345,10 @@ export default {
                   this.fileLoading[index].bool=false
                 }
         	  });
-           
+
 						promises.push(promise)
 					})
-					
+
 				}else{//只有一个文件的情况
 					promises.push(getFile(downFileArray[0].urlList[0].url).then((data) => {
 						if (data.data != 1) {
@@ -2420,8 +2430,12 @@ export default {
 			this.testJson.cover = data
 		},
 		exportWordData(){
-			this.$refs.docxTemplateDialogRef.open({fileData:this.testJson.cover?JSON.parse(this.testJson.cover):null,testJson:this.testJson,courseId:this.testJson.courseId,formData:this.worksArray})//这里可以传数据
-		}
+      if(this.selectWorkList.length<=0)return this.$message.info("请先选择需要导出的表单数据")
+			this.$refs.docxTemplateDialogRef.open({fileData:this.testJson.cover?JSON.parse(this.testJson.cover):null,testJson:this.testJson,courseId:this.testJson.courseId,formData:this.selectWorkList})//这里可以传数据this.worksArray
+		},
+    handleSelectionChange(value){
+      this.selectWorkList = value
+    }
   },
   beforeDestroy() {
     document.getElementsByTagName('html')[0].style.overflow = '';
@@ -3362,4 +3376,4 @@ export default {
   border-radius: 5px;
 	overflow: hidden;
 }
-</style>
+</style>

Datei-Diff unterdrückt, da er zu groß ist
+ 537 - 182
src/components/pages/test/checkAi/aiLeader.vue


+ 46 - 0
src/components/pages/test/checkAi/eChartTemplate.vue

@@ -0,0 +1,46 @@
+<template>
+	<div class="chart" id="charts_canvas" ref="chartRef"></div>
+</template>
+
+<script>
+import * as echarts from 'echarts';
+export default {
+	props: {
+		data: {
+			type: Object,
+			default: () => {},
+		},
+	},
+	data() {
+		return {
+			chartObj: null,
+			chartData: null,
+		};
+	},
+	watch: {
+		data() {
+			this.getChartData();
+		},
+	},
+	methods: {
+		getChartData() {
+			this.chartObj = echarts.init(this.$refs.chartRef);
+			this.chartObj.setOption(this.data);
+			window.addEventListener("resize", () => {
+					this.chartObj.resize();
+      });
+		},
+	},
+	mounted() {
+		this.getChartData();
+	},
+};
+</script>
+
+<style scoped>
+.chart {
+	max-width: 100%;
+	width: 100%;
+	height: 100%;
+}
+</style>

+ 36 - 16
src/components/pages/test/choseCheck/csvTableView.vue

@@ -1,10 +1,19 @@
 <template>
   <div class="txtView" v-loading="loading">
-		<el-table :data="tableData" border style="width: 100%;height: 100%;" :header-cell-style="{ background: '#f1f1f1', fontSize: '16px' }" :fit="true" >
-			<el-table-column  :fixed="[].includes(index)" :label="item.label" :prop="item.prop" v-for="(item,index) in columnList" :key="item.label+'_'+index"></el-table-column>
-		</el-table>
-		<!-- <div class="tv_content" v-text="content"></div> -->
-	</div>
+    <el-table :data="tableData" border style="width: 100%;"
+      :header-cell-style="{ background: '#f1f1f1', fontSize: '16px' }" :fit="true">
+      <el-table-column :fixed="[].includes(index)" :label="item.label" :prop="item.prop"
+        v-for="(item, index) in columnList" :key="item.label + '_' + index">
+        <template slot-scope="scope">
+          <el-tooltip class="item" effect="dark" :content="scope.row[item.prop]" placement="top">
+            <!-- 为每个单元格内容添加自定义的多行文本样式 -->
+            <div class="multi-line-text">{{ scope.row[item.prop] }}</div>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- <div class="tv_content" v-text="content"></div> -->
+  </div>
 </template>
 
 <script>
@@ -37,7 +46,7 @@ const getFile = url => {
       Bucket: "ccrb",
       Key: name
     };
-    s3.getObject(params, function(err, data) {
+    s3.getObject(params, function (err, data) {
       if (err) {
         console.log(err, err.stack);
         resolve({ data: 1 });
@@ -71,15 +80,15 @@ export default {
       getFile(this.url).then(res => {
         this.loading = false;
         let tableDataObj = this.formatCSVToTable(res.data);
-				console.log(tableDataObj)
+        console.log(tableDataObj)
         this.tableData = tableDataObj.result;
         let column = [];
-				tableDataObj.header.forEach((item,index)=>{
-					column.push({
-						label:item,
-						prop: `header_${index}`
-					})
-				})
+        tableDataObj.header.forEach((item, index) => {
+          column.push({
+            label: item,
+            prop: `header_${index}`
+          })
+        })
         this.columnList = column;
         this.content = res.data;
       });
@@ -119,7 +128,7 @@ export default {
           }
         }
       }
-      return {result:result,header:arrHeader};
+      return { result: result, header: arrHeader };
     },
   },
   watch: {
@@ -146,7 +155,7 @@ export default {
 
 .tv_content {
   width: 100%;
-  height: 100%;
+  /* height: 100%; */
   box-sizing: border-box;
   background-color: #fff;
   overflow: auto;
@@ -156,4 +165,15 @@ export default {
   box-sizing: border-box;
   padding: 10px;
 }
-</style>
+
+.multi-line-text {
+  display: -webkit-box;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  line-height: 1.5;
+  max-height: 3em;
+}
+
+</style>

+ 51 - 17
src/components/pages/test/smarter.vue

@@ -87,8 +87,8 @@
                         <!-- <div style="display: flex;">
                             <div :class="['preview_file', { active: fileMenu === 1 }]" @click="fileMenu = 1">文档预览</div>
                             <div :class="['bianji_file', { active: fileMenu === 2 }]" @click="fileMenu = 2">文档编辑</div>
-                        </div> -->
-                        <!-- <div v-if="fileMenu == 1" style="margin:10px;"> -->
+                        </div> 
+                        <div v-if="fileMenu == 1" style="margin: -2px 10px;">  -->
                         <div class="cc_b_r_menu">
                             <div v-for="(item, index) in menuList" @click="changeMenuIndex(index)" :key="index"
                                 :class="{ 'cc_b_r_menu_active': menuIndex == index }">
@@ -107,10 +107,12 @@
                         <!-- </div> -->
                         <!-- <div v-if="fileMenu == 2">
                             <div class="bianji_area">
-                                <span></span>
+                                <span contenteditable="true" class="userAsk">{{ userAsk }}</span>
+                                <span class="aiText" contenteditable="true" v-html="bianjiText"></span>
+                                <span v-if="!userAsk" style="display: flex;justify-content: center;">暂无数据</span>
                             </div>
 
-                        </div> -->
+                        </div>  -->
                     </div>
                     <div v-else style="margin: 40px 0px 0px 20px">
                         <div>--官方能力演示--</div>
@@ -154,9 +156,9 @@
                         <el-table :data="tableData" style="width: 100%;cursor: pointer" @row-click="handleRowClick">
                             <el-table-column prop="name" label="会话名称" width="180">
                             </el-table-column>
-                            <el-table-column prop="create_at" label="创建时间" width="180">
+                            <el-table-column prop="ctime" label="创建时间" width="180">
                             </el-table-column>
-                            <el-table-column prop="update_at" label="更新时间">
+                            <el-table-column prop="utime" label="更新时间">
                             </el-table-column>
                             <el-table-column prop="control" label="操作">
                                 <template slot-scope="scope">
@@ -213,7 +215,6 @@
 import radarZong from "./dataCom/radarZong.vue";
 import radarTeacher from "./dataCom/radarTeacher.vue";
 import aiLeader from "./checkAi/aiLeader.vue";
-import txtView from "./choseCheck/txtView.vue";
 import Cascader from "./dataCom/cascader.vue";
 // import smartMenu from "./smartBox/smartMenu.vue";
 import csvTableView from "./choseCheck/csvTableView.vue";
@@ -223,7 +224,7 @@ export default {
     name: 'smarter',
     components: {
         radarZong, radarTeacher, Cascader,
-        aiLeader, txtView, csvTableView
+        aiLeader, csvTableView
     },
     data() {
         return {
@@ -249,6 +250,8 @@ export default {
             fileMenu: 1,
             cutNumber: 1,
             dialogVisibleUpdate: false,
+            // bianjiText:"",
+            // userAsk:"",
             examineData: [],
             tableData: [],
             options: [{
@@ -274,6 +277,7 @@ export default {
                     let obj = JSON.parse(row.json)
                     this.menuList = obj;
                     this.$refs.aiChat.fileList = obj.map(i=>i.url)
+										this.menuIndex = 0;
                 } else {
                     console.error('aiChat ref is not available');
                 }
@@ -399,6 +403,15 @@ export default {
             console.log("menuList", this.menuList);
 
         },
+        // pushAiContent(aitext,userText){
+        //     this.bianjiText = aitext
+        //     this.userAsk = userText
+        //     console.log("ai回答👉",this.bianjiText);
+        //     if(this.bianjiText){
+        //         this.fileMenu = 2
+        //     }
+            
+        // },
         // pushAiContent(data){
         //     this.aiContentArea.push(...data),
         //     console.log("aiContentArea",this.aiContentArea);
@@ -529,7 +542,11 @@ export default {
     computed: {
         showFileUrl() {
             if (this.menuList.length) {
-                return this.menuList[this.menuIndex].url
+              if(this.menuList[this.menuIndex]){
+								return this.menuList[this.menuIndex].url
+							}else {
+								return ""
+							}
             } else {
                 return "";
             }
@@ -931,13 +948,31 @@ export default {
 .bianji_file.active {
     border-bottom: 2px solid blue;
 }
-
+[contenteditable="true"]:focus {
+  outline: none;
+  border: none;
+}
 .bianji_area {
-    background-color: #e5e4e4;
-    height: 600px;
-    margin: 10px;
+    margin: 10px 36px;
+    display: flex;
+    flex-direction: column;
 }
-
+.aiText{
+    margin-top:10px;
+}
+.userAsk{
+    font-size: 20px;
+    font-weight: bold;
+}
+/* .aiText>p{
+    margin-top: 0;
+    margin-bottom: 16px;
+}
+.aiText>ol{
+    padding-left: 2em;
+    margin-top: 0;
+    margin-bottom: 0;
+} */
 .cc_b_r_menu {
     width: 100%;
     height: 50px;
@@ -981,10 +1016,9 @@ export default {
 
 .cc_b_r_content {
     width: 100%;
-    height: calc(100% - 50px);
-    max-height: 700px;
     overflow-y: auto;
-    max-height: 83vh;
+    overflow-x: auto;
+    max-height: 79vh;
 }
 
 .cc_b_r_btn {

+ 6 - 6
src/components/pages/testStudent/view/preview.vue

@@ -42,7 +42,7 @@
           <div class="edit_top" :style="isN==1?'border-bottom:none;justify-content:space-between;padding:10px':''">
 						<div v-if="isN==1" class="edit_title"  :style=" isN==1? 'margin-left : 12px' : ''">提交记录</div>
             <div class="op_btn">
-							<el-button type="primary" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="autoFill" v-if="(showAutoFillBtn && isN!=1)">智能填写</el-button>
+							<!-- <el-button type="primary" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="autoFill" v-if="(showAutoFillBtn && isN!=1)">智能填写</el-button> -->
               <el-button type="primary" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="refresh" v-if="isReset">刷新</el-button>
               <el-button :type="isN!=1?'primary':'info'" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="reset">重置</el-button>
               <el-button type="primary" :style=" isN==1? 'padding: 5px 10px;' : ''" size="small" @click="save" v-if="(type != 3 && isN!=1)">保存</el-button>
@@ -130,7 +130,7 @@ export default {
               "&isN=" +
               this.isN +
               "&tcid=" +
-              this.tcid 
+              this.tcid
             );
           }
         })
@@ -512,7 +512,7 @@ export default {
             "&isN=" +
             this.isN +
             "&tcid=" +
-            this.tcid 
+            this.tcid
           );
         })
         .catch((err) => {
@@ -526,7 +526,7 @@ export default {
       let _uid = ''
       if(this.isN == 1){
         _uid = this.tcid
-      }else { 
+      }else {
         _uid = (this.tid) ? this.tid : this.userid
       }
       let params = [
@@ -565,7 +565,7 @@ export default {
               "&isN=" +
               this.isN +
               "&tcid=" +
-              this.tcid 
+              this.tcid
             );
           }
         })
@@ -745,4 +745,4 @@ export default {
 	top: 0;
 }
 
-</style>
+</style>

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.