Преглед на файлове

Merge branch 'beta' into HK

lsc преди 2 месеца
родител
ревизия
6cfeb259fc
променени са 96 файла, в които са добавени 8927 реда и са изтрити 2627 реда
  1. 4 0
      dist/index.html
  2. 0 0
      dist/static/css/app.55ad8b98063176c8f05c7deba0492432.css
  3. 1 0
      dist/static/css/app.55ad8b98063176c8f05c7deba0492432.css.map
  4. 0 0
      dist/static/css/app.81ee76cd5f6ed2ec02fb1319203c86b5.css.map
  5. BIN
      dist/static/img/KekeLoading.5a4818f.gif
  6. 1 0
      dist/static/js/app.2e1b677ef6b2ce2cedaf.js
  7. 1 0
      dist/static/js/app.2e1b677ef6b2ce2cedaf.js.map
  8. 1 0
      dist/static/js/app.424f68877f5445533504.js
  9. 0 0
      dist/static/js/app.424f68877f5445533504.js.map
  10. 0 0
      dist/static/js/manifest.daf40defc7ec71cbf370.js.map
  11. 1 0
      package-lock.json
  12. BIN
      src/assets/KekeLoading.gif
  13. 19 1
      src/assets/css/button.css
  14. 1 0
      src/assets/icon/appStore/agent.svg
  15. 1 0
      src/assets/icon/appStore/arrow.svg
  16. 3 0
      src/assets/icon/appStore/collect2_icon.svg
  17. 3 0
      src/assets/icon/appStore/collect_active.svg
  18. 3 0
      src/assets/icon/appStore/collect_default.svg
  19. 12 0
      src/assets/icon/appStore/collect_icon.svg
  20. 4 0
      src/assets/icon/appStore/copy.svg
  21. 6 0
      src/assets/icon/appStore/del.svg
  22. 6 0
      src/assets/icon/appStore/edit.svg
  23. 4 0
      src/assets/icon/appStore/find_icon.svg
  24. 4 0
      src/assets/icon/appStore/history2_icon.svg
  25. 5 0
      src/assets/icon/appStore/history_icon.svg
  26. 3 0
      src/assets/icon/appStore/praise_active.svg
  27. 3 0
      src/assets/icon/appStore/praise_default.svg
  28. 1 0
      src/assets/icon/appStore/user_copy.svg
  29. 4 0
      src/assets/icon/appStore/workflow.svg
  30. 1 0
      src/assets/icon/course/download.svg
  31. 1 0
      src/assets/icon/course/save.svg
  32. BIN
      src/assets/icon/test/test_bianji.png
  33. BIN
      src/assets/icon/test/test_delete.png
  34. BIN
      src/assets/icon/test/test_delete_active.png
  35. BIN
      src/assets/icon/test/test_rename.png
  36. BIN
      src/assets/icon/test/test_rename_active.png
  37. BIN
      src/assets/icon/test/type_sweep_icon.png
  38. 1 1
      src/components/pages/Grid.vue
  39. 407 300
      src/components/pages/aiAddCourse/addCourse.vue
  40. 60 2
      src/components/pages/aiAddCourse/aiBoxRight.vue
  41. 3 0
      src/components/pages/aiAddCourse/evaList.vue
  42. 150 71
      src/components/pages/aiEasy/addCourse.vue
  43. 1 1
      src/components/pages/aiEasy/aiBoxRight.vue
  44. 181 0
      src/components/pages/appStore/components/saveCard.vue
  45. 314 60
      src/components/pages/appStore/dialog/addAppDialog.vue
  46. 297 0
      src/components/pages/appStore/dialog/releaseAppDialog.vue
  47. 337 0
      src/components/pages/appStore/dialog/selectAppDialog.vue
  48. 18 415
      src/components/pages/appStore/index.vue
  49. 2089 0
      src/components/pages/appStore/views/appManagement.vue
  50. 637 0
      src/components/pages/appStore/views/workSpace.vue
  51. 1 1
      src/components/pages/classroomObservation/components/baseMessage.vue
  52. 10 8
      src/components/pages/classroomObservation/components/messageArea.vue
  53. 5 5
      src/components/pages/classroomObservation/components/wangEnduit.vue
  54. 4 4
      src/components/pages/components/exjsmind.vue
  55. 387 391
      src/components/pages/components/exportDataDialog.vue
  56. 276 285
      src/components/pages/components/exportWorksDialog.vue
  57. 6 6
      src/components/pages/components/lookReport.vue
  58. 141 10
      src/components/pages/components/lookWork.vue
  59. 444 381
      src/components/pages/components/report.vue
  60. 1 1
      src/components/pages/components/studentWorksDetail.vue
  61. 2 2
      src/components/pages/components/worksDetail2.vue
  62. 11 4
      src/components/pages/course.vue
  63. 49 3
      src/components/pages/inviteLoginST/inviteLogin.vue
  64. 2 2
      src/components/pages/kindStudentEva/test/component/sharePdf.vue
  65. 1 0
      src/components/pages/newCourse/addCourse.vue
  66. 50 1
      src/components/pages/synergyCourse/addCourse.vue
  67. 13 1
      src/components/pages/synergyCourse/group/group.vue
  68. 28 7
      src/components/pages/test/add/components/GapFilling/gap.vue
  69. 2 1
      src/components/pages/test/add/components/addCheckPopover.vue
  70. 36 10
      src/components/pages/test/add/components/checkOrder.vue
  71. 30 9
      src/components/pages/test/add/components/choice/choice.vue
  72. 3 3
      src/components/pages/test/add/components/course/course.vue
  73. 4 4
      src/components/pages/test/add/components/course2/course.vue
  74. 3 3
      src/components/pages/test/add/components/evaBox/eva.vue
  75. 5 5
      src/components/pages/test/add/components/file/file.vue
  76. 166 0
      src/components/pages/test/add/components/sweep/index.vue
  77. 16 4
      src/components/pages/test/add/edit/check/index.vue
  78. 261 0
      src/components/pages/test/add/edit/check/sweep.vue
  79. 36 13
      src/components/pages/test/add/edit/edit/index.vue
  80. 1 0
      src/components/pages/test/add/edit/edit/indexJ.vue
  81. 23 10
      src/components/pages/test/add/edit/index.vue
  82. 4 0
      src/components/pages/test/add/global_styles.css
  83. 11 6
      src/components/pages/test/add/minxins/minxin.js
  84. 129 31
      src/components/pages/test/check/docxTemplateDialog.vue
  85. 583 174
      src/components/pages/test/check/index.vue
  86. 526 226
      src/components/pages/test/checkAi/aiLeader.vue
  87. 52 0
      src/components/pages/test/checkAi/eChartTemplate.vue
  88. 92 71
      src/components/pages/test/choseCheck/csvTableView.vue
  89. 5 3
      src/components/pages/test/choseCheck/index.vue
  90. 580 71
      src/components/pages/test/smarter.vue
  91. 39 6
      src/components/pages/testPerson/info/infoDialog/index.vue
  92. 3 1
      src/components/pages/testStudent/view/component/choice.vue
  93. 5 3
      src/components/pages/testStudent/view/component/gap.vue
  94. 266 0
      src/components/pages/testStudent/view/component/sweep.vue
  95. 21 4
      src/components/pages/testStudent/view/component/topic.vue
  96. 6 6
      src/components/pages/testStudent/view/preview.vue

+ 4 - 0
dist/index.html

@@ -32,7 +32,11 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
+<<<<<<< HEAD
     }</style><link href=./static/css/app.81ee76cd5f6ed2ec02fb1319203c86b5.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.daf40defc7ec71cbf370.js></script><script type=text/javascript src=./static/js/vendor.6bffbf9058a42e825dbc.js></script><script type=text/javascript src=./static/js/app.424f68877f5445533504.js></script></body></html><script>function stopSafari() {
+=======
+    }</style><link href=./static/css/app.55ad8b98063176c8f05c7deba0492432.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.2e1b677ef6b2ce2cedaf.js></script></body></html><script>function stopSafari() {
+>>>>>>> beta
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
dist/static/css/app.55ad8b98063176c8f05c7deba0492432.css


Файловите разлики са ограничени, защото са твърде много
+ 1 - 0
dist/static/css/app.55ad8b98063176c8f05c7deba0492432.css.map


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
dist/static/css/app.81ee76cd5f6ed2ec02fb1319203c86b5.css.map


BIN
dist/static/img/KekeLoading.5a4818f.gif


Файловите разлики са ограничени, защото са твърде много
+ 1 - 0
dist/static/js/app.2e1b677ef6b2ce2cedaf.js


Файловите разлики са ограничени, защото са твърде много
+ 1 - 0
dist/static/js/app.2e1b677ef6b2ce2cedaf.js.map


Файловите разлики са ограничени, защото са твърде много
+ 1 - 0
dist/static/js/app.424f68877f5445533504.js


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
dist/static/js/app.424f68877f5445533504.js.map


Файловите разлики са ограничени, защото са твърде много
+ 0 - 0
dist/static/js/manifest.daf40defc7ec71cbf370.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"

BIN
src/assets/KekeLoading.gif


+ 19 - 1
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;
 }
@@ -355,7 +364,8 @@
 .pub_test_btn_course::before,
 .pub_test_btn_eva::before,
 .pub_test_btn_time::before,
-.pub_test_btn_file::before {
+.pub_test_btn_file::before,
+.pub_test_btn_sweep::before {
   content: "";
   width: 18px;
   height: 18px;
@@ -395,6 +405,10 @@
   background-image: url(../icon/test/type_time_icon.png);
 }
 
+.pub_test_btn_sweep::before{
+	background-image: url(../icon/test/type_sweep_icon.png);
+}
+
 .test_icon{
   display: inline-block;
   width: 18px;
@@ -428,6 +442,10 @@
   background-image: url('../icon/test/type_time_icon.png');
 }
 
+.test_icon_sweep{
+  background-image: url('../icon/test/type_sweep_icon.png');
+}
+
 .dataBoard_check_box {
   display: flex;
   align-items: center;

Файловите разлики са ограничени, защото са твърде много
+ 1 - 0
src/assets/icon/appStore/agent.svg


+ 1 - 0
src/assets/icon/appStore/arrow.svg

@@ -0,0 +1 @@
+<svg t="1736317821638" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4274" width="200" height="200"><path d="M512 693.333333c-14.933333 0-29.866667-4.266667-40.533333-14.933333l-277.33333399-234.666667c-27.733333-23.466667-29.866667-64-8.53333301-89.6 23.466667-27.733333 64-29.866667 89.6-8.53333299L512 546.133333l236.8-200.53333299c27.733333-23.466667 68.266667-19.19999999 89.6 8.53333299 23.466667 27.733333 19.19999999 68.266667-8.53333301 89.6l-277.33333399 234.666667c-10.666667 10.666667-25.6 14.933333-40.533333 14.933333z" fill="#A2A2A2" p-id="4275"></path></svg>

+ 3 - 0
src/assets/icon/appStore/collect2_icon.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.4"/>
+</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>

+ 12 - 0
src/assets/icon/appStore/collect_icon.svg

@@ -0,0 +1,12 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_979_7372)">
+<path d="M8.0851 0.390411C12.2643 0.470411 15.4697 3.63745 15.4806 7.73601C15.4915 11.9459 12.3971 15.184 8.12798 15.2192C3.93822 15.2538 0.711662 12.0947 0.692462 7.82337C0.673902 3.63553 3.9027 0.473931 8.0851 0.390411Z" fill="#FFF3D0"/>
+<path d="M4.91328 11.9315C5.0384 11.1238 5.10335 10.3891 5.27967 9.68257C5.38367 9.26593 5.27135 9.02081 4.99455 8.75521C4.56287 8.34145 4.152 7.90497 3.73568 7.47489C3.48864 7.21985 3.19392 6.95073 3.32064 6.56161C3.46496 6.11809 3.87488 6.00961 4.29856 5.95137C4.8352 5.87777 5.36768 5.76993 5.90496 5.70401C6.33056 5.65185 6.56096 5.44289 6.71424 5.03393C6.93343 4.45089 7.21024 3.88513 7.51104 3.33857C7.87936 2.66881 8.43808 2.66273 8.8128 3.32001C9.0816 3.79105 9.36639 4.27489 9.50815 4.79073C9.71359 5.53793 10.2234 5.72577 10.8867 5.78753C11.3446 5.83009 11.8051 5.88865 12.2544 5.98561C13.0637 6.16065 13.3424 6.84545 12.7046 7.31809C11.1107 8.50017 10.7798 9.92865 11.3872 11.7514C11.5974 12.3821 10.8662 12.8947 10.3181 12.4899C8.85472 11.4086 7.496 11.3565 6.02911 12.4826C5.51295 12.8797 4.91872 12.4739 4.91328 11.9315Z" fill="#FFCB01"/>
+<path d="M7.57921 6.44574C7.70881 6.45438 7.87713 6.41982 7.92993 6.56766C8.00417 6.77438 7.82593 6.86846 7.67521 6.89726C7.10337 7.00702 6.76513 7.32574 6.68353 7.9091C6.66369 8.05118 6.58145 8.19614 6.43777 8.18142C6.24545 8.16158 6.21441 7.98398 6.21121 7.81054C6.19905 7.18014 6.93441 6.44382 7.57921 6.44574Z" fill="white"/>
+</g>
+<defs>
+<clipPath id="clip0_979_7372">
+<rect width="16" height="16" fill="white"/>
+</clipPath>
+</defs>
+</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>

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

@@ -0,0 +1,4 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10 1.66666C14.6023 1.66666 18.3334 5.3977 18.3334 9.99999C18.3334 14.6023 14.6023 18.3333 10 18.3333C5.39773 18.3333 1.66669 14.6023 1.66669 9.99999C1.66669 5.3977 5.39773 1.66666 10 1.66666ZM10 2.91666C6.08794 2.91666 2.91669 6.08791 2.91669 9.99999C2.91669 13.9121 6.08794 17.0833 10 17.0833C13.9121 17.0833 17.0834 13.9121 17.0834 9.99999C17.0834 6.08791 13.9121 2.91666 10 2.91666ZM12.9134 6.0202C13.0622 5.96659 13.2231 5.95643 13.3775 5.99092C13.5319 6.02541 13.6732 6.10311 13.7851 6.21495C13.8969 6.32679 13.9746 6.46815 14.0091 6.62251C14.0436 6.77687 14.0334 6.93785 13.9798 7.08666L12.454 11.325C12.3605 11.5847 12.2108 11.8205 12.0156 12.0157C11.8204 12.2108 11.5845 12.3605 11.3248 12.4539L7.08669 13.9798C6.93788 14.0334 6.7769 14.0435 6.62254 14.0091C6.46818 13.9746 6.32682 13.8969 6.21498 13.785C6.10314 13.6732 6.02544 13.5318 5.99095 13.3775C5.95646 13.2231 5.96662 13.0621 6.02023 12.9133L7.54606 8.67499C7.63958 8.4153 7.78927 8.17946 7.98446 7.98431C8.17965 7.78915 8.41552 7.6395 8.67523 7.54603L12.9134 6.0202ZM12.5038 7.49624L9.09856 8.72207C9.01197 8.75323 8.93332 8.80314 8.86824 8.86821C8.80317 8.93329 8.75327 9.01194 8.7221 9.09853L7.49627 12.5037L10.9015 11.2779C10.9881 11.2467 11.0667 11.1968 11.1318 11.1318C11.1969 11.0667 11.2468 10.988 11.2779 10.9014L12.5038 7.49624Z" fill="black"/>
+<path d="M13.0827 6.49062L13.0828 6.49059C13.1423 6.46914 13.2067 6.46508 13.2685 6.47888C13.3302 6.49267 13.3868 6.52375 13.4315 6.56849C13.4762 6.61322 13.5073 6.66977 13.5211 6.73151C13.5349 6.79325 13.5308 6.85765 13.5094 6.91717L13.5094 6.91728L11.9835 11.1556C11.915 11.346 11.8052 11.519 11.662 11.6621C11.5189 11.8052 11.3459 11.9149 11.1555 11.9835L11.1554 11.9835L6.9173 13.5093L6.9172 13.5094C6.85768 13.5308 6.79328 13.5349 6.73154 13.5211C6.6698 13.5073 6.61325 13.4762 6.56852 13.4315C6.52378 13.3867 6.4927 13.3302 6.47891 13.2684C6.46511 13.2067 6.46917 13.1423 6.49062 13.0828L6.49066 13.0827L8.01647 8.84438C8.01648 8.84436 8.01648 8.84435 8.01649 8.84434C8.08507 8.65392 8.19484 8.48098 8.33797 8.33788C8.48111 8.19476 8.65408 8.08502 8.84453 8.01648L8.84458 8.01646L13.0827 6.49062Z" stroke="#0354D7"/>
+</svg>

+ 4 - 0
src/assets/icon/appStore/history2_icon.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="M8 14C11.3137 14 14 11.3137 14 8C14 4.68629 11.3137 2 8 2C4.68629 2 2 4.68629 2 8C2 11.3137 4.68629 14 8 14ZM8 15C11.866 15 15 11.866 15 8C15 4.13401 11.866 1 8 1C4.13401 1 1 4.13401 1 8C1 11.866 4.13401 15 8 15Z" fill="black" fill-opacity="0.4"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 5C7.77614 5 8 5.22386 8 5.5V8H10.5C10.7761 8 11 8.22386 11 8.5C11 8.77614 10.7761 9 10.5 9H7.5C7.22386 9 7 8.77614 7 8.5V5.5C7 5.22386 7.22386 5 7.5 5Z" fill="black" fill-opacity="0.4"/>
+</svg>

+ 5 - 0
src/assets/icon/appStore/history_icon.svg

@@ -0,0 +1,5 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.99998 12.6667C5.43331 12.6667 3.33331 10.5667 3.33331 8.00004C3.33331 5.43337 5.43331 3.33337 7.99998 3.33337C10.5666 3.33337 12.6666 5.43337 12.6666 8.00004C12.6666 10.5667 10.5666 12.6667 7.99998 12.6667Z" fill="#B6EAFF"/>
+<path d="M7.99998 2.00004C11.3 2.00004 14 4.70004 14 8.00004C14 11.3 11.3 14 7.99998 14C4.69998 14 1.99998 11.3 1.99998 8.00004C1.99998 4.70004 4.69998 2.00004 7.99998 2.00004ZM7.99998 1.33337C4.33331 1.33337 1.33331 4.33337 1.33331 8.00004C1.33331 11.6667 4.33331 14.6667 7.99998 14.6667C11.6666 14.6667 14.6666 11.6667 14.6666 8.00004C14.6666 4.33337 11.6666 1.33337 7.99998 1.33337Z" fill="#1FB6FF"/>
+<path d="M11 10.5334L8.33335 7.86671V3.66671C8.33335 3.50004 8.16669 3.33337 8.00002 3.33337C7.83335 3.33337 7.66669 3.50004 7.66669 3.66671V8.00004C7.66669 8.10004 7.70002 8.16671 7.76669 8.23337L10.5 10.9667C10.6334 11.1 10.8334 11.1 10.9667 10.9667C11.1 10.8334 11.1334 10.6667 11 10.5334Z" fill="#1FB6FF"/>
+</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>

Файловите разлики са ограничени, защото са твърде много
+ 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/download.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="1733817765595" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4411" width="128" height="128" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M833.841473 336.403925c-29.237791-149.914232-160.920736-263.309448-321.841473-263.309448S219.452762 186.489692 190.158527 336.403925C80.48859 365.641715 0 468.030427 0 585.038033c0 142.633006 113.395216 256.028222 255.971778 256.028222h36.57546v-73.15092h-36.57546c-102.388711 0-182.877301-80.432146-182.877301-182.877302 0-102.388711 80.432146-182.877301 182.877301-182.877301 0-142.633006 113.395216-255.971778 255.971778-255.971778 142.633006 0 256.028222 113.395216 256.028222 255.971778 102.388711 0 182.877301 80.432146 182.877301 182.877301 0 102.388711-80.432146 182.877301-182.877301 182.877302h-36.57546v73.15092h36.57546c142.633006 0 255.971778-113.395216 255.971778-256.028222 0.056444-117.007607-80.432146-219.396318-190.102083-248.634108z" p-id="4412" fill="#4f4f4f"></path><path d="M599.769816 782.53423l-43.856686 40.244295V511.943556c0-21.956565-18.28773-36.57546-36.575461-36.57546-21.956565 0-36.57546 18.28773-36.57546 36.57546v310.834969l-43.91313-40.244295c-14.618895-14.618895-40.244295-14.618895-54.86319 0-14.618895 14.618895-14.618895 36.57546 0 51.194356l109.726381 106.057546c3.668835 3.668835 7.337669 7.337669 10.950061 7.337669 14.618895 7.337669 29.237791 3.668835 40.244295-7.337669l106.057546-106.057546c14.618895-14.618895 14.618895-36.57546 0-51.194356-10.950061-14.618895-36.57546-14.618895-51.194356 0z" p-id="4413" fill="#4f4f4f"></path></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>

BIN
src/assets/icon/test/test_bianji.png


BIN
src/assets/icon/test/test_delete.png


BIN
src/assets/icon/test/test_delete_active.png


BIN
src/assets/icon/test/test_rename.png


BIN
src/assets/icon/test/test_rename_active.png


BIN
src/assets/icon/test/type_sweep_icon.png


+ 1 - 1
src/components/pages/Grid.vue

@@ -1038,7 +1038,7 @@ export default {
         {
           type: "getMindNetwork",
           docid: id,
-          pageid: window.parent.US.pageId,
+          pageid: top.US.pageId,
           userid: uid,
           post: "1",
         },

Файловите разлики са ограничени, защото са твърде много
+ 407 - 300
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: true,
+        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;

+ 3 - 0
src/components/pages/aiAddCourse/evaList.vue

@@ -393,6 +393,9 @@ Language: ${this.getLang()}
 
                     console.log(elist);
                     _this.eList = elist
+                    setTimeout(() => {
+                        _this.$emit('addAppendixEva', _this.itemTaskIndex, _this.toolIndex)
+                    }, 100);
                     _this.$forceUpdate()
                 }
                 _this.cancelToken = null

+ 150 - 71
src/components/pages/aiEasy/addCourse.vue

@@ -28,7 +28,8 @@
         <!-- <div style="display: flex; margin-top: 20px; position: relative"> -->
         <!-- @mouseenter="stepDisplay(true)"
               @mouseleave="stepDisplay(false)" -->
-        <div ref="stepBox" class="stepBox" :style="{overflow:istemplate == 1 ? 'auto' : 'auto'}"  @scroll="scrollChange">
+        <div ref="stepBox" class="stepBox" :style="{overflow:istemplate == 1 ? 'auto' : 'auto', height: steps > 2 ? 'calc(100% - 75px)' : '100%'}"  @scroll="scrollChange">
+          <!-- <button class="c_pub_button_confirm confirmBtn" :style="{ right: (isDialog == 1 && chatid && isDisplay) ? (newWidth + 65) + 'px' : '45px'}" v-if="steps > 2 && istemplate != 1" @click="nextSteps">确认上传</button>  -->
           <div class="stepBg" v-if="false">
             <div :class="{ stepTop: isStepDisplay, stepTop2: !isStepDisplay }">
               <div v-if="steps > 0 && isStepDisplay" class="first" @click="navSteps(1)">
@@ -469,59 +470,27 @@
                                 </div>
                               </div>
                               <div class="chapter_upload_n" :class="{dataTips: !item1.fileid}">
-                                <input readonly="true" v-if="
+                                <div v-if="
                                   item1.type == 2 ||
                                   item1.type == 3 ||
                                   item1.type == 12 ||
                                   item1.type == 13 ||
                                   item1.type == 7
-                                " :placeholder="item1.name" @click="
+                                " @click="
                                   updataVideoT(
                                     $event,
                                     unitIndex,
                                     0,
                                     index1
                                   )
-                                  " style="
-                                        border: none;
-                                        outline: none;
-                                        max-width: 100%;
-                                        z-index: 99;
-                                        font-size: 14px;
-                                        white-space: nowrap;
-                                        overflow: hidden;
-                                        text-overflow: ellipsis;
-                                      " />
-                                <input :placeholder="item1.name" v-if="item1.type == 6" style="
-                                        border: none;
-                                        outline: none;
-                                        max-width: 100%;
-                                        white-space: nowrap;
-                                        overflow: hidden;
-                                        text-overflow: ellipsis;
-                                      " readonly="true" @click="
+                                  " class="chapter_upload_box" >{{ item1.name }}</div>
+                                <div v-if="item1.type == 6" class="chapter_upload_box" @click="
                                         selectAttText(0, index1)
-                                        " />
-                                <input :placeholder="item1.title ? item1.title : '链接'
-                                  " v-if="item1.type == 8" style="
-                                        border: none;
-                                        outline: none;
-                                        max-width: 100%;
-                                        white-space: nowrap;
-                                        overflow: hidden;
-                                        text-overflow: ellipsis;
-                                      " readonly="true" @click="selectLine(0, index1)" />
-                                <input :placeholder="item1.title ? item1.title : '链接'
-                                  " v-if="item1.type == 14" style="
-                                        border: none;
-                                        outline: none;
-                                        max-width: 100%;
-                                        white-space: nowrap;
-                                        overflow: hidden;
-                                        text-overflow: ellipsis;
-                                      " readonly="true" @click="
+                                        " >{{ item1.name }}</div>
+                                <div v-if="item1.type == 8" class="chapter_upload_box" @click="selectLine(0, index1)" >{{ item1.title ? item1.title : '链接' }}</div>
+                                <div v-if="item1.type == 14" class="chapter_upload_box" @click="
                                         openUpdateSource(0, index1)
-                                        " />
+                                        " >{{ item1.title ? item1.title : '链接' }}</div>
                               </div>
                               <div class="chapter_upload_ic">
                                 <div class="chapter_upload_noSee" v-if="item1.type == 12"></div>
@@ -2372,9 +2341,9 @@
                 ? 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 ? '100%' : '0',marginRight: stepShow ? '0' : '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>
                   <div class="close_btn" @click="stepShow = !stepShow" :class="!stepShow ? 'close_btn_voice' : ''" style="left: 0;right: unset;top: 5px;transform: rotate(180deg);">
                     <img src="../../../assets/icon/course/arrow.svg" >
@@ -2385,12 +2354,12 @@
                     <!-- <span class="button-toggle" @click="stepShow = !stepShow">{{ stepShow ? '收缩' : '展开' }}</span> -->
                   </div>
                   <div class="stepsBottom" v-if="stepsNav == 1" :style="{
-                    height:istemplate == 1 ? 'calc(100vh - 300px)' : 'calc(100% - 55px)',
+                    height:istemplate == 1 ? 'calc(100vh - 300px)' : 'calc(100% - 40px)',
                     position: istemplate == 1 ? 'sticky' : 'unset',
                     top: istemplate == 1 ? '0' : 'unset'
                   }">
-                    <!-- <div class="navTop">辅助导航</div> -->
-                    <div class="navBottom" v-if="courseState == 6"  :style="{ height: heightPx }">
+                    <!-- <div class="navTop">辅助导航</div>  :style="{ height: heightPx }"-->
+                    <div class="navBottom" v-if="courseState == 6" >
                       <!-- <div class="navTask noImage" v-if="unitJson[unitIndex].dyName">
                         <div class="nt_taskBox" style="width: 100%;">
                           <div class="nt_taskTitle"
@@ -2585,6 +2554,7 @@
                     <span>一键生成</span>
                     <div class="buttonBox">
                       <div @click="openAiDialog(2, 'aiTaskName'), addCourseBehavior('courseBehavior2', `点击学历案-生成所有任务名`)" v-if="panTaskName() == 0">生成所有任务名</div>
+                      <div @click="openAiDialog2(2, 'aiTaskName'), addCourseBehavior('courseBehavior2', `点击学历案-生成所有任务名`)" v-else>重新生成所有任务名</div>
                       <div @click="openAiDialog2(2, 'aiTask3','all', ''), addCourseBehavior('courseBehavior2', `点击学历案-重新生成所有任务`)" v-if="panTaskName() > 0 && panTask() > 0">重新生成所有任务</div>
                       <div @click="openAiDialog(2, 'aiTask3','all', ''), addCourseBehavior('courseBehavior2', `点击学历案-生成所有任务按钮`)" v-else-if="panTaskName() > 0">生成所有任务</div>
                       <div @click="openAiDialog(2, 'aiTaskG2', 'all'), addCourseBehavior('courseBehavior2', `点击学历案-一键生成所有工具按钮`)" v-if="panTask() > 0 && panTool() == 0">一键生成所有工具</div>
@@ -2597,9 +2567,7 @@
                   <!-- <button class="c_pub_button_confirm3" style="margin: 0 0 0 10px;" @click="openAiDialog(2, 'aiTaskG2', 'all'), addCourseBehavior('courseBehavior2', `点击学历案-一键生成所有工具按钮`)" v-if="panTool() == 0">一键生成所有工具</button> -->
                   <!-- <button class="c_pub_button_confirm3" style="margin: 0 0 0 10px;" @click="allEvaCan(), addCourseBehavior('courseBehavior2', `点击学历案-一键生成所有评价按钮`)" v-if="panTool() > 0 && panTaskElist() == 0 && panEvaCont() == 0">一键生成所有评价</button> -->
                   <!-- <button class="c_pub_button_confirm3" style="margin: 0 0 0 10px;" @click="exportTaskEA(), addCourseBehavior('courseBehavior2', `点击学历案-导出评价和学历案按钮`)">导出评价和学历案</button> -->
-                  <button class="c_pub_button_confirm" style="margin: 0 0 0 10px;" v-if="steps < 4 && istemplate != 1" @click="nextSteps">
-                    {{ steps == 3 ? "确认上传" : "下一步" }}
-                  </button> 
+                  <button class="c_pub_button_confirm" style="margin: 0 0 0 10px;" v-if="steps < 4 && istemplate != 1" @click="nextSteps">确认上传</button> 
                 </div>
                 <div class="basic_box" ref="unitBox" @scroll="taskScroll">
                   <div v-if="false" style="
@@ -3587,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>
@@ -5398,6 +5368,9 @@
             </button>
           </div>
         </div>
+        <div class="info_btnBox3" v-show="steps > 2" style="width: calc(100% - 40px)">
+          <button class="c_pub_button_confirm pub_btn_finish_img" @click="nextSteps">确认上传</button>
+        </div>
       </div>
       <div class="leftBar" style="height: calc(100% - 36px - 20px);margin-top: 36px;" v-if="istemplate == 1">
         <!-- <aiTips ttitle="基础资料" title="提取摘要" :detail="aiJson.aiAbstract" pan="aiAbstract" @setAiJson="setAiJson" v-if="!yiKeTemplateArray.includes(templateid)"/> -->
@@ -5420,7 +5393,7 @@
           @setAiJson="setAiJson" /> -->
         <!-- <aiTips ttitle="生成教案" title="教案描述优化" :detail="aiJson.teacherDetail2" pan="teacherDetail2"
           @setAiJson="setAiJson" /> -->
-        <aiTips ttitle="生成教案" title="生成任务按钮" :detail="aiJson.aiTask" pan="aiTask" @setAiJson="setAiJson" />
+        <!-- <aiTips ttitle="生成教案" title="生成任务按钮" :detail="aiJson.aiTask" pan="aiTask" @setAiJson="setAiJson" /> -->
         <aiTips ttitle="任务详情" title="生成任务" :detail="aiJson.aiTaskName" pan="aiTaskName" @setAiJson="setAiJson" />
         <aiTips ttitle="任务详情" title="任务描述" :detail="aiJson.aiTaskG1" pan="aiTaskG1" @setAiJson="setAiJson" />
         <aiTips ttitle="任务详情" title="工具列表" :detail="aiJson.aiTaskG2" pan="aiTaskG2" @setAiJson="setAiJson" />
@@ -7577,7 +7550,9 @@ export default {
       course_info: "",
       stepShow: true,
       anLoading: [],
-      heightPx: '100%'
+      heightPx: '100%',
+      newWidth: 350,
+      unitLoading: false
     };
   },
   directives: {
@@ -7848,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;
@@ -7922,7 +7909,7 @@ export default {
           }
         }
         if (cPan == 2) {
-          this.unitIndex = oldValue;
+          // this.unitIndex = oldValue;
           return;
         }
         for (var i = 0; i < this.unitJson.length; i++) {
@@ -7930,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 = [
           {
@@ -8000,7 +7987,7 @@ export default {
         }
         this.inputShow = true;
         if (cPan == 2) {
-          this.steps = old;
+          // this.steps = old;
           return;
         }
         this.goTo(
@@ -8710,6 +8697,7 @@ export default {
             setTimeout(() => {
               this.loading = false
               this.steps = 3;
+              this.openAiDialog(2, 'aiTask3','all', '');
             }, 0)
             this.isClickColor = 1;
             this.unitJson[
@@ -8766,7 +8754,7 @@ export default {
                     }
                   }
                   if (this.cid) {
-                    this.loading = true
+                    // this.loading = true
                     functionA()
                     this.addCourseBehavior('courseBehavior2', `点击学历案-下一步按钮`)
                   } else {
@@ -8787,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 {
@@ -8928,7 +8918,7 @@ export default {
       //     }
       //   }
       // }
-      this.$refs.stepBox.scrollTop = 0;
+      // this.$refs.stepBox.scrollTop = 0;
     },
     unitSet(i) {
       if (this.unitIndex == i) {
@@ -10471,6 +10461,9 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
                 if(fileid && fileid != 1){
                   _this.knowFileids.push(fileid)
                 }
+                if(!_this.courseName){
+                  _this.courseName = fileName.split('.').slice(0, -1).join('.')
+                }
                 console.log(data.Location);
               }
             });
@@ -12528,7 +12521,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
       }
       this.inputShow = true;
       if (cPan == 2) {
-        this.steps--;
+        // this.steps--;
         return;
       }
       let params = [
@@ -12599,7 +12592,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
       }
       this.inputShow = true;
       if (cPan == 2) {
-        this.steps--;
+        // this.steps--;
         return;
       }
       let params = [
@@ -12664,7 +12657,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
       }
       this.inputShow = true;
       if (cPan == 2) {
-        this.steps--;
+        // this.steps--;
         return;
       }
       for (var i = 0; i < this.unitJson.length; i++) {
@@ -14930,7 +14923,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
               }
             }
 
-            if(this.courseText){
+            if(this.courseText || this.courseTextE){
               this.courseTextB = false
             }
             if(this.teacherCourseText){
@@ -17175,6 +17168,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
@@ -17753,6 +17788,8 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
           })
           return;
         }
+        this.$message.success("正在生成中...")
+
         this.aitype = type
         this.aiText = this.aiJson.aiTaskG1
         this.aiText2 = this.aiJson.aiTaskG2
@@ -17770,6 +17807,8 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
           this.$message.error("请生成学习任务后再生成任务");
           return;
         }
+        this.$message.success("正在生成中...")
+
         this.aitype = type
         this.aiText = this.aiJson.aiTaskName
         this.aiCallBack = callback
@@ -17799,6 +17838,8 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
         //   });
         //   return;
         // }
+        this.$message.success("正在生成中...")
+
         this.aitype = type
         this.aiText = this.aiJson.aiTaskG2
         this.aiCallBack = callback
@@ -18345,6 +18386,7 @@ ${(this.templateid == "4480d65a-1e48-11ef-bee5-005056b86db5" || this.templateid
           let _this = this
           function processNext() {
             if (ij < _this.unitJson[0].chapterInfo[0].taskJson.length) {
+              let _task = _this.unitJson[0].chapterInfo[0].taskJson[ij]
               if(!_this.taskGLoading[ij][0]){
                 ij++;
                 processNext();
@@ -18361,6 +18403,7 @@ ${msg}
 
 ## 参考资料
 学习任务内容:${_this.courseTextE}
+你所在的活动:教学活动${ij+1}:${_task.task} 活动描述:${_task.taskDetail}
 
 # 输出格式与要求
 任务描述(告诉学生他们需要做什么):
@@ -18386,6 +18429,8 @@ ${msg}
           this.aiCallBack[1] ? this.aiCallBack[1]() : ''
 
         }else{
+          let _task = _this.unitJson[0].chapterInfo[0].taskJson[this.aiCallBack[0]]
+
           let message1 = `NOTICE
 Role: 你是一名教师,你正在使用一个在线学习平台来教授学生,你已经完成了教案,你现在需要将教案变为学生上课用的任务单(work sheet)。该在线学习平台为每个任务提供了资源区(视频,ppt,阅读资料将放在这里),多种互动工具(学生点击工具即可上传他们的作业或者回答,这些互动工具类似kahoot一样允许教师轻松收集,统计,追踪学生作业),以及和任务绑定的目标和评价系统。
 Language: ${this.getLang()}
@@ -18397,6 +18442,7 @@ ${msg}
 
 ## 参考资料
 学习任务内容:${this.courseTextE}
+你所在的活动:教学活动${this.aiCallBack[0]+1}:${_task.task} 活动描述:${_task.taskDetail}
 
 # 输出格式与要求
 任务描述(告诉学生他们需要做什么):
@@ -18461,6 +18507,8 @@ ${msg3}
           let _this = this
           function processNext() {
             if (ij < _this.unitJson[0].chapterInfo[0].taskJson.length) {
+              let _task = _this.unitJson[0].chapterInfo[0].taskJson[ij]
+              
               if(!_this.taskGLoading[ij][1]){
                 _this.taskGLoading[ij][1] = false
                 ij++;
@@ -18480,6 +18528,7 @@ ${msg2}
 
 ## 参考资料
 学习任务内容:${_this.courseTextE}
+你所在的活动:教学活动${ij+1}:${_task.task} 活动描述:${_task.taskDetail}
 
 # 输出格式与要求
 互动工具列表
@@ -18509,7 +18558,7 @@ ${_this.languageSetting == 2 ? '还有以下工具:Mind Map Tool、Spreadsheet
 
 
         }else{
-
+          let _task = _this.unitJson[0].chapterInfo[0].taskJson[this.aiCallBack]
 let message2 = `NOTICE
 Role: 你是一名教师,你正在使用一个在线学习平台来教授学生,你已经完成了教案,你现在需要将教案变为学生上课用的任务单(work sheet)。该在线学习平台为每个任务提供了资源区(视频,ppt,阅读资料将放在这里),多种互动工具(学生点击工具即可上传他们的作业或者回答,这些互动工具类似kahoot一样允许教师轻松收集,统计,追踪学生作业),以及和任务绑定的目标和评价系统。
 Language: ${this.getLang()}
@@ -18523,6 +18572,7 @@ ${msg2}
 
 ## 参考资料
 学习任务内容:${this.courseTextE}
+你所在的活动:教学活动${this.aiCallBack+1}:${_task.task} 活动描述:${_task.taskDetail}
 
 # 输出格式与要求
 互动工具列表
@@ -18566,8 +18616,8 @@ ${msg}
 学习任务内容:${this.courseTextE}
 
 # Format example
-[{"task": "任务1的名字"}, {"task": "任务2的名字"}, {"task": "任务3的名字"}, {"task": "任务n的名字"}]`
-        this.loading = true
+[{"task":"活动名/任务名/环节名","taskDetail":"活动描述/任务描述/环节描述"},{"task":"活动名/任务名/环节名","taskDetail":"活动描述/任务描述/环节描述"},{"task":"活动名/任务名/环节名","taskDetail":"活动描述/任务描述/环节描述"},{"task":"活动名/任务名/环节名","taskDetail":"活动描述/任务描述/环节描述"}]`
+        this.unitLoading = true
         this.aiGetTaskName(message, this.aiCallBack)
       } else if (this.aitype == "aiDetail1") {
         this.aiDetail(msg, this.aiIndex)
@@ -20369,18 +20419,20 @@ ${this.courseText && this.aiCallBack[0] == 2 ? '注意,优化原有的<参考
 
             for(var i = 0; i < _this.unitJson[0].chapterInfo[0].taskJson.length; i++){
               _this.unitJson[0].chapterInfo[0].taskJson[i].task = ""
+              _this.unitJson[0].chapterInfo[0].taskJson[i].taskDetail = ""
             }
             for (var i = 0; i < dArray.length; i++) {
               let _task = dArray[i]
               if(_this.unitJson[0].chapterInfo[0].taskJson[i]){
                 _this.unitJson[0].chapterInfo[0].taskJson[i].task = _task.task
+                _this.unitJson[0].chapterInfo[0].taskJson[i].taskDetail = _task.taskDetail
                 // .replaceAll('任务'+(i+1),'').replaceAll('任务'+_this.numberToChinese(i+1),'').replaceAll(':','').replaceAll(':','')
                 _this.unitJson[0].chapterInfo[0].taskJson[i].isFold = 0
               }else {
                 _this.unitJson[0].chapterInfo[0].taskJson.push({
                   task: _task.task,
                   // .replaceAll('任务'+(i+1),'').replaceAll('任务'+_this.numberToChinese(i+1),'').replaceAll(':','').replaceAll(':',''),
-                  taskDetail: "",
+                  taskDetail: _task.taskDetail,
                   taskDetail2: "",
                   taskDetail3: "",
                   chapterData: [],
@@ -20412,10 +20464,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);
         });
     },
@@ -20641,7 +20693,7 @@ ${this.courseText && this.aiCallBack[0] == 2 ? '注意,优化原有的<参考
                 return el
               })
               _this.unitJson[0].chapterInfo[0].taskJson[index].eList = _task.elist
-              _this.unitJson[0].chapterInfo[0].taskJson[index].chapterData = []
+              // _this.unitJson[0].chapterInfo[0].taskJson[index].chapterData = []
               if(!_task.toolChoose || (_task.detail && _task.detail.length < 20) || !_task.detail){
                 console.log("error_________________JSON不对重新生成");
                 _this.$message.error('哎呀,网络波动了...小可正在为您重新生成中...')
@@ -20765,7 +20817,7 @@ ${this.courseText && this.aiCallBack[0] == 2 ? '注意,优化原有的<参考
             }
             console.log(data.message);
             _this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail = tArray.detail
-            _this.unitJson[0].chapterInfo[0].taskJson[index].chapterData = []
+            // _this.unitJson[0].chapterInfo[0].taskJson[index].chapterData = []
             // _this.unitJson2 = JSON.parse(JSON.stringify(_this.unitJson))
             _this.$forceUpdate();
             _this.createTeacherAn(index);
@@ -20878,7 +20930,7 @@ ${this.courseText && this.aiCallBack[0] == 2 ? '注意,优化原有的<参考
           this.isTaskCancelSource1[index].close();
           this.isTaskCancelSource1[index] = null;
           this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail = _mdText;
-          this.unitJson[0].chapterInfo[0].taskJson[index].chapterData = []
+          // this.unitJson[0].chapterInfo[0].taskJson[index].chapterData = []
           // this.createTeacherAn(index);
           this.taskGLoading[index][0] = false
           this.ttaskGLoading[index][0] = false
@@ -25296,6 +25348,7 @@ ${msg}
       const newWidth = startWidth + dx;
       if (newWidth >= 350 && newWidth <= maxWidth) {
         resizable.style.minWidth = `${newWidth}px`;
+        this.newWidth = newWidth;
       }
     };
 
@@ -25322,6 +25375,7 @@ ${msg}
       const newWidth = startWidth + dx;
       if (newWidth >= 350 && newWidth <= maxWidth2) {
         resizable.style.minWidth = `${newWidth}px`;
+        this.newWidth = newWidth;
       }
     };
 
@@ -26566,6 +26620,8 @@ ${msg}
   margin: 0 15px 0px auto;
   display: flex;
   align-items: center;
+  min-width: 175px;
+  justify-content: flex-end;
 }
 
 .chapter_upload_ic_l {
@@ -26632,13 +26688,25 @@ ${msg}
   text-overflow: ellipsis;
   white-space: nowrap;
   overflow: hidden;
-  width: 55%;
+  width: 100%;
   margin-left: 10px;
   cursor: pointer;
   margin-top: 2px;
   align-items: center;
 }
 
+.chapter_upload_n > .chapter_upload_box{
+  border: none;
+  outline: none;
+  max-width: 100%;
+  z-index: 99;
+  font-size: 14px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  color: #757575;
+}
+
 .chapter_upload_l_i2,
 .chapter_upload_l_i3,
 .chapter_upload_l_i8,
@@ -30136,4 +30204,15 @@ ol {
   font-size: 13px;
   color: #898989;
 }
+
+.stepBox {
+  position: relative; /* 确保子元素可以绝对定位 */
+}
+
+.confirmBtn{
+  z-index: 1000;
+  position: fixed;
+  /* right: 45px; */
+  bottom: 20px;
+}
 </style>

+ 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')) {

+ 181 - 0
src/components/pages/appStore/components/saveCard.vue

@@ -0,0 +1,181 @@
+<template>
+  <div class="saveCard">
+    <span>
+      <img v-if="icon" :src="icon">
+      {{ title }}
+    </span>
+    <div class="s_box">
+      <div v-for="(item,index) in data" :key="item.sid" @click="openAppUrl(item)" v-if="data.length>0 && item.id">
+        <div>
+          <svg
+            v-if="isImageOrSvg(typeof item.json =='object'?item.json.icon:'') === 0"
+            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>
+          <span
+            v-if="isImageOrSvg(typeof item.json =='object'?item.json.icon:'') === 1"
+            v-html="item.json.icon"
+          ></span>
+          <el-image
+            v-if="isImageOrSvg(typeof item.json =='object'?item.json.icon:'') === 2"
+            style="width: 100%; height: 100%"
+            :src="item.json.icon"
+            fit="cover"
+          ></el-image>
+        </div>
+        <span>{{item.name}}</span>
+      </div>
+			<span v-if="data.length==0">暂无数据...</span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    title: {
+      type: String,
+      default: "标题"
+    },
+    data: {
+      type: Array,
+      default: () => []
+    },
+		type:{
+			type:Number,
+			default:0
+		},
+    icon:{
+      type:String,
+      default:''
+    }
+  },
+  data() {
+    return {};
+  },
+  computed: {
+    isImageOrSvg() {
+      return value => {
+        let _result = 0; //啥也不是
+        if (value) {
+          const svgPattern = /<svg.*<\/svg>/;
+          const imagePattern = /\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i; // 图片链接的正则表达式
+          const urlPattern = /^(http|https):\/\/[^ "]+$/; // 网络地址的正则表达式
+
+          if (svgPattern.test(value)) {
+            _result = 1;
+          } else if (urlPattern.test(value) && imagePattern.test(value)) {
+            _result = 2;
+          }
+        }
+        return _result;
+      };
+    }
+  },
+	methods: {
+		openAppUrl(item){
+			this.$emit("saveClick",item,this.type)
+			// window.open(item.url, "_blank");
+		}
+	},
+};
+</script>
+
+<style scoped>
+.saveCard {
+  width: 100%;
+  height: auto;
+  margin-bottom: 10px;
+  box-sizing: border-box;
+  padding: 10px;
+}
+
+.saveCard > span {
+  font-size: 16px;
+  font-weight: 400;
+  display: flex;
+  color: #00000066;
+  align-items: center;
+  margin-left: 0px;
+}
+
+.saveCard >span >img{
+  width: 20px;
+  height: 20px;
+  margin-right: 5px;
+}
+
+.s_box {
+  width: 100%;
+  height: auto;
+	padding-top: 15px;
+}
+
+.s_box>div{
+	width: 100%;
+	height: 30px;
+  margin-top: 10px;
+	margin-bottom: 15px;
+	display: flex;
+	align-items: center;
+	border-radius: 5px;
+	cursor: pointer;
+	transition: .1s;
+}
+
+/* .s_box>div:hover{
+	background-color: aliceblue;
+} */
+
+.s_box>div>div{
+	width: 22px;
+	height: 22px;
+	box-sizing: border-box;
+  border-radius: 50%;
+  overflow: hidden;
+  margin-right: 10px;
+  margin-left: 15px;
+}
+
+.s_box>div>div>svg{
+	width: 100%;
+	height: 100%;
+}
+
+.s_box>div>div>span>>>svg{
+	width: 100%;
+	height: 100%;
+}
+
+
+.s_box>div>span{
+	max-width: calc(100% - 46px);
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+  font-size: 16px;
+  font-weight: 400;
+  color: #000000E5;
+}
+
+.s_box>span{
+	font-size: .8em;
+}
+</style>

+ 314 - 60
src/components/pages/appStore/dialog/addAppDialog.vue

@@ -18,25 +18,91 @@
       </div>
       <div class="bfd_box" v-loading="loading" label-position="top">
         <el-form :model="form" :rules="rules" ref="ruleForm">
-          <el-form-item label="应用名称" prop="nname">
+          <div
+            style="display: flex;width: 100%;justify-content: space-between;align-items: center;"
+          >
+            <el-form-item label="应用图标" prop="icon">
+              <el-input
+                v-model="form.json.icon"
+                placeholder="请输入应用图标(可直接粘贴链接或者点击右侧图标上传图片)"
+                style="width: 500px;"
+              ></el-input>
+            </el-form-item>
+
+            <div
+              class="bfd_icon"
+              v-loading="uploadIconLoading"
+              @click="uploadIcon()"
+            >
+              <!-- svg -->
+              <span
+                v-html="form.json.icon"
+                v-if="isImageOrSvg(form.json.icon) === 1"
+              ></span>
+              <!-- 默认图标 -->
+              <svg
+                v-if="isImageOrSvg(form.json.icon) === 0"
+                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>
+              <!-- 网络图片 -->
+              <el-image
+                v-if="isImageOrSvg(form.json.icon) === 2"
+                style="width: 100%; height: 100%"
+                :src="form.json.icon"
+                fit="cover"
+              ></el-image>
+            </div>
+          </div>
+          <el-form-item label="应用名称" prop="name">
             <el-input
-              v-model="form.nname"
+              v-model="form.name"
               placeholder="请输入应用名称"
             ></el-input>
           </el-form-item>
           <div
             style="display: flex;width: 100%;justify-content: space-between;"
           >
-            <el-form-item label="应用标签" prop="nlabel">
-              <el-input
-                v-model="form.nlabel"
+            <el-form-item label="应用标签" prop="label">
+              <!-- <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="ntype">
+            <el-form-item label="应用类型" prop="type">
               <el-select
-                v-model="form.ntype"
+                v-model="form.type"
                 placeholder="请选择应用类型"
                 style="width: 300px;"
               >
@@ -50,16 +116,16 @@
               </el-select>
             </el-form-item>
           </div>
-          <el-form-item label="应用链接" prop="nurl">
+          <el-form-item label="应用链接" prop="url">
             <el-input
-              v-model="form.nurl"
+              v-model="form.url"
               placeholder="请输入应用链接"
             ></el-input>
           </el-form-item>
-          <el-form-item label="应用简介" prop="ndetail">
+          <el-form-item label="应用简介" prop="detail">
             <el-input
               type="textarea"
-              v-model="form.ndetail"
+              v-model="form.detail"
               style="width: 100%;"
               :rows="3"
               resize="none"
@@ -67,38 +133,57 @@
             ></el-input>
           </el-form-item>
           <el-form-item
-            label="权限管理"
+            label="可见范围"
             style="display: flex;flex-direction: column;align-items: flex-start;"
           >
-            <el-radio-group v-model="form.njuri">
+            <el-radio-group v-model="form.juri">
               <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.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;">
+              <el-radio label="0" class="radioItem">仅体验(用户仅能使用,不可查看设置内容)</el-radio>
+              <el-radio label="1" class="radioItem">允许其他用户复制并进行二次创作</el-radio>
+            </el-radio-group>
+          </el-form-item>
         </el-form>
       </div>
       <div class="bfd_bottom">
         <el-button @click="close()">取消</el-button>
-        <el-button type="primary" @click="submitBtn('ruleForm')">保存</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("请输入有效的链接"));
-		}
-	}
-}
+  if (value) {
+    // 验证链接是否有效
+    try {
+      new URL(value);
+      callback();
+    } catch (error) {
+      return callback(new Error("请输入有效的链接"));
+    }
+  }
+};
 export default {
   props: {
     typeList: {
@@ -112,50 +197,125 @@ export default {
     return {
       loading: false,
       show: false,
+      uploadIconLoading: false,
       type: 1, //1添加,2编辑
+      selectLabelList:[
+        {value:"agent",label:"智能体"},
+        {value:"workflow",label:"工作流"},
+      ],
       form: {
-        nname: "",
-        nlabel: "",
-        ndetail: "",
-        nurl: "",
-        ntype: "",
-        njuri: "1",
-        nstand: "hk",
-        njson: ""
+        name: "",
+        label: "",
+        detail: "",
+        url: "",
+        type: "",
+        juri: "1",
+        stand: "hk",
+        json: {
+          icon: "",
+          copy: "0",
+          status:"",
+          model:""
+        }
       },
       rules: {
-        nname: [{ required: true, message: "请输入应用名称", trigger: "blur" }],
-        nurl: [{ required: true, message: "请输入应用链接", trigger: "blur" }],
-        nlabel: [
-          { required: true, message: "请输入应用标签", trigger: "blur" }
-        ],
-        ntype: [{ required: true, message: "请选择应用类型", trigger: "blur" }],
+        name: [{ required: true, message: "请输入应用名称", trigger: "blur" }],
+        url: [{ required: true, message: "请输入应用链接", trigger: "blur" }],
+        // nlabel: [
+        //   { required: true, message: "请输入应用标签", trigger: "blur" }
+        // ],
+        type: [{ required: true, message: "请选择应用类型", trigger: "blur" }],
         // ndetail:[{required:true,message:"请输入应用简介",trigger:"blur"}],
-        njuri: [{ required: true, message: "请选择权限管理", trigger: "blur" }],
-				nurl: [{ required: true, message: "请输入应用链接", trigger: "blur" },{ validator: validUrl, trigger: "blur" }]
+        juri: [{ required: true, message: "请选择权限管理", trigger: "blur" }],
+        url: [
+          { required: true, message: "请输入应用链接", trigger: "blur" },
+          { validator: validUrl, trigger: "blur" }
+        ]
       }
     };
   },
+  computed: {
+    isImageOrSvg() {
+      return value => {
+        let _result = 0; //啥也不是
+        if (value) {
+          const svgPattern = /<svg.*<\/svg>/;
+          const imagePattern = /\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i; // 图片链接的正则表达式
+          const urlPattern = /^(http|https):\/\/[^ "]+$/; // 网络地址的正则表达式
+
+          if (svgPattern.test(value)) {
+            _result = 1;
+          } else if (urlPattern.test(value) && imagePattern.test(value)) {
+            _result = 2;
+          }
+        }
+        return _result;
+      };
+    }
+  },
   methods: {
     open(data) {
       if (data && data.type === 2) {
-        this.form = data.form;
+        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.status){
+					data.form.json.status = ""
+				}
+
+        this.form = JSON.parse(JSON.stringify(data.form));
         this.type = data.type;
       } else {
         this.form = {
-          nname: "",
-          nlabel: "",
-          ndetail: "",
-          nurl: "",
-          ntype: "",
-          njuri: "1",
-          nstand: "hk",
-          njson: ""
+          name: "",
+          label: "",
+          detail: "",
+          url: "",
+          type: "",
+          juri: "1",
+          stand: "hk",
+          json: {
+            icon: "",
+            copy: "0",
+            status:"",
+            model:""
+          }
         };
       }
       this.loading = false;
+      this.uploadIconLoading = false;
       this.show = true;
     },
+    uploadIcon() {
+      if (this.uploadIconLoading) return this.$message.info("请稍等...");
+      const input = document.createElement("input");
+      input.type = "file";
+      input.accept =
+        "image/jpeg, image/jpg, image/gif, image/png, image/svg+xml";
+      input.onchange = async event => {
+        const file = event.target.files[0];
+        this.uploadIconLoading = true;
+        const validImageTypes = /\.(jpeg|jpg|gif|png|svg)$/i; // 定义有效的图片类型正则表达式
+
+        if (validImageTypes.test(file.name)) {
+          let url = await this.uploadFile(file);
+          if (url) {
+            this.form.json.icon = url;
+          }
+          this.uploadIconLoading = false;
+        } else {
+          this.$message.error("请上传有效的图片文件!(jpeg|jpg|gif|png|svg)"); // 提示用户上传有效的图片
+        }
+      };
+      input.click();
+    },
     close(flag = false) {
       if (this.loading && !flag) return this.$message.info("请稍等...");
       this.show = false;
@@ -163,14 +323,19 @@ export default {
     },
     init() {
       this.form = {
-        nname: "",
-        nlabel: "",
-        ndetail: "",
-        nurl: "",
-        ntype: "",
-        njuri: "1",
-        nstand: "hk",
-        njson: ""
+        name: "",
+        label: "",
+        detail: "",
+        url: "",
+        type: "",
+        juri: "1",
+        stand: "hk",
+        json: {
+          icon: "",
+          copy: "0",
+          status:"",
+          model:""
+        }
       };
       this.loading = false;
     },
@@ -182,6 +347,54 @@ export default {
           this.$emit("success", this.form, this.type);
         }
       });
+    },
+    uploadFile(file) {
+      return new Promise(resolve => {
+        var credentials = {
+          accessKeyId: "AKIATLPEDU37QV5CHLMH",
+          secretAccessKey: "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"
+        }; //秘钥形式的登录上传
+        window.AWS.config.update(credentials);
+        window.AWS.config.region = "cn-northwest-1"; //设置区域
+
+        var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
+        var _this = this;
+
+        if (file) {
+          // this.loading = true;
+          var params = {
+            Key:
+              file.name.split(".")[0] +
+              new Date().getTime() +
+              "." +
+              file.name.split(".")[file.name.split(".").length - 1],
+            ContentType: file.type,
+            Body: file,
+            "Access-Control-Allow-Credentials": "*",
+            ACL: "public-read"
+          }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
+          var options = {
+            partSize: 2048 * 1024 * 1024,
+            queueSize: 2,
+            leavePartsOnError: true
+          };
+          bucket
+            .upload(params, options)
+            .on("httpUploadProgress", function(evt) {
+              //这里可以写进度条
+              // _this.progressData.value = parseInt((evt.loaded * 100) / evt.total);
+              // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
+            })
+            .send(function(err, data) {
+              if (err) {
+                _this.$message.error("上传失败");
+                resolve(0);
+              } else {
+                resolve(data.Location);
+              }
+            });
+        }
+      });
     }
   }
 };
@@ -191,7 +404,8 @@ export default {
 .addNewAppDialog >>> .el-dialog {
   min-width: 700px;
 
-  height: 680px;
+  height: 1020px;
+	/* height: 780px; */
   box-shadow: 0px 0 8px 0px #555555;
   border-radius: 8px;
   background-color: #fff;
@@ -206,6 +420,7 @@ export default {
   box-sizing: border-box;
   padding-bottom: 50px;
   padding-top: 10px;
+  overflow: auto;
 }
 .addNewAppDialog >>> .el-dialog__header {
   display: none !important;
@@ -257,4 +472,43 @@ export default {
   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>

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

@@ -0,0 +1,297 @@
+<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" }],
+        type: [{ 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"
+      }
+
+      if(!data.form.type){
+        data.form.type = this.typeList[0].id?this.typeList[0].id:''
+      }
+
+      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>

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

@@ -0,0 +1,337 @@
+<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"
+            >
+            <i
+                slot="suffix"
+                class="searchInputIcon el-icon-search"
+                @click="getData"
+              ></i>
+          </el-input>
+        </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:[],
+    };
+  },
+  watch:{
+    search:{
+      immediate:false,
+      handler(){
+        if(this.search===""){
+          this.getData();
+        }
+      }
+    }
+  },
+  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站
+        status:''
+      };
+
+      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_item:hover .b_l_i_message>span{
+  color: #000000B8;
+}
+
+.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%;
+  border: 1px solid #E7E7E7;
+  border-radius: 4px;
+}
+
+.b_l_i_icon>svg{
+  width: 100%;
+  height: 100%;
+  border: 1px solid #E7E7E7;
+  border-radius: 4px;
+}
+
+.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;
+}
+
+.searchInputIcon {
+  width: 20px;
+  height: 20px;
+  position: relative;
+  top: 10px;
+  right: 5px;
+  font-size: 19px;
+  cursor: pointer;
+  color: #666666;
+}
+</style>

+ 18 - 415
src/components/pages/appStore/index.vue

@@ -1,166 +1,25 @@
 <template>
   <div class="appCenter">
-    <div class="ac_header">
-      <div class="ac_h_top">
-        <span>应用管理</span>
-
-        <el-button
-          type="primary"
-          size="small"
-          icon="el-icon-plus"
-          style="position: absolute;right: 15px;"
-          @click="addApp"
-          >添加应用</el-button
-        >
-      </div>
-      <div class="ac_h_bottom">
-        <div class="ac_h_b_selectList">
-          <el-input
-            v-model="searchText"
-            style="width: 200px;"
-            placeholder="请输入应用名称"
-            @keyup.enter.native="getData"
-          />
-          <el-select
-            v-model="selectJuri"
-            placeholder="请选择"
-            @change="changeSelectType"
-          >
-            <el-option
-              v-for="item in selectList"
-              :key="item.index"
-              :label="item.label"
-              :value="item.index"
-            ></el-option>
-          </el-select>
-          <el-button
-            type="primary"
-            style="margin-left: 10px;"
-            icon="el-icon-search"
-            @click="getData"
-          ></el-button>
-          <el-button type="primary" @click="resetData">重置</el-button>
-        </div>
-
-        <div class="ac_h_b_typeList">
-          <span
-            :class="{ ac_h_b_typeList_active: showType === '' }"
-            @click="changeType('')"
-            >全部</span
-          >
-          <span
-            v-for="item in typeList"
-            :key="item.id"
-            :class="{ ac_h_b_typeList_active: showType === item.id }"
-            @click="changeType(item.id)"
-            >{{ item.name }}</span
-          >
-        </div>
-      </div>
-    </div>
-
-    <div class="ac_content">
-      <div class="ac_c_item" v-for="(item, index) in dataList" :key="item.id" @click="openApp(item.url)">
-        <div class="ac_c_i_top">
-          <div class="ac_c_i_t_left">
-            <svg
-              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="ac_c_i_t_right">
-            <div>{{ item.name }}</div>
-            <span>{{ item.label }}</span>
-          </div>
-					<div class="ac_c_i_t_popover" v-if="item.userid == userId">
-						<div class="ac_c_i_t_p_box" v-if="editAppCard === item.id" v-click-outside="handleBlur">
-							<div @click.stop="updateApp(item)">修改</div>
-						</div>
-						<svg t="1732786015570" @click.stop="updateCard(item.id)" 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>
-        <div class="ac_c_i_bottom">
-          <div>{{ item.detail }}</div>
-          <!-- <span @click="openApp(item.url)">{{ item.url }}</span> -->
-        </div>
-      </div>
-      <div class="ac_c_empty" v-if="dataList.length === 0">
-        <span>暂无数据...</span>
-      </div>
-    </div>
-    <addAppDialog
-      ref="addAppDialogRef"
-      :typeList="typeList"
-      @success="addAppSuccess"
-    />
+    <appManagement v-show="showCard === 0" ref="appManagementRef" @changeShowCard="changeShowCard"/>
+		<workSpace v-show="showCard === 1" ref="workSpaceRef" @changeShowCard="changeShowCard"/>
   </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 addAppDialog from "./dialog/addAppDialog.vue";
+import appManagement from './views/appManagement.vue';
+import workSpace from './views/workSpace.vue';
 export default {
   components: {
-    addAppDialog
-  },
-	directives: {
-    "click-outside": clickOutside // 注册自定义指令
+		appManagement,
+		workSpace
   },
+
   data() {
-    return {
-      showType: "",
-      searchText: "",
-      selectJuri: 3,
-      typeList: [],
-      selectList: [
-        { index: 1, label: "我的" },
-        { index: 2, label: "组织" },
-        { index: 3, label: "所有人" }
-      ],
-      userId: this.$route.query["userid"],
-      org: this.$route.query["org"],
-      oid: this.$route.query["oid"],
-      getDataLoading: false,
-      dataList: [],
-			editAppCard:null
-    };
+		return{
+			showCard:0,//0 应用中心  1:工作空间
+		}
   },
+<<<<<<< HEAD
   methods: {
     changeType(newIndex) {
       let flag = this.showType === newIndex;
@@ -326,6 +185,13 @@ export default {
     this.getTypeList();
     this.getData();
   }
+=======
+	methods: {
+		changeShowCard(newValue){
+			this.showCard = newValue;
+		}
+	},
+>>>>>>> beta
 };
 </script>
 
@@ -334,269 +200,6 @@ export default {
   width: 100vw;
   height: 100vh;
   background-color: #f2f4f7;
-  margin: 0;
   overflow: auto;
-  box-sizing: border-box;
-  padding: 20px;
-  display: flex;
-  flex-direction: column;
-}
-
-.ac_header {
-  width: 100%;
-  height: auto;
-  border-radius: 5px;
-  background-color: #fff;
-}
-
-.ac_h_top {
-  width: 100%;
-  height: 50px;
-  display: flex;
-  align-items: center;
-  box-sizing: border-box;
-  padding: 0 15px;
-  border-bottom: 1px solid #eeeeee;
-  position: relative;
-}
-
-.ac_h_top > span {
-  font-size: 26px;
-}
-
-.ac_h_bottom {
-  width: 100%;
-  height: auto;
-  padding: 10px 0 20px 0;
-}
-
-.ac_h_b_typeList {
-  width: 100%;
-  height: auto;
-  display: flex;
-  flex-wrap: wrap;
-  box-sizing: border-box;
-  padding: 0 15px;
-}
-
-.ac_h_b_typeList > span {
-  font-size: 18px;
-  margin-right: 20px;
-  margin-top: 10px;
-  margin-bottom: 5px;
-  cursor: pointer;
-}
-
-.ac_h_b_typeList_active {
-  color: #007aff;
-}
-
-.ac_h_b_selectList {
-  margin-left: 15px;
-  margin-bottom: 10px;
-}
-
-.ac_content {
-  width: 100%;
-  flex: 1;
-  height: auto;
-  margin-top: 20px;
-  overflow: auto;
-}
-
-.ac_c_item {
-  width: calc(100% / 5 - (15px * 4) / 5);
-  height: 250px;
-  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;
-	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_empty {
-  width: 100%;
-  height: 40%;
-  display: flex;
-  box-sizing: border-box;
-  padding-top: 2%;
-  justify-content: center;
-  /* align-items: center; */
-}
-
-.ac_c_i_top {
-  width: 100%;
-  height: 50px;
-  display: flex;
-	position: relative;
-  /* flex-direction: column; */
-  /* justify-content: space-evenly; */
-  /* background-color: red */
-}
-
-.ac_c_i_t_popover{
-	width: 30px;
-	height: 30px;
-	position: absolute;
-	right: 0;
-	top: 0;
-}
-
-.ac_c_i_t_popover svg{
-	width: 25px;
-	height: 25px;
-	cursor: pointer;
-}
-
-.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: .3s;
-	font-weight: bold;
-	font-size: 14px;
-	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;
-}
-
-.ac_c_i_t_left {
-  width: 50px;
-  height: 50px;
-  border-radius: 8px;
-  margin-right: 10px;
-  box-sizing: border-box;
-  padding: 5px;
-}
-
-.ac_c_i_t_left > svg {
-  width: 100%;
-  height: 100%;
-}
-
-.ac_c_i_t_right {
-  width: calc(100% - 60px);
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-  justify-content: space-evenly;
-}
-
-.ac_c_i_t_right > div {
-  font-size: 22px;
-  font-weight: bold;
-  max-width: 100%;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.ac_c_i_t_right > span {
-  font-size: 16px;
-  font-weight: bold;
-  color: #8991a1;
-  display: block;
-  max-width: 100%;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.ac_c_i_bottom {
-  width: 100%;
-  height: calc(100% - 60px);
-  margin-top: 15px;
-}
-
-.ac_c_i_bottom > div {
-  font-size: 20px;
-  color: #8991a1;
-  width: 100%;
-  height: calc(100% - 30px);
-  /* 第四行溢出显示... */
-  display: -webkit-box;
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  -webkit-line-clamp: 4;
-  -webkit-box-orient: vertical;
-}
-
-.ac_c_i_bottom > span {
-  margin-top: 5px;
-  font-size: 16px;
-  color: #409eff;
-  overflow: hidden;
-  display: block;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-
 </style>

+ 2089 - 0
src/components/pages/appStore/views/appManagement.vue

@@ -0,0 +1,2089 @@
+<template>
+  <div class="appManagement">
+    <div class="ac_left">
+      <div class="find">
+        <img src="../../../../assets/icon/appStore/find_icon.svg" />
+        <span>发现</span>
+      </div>
+      <saveCard
+        title="最近使用"
+        :data="recentUse"
+        :icon="require('../../../../assets/icon/appStore/history2_icon.svg')"
+        :type="1"
+        @saveClick="openApp"
+      />
+      <saveCard
+        title="我的收藏"
+        :icon="require('../../../../assets/icon/appStore/collect2_icon.svg')"
+        :data="collect"
+        :type="0"
+        @saveClick="openApp"
+      />
+    </div>
+    <div class="ac_right">
+      <div class="ac_header">
+        <!-- <div class="ac_h_top">
+          <span class="ac_h_t_active">
+            <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 @click="changeShowPage(1)">
+            <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> -->
+        <el-button
+          type="primary"
+          size="small"
+          icon="el-icon-plus"
+          v-show="false"
+          style="position: absolute;right: 15px;"
+          @click="addApp"
+          >添加应用</el-button
+        >
+        <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="changeType('')"
+              >全部</span
+            >
+            <span
+              v-for="item in typeList"
+              :key="item.id"
+              :class="{ ac_h_b_typeList_active: showType === item.id }"
+              @click="changeType(item.id)"
+              >{{ item.name }}</span
+            >
+          </div>
+          <div class="ac_h_b_selectList">
+            <el-select
+              v-model="selectJuri"
+              placeholder="请选择显示范围"
+              @change="changeSelectType"
+              style="width: 120px;margin-right: 10px;"
+            >
+              <el-option
+                v-for="item in selectList"
+                :key="item.index"
+                :label="item.label"
+                :value="item.index"
+              ></el-option>
+            </el-select>
+            <el-select
+              v-model="selectLabel"
+              placeholder="请选择类型"
+              @change="changeSelectType"
+              style="width: 110px;margin-right: 10px;"
+            >
+              <el-option
+                v-for="item in labelSelect"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+
+            <el-select
+              v-model="statusType"
+              placeholder="请选择状态"
+              @change="changeSelectType"
+              style="width: 110px;margin-right: 10px;"
+            >
+              <el-option
+                v-for="item in statusList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+
+            <el-input
+              v-model="searchText"
+              style="width: 250px;margin-right: 10px;"
+              placeholder="请输入应用名称"
+              @keyup.enter.native="getData"
+            >
+              <i
+                slot="suffix"
+                class="searchInputIcon el-icon-search"
+                @click="getData"
+              ></i>
+            </el-input>
+            <!-- <el-button
+              type="primary"
+              style="margin-left: 10px;"
+              icon="el-icon-search"
+              @click="getData"
+            ></el-button> -->
+            <el-button type="primary" @click="selectApp()">发布应用</el-button>
+          </div>
+        </div>
+      </div>
+
+      <div class="ac_content">
+        <div
+          class="ac_c_item"
+          v-if="showType !== '' && !getDataLoading"
+          v-for="(item, index) in dataList"
+          :key="item.id"
+        >
+          <div class="ac_c_i_top" @click="openApp(item)">
+            <div class="ac_c_i_t_left">
+              <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="ac_c_i_t_right">
+              <div class="ac_c_i_t_r_top">
+                <el-tooltip
+                  class="item"
+                  effect="light"
+                  :content="item.name"
+                  placement="top"
+                >
+                  <span>{{ item.name }}</span>
+                </el-tooltip>
+
+                <div class="ac_c_i_t_popover" v-if="showMenu(item)">
+                  <div
+                    class="ac_c_i_t_p_box"
+                    v-if="editAppCard === item.id"
+                    v-click-outside="handleBlur"
+                  >
+                    <div
+                      @click.stop="copyApp(item)"
+                      v-if="item.json && item.json.copy === '1'"
+                    >
+                      <img
+                        src="../../../../assets/icon/appStore/copy.svg"
+                        alt=""
+                      />
+                      <span>复制</span>
+                    </div>
+                    <div
+                      @click.stop="updateApp(item)"
+                      v-if="item.userid === userId"
+                    >
+                      <img
+                        src="../../../../assets/icon/appStore/edit.svg"
+                        alt=""
+                      />
+                      <span>修改</span>
+                    </div>
+                    <div
+                      @click.stop="delApp(item)"
+                      v-if="item.userid === userId"
+                    >
+                      <img
+                        src="../../../../assets/icon/appStore/del.svg"
+                        alt=""
+                      />
+                      <span>取消发布</span>
+                    </div>
+                  </div>
+                  <svg
+                    t="1732786015570"
+                    @click.stop="updateCard(item.id)"
+                    :style="
+                      `transform: rotate(${
+                        editAppCard === item.id ? '0deg' : '90deg'
+                      });background-color:${
+                        editAppCard === item.id ? '#F3F7FD' : '#fff'
+                      }`
+                    "
+                    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>
+              <div class="ac_c_i_t_r_center">
+                <span>@{{ item.username }}</span>
+                <div v-if="item.label === 'workflow'">
+                  <img
+                    src="../../../../assets/icon/appStore/workflow.svg"
+                    alt=""
+                  />
+                  工作流
+                </div>
+                <div v-if="item.label === 'agent'">
+                  <img
+                    src="../../../../assets/icon/appStore/agent.svg"
+                    alt=""
+                  />
+                  智能体
+                </div>
+              </div>
+              <div class="ac_c_i_t_r_bottom">
+                {{ item.detail }}
+              </div>
+            </div>
+          </div>
+          <div class="ac_c_i_bottom">
+            <div class="ac_c_i_b_left">
+              <el-tooltip
+                class="item"
+                effect="light"
+                content="被复制数"
+                placement="top"
+              >
+                <div>
+                  <img src="../../../../assets/icon/appStore/user_copy.svg" />
+                  <span>{{ item.copyCount }}</span>
+                </div>
+              </el-tooltip>
+              <el-tooltip
+                class="item"
+                effect="light"
+                :content="item.likeId ? '取消点赞' : '点赞'"
+                placement="top"
+              >
+                <div>
+                  <img
+                    :src="
+                      require('../../../../assets/icon/appStore/praise_default.svg')
+                    "
+                    v-if="!item.likeId"
+                    style="cursor: pointer;"
+                    @click="praiseFn(item, 0)"
+                  />
+                  <img
+                    :src="
+                      require('../../../../assets/icon/appStore/praise_active.svg')
+                    "
+                    v-else
+                    style="cursor: pointer;"
+                    @click="praiseFn(item, 1)"
+                  />
+                  <span>{{ item.likeCount }}</span>
+                </div>
+              </el-tooltip>
+              <el-tooltip
+                class="item"
+                effect="light"
+                :content="item.collectId ? '取消收藏' : '收藏'"
+                placement="top"
+              >
+                <div>
+                  <img
+                    src="../../../../assets/icon/appStore/collect_default.svg"
+                    v-if="!item.collectId"
+                    style="cursor: pointer;"
+                    @click="collectFn(item, 0)"
+                  />
+                  <img
+                    src="../../../../assets/icon/appStore/collect_active.svg"
+                    v-else
+                    style="cursor: pointer;"
+                    @click="collectFn(item, 1)"
+                  />
+                  <span>{{ item.collectCount }}</span>
+                </div>
+              </el-tooltip>
+            </div>
+            <div class="ac_c_i_b_right" v-if="item.json.status">
+              <span class="ac_c_i_b_r_type2" v-if="item.json.status === '1'"
+                >测试</span
+              >
+              <span class="ac_c_i_b_r_type1" v-if="item.json.status === '2'"
+                >稳定</span
+              >
+            </div>
+          </div>
+        </div>
+
+        <div class="ac_c_typeCard" v-if="showType == ''">
+          <div class="ac_c_tc_item" v-for="(item2, index2) in typeList">
+            <div class="ac_c_tc_i_top">
+              <div>{{ item2.name }}</div>
+
+              <span @click="changeType(item2.id)"
+                >查看更多
+                <img src="../../../../assets/icon/appStore/arrow.svg" />
+              </span>
+            </div>
+            <div class="ac_c_tc_i_bottom">
+              <div
+                class="ac_c_item"
+                v-if="index < 8"
+                v-for="(item, index) in dataList.filter(
+                  i => i.type == item2.id
+                )"
+                :key="item.id"
+              >
+                <div class="ac_c_i_top" @click="openApp(item)">
+                  <div class="ac_c_i_t_left">
+                    <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="ac_c_i_t_right">
+                    <div class="ac_c_i_t_r_top">
+                      <el-tooltip
+                        class="item"
+                        effect="light"
+                        :content="item.name"
+                        placement="top"
+                      >
+                        <span>{{ item.name }}</span>
+                      </el-tooltip>
+
+                      <div class="ac_c_i_t_popover" v-if="showMenu(item)">
+                        <div
+                          class="ac_c_i_t_p_box"
+                          v-if="editAppCard === item.id"
+                          v-click-outside="handleBlur"
+                        >
+                          <div
+                            @click.stop="copyApp(item)"
+                            v-if="item.json && item.json.copy === '1'"
+                          >
+                            <img
+                              src="../../../../assets/icon/appStore/copy.svg"
+                              alt=""
+                            />
+                            <span>复制</span>
+                          </div>
+                          <div
+                            @click.stop="updateApp(item)"
+                            v-if="item.userid === userId"
+                          >
+                            <img
+                              src="../../../../assets/icon/appStore/edit.svg"
+                              alt=""
+                            />
+                            <span>修改</span>
+                          </div>
+                          <div
+                            @click.stop="delApp(item)"
+                            v-if="item.userid === userId"
+                          >
+                            <img
+                              src="../../../../assets/icon/appStore/del.svg"
+                              alt=""
+                            />
+                            <span>取消发布</span>
+                          </div>
+                        </div>
+                        <svg
+                          t="1732786015570"
+                          @click.stop="updateCard(item.id)"
+                          :style="
+                            `transform: rotate(${
+                              editAppCard === item.id ? '0deg' : '90deg'
+                            });background-color:${
+                              editAppCard === item.id ? '#F3F7FD' : '#fff'
+                            }`
+                          "
+                          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>
+                    <div class="ac_c_i_t_r_center">
+                      <span>@{{ item.username }}</span>
+                      <div v-if="item.label === 'workflow'">
+                        <img
+                          src="../../../../assets/icon/appStore/workflow.svg"
+                          alt=""
+                        />
+                        工作流
+                      </div>
+                      <div v-if="item.label === 'agent'">
+                        <img
+                          src="../../../../assets/icon/appStore/agent.svg"
+                          alt=""
+                        />
+                        智能体
+                      </div>
+                    </div>
+                    <div class="ac_c_i_t_r_bottom">
+                      {{ item.detail }}
+                    </div>
+                  </div>
+                </div>
+                <div class="ac_c_i_bottom">
+                  <div class="ac_c_i_b_left">
+                    <el-tooltip
+                      class="item"
+                      effect="light"
+                      content="被复制数"
+                      placement="top"
+                    >
+                      <div>
+                        <img
+                          src="../../../../assets/icon/appStore/user_copy.svg"
+                        />
+                        <span>{{ item.copyCount }}</span>
+                      </div>
+                    </el-tooltip>
+                    <el-tooltip
+                      class="item"
+                      effect="light"
+                      :content="item.likeId ? '取消点赞' : '点赞'"
+                      placement="top"
+                    >
+                      <div>
+                        <img
+                          :src="
+                            require('../../../../assets/icon/appStore/praise_default.svg')
+                          "
+                          v-if="!item.likeId"
+                          style="cursor: pointer;"
+                          @click="praiseFn(item, 0)"
+                        />
+                        <img
+                          :src="
+                            require('../../../../assets/icon/appStore/praise_active.svg')
+                          "
+                          v-else
+                          style="cursor: pointer;"
+                          @click="praiseFn(item, 1)"
+                        />
+                        <span>{{ item.likeCount }}</span>
+                      </div>
+                    </el-tooltip>
+                    <el-tooltip
+                      class="item"
+                      effect="light"
+                      :content="item.collectId ? '取消收藏' : '收藏'"
+                      placement="top"
+                    >
+                      <div>
+                        <img
+                          src="../../../../assets/icon/appStore/collect_default.svg"
+                          v-if="!item.collectId"
+                          style="cursor: pointer;"
+                          @click="collectFn(item, 0)"
+                        />
+                        <img
+                          src="../../../../assets/icon/appStore/collect_active.svg"
+                          v-else
+                          style="cursor: pointer;"
+                          @click="collectFn(item, 1)"
+                        />
+                        <span>{{ item.collectCount }}</span>
+                      </div>
+                    </el-tooltip>
+                  </div>
+                  <div class="ac_c_i_b_right" v-if="item.json.status">
+                    <span
+                      class="ac_c_i_b_r_type2"
+                      v-if="item.json.status === '1'"
+                      >测试</span
+                    >
+                    <span
+                      class="ac_c_i_b_r_type1"
+                      v-if="item.json.status === '2'"
+                      >稳定</span
+                    >
+                  </div>
+                </div>
+              </div>
+              <div
+                class="ac_c_empty"
+                v-if="dataList.filter(i => i.type == item2.id).length === 0"
+              >
+                <span>暂无数据...</span>
+              </div>
+            </div>
+          </div>
+        </div>
+        <!-- <div
+          class="ac_c_item"
+          v-for="(item, index) in dataList"
+          :key="item.id"
+          @click="openApp(item)"
+        >
+          <div class="ac_c_i_top">
+            <div class="ac_c_i_t_left">
+              <svg
+                v-if="
+                  isImageOrSvg(
+                    typeof item.json == 'object' ? item.json.icon : ''
+                  ) === 0
+                "
+                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>
+              <span
+                v-if="
+                  isImageOrSvg(
+                    typeof item.json == 'object' ? item.json.icon : ''
+                  ) === 1
+                "
+                v-html="item.json.icon"
+              ></span>
+              <el-image
+                v-if="
+                  isImageOrSvg(
+                    typeof item.json == 'object' ? item.json.icon : ''
+                  ) === 2
+                "
+                style="width: 100%; height: 100%"
+                :src="item.json.icon"
+                fit="cover"
+              ></el-image>
+            </div>
+            <div class="ac_c_i_t_right">
+              <div>{{ item.name }}</div>
+              <span>{{ item.label}}</span>
+            </div>
+            <div class="ac_c_i_t_popover">
+              <div
+                class="ac_c_i_t_p_box"
+                v-if="editAppCard === item.id"
+                v-click-outside="handleBlur"
+              >
+                <div
+                  @click.stop="cancelCollectApp(item)"
+                  v-if="collect.map(i => i.id).includes(item.id)"
+                >
+                  取消收藏
+                </div>
+                <div @click.stop="collectApp(item)" v-else>收藏</div>
+                <div
+                  @click.stop="copyApp(item)"
+                  v-if="item.json && item.json.copy === '1'"
+                >
+                  复制
+                </div>
+                <div
+                  @click.stop="updateApp(item)"
+                  v-if="item.userid === userId"
+                >
+                  修改
+                </div>
+                <div @click.stop="delApp(item)" v-if="item.userid === userId">
+                  删除
+                </div>
+              </div>
+              <svg
+                t="1732786015570"
+                @click.stop="updateCard(item.id)"
+                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>
+          <div class="ac_c_i_bottom">
+            <div>{{ item.detail }}</div>
+          </div>
+        </div> -->
+        <div class="ac_c_empty" v-if="dataList.length === 0 && showType !== ''">
+          <span>暂无数据...</span>
+        </div>
+      </div>
+    </div>
+    <addAppDialog
+      ref="addAppDialogRef"
+      :typeList="typeList"
+      @success="addAppSuccess"
+    />
+    <selectAppDialog ref="selectAppDialogRef" @success="selectAppSuccess" />
+    <releaseAppDialog
+      ref="releaseAppDialogRef"
+      :typeList="typeList"
+      @success="releaseAppSuccess"
+    />
+  </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 addAppDialog from "../dialog/addAppDialog.vue";
+import saveCard from "../components/saveCard.vue";
+import selectAppDialog from "../dialog/selectAppDialog.vue";
+import releaseAppDialog from "../dialog/releaseAppDialog.vue";
+// import collectCard from "./dialog/collectCard.vue";
+// import recentUseCard from "./dialog/recentUseCard.vue";
+export default {
+  components: {
+    addAppDialog,
+    saveCard,
+    selectAppDialog,
+    releaseAppDialog
+    // collectCard,
+    // recentUseCard
+  },
+  directives: {
+    "click-outside": clickOutside // 注册自定义指令
+  },
+  data() {
+    return {
+      showType: "",
+      searchText: "",
+      selectJuri: 3,
+      selectLabel: "",
+      typeList: [],
+      selectList: [
+        { index: 3, label: "所有组织" },
+        { index: 2, label: "组织内" },
+        { index: 1, label: "我的" }
+        // { index: 98,label:"已发布"},
+        // { index: 99,label:"未发布"},
+      ],
+      statusList:[
+        {value:'',label:'所有状态'},
+        {value:1,label:"测试"},
+        {value:2,label:"稳定"}
+      ],
+      statusType:'',
+      labelSelect: [
+        { value: "", label: "所有类型" },
+        { value: "agent", label: "智能体" },
+        { value: "workflow", label: "工作流" }
+      ],
+      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: {
+    isImageOrSvg() {
+      return value => {
+        let _result = 0; //啥也不是
+        if (value) {
+          const svgPattern = /<svg.*<\/svg>/;
+          const imagePattern = /\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i; // 图片链接的正则表达式
+          const urlPattern = /^(http|https):\/\/[^ "]+$/; // 网络地址的正则表达式
+
+          if (svgPattern.test(value)) {
+            _result = 1;
+          } else if (urlPattern.test(value) && imagePattern.test(value)) {
+            _result = 2;
+          }
+        }
+        return _result;
+      };
+    },
+    showMenu() {
+      return data => {
+        let _result = false;
+        if (data && this.userId) {
+          if (
+            data.userid === this.userId ||
+            (data.json && data.json.copy === "1")
+          ) {
+            _result = true;
+          }
+        }
+        return _result;
+      };
+    }
+  },
+  watch: {
+    searchText: {
+      immediate:false,
+      handler() {
+        if (this.searchText === "") {
+          this.getData();
+        }
+      }
+    }
+  },
+  methods: {
+    changeType(newIndex) {
+      let flag = this.showType === newIndex;
+      this.showType = newIndex;
+      if (!flag) {
+        this.getData();
+      }
+    },
+    changeSelectType() {
+      this.getData();
+    },
+    getData() {
+      this.getDataLoading = true;
+      let params = {
+        uid: this.userId, //用户ID
+        name: this.searchText, //应用名称搜索
+        label: this.selectLabel, //应用的标签搜索
+        type: this.showType, //应用的类型
+        juri: this.selectJuri, //应用权限 1:我的  2:组织内  3:所有人
+        stand: "cn", //cn站还是hk站
+        status:this.statusType
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "select_appStore", params)
+        .then(res => {
+          this.getDataLoading = false;
+          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 = [];
+          }
+        })
+        .catch(err => {
+          this.getDataLoading = false;
+          console.log(err);
+          this.$message.error("获取应用失败");
+        });
+    },
+    addApp() {
+      this.$refs.addAppDialogRef.open({ type: 1 });
+    },
+    selectApp() {
+      this.$refs.selectAppDialogRef.open();
+    },
+    selectAppSuccess(data) {
+      if (data) {
+        this.$refs.selectAppDialogRef.close();
+        this.$refs.releaseAppDialogRef.open({
+          form: {
+            id: data.id,
+            name: data.name,
+            label: data.label,
+            detail: data.detail,
+            url: data.url,
+            type: data.type,
+            juri: data.juri,
+            stand: data.stand,
+            json: data.json
+          }
+        });
+      }
+    },
+    updateApp(data) {
+      this.$refs.addAppDialogRef.open({
+        type: 2,
+        form: {
+          id: data.id,
+          name: data.name,
+          label: data.label,
+          detail: data.detail,
+          url: data.url,
+          type: data.type,
+          juri: data.juri,
+          stand: data.stand,
+          json: data.json
+        }
+      });
+    },
+    // 收藏APP
+    // collectApp(item) {
+    //   this.editAppCard = null;
+    //   this.insertSave(item, 0);
+    // },
+    //复制app
+    copyApp(item) {
+      this.$confirm(`确定复制《${item.name}》这个应用至我的列表吗?`, "复制", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          let params = [
+            {
+              name: `${item.name}_copy`, //app名称
+              userid: this.userId, //创建的用户ID
+              label: item.label, //app标签
+              detail: item.detail, //app简介
+              url: item.url, //app链接
+              type: item.type, //app类型
+              juri: "1", //app权限 1:我的 2:组织 3:所有人
+              stand: "cn", //语言
+              json: JSON.stringify(item.json) //其他信息
+            }
+          ];
+          this.ajax
+            .post(this.$store.state.api + "insert_appStore", params)
+            .then(res => {
+              if (res.data) {
+                this.$message.success("复制成功,已添加至我的列表。");
+                this.getData();
+                this.insertSave(item, 3);
+              } else {
+                this.$message.error("复制失败");
+              }
+            })
+            .catch(err => {
+              console.log(err);
+              this.$message.error("复制失败");
+            });
+        })
+        .catch(_ => {
+          console.log("取消复制");
+        });
+    },
+    // 取消收藏
+    cancelCollectApp(item) {
+      this.editAppCard = null;
+      let _data = this.collect.find(i => i.id === item.id);
+      if (_data) {
+        let params = [
+          {
+            sid: _data.sid
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "delete_appStoreSave", params)
+          .then(res => {
+            if (res.data) {
+              this.$message.success("取消收藏成功");
+            }
+            this.getCollect();
+          })
+          .catch(e => {
+            console.log(e);
+            this.$message.error("取消收藏失败");
+            this.getCollect();
+          });
+      } else {
+        this.$message.error("取消收藏失败");
+        this.getCollect();
+      }
+    },
+    updateCard(id) {
+      if (this.editAppCard === id) return (this.editAppCard = null);
+      this.editAppCard = id;
+    },
+    handleBlur() {
+      this.updateCard(null);
+    },
+    addAppSuccess(data, type) {
+      if (type === 1) {
+        //添加
+        let params = [
+          {
+            name: data.name, //app名称
+            userid: this.userId, //创建的用户ID
+            label: data.label, //app标签
+            detail: data.detail, //app简介
+            url: data.url, //app链接
+            type: data.type, //app类型
+            juri: data.juri, //app权限 1:我的 2:组织 3:所有人
+            stand: "cn", //语言
+            json: JSON.stringify(data.json) //其他信息
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "insert_appStore", params)
+          .then(res => {
+            if (res.data[0][0]["id"]) {
+              this.$message.success("添加成功");
+              this.$refs.addAppDialogRef.close(true);
+              this.getData();
+            } else {
+              this.$message.error("添加失败");
+              this.$refs.addAppDialogRef.loading = false;
+            }
+          })
+          .catch(err => {
+            console.log(err);
+            this.$message.error("添加失败");
+          });
+      } else if (type === 2) {
+        let params = [
+          {
+            aid: data.id,
+            name: data.name, //app名称
+            userid: this.userId, //创建的用户ID
+            label: data.label, //app标签
+            detail: data.detail, //app简介
+            url: data.url, //app链接
+            type: data.type, //app类型
+            juri: data.juri, //app权限 1:我的 2:组织 3:所有人
+            stand: "cn", //语言
+            json: JSON.stringify(data.json) //其他信息
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "update_appStore", params)
+          .then(res => {
+            if (res.data) {
+              this.$message.success("修改成功");
+              this.$refs.addAppDialogRef.close(true);
+              this.getData();
+            } else {
+              this.$message.error("修改失败");
+              this.$refs.addAppDialogRef.loading = false;
+            }
+          })
+          .catch(err => {
+            console.log(err);
+            this.$message.error("修改失败");
+          });
+      }
+    },
+    releaseAppSuccess(data) {
+      this.$refs.releaseAppDialogRef.loading = true;
+      let params = [
+        {
+          aid: data.id,
+          name: data.name, //app名称
+          userid: this.userId, //创建的用户ID
+          label: data.label, //app标签
+          detail: data.detail, //app简介
+          url: data.url, //app链接
+          type: data.type, //app类型
+          juri: data.juri, //app权限 1:我的 2:组织 3:所有人
+          stand: "cn", //语言
+          json: JSON.stringify(data.json) //其他信息
+        }
+      ];
+      this.ajax
+        .post(this.$store.state.api + "update_appStore", params)
+        .then(res => {
+          if (res.data) {
+            this.$message.success("发布成功");
+            this.$refs.releaseAppDialogRef.close(true);
+          } else {
+            this.$message.error("发布失败");
+            this.$refs.releaseAppDialogRef.loading = false;
+          }
+          this.getData();
+        })
+        .catch(err => {
+          console.log(err);
+          this.$message.error("修改失败");
+        });
+    },
+    getTypeList() {
+      let params = {
+        suserid: this.userId, //用户ID
+        sorg: this.org,
+        soid: this.oid,
+        sstand: "cn"
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "select_appStoreType", params)
+        .then(res => {
+          let data = res.data[0];
+          if (data.length > 0) {
+            // data.forEach(i => {
+            //   if (i.open == undefined) {
+            //     i.open = true;
+            //   }
+            // });
+            this.typeList = data;
+          }
+        })
+        .catch(err => {
+          console.log(err);
+          this.$message.error("获取应用类型失败");
+        });
+    },
+    openApp(item, type = 0) {
+      window.open(item.url, "_blank");
+      if (
+        !(this.recentUse.length > 0 && item.id === this.recentUse[0].id) &&
+        type === 0
+      ) {
+        this.insertSave(item, 1);
+      }
+    },
+
+    resetData() {
+      this.searchText = "";
+      this.selectJuri = 3;
+      this.showType = "";
+      this.getData();
+    },
+    getRecentUse() {
+      let params = {
+        uid: this.userId,
+        type: 1,
+        limit: 10
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "select_appStoreSave", 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.recentUse = data;
+          } else {
+            this.recentUse = [];
+          }
+        })
+        .catch(err => {
+          console.log(err);
+          console.log("获取最近使用失败");
+          // this.$message.error("获取收藏应用失败")
+        });
+    },
+    getCollect() {
+      let params = {
+        uid: this.userId,
+        type: 0,
+        limit: 0
+      };
+      this.ajax
+        .get(this.$store.state.api + "select_appStoreSave", 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.collect = data;
+          } else {
+            this.collect = [];
+          }
+        })
+        .catch(err => {
+          console.log(err);
+          this.$message.error("获取收藏应用失败");
+        });
+    },
+    insertSave(item, type) {
+      return new Promise(resolve => {
+        let params = [
+          {
+            uid: this.userId,
+            type: type,
+            aid: item.id,
+            json: ""
+          }
+        ];
+
+        this.ajax
+          .post(this.$store.state.api + "insert_appStoreSave", params)
+          .then(res => {
+            if (res.data) {
+              if (type === 1) {
+                resolve(1);
+              }
+            }
+          })
+          .catch(err => {
+            resolve(0);
+            console.log(err);
+          });
+      });
+    },
+    delApp(item) {
+      this.$confirm(`确定要取消发布《${item.name}》这个应用吗!`, `确定取消发布应用`, {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          let params = [
+            {
+              uid: this.userId,
+              aid: item.id
+            }
+          ];
+          this.ajax
+            .post(this.$store.state.api + "delete_appStore", params)
+            .then(res => {
+              if (res.data) {
+                this.$message.success("取消发布成功");
+                this.getData();
+              } else {
+                this.$message.error("取消发布失败");
+              }
+              if (this.collect.findIndex(i => i.id == item.id) != -1) {
+                this.getCollect();
+              }
+            })
+            .catch(err => {
+              console.log(err);
+              this.$message.error("取消发布失败");
+            });
+        })
+        .catch(() => {
+          console.log("取消发布失败");
+        });
+    },
+    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);
+        });
+    },
+    praiseFn(item, type = 0) {
+      //点赞
+      if (type === 0) {
+        //点赞
+        let params = [
+          {
+            uid: this.userId,
+            type: 2,
+            aid: item.id,
+            json: ""
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "insert_appStoreSave", params)
+          .then(res => {
+            if (res.data) {
+              let _likeId = res.data[0][0].id;
+              this.dataList.find(i => i.id === item.id).likeCount += 1;
+              this.dataList.find(i => i.id === item.id).likeId = _likeId;
+              this.$message.success("点赞成功");
+            }
+          })
+          .catch(e => {
+            this.$message.error("点赞失败");
+          });
+      } else if (type === 1) {
+        //取消点赞
+        console.log("取消点赞👉:", item);
+        let params = [
+          {
+            sid: item.likeId
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "delete_appStoreSave", params)
+          .then(res => {
+            if (res.data) {
+              this.dataList.find(i => i.id === item.id).likeCount -= 1;
+              this.dataList.find(i => i.id === item.id).likeId = "";
+              this.$message.success("取消点赞成功");
+            }
+          })
+          .catch(e => {
+            console.log(e);
+            this.$message.error("取消点赞失败");
+          });
+      }
+    },
+    collectFn(item, type = 0) {
+      //收藏
+      if (type === 0) {
+        //收藏
+        console.log("收藏👉:", item);
+        let params = [
+          {
+            uid: this.userId,
+            type: 0,
+            aid: item.id,
+            json: ""
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "insert_appStoreSave", params)
+          .then(res => {
+            if (res.data) {
+              let _colletId = res.data[0][0].id;
+              this.dataList.find(i => i.id === item.id).collectCount += 1;
+              this.dataList.find(i => i.id === item.id).collectId = _colletId;
+              this.$message.success("收藏成功");
+            }
+            this.getCollect();
+          })
+          .catch(e => {
+            console.log(e);
+            this.getCollect();
+            this.$message.error("收藏失败");
+          });
+      } else if (type === 1) {
+        //取消收藏
+        console.log("取消收藏👉:", item);
+        let params = [
+          {
+            sid: item.collectId
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "delete_appStoreSave", params)
+          .then(res => {
+            if (res.data) {
+              this.dataList.find(i => i.id === item.id).collectCount -= 1;
+              this.dataList.find(i => i.id === item.id).collectId = "";
+              this.$message.success("取消收藏成功");
+            }
+            this.getCollect();
+          })
+          .catch(e => {
+            console.log(e);
+            this.$message.error("取消收藏失败");
+            this.getCollect();
+          });
+      }
+    }
+  },
+  mounted() {
+    this.getTypeList();
+    this.getData();
+    this.getCollect();
+    this.getRecentUse();
+    this.getBanner();
+  }
+};
+</script>
+
+<style scoped>
+.appManagement {
+  width: 100vw;
+  height: 100vh;
+  background-color: #f2f4f7;
+  margin: 0;
+  overflow: auto;
+  box-sizing: border-box;
+  /* padding: 20px; */
+  display: flex;
+  justify-content: space-between;
+}
+
+.ac_left {
+  /* width: 280px;
+  min-width: 280px; */
+  width: clamp(200px, 12vw, 280px);
+  min-width: 200px;
+  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;
+  padding-left: 20px;
+  overflow: auto;
+}
+
+.ac_left > .find {
+  width: 100%;
+  height: 45px;
+  background-color: #fff;
+  border-radius: 10px;
+  border: 1px solid #f3f7fd;
+  box-sizing: border-box;
+  padding: 0 20px 0 10px;
+  display: flex;
+  align-items: center;
+  /* box-shadow: 2px 2px 4px 0px #1D39830A; */
+  box-shadow: 0px 0px 4px 2px #1d39830a;
+  margin-bottom: 10px;
+  font-weight: bold;
+  font-size: 16px;
+  color: #000000e5;
+}
+
+.ac_left > .find > img {
+  width: 22px;
+  height: 22px;
+  margin-right: 10px;
+}
+
+.ac_right {
+  flex: 1;
+  min-width: 800px;
+  height: 100%;
+  overflow: auto;
+  display: flex;
+  padding-right: 10px;
+  padding-top: 10px;
+  box-sizing: border-box;
+  flex-direction: column;
+}
+
+.ac_header {
+  width: 100%;
+  height: auto;
+  border-radius: 5px;
+  /* box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); */
+  background-color: none;
+}
+
+.ac_h_top {
+  width: 100%;
+  height: 50px;
+  display: flex;
+  align-items: center;
+  box-sizing: border-box;
+  padding: 0 15px;
+  border-bottom: 1px solid #eeeeee;
+
+  position: relative;
+  justify-content: center;
+}
+
+.ac_h_top > span {
+  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 {
+  color: #0354d7;
+}
+
+.ac_h_t_active > svg {
+  fill: #0354d7 !important;
+}
+
+/* .ac_h_t_active::after {
+  content: "";
+  position: absolute;
+  width: 100%;
+  height: 3px;
+  border-radius: 4px;
+  background-color: #409eff;
+  left: 0;
+  bottom: -5px;
+} */
+
+.ac_h_banner {
+  width: 100%;
+  height: clamp(100px, 25vh, 350px);
+  /* height: 400px; */
+  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 15px 10px 15px;
+  box-sizing: border-box;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  border-bottom: solid 1px #e7e7e7;
+}
+
+.ac_h_b_typeList {
+  width: calc(100% - 400px);
+  height: auto;
+  display: flex;
+  flex-wrap: wrap;
+  box-sizing: border-box;
+}
+
+.ac_h_b_typeList > span {
+  font-size: 18px;
+  margin-right: 30px;
+  margin-top: 10px;
+  margin-bottom: 5px;
+  cursor: pointer;
+}
+
+.ac_h_b_typeList_active {
+  color: #007aff;
+  position: relative;
+}
+
+/*.ac_h_b_typeList_active::after {
+  content: "";
+  width: 80%;
+  height: 5px;
+  background-color: #007aff;
+  border-radius: 4px;
+  position: absolute;
+  top: 110%;·
+  left: 10%;
+}*/
+
+.ac_h_b_selectList {
+  margin-left: 15px;
+  margin-bottom: 10px;
+  display: flex;
+  align-items: center;
+}
+
+.ac_content {
+  width: 100%;
+  height: auto;
+  margin-top: 10px;
+  padding-bottom: 10px;
+}
+
+.ac_c_typeCard {
+  width: 100%;
+  height: auto;
+}
+
+.ac_c_item {
+  width: calc(100% / 4 - (15px * 4) / 4);
+  height: 260px;
+  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;
+  border: solid 1px #e7e7e7;
+  transition: 0.2s;
+
+  /* cursor: pointer; */
+}
+
+.ac_c_item:hover {
+  box-shadow: 0px 8px 10px -5px #00000014;
+
+  box-shadow: 0px 16px 24px 2px #0000000a;
+
+  box-shadow: 0px 6px 30px 5px #0000000d;
+}
+
+@media screen and (min-width: 1400px) {
+  .ac_c_item {
+    width: calc(100% / 4 - (15px * 3) / 4) !important;
+  }
+  .ac_c_item:nth-child(4n) {
+    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_empty {
+  width: 100%;
+  height: 40%;
+  display: flex;
+  box-sizing: border-box;
+  /* padding-top: 2%; */
+  justify-content: center;
+  color: #a1a1a1;
+  /* align-items: center; */
+}
+
+.ac_c_i_top {
+  width: 100%;
+  display: flex;
+  height: calc(100% - 40px - 10px);
+  cursor: pointer;
+}
+
+.ac_c_i_t_left {
+  width: 80px;
+  min-width: 80px;
+  height: 80px;
+  box-sizing: border-box;
+  display: flex;
+  align-items: flex-start;
+  box-sizing: border-box;
+  /* padding: 10px; */
+  margin-right: 10px;
+}
+
+.ac_c_i_t_left > svg {
+  width: 100%;
+  height: 80px;
+  border: 1px solid #e7e7e7;
+  border-radius: 4px;
+  box-sizing: border-box;
+}
+
+.ac_c_i_t_left > img {
+  width: 100%;
+  object-fit: cover;
+  height: 80px;
+  border: 1px solid #e7e7e7;
+  border-radius: 4px;
+  box-sizing: border-box;
+}
+
+.ac_c_i_t_right {
+  flex: 1;
+  width: calc(100% - 100px - 10px);
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+}
+
+.ac_c_i_t_right > div {
+  width: 100%;
+}
+
+.ac_c_i_t_r_top {
+  height: 40px;
+  display: flex;
+  align-items: flex-end;
+  justify-content: space-between;
+  position: relative;
+  font-weight: bold;
+  box-sizing: border-box;
+  padding-bottom: 2px;
+}
+
+.ac_c_i_t_r_top > span {
+  display: block;
+  max-width: 100%;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  font-size: 22px;
+}
+
+.ac_c_i_t_popover {
+  width: 30px;
+  height: 30px;
+  /* position: absolute; */
+  /* right: 0;
+  top: 0; */
+  z-index: 3;
+}
+
+.ac_c_i_t_popover svg {
+  width: 30px;
+  height: 30px;
+  box-sizing: border-box;
+  padding: 2.5px;
+  /* transform: rotate(90deg); */
+  cursor: pointer;
+  transition: 0.3s;
+  border-radius: 4px;
+}
+
+.ac_c_i_t_p_box {
+  position: absolute;
+  height: auto;
+  top: 100%;
+  right: 0;
+  padding: 8px;
+  border-radius: 8px 8px 8px 8px;
+  background-color: #fff;
+  /* box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); */
+  width: auto;
+  border: 1px solid #e7e7e7;
+}
+
+.ac_c_i_t_p_box > div {
+  width: 80px;
+  height: 30px;
+  cursor: pointer;
+  transition: 0.3s;
+  font-size: 0.7em;
+  border-radius: 5px;
+  font-weight: 100;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  position: relative;
+  box-sizing: border-box;
+}
+
+.ac_c_i_t_p_box > div > img {
+  width: 18px;
+  height: 18px;
+  margin-right: 10px;
+}
+
+.ac_c_i_t_p_box > div:hover {
+  background-color: #f2f4f7;
+}
+
+.ac_c_i_t_r_center {
+  height: 30px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin: 10px 0;
+}
+
+.ac_c_i_t_r_center > span {
+  display: block;
+  max-width: calc(100% - 80px);
+  white-space: nowrap;
+  overflow: hidden;
+  font-size: 18px;
+  color: #00000066;
+  text-overflow: ellipsis;
+}
+
+.ac_c_i_t_r_center > div {
+  width: 75px;
+  height: 85%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 16px;
+  background-color: #f3f3f3;
+  color: #00000066;
+  border-radius: 3px;
+}
+
+.ac_c_i_t_r_center > div > img {
+  width: 16px;
+  height: 16px;
+  margin-right: 4px;
+}
+
+.ac_c_i_t_r_bottom {
+  max-width: 100%;
+  max-height: calc(100% - 30px - 40px - 20px - 10px + 5px);
+  margin-top: 5px;
+  margin-bottom: 10px;
+  font-size: 16px;
+  color: #00000099;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 4;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.ac_c_i_bottom {
+  width: 100%;
+  height: 60px;
+  box-sizing: border-box;
+  border-top: solid 1px #e7e7e7;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.ac_c_i_b_left {
+  width: calc(100% - 60px);
+  display: flex;
+  align-items: center;
+  /* justify-content: space-between; */
+  overflow: auto;
+  height: 100%;
+}
+
+.ac_c_i_b_left > div {
+  margin-right: 20px;
+  display: flex;
+  align-items: center;
+}
+
+.ac_c_i_b_left > div > img {
+  width: 22px;
+  height: 22px;
+}
+
+.ac_c_i_b_left > div > span {
+  margin-left: 5px;
+  color: #00000099;
+  cursor: default;
+}
+
+.ac_c_i_b_right {
+  display: flex;
+  align-items: center;
+  width: 70px;
+  height: 70%;
+  justify-content: flex-end;
+}
+
+.ac_c_i_b_right > span {
+  width: 60px;
+  height: 100%;
+  border-radius: 4px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.ac_c_i_b_r_type1 {
+  background-color: #17c469;
+  color: #fff;
+}
+
+.ac_c_i_b_r_type2 {
+  background-color: #ffcf33;
+  color: #000;
+}
+
+.searchInputIcon {
+  width: 20px;
+  height: 20px;
+  position: relative;
+  top: 10px;
+  right: 5px;
+  font-size: 19px;
+  cursor: pointer;
+}
+
+.ac_c_tc_item {
+  width: 100%;
+  height: auto;
+}
+
+.ac_c_tc_i_top {
+  width: 100%;
+  height: 40px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+  box-sizing: border-box;
+  padding: 0 20px;
+  /* background-color: red; */
+}
+
+.ac_c_tc_i_top > div {
+  font-size: 26px;
+}
+
+.ac_c_tc_i_top > span {
+  display: flex;
+  align-items: center;
+  color: #a2a2a2;
+  font-size: 16px;
+  cursor: pointer;
+}
+
+.ac_c_tc_i_top > span > img {
+  width: 18px;
+  height: 18px;
+  margin-left: 5px;
+  /*transform: rotate(90deg);*/
+  transition: 0.3s;
+}
+
+/* .ac_c_i_top {
+  width: 100%;
+  height: 50px;
+  display: flex;
+  position: relative;
+}
+
+.ac_c_i_t_popover {
+  width: 30px;
+  height: 30px;
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+
+.ac_c_i_t_popover svg {
+  width: 25px;
+  height: 25px;
+  cursor: pointer;
+}
+
+.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;
+}
+
+.ac_c_i_t_left {
+  width: 50px;
+  height: 50px;
+  border-radius: 8px;
+  margin-right: 10px;
+  box-sizing: border-box;
+  padding: 5px;
+}
+
+.ac_c_i_t_left > svg {
+  width: 100%;
+  height: 100%;
+}
+
+.ac_c_i_t_left > span {
+  width: 100%;
+  height: 100%;
+  display: block;
+}
+
+.ac_c_i_t_left > span >>> svg {
+  width: 100%;
+  height: 100%;
+}
+
+.ac_c_i_t_right {
+  width: calc(100% - 60px);
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-evenly;
+}
+
+.ac_c_i_t_right > div {
+  font-size: 1.4em;
+  font-weight: bold;
+  max-width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.ac_c_i_t_right > span {
+  font-size: 1.1em;
+  color: #8991a1;
+  display: block;
+  max-width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.ac_c_i_bottom {
+  width: 100%;
+  height: calc(100% - 60px);
+  margin-top: 15px;
+}
+
+.ac_c_i_bottom > div {
+  font-size: 1em;
+  color: #8991a1;
+  width: 100%;
+  height: calc(100%);
+  display: -webkit-box;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 8;
+  -webkit-box-orient: vertical;
+}
+
+.ac_c_i_bottom > span {
+  margin-top: 5px;
+  font-size: 1em;
+  color: #409eff;
+  overflow: hidden;
+  display: block;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  cursor: pointer;
+} */
+</style>

+ 637 - 0
src/components/pages/appStore/views/workSpace.vue

@@ -0,0 +1,637 @@
+<template>
+  <div class="workSpace">
+    <div class="ac_left">
+      <saveCard
+        title="最近使用"
+        :data="recentUse"
+        :type="0"
+        @saveClick="openApp"
+      />
+      <saveCard title="收藏" :data="collect" :type="1" @saveClick="openApp" />
+    </div>
+    <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 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 {
+  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>
+
+<style scoped>
+.workSpace {
+  width: 100vw;
+  height: 100vh;
+  background-color: #f2f4f7;
+  margin: 0;
+  overflow: auto;
+  box-sizing: border-box;
+  padding: 20px;
+  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;
+  box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+  background-color: #fff;
+}
+
+.ac_h_top {
+  width: 100%;
+  height: 50px;
+  display: flex;
+  align-items: center;
+  box-sizing: border-box;
+  padding: 0 15px;
+  border-bottom: 1px solid #eeeeee;
+
+  position: relative;
+  justify-content: center;
+}
+
+.ac_h_top > span {
+  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 {
+  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 15px 10px 15px;
+  box-sizing: border-box;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.ac_h_b_typeList {
+  width: calc(100% - 666px);
+  height: auto;
+  display: flex;
+  flex-wrap: wrap;
+  box-sizing: border-box;
+  align-items: center;
+}
+
+.ac_h_b_typeList > span {
+  font-size: 18px;
+  margin-right: 20px;
+  margin-top: 10px;
+  margin-bottom: 5px;
+  cursor: pointer;
+}
+
+.ac_h_b_typeList_active {
+  color: #007aff;
+}
+
+.ac_h_b_selectList {
+  margin-left: 15px;
+  margin-bottom: 10px;
+  display: flex;
+  align-items: center;
+}
+
+.ac_content {
+  width: 100%;
+  flex: 1;
+  height: auto;
+  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,

+ 10 - 8
src/components/pages/classroomObservation/components/messageArea.vue

@@ -1175,22 +1175,24 @@ export default {
         return Promise.all(promises).then(res => {
           this.dialogTagList.splice(_index, 1);
           this.$message.success("删除分析分组成功");
+          this.dataList = this.dataList.filter(i=>!data.groupId.includes(i.id))
+          this.bmData.jsonData.dialogTagList = this.dialogTagList;
           this.saveData(this.bmData);
         });
       } else {
         this.dialogTagList.splice(_index, 1);
         this.$message.success("删除分析分组成功");
+        this.bmData.jsonData.dialogTagList = this.dialogTagList;
         return this.saveData(this.bmData);
       }
     },
     delAnalysisItem2(id) {
       return new Promise(resolve => {
-        let _index = this.dataList.findIndex(i => i.id == id);
-        if (_index > -1) {
-          let _data = this.dataList[_index];
+        let delData = this.dataList.find(i => i.id === id);
+        if (delData) {
           let params = {
-            id: _data.id,
-            type: _data.Type,
+            id: delData.id,
+            type: delData.Type,
             tid: this.tid
           };
           this.ajax
@@ -1199,7 +1201,7 @@ export default {
               params
             )
             .then(res => {
-              this.dataList.splice(_index, 1);
+              // this.dataList.splice(_index, 1);
               resolve();
             })
             .catch(e => {
@@ -1315,7 +1317,7 @@ export default {
 				this.isDrag = false;
 				this.loading = false;
 				// this.$message.success("更换成功")
-				return 
+				return
 			}
 
 			let _copyData = JSON.parse(JSON.stringify(this.dataList));
@@ -1323,7 +1325,7 @@ export default {
 			_copyData = _copyData.filter(i=>!(i.Type==0&&i.tIndex==2));
 
 			let _result = _copyData.map(i=>({id:i.id,tIndex:i.tIndex,Type:i.Type}));
-			
+
 			let params = {
 				data:JSON.stringify(_result)
 			}

+ 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>

+ 4 - 4
src/components/pages/components/exjsmind.vue

@@ -69,7 +69,7 @@ export default {
 
       let elements = this.$refs.jsm.getElementsByClassName("jsmind-inner")[0];
 
-      let sw = (815 / jm.view.size.w).toFixed(2);
+      let sw = (715 / jm.view.size.w).toFixed(2);
 
       elements.style.height = `${jm.view.size.h * sw}px`;
 
@@ -90,9 +90,9 @@ export default {
   /* align-items: center; */
   /* justify-content: center; */
   /* min-width: 20px; */
-  max-width: 250px;
-  overflow: hidden;
-  letter-spacing: 3px;
+  /* max-width: 250px; */
+  /* overflow: hidden; */
+  letter-spacing: 5px;
   font-size: 12px !important;
   /* flex-wrap: wrap; */
   /* white-space: wrap; */

Файловите разлики са ограничени, защото са твърде много
+ 387 - 391
src/components/pages/components/exportDataDialog.vue


+ 276 - 285
src/components/pages/components/exportWorksDialog.vue

@@ -88,7 +88,7 @@
           v-if="isStage(i.taskList)"
           class="stageCon"
         >
-          <div v-if="CState != 5" class="stageTit">
+          <div v-if="CState != 5 && CState != 6" class="stageTit">
             第{{ i.id * 1 + 1 }}阶段<span v-if="i.name">:{{ i.name }}</span>
           </div>
           <div
@@ -280,51 +280,90 @@
                   </div>
                 </div>
                 <div v-if="l.tool[0] == 45">
-                    <div class="toolBlk">
-                      <img
-                        src="../../../assets/icon/thirdToolList/choose.png"
-                        alt=""
-                      />
-                      <div class="toolTit">
-                        <div>工具{{ lind + 1 }}:选择题</div>
-                        <div>
-                          根据前期的了解与实地调研对于项目的了解,进行思考与讨论提出问题。
-                        </div>
+                  <div class="toolBlk">
+                    <img
+                      src="../../../assets/icon/thirdToolList/choose.png"
+                      alt=""
+                    />
+                    <div class="toolTit">
+                      <div>工具{{ lind + 1 }}:选择题</div>
+                      <div>
+                        根据前期的了解与实地调研对于项目的了解,进行思考与讨论提出问题。
                       </div>
                     </div>
+                  </div>
+                  <div
+                    v-for="(i, index) in l.content[0].testJson"
+                    :key="index + 'm'"
+                  >
+                    <div>
+                      题目:{{ i.teststitle }}
+                      <span
+                        v-if="
+                          JSON.stringify(l.content[0].radio[index]) ==
+                            JSON.stringify(i.answer)
+                        "
+                        style="color: #868ce4"
+                        >回答正确</span
+                      >
+                      <span v-else style="color: red">回答错误</span>
+                    </div>
                     <div
-                      v-for="(i, index) in l.content[0].testJson"
-                      :key="index + 'm'"
+                      v-if="i.type == 1"
+                      style="display: flex; flex-direction: column"
                     >
-                      <div>
-                        题目:{{ i.teststitle }}
-                        <span
-                          v-if="
-                            JSON.stringify(l.content[0].radio[index]) ==
-                              JSON.stringify(i.answer)
-                          "
-                          style="color: #868ce4"
-                          >回答正确</span
-                        >
-                        <span v-else style="color: red">回答错误</span>
-                      </div>
-                      <div
-                        v-if="i.type == 1"
-                        style="display: flex; flex-direction: column"
-                      >
-                        <el-radio-group v-model="l.content[0].radio[index]">
-                          <div class="radioBox">
-                            <el-radio
-                              v-for="(item2, checkIndex) in i.checkList"
-                              :key="checkIndex + 'b'"
-                              :label="checkIndex"
-                              disabled
-                              :class="[
-                                i.answer == checkIndex
-                                  ? 'redioStyle5'
-                                  : 'redioStyle2'
-                              ]"
+                      <el-radio-group v-model="l.content[0].radio[index]">
+                        <div class="radioBox">
+                          <el-radio
+                            v-for="(item2, checkIndex) in i.checkList"
+                            :key="checkIndex + 'b'"
+                            :label="checkIndex"
+                            disabled
+                            :class="[
+                              i.answer == checkIndex
+                                ? 'redioStyle5'
+                                : 'redioStyle2'
+                            ]"
+                          >
+                            <div
+                              v-if="
+                                item2 && item2.imgType && item2.imgType == 1
+                              "
                             >
+                              <div
+                                class="inImg"
+                                @click.stop="previewImg(item2.src)"
+                              >
+                                <img
+                                  style="display: block"
+                                  :src="item2.src"
+                                  alt=""
+                                />
+                              </div>
+                            </div>
+                            <span v-else v-html="item2"></span>
+                          </el-radio>
+                        </div>
+                      </el-radio-group>
+                    </div>
+                    <div class="radioBox">
+                      <el-checkbox-group
+                        v-model="l.content[0].radio[index]"
+                        v-if="i.type == '2'"
+                      >
+                        <div class="radioBox">
+                          <el-checkbox
+                            v-for="(item2, checkIndex) in i.checkList"
+                            :key="checkIndex + 'c'"
+                            :label="checkIndex"
+                            disabled
+                            :class="[
+                              i.answer.includes(checkIndex)
+                                ? 'redioStyle3'
+                                : 'redioStyle4'
+                            ]"
+                          >
+                            <div style="display: flex">
                               <div
                                 v-if="
                                   item2 && item2.imgType && item2.imgType == 1
@@ -342,115 +381,74 @@
                                 </div>
                               </div>
                               <span v-else v-html="item2"></span>
-                            </el-radio>
-                          </div>
-                        </el-radio-group>
-                      </div>
-                      <div class="radioBox">
-                        <el-checkbox-group
-                          v-model="l.content[0].radio[index]"
-                          v-if="i.type == '2'"
-                        >
-                          <div class="radioBox">
-                            <el-checkbox
-                              v-for="(item2, checkIndex) in i.checkList"
-                              :key="checkIndex + 'c'"
-                              :label="checkIndex"
-                              disabled
-                              :class="[
-                                i.answer.includes(checkIndex)
-                                  ? 'redioStyle3'
-                                  : 'redioStyle4'
-                              ]"
-                            >
-                              <div style="display: flex">
-                                <div
-                                  v-if="
-                                    item2 && item2.imgType && item2.imgType == 1
-                                  "
-                                >
-                                  <div
-                                    class="inImg"
-                                    @click.stop="previewImg(item2.src)"
-                                  >
-                                    <img
-                                      style="display: block"
-                                      :src="item2.src"
-                                      alt=""
-                                    />
-                                  </div>
-                                </div>
-                                <span v-else v-html="item2"></span>
-                              </div>
-                            </el-checkbox>
-                          </div>
-                        </el-checkbox-group>
-                      </div>
-                    </div>
-                  </div>
-                  <!-- 选择匹配 -->
-                  <div v-if="l.tool[0] == 41">
-                    <div class="toolBlk">
-                      <img
-                        class="toolImg"
-                        src="../../../assets/icon/thirdToolList/select.png"
-                        alt=""
-                      />
-                      <div class="toolTit">
-                        <div>工具{{ lind + 1 }}:选择匹配</div>
-                        <div>
-                          根据前期的了解与实地调研对于项目的了解,进行思考与讨论提出问题。
+                            </div>
+                          </el-checkbox>
                         </div>
-                      </div>
+                      </el-checkbox-group>
                     </div>
+                  </div>
+                </div>
+                <!-- 选择匹配 -->
+                <div v-if="l.tool[0] == 41">
+                  <div class="toolBlk">
                     <img
-                      @click.stop="previewImg(l.selectJson.url)"
-                      style="max-width: 200px"
-                      :src="l.selectJson.url"
+                      class="toolImg"
+                      src="../../../assets/icon/thirdToolList/select.png"
                       alt=""
                     />
-                    <div>
-                      <span style="margin-right: 10px">选项:</span
-                      ><span
-                        style="margin-right: 10px"
-                        v-for="(item, itInd) in l.selectJson.select"
-                        :key="itInd"
-                        >{{ item }}</span
-                      >
-                    </div>
-                    <div style="margin: 10px 0;">
-                      <span style="margin-right: 10px">回答:</span>
-
-                      <div
-                        style="margin-right: 10px"
-                        v-for="(item, itInd) in l.content[0]"
-                        :key="itInd"
-                      >
-                        选项{{ itInd + 1 }}:{{ l.selectJson.select[item] }}
-                        <span
-                          v-if="
-                            l.selectJson.answer[itInd] == l.content[0][itInd]
-                          "
-                          style="color: #868ce4"
-                          >回答正确</span
-                        >
-                        <span v-else style="color: red">回答错误</span>
+                    <div class="toolTit">
+                      <div>工具{{ lind + 1 }}:选择匹配</div>
+                      <div>
+                        根据前期的了解与实地调研对于项目的了解,进行思考与讨论提出问题。
                       </div>
                     </div>
-                    <div>
-                      <span style="margin-right: 10px">答案:</span>
+                  </div>
+                  <img
+                    @click.stop="previewImg(l.selectJson.url)"
+                    style="max-width: 200px"
+                    :src="l.selectJson.url"
+                    alt=""
+                  />
+                  <div>
+                    <span style="margin-right: 10px">选项:</span
+                    ><span
+                      style="margin-right: 10px"
+                      v-for="(item, itInd) in l.selectJson.select"
+                      :key="itInd"
+                      >{{ item }}</span
+                    >
+                  </div>
+                  <div style="margin: 10px 0;">
+                    <span style="margin-right: 10px">回答:</span>
 
+                    <div
+                      style="margin-right: 10px"
+                      v-for="(item, itInd) in l.content[0]"
+                      :key="itInd"
+                    >
+                      选项{{ itInd + 1 }}:{{ l.selectJson.select[item] }}
                       <span
-                        style="margin-right: 10px"
-                        v-for="(item, itInd) in l.selectJson.answer"
-                        :key="itInd"
-                        >选项{{ itInd + 1 }}:{{
-                          l.selectJson.select[item]
-                        }}</span
+                        v-if="l.selectJson.answer[itInd] == l.content[0][itInd]"
+                        style="color: #868ce4"
+                        >回答正确</span
                       >
+                      <span v-else style="color: red">回答错误</span>
                     </div>
                   </div>
-                  <!-- <div v-if="l.tool[0] == 41">
+                  <div>
+                    <span style="margin-right: 10px">答案:</span>
+
+                    <span
+                      style="margin-right: 10px"
+                      v-for="(item, itInd) in l.selectJson.answer"
+                      :key="itInd"
+                      >选项{{ itInd + 1 }}:{{
+                        l.selectJson.select[item]
+                      }}</span
+                    >
+                  </div>
+                </div>
+                <!-- <div v-if="l.tool[0] == 41">
                     <div class="toolBlk">
                       <img
                         src="../../../assets/icon/thirdToolList/select.png"
@@ -489,76 +487,76 @@
                     </div>
                   </div> -->
 
-                  <!-- 排序 -->
-                  <div v-if="l.tool[0] == 47">
-                    <div class="toolBlk">
-                      <img
-                        src="../../../assets/icon/fourthToolList/conSentences.png"
-                        alt=""
-                      />
-                      <div class="toolTit">
-                        <div>工具{{ lind + 1 }}:排序</div>
-                        <div>
-                          根据前期的了解与实地调研对于项目的了解,进行思考与讨论提出问题。
-                        </div>
+                <!-- 排序 -->
+                <div v-if="l.tool[0] == 47">
+                  <div class="toolBlk">
+                    <img
+                      src="../../../assets/icon/fourthToolList/conSentences.png"
+                      alt=""
+                    />
+                    <div class="toolTit">
+                      <div>工具{{ lind + 1 }}:排序</div>
+                      <div>
+                        根据前期的了解与实地调研对于项目的了解,进行思考与讨论提出问题。
                       </div>
                     </div>
+                  </div>
+                  <div
+                    v-for="(i, index) in l.content[0]"
+                    :key="index"
+                    style="margin-bottom: 10px"
+                  >
                     <div
-                      v-for="(i, index) in l.content[0]"
-                      :key="index"
-                      style="margin-bottom: 10px"
-                    >
-                      <div
-                        style="
+                      style="
                             height: 20px;
                             display: flex;
                             align-items: center;
                             flex-wrap: wrap;
                           "
+                    >
+                      题目:
+                      <div
+                        class="sortTool"
+                        v-for="(i, index) in i.addSentence"
+                        :key="index"
                       >
-                        题目:
-                        <div
-                          class="sortTool"
-                          v-for="(i, index) in i.addSentence"
-                          :key="index"
-                        >
-                          {{ i }}
-                        </div>
-                        <span
-                          v-if="
-                            JSON.stringify(i.chooseSenList) ==
-                              JSON.stringify(i.addSentence)
-                          "
-                          style="color: #868ce4"
-                          >回答正确</span
-                        >
-                        <span v-else style="color: red">回答错误</span>
+                        {{ i }}
                       </div>
-                      <div
-                        style="
+                      <span
+                        v-if="
+                          JSON.stringify(i.chooseSenList) ==
+                            JSON.stringify(i.addSentence)
+                        "
+                        style="color: #868ce4"
+                        >回答正确</span
+                      >
+                      <span v-else style="color: red">回答错误</span>
+                    </div>
+                    <div
+                      style="
                             margin: 10px 0;
                             display: flex;
                             align-items: center;
                             flex-wrap: wrap;
                           "
+                    >
+                      学生回答:
+                      <div
+                        class="sortTool"
+                        v-for="(i, index) in i.chooseSenList"
+                        :key="index"
                       >
-                        学生回答:
-                        <div
-                          class="sortTool"
-                          v-for="(i, index) in i.chooseSenList"
-                          :key="index"
-                        >
-                          {{ i }}
-                        </div>
-                      </div>
-                      <div>
-                        答案:
-                        <span style="margin: 0 5px">{{
-                          i.addSentence.join(",")
-                        }}</span>
+                        {{ i }}
                       </div>
                     </div>
+                    <div>
+                      答案:
+                      <span style="margin: 0 5px">{{
+                        i.addSentence.join(",")
+                      }}</span>
+                    </div>
                   </div>
+                </div>
               </div>
 
               <!-- ai作业得分  -->
@@ -568,7 +566,7 @@
                     l.content.length &&
                     l.eList &&
                     l.eList.length &&
-                    CState == 5
+                    (CState == 5 || CState == 6)
                 "
                 class="taskSco"
               >
@@ -586,7 +584,7 @@
                 <div class="taskScoCon">
                   <!-- 分数详情与素养 -->
                   <div style="flex: 1; display: flex; flex-wrap: wrap">
-                    <div style="width: 375px; margin:0 20px 10px 0">
+                    <div style="width: 315px; margin:0 20px 10px 0">
                       <div class="taskScoConTit">分数详情</div>
                       <div
                         v-for="(wItem, ind) in l.eList"
@@ -622,16 +620,16 @@
                       <div class="taskScoConTit">素养</div>
                       <div class="WorkConSY">
                         <div v-for="(wItem, ind) in l.eList" :key="ind + 's'">
-                          <el-tooltip
+                          <!-- <el-tooltip
                             class="item"
                             effect="dark"
-                            :content="wItem.detail"
+                            :content="wItem.target"
                             placement="top-start"
-                          >
+                          > -->
                             <div class="RootImgBlockSy">
                               {{ wItem.target }}
                             </div>
-                          </el-tooltip>
+                          <!-- </el-tooltip> -->
                         </div>
                       </div>
                     </div>
@@ -655,13 +653,14 @@
                   </div>
                 </div>
               </div>
-             
+
               <!-- 阶段  -->
               <div
                 v-if="
-                    l.eList &&
+                  l.eList &&
                     l.eList.length &&
-                    CState != 5 && 
+                    CState != 5 &&
+                    CState != 6 &&
                     lind == k.toolEList.length - 1
                 "
                 class="taskSco"
@@ -680,7 +679,7 @@
                 <div class="taskScoCon">
                   <!-- 分数详情与素养 -->
                   <div style="flex: 1; display: flex; flex-wrap: wrap">
-                    <div style="width: 375px; margin:0 20px 10px 0">
+                    <div style="width: 315px; margin:0 20px 10px 0">
                       <div class="taskScoConTit">分数详情</div>
                       <div
                         v-for="(wItem, ind) in l.eList"
@@ -722,10 +721,12 @@
                             :content="wItem.target[wItem.target.length - 1]"
                             placement="top-start"
                           > -->
-                            <div class="RootImgBlockSy">
-                              <span v-if="wItem.target && wItem.target.length"> {{ wItem.target[wItem.target.length - 1] }}</span>
-                              <span v-else> {{ wItem.target }}</span>
-                            </div>
+                          <div class="RootImgBlockSy">
+                            <span v-if="wItem.target && wItem.target.length">
+                              {{ wItem.target[wItem.target.length - 1] }}</span
+                            >
+                            <span v-else> {{ wItem.target }}</span>
+                          </div>
                           <!-- </el-tooltip> -->
                         </div>
                       </div>
@@ -750,16 +751,15 @@
                   </div>
                 </div>
               </div>
-
             </div>
-          
+
             <!-- 思维导图 -->
-            <div v-if="CState == 5" class="taskTitInd">
+            <div v-if="CState == 5 || CState == 6" class="taskTitInd">
               <div></div>
               <span>任务评价体系</span>
             </div>
             <exjsmind
-              v-if="CState == 5"
+              v-if="CState == 5 || CState == 6"
               :treeData="k.treeData"
               :keyL="k.task.toString()"
             ></exjsmind>
@@ -859,15 +859,15 @@ export default {
     totalScore() {
       return function(val) {
         let valT = JSON.parse(JSON.stringify(val));
-        
+
         if (!valT) return "0.0";
 
         delete valT.content;
         delete valT.comment;
-        console.log('valT',JSON.parse(JSON.stringify(val)));
+        console.log("valT", JSON.parse(JSON.stringify(val)));
 
         let data = Object.values(valT);
-        console.log('data',JSON.parse(JSON.stringify(data)));
+        console.log("data", JSON.parse(JSON.stringify(data)));
 
         let new1 = data.reduce(function(pre, next, index) {
           return pre + next * 1;
@@ -878,22 +878,21 @@ export default {
         return (new1 / data.length).toFixed(1);
       };
     },
-    workTime(){
+    workTime() {
       return function(val) {
-        if (!val.length) return ''
-        let TimeList = []
-        val.forEach(e=>{
+        if (!val.length) return "";
+        let TimeList = [];
+        val.forEach(e => {
           if (e.time) {
             const timestamp = new Date(e.time).getTime();
-            TimeList.push(timestamp)
+            TimeList.push(timestamp);
           }
-        })
-
-        console.log('TimeList',TimeList);
-        TimeList.sort(function(a,b){
-          return a-b;//从小到大排序
-        })
+        });
 
+        console.log("TimeList", TimeList);
+        TimeList.sort(function(a, b) {
+          return a - b; //从小到大排序
+        });
 
         return this.convertToTimestamp(TimeList[0]);
       };
@@ -901,52 +900,43 @@ export default {
   },
 
   methods: {
-      // 时间戳转时间
-      convertToTimestamp(val) {
+    // 时间戳转时间
+    convertToTimestamp(val) {
       const date = new Date(val);
 
       // 使用Date对象的方法获取年、月、日、时、分、秒
       const year = date.getFullYear();
-      const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1
-      const day = String(date.getDate()).padStart(2, '0');
-      const hours = String(date.getHours()).padStart(2, '0');
-      const minutes = String(date.getMinutes()).padStart(2, '0');
-      const seconds = String(date.getSeconds()).padStart(2, '0');
+      const month = String(date.getMonth() + 1).padStart(2, "0"); // 月份从0开始,需要加1
+      const day = String(date.getDate()).padStart(2, "0");
+      const hours = String(date.getHours()).padStart(2, "0");
+      const minutes = String(date.getMinutes()).padStart(2, "0");
+      const seconds = String(date.getSeconds()).padStart(2, "0");
 
       // 格式化后的日期时间字符串
       const formattedDateTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-      
-      return formattedDateTime
+
+      return formattedDateTime;
     },
     // 下载pdf文件
     getPdf() {
       const content = this.$refs.reportPdf;
-
-      html2canvas(content).then(canvas => {
-
+      const dpi = 300;
+      html2canvas(content, {
+        dpi: dpi, // 设置截图的分辨率
+        scale: dpi / 96 // 设置截图缩放比例,以适应pdf的dpi
+      }).then(canvas => {
         var contentWidth = canvas.width;
         var contentHeight = canvas.height;
 
-      
-          //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
-          var imgWidth = 595.28;
-          var imgHeight = (592.28 / contentWidth) * contentHeight;
-
-          var imgData = canvas.toDataURL("image/jpeg", 1.0);
-
-        const pdf = new jspdf("p", "pt", [
-            imgWidth,
-            imgHeight
-        ]);
-
-        pdf.addImage(
-          imgData,
-          "PNG",
-          0,
-          0,
-          imgWidth,
-          imgHeight
-        );
+        //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
+        var imgWidth = 595.28;
+        var imgHeight = (592.28 / contentWidth) * contentHeight;
+
+        var imgData = canvas.toDataURL("image/jpeg", 1.0);
+
+        const pdf = new jspdf("p", "pt", [imgWidth, imgHeight]);
+
+        pdf.addImage(imgData, "PNG", 0, 0, imgWidth, imgHeight);
         pdf.save(
           this.worksDialogCon2.course +
             "-作业集-" +
@@ -954,42 +944,31 @@ export default {
             ".pdf"
         );
       });
-
-  
     },
 
     // 压缩pdf
     async getPdf2() {
-  
       const content = this.$refs.reportPdf;
 
       return new Promise((resolve, reject) => {
-        html2canvas(content)
+        const dpi = 300;
+        html2canvas(content, {
+          dpi: dpi, // 设置截图的分辨率
+          scale: dpi / 96 // 设置截图缩放比例,以适应pdf的dpi
+        })
           .then(canvas => {
-
             var contentWidth = canvas.width;
             var contentHeight = canvas.height;
 
-      
             //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
             var imgWidth = 595.28;
             var imgHeight = (592.28 / contentWidth) * contentHeight;
 
             var imgData = canvas.toDataURL("image/jpeg", 1.0);
-          
-            const pdf = new jspdf("p", "pt", [
-              imgWidth,
-              imgHeight
-            ]);
-
-            pdf.addImage(
-              imgData,
-              "PNG",
-              0,
-              0,
-              imgWidth,
-              imgHeight
-            );
+
+            const pdf = new jspdf("p", "pt", [imgWidth, imgHeight]);
+
+            pdf.addImage(imgData, "PNG", 0, 0, imgWidth, imgHeight);
             var pdfData = {
               pdfName:
                 this.worksDialogCon2.course +
@@ -1161,16 +1140,27 @@ export default {
                     }
                   });
                   // 将没有提交作业,但是有评分标准的数据填上数据,防止报错
-                  if (!l.rate && l.eList && l.eList.length && this.CState == 5) {
+                  if (
+                    !l.rate &&
+                    l.eList &&
+                    l.eList.length &&
+                    (this.CState == 5 || this.CState == 6)
+                  ) {
                     l.rate = { content: "" };
                     l.eList.forEach(elp => {
                       l.rate[elp.detail] = 0;
                     });
-                  }else if ((!l.rate && l.eList && l.eList.length && this.CState != 5)) {
-                      l.rate = { content: "" };
-                      l.eList.forEach(elp => {
-                        l.rate[elp.value] = 0;
-                      });
+                  } else if (
+                    !l.rate &&
+                    l.eList &&
+                    l.eList.length &&
+                    this.CState != 5 &&
+                    this.CState != 6
+                  ) {
+                    l.rate = { content: "" };
+                    l.eList.forEach(elp => {
+                      l.rate[elp.value] = 0;
+                    });
                   }
                   // 将素养添加进treeData中
                   if (l.eList && l.eList.length) {
@@ -1210,7 +1200,7 @@ export default {
                               children: [
                                 {
                                   id: kind + "+" + elind + "+" + stind + "b",
-                                  topic: `工具${elind}`
+                                  topic: `工具${elind * 1 + 1}`
                                 }
                               ]
                             });
@@ -1219,7 +1209,7 @@ export default {
                               if (lc.topic == st.detail) {
                                 lc.children.push({
                                   id: kind + "+" + elind + "+" + stind + "b",
-                                  topic: `工具${elind}`
+                                  topic: `工具${elind * 1 + 1}`
                                 });
                               }
                             });
@@ -1383,7 +1373,7 @@ export default {
   position: relative;
 }
 .pdfCon {
-  width: 810pt;
+  width: 220mm;
   margin: auto;
   position: relative;
 }
@@ -1419,8 +1409,9 @@ export default {
 }
 .coverPage {
   /* height: 840pt; */
-  padding: 185px 8% 0;
+  padding: 150px 8% 0;
   background-color: #ccc;
+  box-sizing: border-box;
   position: relative;
   background-image: url("../../../assets/icon/exportPdfworks/bcg1.svg"),
     url("../../../assets/icon/exportPdfworks/bcg2.svg");
@@ -1461,7 +1452,7 @@ export default {
   border-radius: 16px;
   background-color: #fff;
   padding: 40px 32px;
-  width: 77%;
+  width: 70%;
   font-family: PingFang SC;
   margin: 8px 0;
   color: rgba(35, 99, 205, 1);
@@ -1493,7 +1484,7 @@ export default {
   background-color: #e3edfe;
   display: flex;
   flex-direction: column;
-  padding: 0 110px;
+  padding: 0 60px;
   padding-bottom: 100px;
   box-sizing: border-box;
   font-family: PingFang SC;

+ 6 - 6
src/components/pages/components/lookReport.vue

@@ -28,14 +28,14 @@
       </div>
       <div class="JsonTitBtn">
         <el-button
-          v-if="checkCourse.state == 5"
+          v-if="checkCourse.state == 5 || checkCourse.state == 6"
           @click="exportWorkPdf"
           type="primary"
           size="small"
           >一键导出</el-button
         >
         <el-button
-          v-if="checkCourse.state == 5"
+          v-if="checkCourse.state == 5 || checkCourse.state == 6"
           @click="batchExportPdf"
           :type="multipleSelection.length < 2 ? 'info' : 'primary'"
           :disabled="multipleSelection.length < 2"
@@ -112,7 +112,7 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column
-          v-if="checkCourse.state == 5"
+          v-if="checkCourse.state == 5 || checkCourse.state == 6"
           key="1"
           type="selection"
           width="55"
@@ -139,7 +139,7 @@
         <el-table-column align="center" label="操作" min-width="20">
           <template slot-scope="scope">
             <el-button
-              v-if="checkCourse.state == 5"
+              v-if="checkCourse.state == 5 || checkCourse.state == 6"
               type="primary"
               size="small"
               @click="lookPdf(scope.row)"
@@ -153,7 +153,7 @@
               >查看报告</el-button
             >
             <el-button
-              v-if="checkCourse.state == 5"
+              v-if="checkCourse.state == 5 || checkCourse.state == 6"
               type="primary"
               size="small"
               @click="getPdf(scope.row)"
@@ -192,7 +192,7 @@
         </div>
       </div>
       <exportDataDialog
-        v-if="checkCourse.state == 5"
+        v-if="checkCourse.state == 5 || checkCourse.state == 6"
         :key="exportW"
         :digNum="digNum"
         :oid="oid"

+ 141 - 10
src/components/pages/components/lookWork.vue

@@ -86,7 +86,7 @@
             v-if="isStage(i.taskList)"
             class="stageCon"
           >
-            <div v-if="CState != 5" class="stageTit">
+            <div v-if="CState != 5 && CState != 6" class="stageTit">
               阶段{{ i.id + 1 }}:{{ i.name }}
             </div>
 
@@ -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
@@ -587,7 +625,7 @@
                 <!-- ai作业得分  -->
                 <div
                   class="taskSco"
-                  v-if="l.content && l.content.length && l.eList && CState == 5"
+                  v-if="l.content && l.content.length && l.eList && (CState == 5 || CState == 6)"
                 >
                   <div class="taskScoTit">
                     <div>
@@ -662,7 +700,7 @@
                 <div
                   class="taskSco"
                   v-if="
-                    l.eList && CState != 5 && lind == k.toolEList.length - 1
+                    l.eList && CState != 5 && CState != 6 && lind == k.toolEList.length - 1
                   "
                 >
                   <div class="taskScoTit">
@@ -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);
@@ -935,7 +1062,7 @@ export default {
       let elist = this.workList[stage].taskList[task].toolEList[tool].eList;
 
       elist.forEach(e => {
-        if (this.CState == 5) {
+        if (this.CState == 5 ||this.CState == 6) {
           processedData[e.detail] = 0;
         } else {
           processedData[e.value] = 0;
@@ -1190,8 +1317,8 @@ export default {
                     !l.rate &&
                     l.eList &&
                     l.eList.length &&
-                    this.CState == 5
-                  ) {
+                    (this.CState == 5 || this.CState == 6)
+                  ) {                    
                     l.rate = { content: "" };
                     l.eList.forEach(elp => {
                       l.rate[elp.detail] = 0;
@@ -1200,7 +1327,7 @@ export default {
                     !l.rate &&
                     l.eList &&
                     l.eList.length &&
-                    this.CState != 5
+                    (this.CState != 5 && this.CState != 6)
                   ) {
                     l.rate = { content: "" };
                     l.eList.forEach(elp => {
@@ -1687,4 +1814,8 @@ export default {
 .item {
   margin: 4px;
 }
+.video-player >>> .video-js {
+  height: 100%;
+  padding: 0 !important;
+}
 </style>

Файловите разлики са ограничени, защото са твърде много
+ 444 - 381
src/components/pages/components/report.vue


+ 1 - 1
src/components/pages/components/studentWorksDetail.vue

@@ -1472,7 +1472,7 @@
     <div class="report_box" v-if="reportVisible">
 
     <el-dialog
-      v-if="exportData.state == 5"
+      v-if="exportData.state == 5 || exportData.state == 6"
       :visible.sync="reportVisible"
       :before-close="handleClose"
       class="worksDialogCSSExp"

+ 2 - 2
src/components/pages/components/worksDetail2.vue

@@ -34,7 +34,7 @@
         <el-button @click="customizeExport" 
           type="primary" 
           size="small"
-          >{{ DState == 5 ? '按任务导出' : '自定义导出' }}</el-button
+          >{{ (DState == 5 || DState == 6) ? '按任务导出' : '自定义导出' }}</el-button
         >
         <el-button style="margin-left: 20px;" @click="retPage" type="primary" size="small">返回</el-button>
       </div>
@@ -1586,7 +1586,7 @@
 
 <!-- 自定义导出作业筛选弹框 -->
     <el-dialog
-      :title="dataJson.state == 5 ? '按任务导出作业' : '自定义导出作业'"
+      :title="(dataJson.state == 5 || dataJson.state == 6) ? '按任务导出作业' : '自定义导出作业'"
       :visible.sync="dialogVisibleBao"
       :append-to-body="true"
       width="550px"

+ 11 - 4
src/components/pages/course.vue

@@ -35,7 +35,7 @@
               
               <!-- v-show="org == '1973f6c7-1561-11ee-91d8-005056b86db5' || org == '777559d2-7239-11ee-b98c-005056b86db5' || org == '884c5665-a453-46f3-b7b6-01d575290aa9'" -->
               <div type="primary" @click="oepnTemplate()" v-show="orgArray.includes(org) || oidArray.includes(oid)">AI模式</div>
-              <!--<div type="primary" @click="oepnTemplate2()" v-show="orgArray.includes(org) || oidArray.includes(oid)">上课模式</div>-->
+              <div type="primary" @click="oepnTemplate2()" v-show="orgArray.includes(org) || oidArray.includes(oid)">上课模式</div>
               <!-- oepnTemplate2 -->
             </div>
           </button>
@@ -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") {

+ 49 - 3
src/components/pages/inviteLoginST/inviteLogin.vue

@@ -1,5 +1,8 @@
 <template>
     <div class="container" v-loading="loading">
+				<div class="loginOut" v-show="showLoadingOut">
+					<span @click="loginOut">退出登录</span>
+				</div>
 				<div class="c-box">
 					<div class="c-b-left"></div>
 					<div class="c-b-right">
@@ -41,7 +44,8 @@ export default {
             classJuri: [],
             code: this.$route.query.code,
             courseId:"",
-						chooseData:{}
+						chooseData:{},
+						showLoadingOut:false,
         }
     },
     methods: {
@@ -62,8 +66,32 @@ export default {
               "*"
           );
 				}
-			}
-		}
+			},
+			loginOut(){
+				window.parent.postMessage({
+					tools:"logout"
+				},"*")
+			},
+		},
+		mounted() {
+			setInterval(() => {
+				window.parent.postMessage({
+					tools:"getLogin"
+				},"*")
+				console.log("获取getLogin")
+			}, 2000);
+			window.addEventListener("message",(e)=>{
+				let data = e.data;
+				console.log("message",e)
+				if(data.tools && data.tools=='getLogin'){
+					if(data.type===2){
+						this.showLoadingOut = false;
+					}else if(data.type===1){
+						this.showLoadingOut = true;
+					}
+				}
+			})
+		},
 }
 </script>
 
@@ -80,6 +108,24 @@ export default {
 		position: relative;
 }
 
+.loginOut{
+	position: absolute;
+	right: 30px;
+	top: 30px;
+	width: auto;
+	height: auto;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+}
+
+.loginOut>span{
+	font-size: 24px;
+	color: #fff;
+	font-weight: bold;
+	cursor: pointer;
+}
+
 .c-box{
 	width: 75%;
 	height: 75%;

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

@@ -102,7 +102,7 @@ export default {
     },
     setQr() {
       setTimeout(() => {
-        let url = `https://cloud.cocorobo.hk/#/echarts?cid=${this.cid}&userid=${this.userid}&oid=${this.oid}&org=${this.org}`;
+        let url = `https://cloud.cocorobo.hk/#/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://cloud.cocorobo.hk/#/echarts?cid=${this.cid}&userid=${this.userid}&oid=${this.oid}&org=${this.org}`;
+      this.copyText = `https://cloud.cocorobo.hk/#/echarts?cid=${this.cid}&userid=${this.userid}&oid=${this.oid}`;
       var clipboard = new Clipboard(".tag-read");
       clipboard.on("success", e => {
         this.$message.success("复制成功");

+ 1 - 0
src/components/pages/newCourse/addCourse.vue

@@ -17757,6 +17757,7 @@ ol {
   height: 100%;
   overflow: auto;
   padding: 10px 0;
+  box-sizing: border-box;
 }
 
 .navStage {

+ 50 - 1
src/components/pages/synergyCourse/addCourse.vue

@@ -136,7 +136,7 @@
             </div>
             <div class="whiteBg" style="margin-top: 10px">
               <groupBox :cid="cid" :people="checkboxList3" :classList="classList" :courseDetail="courseDetail"
-                :userid="userid" :type="1" classId="" :oid="oid" v-if="cid"></groupBox>
+                :userid="userid" :type="1" classId="" :oid="oid" v-if="cid" @open2="open2"></groupBox>
               <div v-else class="tipsBox">请添加课程名称后才能设置分组</div>
             </div>
             <div class="whiteBg" style="border-radius: 0; background:#F0F2F5;" v-if="false">
@@ -5117,6 +5117,55 @@ export default {
           "*"
         );
     },
+    open2() {
+      if (this.courseDetail.userid == this.userid || top.US.userInfo.role==1) {
+        window.parent.postMessage(
+          {
+            tools: "opencCscl",
+            cid: this.cid,
+            gid: '',
+          },
+          "*"
+        );
+        return;
+      }
+      let params = {
+        cid: this.cid,
+        classid: '1',
+      };
+      this.ajax
+        .get(this.$store.state.api + "getCourseGroup", params)
+        .then((res) => {
+          if (res.data && res.data[1].length) {
+            let groupPerson = res.data[1]
+            let groupCid = ''
+            for (var i = 0; i < groupPerson.length; i++) {
+              if (groupPerson[i].userid == this.userid) {
+                groupCid = groupPerson[i].groupCid
+                break;
+              }
+            }
+            if (groupCid) {
+              window.parent.postMessage(
+                {
+                  tools: "opencCscl",
+                  cid: this.cid,
+                  gid: groupCid,
+                },
+                "*"
+              );
+            } else {
+              this.$message.error("没有加入分组请先加入分组");
+            }
+          } else {
+            this.$message.error("没有加入分组请先加入分组");
+          }
+        })
+        .catch((err) => {
+          this.$message.error("网络不佳");
+          console.error(err);
+        });
+    },
     guid() {
       var _num,
         i,

+ 13 - 1
src/components/pages/synergyCourse/group/group.vue

@@ -841,7 +841,18 @@ export default {
             });
         },
         selectGroup(gid) {
-            this.getCourseGroup(gid)
+            this.$confirm(
+                // "您确定要删除该分组吗? 分组删除后将被清空并且无法恢复。",
+                "确认加入分组?确认后将直接打开协同构建",
+                "提示",
+                {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning",
+                }
+            ).then(() => {
+                    this.getCourseGroup(gid)
+            }).catch(() => { });
         },
         joinGroup(gid) {
             if (this.groupJson.islock == 2) {
@@ -867,6 +878,7 @@ export default {
                 .post(this.$store.state.api + "joinCourseGroup", params)
                 .then((res) => {
                     this.$message.success("加入成功");
+                    this.$emit('open2')
                     this.$emit('getGroup')
                     this.getCourseGroup();
                 })

+ 28 - 7
src/components/pages/test/add/components/GapFilling/gap.vue

@@ -8,12 +8,13 @@
       <!-- <div class="title"><div>{{ `(${option[cJson.type].name})` }}</div><div v-html="cJson.title"></div></div> -->
       <div class="title">
         <div style="display: flex;">
-          <span @click.stop="updateTitle()" style="min-width:fit-content">{{
+          <!-- <span @click.stop="updateTitle()" style="min-width:fit-content">{{
             `(${option[cJson.type].name})`
-          }}</span>
+          }}</span> -->
           <span v-if="!updateList.title" @click.stop="updateTitle()">{{
-            cJson.title
+            cJson.title ? cJson.title : "输入问题"
           }}</span>
+					<!-- <span v-if="!cJson.title && !updateList.title" class="t_empty" @click.stop="updateTitle()">请填写标题</span> -->
           <input
             v-if="updateList.title"
             ref="titleRef"
@@ -21,16 +22,17 @@
             v-model="checkJson.title"
             @blur="save"
             @keyup.enter="save"
-            placeholder="请填写标题"
+            placeholder="输入问题"
           />
           <span style="min-width: fit-content;color: #efa030;">{{
             cJson.score ? "(分值:" + cJson.score + "分)" : ""
           }}</span>
         </div>
+
         <span
           style="color: #efa030;display: flex;margin-top: 5px;line-height: 18px;"
         >
-          <span
+          <!-- <span
             style="min-width: fit-content;"
             @click.stop="updateAnswer()"
             v-if="!cJson.answer && !updateList.answer"
@@ -43,7 +45,7 @@
             <span v-if="!updateList.answer" @click.stop="updateAnswer()">{{
               cJson.answer
             }}</span>
-          </span>
+          </span> -->
 
           <input
             v-if="updateList.answer"
@@ -57,6 +59,17 @@
         </span>
         <!-- </div><div v-html="cJson.title"></div> -->
       </div>
+      <div class="detail" v-if="!updateList.detail" @click.stop="updateDetail()">{{ cJson.detail?cJson.detail:"暂无描述" }}</div>
+			  <input
+          v-if="updateList.detail"
+          ref="detailRef"
+          class="editInput"
+          v-model="checkJson.detail"
+          @blur="save"
+          style="margin-top: 10px;color: rgb(136, 139, 146);"
+          @keyup.enter="save"
+          placeholder="请填写描述说明"
+        />
       <div class="choices">
         <textarea
           readonly
@@ -97,6 +110,7 @@ export default {
       checkJson: {},
       updateList: {
         title: false,
+        detail:false,
         brief: false,
         answer: false
       }
@@ -142,6 +156,13 @@ export default {
         this.$refs["titleRef"].focus();
       });
     },
+    updateDetail(){
+      this.updateList.detail = true;
+      this.$nextTick(() => {
+        // 聚焦到输入框
+        this.$refs["detailRef"].focus();
+      });
+    },
     updateAnswer() {
       this.updateList.answer = true;
       this.$nextTick(() => {
@@ -156,7 +177,7 @@ export default {
     }
   },
   mounted() {
-		
+
   }
 };
 </script>

+ 2 - 1
src/components/pages/test/add/components/addCheckPopover.vue

@@ -25,7 +25,8 @@
                   pub_test_btn_course: item.value == 6,
                   pub_test_btn_eva: item.value == 7,
                   pub_test_btn_time: item.value == 8,
-                  pub_test_btn_choose2: item.value == 9
+                  pub_test_btn_choose2: item.value == 9,
+									pub_test_btn_sweep: item.value == 12,
                 }"
               >
                 {{ item.label }}

+ 36 - 10
src/components/pages/test/add/components/checkOrder.vue

@@ -8,7 +8,7 @@
                 dragOverBottom: newIndex === index1 && typeIndex == 'drag-' + index1 && (oldIndex < index1 || !(!(newIndex2 || newIndex2 === 0) || !(newIndex3 || newIndex3 === 0))),
             }" @click.stop="checkTitle(`${index1}`, 1, item1)" @dragstart="dragStart(item1, index1, `${index1}`)"
             @dragover.prevent="dragOver(index1)" @dragend="dragEnd()">
-            <div class="title" :style="{ fontSize: etype == 'order' && '16px' }">
+            <div class="title" :style="{ fontSize: etype == 'order' && '16px' }"  :ref="`x${index1}`">
                 <div class="drag" @mousedown="setDrag(`${index1}`)" @mouseup="isdrag = ''"></div>
                 <span class="content" v-html="selectType(item1, index1)" v-if="etype == 'edit' || item1.ttype != 1"></span>
                 <el-tooltip :content="selectType2(item1, index1)" placement="top" effect="dark" v-else>
@@ -36,7 +36,7 @@
                     }" @click.stop="checkTitle(`${index1}-${index2}`, 2, item2)"
                     @dragstart="dragStart2(item2, index1, index2, `${index1}-${index2}`)"
                     @dragover.prevent="dragOver2(index1, index2)" @dragend="dragEnd2()">
-                    <div class="title" :style="{ fontSize: etype == 'order' && '16px' }">
+                    <div class="title" :style="{ fontSize: etype == 'order' && '16px' }" :ref="`x${index1}-${index2}`">
                         <div class="drag" @mousedown="setDrag(`${index1}-${index2}`)" @mouseup="isdrag = ''"></div>
                         <span class="content" v-html="selectType(item2, index2)"
                             v-if="etype == 'edit' || item2.ttype != 1"></span>
@@ -62,7 +62,7 @@
                             }" @click.stop="checkTitle(`${index1}-${index2}-${index3}`, 3, item3)"
                             @dragstart="dragStart3(item3, index1, index2, index3, `${index1}-${index2}-${index3}`)"
                             @dragover.prevent="dragOver3(index1, index2, index3)" @dragend="dragEnd3()">
-                            <div class="title" :style="{ fontSize: etype == 'order' && '16px' }">
+                            <div class="title" :style="{ fontSize: etype == 'order' && '16px' }" :ref="`x${index1}-${index2}-${index3}`">
                                 <div class="drag" @mousedown="setDrag(`${index1}-${index2}-${index3}`)"
                                     @mouseup="isdrag = ''"></div>
                                 <span class="content" v-html="selectType(item3, index3)"
@@ -79,13 +79,13 @@
                             <div v-if="item3.ttype == 1 && canEdit.indexOf(item3.type) !== -1 && etype == 'edit'"
                                 class="edit_box">
                                 <div v-if="item3.type == 1">
-                                    <choiceX :cJson="item3.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}-${index2}-${index3}`" :isOpen="item3.type == 1 && checkC === `x${index1}-${index2}-${index3}`"></choiceX>
+                                    <choiceX :cJson="item3.json" :cJson2="cJson" @setJson="setJson"  :index="`x${index1}-${index2}-${index3}`" :isOpen="item3.type == 1 && checkC === `x${index1}-${index2}-${index3}`"></choiceX>
                                     <!-- <choiceDialog v-if="item3.type == 1 && checkC === `x${index1}-${index2}-${index3}`"
                                         :cJson="cJson" @setJson="setJson">
                                     </choiceDialog> -->
                                 </div>
                                 <div v-if="item3.type == 3">
-                                    <gapX :cJson="item3.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}-${index2}-${index3}`" :isOpen="item3.type == 3 && checkC === `x${index1}-${index2}-${index3}`"></gapX>
+                                    <gapX :cJson="item3.json" :cJson2="cJson" @setJson="setJson"  :index="`x${index1}-${index2}-${index3}`" :isOpen="item3.type == 3 && checkC === `x${index1}-${index2}-${index3}`"></gapX>
                                     <!-- <gapDialog v-if="item3.type == 3 && checkC === `x${index1}-${index2}-${index3}`"
                                         :cJson="cJson" @setJson="setJson">
                                     </gapDialog> -->
@@ -120,13 +120,16 @@
                                         :cJson="cJson" @setJson="setJson">
                                     </courseDialog2>-->
                                 </div>
+																<div v-if="item3.type == 12">
+																	<sweep :cJson="item3.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}-${index2}-${index3}`" :isOpen="item3.type == 12 && checkC === `x${index1}-${index2}-${index3}`"/>
+																</div>
                             </div>
 														<div class="addCheckBox" v-if="checkC === `x${index1}-${index2}-${index3}` && etype==='edit'" @click.stop="">
 															<addCheckPopover @addCheck="addCheck" @addQtype="addQtype"/>
 														</div>
                         </div>
                     </div>
-                    <div v-else-if="item2.ttype == 1 && canEdit.indexOf(item2.type) !== -1 && etype == 'edit'"
+                    <div v-else-if="item2.ttype == 1 && canEdit.indexOf(item2.type) !== -1 && etype == 'edit'" 
                         class="edit_box">
                         <div v-if="item2.type == 1">
                             <choiceX :cJson="item2.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}-${index2}`" :isOpen="item2.type == 1 && checkC === `x${index1}-${index2}`"></choiceX>
@@ -163,6 +166,9 @@
                             <!-- <courseDialog2 v-if="item2.type == 11 && checkC === `x${index1}-${index2}`" :cJson="cJson"
                                 @setJson="setJson"></courseDialog2> -->
                         </div>
+												<div v-else-if="item2.type == 12">
+													<sweep :cJson="item2.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}-${index2}`" :isOpen="item2.type == 12 && checkC === `x${index1}-${index2}`"/>
+												</div>
                     </div>
 										<div class="addCheckBox" v-if="checkC === `x${index1}-${index2}` && etype==='edit'" @click.stop="">
 											<addCheckPopover @addCheck="addCheck" @addQtype="addQtype"/>
@@ -206,6 +212,9 @@
                     <!-- <courseDialog2 v-if="item1.type == 11 && checkC === `x${index1}`" :cJson="cJson" @setJson="setJson">
                     </courseDialog2> -->
                 </div>
+								<div v-else-if="item1.type == 12">
+									<sweep :cJson="item1.json" :cJson2="cJson" @setJson="setJson" :index="`x${index1}`" :isOpen="item1.type == 12 && checkC === `x${index1}`"/>
+								</div>
             </div>
 						<div class="addCheckBox" v-if="checkC === `x${index1}` && etype==='edit'" @click.stop="">
 							<addCheckPopover @addCheck="addCheck" @addQtype="addQtype"/>
@@ -249,6 +258,7 @@ import timeX from './timeBox/time.vue'
 import courseDialog2 from './course2/index.vue'
 import courseX2 from './course2/course.vue'
 import addCheckPopover from './addCheckPopover.vue'
+import sweep from './sweep/index'
 export default {
     mixins: [minxinVue],
     components: {
@@ -266,7 +276,8 @@ export default {
         timeX,
         courseDialog2,
         courseX2,
-				addCheckPopover
+				addCheckPopover,
+				sweep
     },
     props: {
         checkJson: {
@@ -287,7 +298,7 @@ export default {
         return {
             manualJson: [],
             isdrag: "",
-            canEdit: [1, 3, 5, 6, 7, 8, 11],
+            canEdit: [1, 3, 5, 6, 7, 8, 11,12],
             ctype: "",
             dragType: "",
             oldIndex: "",
@@ -322,7 +333,9 @@ export default {
                         className += " test_eva_file"
                     } else if (item.type == 8) {
                         className += " test_icon_time"
-                    }
+                    }else if (item.type == 12){
+												className += " test_icon_sweep"
+										}
 										let itemType = item.type;
 										if(itemType===1){
 											if(item.json.type===1){
@@ -395,7 +408,10 @@ export default {
                 this.$emit("update:checkC", "")
             } else {
                 this.$emit("update:checkC", 'x' + index)
-            }
+								if(this.etype==='order'){
+									this.$emit("scrollPage",'x' + index)
+								}
+							}
             this.$forceUpdate();
             // console.log(this.cJson);
             this.$emit("update:cJson", cJson)
@@ -688,6 +704,16 @@ export default {
 				},
 				addQtype(type){
 					this.$emit('addQtype',type)
+				},
+				scrollPage(index){
+					let scrollEl = this.$parent.$refs['eContentRef']
+					let moveEl = this.$refs[index]
+					if(scrollEl && moveEl){
+						scrollEl.scrollTo({
+							top:moveEl[0].offsetTop - 100,
+							behavior:"smooth"
+						})
+					}
 				}
     },
     mounted() {

+ 30 - 9
src/components/pages/test/add/components/choice/choice.vue

@@ -11,7 +11,7 @@
           }}</span
           > -->
 					<span @click.stop="updateTitle()" v-if="!updateList.title">{{
-            cJson.title ? cJson.title : "请填写标题"
+            cJson.title ? cJson.title : "输入问题"
           }}</span>
           <input
             v-if="updateList.title"
@@ -20,19 +20,30 @@
             v-model="checkJson.title"
             @blur="save"
             @keyup.enter="save"
-            placeholder="请填写标题"
+            placeholder="输入问题"
           />
         </div>
         <span style="color: #efa030;" v-if="cJson.score"
           >({{ "分值:" + cJson.score + "分" }})</span
         >
       </div>
+      <div class="detail" v-if="!updateList.detail" @click.stop="updateDetail()">{{ cJson.detail?cJson.detail:"暂无描述" }}</div>
+			  <input
+          v-if="updateList.detail"
+          ref="detailRef"
+          class="editInput"
+          v-model="checkJson.detail"
+          @blur="save"
+          style="margin-top: 10px;color: rgb(136, 139, 146);"
+          @keyup.enter="save"
+          placeholder="请填写描述说明"
+        />
       <div class="choices">
         <div class="choice" v-for="(item, index) in cJson.array" :key="index">
           <div
             class="choice_c"
             v-if="cJson.type == 2"
-            @click.stop="updateAnswer(index)"
+             @click.stop="updateLabel(index)"
           >
             <el-checkbox
               class="choiceInput"
@@ -43,7 +54,7 @@
             ><span
               v-if="!updateList.answer || updateList.answerIndex != index"
               :class="{ right: cJson.answer.indexOf(index) != -1 }"
-              @click.stop="updateLabel(index)"
+
               >{{ item.option ? item.option : "空选项" }}</span
             >
             <input
@@ -59,13 +70,14 @@
             <span
               @click.stop="deleteChoice(index)"
               class="deleteChoice"
+              v-if="cJson.array.length>2"
               >×</span
             >
           </div>
           <div
             class="choice_c"
             v-if="cJson.type == 1"
-            @click.stop="updateAnswer(index)"
+            @click.stop="updateLabel(index)"
           >
             <el-radio
               class="choiceInput"
@@ -76,7 +88,7 @@
             ><span
               v-if="!updateList.answer || updateList.answerIndex != index"
               :class="{ right: cJson.answer.indexOf(index) != -1 }"
-              @click.stop="updateLabel(index)"
+
               >{{ item.option ? item.option : "空选项" }}</span
             >
             <input
@@ -91,6 +103,7 @@
             />
             <span
               @click.stop="deleteChoice(index)"
+                v-if="cJson.array.length>2"
               class="deleteChoice"
               >×</span
             >
@@ -133,6 +146,7 @@ export default {
       updateList: {
         title: false,
         answer: false,
+        detail:false,
         answerIndex: 0
       }
     };
@@ -176,6 +190,12 @@ export default {
         this.$refs[`answerRef${index}`][0].focus();
       });
     },
+    updateDetail(){
+      this.updateList.detail = true;
+      this.$nextTick(() => {
+        this.$refs[`detailRef`].focus();
+      });
+    },
     save() {
       for (let key in this.updateList) {
         if (typeof this.updateList[key] === "boolean") {
@@ -184,6 +204,7 @@ export default {
       }
     },
     updateAnswer(index) {
+			return;
       if (this.cJson.type == 1) {
         if (this.checkJson.answer.indexOf(index) == -1) {
           this.checkJson.answer = [index];
@@ -275,9 +296,9 @@ export default {
   content: "(正确答案)";
 } */
 
-.choice:hover > .choice_c > .deleteChoice {
+/* .choice:hover > .choice_c > .deleteChoice {
   display: flex;
-}
+} */
 
 .deleteChoice {
   max-width: 25px;
@@ -293,7 +314,7 @@ export default {
   cursor: pointer;
   font-weight: bold;
   font-size: 16px;
-  display: none;
+  display: flex;
   padding-right: 0 !important;
   align-items: center;
   justify-content: center;

+ 3 - 3
src/components/pages/test/add/components/course/course.vue

@@ -5,7 +5,7 @@
     <div class="choice_box">
       <div class="title" style="display: flex;">
         <span v-if="!updateList.title" @click.stop="updateTitle()">{{
-          cJson.title ? cJson.title : "暂无标题"
+          cJson.title ? cJson.title : "输入问题"
         }}</span>
         <input
           v-if="updateList.title"
@@ -14,7 +14,7 @@
           v-model="checkJson.title"
           @blur="save"
           @keyup.enter="save"
-          placeholder="请填写标题"
+          placeholder="输入问题"
         />
       </div>
       <div
@@ -31,7 +31,7 @@
         @blur="save"
         style="margin-top: 10px;color: rgb(136, 139, 146);"
         @keyup.enter="save"
-        placeholder="请填写描述"
+        placeholder="请填写描述说明"
       />
 
       <div class="course">

+ 4 - 4
src/components/pages/test/add/components/course2/course.vue

@@ -4,7 +4,7 @@
     <!-- <div v-if="!cJson">暂未设置题目</div> -->
     <div class="choice_box">
       <div class="title" style="display: flex;">
-        <span v-if="!updateList.title" @click.stop="updateTitle()">{{ cJson.title?cJson.title:"暂无标题" }}</span>
+        <span v-if="!updateList.title" @click.stop="updateTitle()">{{ cJson.title?cJson.title:"输入问题" }}</span>
 				<input
             v-if="updateList.title"
             ref="titleRef"
@@ -12,7 +12,7 @@
             v-model="checkJson.title"
             @blur="save"
             @keyup.enter="save"
-            placeholder="请填写标题"
+            placeholder="输入问题"
           />
       </div>
       <div class="detail" v-if="!updateList.detail" @click.stop="updateDetail()">{{ cJson.detail?cJson.detail:"暂无描述" }}</div>
@@ -24,7 +24,7 @@
         @blur="save"
         style="margin-top: 10px;color: rgb(136, 139, 146);"
         @keyup.enter="save"
-        placeholder="请填写描述"
+        placeholder="请填写描述说明"
       />
     </div>
   </div>
@@ -103,7 +103,7 @@ export default {
 				this.$refs["detailRef"].focus();
 			})
 		}
-  },	
+  },
   mounted() {
     // if (!this.cJson || Object.keys(this.cJson).length == 0) {
     //   this.checkJson = {

+ 3 - 3
src/components/pages/test/add/components/evaBox/eva.vue

@@ -4,7 +4,7 @@
     <div class="choice_box">
       <div class="title" style="display: flex;">
         <span @click.stop="updateTitle()" v-if="!updateList.title">{{
-          cJson.title ? cJson.title : "暂无标题"
+          cJson.title ? cJson.title : "输入问题"
         }}</span>
         <input
           v-if="updateList.title"
@@ -13,7 +13,7 @@
           v-model="checkJson.title"
           @blur="save"
           @keyup.enter="save"
-          placeholder="请填写标题"
+          placeholder="输入问题"
         />
       </div>
       <div
@@ -29,7 +29,7 @@
         @blur="save"
         style="margin-top: 10px;color: rgb(136, 139, 146);"
         @keyup.enter="save"
-        placeholder="请填写描述"
+        placeholder="请填写描述说明"
       />
       <div class="scoreList">
         <div

+ 5 - 5
src/components/pages/test/add/components/file/file.vue

@@ -10,11 +10,11 @@
     <div v-else class="choice_box">
       <!-- <div class="title"><div>{{ `(${option[cJson.type].name})` }}</div><div v-html="cJson.title"></div></div> -->
       <div class="title" style="display: flex;">
-        <span @click.stop="updateTitle()" style="min-width:fit-content">{{
+        <!-- <span @click.stop="updateTitle()" style="min-width:fit-content">{{
           `(${option[cJson.type].name})`
-        }}</span>
+        }}</span> -->
         <span @click.stop="updateTitle()" v-if="!updateList.title">{{
-          cJson.title
+          cJson.title ? cJson.title : "输入问题"
         }}</span>
         <input
           v-if="updateList.title"
@@ -23,7 +23,7 @@
           v-model="checkJson.title"
           @blur="save"
           @keyup.enter="save"
-          placeholder="请填写标题"
+          placeholder="输入问题"
         />
         <span style="color: #efa030;min-width:fit-content" v-if="cJson.score"
           >({{ cJson.score ? "分值:" + cJson.score + "分" : "" }})</span
@@ -43,7 +43,7 @@
         @blur="save"
         style="margin-top: 10px;color: rgb(136, 139, 146);"
         @keyup.enter="save"
-        placeholder="请填写描述"
+        placeholder="请填写描述说明"
       />
       <div class="uploadFileBox">
         <div v-loading="proVisible">

+ 166 - 0
src/components/pages/test/add/components/sweep/index.vue

@@ -0,0 +1,166 @@
+<template>
+  <div class="c_box">
+    <div class="mask" v-if="!isOpen"></div>
+    <!-- <div v-if="!cJson">暂未设置题目</div> -->
+    <div class="choice_box">
+      <div class="title" style="display: flex;">
+        <span v-if="!updateList.title" @click.stop="updateTitle()">{{ cJson.title?cJson.title:"输入问题" }}</span>
+				<input
+            v-if="updateList.title"
+            ref="titleRef"
+            class="editInput"
+            v-model="checkJson.title"
+            @blur="save"
+            @keyup.enter="save"
+            placeholder="输入问题"
+          />
+      </div>
+      <div class="detail" v-if="!updateList.detail" @click.stop="updateDetail()">{{ cJson.detail?cJson.detail:"暂无描述" }}</div>
+			<input
+        v-if="updateList.detail"
+        ref="detailRef"
+        class="editInput"
+        v-model="checkJson.detail"
+        @blur="save"
+        style="margin-top: 10px;color: rgb(136, 139, 146);"
+        @keyup.enter="save"
+        placeholder="请填写描述说明"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    cJson: {
+      type: Object
+    },
+		cJson2:{
+			type:Object
+		},
+    isOpen: {
+      type: Boolean,
+      default: false
+    },
+    index: {
+      type: String,
+      default: ""
+    }
+  },
+  data() {
+    return {
+      option: {
+        1: { name: "附件" }
+        // 2: { name: '多选题' }
+      },
+      checkJson: {},
+			updateList: {
+        title: false,
+        detail: false,
+      }
+    };
+  },
+  watch: {
+    checkJson: {
+      handler(newVal) {
+        this.$emit("setJson", newVal,this.index);
+      },
+      deep: true
+    },
+		isOpen(newValue) {
+      if (newValue) {
+        if (!this.cJson2 || Object.keys(this.cJson2).length == 0) {
+          this.checkJson = {
+            title: "标题",
+            type: 1,
+            answer: ""
+          };
+        } else {
+          this.checkJson = this.depthCopy(this.cJson2);
+        }
+      }
+    }
+  },
+  methods: {
+    depthCopy(s) {
+      return JSON.parse(JSON.stringify(s));
+    },
+		save() {
+      for (let key in this.updateList) {
+        this.updateList[key] = false;
+      }
+    },
+		updateTitle(){
+			this.updateList.title = true;
+			this.$nextTick(()=>{
+				this.$refs["titleRef"].focus();
+			})
+		},
+		updateDetail(){
+			this.updateList.detail = true;
+			this.$nextTick(()=>{
+				this.$refs["detailRef"].focus();
+			})
+		}
+  },
+  mounted() {
+    // if (!this.cJson || Object.keys(this.cJson).length == 0) {
+    //   this.checkJson = {
+    //     title: "标题",
+    //     detail: ""
+    //   };
+    // } else {
+    //   this.checkJson = this.depthCopy(this.cJson2);
+    //   this.courses = this.checkJson.courses;
+    // }
+  }
+};
+</script>
+
+<style scoped>
+@import "../../global_styles.css";
+
+.choice_box > .detail {
+  width: 100%;
+  word-break: break-all;
+  color: rgb(136, 139, 146);
+  margin: 10px 0 0;
+}
+
+.choice_box > .choices {
+  margin-top: 10px;
+}
+
+.binfo_input {
+  width: 100%;
+  margin: 0;
+  padding: 10px;
+  display: block;
+  min-width: 0;
+  outline: none;
+  box-sizing: border-box;
+  background: none;
+  border: none;
+  border-radius: 5px;
+  background: #fff;
+  font-size: 16px;
+  resize: none;
+  font-family: "Microsoft YaHei";
+  min-height: 120px;
+  /* border: 1px solid #3682fc00; */
+  border: 1.5px solid #e0e0e0;
+}
+
+.binfo_input > div {
+  border: 1.5px dashed #dfdfdf;
+  height: 120px;
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: rgb(249, 250, 251);
+  color: rgb(124, 124, 124);
+  border-radius: 5px;
+}
+</style>

+ 16 - 4
src/components/pages/test/add/edit/check/index.vue

@@ -14,6 +14,7 @@
             <evaV :tindex="index" :cJson.sync="item.json" v-if="item.type == 7"></evaV>
             <timeV :tindex="index" :cJson.sync="item.json" v-if="item.type == 8"></timeV>
             <courseV2 :tindex="index" :cJson.sync="item.json" v-if="item.type == 11"></courseV2>
+						<sweep :tindex="index" :cJson.sync="item.json" v-if="item.type == 12"/>
             <!-- <span v-else>暂未设置题目</span> -->
           </div>
           <div v-for="(item2, index2) in item.array" :key="`${index}-${index2}`" class="check_box_xia">
@@ -26,6 +27,7 @@
               <evaV :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 7"></evaV>
               <timeV :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 8"></timeV>
               <courseV2 :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 11"></courseV2>
+							<sweep :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 12"></sweep>
               <!-- <span v-else>暂未设置题目</span> -->
             </div>
           </div>
@@ -42,6 +44,7 @@
             <evaV :tindex="index" :cJson.sync="item.json" v-if="item.type == 7"></evaV>
             <timeV :tindex="index" :cJson.sync="item.json" v-if="item.type == 8"></timeV>
             <courseV2 :tindex="index" :cJson.sync="item.json" v-if="item.type == 11"></courseV2>
+						<sweep :tindex="index" :cJson.sync="item.json" v-if="item.type == 12"></sweep>
             <!-- <span v-else>暂未设置题目</span> -->
           </div>
           <div v-for="(item2, index2) in item.array" :key="`${index}-${index2}`" class="check_box_xia">
@@ -54,6 +57,7 @@
               <evaV :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 7"></evaV>
               <timeV :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 8"></timeV>
               <courseV2 :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 11"></courseV2>
+							<sweep :tindex="index2" :cJson.sync="item2.json" v-if="item2.type == 12"></sweep>
               <!-- <span v-else>暂未设置题目</span> -->
             </div>
           </div>
@@ -78,6 +82,7 @@ import courseV from './course.vue';
 import evaV from './eva.vue';
 import timeV from './time.vue';
 import courseV2 from './course2.vue';
+import sweep from './sweep.vue'
 export default {
   props: {
     cJson: {
@@ -94,7 +99,8 @@ export default {
     courseV,
     evaV,
     timeV,
-    courseV2
+    courseV2,
+		sweep
   },
   data() {
     return {
@@ -181,7 +187,7 @@ export default {
         let checkArray = _json.filter(item => {
           if (item.array) {
             item.array = item.array.filter((item2) => {
-              if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.type != 6 && item.type != 7 && item.type != 8) {
+              if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.type != 6 && item.type != 7 && item.type != 8 && item.type != 12) {
                 item2.json.answer2 = [];
               } else if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.type == 6) {
                 item2.json.answer2 = item2.json.courses[0];
@@ -189,10 +195,12 @@ export default {
                 item2.json.answer2 = '';
               } else if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.type == 8) {
                 item2.json.answer2 = '';
+              }else if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.type == 12) {
+                item2.json.answer2 = '';
               }
               if (item2.array) {
                 item2.array = item2.array.filter((item3) => {
-                  if (item3.ttype == 1 && item3.json && !item3.json.answer2 && item3.type != 6 && item3.type != 7 && item3.type != 8) {
+                  if (item3.ttype == 1 && item3.json && !item3.json.answer2 && item3.type != 6 && item3.type != 7 && item3.type != 8 && item3.type != 12) {
                     item3.json.answer2 = [];
                   } else if (item3.ttype == 1 && item3.json && !item3.json.answer2 && item3.type == 6) {
                     item3.json.answer2 = item3.json.courses[0];
@@ -200,6 +208,8 @@ export default {
                     item3.json.answer2 = '';
                   } else if (item3.ttype == 1 && item3.json && !item3.json.answer2 && item3.type == 8) {
                     item3.json.answer2 = '';
+                  }else if (item3.ttype == 1 && item3.json && !item3.json.answer2 && item3.type == 12) {
+                    item3.json.answer2 = '';
                   }
                   return item3;
                 });
@@ -209,7 +219,7 @@ export default {
               );
             });
           }
-          if (item.ttype == 1 && item.json && !item.json.answer2 && item.type != 6 && item.type != 7 && item.type != 8) {
+          if (item.ttype == 1 && item.json && !item.json.answer2 && item.type != 6 && item.type != 7 && item.type != 8 && item.type != 12) {
             item.json.answer2 = [];
           } else if (item.ttype == 1 && item.json && !item.json.answer2 && item.type == 6) {
             item.json.answer2 = item.json.courses[0];
@@ -217,6 +227,8 @@ export default {
             item.json.answer2 = '';
           } else if (item.ttype == 1 && item.json && !item.json.answer2 && item.type == 8) {
             item.json.answer2 = '';
+          }else if (item.ttype == 1 && item.json && !item.json.answer2 && item.type == 12) {
+            item.json.answer2 = '';
           }
           console.log(item.array);
           return (item.ttype != 1 && item.array.length > 0) || item.ttype == 1;

+ 261 - 0
src/components/pages/test/add/edit/check/sweep.vue

@@ -0,0 +1,261 @@
+<template>
+  <div class="c_box">
+    <div class="choice_box">
+      <div class="title" style="display: flex;align-items: center;">
+        <span class="g_t_index" style="min-width: fit-content;">{{
+          tindex + 1
+        }}</span>
+        <span>{{ checkJson.title }}</span>
+      </div>
+      <div
+        class="detail"
+        v-if="checkJson.detail"
+        v-html="checkJson.detail"
+        style="color: #00000066;margin-top: 5px;"
+      ></div>
+			<div
+        class="detail"
+         v-if="checkJson.answer2 && typeof checkJson.answer2=='string'"
+        v-html="checkJson.answer2"
+        style="color: #000000;margin-top: 5px;"
+      ></div>
+			<el-button style="margin-top: 10px;" type="primary" size="mini" @click="sweepBtn">扫一扫</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    tindex: {
+      type: Number
+    },
+    cJson: {
+      type: Object
+    },
+    checktype: {
+      type: Number,
+      default: 1
+    },
+    see: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      option: {
+        1: { name: "附件" }
+      },
+      userid: this.$route.query.userid,
+      checkJson: undefined,
+      courseDetail: [],
+    };
+  },
+  computed: {},
+  watch: {
+    checkJson: {
+      handler(newValue) {
+        this.$emit("update:cJson", newValue);
+      },
+      deep: true
+    }
+  },
+  methods: {
+    depthCopy(s) {
+      return JSON.parse(JSON.stringify(s));
+    },
+		sweepBtn(){
+			this.$message.error("请到手机端内扫码")
+		}
+  },
+  mounted() {
+    this.checkJson = this.cJson ? this.depthCopy(this.cJson) : undefined;
+  }
+};
+</script>
+
+<style scoped>
+.c_box {
+  width: 100%;
+  position: relative;
+  padding-left: 45px;
+  overflow: visible;
+}
+
+/* .mask {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+    z-index: 2;
+} */
+
+.choice_box {
+  white-space: pre-line;
+}
+
+.choice_box > .title {
+  font-weight: bold;
+  width: 100%;
+  word-break: break-all;
+}
+
+.choice_box > .choices {
+  margin-top: 10px;
+}
+
+.choices > .page {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+}
+
+.p_page {
+  margin: 0 10px;
+}
+
+.course {
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+}
+
+.course + .course {
+  margin-top: 10px;
+}
+
+.course > .banner {
+  width: 200px;
+  height: 120px;
+  border-radius: 5px;
+  overflow: hidden;
+  border: 1px solid #3896fc;
+  box-sizing: border-box;
+  padding: 5px;
+  margin-right: 15px;
+}
+.course > .banner > img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+.course > .content {
+}
+.course > .content > .c_c {
+}
+.course > .content > .c_c + .c_c {
+  margin-top: 5px;
+}
+.course > .content > .c_c span:nth-child(1) {
+}
+.course > .content > .c_c span:nth-child(2) {
+}
+
+.g_t_index {
+  color: #3681fc;
+  font-size: 28px;
+  font-weight: bold;
+  position: relative;
+  margin-right: 30px;
+  margin-left: -40px;
+}
+
+.g_t_index + span {
+  font-weight: bold;
+  font-size: 18px;
+}
+
+.g_t_index::after {
+  content: "";
+  width: 18px;
+  height: 2px;
+  position: absolute;
+  right: -18px;
+  top: 50%;
+  transform: translateY(-50%);
+  background: #3681fc;
+}
+
+.g_t_index::before {
+  content: "";
+  width: 6px;
+  height: 6px;
+  border-right: 2px solid #3681fc;
+  border-top: 2px solid #3681fc;
+  position: absolute;
+  right: -15px;
+  top: 50%;
+  transform: rotate(45deg) translateY(-5px);
+}
+
+.c_list {
+  width: calc(100% - 10px);
+  min-height: 200px;
+  height: auto;
+  border: 1px solid #e7e7e7;
+  border-radius: 5px;
+  box-sizing: border-box;
+  padding: 10px;
+  display: flex;
+  flex-wrap: wrap;
+  /* overflow: auto; */
+}
+
+.c_l_add1 {
+  width: 100%;
+  height: 200px;
+  background-color: #F9FAFB;
+	border: 1.5px dashed #dfdfdf;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: #00000066;
+  border-radius: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.c_l_add2{
+	width: 230px;
+  height: 200px;
+	background-color: #F9FAFB;
+	border: 1.5px dashed #dfdfdf;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: #00000066;
+  border-radius: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.c_l_item {
+  width: 230px;
+  height: 200px;
+  margin-right: 10px;
+  box-sizing: border-box;
+  border: solid 1px #3896FC;
+  border-radius: 5px;
+	cursor: pointer;
+	box-sizing: border-box;
+	padding: 5px;
+}
+
+.c_l_item > img {
+  width: 100%;
+  height: 110px;
+  object-fit: cover;
+	margin-bottom: 5px;
+}
+
+.c_l_item > div {
+  width: 210px;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  font-size: 14px; /* 设置字体大小 */
+  color: #333; /* 设置字体颜色 */
+	box-sizing: border-box;
+}
+</style>

+ 36 - 13
src/components/pages/test/add/edit/edit/index.vue

@@ -45,7 +45,8 @@
                   pub_test_btn_course: item.value == 6,
                   pub_test_btn_eva: item.value == 7,
                   pub_test_btn_time: item.value == 8,
-                  pub_test_btn_choose2: item.value == 9
+                  pub_test_btn_choose2: item.value == 9,
+                  pub_test_btn_sweep: item.value == 12
                 }"
               >
                 {{ item.label }}
@@ -126,10 +127,11 @@
     <div
       class="e_content"
       :style="
-        `margin-right:${showRightMenu ? '20px' : '0'	};margin-left:${
+        `margin-right:${showRightMenu ? '20px' : '0'};margin-left:${
           showLeftMenu ? '20px' : '0'
         };`
       "
+			ref="eContentRef"
     >
       <div v-if="!isEditing" class="title" @click="editTitle">
         {{ title ? title : "请填写表单标题" }}
@@ -157,22 +159,26 @@
       />
       <div class="e_order_box">
         <checkOrder
+					ref="checkOrderEditRef"
           :checkC.sync="checkC"
           :checkJson="manualJson"
           @changeJson="changeJson"
           etype="edit"
           :cJson.sync="cJson"
-					@addCheck="addCheck"
-					@addQtype="addQtype"
+          @addCheck="addCheck"
+          @addQtype="addQtype"
         >
         </checkOrder>
-				<addCheckPopover v-if="manualJson.length==0 || checkC==''" @addCheck="addCheck" @addQtype="addQtype"/>
-
+        <addCheckPopover
+          v-if="manualJson.length == 0 || checkC == ''"
+          @addCheck="addCheck"
+          @addQtype="addQtype"
+        />
       </div>
     </div>
     <div class="e_order" v-show="showRightMenu">
       <div class="title">
-        题目排序
+        大纲
         <span style="font-size: 14px; color: #373737">总分:{{ score }}分</span>
       </div>
       <span
@@ -202,6 +208,7 @@
           :checkJson="manualJson"
           @changeJson="changeJson"
           etype="order"
+					@scrollPage="scrollPage"
           :cJson.sync="cJson"
         >
         </checkOrder>
@@ -260,6 +267,7 @@
 import checkOrder from "../../components/checkOrder.vue";
 import minxinVue from "../../minxins/minxin";
 import addCheckPopover from "../../../add/components/addCheckPopover.vue";
+import { ref } from "vue-demi";
 export default {
   components: {
     checkOrder,
@@ -473,6 +481,11 @@ export default {
             title: "标题",
             detail: ""
           };
+        } else if (topicType == 12) {
+          json.json = {
+            title: "标题",
+            detail: ""
+          };
         }
         if (_json.array) {
           if (type == 3 && _check.length == 2) {
@@ -524,6 +537,7 @@ export default {
             ttype: 1,
             type: _topicType
           };
+					console.log("👉",topicType)
 
           if (topicType == 1) {
             json1.json = {
@@ -590,6 +604,11 @@ export default {
               title: "标题",
               detail: ""
             };
+          } else if (topicType == 12) {
+            json1.json = {
+              title: "标题",
+              detail: ""
+            };
           }
           this.manualJson.push(json1);
           this.$forceUpdate();
@@ -703,7 +722,10 @@ export default {
         }
       }
       this.$emit("changeJson", this.manualJson);
-    }
+    },
+		scrollPage(index){
+			this.$refs.checkOrderEditRef.scrollPage(index)
+		}
   },
   mounted() {
     this.manualJson = this.depthCopy(this.checkJson);
@@ -798,7 +820,8 @@ export default {
 
 .e_add > .title,
 .e_order > .title {
-  text-align: center;
+  /* text-align: center; */
+	text-indent: 1.1em;
   font-size: 20px;
 }
 
@@ -897,9 +920,9 @@ export default {
   overflow-y: hidden;
 }
 
-.e_addBox{
-	width: 400px;
-	height: 300px;
-	background-color: red;
+.e_addBox {
+  width: 400px;
+  height: 300px;
+  background-color: red;
 }
 </style>

+ 1 - 0
src/components/pages/test/add/edit/edit/indexJ.vue

@@ -25,6 +25,7 @@
                   pub_test_btn_eva: item.value == 7,
                   pub_test_btn_time: item.value == 8,
                   pub_test_btn_choose2: item.value == 9,
+									pub_test_btn_sweep:item.value==12
                 }"
               >
                 {{ item.label }} 

+ 23 - 10
src/components/pages/test/add/edit/index.vue

@@ -6,12 +6,12 @@
     <div class="edit_top">
       <div class="e_t_left">
         <el-button type="primary" size="small" @click="useAiBtn()"
-          >按文档创建</el-button
+          >按文档创建</el-button
         >
 
-				<el-button :type="viewFile?'primary':''" size="small" v-if="fileData" @click="viewUploadFile()"
+				<!-- <el-button :type="viewFile?'primary':''" size="small" v-if="fileData" @click="viewUploadFile()"
           >预览</el-button
-        >
+        > -->
       </div>
       <div class="edit_btn">
         <span class="edit" :class="{ active: type == 1 }" @click="type = 1"
@@ -43,8 +43,10 @@
       ></editBox>
       <checkBox v-if="type == 2" :cJson="checkJson" :title="title"></checkBox>
     </div>
-		<div class="ajaxCancel" v-if="loading && ajaxCancelToken">
-			 <el-button type="primary" @click.stop="cancelAjax">停止生成</el-button>
+		<div class="ajaxCancel" v-if="loading">
+				<img src="../../../../../assets/KekeLoading.gif">
+				<span>小可正在努力生成中...</span>
+			 <el-button type="primary" @click.stop="cancelAjax" size="small" v-if="ajaxCancelToken">停止生成</el-button>
 		</div>
   </div>
 </template>
@@ -298,9 +300,9 @@ Instruction: Based on the context, follow "Format example", write content
 说明:文档中的总标题下的说明性文字
 
 ##题目格式
-问答题:{"ttype":1,"type":3,"json":{"title":"标题","type":1,"answer":""}}
-单选:{"ttype":1,"type":1,"json":{"title":"标题","type":1,"array":[{"option":"选项1","img":""}, {"option":"选项2","img":""}],"answer":""}}
-多选:{"ttype":1,"type":1,"json":{"title":"标题","type":2,"array":[{"option":"选项1","img":""},{"option":"选项2","img":""}],"answer":""}}
+文本:{"ttype":1,"type":3,"json":{"title":"标题","type":1,"answer":""}}
+单选:{"ttype":1,"type":1,"json":{"title":"标题","type":1,"array":[{"option":"选项1","img":""}, {"option":"选项2","img":""}],"answer":""}}
+多选:{"ttype":1,"type":1,"json":{"title":"标题","type":2,"array":[{"option":"选项1","img":""},{"option":"选项2","img":""}],"answer":""}}
 
 标题和说明:{"formName":"标题","illustrate":"说明"}
 
@@ -502,17 +504,28 @@ Instruction: Based on the context, follow "Format example", write content
 
 .ajaxCancel{
 	position: fixed;
-	top: calc(50vh + 100px);
+	top: calc(50vh + 20px);
 	left: 50vw;
 	transform: translate(-50%,-50%);
 	z-index: 9999;
 	width: 150px;
 	height: 80px;
-	background: #fff;
 	border-radius: 5px;
 	display: flex;
 	flex-direction: column;
 	align-items: center;
 	justify-content: center;
 }
+
+.ajaxCancel>span{
+	margin-bottom: 10px;
+	color: #3681FC;
+	white-space: nowrap;
+}
+
+.ajaxCancel>img{
+	width: 200px;
+	height: 200px;
+	margin-bottom: -50px;
+}
 </style>

+ 4 - 0
src/components/pages/test/add/global_styles.css

@@ -100,3 +100,7 @@
 	border: 1px solid #409EFF !important;
 	color: #fff !important;
 }
+
+.t_empty{
+	color: #757575;
+}

+ 11 - 6
src/components/pages/test/add/minxins/minxin.js

@@ -19,7 +19,7 @@ const minxin = {
         // },
         {
           value: 3,
-          label: "问答题"
+          label: "文本"
         },
         // {
         //   value: 4,
@@ -43,12 +43,16 @@ const minxin = {
         },
         {
           value: 9,
-          label: "单选"
+          label: "单选"
         },
         {
           value: 10,
-          label: "多选"
+          label: "多选"
         },
+				{
+					value:12,
+					label:"扫一扫"
+				}
       ]))),
       optionsPin:JSON.parse(converter(JSON.stringify([
        {
@@ -63,15 +67,16 @@ const minxin = {
       options2: JSON.parse(converter(JSON.stringify({
         1: "选择题",
         // 2: "问答题",
-        3: "问答题",
+        3: "文本",
         4: "添加文档",
         5: "附件",
         6: "课程",
         7: "评分",
         8: "日期",
-        9: "单选",
-        10: "多选",
+        9: "单选",
+        10: "多选",
         11: "课程",
+				12:"扫一扫"
       }))),
       buttonOptions: JSON.parse(converter(JSON.stringify([
         { name: "分组", type: 1 },

+ 129 - 31
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,14 +316,15 @@ export default {
           });
           _index++;
         } else if (_item.type == 1) {
+          //单选题
           let _item2 = _item.json;
           let choseTxt = ``;
           _item2.array.forEach((i, index2) => {
             choseTxt += `${
               _item2.answer2 === index2 || _item2.answer2.includes(index2)
-                ? "☑"
-                : ""
-            }${i.option}    `;
+                ? "☑"+i.option
+                : ""
+            }`;
           });
           _list.push({
             name: _item2.title,
@@ -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,25 @@ export default {
               `{${fieldList[i].field}}`,
               fieldList[i].value
             );
+          } else if (fieldList[i].type == "file") {
+            let _text = ``;
+            // this.fieldList[i].value.forEach(async f => {
+            for (let j = 0; j < fieldList[i].value.length; j++) {
+              let f = 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/>`;
+                console.log(_text)
+              } else {
+                _text += `<a href="${f.url}" target="_blank">${f.name}</a><br/>`;
+              }
+            }
+            _html = _html.replaceAll(`{${fieldList[i].field}}`, _text);
+            // });
           }
         }
 
@@ -504,8 +575,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 +878,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 +1294,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 +1313,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 +1358,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 +1395,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 {

Файловите разлики са ограничени, защото са твърде много
+ 583 - 174
src/components/pages/test/check/index.vue


Файловите разлики са ограничени, защото са твърде много
+ 526 - 226
src/components/pages/test/checkAi/aiLeader.vue


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

@@ -0,0 +1,52 @@
+<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.chartData = JSON.parse(JSON.stringify(this.data))
+			this.getChartData();
+    },
+	},
+	methods: {
+		getChartData() {
+      if(!this.chartObj){
+        this.chartObj = echarts.init(this.$refs.chartRef);
+      }
+      if(!this.chartData){
+        this.chartData = JSON.parse(JSON.stringify(this.data))
+      }
+			this.chartObj.setOption(this.chartData);
+			window.addEventListener("resize", () => {
+					this.chartObj.resize();
+      });
+		},
+	},
+	mounted() {
+		this.getChartData();
+	},
+};
+</script>
+
+<style scoped>
+.chart {
+	max-width: 100%;
+	width: 100%;
+	height: 100%;
+}
+</style>

+ 92 - 71
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.label" 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 });
@@ -54,44 +63,45 @@ export default {
     url: {
       type: String,
       default: ""
-    },
+    }
+  },
+  data() {
+    return {
+      content: "",
+      loading: true,
+      tableData: [],
+      columnList: []
+    };
   },
-	data(){
-		return{
-			content:"",
-			loading:true,
-			tableData:[],
-			columnList:[],
-		}
-	},
-	methods: {
-		getTxtContent() {
-			if(!this.url)return;
-			this.loading = true;
-			getFile(this.url).then(res=>{
-				this.loading = false;
-				let tableDataObj = this.formatCSVToTable(res.data);
-				this.tableData = tableDataObj;
-				let column = [];
-				for(let i in tableDataObj[0]){
-				  column.push({
-						label:i,
-						prop:i
-					})
-				}
-				this.columnList = column;
-				this.content = res.data;
-			})
-		},
-		formatCSVToTable(str){
+  methods: {
+    getTxtContent() {
+      if (!this.url) return;
+      this.loading = true;
+      getFile(this.url).then(res => {
+        this.loading = false;
+        let tableDataObj = this.formatCSVToTable(res.data);
+        console.log(tableDataObj)
+        this.tableData = tableDataObj.result;
+        let column = [];
+        tableDataObj.header.forEach((item, index) => {
+          column.push({
+            label: item,
+            prop: `header_${index}`
+          })
+        })
+        this.columnList = column;
+        this.content = res.data;
+      });
+    },
+    formatCSVToTable(str) {
       const result = [];
       const jsonObj = str.split("\n");
       let arrHeader = [];
       for (const i in jsonObj) {
-        if (typeof jsonObj[i] === 'string' && jsonObj[i].length > 0) {
+        if (typeof jsonObj[i] === "string" && jsonObj[i].length > 0) {
           const row = `${jsonObj[i]}`;
           if (row.trim().length > 0) {
-            const kv = jsonObj[i].split(',');
+            const kv = jsonObj[i].split(",");
             if (i == 0) {
               // 获取column表头
               arrHeader = kv;
@@ -99,17 +109,17 @@ export default {
               const obj = {};
               for (let index = 0; index < arrHeader.length; index++) {
                 // 组装表格数据
-                const name = String(arrHeader[index]);
-                if (!arrHeader[index]) continue
+                const name = `header_${index}`
+                if (!arrHeader[index]) continue;
                 if (!obj[name]) {
                   try {
                     if (kv[index]) {
                       obj[name] = String(kv[index]);
                     } else {
-                      obj[name] = '';
+                      obj[name] = "";
                     }
                   } catch (err) {
-                    obj[name] = '';
+                    obj[name] = "";
                   }
                 }
               }
@@ -118,41 +128,52 @@ export default {
           }
         }
       }
-      return result
+      return { result: result, header: arrHeader };
+    },
+  },
+  watch: {
+    url(newVal, oldVal) {
+      if (newVal !== oldVal) {
+        this.getTxtContent();
+      }
     }
-	},
-	watch:{
-		url(newVal,oldVal){
-			if(newVal!==oldVal){
-				this.getTxtContent();
-			}
-		}
-	},
-	mounted(){
-		this.getTxtContent();
-	}
+  },
+  mounted() {
+    this.getTxtContent();
+  }
 };
 </script>
 
 <style scoped>
-.txtView{
-	width: 100%;
-	height: 100%;
-	box-sizing: border-box;
-	background-color: #ececec;
-	padding: 0px 0px;
+.txtView {
+  width: 100%;
+  height: 100%;
+  box-sizing: border-box;
+  background-color: #ececec;
+  padding: 0px 0px;
 }
 
-.tv_content{
-	width: 100%;
-	height: 100%;
-	box-sizing: border-box;
-	background-color: #fff;
-	overflow: auto;
-	word-wrap: break-word;
-	border-radius: 3px;
-	white-space: pre;
-	box-sizing: border-box;
-	padding: 10px;
+.tv_content {
+  width: 100%;
+  /* height: 100%; */
+  box-sizing: border-box;
+  background-color: #fff;
+  overflow: auto;
+  word-wrap: break-word;
+  border-radius: 3px;
+  white-space: pre;
+  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>

+ 5 - 3
src/components/pages/test/choseCheck/index.vue

@@ -34,13 +34,13 @@
 			</div>
 			<div class="cc_b_right">
 				<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}">
 							<el-tooltip  class="item" effect="dark" :content="item.name" placement="top">
 								<span>{{item.name}}</span>
 						</el-tooltip>
 						</div>
-					
+
 				</div>
 				<div class="cc_b_r_content">
 					<!-- <iframe
@@ -341,7 +341,7 @@ export default {
 				_cidList.sort((a, b) => parseInt(b) - parseInt(a));
 				_result = _cidList.join(',');
 			}
-			
+
 			return _result
 		},
 		getFileLoading(){
@@ -398,6 +398,8 @@ export default {
 .cc_b_right{
 	width: 50%;
 	height: 100%;
+  max-height: 100%;
+  overflow: auto;
 	box-sizing: border-box;
 	border-left: 1px solid #E4E7ED;
 }

+ 580 - 71
src/components/pages/test/smarter.vue

@@ -16,7 +16,7 @@
                         )
                         ">表单管理</span>
                     <!-- v-show="oid == '4c686762-1d0a-11ed-8c78-005056b86db5'" -->
-                    <span class="subClick"  @click="
+                    <span class="subClick" @click="
                         goTo(
                             '/trainCourse?userid=' +
                             userid +
@@ -42,7 +42,7 @@
                         ">数据看板</span>
                     <span class="sub_head">智能助手</span>
                 </div>
-                <div class="pb_head_t_right">
+                <!-- <div class="pb_head_t_right">
                     <el-tooltip class="item" effect="dark" content="预览" placement="bottom">
                         <span class="preview_icon"></span>
                     </el-tooltip>
@@ -52,58 +52,156 @@
                     <el-tooltip class="item" effect="dark" content="问题" placement="bottom">
                         <span class="problem_icon"></span>
                     </el-tooltip>
-                </div>
+                </div> -->
             </div>
         </div>
         <div class="cc_bottom">
-            <smartMenu></smartMenu>
-            <div class="cc_b_middle">
-                <div  style="width:100%;height: 100%;">
-                    <aiLeader :courseId="aiBoxRightCid" :worksArray="courseInfoList" ref="aiChat"
-                        @pushFileData="pushFileData" @clearFileData="clearFileData"></aiLeader>
+            <div class="cc_b_left">
+                <div class="menu_container">
+                    <div :class="['cc_b_l_menu', { active: activeMenu === 1 }]" @click="activeMenu = 1">
+                        <span :class="['session_icon', { active: activeMenu === 1 }]"></span>
+                        <div style="margin-left: 10px;margin-top: 1px;font-size: 15px;">当前会话</div>
+                    </div>
+                    <div :class="['cc_b_l_menu', { active: activeMenu === 2 }]" @click="activeMenu = 2">
+                        <span :class="['history_icon', { active: activeMenu === 2 }]"></span>
+                        <div style="margin-left: 10px;margin-top: 1px;font-size: 15px;">历史会话</div>
+                    </div>
+                    <!--<div :class="['cc_b_l_menu', { active: activeMenu === 3 }]" @click="activeMenu = 3">
+                            <span :class="['mysql_icon', { active: activeMenu === 3 }]"></span>
+                            <div style="margin-left: 10px;margin-top: 1px;font-size: 15px;">数据库管理</div>
+                        </div> -->
+                </div>
+                <div class="fold_btn">
+                    <span class="more_icon"></span>
                 </div>
             </div>
-            <div class="cc_b_right">
-                <div v-if="showFileUrl">
-                    <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 }">
-                            <el-tooltip class="item" effect="dark" :content="item.name" placement="top">
-                                <span>{{ item.name }}</span>
-                            </el-tooltip>
-                            <!-- <div class="cc_b_r_btn"> -->
-                                <span class="close_icon" :class="{ active: menuIndex == index }" @click="deleteMenuItem(index)"></span>
-                            <!-- </div> -->
+            <div v-show="activeMenu == 1" style="width:100%;display: flex;">
+                <div class="cc_b_middle">
+                    <div style="width:100%;height: 100%;">
+                        <aiLeader :courseId="aiBoxRightCid" :worksArray="courseInfoList" :formList="menuList" ref="aiChat"
+                            @pushFileData="pushFileData" @clearFileData="clearFileData"></aiLeader>
+                    </div>
+                </div>
+                <div class="cc_b_right">
+                    <div v-if="showFileUrl">
+                        <!-- <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: -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 }">
+                                <el-tooltip class="item" effect="dark" :content="item.name" placement="top">
+                                    <span>{{ item.name }}</span>
+                                </el-tooltip>
+                                <!-- <div class="cc_b_r_btn"> -->
+                                <span class="close_icon" :class="{ active: menuIndex == index }"
+                                    @click="deleteMenuItem(index)"></span>
+                                <!-- </div> -->
+                            </div>
+                        </div>
+                        <div class="cc_b_r_content">
+                            <csvTableView v-if="showFileUrl" :url="showFileUrl" />
                         </div>
+                        <!-- </div> -->
+                        <!-- <div v-if="fileMenu == 2">
+                            <div class="bianji_area">
+                                <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 class="cc_b_r_content">
-                        <csvTableView v-if="showFileUrl" :url="showFileUrl" />
+                    <div v-else style="margin: 40px 0px 0px 20px">
+                        <div>--官方能力演示--</div>
+                        <div class="b_r_menu">
+                            <div class="b_r_menu_content">
+                                <div class="m_c_title">数据处理</div>
+                                <div class="m_c_item">缺失值处理</div>
+                                <div class="m_c_item">无效样本处理</div>
+                                <div class="m_c_item">数据降维</div>
+                            </div>
+                            <div class="b_r_menu_content">
+                                <div class="m_c_title">数据分析</div>
+                                <div class="m_c_item">线性回归</div>
+                                <div class="m_c_item">相关性分析</div>
+                                <div class="m_c_item">关联分心</div>
+                            </div>
+                            <div class="b_r_menu_content">
+                                <div class="m_c_title">图标生成</div>
+                                <div class="m_c_item">箱线图</div>
+                                <div class="m_c_item">雷达图</div>
+                            </div>
+                        </div>
                     </div>
                 </div>
-                <div v-else  style="margin: 40px 0px 0px 20px">
-                    <div>--官方能力演示--</div>
-                    <div class="b_r_menu">
-                        <div class="b_r_menu_content">
-                            <div class="m_c_title">数据处理</div>
-                            <div class="m_c_item">缺失值处理</div>
-                            <div class="m_c_item">无效样本处理</div>
-                            <div class="m_c_item">数据降维</div>
-                        </div>
-                        <div class="b_r_menu_content">
-                            <div class="m_c_title">数据分析</div>
-                            <div class="m_c_item">线性回归</div>
-                            <div class="m_c_item">相关性分析</div>
-                            <div class="m_c_item">关联分心</div>
+            </div>
+            <div v-show="activeMenu == 2" style="width:calc(100% - 148px);">
+                <div class="history_talk">
+                    <div class="h_t_head">
+                        <div class="t_h_left">
+                            <span style="font-weight: bold;font-size: 18px;">历史回溯</span>
+                            <span>共计{{ tableData.length }}个会话</span>
                         </div>
-                        <div class="b_r_menu_content">
-                            <div class="m_c_title">图标生成</div>
-                            <div class="m_c_item">箱线图</div>
-                            <div class="m_c_item">雷达图</div>
+                        <div class="t_h_right">
+                            <div style="margin-right: 10px;position: relative;">
+                                <el-input v-model="talkName" class="student_input" placeholder="检索会话名称"></el-input>
+                                <span class="serach_icon" @click="historyTalk()"></span>
+                            </div>
                         </div>
                     </div>
+                    <div class="h_t_table">
+                        <el-table :data="tableData" style="width: 100%;cursor: pointer" @row-click="handleRowClick">
+                            <el-table-column prop="name" label="会话名称" >
+                            </el-table-column>
+                            <el-table-column prop="ctime" label="创建时间" width="180">
+                            </el-table-column>
+                            <el-table-column prop="utime" label="更新时间" width="180">
+                            </el-table-column>
+                            <el-table-column prop="control" label="操作" width="200">
+                                <template slot-scope="scope">
+                                    <div style="display: flex;">
+                                        <div class="bianji">
+                                            <i class="el-icon-edit"></i>
+                                            <span @click.stop="openUpdate(scope.row.name, scope.row.id)">重命名</span>
+                                        </div>
+                                        <div class="bianji">
+                                            <i class="el-icon-delete"></i>
+                                            <span @click.stop="delete_talk(scope.row.id)">删除</span>
+                                        </div>
+                                    </div>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                    </div>
+                    <div class="h_t_bottom">
+                        <span>共{{ tableData.length }}条</span>
+                        <el-pagination background layout="prev, pager, next" :page-size="pageSize" :current-page="page"
+                            :total="total" @current-change="handleCurrentChange"></el-pagination>
+                        <!-- <el-select v-model="value" placeholder="请选择页数" size="mini" class="el_select">
+                            <el-option v-for="item in options" :key="item.value" :label="item.label"
+                                :value="item.value">
+                            </el-option>
+                        </el-select> -->
+                    </div>
+
                 </div>
             </div>
         </div>
+        <el-dialog title="修改会话名称" :visible.sync="dialogVisibleUpdate" :append-to-body="true" :before-close="handleClose"
+            class="dialog_diy">
+            <el-form>
+                <el-form-item label="会话名称" :label-width="formLabelWidth">
+                    <el-input v-model="talkName1" auto-complete="off" placeholder="请输入会话名称..."></el-input>
+                </el-form-item>
+            </el-form>
+            <span class="rename_btn">
+                <el-button @click="dialogVisibleUpdate = false">取 消</el-button>
+                <el-button type="primary" @click="UpdateTalkName()">确 定</el-button>
+            </span>
+        </el-dialog>
     </div>
 </template>
 
@@ -117,9 +215,8 @@
 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 smartMenu from "./smartBox/smartMenu.vue";
 import csvTableView from "./choseCheck/csvTableView.vue";
 
 
@@ -127,7 +224,7 @@ export default {
     name: 'smarter',
     components: {
         radarZong, radarTeacher, Cascader,
-        aiLeader, txtView, smartMenu, csvTableView
+        aiLeader, csvTableView
     },
     data() {
         return {
@@ -138,14 +235,121 @@ export default {
             role: this.$route.query.role,
             cid: this.$route.query.cid,
             menuList: [],
+            aiContentArea: [],
             menuIndex: 0,
             courseInfoList: [],
+            page: 1,
+            total: 0,
+            talkName: '',
+            talkName1: '',
+            chatId: '',
+            formLabelWidth: "100px",
+            pageSize: 8,
             loading: true,
             activeMenu: 1, // 默认激活第一个
-            examineData:[]
+            fileMenu: 1,
+            cutNumber: 1,
+            dialogVisibleUpdate: false,
+            // bianjiText:"",
+            // userAsk:"",
+            examineData: [],
+            tableData: [],
+            options: [{
+                value: '1',
+                label: '20条/页'
+            }, {
+                value: '2',
+                label: '双皮奶'
+            }],
+            value: '1'
+
         };
     },
     methods: {
+        handleRowClick(row, column, event) {
+            this.activeMenu = 1;
+            console.log(JSON.stringify(row))
+            this.$nextTick(() => {
+                // 调试输出
+                console.log(this.$refs.aiChat);
+                if (this.$refs.aiChat) {
+                    this.$refs.aiChat.getChatList(row.chatid);
+                    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');
+                }
+            });
+        },
+        openUpdate(name, id) {
+            this.talkName1 = name;
+            this.chatId = id;
+            this.dialogVisibleUpdate = true;
+        },
+        UpdateTalkName() {
+            const j = this.menuList.map(i => i.url).join(",")
+            let params = [{
+                id: this.chatId,
+                name: this.talkName1,
+                j:j
+            }];
+            this.ajax
+                .post(this.$store.state.api + "updateChat", params)
+                .then(res => {
+                    if (this.talkName1 == '') {
+                        this.$message({
+                            message: "不能为空",
+                            type: "error",
+                        });
+                    } else {
+                        this.$message({
+                            message: "修改成功",
+                            type: "success",
+                        });
+                        this.dialogVisibleUpdate = false;
+                        this.historyTalk();
+                        this.talkName1 = '';
+                    }
+                })
+                .catch((err) => {
+                    console.error(err);
+                })
+        },
+        delete_talk(id) {
+            let params = [{
+                id: id
+            }]
+            this.$confirm("确定删除此会话吗?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+            })
+                .then(() => {
+                    this.ajax
+                        .post(this.$store.state.api + "deleteChat", params)
+                        .then((res) => {
+                            this.$message({
+                                message: "删除成功",
+                                type: "success",
+                            });
+                            this.historyTalk();
+                        })
+                        .catch((err) => {
+                            this.$message.error("删除失败");
+                            console.error(err);
+                        });
+                })
+                .catch(() => { });
+        },
+        handleCurrentChange(newPage) {
+            this.page = newPage;
+            this.historyTalk();
+        },
+        handleClose(done) {
+            done();
+        },
         // 获取基础页面数据
         getPageBase() {
             let params = {
@@ -157,11 +361,11 @@ export default {
             this.ajax
                 .get(this.$store.state.api + "selectTestExamineBase", params)
                 .then(res => {
-                    console.log('selectTestExamineBase',res.data[0]);
-                    this.examineData=res.data[0]
+                    console.log('selectTestExamineBase', res.data[0]);
+                    this.examineData = res.data[0]
                 })
                 .catch(error => {
-                console.log(error);
+                    console.log(error);
                 });
         },
         deleteMenuItem(index) {
@@ -169,14 +373,50 @@ export default {
             this.menuIndex = 0
             this.$refs.aiChat.delFileList(index)
             this.$forceUpdate()
-            console.log('menuList',this.menuList);
-            
+            console.log('menuList', this.menuList);
+
+        },
+
+        historyTalk() {
+            let params = {
+                uid: this.userid,
+                n: this.talkName,
+                page: this.page,
+                num: this.pageSize
+            };
+            this.ajax
+                .get(this.$store.state.api + "getChatHistory", params)
+                .then((res) => {
+                    this.tableData = res.data[0]
+                    console.log("tableData", this.tableData);
+                    this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
+                    console.log("111111", this.total);
+
+
+                })
+                .catch((err) => {
+                    console.error(err);
+                });
         },
         pushFileData(data) {
             this.menuList.push(data)
             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);
+
+        // },
         clearFileData() {
             this.menuList = []
         },
@@ -195,10 +435,13 @@ export default {
                     promiseList.push(this.getCourseData(el))
                 })
                 Promise.all(promiseList).then(res => {
-                    console.log("courseInfoList", this.courseInfoList)
                     this.courseInfoList = res
+                    console.log("courseInfoList", this.courseInfoList)
                     this.loading = false
-                })
+                }).catch(err => {
+                    console.error("Error occurred:", err);
+                    this.loading = false;  // 如果有错误,也要停止loading
+                });
             }
         },
         getCourseData(courseId) {
@@ -294,13 +537,18 @@ 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 ""
+                return "";
             }
         },
         aiBoxRightCid() {
@@ -311,15 +559,27 @@ export default {
                 _cidList.sort((a, b) => parseInt(b) - parseInt(a));
                 _result = _cidList.join(',');
             }
+            console.log("我是cid", _result);
 
             return _result
         }
     },
     mounted() {
         this.getData();
-        this.getPageBase()
+        this.getPageBase();
+        this.historyTalk();
+
+    },
+    watch: {
+        activeMenu(newValue) {
+            if (newValue === 2) {
+                console.log("HelloWorld");
+                this.historyTalk();
+            }
+        },
     }
 
+
 };
 </script>
 
@@ -531,6 +791,31 @@ export default {
     -moz-osx-font-smoothing: grayscale;
 }
 
+.dialog_diy>>>.el-dialog__header {
+    background: #3d67bc !important;
+    padding: 15px 20px;
+}
+
+.dialog_diy>>>.el-dialog__title {
+    color: #fff;
+}
+
+.student_table>>>.el-table--border td {
+    border-right: 0px !important;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn {
+    top: 19px;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn .el-dialog__close {
+    color: #fff;
+}
+
+.dialog_diy>>>.el-dialog__headerbtn .el-dialog__close:hover {
+    color: #fff;
+}
+
 .cc_bottom {
     width: 100%;
     height: calc(100% - 66px - 10px);
@@ -551,12 +836,143 @@ export default {
     height: 100%;
 }
 
+.cc_b_left {
+    border-right: 1px solid #E4E7ED;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+    height: 100%;
+    width: 13%;
+}
+
+.menu_container {
+    flex: 1;
+    /* 占据除折叠按钮外的所有空间 */
+}
+
+.cc_b_l_menu {
+    padding: 10px;
+    margin: 17px;
+    border-radius: 7px;
+    color: #828282;
+    cursor: pointer;
+    display: flex;
+}
+
+.cc_b_l_menu.active {
+    background-color: #3681fc;
+    color: #fff;
+
+}
+
+.session_icon {
+    background: url('../../../assets/icon/test/test_session.png') no-repeat;
+    width: 18px;
+    height: 18px;
+    display: inline-block;
+    background-size: contain;
+}
+
+.session_icon.active {
+    background: url('../../../assets/icon/test/test_session_active.png') no-repeat;
+    width: 18px;
+    height: 18px;
+    display: inline-block;
+    background-size: contain;
+}
+
+.history_icon {
+    background: url('../../../assets/icon/test/test_history.png') no-repeat;
+    width: 18px;
+    height: 18px;
+    display: inline-block;
+    background-size: contain;
+}
+
+.history_icon.active {
+    background: url('../../../assets/icon/test/test_history_active.png') no-repeat;
+    width: 18px;
+    height: 18px;
+    display: inline-block;
+    background-size: contain;
+}
+
+/* .mysql_icon{
+    background:url('../../../../assets/icon/test/test_mysql.png') no-repeat;
+    width: 18px;
+    height: 18px;
+    display: inline-block;
+    background-size: contain;
+}
+.mysql_icon.active{
+    background:url('../../../../assets/icon/test/test_mysql_active.png') no-repeat;
+    width: 18px;
+    height: 18px;
+    display: inline-block;
+    background-size: contain;
+} */
+.fold_btn {
+    padding: 27px 20px;
+    cursor: pointer;
+    border-top: 1px solid #E4E7ED;
+    margin-top: auto;
+    /* 确保折叠按钮在底部 */
+}
+
+.more_icon {
+    background: url('../../../assets/icon/test/test_more.png') no-repeat;
+    width: 14px;
+    height: 14px;
+    display: inline-block;
+    background-size: contain;
+    cursor: pointer;
+}
+
 .cc_b_right {
     width: 50%;
     height: 100%;
     box-sizing: border-box;
 }
 
+.preview_file,
+.bianji_file {
+    margin: 10px;
+    width: 65px;
+    cursor: pointer;
+}
+
+.preview_file.active {
+    border-bottom: 2px solid blue;
+}
+
+.bianji_file.active {
+    border-bottom: 2px solid blue;
+}
+[contenteditable="true"]:focus {
+  outline: none;
+  border: none;
+}
+.bianji_area {
+    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;
@@ -569,15 +985,15 @@ export default {
 
 .cc_b_r_menu>div {
     height: 100%;
-	max-width: 100px;
-	padding: 0 15px;
-	display: flex;
-	text-align: center;
-	/* justify-content: center; */
-	align-items: center;
-	cursor: pointer;
-	transition: all 0.3s;
-	/* text-overflow: ellipsis;
+    max-width: 100px;
+    padding: 0 15px;
+    display: flex;
+    text-align: center;
+    /* justify-content: center; */
+    align-items: center;
+    cursor: pointer;
+    transition: all 0.3s;
+    /* text-overflow: ellipsis;
 	overflow: hidden;
 	white-space: nowrap; */
 }
@@ -600,20 +1016,25 @@ export default {
 
 .cc_b_r_content {
     width: 100%;
-    height: calc(100% - 50px);
+    overflow-y: auto;
+    overflow-x: auto;
+    max-height: 79vh;
 }
-.cc_b_r_btn{
+
+.cc_b_r_btn {
     display: flex;
     align-items: center;
 }
-.close_icon{
+
+.close_icon {
     width: 0 !important;
     height: 22px;
     display: inline-block;
     background-size: contain;
     cursor: pointer;
 }
-.close_icon.active{
+
+.close_icon.active {
     background: url('../../../assets/icon/test/test_close_active.png') no-repeat;
     width: 40px !important;
     height: 22px;
@@ -621,11 +1042,13 @@ export default {
     background-size: contain;
     cursor: pointer;
 }
-.b_r_menu{
+
+.b_r_menu {
     display: flex;
     justify-content: space-around;
 }
-.b_r_menu_content{
+
+.b_r_menu_content {
     display: flex;
     flex-direction: column;
     background: linear-gradient(to bottom, #dfeaff, #ffffff, #f6f9ff);
@@ -634,15 +1057,101 @@ export default {
     width: 50%;
     margin-right: 14px
 }
-.m_c_title{
+
+.m_c_title {
     margin: 10px 7px 7px 21px;
     font-size: 16px;
     font-weight: bold;
 }
-.m_c_item{
+
+.m_c_item {
     border-radius: 5px;
     padding: 8px 8px 8px 13px;
     margin: 7px;
     border: 1px solid #E4E7ED;
 }
-</style>
+
+.history_talk {
+    background: linear-gradient(to bottom, #dfeaff, #ffffff, #f6f9ff);
+    margin: 13px;
+    padding: 10px;
+}
+
+.h_t_head {
+    display: flex;
+    justify-content: space-between;
+}
+
+.t_h_left {
+    margin-left: 13px;
+    font-size: 13px;
+}
+
+.h_t_table {
+    margin: 10px;
+    box-shadow: 0px 0px 12px rgb(190 193 199);
+}
+
+.h_t_table>>>.el-table td,
+.el-table th {
+    padding: 9px 0;
+}
+
+.bianji {
+    display: flex;
+    align-items: center;
+    margin-right: 10px;
+}
+
+.bianji:hover {
+    color: rgb(14, 173, 236);
+    cursor: pointer;
+}
+
+.rename_btn {
+    display: flex;
+    justify-content: flex-end;
+}
+
+.h_t_bottom {
+    display: flex;
+    justify-content: flex-end;
+    align-items: center;
+    margin-right: 9px;
+}
+
+.el_select {
+    width: 89px;
+}
+
+
+.table_title {
+    background-color: gray;
+}
+
+.student_input>>>.el-input__inner {
+    height: 30px;
+    width: 179px;
+    font-size: 13px;
+    padding: 0 10px;
+}
+
+.serach_icon {
+    position: absolute;
+    right: 12px;
+    top: 50%;
+    transform: translateY(-50%);
+    width: 13px;
+    height: 13px;
+    background: url("../../../assets/icon/test/test_search.png") no-repeat;
+    background-size: 100% 100%;
+    cursor: pointer;
+}
+
+.el-input {
+    position: relative;
+    font-size: 14px;
+    display: inline-block;
+    width: 100%;
+}
+</style>

+ 39 - 6
src/components/pages/testPerson/info/infoDialog/index.vue

@@ -1,6 +1,6 @@
 <template>
   <el-dialog title="编辑个人信息" :visible.sync="dialogVisibleInfo" :append-to-body="true" width="500px"
-    :before-close="handleClose" class="dialog_diy">
+    :before-close="handleClose" class="dialog_diy" :show-close="isClosed">
     <div style="width:100%;height: 100%;">
       <div class="info_box">
         <div class="img" v-loading="imgLoading">
@@ -21,7 +21,7 @@
           </el-select>
         </div> -->
 
-        <div class="info_span" v-for="item in teaType" :key="item.id">
+        <div class="info_span" v-for="item in teaType" :key="item.id" :class="{ 'error-text': !item.value.length, 'error-border': !item.value.length }">
           <span>
             {{ item.name + ":" }}
           </span>
@@ -48,7 +48,7 @@
     </div>
     <span slot="footer" class="dialog-footer">
       <el-button type="primary" @click="confirm()">确 认</el-button>
-      <el-button @click="close()">关 闭</el-button>
+      <el-button @click="close()" v-if="isClosed">关 闭</el-button>
     </span>
   </el-dialog>
 </template>
@@ -105,12 +105,13 @@ export default {
       typeId2: "",
       formLabelWidth: "100px",
       oidArray: ["d67940a5-510c-40ea-9c9a-2631ab03013a"],
-      resultInfo: '' // 用于存储字符串
+      resultInfo: '', // 用于存储字符串
+      isClosed: true,
     };
   },
   mounted() {
     this.$nextTick();
-
+    this.getTypeInfo();
   },
   methods: {
     cha(rows) {
@@ -170,6 +171,10 @@ export default {
 
     },
     confirm() {
+      if(!this.panData()){
+        this.$message.error('请完善教研室分类信息');
+        return;
+      }
       if (!this.info.username) {
         this.$message.error("姓名不能为空!");
         return
@@ -215,20 +220,40 @@ export default {
           }
           this.info.teacherOffice = this.arrayToArray(this.info.cclassid.split(','), array)
           console.log(this.info.cclassid);
-          
+          let count = 0
           this.teaType.forEach(e =>{
             let array2 = []
             for (var i = 0; i < e.child.length; i++) {
               array2.push(e.child[i].id)
             }
             e.value = this.arrayToArray(this.info.cclassid.split(','), array2)
+            if(e.value.length){
+              count++
+            }
           })
+          if(count != this.teaType.length){
+            this.$emit("update:dialogVisibleInfo", true);
+          }
+          if(!this.panData()){
+            this.isClosed = false
+          }else {
+            this.isClosed = true
+          }
           this.$forceUpdate();
         })
         .catch((err) => {
           console.error(err);
         });
     },
+    panData(){
+      let count = 0
+      this.teaType.forEach(e =>{
+        if(e.value.length){
+          count++
+        }
+      })
+      return count == this.teaType.length
+    },
     arrayToArray(arrayo, arrayt) {
       let array1 = arrayo;
       let array2 = arrayt;
@@ -499,4 +524,12 @@ export default {
 .info_span>div {
     width: 250px;
 }
+
+.error-border >>> .el-input__inner {
+  border: 1px solid red; /* 红色边框 */
+}
+
+.error-text {
+  color: red; /* 红色文字 */
+}
 </style>

+ 3 - 1
src/components/pages/testStudent/view/component/choice.vue

@@ -23,6 +23,8 @@
                         }}分</span>
                 </div>
             </div>
+            <div class="detail" v-if="checkJson.detail" v-html="checkJson.detail"
+                style="color: #00000066;margin-top: 5px;"></div>
             <div class="choices">
                 <div class="choice" v-for="(item, index) in checkJson.array" :key="index">
                     <div class="choice_c" v-if="checkJson.type == 2" @click="check(checkJson.type, index)"><el-checkbox v-model="checkJson.answer2"
@@ -292,4 +294,4 @@ export default {
 	cursor: pointer;
 	margin-bottom: 10px;
 }
-</style>
+</style>

+ 5 - 3
src/components/pages/testStudent/view/component/gap.vue

@@ -15,9 +15,9 @@
                 <span style="color: #efa030;display: flex;margin-top: 5px;line-height: 18px;">
                     <span style="min-width: fit-content;" v-if="!checkJson.answer && see">暂无参考答案</span>
                     <span style="min-width: fit-content;display: flex;" v-else-if="see">
-                        <span style="min-width: fit-content;">参考答案:</span> 
+                        <span style="min-width: fit-content;">参考答案:</span>
                         <span>{{ checkJson.answer }}</span>
-                    </span> 
+                    </span>
                     <!-- <span style="min-width: fit-content;margin-left: 10px;">{{ checkJson.score ? '分值:'+checkJson.score+'分' : '' }}</span> -->
                 </span>
                     <!-- </div><div v-html="checkJson.title"></div> -->
@@ -29,6 +29,8 @@
                     <span>{{ checkJson.score2 }}分</span><span style="margin: 0 10px;">/</span><span>{{ checkJson.score }}分</span>
                 </div>
             </div>
+            <div class="detail" v-if="checkJson.detail" v-html="checkJson.detail"
+                style="color: #00000066;margin-top: 5px;"></div>
             <div class="choices">
                 <textarea  :readonly="checktype == 2" rows="2" v-autoHeight="68" class="binfo_input binfo_textarea" cols v-model="checkJson.answer2"
                     placeholder=""></textarea>
@@ -335,4 +337,4 @@ export default {
 	border-color: #E7E7E7;
 	border-radius: 8px;
 }
-</style>
+</style>

+ 266 - 0
src/components/pages/testStudent/view/component/sweep.vue

@@ -0,0 +1,266 @@
+<template>
+  <div class="c_box">
+    <div class="choice_box">
+      <div class="title" style="display: flex;align-items: center;">
+        <span class="g_t_index" style="min-width: fit-content;">{{
+          tindex + 1
+        }}</span>
+        <span>{{ checkJson.title }}</span>
+      </div>
+      <div
+        class="detail"
+        v-if="checkJson.detail"
+        v-html="checkJson.detail"
+        style="color: #00000066;margin-top: 5px;"
+      ></div>
+
+			<div
+        class="detail"
+        v-if="checkJson.answer2 && typeof checkJson.answer2=='string'"
+        v-html="checkJson.answer2"
+        style="color: #000000;margin-top: 5px;"
+      ></div>
+			<el-button @click="sweepBtn" type="primary" size="mini" style="margin-top: 10px;">扫一扫</el-button>
+    </div>
+
+  </div>
+</template>
+
+<script>
+
+export default {
+  props: {
+    tindex: {
+      type: Number
+    },
+    cJson: {
+      type: Object
+    },
+    checktype: {
+      type: Number,
+      default: 1
+    },
+    see: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      option: {
+        1: { name: "附件" }
+      },
+      userid: this.$route.query.userid,
+      checkJson: {
+				title:"",
+				detail:""
+			},
+    };
+  },
+  watch: {
+    checkJson: {
+      handler(newValue) {
+        this.$emit("update:cJson", newValue);
+      },
+      deep: true
+    }
+  },
+  methods: {
+
+    depthCopy(s) {
+      return JSON.parse(JSON.stringify(s));
+    },
+
+		sweepBtn(){
+			this.$message.error("请到手机端内扫码")
+		}
+  },
+  mounted() {
+    this.checkJson = this.cJson ? this.depthCopy(this.cJson) : undefined;
+  }
+};
+</script>
+
+<style scoped>
+.c_box {
+  width: 100%;
+  position: relative;
+	padding-left: 45px;
+}
+
+/* .mask {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+    z-index: 2;
+} */
+
+.choice_box {
+  white-space: pre-line;
+}
+
+.choice_box > .title {
+  font-weight: bold;
+  width: 100%;
+  word-break: break-all;
+}
+
+.choice_box > .choices {
+  margin-top: 10px;
+}
+
+.choices > .page {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+}
+
+.p_page {
+  margin: 0 10px;
+}
+
+.course {
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+}
+
+.course + .course {
+  margin-top: 10px;
+}
+
+.course > .banner {
+  width: 200px;
+  height: 120px;
+  border-radius: 5px;
+  overflow: hidden;
+  border: 1px solid #3896fc;
+  box-sizing: border-box;
+  padding: 5px;
+  margin-right: 15px;
+}
+.course > .banner > img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+.course > .content {
+}
+.course > .content > .c_c {
+}
+.course > .content > .c_c + .c_c {
+  margin-top: 5px;
+}
+.course > .content > .c_c span:nth-child(1) {
+}
+.course > .content > .c_c span:nth-child(2) {
+}
+
+.g_t_index {
+  color: #3681fc;
+  font-size: 28px;
+  font-weight: bold;
+  position: relative;
+  margin-right: 30px;
+  margin-left: -40px;
+}
+
+.g_t_index + span {
+  font-weight: bold;
+  font-size: 18px;
+}
+
+.g_t_index::after {
+  content: "";
+  width: 18px;
+  height: 2px;
+  position: absolute;
+  right: -18px;
+  top: 50%;
+  transform: translateY(-50%);
+  background: #3681fc;
+}
+
+.g_t_index::before {
+  content: "";
+  width: 6px;
+  height: 6px;
+  border-right: 2px solid #3681fc;
+  border-top: 2px solid #3681fc;
+  position: absolute;
+  right: -15px;
+  top: 50%;
+  transform: rotate(45deg) translateY(-5px);
+}
+
+.c_list {
+  width: calc(100% - 10px);
+  min-height: 200px;
+  height: auto;
+  border: 1px solid #e7e7e7;
+  border-radius: 5px;
+  box-sizing: border-box;
+  padding: 10px;
+  display: flex;
+  flex-wrap: wrap;
+  /* overflow: auto; */
+}
+
+.c_l_add1 {
+  width: 100%;
+  height: 200px;
+  background-color: #F9FAFB;
+	border: 1.5px dashed #dfdfdf;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: #00000066;
+  border-radius: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.c_l_add2{
+	width: 230px;
+  height: 200px;
+	background-color: #F9FAFB;
+	border: 1.5px dashed #dfdfdf;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: #00000066;
+  border-radius: 5px;
+  font-size: 18px;
+  cursor: pointer;
+}
+
+.c_l_item {
+  width: 230px;
+  height: 200px;
+  margin-right: 10px;
+  box-sizing: border-box;
+  border: solid 1px #3896FC;
+  border-radius: 5px;
+	cursor: pointer;
+	box-sizing: border-box;
+	padding: 5px;
+}
+
+.c_l_item > img {
+  width: 100%;
+  height: 110px;
+  object-fit: cover;
+	margin-bottom: 5px;
+}
+
+.c_l_item > div {
+  width: 210px;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  font-size: 14px; /* 设置字体大小 */
+  color: #333; /* 设置字体颜色 */
+	box-sizing: border-box;
+}
+</style>

+ 21 - 4
src/components/pages/testStudent/view/component/topic.vue

@@ -27,6 +27,8 @@
               :isTeacher="isTeacher"></timeV>
             <courseV2 :tindex="index" :cJson.sync="item.json" :checktype="checktype" v-else-if="item.type == 11"
               :see="see" :isTeacher="isTeacher" @getTestWorkByCid="getTestWorkByCid" @publish2="publish2" :issetPage.sync="issetPage" :tid="tid"></courseV2>
+							<sweep :tindex="index" :cJson.sync="item.json" :checktype="checktype" v-else-if="item.type == 12"
+							:see="see" :isTeacher="isTeacher"></sweep>
             <!-- <span v-else>暂未设置题目</span> -->
           </div>
           <div v-for="(item2, index2) in item.array" :key="`${index}-${index2}`" class="check_box_xia">
@@ -45,6 +47,8 @@
                 :see="see" :isTeacher="isTeacher"></evaV>
               <timeV :tindex="index2" :cJson.sync="item2.json" :checktype="checktype" v-else-if="item2.type == 8"
                 :see="see" :isTeacher="isTeacher"></timeV>
+								<sweep :tindex="index2" :cJson.sync="item2.json" :checktype="checktype" v-else-if="item2.type == 12"
+								:see="see" :isTeacher="isTeacher"></sweep>
               <!-- <span v-else>暂未设置题目</span> -->
             </div>
           </div>
@@ -69,6 +73,8 @@
               :isTeacher="isTeacher"></timeV>
             <courseV2 :tindex="index" :cJson.sync="item.json" :checktype="checktype" v-else-if="item.type == 11"
               :see="see" :isTeacher="isTeacher" @getTestWorkByCid="getTestWorkByCid" @publish2="publish2" :issetPage.sync="issetPage" :tid="tid"></courseV2>
+							<sweep :tindex="index" :cJson.sync="item.json" :checktype="checktype" v-else-if="item.type == 12"
+               :see="see" :isTeacher="isTeacher"></sweep>
             <!-- <span v-else>暂未设置题目</span> -->
           </div>
           <div v-for="(item2, index2) in item.array" :key="`${index}-${index2}`" class="check_box_xia">
@@ -89,6 +95,8 @@
                 :see="see" :isTeacher="isTeacher"></timeV>
               <courseV2 :tindex="index2" :cJson.sync="item2.json" :checktype="checktype" v-else-if="item2.type == 11"
                 :see="see" :isTeacher="isTeacher" @getTestWorkByCid="getTestWorkByCid" @publish2="publish2" :issetPage.sync="issetPage" :tid="tid"></courseV2>
+							<sweep :tindex="index2" :cJson.sync="item2.json" :checktype="checktype" v-else-if="item2.type == 12"
+               :see="see" :isTeacher="isTeacher"></sweep>
               <!-- <span v-else>暂未设置题目</span> -->
             </div>
           </div>
@@ -115,6 +123,7 @@ import courseV from './course.vue';
 import evaV from './eva.vue';
 import timeV from './time.vue';
 import courseV2 from './course2.vue';
+import sweep from './sweep'
 export default {
   props: {
     cJson: {
@@ -159,6 +168,7 @@ export default {
     evaV,
     timeV,
     courseV2,
+		sweep,
   },
   data() {
     return {
@@ -270,18 +280,20 @@ export default {
         let checkArray = _json.filter((item) => {
           if (item.array) {
             item.array = item.array.filter((item2) => {
-              if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.type != 6 && item2.type != 7 && item2.type != 8) {
+              if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.type != 6 && item2.type != 7 && item2.type != 8 && item2.type != 12) {
                 item2.json.answer2 = [];
               } else if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.type == 6) {
                 item2.json.answer2 = this.gcourseid ? this.gcourseid : item2.json.courses[0];
               } else if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.json.answer2 !== 0 && item2.type == 7) {
                 item2.json.answer2 = '';
-              } else if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.json.answer2 !== 0 && item2.type == 8) {
+              } else if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.json.answer2 !== 0 && item2.type == 8 ) {
+                item2.json.answer2 = '';
+              }else if (item2.ttype == 1 && item2.json && !item2.json.answer2 && item2.json.answer2 !== 0 && item2.type == 12 ) {
                 item2.json.answer2 = '';
               }
               if (item2.array) {
                 item2.array = item2.array.filter((item3) => {
-                  if (item3.ttype == 1 && item3.json && !item3.json.answer2 && item3.type != 6 && item3.type != 7 && item3.type != 8) {
+                  if (item3.ttype == 1 && item3.json && !item3.json.answer2 && item3.type != 6 && item3.type != 7 && item3.type != 8 && item3.type != 12) {
                     item3.json.answer2 = [];
                   } else if (item3.ttype == 1 && item3.json && !item3.json.answer2 && item3.type == 6) {
                     item3.json.answer2 = this.gcourseid ? this.gcourseid : item3.json.courses[0];
@@ -289,7 +301,10 @@ export default {
                     item3.json.answer2 = '';
                   } else if (item3.ttype == 1 && item3.json && !item3.json.answer2 && item3.json.answer2 !== 0 && item3.type == 8) {
                     item3.json.answer2 = '';
+                  }else if (item3.ttype == 1 && item3.json && !item3.json.answer2 && item3.json.answer2 !== 0 && item3.type == 12) {
+                    item3.json.answer2 = '';
                   }
+
                   return item3;
                 });
               }
@@ -298,7 +313,7 @@ export default {
               );
             });
           }
-          if (item.ttype == 1 && item.json && !item.json.answer2 && item.type != 6 && item.type != 7 && item.type != 8) {
+          if (item.ttype == 1 && item.json && !item.json.answer2 && item.type != 6 && item.type != 7 && item.type != 8 && item.type != 12) {
             item.json.answer2 = [];
           } else if (item.ttype == 1 && item.json && !item.json.answer2 && item.type == 6) {
             item.json.answer2 = this.gcourseid ? this.gcourseid : item.json.courses[0];
@@ -306,6 +321,8 @@ export default {
             item.json.answer2 = '';
           } else if (item.ttype == 1 && item.json && !item.json.answer2 && item.json.answer2 !== 0 && item.type == 8) {
             item.json.answer2 = '';
+          }else if (item.ttype == 1 && item.json && !item.json.answer2 && item.json.answer2 !== 0 && item.type == 12) {
+            item.json.answer2 = '';
           }
           console.log(item.array);
           return (item.ttype != 1 && item.array.length > 0) || item.ttype == 1;

+ 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>

Някои файлове не бяха показани, защото твърде много файлове са промени