Quellcode durchsuchen

Merge branch 'beta' into HK

lsc vor 10 Monaten
Ursprung
Commit
ff90b934ef
45 geänderte Dateien mit 5248 neuen und 1639 gelöschten Zeilen
  1. 4 0
      dist/index.html
  2. 0 0
      dist/static/css/app.7c174b86058ed07ba8fd7ef39628255d.css
  3. 0 0
      dist/static/css/app.7c174b86058ed07ba8fd7ef39628255d.css.map
  4. 0 0
      dist/static/css/app.9c289aa22e03761df7b379bb8659bc6b.css
  5. 0 0
      dist/static/css/app.9c289aa22e03761df7b379bb8659bc6b.css.map
  6. 6 0
      dist/static/img/cocoroboCon.ada3016.svg
  7. 22 0
      dist/static/img/cocoroboLogo.7b50e2b.svg
  8. 1 0
      dist/static/js/app.0542b62cbead8a97988a.js
  9. 1 0
      dist/static/js/app.0542b62cbead8a97988a.js.map
  10. 1 0
      dist/static/js/app.6b9120af1b6288e216b3.js
  11. 0 0
      dist/static/js/app.6b9120af1b6288e216b3.js.map
  12. 0 0
      dist/static/js/manifest.0ad6c5648a38a6d1fa8f.js.map
  13. 9 0
      src/assets/icon/exportPdfworks/bcg1.svg
  14. 9 0
      src/assets/icon/exportPdfworks/bcg2.svg
  15. 6 0
      src/assets/icon/exportPdfworks/cocoroboCon.svg
  16. 22 0
      src/assets/icon/exportPdfworks/cocoroboLogo.svg
  17. 6 0
      src/assets/icon/exportPdfworks/logo2.svg
  18. 219 81
      src/components/pages/aiAddCourse/addCourse.vue
  19. 2 1
      src/components/pages/aiAddCourse/aiBox.vue
  20. 819 89
      src/components/pages/aiAddCourse/aiBoxRight.vue
  21. 382 382
      src/components/pages/aiAddCourse/aiCreateDialog.vue
  22. BIN
      src/components/pages/aiAddCourse/input.doc
  23. 1219 0
      src/components/pages/components/exportWorksDialog.vue
  24. 3 1
      src/components/pages/components/studentWorksDetail.vue
  25. 19 1
      src/components/pages/components/workData.vue
  26. 129 950
      src/components/pages/components/worksDetail2.vue
  27. 17 15
      src/components/pages/pocAiClassroom/chatArea2.vue
  28. 361 0
      src/components/pages/pocAiClassroom/component/changeChapterDialog.vue
  29. 8 4
      src/components/pages/pocAiClassroom/component/chapterCard.vue
  30. 523 10
      src/components/pages/pocAiClassroom/doTask.vue
  31. 37 34
      src/components/pages/pocAiClassroom/index.vue
  32. 8 1
      src/components/pages/pocAiClassroom/pocClass.vue
  33. 1 60
      src/components/pages/pocAiClassroom/startIndex.vue
  34. 16 5
      src/components/pages/studentManage/student.vue
  35. 1 1
      src/components/pages/sz/dataBoardArea/dataCenter/chartList/toolUser/index.vue
  36. 2 2
      src/components/pages/sz/dataBoardArea/dataCenter/index.vue
  37. 323 0
      src/components/pages/test/dataCom/cascader.vue
  38. 246 0
      src/components/pages/test/dataCom/radarTeacher.vue
  39. 241 0
      src/components/pages/test/dataCom/radarZong.vue
  40. 498 0
      src/components/pages/test/databoard.vue
  41. 12 0
      src/components/pages/test/index.vue
  42. 33 1
      src/components/pages/trainCourse/course.vue
  43. 28 0
      src/components/tools/hevue-img-preview/package-lock.json
  44. 4 1
      src/components/tools/hevue-img-preview/package.json
  45. 10 0
      src/router/index.js

+ 4 - 0
dist/index.html

@@ -32,7 +32,11 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
+<<<<<<< HEAD
     }</style><link href=./static/css/app.9c289aa22e03761df7b379bb8659bc6b.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.0ad6c5648a38a6d1fa8f.js></script><script type=text/javascript src=./static/js/vendor.a82b79982b082928b294.js></script><script type=text/javascript src=./static/js/app.6b9120af1b6288e216b3.js></script></body></html><script>function stopSafari() {
+=======
+    }</style><link href=./static/css/app.7c174b86058ed07ba8fd7ef39628255d.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.571c38d63f24b1ae9e16.js></script><script type=text/javascript src=./static/js/vendor.a82b79982b082928b294.js></script><script type=text/javascript src=./static/js/app.0542b62cbead8a97988a.js></script></body></html><script>function stopSafari() {
+>>>>>>> beta
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

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


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


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


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


Datei-Diff unterdrückt, da er zu groß ist
+ 6 - 0
dist/static/img/cocoroboCon.ada3016.svg


+ 22 - 0
dist/static/img/cocoroboLogo.7b50e2b.svg

@@ -0,0 +1,22 @@
+<svg width="131" height="28" viewBox="0 0 131 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_349_1239)">
+<path d="M60.6401 4.14404H42.3063C41.8092 4.14404 41.3512 4.54153 41.2863 5.03083C41.2527 5.27605 41.3199 5.50894 41.4744 5.68585C41.63 5.865 41.8551 5.96241 42.1081 5.96241H57.5923L55.5466 21.1431C55.4626 21.7668 54.8994 22.255 54.2635 22.255H52.9489C52.4518 22.255 51.9939 22.6525 51.9289 23.1406C51.8964 23.3859 51.9625 23.6187 52.117 23.7957C52.2727 23.9737 52.4977 24.0722 52.7496 24.0722H54.0642C55.6832 24.0722 57.1746 22.779 57.3885 21.1879L59.4409 5.96241H60.4419C60.939 5.96241 61.397 5.56493 61.4619 5.07562C61.4955 4.83041 61.4283 4.59752 61.2738 4.42061C61.1182 4.24146 60.8931 4.14404 60.6412 4.14404H60.6401Z" fill="#205CC6"/>
+<path d="M53.118 16.9553L53.8637 11.4117C53.9544 10.6436 53.7316 9.9147 53.2378 9.35934C52.7362 8.79502 52.0229 8.48486 51.2302 8.48486H45.2667C43.6465 8.48486 42.1764 9.78034 41.9883 11.3692L41.2426 16.9139C41.1519 17.6797 41.3691 18.4019 41.8539 18.9472C42.3533 19.5093 43.0721 19.8183 43.8783 19.8183H49.8418C51.462 19.8183 52.931 18.5329 53.1169 16.9564L53.118 16.9553ZM52.0207 11.3681L51.2761 16.9094V16.9116C51.2067 17.5006 50.63 17.9988 50.0164 17.9988H44.053C43.7552 17.9988 43.4909 17.8857 43.3073 17.6797C43.1326 17.4827 43.0531 17.224 43.0856 16.9553L43.8313 11.4117C43.903 10.8004 44.4695 10.3032 45.0932 10.3032H51.0566C51.3522 10.3032 51.6154 10.4163 51.7967 10.6201C51.9748 10.8205 52.0543 11.0881 52.0218 11.3692L52.0207 11.3681Z" fill="#205CC6"/>
+<path d="M84.0705 4.14404H65.7367C65.2396 4.14404 64.7817 4.54153 64.7167 5.03083C64.6831 5.27605 64.7503 5.50894 64.9048 5.68585C65.0605 5.865 65.2855 5.96241 65.5374 5.96241H81.0216L78.9759 21.1431C78.8919 21.7668 78.3287 22.255 77.6928 22.255H76.3783C75.8811 22.255 75.4232 22.6525 75.3582 23.1406C75.3246 23.3859 75.3918 23.6187 75.5463 23.7957C75.702 23.9748 75.927 24.0722 76.1789 24.0722H77.4935C79.1125 24.0722 80.6039 22.779 80.8178 21.1879L82.8702 5.96241H83.8712C84.3683 5.96241 84.8263 5.56493 84.8912 5.07562C84.9248 4.83041 84.8576 4.59752 84.7031 4.42061C84.5475 4.24146 84.3224 4.14404 84.0705 4.14404Z" fill="#205CC6"/>
+<path d="M76.5484 16.9553L77.2941 11.4117C77.3848 10.6436 77.162 9.9147 76.6682 9.35934C76.1666 8.79502 75.4533 8.48486 74.6606 8.48486H68.6972C67.077 8.48486 65.6068 9.78034 65.4187 11.3692L64.673 16.9139C64.5823 17.6797 64.7995 18.4019 65.2843 18.9472C65.7837 19.5093 66.5026 19.8183 67.3087 19.8183H73.2722C74.8924 19.8183 76.3614 18.5329 76.5473 16.9564L76.5484 16.9553ZM74.7054 16.9127C74.636 17.5017 74.0593 18 73.4469 18H67.4834C67.1856 18 66.9213 17.8869 66.7377 17.6808C66.563 17.4838 66.4835 17.2251 66.516 16.9564L67.2617 11.4128C67.3334 10.8015 67.8999 10.3044 68.5236 10.3044H74.4871C74.7826 10.3044 75.0458 10.4174 75.2272 10.6212C75.4052 10.8216 75.4847 11.0893 75.4522 11.3703L74.7076 16.9116V16.9139L74.7054 16.9127Z" fill="#205CC6"/>
+<path d="M105.859 4.70692L90.988 5.09993C89.5996 5.12344 88.3209 6.24089 88.1396 7.59347L87.5103 12.2626C87.4196 12.9321 87.6021 13.5648 88.022 14.0462C88.4475 14.5333 89.0622 14.8009 89.7519 14.8009H95.8598L95.0693 20.6658C94.9853 21.2895 94.4221 21.7777 93.7861 21.7777H93.1927C92.6956 21.7777 92.2376 22.1751 92.1727 22.6633C92.1391 22.9085 92.2063 23.1414 92.3608 23.3183C92.5164 23.4975 92.7415 23.5949 92.9934 23.5949H93.5868C95.2059 23.5949 96.6973 22.3017 96.9112 20.7106L97.7073 14.7998H105.166C105.663 14.7998 106.121 14.4023 106.186 13.913C106.219 13.6678 106.152 13.4349 105.997 13.258C105.841 13.0799 105.617 12.9814 105.364 12.9814H97.9514L98.4899 8.98188C98.5258 8.71988 98.4452 8.45563 98.2716 8.25633C98.098 8.05702 97.8461 7.94281 97.5819 7.94281C97.125 7.94281 96.7354 8.28432 96.6738 8.73667L96.1016 12.9814H89.9479C89.7653 12.9814 89.6063 12.9131 89.4977 12.7888C89.3914 12.6668 89.3455 12.5033 89.369 12.3275L90.0016 7.63714C90.0565 7.22622 90.4058 6.91606 90.8167 6.91606L105.704 6.54433C106.205 6.53201 106.652 6.1222 106.704 5.6329L106.706 5.61051C106.732 5.36642 106.659 5.138 106.5 4.96557C106.339 4.7909 106.114 4.69572 105.856 4.70468L105.859 4.70692Z" fill="#205CC6"/>
+<path d="M103.532 16.869C103.466 16.654 103.317 16.4827 103.113 16.3864C102.886 16.279 102.611 16.2778 102.361 16.3808L102.342 16.3887C101.864 16.5857 101.589 17.1142 101.729 17.5666L103.346 22.8011C103.412 23.0139 103.559 23.1841 103.761 23.2815C103.878 23.3375 104.007 23.3654 104.139 23.3654C104.261 23.3654 104.386 23.3419 104.506 23.2938L104.518 23.2893C105.003 23.0967 105.284 22.566 105.143 22.108L103.533 16.8701L103.532 16.869Z" fill="#205CC6"/>
+<path d="M89.893 16.3756L89.8784 16.3723C89.416 16.2435 88.8965 16.5033 88.6938 16.9624C87.7466 19.1122 86.7825 20.7626 85.749 22.0077C85.4232 22.4007 85.4355 22.9269 85.7826 23.2371C85.9349 23.3737 86.1342 23.4465 86.3503 23.4465C86.3738 23.4465 86.3973 23.4465 86.4208 23.4442C86.6963 23.4241 86.9583 23.2875 87.1408 23.0691C88.3422 21.6314 89.4093 19.8209 90.4013 17.5356C90.5077 17.2893 90.5088 17.0206 90.4013 16.7978C90.3017 16.5895 90.1214 16.4395 89.893 16.3756Z" fill="#205CC6"/>
+<path d="M116.322 10.2876C116.356 10.0423 116.288 9.80945 116.134 9.63254C115.977 9.45339 115.753 9.35597 115.5 9.35597H114.148L114.762 4.79437C114.796 4.54916 114.729 4.31627 114.574 4.13936C114.419 3.96021 114.194 3.86279 113.941 3.86279C113.443 3.86279 112.985 4.26028 112.92 4.74847L112.299 9.35597H110.901C110.403 9.35597 109.945 9.75346 109.881 10.2416C109.847 10.4869 109.914 10.7198 110.069 10.8967C110.224 11.0758 110.449 11.1732 110.702 11.1732H112.055L110.434 23.2054C110.4 23.4506 110.467 23.6835 110.622 23.8604C110.779 24.0395 111.002 24.137 111.256 24.137C111.753 24.137 112.211 23.7395 112.276 23.2513L113.904 11.1743H115.302C115.799 11.1743 116.257 10.7769 116.322 10.2887V10.2876Z" fill="#205CC6"/>
+<path d="M128.515 17.803H127.954C127.963 17.5892 127.895 17.3899 127.758 17.2331C127.602 17.054 127.378 16.9565 127.125 16.9565C126.641 16.9565 126.195 17.3328 126.11 17.803H116.351C115.854 17.803 115.396 18.2005 115.331 18.6898C115.297 18.935 115.365 19.1679 115.519 19.3448C115.675 19.524 115.9 19.6214 116.153 19.6214H125.865L125.598 21.5999C125.548 21.9727 125.188 22.2773 124.793 22.2773H122.87C122.373 22.2773 121.915 22.6748 121.85 23.163C121.816 23.4082 121.883 23.6411 122.038 23.818C122.194 23.9971 122.419 24.0945 122.671 24.0945H124.594C126.005 24.0945 127.255 23.0185 127.44 21.6447L127.714 19.6214H128.316C128.813 19.6214 129.271 19.2239 129.336 18.7346C129.37 18.4894 129.302 18.2565 129.148 18.0796C128.991 17.9004 128.767 17.803 128.514 17.803H128.515Z" fill="#205CC6"/>
+<path d="M119.883 21.7744L117.611 20.3513C117.209 20.0993 116.63 20.2348 116.32 20.6547L116.312 20.6659C116.15 20.8854 116.084 21.153 116.131 21.4004C116.172 21.621 116.298 21.8069 116.488 21.9256L118.76 23.3487C118.896 23.4349 119.054 23.4752 119.214 23.4752C119.524 23.4752 119.846 23.3218 120.049 23.0464L120.058 23.0352C120.221 22.8157 120.287 22.5481 120.24 22.3006C120.198 22.0801 120.072 21.8931 119.883 21.7755V21.7744Z" fill="#205CC6"/>
+<path d="M130.761 4.29157C130.642 4.15496 130.469 4.07882 130.277 4.07882H129.834C129.453 4.07882 129.114 4.37218 129.064 4.7484C129.013 5.13357 128.65 5.44708 128.257 5.44708H124.87L124.951 4.83685C124.985 4.59164 124.918 4.35875 124.763 4.18184C124.607 4.00269 124.383 3.90527 124.13 3.90527C123.632 3.90527 123.174 4.30276 123.11 4.79206L123.021 5.44708H118.217C117.719 5.44708 117.261 5.84457 117.196 6.33387C117.163 6.57908 117.23 6.81198 117.385 6.98889C117.541 7.16692 117.765 7.26545 118.018 7.26545H122.777L122.636 8.31348H119.49C118.09 8.31348 116.802 9.42197 116.619 10.7846L115.917 15.9956C115.883 16.2409 115.95 16.4738 116.105 16.6507C116.262 16.8298 116.485 16.9272 116.739 16.9272C117.236 16.9272 117.694 16.5297 117.759 16.0416L117.8 15.7336H121.635L121.608 15.9307C121.574 16.1759 121.642 16.4088 121.796 16.5857C121.953 16.7638 122.177 16.8623 122.43 16.8623C122.927 16.8623 123.385 16.4648 123.45 15.9766L123.482 15.7336H127.317L127.281 15.9968C127.248 16.242 127.315 16.4749 127.47 16.6518C127.626 16.8309 127.85 16.9283 128.103 16.9283C128.6 16.9283 129.058 16.5309 129.123 16.0427L129.825 10.8317C129.916 10.161 129.738 9.5317 129.325 9.05919C128.905 8.57885 128.294 8.3146 127.603 8.3146H124.481L124.622 7.26657H128.055C129.442 7.26657 130.72 6.15808 130.904 4.79542C130.929 4.60732 130.878 4.42929 130.758 4.2938L130.761 4.29157ZM127.694 12.9546L127.564 13.9164H123.729L123.859 12.9546H127.694ZM124.238 10.1318H127.406C127.587 10.1318 127.746 10.2002 127.855 10.3233C127.962 10.4465 128.008 10.61 127.985 10.7846L127.938 11.1362H124.103L124.238 10.1318ZM122.01 12.9546L121.88 13.9164H118.045L118.175 12.9546H122.01ZM122.391 10.1318L122.255 11.1362H118.42L118.462 10.8305C118.513 10.4521 118.893 10.1318 119.291 10.1318H122.392H122.391Z" fill="#205CC6"/>
+<path d="M31.687 3.24822C30.6927 1.9393 29.3188 1.19583 27.7905 0.717723C25.4772 -0.00671373 23.1079 -0.117563 20.7062 0.0985368C18.2149 0.322474 15.7997 0.87112 13.4506 1.71089C9.97513 2.95374 6.77506 4.67805 4.03855 7.18839C2.53145 8.5712 1.23933 10.122 0.493622 12.059C0.118527 13.032 -0.111008 14.0375 0.0535856 15.0923C0.213701 16.1235 0.564163 17.0976 1.01876 18.027C3.996 24.1057 8.90695 27.3808 15.615 27.9519C17.6909 28.1288 19.7444 27.8108 21.7341 27.1703C28.937 24.8548 33.6083 18.2487 33.6173 10.3358C33.6307 9.20831 33.3743 7.52654 32.8604 5.88955C32.5715 4.96805 32.2838 4.03535 31.687 3.24822ZM30.7196 8.98437C30.0119 10.5609 28.9213 11.8485 27.655 12.9973C27.449 13.1843 27.3616 13.3713 27.365 13.6512C27.3795 14.8403 27.3717 16.0306 27.3717 17.2197V17.6698C26.8936 17.4156 26.4972 17.2062 26.1031 16.9935C25.4929 16.6643 24.8726 16.3519 24.2791 15.9958C23.9667 15.8089 23.7282 15.8201 23.4125 16.0003C20.9973 17.3753 18.422 18.3517 15.718 18.9854C13.7194 19.4534 11.6938 19.73 9.63586 19.6561C7.82085 19.5912 6.04055 19.3236 4.39909 18.4838C2.96253 17.7482 1.88987 16.6934 1.57636 15.0396C1.33899 13.7867 1.64242 12.6133 2.20674 11.4992C3.19431 9.54757 4.69805 8.04047 6.41788 6.74052C10.0154 4.02192 14.0844 2.37822 18.4971 1.54741C20.2023 1.22606 21.9244 1.11297 23.6566 1.20815C25.2824 1.29772 26.8622 1.6034 28.338 2.33567C31.0387 3.67706 31.9579 6.22882 30.7207 8.98213L30.7196 8.98437Z" fill="#205CC6"/>
+<path d="M26.0899 4.9581C25.5423 4.60988 24.9176 4.34451 24.2917 4.16648C22.6782 3.70853 21.0266 3.76004 19.3807 3.9739C17.176 4.25942 15.0542 4.86293 13.0131 5.74076C10.9372 6.63427 8.9945 7.74612 7.33512 9.3036C6.40354 10.1781 5.58953 11.141 5.19204 12.3883C4.76656 13.7196 5.15509 14.9188 6.3386 15.6612C6.86037 15.9881 7.45941 16.2333 8.05508 16.3968C9.86001 16.8917 11.6929 16.7943 13.5203 16.511C16.1739 16.1001 18.6843 15.248 21.0614 14.0063C21.2427 13.9111 21.3715 13.9078 21.5339 14.0365C21.8351 14.2761 22.1519 14.4956 22.4643 14.7229C22.8708 15.0185 23.2783 15.3118 23.7766 15.6724C23.7766 15.4428 23.7766 15.323 23.7766 15.2044C23.7766 14.3567 23.7833 13.508 23.7721 12.6604C23.7688 12.4063 23.8527 12.2372 24.0509 12.0726C24.5167 11.6863 24.9803 11.2933 25.4035 10.8622C26.2209 10.0303 26.9173 9.1155 27.2118 7.95326C27.5163 6.74624 27.1424 5.62879 26.0899 4.96034V4.9581Z" fill="#205CC6"/>
+</g>
+<defs>
+<clipPath id="clip0_349_1239">
+<rect width="130.913" height="28" fill="white"/>
+</clipPath>
+</defs>
+</svg>

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


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


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


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


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


+ 9 - 0
src/assets/icon/exportPdfworks/bcg1.svg

@@ -0,0 +1,9 @@
+<svg width="177" height="148" viewBox="0 0 177 148" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.4" d="M109.685 -60C115.402 -60 120.684 -56.9504 123.542 -52L174.304 35.923C177.162 40.8735 177.162 46.9726 174.304 51.923L123.542 139.846C120.684 144.797 115.402 147.846 109.685 147.846L8.16065 147.846C2.4444 147.846 -2.83763 144.797 -5.69575 139.846L-56.4582 51.923C-59.3163 46.9726 -59.3163 40.8735 -56.4581 35.923L-5.69575 -52C-2.83763 -56.9504 2.4444 -60 8.16065 -60L109.685 -60Z" fill="url(#paint0_radial_349_1198)"/>
+<defs>
+<radialGradient id="paint0_radial_349_1198" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(58.923 43.923) rotate(120) scale(120)">
+<stop offset="0.2" stop-color="#E3F1FE"/>
+<stop offset="1" stop-color="white"/>
+</radialGradient>
+</defs>
+</svg>

+ 9 - 0
src/assets/icon/exportPdfworks/bcg2.svg

@@ -0,0 +1,9 @@
+<svg width="595" height="262" viewBox="0 0 595 262" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="0.4" d="M602.976 166.204C606.6 169.244 608.693 173.732 608.692 178.462L608.692 347.381C608.691 353.098 605.642 358.38 600.692 361.238L407.269 472.91C403.195 475.262 398.292 475.703 393.864 474.113L-84.008 302.613C-96.915 297.981 -98.3956 280.321 -86.44 273.604L192.999 116.619L391.144 2.21998C396.968 -1.14302 404.275 -0.504055 409.427 3.81899L602.976 166.204Z" fill="url(#paint0_radial_349_1200)"/>
+<defs>
+<radialGradient id="paint0_radial_349_1200" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(400.845 236.619) rotate(150) scale(240 240)">
+<stop offset="0.2" stop-color="#E3F1FE"/>
+<stop offset="1" stop-color="white"/>
+</radialGradient>
+</defs>
+</svg>

Datei-Diff unterdrückt, da er zu groß ist
+ 6 - 0
src/assets/icon/exportPdfworks/cocoroboCon.svg


+ 22 - 0
src/assets/icon/exportPdfworks/cocoroboLogo.svg

@@ -0,0 +1,22 @@
+<svg width="131" height="28" viewBox="0 0 131 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_349_1239)">
+<path d="M60.6401 4.14404H42.3063C41.8092 4.14404 41.3512 4.54153 41.2863 5.03083C41.2527 5.27605 41.3199 5.50894 41.4744 5.68585C41.63 5.865 41.8551 5.96241 42.1081 5.96241H57.5923L55.5466 21.1431C55.4626 21.7668 54.8994 22.255 54.2635 22.255H52.9489C52.4518 22.255 51.9939 22.6525 51.9289 23.1406C51.8964 23.3859 51.9625 23.6187 52.117 23.7957C52.2727 23.9737 52.4977 24.0722 52.7496 24.0722H54.0642C55.6832 24.0722 57.1746 22.779 57.3885 21.1879L59.4409 5.96241H60.4419C60.939 5.96241 61.397 5.56493 61.4619 5.07562C61.4955 4.83041 61.4283 4.59752 61.2738 4.42061C61.1182 4.24146 60.8931 4.14404 60.6412 4.14404H60.6401Z" fill="#205CC6"/>
+<path d="M53.118 16.9553L53.8637 11.4117C53.9544 10.6436 53.7316 9.9147 53.2378 9.35934C52.7362 8.79502 52.0229 8.48486 51.2302 8.48486H45.2667C43.6465 8.48486 42.1764 9.78034 41.9883 11.3692L41.2426 16.9139C41.1519 17.6797 41.3691 18.4019 41.8539 18.9472C42.3533 19.5093 43.0721 19.8183 43.8783 19.8183H49.8418C51.462 19.8183 52.931 18.5329 53.1169 16.9564L53.118 16.9553ZM52.0207 11.3681L51.2761 16.9094V16.9116C51.2067 17.5006 50.63 17.9988 50.0164 17.9988H44.053C43.7552 17.9988 43.4909 17.8857 43.3073 17.6797C43.1326 17.4827 43.0531 17.224 43.0856 16.9553L43.8313 11.4117C43.903 10.8004 44.4695 10.3032 45.0932 10.3032H51.0566C51.3522 10.3032 51.6154 10.4163 51.7967 10.6201C51.9748 10.8205 52.0543 11.0881 52.0218 11.3692L52.0207 11.3681Z" fill="#205CC6"/>
+<path d="M84.0705 4.14404H65.7367C65.2396 4.14404 64.7817 4.54153 64.7167 5.03083C64.6831 5.27605 64.7503 5.50894 64.9048 5.68585C65.0605 5.865 65.2855 5.96241 65.5374 5.96241H81.0216L78.9759 21.1431C78.8919 21.7668 78.3287 22.255 77.6928 22.255H76.3783C75.8811 22.255 75.4232 22.6525 75.3582 23.1406C75.3246 23.3859 75.3918 23.6187 75.5463 23.7957C75.702 23.9748 75.927 24.0722 76.1789 24.0722H77.4935C79.1125 24.0722 80.6039 22.779 80.8178 21.1879L82.8702 5.96241H83.8712C84.3683 5.96241 84.8263 5.56493 84.8912 5.07562C84.9248 4.83041 84.8576 4.59752 84.7031 4.42061C84.5475 4.24146 84.3224 4.14404 84.0705 4.14404Z" fill="#205CC6"/>
+<path d="M76.5484 16.9553L77.2941 11.4117C77.3848 10.6436 77.162 9.9147 76.6682 9.35934C76.1666 8.79502 75.4533 8.48486 74.6606 8.48486H68.6972C67.077 8.48486 65.6068 9.78034 65.4187 11.3692L64.673 16.9139C64.5823 17.6797 64.7995 18.4019 65.2843 18.9472C65.7837 19.5093 66.5026 19.8183 67.3087 19.8183H73.2722C74.8924 19.8183 76.3614 18.5329 76.5473 16.9564L76.5484 16.9553ZM74.7054 16.9127C74.636 17.5017 74.0593 18 73.4469 18H67.4834C67.1856 18 66.9213 17.8869 66.7377 17.6808C66.563 17.4838 66.4835 17.2251 66.516 16.9564L67.2617 11.4128C67.3334 10.8015 67.8999 10.3044 68.5236 10.3044H74.4871C74.7826 10.3044 75.0458 10.4174 75.2272 10.6212C75.4052 10.8216 75.4847 11.0893 75.4522 11.3703L74.7076 16.9116V16.9139L74.7054 16.9127Z" fill="#205CC6"/>
+<path d="M105.859 4.70692L90.988 5.09993C89.5996 5.12344 88.3209 6.24089 88.1396 7.59347L87.5103 12.2626C87.4196 12.9321 87.6021 13.5648 88.022 14.0462C88.4475 14.5333 89.0622 14.8009 89.7519 14.8009H95.8598L95.0693 20.6658C94.9853 21.2895 94.4221 21.7777 93.7861 21.7777H93.1927C92.6956 21.7777 92.2376 22.1751 92.1727 22.6633C92.1391 22.9085 92.2063 23.1414 92.3608 23.3183C92.5164 23.4975 92.7415 23.5949 92.9934 23.5949H93.5868C95.2059 23.5949 96.6973 22.3017 96.9112 20.7106L97.7073 14.7998H105.166C105.663 14.7998 106.121 14.4023 106.186 13.913C106.219 13.6678 106.152 13.4349 105.997 13.258C105.841 13.0799 105.617 12.9814 105.364 12.9814H97.9514L98.4899 8.98188C98.5258 8.71988 98.4452 8.45563 98.2716 8.25633C98.098 8.05702 97.8461 7.94281 97.5819 7.94281C97.125 7.94281 96.7354 8.28432 96.6738 8.73667L96.1016 12.9814H89.9479C89.7653 12.9814 89.6063 12.9131 89.4977 12.7888C89.3914 12.6668 89.3455 12.5033 89.369 12.3275L90.0016 7.63714C90.0565 7.22622 90.4058 6.91606 90.8167 6.91606L105.704 6.54433C106.205 6.53201 106.652 6.1222 106.704 5.6329L106.706 5.61051C106.732 5.36642 106.659 5.138 106.5 4.96557C106.339 4.7909 106.114 4.69572 105.856 4.70468L105.859 4.70692Z" fill="#205CC6"/>
+<path d="M103.532 16.869C103.466 16.654 103.317 16.4827 103.113 16.3864C102.886 16.279 102.611 16.2778 102.361 16.3808L102.342 16.3887C101.864 16.5857 101.589 17.1142 101.729 17.5666L103.346 22.8011C103.412 23.0139 103.559 23.1841 103.761 23.2815C103.878 23.3375 104.007 23.3654 104.139 23.3654C104.261 23.3654 104.386 23.3419 104.506 23.2938L104.518 23.2893C105.003 23.0967 105.284 22.566 105.143 22.108L103.533 16.8701L103.532 16.869Z" fill="#205CC6"/>
+<path d="M89.893 16.3756L89.8784 16.3723C89.416 16.2435 88.8965 16.5033 88.6938 16.9624C87.7466 19.1122 86.7825 20.7626 85.749 22.0077C85.4232 22.4007 85.4355 22.9269 85.7826 23.2371C85.9349 23.3737 86.1342 23.4465 86.3503 23.4465C86.3738 23.4465 86.3973 23.4465 86.4208 23.4442C86.6963 23.4241 86.9583 23.2875 87.1408 23.0691C88.3422 21.6314 89.4093 19.8209 90.4013 17.5356C90.5077 17.2893 90.5088 17.0206 90.4013 16.7978C90.3017 16.5895 90.1214 16.4395 89.893 16.3756Z" fill="#205CC6"/>
+<path d="M116.322 10.2876C116.356 10.0423 116.288 9.80945 116.134 9.63254C115.977 9.45339 115.753 9.35597 115.5 9.35597H114.148L114.762 4.79437C114.796 4.54916 114.729 4.31627 114.574 4.13936C114.419 3.96021 114.194 3.86279 113.941 3.86279C113.443 3.86279 112.985 4.26028 112.92 4.74847L112.299 9.35597H110.901C110.403 9.35597 109.945 9.75346 109.881 10.2416C109.847 10.4869 109.914 10.7198 110.069 10.8967C110.224 11.0758 110.449 11.1732 110.702 11.1732H112.055L110.434 23.2054C110.4 23.4506 110.467 23.6835 110.622 23.8604C110.779 24.0395 111.002 24.137 111.256 24.137C111.753 24.137 112.211 23.7395 112.276 23.2513L113.904 11.1743H115.302C115.799 11.1743 116.257 10.7769 116.322 10.2887V10.2876Z" fill="#205CC6"/>
+<path d="M128.515 17.803H127.954C127.963 17.5892 127.895 17.3899 127.758 17.2331C127.602 17.054 127.378 16.9565 127.125 16.9565C126.641 16.9565 126.195 17.3328 126.11 17.803H116.351C115.854 17.803 115.396 18.2005 115.331 18.6898C115.297 18.935 115.365 19.1679 115.519 19.3448C115.675 19.524 115.9 19.6214 116.153 19.6214H125.865L125.598 21.5999C125.548 21.9727 125.188 22.2773 124.793 22.2773H122.87C122.373 22.2773 121.915 22.6748 121.85 23.163C121.816 23.4082 121.883 23.6411 122.038 23.818C122.194 23.9971 122.419 24.0945 122.671 24.0945H124.594C126.005 24.0945 127.255 23.0185 127.44 21.6447L127.714 19.6214H128.316C128.813 19.6214 129.271 19.2239 129.336 18.7346C129.37 18.4894 129.302 18.2565 129.148 18.0796C128.991 17.9004 128.767 17.803 128.514 17.803H128.515Z" fill="#205CC6"/>
+<path d="M119.883 21.7744L117.611 20.3513C117.209 20.0993 116.63 20.2348 116.32 20.6547L116.312 20.6659C116.15 20.8854 116.084 21.153 116.131 21.4004C116.172 21.621 116.298 21.8069 116.488 21.9256L118.76 23.3487C118.896 23.4349 119.054 23.4752 119.214 23.4752C119.524 23.4752 119.846 23.3218 120.049 23.0464L120.058 23.0352C120.221 22.8157 120.287 22.5481 120.24 22.3006C120.198 22.0801 120.072 21.8931 119.883 21.7755V21.7744Z" fill="#205CC6"/>
+<path d="M130.761 4.29157C130.642 4.15496 130.469 4.07882 130.277 4.07882H129.834C129.453 4.07882 129.114 4.37218 129.064 4.7484C129.013 5.13357 128.65 5.44708 128.257 5.44708H124.87L124.951 4.83685C124.985 4.59164 124.918 4.35875 124.763 4.18184C124.607 4.00269 124.383 3.90527 124.13 3.90527C123.632 3.90527 123.174 4.30276 123.11 4.79206L123.021 5.44708H118.217C117.719 5.44708 117.261 5.84457 117.196 6.33387C117.163 6.57908 117.23 6.81198 117.385 6.98889C117.541 7.16692 117.765 7.26545 118.018 7.26545H122.777L122.636 8.31348H119.49C118.09 8.31348 116.802 9.42197 116.619 10.7846L115.917 15.9956C115.883 16.2409 115.95 16.4738 116.105 16.6507C116.262 16.8298 116.485 16.9272 116.739 16.9272C117.236 16.9272 117.694 16.5297 117.759 16.0416L117.8 15.7336H121.635L121.608 15.9307C121.574 16.1759 121.642 16.4088 121.796 16.5857C121.953 16.7638 122.177 16.8623 122.43 16.8623C122.927 16.8623 123.385 16.4648 123.45 15.9766L123.482 15.7336H127.317L127.281 15.9968C127.248 16.242 127.315 16.4749 127.47 16.6518C127.626 16.8309 127.85 16.9283 128.103 16.9283C128.6 16.9283 129.058 16.5309 129.123 16.0427L129.825 10.8317C129.916 10.161 129.738 9.5317 129.325 9.05919C128.905 8.57885 128.294 8.3146 127.603 8.3146H124.481L124.622 7.26657H128.055C129.442 7.26657 130.72 6.15808 130.904 4.79542C130.929 4.60732 130.878 4.42929 130.758 4.2938L130.761 4.29157ZM127.694 12.9546L127.564 13.9164H123.729L123.859 12.9546H127.694ZM124.238 10.1318H127.406C127.587 10.1318 127.746 10.2002 127.855 10.3233C127.962 10.4465 128.008 10.61 127.985 10.7846L127.938 11.1362H124.103L124.238 10.1318ZM122.01 12.9546L121.88 13.9164H118.045L118.175 12.9546H122.01ZM122.391 10.1318L122.255 11.1362H118.42L118.462 10.8305C118.513 10.4521 118.893 10.1318 119.291 10.1318H122.392H122.391Z" fill="#205CC6"/>
+<path d="M31.687 3.24822C30.6927 1.9393 29.3188 1.19583 27.7905 0.717723C25.4772 -0.00671373 23.1079 -0.117563 20.7062 0.0985368C18.2149 0.322474 15.7997 0.87112 13.4506 1.71089C9.97513 2.95374 6.77506 4.67805 4.03855 7.18839C2.53145 8.5712 1.23933 10.122 0.493622 12.059C0.118527 13.032 -0.111008 14.0375 0.0535856 15.0923C0.213701 16.1235 0.564163 17.0976 1.01876 18.027C3.996 24.1057 8.90695 27.3808 15.615 27.9519C17.6909 28.1288 19.7444 27.8108 21.7341 27.1703C28.937 24.8548 33.6083 18.2487 33.6173 10.3358C33.6307 9.20831 33.3743 7.52654 32.8604 5.88955C32.5715 4.96805 32.2838 4.03535 31.687 3.24822ZM30.7196 8.98437C30.0119 10.5609 28.9213 11.8485 27.655 12.9973C27.449 13.1843 27.3616 13.3713 27.365 13.6512C27.3795 14.8403 27.3717 16.0306 27.3717 17.2197V17.6698C26.8936 17.4156 26.4972 17.2062 26.1031 16.9935C25.4929 16.6643 24.8726 16.3519 24.2791 15.9958C23.9667 15.8089 23.7282 15.8201 23.4125 16.0003C20.9973 17.3753 18.422 18.3517 15.718 18.9854C13.7194 19.4534 11.6938 19.73 9.63586 19.6561C7.82085 19.5912 6.04055 19.3236 4.39909 18.4838C2.96253 17.7482 1.88987 16.6934 1.57636 15.0396C1.33899 13.7867 1.64242 12.6133 2.20674 11.4992C3.19431 9.54757 4.69805 8.04047 6.41788 6.74052C10.0154 4.02192 14.0844 2.37822 18.4971 1.54741C20.2023 1.22606 21.9244 1.11297 23.6566 1.20815C25.2824 1.29772 26.8622 1.6034 28.338 2.33567C31.0387 3.67706 31.9579 6.22882 30.7207 8.98213L30.7196 8.98437Z" fill="#205CC6"/>
+<path d="M26.0899 4.9581C25.5423 4.60988 24.9176 4.34451 24.2917 4.16648C22.6782 3.70853 21.0266 3.76004 19.3807 3.9739C17.176 4.25942 15.0542 4.86293 13.0131 5.74076C10.9372 6.63427 8.9945 7.74612 7.33512 9.3036C6.40354 10.1781 5.58953 11.141 5.19204 12.3883C4.76656 13.7196 5.15509 14.9188 6.3386 15.6612C6.86037 15.9881 7.45941 16.2333 8.05508 16.3968C9.86001 16.8917 11.6929 16.7943 13.5203 16.511C16.1739 16.1001 18.6843 15.248 21.0614 14.0063C21.2427 13.9111 21.3715 13.9078 21.5339 14.0365C21.8351 14.2761 22.1519 14.4956 22.4643 14.7229C22.8708 15.0185 23.2783 15.3118 23.7766 15.6724C23.7766 15.4428 23.7766 15.323 23.7766 15.2044C23.7766 14.3567 23.7833 13.508 23.7721 12.6604C23.7688 12.4063 23.8527 12.2372 24.0509 12.0726C24.5167 11.6863 24.9803 11.2933 25.4035 10.8622C26.2209 10.0303 26.9173 9.1155 27.2118 7.95326C27.5163 6.74624 27.1424 5.62879 26.0899 4.96034V4.9581Z" fill="#205CC6"/>
+</g>
+<defs>
+<clipPath id="clip0_349_1239">
+<rect width="130.913" height="28" fill="white"/>
+</clipPath>
+</defs>
+</svg>

Datei-Diff unterdrückt, da er zu groß ist
+ 6 - 0
src/assets/icon/exportPdfworks/logo2.svg


+ 219 - 81
src/components/pages/aiAddCourse/addCourse.vue

@@ -175,15 +175,31 @@
                           </div>
                         </div>
                       </div>
+                      <div class="info_box_t" v-if="!yiKeTemplateArray.includes(templateid)">
+                        <div class="info_box_t_box">
+                          <span>输出语言:</span>
+                          <el-radio-group v-model="languageSetting" style="display: flex; align-items: center" @change="changeIsuseT">
+                            <div class="all_choose info_radio">
+                              <el-radio :label="0">简体中文</el-radio>
+                            </div>
+                            <div class="all_choose info_radio" style="margin-left: 10px">
+                              <el-radio :label="1">繁体中文</el-radio>
+                            </div>
+                            <div class="all_choose info_radio" style="margin-left: 10px">
+                              <el-radio :label="2">English</el-radio>
+                            </div>
+                          </el-radio-group>
+                        </div>
+                      </div>
                       <div class="info_box_t" v-if="!yiKeTemplateArray.includes(templateid)">
                         <div class="info_box_t_box">
                           <!-- <el-switch v-model="isuseT" active-text="是否从已有教案生成"
                               style="justify-content: center; min-width: 175px"></el-switch> -->
                           <span>生成模式:</span>
-                          <el-radio-group v-model="isuseT" style="display: flex; align-items: center">
-                            <!-- <div class="all_choose info_radio">
+                          <el-radio-group v-model="isuseT" style="display: flex; align-items: center" @change="changeIsuseT">
+                            <div class="all_choose info_radio">
                               <el-radio :label="1">引导模式生成</el-radio>
-                            </div> -->
+                            </div>
                             <div class="all_choose info_radio" style="margin-left: 10px">
                               <el-radio :label="true">从已有教案生成</el-radio>
                             </div>
@@ -954,7 +970,7 @@
                   <div class="inter_box" v-show="interPan">
                     <iframe allow="camera *; microphone *;display-capture;midi;encrypted-media;" :src="interUrl" frameborder="0" v-if="interFlash && chatid" class="interIframe"></iframe>
                   </div>
-                  <div style="width: calc(100%);height: 100%" class='op_task_box'>
+                  <div style="width: calc(100%);height: 100%" class='op_task_box' :class="{inter_Detailbox: !courseTextB && interPan}">
                     <textarea style="height: 500px" class="binfo_input binfo_textarea" cols v-model="courseText"
                       placeholder="请输入课程简要描述" v-if="courseTextB && interPan"></textarea>
                     <textarea v-autoHeight="68" rows="2" class="binfo_input binfo_textarea" cols v-model="courseText"
@@ -6966,6 +6982,10 @@ let converter = OpenCC.Converter({
 		to:'hk'
 })
 
+let converter2 = OpenCC.Converter({
+		from:'cn',
+		to:'hk'
+})
 
 export default {
   components: {
@@ -7347,7 +7367,7 @@ export default {
       dialogVisibleAiCreateVideo: false,
       teacherText: [],
       isFileSearch: true,
-      fileIds: ['file-LyRnVpjKpTY4Vwhhi89eBV6o', 'file-INnyqfzOuxYWjuMvWowhOpD0'],
+      fileIds: [],//'file-A81p1q02HHpJhus4nYYwtAmM'
       templatePan: ['0e7966d6-1e49-11ef-bee5-005056b86db5','60d153e3-1e49-11ef-bee5-005056b86db5','7f3e28b7-1e66-11ef-bee5-005056b86db5','9dd4bb76-1e48-11ef-bee5-005056b86db5','ab317f23-1e66-11ef-bee5-005056b86db5'],
       courseJie:1,
       courseTime:45,
@@ -7418,7 +7438,8 @@ export default {
       interFlash: true,
       agentid: "",
       interSetting: false,
-      chatid: ""
+      chatid: "",
+      languageSetting: 1, //0中文 1繁体 2英文
     };
   },
   directives: {
@@ -7586,9 +7607,9 @@ export default {
       let sagentid = this.aiJson.sagentid
       let url = ''
       if(sagentid){
-        url = `https://beta.cloud.cocorobo.cn/aigpt/#/js?muti_agent_id=${agentid}&isPbl=true&session_id=${this.chatid}`//+'&muti_agent_id2='+agentid
+        url = `https://cloud.cocorobo.hk/aigpt/#/js?muti_agent_id=${agentid}&isPbl=true&session_id=${this.chatid}`//+'&muti_agent_id2='+agentid
       }else{
-        url = `https://beta.cloud.cocorobo.cn/aigpt/#/js?muti_agent_id=${agentid}&isPbl=true&session_id=${this.chatid}`//+'&muti_agent_id2='+agentid
+        url = `https://cloud.cocorobo.hk/aigpt/#/js?muti_agent_id=${agentid}&isPbl=true&session_id=${this.chatid}`//+'&muti_agent_id2='+agentid
       }
       return url;
     },
@@ -11428,6 +11449,7 @@ export default {
             mode: this.mode,
             targetCourseText2: this.targetCourseText2,
             chatid: this.chatid,
+            languageSetting: this.languageSetting,
           }),
           iresearch: this.isFileSearch ? 1 : 2,
         },
@@ -11697,6 +11719,7 @@ export default {
             mode: this.mode,
             targetCourseText2: this.targetCourseText2,
             chatid: this.chatid,
+            languageSetting: this.languageSetting,
           }),
           iresearch: this.isFileSearch ? 1 : 2,
         },
@@ -13685,7 +13708,7 @@ export default {
         console.log("这是新增课程");
         this.selectAllType();
         this.chatid = uuidv4();
-        this.courseTextB = true
+        // this.courseTextB = false
       } else {
         this.isOutline = true
         this.isOutline2 = true
@@ -13826,6 +13849,7 @@ export default {
                 this.mode = JSON.parse(res.data[0][0].setting).mode ? JSON.parse(res.data[0][0].setting).mode : 1;
                 this.targetCourseText2 = JSON.parse(res.data[0][0].setting).targetCourseText2 ? JSON.parse(res.data[0][0].setting).targetCourseText2 : '';
                 this.chatid = JSON.parse(res.data[0][0].setting).chatid ? JSON.parse(res.data[0][0].setting).chatid : uuidv4();
+                this.languageSetting = (JSON.parse(res.data[0][0].setting).languageSetting || JSON.parse(res.data[0][0].setting).languageSetting == 0) ? JSON.parse(res.data[0][0].setting).languageSetting : 1;
                 if(this.targetCourseText2 || (!this.teacherCourseText)){
                   this.courseTextBool = true
                 }
@@ -13975,6 +13999,7 @@ export default {
                 this.mode = JSON.parse(res.data[0][0].setting).mode ? JSON.parse(res.data[0][0].setting).mode : 1;
                 this.targetCourseText2 = JSON.parse(res.data[0][0].setting).targetCourseText2 ? JSON.parse(res.data[0][0].setting).targetCourseText2 : '';
                 this.chatid = JSON.parse(res.data[0][0].setting).chatid ? JSON.parse(res.data[0][0].setting).chatid : uuidv4();
+                this.languageSetting = (JSON.parse(res.data[0][0].setting).languageSetting || JSON.parse(res.data[0][0].setting).languageSetting == 0) ? JSON.parse(res.data[0][0].setting).languageSetting : 1;
                 if(this.targetCourseText2 || (!this.teacherCourseText)){
                   this.courseTextBool = true
                 }
@@ -15973,7 +15998,7 @@ export default {
       }else if(pan == 'aiTask2'){
         this.aiJson['aiTask'] = string
       }else if(pan == 'aiTask3'){
-        this.aiJson['aiTaskG2'] = string
+        this.aiJson['aiTaskG1'] = string
         this.aiJson['aiTaskG2'] = string2
         this.aiJson['aiTaskG3'] = string3
       }else if(pan == 'aiteacherTextDetail'){
@@ -16065,6 +16090,17 @@ export default {
 
       this.courseTextBool = true
     },
+    changeIsuseT(){
+      if(this.isuseT == 1){
+        this.courseTextB = false
+      }else{
+        if(this.courseText){
+          this.courseTextB = false
+        }else{ 
+          this.courseTextB = true
+        }
+      }
+    },
     openInterPanSetting(){
       this.interSetting = !this.interSetting
       if(this.interSetting){
@@ -16078,7 +16114,7 @@ export default {
       }
     },
     setAgentid(){
-      if(this.agentid.trim()){
+      if(!this.agentid.trim()){
         this.$message.error('请输入工作流链接')
         return;
       }
@@ -16529,7 +16565,7 @@ let target = this.targetCourseText2 ? this.targetCourseText2 : this.targetcourse
 // ${this.templatePan.includes(this.templateid) ? '课程时长:'+this.courseTime+'min' : ''}
         let message = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16556,7 +16592,7 @@ ${txt2}
 // ${this.templatePan.includes(this.templateid) ? '课程时长:'+this.courseTime+'min' : ''}
         let message = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16587,7 +16623,7 @@ ${target ? '课程目标:' + target.replaceAll('#','').replaceAll('*','').repl
         }
         let message = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数组的数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16619,7 +16655,7 @@ ${(this.templateid == "4480d65a-1e48-11ef-bee5-005056b86db5" || this.templateid
             var _text = `任务名称:${this.unitJson[0].chapterInfo[0].taskJson[_task].task} 任务描述:${this.unitJson[0].chapterInfo[0].taskJson[_task].taskDetail3.replaceAll('#','').replaceAll('*','').replaceAll('-','').replaceAll('\n','')} \n`
             let message = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数组的数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16648,7 +16684,7 @@ ${(this.templateid == "4480d65a-1e48-11ef-bee5-005056b86db5" || this.templateid
           var _text = `任务名称:${this.unitJson[0].chapterInfo[0].taskJson[this.aiCallBack[0]].task} 任务描述:${this.unitJson[0].chapterInfo[0].taskJson[this.aiCallBack[0]].taskDetail3.replaceAll('#','').replaceAll('*','').replaceAll('-','').replaceAll('\n','')} \n`
           let message = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数组的数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16679,7 +16715,7 @@ ${(this.templateid == "4480d65a-1e48-11ef-bee5-005056b86db5" || this.templateid
           for(var _task = 0; _task < this.unitJson[0].chapterInfo[0].taskJson.length; _task++){
             let message1 = `NOTICE
 Role: 你是一名教师,你正在使用一个在线学习平台来教授学生,你已经完成了教案,你现在需要将教案变为学生上课用的任务单(work sheet)。该在线学习平台为每个任务提供了资源区(视频,ppt,阅读资料将放在这里),多种互动工具(学生点击工具即可上传他们的作业或者回答,这些互动工具类似kahoot一样允许教师轻松收集,统计,追踪学生作业),以及和任务绑定的目标和评价系统。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16703,7 +16739,7 @@ ${msg}
  
 let message2 = `NOTICE
 Role: 你是一名教师,你正在使用一个在线学习平台来教授学生,你已经完成了教案,你现在需要将教案变为学生上课用的任务单(work sheet)。该在线学习平台为每个任务提供了资源区(视频,ppt,阅读资料将放在这里),多种互动工具(学生点击工具即可上传他们的作业或者回答,这些互动工具类似kahoot一样允许教师轻松收集,统计,追踪学生作业),以及和任务绑定的目标和评价系统。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16717,21 +16753,23 @@ ${msg2}
 
 # 输出格式与要求
 互动工具列表
-工具名:表格
+工具名:${this.languageSetting == 2 ? 'Diagram Tool' : '表格'}
 工具指引:同学们,在完成本次STEM小车实验时,我们需要使用表格工具来记录和整理实验数据。表格工具就像一个电子版的记录本,它不仅可以帮助我们准确记录数据,还能自动计算和生成图表,方便我们分析实验结果。在第一行,每个单元格中输入我们要记录的变量名称,比如“时间(秒)”、“距离(米)”、“速度(米/秒)”等。接下来,在实验中,我们会把每次测试的结果依次填入相应的单元格中。记得每一行代表一次完整的实验测试哦。
 
-工具名:文档
+工具名:${this.languageSetting == 2 ? 'Document tool' : '文档'}
 工具指引:在实验数据整理好之后,我们接下来要用文档工具撰写实验报告。这份报告不仅是对我们实验的总结,也是展示我们分析和思考能力的好机会。文档工具就像一本电子笔记本,可以帮助我们把想法和数据清晰地展示出来。该份实验报告需要包括以下内容:1.实验背景: 简单介绍实验的目的,比如“我们这次实验的目的是通过小车演示,理解速度和加速度的关系”。用简洁的语言说明你为什么要做这个实验。\n2.实验方法: 详细描述你是如何进行实验的,包括实验步骤和使用的工具。例如,你可以写“我们将小车放在一个倾斜的平面上,记录它在不同时间间隔下的距离”。\n 3.数据分析: 这部分是核心内容。你可以将表格工具生成的图表插入到文档中,并解释图表显示的结果。例如,你可以写“从图表中可以看出,随着时间的增加,小车的速度逐渐加快,这说明……”。\n 4.结论与建议: 最后,总结你在实验中得出的结论,比如“小车在光滑表面上的加速度较大”,并提出一些改进实验或进一步研究的建议。
 
-工具名称:选择题
+工具名称:${this.languageSetting == 2 ? 'Choice tool' : '选择题'}
 工具指引:同学们,老师想要考察一下你对“热传递”这一概念的理解和掌握程度。请仔细阅读每个问题,并给出准确的答案哦~
 
+${this.languageSetting == 2 ? '还有以下工具:Mind Map Tool、Spreadsheet tool、Q&A Tool' : ''}
+
 # Format example
 {"toolChoose":[{"tool":"工具名","detail":"工具描述"},{"tool":"工具名","detail":"工具描述"}]}`
 
 let message3 = `NOTICE
 Role: 你是一名教师,你正在使用一个在线学习平台来教授学生,你已经完成了教案,你现在需要将教案变为学生上课用的任务单(work sheet)。该在线学习平台为每个任务提供了资源区(视频,ppt,阅读资料将放在这里),多种互动工具(学生点击工具即可上传他们的作业或者回答,这些互动工具类似kahoot一样允许教师轻松收集,统计,追踪学生作业),以及和任务绑定的目标和评价系统。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16765,7 +16803,7 @@ ${msg3}
         }else{
           let message1 = `NOTICE
 Role: 你是一名教师,你正在使用一个在线学习平台来教授学生,你已经完成了教案,你现在需要将教案变为学生上课用的任务单(work sheet)。该在线学习平台为每个任务提供了资源区(视频,ppt,阅读资料将放在这里),多种互动工具(学生点击工具即可上传他们的作业或者回答,这些互动工具类似kahoot一样允许教师轻松收集,统计,追踪学生作业),以及和任务绑定的目标和评价系统。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16789,7 +16827,7 @@ ${msg}
  
 let message2 = `NOTICE
 Role: 你是一名教师,你正在使用一个在线学习平台来教授学生,你已经完成了教案,你现在需要将教案变为学生上课用的任务单(work sheet)。该在线学习平台为每个任务提供了资源区(视频,ppt,阅读资料将放在这里),多种互动工具(学生点击工具即可上传他们的作业或者回答,这些互动工具类似kahoot一样允许教师轻松收集,统计,追踪学生作业),以及和任务绑定的目标和评价系统。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16803,21 +16841,23 @@ ${msg2}
 
 # 输出格式与要求
 互动工具列表
-工具名:表格
+工具名:${this.languageSetting == 2 ? 'Diagram Tool' : '表格'}
 工具指引:同学们,在完成本次STEM小车实验时,我们需要使用表格工具来记录和整理实验数据。表格工具就像一个电子版的记录本,它不仅可以帮助我们准确记录数据,还能自动计算和生成图表,方便我们分析实验结果。在第一行,每个单元格中输入我们要记录的变量名称,比如“时间(秒)”、“距离(米)”、“速度(米/秒)”等。接下来,在实验中,我们会把每次测试的结果依次填入相应的单元格中。记得每一行代表一次完整的实验测试哦。
 
-工具名:文档
+工具名:${this.languageSetting == 2 ? 'Document tool' : '文档'}
 工具指引:在实验数据整理好之后,我们接下来要用文档工具撰写实验报告。这份报告不仅是对我们实验的总结,也是展示我们分析和思考能力的好机会。文档工具就像一本电子笔记本,可以帮助我们把想法和数据清晰地展示出来。该份实验报告需要包括以下内容:1.实验背景: 简单介绍实验的目的,比如“我们这次实验的目的是通过小车演示,理解速度和加速度的关系”。用简洁的语言说明你为什么要做这个实验。\n2.实验方法: 详细描述你是如何进行实验的,包括实验步骤和使用的工具。例如,你可以写“我们将小车放在一个倾斜的平面上,记录它在不同时间间隔下的距离”。\n 3.数据分析: 这部分是核心内容。你可以将表格工具生成的图表插入到文档中,并解释图表显示的结果。例如,你可以写“从图表中可以看出,随着时间的增加,小车的速度逐渐加快,这说明……”。\n 4.结论与建议: 最后,总结你在实验中得出的结论,比如“小车在光滑表面上的加速度较大”,并提出一些改进实验或进一步研究的建议。
 
-工具名称:选择题
+工具名称:${this.languageSetting == 2 ? 'Choice tool' : '选择题'}
 工具指引:同学们,老师想要考察一下你对“热传递”这一概念的理解和掌握程度。请仔细阅读每个问题,并给出准确的答案哦~
 
+${this.languageSetting == 2 ? '还有以下工具:Mind Map Tool、Spreadsheet tool、Q&A Tool' : ''}
+
 # Format example
 {"toolChoose":[{"tool":"工具名","detail":"工具描述"},{"tool":"工具名","detail":"工具描述"}]}`
 
 let message3 = `NOTICE
 Role: 你是一名教师,你正在使用一个在线学习平台来教授学生,你已经完成了教案,你现在需要将教案变为学生上课用的任务单(work sheet)。该在线学习平台为每个任务提供了资源区(视频,ppt,阅读资料将放在这里),多种互动工具(学生点击工具即可上传他们的作业或者回答,这些互动工具类似kahoot一样允许教师轻松收集,统计,追踪学生作业),以及和任务绑定的目标和评价系统。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16878,7 +16918,7 @@ ${msg3}
         let target = this.targetCourseText2 ? this.targetCourseText2 : this.targetcoursetext
         let message = ` NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16909,7 +16949,7 @@ ${(this.templateid != "4480d65a-1e48-11ef-bee5-005056b86db5") ? '## 参考上下
         this.loading = true
         let message = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16938,7 +16978,7 @@ ${msg} 以及##参考资料
       } else if (this.aitype == 'aiSearchFile'){
         let messages = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -16979,6 +17019,17 @@ ${msg}。相关信息内容至少要有300tokens,可以是markdown格式
       }
       this.setAiJson(this.aitype, msg, msg2, msg3)
     },
+    getLang(){
+      let lang = ''
+      if(this.languageSetting == 0){
+        lang = 'Chinese.'
+      }else if(this.languageSetting == 1){
+        lang = 'Traditional Chinese.'
+      }else if(this.languageSetting == 2){
+        lang = 'English.'
+      }
+      return lang
+    },
     detailYou(message) {
       this.textLoading = true
       this.ttextLoading = true
@@ -17020,7 +17071,7 @@ ${msg}。相关信息内容至少要有300tokens,可以是markdown格式
 // ${this.templatePan.includes(this.templateid) ? '课程时长:'+this.courseTime+'min' : ''}
       let msg = `NOTICE
 Role: 你是创建课程的老师,内容以markdown形式出现(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容)
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -17121,7 +17172,7 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -17388,8 +17439,8 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
       // });
       this.isOutlineCancelToken = this.ajax.setCancelSource();
       let parm = {
-        assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages}],
+        assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',//
+        message: [{"type":"text", "text": this.languageSetting == 1 ? converter2(messages) : messages}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -17736,7 +17787,7 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
       this.isOutlineCancelToken = this.ajax.setCancelSource();
       let parm = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -17995,7 +18046,7 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
       _this.isTeacherTaskCancelToken = _this.ajax.setCancelSource();
       let parm = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: '',
@@ -18293,7 +18344,7 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
 
       let parm = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -18561,7 +18612,7 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
 
       let parm = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -18708,7 +18759,7 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
 
       let parm = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -18783,7 +18834,7 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
 
       let parm = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -18830,7 +18881,19 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
               "问答": { tool: 15, type: 2 },
               "选择题": { tool: 45, type: 2 },
             }
-
+            if(_this.languageSetting == 1){
+              toolsJson = JSON.parse(converter2(JSON.stringify(toolsJson)))
+            }else if(_this.languageSetting == 2){
+              toolsJson = {
+                "Mind Map Tool": { tool: 1, type: 1 },
+                "Document tool": { tool: 52, type: 1 },
+                "Diagram Tool": { tool: 3, type: 1 },
+                "Spreadsheet tool": { tool: 48, type: 1 },
+                "作业提交": { tool: 16, type: 2 },
+                "Q&A Tool": { tool: 15, type: 2 },
+                "Choice tool": { tool: 45, type: 2 },
+              }
+            }
             let _task = tArray
             if(!_task.toolChoose){
               console.log("error_________________JSON不对重新生成");
@@ -18914,7 +18977,7 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
 
       let parm = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -19010,7 +19073,7 @@ ${this.courseText && this.aiCallBack == 2 ? '注意,优化原有的<参考内
         if(type == 15){
           messages = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -19037,7 +19100,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[task].taskDetail3.replaceAll('#','')
         }else if(type == 45){
           messages = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -19067,7 +19130,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[task].taskDetail3.replaceAll('#','')
 
         let parm = {
           assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-          message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+          message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
           session_name: uuidv4(),
           userId: this.userid,
           file_ids: fileid.length ? [...fileid] : '',
@@ -19178,7 +19241,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[task].taskDetail3.replaceAll('#','')
       if(type == 15){
         messages = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -19205,7 +19268,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[_this.taskCount].taskDetail3.replace
       }else if(type == 45){
         messages = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容),并生成需要的JSON数据。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -19235,7 +19298,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[_this.taskCount].taskDetail3.replace
 
       let parm = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -19477,7 +19540,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[_this.taskCount].taskDetail3.replace
 
       let parm = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -19675,7 +19738,7 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[_this.taskCount].taskDetail3.replace
       }
       let messages = `NOTICE
 Role: 你是创建课程的老师(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容)。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -19714,7 +19777,7 @@ ${msg}
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -19873,7 +19936,7 @@ ${msg}
       }
       let messages = `NOTICE
 Role: 你是创建课程的老师,内容不要以markdown形式出现,只需要口语化的形式。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -19919,7 +19982,7 @@ ${txt}
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -20021,7 +20084,7 @@ ${txt}
       }
       let messages = `NOTICE
 Role: 你是创建课程的老师,内容不要以markdown形式出现,只需要口语化的形式。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -20067,7 +20130,7 @@ ${txt}
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages) : messages}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -20215,7 +20278,7 @@ ${txt}
 
       let messages = `NOTICE
 Role: 你是一名老师,可以给与学生的指示,对应到学生活动,你应该用友好,但是又清晰明确的口吻来撰写,内容不要以markdown形式出现,只需要口语化的形式。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -20251,7 +20314,7 @@ ${_this.aiCallBack.taskDetail}
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ")) : messages.replaceAll('\n', " ")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -20386,7 +20449,7 @@ ${_this.aiCallBack.taskDetail}
       // **重点考虑该任务及工具名和工具内容的情况下*
       let messages = `NOTICE
 Role: 你是一名老师,可以给与学生的指示,对应到学生活动,你应该用友好,但是又清晰明确的口吻来撰写,内容不要以markdown形式出现,只需要口语化的形式。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -20422,7 +20485,7 @@ ${msg} 输出格式和内容要求参考#格式与要求
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -20577,7 +20640,7 @@ ${msg} 输出格式和内容要求参考#格式与要求
 
       // **重点考虑该任务详情**
 //       let messages = `
-// Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+// Language: ${this.getLang()}
 // ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
 
 // #Context
@@ -20596,7 +20659,7 @@ ${msg} 输出格式和内容要求参考#格式与要求
 // # Format example
 // [{"value":"评价维度","detail":"维度描述",target:"评价目标","score":5},{"value":"评价维度","detail":"维度描述",target:"评价目标","score":5},{"value":"评价维度","detail":"维度描述",target:"评价目标","score":5}]`
 let messages = `
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
 
 #Context
@@ -20635,7 +20698,7 @@ ${msg} 优化核心素养、目标、评价标准,输出格式和内容要求
       // })
       let params = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: _this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -20747,7 +20810,7 @@ ${msg} 优化核心素养、目标、评价标准,输出格式和内容要求
         _text2 += `任务名称:${_this.unitJson[0].chapterInfo[0].taskJson[i].task} 教案描述:${_this.unitJson[0].chapterInfo[0].taskJson[i].taskDetail3.replaceAll('#','').replaceAll('*','').replaceAll('-','').replaceAll('\n','')} \n`
       }
       let messages = `
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'.Output format carefully referenced "Format example".
 
 --------
@@ -20789,7 +20852,7 @@ ${_text2}`
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -20939,7 +21002,8 @@ ${_text2}`
       }
       let messages = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容)
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
+ATTENTION:  follow "Language"
 
 #Context
 ## 要求
@@ -20979,7 +21043,7 @@ ${(_this.templateid == "4480d65a-1e48-11ef-bee5-005056b86db5" || _this.templatei
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -21170,7 +21234,8 @@ let courseText = this.courseText ? this.courseText : this.teacherCourseText
 let target = this.targetCourseText2 ? this.targetCourseText2 : this.targetcoursetext
       let messages = `NOTICE
 Role: 你是创建课程的老师,可以利用file_search的方式完整的去分析文件内容(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容)
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
+ATTENTION:  follow "Language"
 
 ${msg} 
 
@@ -21206,7 +21271,7 @@ ${this.aitype == 'aiCpote4' ? '## 目标层\n'+this.cpote['cpote3'] : ''}`
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -21365,7 +21430,7 @@ ${this.aitype == 'aiCpote4' ? '## 目标层\n'+this.cpote['cpote3'] : ''}`
       // ${this.templatePan.includes(this.templateid) ? '课程时长:'+this.courseTime+'min' : ''}
       let messages = `NOTICE
 Role: 你是创建课程的老师,内容以markdown形式出现(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容)。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -21401,7 +21466,7 @@ ${this.teacherCourseText && this.aiCallBack == 2 ? '注意,优化原有的<参
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -21565,7 +21630,7 @@ ${this.teacherCourseText && this.aiCallBack == 2 ? '注意,优化原有的<参
       // ${this.templatePan.includes(this.templateid) ? '课程时长:'+this.courseTime+'min' : ''}
       let messages = `NOTICE
 Role: 你是创建课程的老师,内容以markdown形式出现(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容)。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -21602,7 +21667,7 @@ ${this.targetCourseText && this.aiCallBack == 2 ? '注意,优化原有的<参
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -21771,7 +21836,7 @@ ${this.targetCourseText && this.aiCallBack == 2 ? '注意,优化原有的<参
 
       let messages = `NOTICE
 Role: 你是创建课程的老师,内容以markdown形式出现(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容)。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -21807,7 +21872,7 @@ ${this.targetCourseText && this.aiCallBack == 2 ? '注意,优化原有的<参
 
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -21893,6 +21958,38 @@ ${this.targetCourseText && this.aiCallBack == 2 ? '注意,优化原有的<参
           console.error(err);
         });
     },
+    selectAiFileid(){
+      let params = {
+        oid: this.oid,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectAiFileid", params)
+        .then((res) => {
+          let fileIds = []
+          for(var i = 0; i < res.data[0].length; i++){
+            fileIds.push(res.data[0][i].fileid)
+          }
+          this.fileIds = fileIds
+          if(res.data[1].length){
+            fileIds = []
+            for(var i = 0; i < res.data[1].length; i++){
+              fileIds.push(res.data[0][i].fileid)
+            }
+            this.fileidArray = fileIds
+          }
+          if(res.data[2].length){
+            fileIds = []
+            for(var i = 0; i < res.data[2].length; i++){
+              fileIds.push(res.data[0][i].fileid)
+            }
+            this.fileidArray = fileIds
+          }
+
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
     async aitargetTextDetail22(msg,msg2) {
       let _this = this
       let fileid = [] 
@@ -21928,7 +22025,7 @@ ${this.targetCourseText && this.aiCallBack == 2 ? '注意,优化原有的<参
 
       let messages = `NOTICE
 Role: 你是创建课程的老师,内容以markdown形式出现(注:如果文件内容里面不包含需要检索的内容,就不引用文件内容)。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -21965,7 +22062,7 @@ ${this.targetCourseText && this.aiCallBack == 2 ? '注意,优化原有的<参
 
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -22151,7 +22248,7 @@ ${this.targetCourseText && this.aiCallBack == 2 ? '注意,优化原有的<参
       // })
       let params = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: _uuid,
         userId: _this.userid,
         uid: _uuid,
@@ -22217,7 +22314,7 @@ ${this.targetCourseText && this.aiCallBack == 2 ? '注意,优化原有的<参
       }
       let message = `NOTICE
 Role: 你是一个专业的项目式学习导师,你要根据制定标准资料中的评价维度和维度描述制定具体的评价细则。
-Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
+Language: ${this.getLang()}
 ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
 Instruction: Based on the context, follow "Format example", write content.
 
@@ -22303,7 +22400,7 @@ ${msg}
       //   });
       let parm = {
         assistant_id: 'f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":message.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: [],
@@ -22480,7 +22577,7 @@ ${msg}
 
       let parm = {
         assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
-        message: [{"type":"text", "text":messages.replaceAll('\n', " ").replaceAll('*', "")}],
+        message: [{"type":"text", "text":this.languageSetting == 1 ? converter2(messages.replaceAll('\n', " ").replaceAll('*', "")) : messages.replaceAll('\n', " ").replaceAll('*', "")}],
         session_name: uuidv4(),
         userId: this.userid,
         file_ids: fileid.length ? [...fileid] : '',
@@ -22583,6 +22680,7 @@ ${msg}
   },
   created() {
     this.selectFileid();
+    this.selectAiFileid();
     this.getStudent();
     this.getTeacher();
     this.getClass();
@@ -26990,8 +27088,47 @@ ol {
   min-width: calc(50%);
   min-height: 500px;
   margin-right: 10px;
+  border: 1px solid #c7c7c7;
+  border-radius: 0px 5px 5px 5px;
+  overflow: hidden;
+  position: relative;
+  box-sizing: border-box;
+}
 
+.inter_box::before{
+  content:'对话区';
+  position: absolute;
+  left: 0;
+  top: 0;
+  display: block;
+  padding: 8px 10px;
+  background: #e0eafb;
+  color: #98a0ac;
+  font-size: 14px;
+  border-radius: 0 15px 15px 0;
 }
+
+.inter_Detailbox{
+  border: 1px solid #c7c7c7;
+  border-radius: 0px 5px 5px 5px;
+  overflow: hidden;
+  position: relative;
+  box-sizing: border-box;
+}
+
+.inter_Detailbox::before{
+  content:'编辑区';
+  position: absolute;
+  left: 0;
+  top: 0;
+  display: block;
+  padding: 8px 10px;
+  background: #e0eafb;
+  color: #98a0ac;
+  font-size: 14px;
+  border-radius: 0 15px 15px 0;
+}
+
 .inter_box > iframe{
   width: 100%;
   height: 100%;
@@ -27014,6 +27151,7 @@ ol {
   border-radius: 5px;
   box-shadow: 0px 0px 2px 1px #00000017;
   padding: 10px;
+  z-index: 999;
 }
 .panel_title{
   text-align: center;

+ 2 - 1
src/components/pages/aiAddCourse/aiBox.vue

@@ -389,7 +389,8 @@ export default {
         });
         let params = JSON.stringify({
           // model: "gpt-3.5-turbo",
-          model: 'gpt-4o-2024-08-06',
+          // model: 'gpt-4o-2024-08-06',
+          model: 'qwen-plus',
           temperature: 0,
           max_tokens: 4096,
           top_p: 1,

Datei-Diff unterdrückt, da er zu groß ist
+ 819 - 89
src/components/pages/aiAddCourse/aiBoxRight.vue


+ 382 - 382
src/components/pages/aiAddCourse/aiCreateDialog.vue

@@ -126,15 +126,16 @@ export default {
             //     { img: require('../../../assets/icon/ppt/model5-1.png'), img2: require('../../../assets/icon/ppt/model5-2.png'),color:'674D40' },
             // ],
             templateList: [
-                {
-                    img: require('../../../assets/icon/ppt/model1-1.png'),
+            {
+                    img: require('../../../assets/icon/ppt/model6-1.png'),
                     img1: {
-                        img: require('../../../assets/icon/ppt/model1-1.png'),
+                        img: require('../../../assets/icon/ppt/model6-1-2.png'),
                         setting: {
-                            x: "5%",
-                            y: 3,
-                            w: "90%",
-                            color: '17094F',
+                            x: "35%",
+                            y: 2.3,
+                            w: "60%",
+                            bold: true,
+                            color: 'EA7A93',
                             fontSize: 38,
                             fontFace: '黑体',
                             align: "center",
@@ -142,12 +143,12 @@ export default {
                     },
                     img2: [
                         {
-                            img: require('../../../assets/icon/ppt/model1-2.png'),
+                            img:require('../../../assets/icon/ppt/model6-2.png'),
                             title: {
                                 x: "5%", // 横坐标
                                 y: 1.1,
                                 w: "90%",
-                                color: '17094F',
+                                color: '4F73DA',
                                 bold: true,
                                 fontSize: 35, // 字号
                                 fontFace: '黑体',
@@ -157,7 +158,7 @@ export default {
                                 x: "5%", // 横坐标
                                 y: 1.8,
                                 w: "90%",
-                                color: "222222",
+                                color: "333333",
                                 fontSize: 20, // 字号
                                 fontFace: '黑体',
                                 align: "center",
@@ -166,426 +167,124 @@ export default {
                                 x: "20%", // 横坐标
                                 y: 3.2,
                                 w: "60%",
-                                color: "444444",
+                                color: "333333",
                                 fontSize: 18, // 字号
                                 fontFace: '黑体',
                                 align: "left",
                             }
-                        }
-                    ],
-                    imgEnd: {
-                        img: require('../../../assets/icon/ppt/model1-1.png'),
-                        setting: {
-                            x: "5%",
-                            y: 3,
-                            w: "90%",
-                            color: '17094F',
-                            fontSize: 38,
-                            fontFace: '黑体',
-                            align: "center",
-                        }
-                    }
-                },
-                {
-                    img: require('../../../assets/icon/ppt/model2-1.png'),
-                    img1: {
-                        img: require('../../../assets/icon/ppt/model2-1.png'),
-                        setting: {
-                            x: "5%",
-                            y: 3,
-                            w: "90%",
-                            color: '052B37',
-                            fontSize: 38,
-                            fontFace: '黑体',
-                            align: "center",
-                        }
-                    },
-                    img2: [
+                        },//内容页1
                         {
-                            img: require('../../../assets/icon/ppt/model2-2.png'),
+                            img: require('../../../assets/icon/ppt/model6-2.png'),
                             title: {
-                                x: "5%", // 横坐标
-                                y: 1.1,
-                                w: "90%",
-                                color: '052B37',
+                                x: "2.5%", // 横坐标
+                                y: 2.3,
+                                w: "30%",
+                                color: 'ffffff',
                                 bold: true,
                                 fontSize: 35, // 字号
                                 fontFace: '黑体',
-                                align: "center",
+                                align: "left",
                             },
                             subTitle: {
-                                x: "5%", // 横坐标
-                                y: 1.8,
-                                w: "90%",
-                                color: "222222",
+                                x: "2.5%", // 横坐标
+                                y: 3.1,
+                                w: "30%",
+                                color: "ffffff",
                                 fontSize: 20, // 字号
                                 fontFace: '黑体',
-                                align: "center",
+                                align: "left",
                             },
                             content: {
-                                x: "20%", // 横坐标
-                                y: 3.2,
-                                w: "60%",
-                                color: "444444",
+                                x: "45%", // 横坐标
+                                y: 2.8,
+                                w: "45%",
+                                color: "333333",
                                 fontSize: 18, // 字号
                                 fontFace: '黑体',
                                 align: "left",
+                            },
+                            square: {
+                                x: 0,
+                                y: 0,
+                                w: "35%",
+                                h: "100%",
+                                fill: { color: "4F73DA" }
+                            },
+                            square2: {
+                                x: "35%",
+                                y: 0,
+                                w: "2.5%",
+                                h: "100%",
+                                fill: { color: "C2CFEF" }
                             }
-                        }
-                    ],
-                    imgEnd: {
-                        img: require('../../../assets/icon/ppt/model2-1.png'),
-                        setting: {
-                            x: "5%",
-                            y: 3,
-                            w: "90%",
-                            color: '052B37',
-                            fontSize: 38,
-                            fontFace: '黑体',
-                            align: "center",
-                        }
-                    }
-                },
-                {
-                    img: require('../../../assets/icon/ppt/model3-1.png'),
-                    img1: {
-                        img: require('../../../assets/icon/ppt/model3-1.png'),
-                        setting: {
-                            x: "5%",
-                            y: 3,
-                            w: "90%",
-                            color: '1D5869',
-                            fontSize: 38,
-                            fontFace: '黑体',
-                            align: "center",
-                        }
-                    },
-                    img2: [
+                        },//内容页2
                         {
-                            img: require('../../../assets/icon/ppt/model3-2.png'),
+                            img: require('../../../assets/icon/ppt/model6-2.png'),
                             title: {
                                 x: "5%", // 横坐标
-                                y: 1.1,
-                                w: "90%",
-                                color: '1D5869',
+                                y: 1,
+                                w: "60%",
+                                color: '4F73DA',
                                 bold: true,
                                 fontSize: 35, // 字号
                                 fontFace: '黑体',
-                                align: "center",
+                                align: "left",
                             },
                             subTitle: {
                                 x: "5%", // 横坐标
-                                y: 1.8,
-                                w: "90%",
-                                color: "222222",
+                                y: 1.7,
+                                w: "60%",
+                                color: "333333",
                                 fontSize: 20, // 字号
                                 fontFace: '黑体',
-                                align: "center",
+                                align: "left",
                             },
                             content: {
-                                x: "20%", // 横坐标
-                                y: 3.2,
+                                x: "5%", // 横坐标
+                                y: 2.5,
                                 w: "60%",
-                                color: "444444",
+                                color: "333333",
                                 fontSize: 18, // 字号
                                 fontFace: '黑体',
                                 align: "left",
-                            }
-                        }
-                    ],
-                    imgEnd: {
-                        img: require('../../../assets/icon/ppt/model3-1.png'),
-                        setting: {
-                            x: "5%",
-                            y: 3,
-                            w: "90%",
-                            color: '1D5869',
-                            fontSize: 38,
-                            fontFace: '黑体',
-                            align: "center",
-                        }
-                    }
-                },
-                {
-                    img: require('../../../assets/icon/ppt/model4-1.png'),
-                    img1: {
-                        img: require('../../../assets/icon/ppt/model4-1.png'),
-                        setting: {
-                            x: "5%",
-                            y: 3,
-                            w: "90%",
-                            color: '372213',
-                            fontSize: 38,
-                            fontFace: '黑体',
-                            align: "center",
-                        }
-                    },
-                    img2: [
+                            },
+                            image: {
+                                x: "70%",
+                                y: "22%",
+                                w: "30%",
+                                h: "56%",
+                                sizing: "contain",
+                                path: require('../../../assets/icon/ppt/model6-3.png')
+                            },
+                        },//内容页3
                         {
-                            img: require('../../../assets/icon/ppt/model4-2.png'),
+                            img: require('../../../assets/icon/ppt/model6-2.png'),
                             title: {
-                                x: "5%", // 横坐标
-                                y: 1.1,
-                                w: "90%",
-                                color: '372213',
+                                x: "10%", // 横坐标
+                                y: "4%",
+                                h: 0.75,
+                                w: "80%",
+                                color: 'ffffff',
+                                fill: { color: "4F73DA"},
                                 bold: true,
                                 fontSize: 35, // 字号
                                 fontFace: '黑体',
                                 align: "center",
                             },
                             subTitle: {
-                                x: "5%", // 横坐标
-                                y: 1.8,
-                                w: "90%",
-                                color: "222222",
+                                x: "10%", // 横坐标
+                                y: 1.5,
+                                w: "80%",
+                                color: "333333",
                                 fontSize: 20, // 字号
                                 fontFace: '黑体',
-                                align: "center",
+                                align: "left",
                             },
                             content: {
-                                x: "20%", // 横坐标
-                                y: 3.2,
-                                w: "60%",
-                                color: "444444",
-                                fontSize: 18, // 字号
-                                fontFace: '黑体',
-                                align: "left",
-                            }
-                        }
-                    ],
-                    imgEnd: {
-                        img: require('../../../assets/icon/ppt/model4-1.png'),
-                        setting: {
-                            x: "5%",
-                            y: 3,
-                            w: "90%",
-                            color: '372213',
-                            fontSize: 38,
-                            fontFace: '黑体',
-                            align: "center",
-                        }
-                    },
-                    color: '372213'
-                },
-                {
-                    img: require('../../../assets/icon/ppt/model5-1.png'),
-                    img1: {
-                        img: require('../../../assets/icon/ppt/model5-1.png'),
-                        setting: {
-                            x: "5%",
-                            y: 3,
-                            w: "90%",
-                            color: '674D40',
-                            fontSize: 38,
-                            fontFace: '黑体',
-                            align: "center",
-                        }
-                    },
-                    img2: [
-                        {
-                            img: require('../../../assets/icon/ppt/model5-2.png'),
-                            title: {
-                                x: "5%", // 横坐标
-                                y: 1.1,
-                                w: "90%",
-                                color: '674D40',
-                                bold: true,
-                                fontSize: 35, // 字号
-                                fontFace: '黑体',
-                                align: "center",
-                            },
-                            subTitle: {
-                                x: "5%", // 横坐标
-                                y: 1.8,
-                                w: "90%",
-                                color: "222222",
-                                fontSize: 20, // 字号
-                                fontFace: '黑体',
-                                align: "center",
-                            },
-                            content: {
-                                x: "20%", // 横坐标
-                                y: 3.2,
-                                w: "60%",
-                                color: "444444",
-                                fontSize: 18, // 字号
-                                fontFace: '黑体',
-                                align: "left",
-                            }
-                        }
-                    ],
-                    imgEnd: {
-                        img: require('../../../assets/icon/ppt/model5-1.png'),
-                        setting: {
-                            x: "5%",
-                            y: 3,
-                            w: "90%",
-                            color: '674D40',
-                            fontSize: 38,
-                            fontFace: '黑体',
-                            align: "center",
-                        }
-                    },
-                },
-                {
-                    img: require('../../../assets/icon/ppt/model6-1.png'),
-                    img1: {
-                        img: require('../../../assets/icon/ppt/model6-1-2.png'),
-                        setting: {
-                            x: "35%",
-                            y: 2.3,
-                            w: "60%",
-                            bold: true,
-                            color: 'EA7A93',
-                            fontSize: 38,
-                            fontFace: '黑体',
-                            align: "center",
-                        }
-                    },
-                    img2: [
-                        {
-                            img:require('../../../assets/icon/ppt/model6-2.png'),
-                            title: {
-                                x: "5%", // 横坐标
-                                y: 1.1,
-                                w: "90%",
-                                color: '4F73DA',
-                                bold: true,
-                                fontSize: 35, // 字号
-                                fontFace: '黑体',
-                                align: "center",
-                            },
-                            subTitle: {
-                                x: "5%", // 横坐标
-                                y: 1.8,
-                                w: "90%",
-                                color: "333333",
-                                fontSize: 20, // 字号
-                                fontFace: '黑体',
-                                align: "center",
-                            },
-                            content: {
-                                x: "20%", // 横坐标
-                                y: 3.2,
-                                w: "60%",
-                                color: "333333",
-                                fontSize: 18, // 字号
-                                fontFace: '黑体',
-                                align: "left",
-                            }
-                        },//内容页1
-                        {
-                            img: require('../../../assets/icon/ppt/model6-2.png'),
-                            title: {
-                                x: "2.5%", // 横坐标
-                                y: 2.3,
-                                w: "30%",
-                                color: 'ffffff',
-                                bold: true,
-                                fontSize: 35, // 字号
-                                fontFace: '黑体',
-                                align: "left",
-                            },
-                            subTitle: {
-                                x: "2.5%", // 横坐标
-                                y: 3.1,
-                                w: "30%",
-                                color: "ffffff",
-                                fontSize: 20, // 字号
-                                fontFace: '黑体',
-                                align: "left",
-                            },
-                            content: {
-                                x: "45%", // 横坐标
-                                y: 2.8,
-                                w: "45%",
-                                color: "333333",
-                                fontSize: 18, // 字号
-                                fontFace: '黑体',
-                                align: "left",
-                            },
-                            square: {
-                                x: 0,
-                                y: 0,
-                                w: "35%",
-                                h: "100%",
-                                fill: { color: "4F73DA" }
-                            },
-                            square2: {
-                                x: "35%",
-                                y: 0,
-                                w: "2.5%",
-                                h: "100%",
-                                fill: { color: "C2CFEF" }
-                            }
-                        },//内容页2
-                        {
-                            img: require('../../../assets/icon/ppt/model6-2.png'),
-                            title: {
-                                x: "5%", // 横坐标
-                                y: 1,
-                                w: "60%",
-                                color: '4F73DA',
-                                bold: true,
-                                fontSize: 35, // 字号
-                                fontFace: '黑体',
-                                align: "left",
-                            },
-                            subTitle: {
-                                x: "5%", // 横坐标
-                                y: 1.7,
-                                w: "60%",
-                                color: "333333",
-                                fontSize: 20, // 字号
-                                fontFace: '黑体',
-                                align: "left",
-                            },
-                            content: {
-                                x: "5%", // 横坐标
-                                y: 2.5,
-                                w: "60%",
-                                color: "333333",
-                                fontSize: 18, // 字号
-                                fontFace: '黑体',
-                                align: "left",
-                            },
-                            image: {
-                                x: "70%",
-                                y: "22%",
-                                w: "30%",
-                                h: "56%",
-                                sizing: "contain",
-                                path: require('../../../assets/icon/ppt/model6-3.png')
-                            },
-                        },//内容页3
-                        {
-                            img: require('../../../assets/icon/ppt/model6-2.png'),
-                            title: {
-                                x: "10%", // 横坐标
-                                y: "4%",
-                                h: 0.75,
-                                w: "80%",
-                                color: 'ffffff',
-                                fill: { color: "4F73DA"},
-                                bold: true,
-                                fontSize: 35, // 字号
-                                fontFace: '黑体',
-                                align: "center",
-                            },
-                            subTitle: {
-                                x: "10%", // 横坐标
-                                y: 1.5,
-                                w: "80%",
-                                color: "333333",
-                                fontSize: 20, // 字号
-                                fontFace: '黑体',
-                                align: "left",
-                            },
-                            content: {
-                                x: "10%", // 横坐标
-                                y: 2.3,
-                                w: "80%",
-                                color: "333333",
+                                x: "10%", // 横坐标
+                                y: 2.3,
+                                w: "80%",
+                                color: "333333",
                                 fontSize: 18, // 字号
                                 fontFace: '黑体',
                                 align: "left",
@@ -738,6 +437,307 @@ export default {
                         }
                     },
                 },
+                {
+                    img: require('../../../assets/icon/ppt/model1-1.png'),
+                    img1: {
+                        img: require('../../../assets/icon/ppt/model1-1.png'),
+                        setting: {
+                            x: "5%",
+                            y: 3,
+                            w: "90%",
+                            color: '17094F',
+                            fontSize: 38,
+                            fontFace: '黑体',
+                            align: "center",
+                        }
+                    },
+                    img2: [
+                        {
+                            img: require('../../../assets/icon/ppt/model1-2.png'),
+                            title: {
+                                x: "5%", // 横坐标
+                                y: 1.1,
+                                w: "90%",
+                                color: '17094F',
+                                bold: true,
+                                fontSize: 35, // 字号
+                                fontFace: '黑体',
+                                align: "center",
+                            },
+                            subTitle: {
+                                x: "5%", // 横坐标
+                                y: 1.8,
+                                w: "90%",
+                                color: "222222",
+                                fontSize: 20, // 字号
+                                fontFace: '黑体',
+                                align: "center",
+                            },
+                            content: {
+                                x: "20%", // 横坐标
+                                y: 3.2,
+                                w: "60%",
+                                color: "444444",
+                                fontSize: 18, // 字号
+                                fontFace: '黑体',
+                                align: "left",
+                            }
+                        }
+                    ],
+                    imgEnd: {
+                        img: require('../../../assets/icon/ppt/model1-1.png'),
+                        setting: {
+                            x: "5%",
+                            y: 3,
+                            w: "90%",
+                            color: '17094F',
+                            fontSize: 38,
+                            fontFace: '黑体',
+                            align: "center",
+                        }
+                    }
+                },
+                {
+                    img: require('../../../assets/icon/ppt/model2-1.png'),
+                    img1: {
+                        img: require('../../../assets/icon/ppt/model2-1.png'),
+                        setting: {
+                            x: "5%",
+                            y: 3,
+                            w: "90%",
+                            color: '052B37',
+                            fontSize: 38,
+                            fontFace: '黑体',
+                            align: "center",
+                        }
+                    },
+                    img2: [
+                        {
+                            img: require('../../../assets/icon/ppt/model2-2.png'),
+                            title: {
+                                x: "5%", // 横坐标
+                                y: 1.1,
+                                w: "90%",
+                                color: '052B37',
+                                bold: true,
+                                fontSize: 35, // 字号
+                                fontFace: '黑体',
+                                align: "center",
+                            },
+                            subTitle: {
+                                x: "5%", // 横坐标
+                                y: 1.8,
+                                w: "90%",
+                                color: "222222",
+                                fontSize: 20, // 字号
+                                fontFace: '黑体',
+                                align: "center",
+                            },
+                            content: {
+                                x: "20%", // 横坐标
+                                y: 3.2,
+                                w: "60%",
+                                color: "444444",
+                                fontSize: 18, // 字号
+                                fontFace: '黑体',
+                                align: "left",
+                            }
+                        }
+                    ],
+                    imgEnd: {
+                        img: require('../../../assets/icon/ppt/model2-1.png'),
+                        setting: {
+                            x: "5%",
+                            y: 3,
+                            w: "90%",
+                            color: '052B37',
+                            fontSize: 38,
+                            fontFace: '黑体',
+                            align: "center",
+                        }
+                    }
+                },
+                {
+                    img: require('../../../assets/icon/ppt/model3-1.png'),
+                    img1: {
+                        img: require('../../../assets/icon/ppt/model3-1.png'),
+                        setting: {
+                            x: "5%",
+                            y: 3,
+                            w: "90%",
+                            color: '1D5869',
+                            fontSize: 38,
+                            fontFace: '黑体',
+                            align: "center",
+                        }
+                    },
+                    img2: [
+                        {
+                            img: require('../../../assets/icon/ppt/model3-2.png'),
+                            title: {
+                                x: "5%", // 横坐标
+                                y: 1.1,
+                                w: "90%",
+                                color: '1D5869',
+                                bold: true,
+                                fontSize: 35, // 字号
+                                fontFace: '黑体',
+                                align: "center",
+                            },
+                            subTitle: {
+                                x: "5%", // 横坐标
+                                y: 1.8,
+                                w: "90%",
+                                color: "222222",
+                                fontSize: 20, // 字号
+                                fontFace: '黑体',
+                                align: "center",
+                            },
+                            content: {
+                                x: "20%", // 横坐标
+                                y: 3.2,
+                                w: "60%",
+                                color: "444444",
+                                fontSize: 18, // 字号
+                                fontFace: '黑体',
+                                align: "left",
+                            }
+                        }
+                    ],
+                    imgEnd: {
+                        img: require('../../../assets/icon/ppt/model3-1.png'),
+                        setting: {
+                            x: "5%",
+                            y: 3,
+                            w: "90%",
+                            color: '1D5869',
+                            fontSize: 38,
+                            fontFace: '黑体',
+                            align: "center",
+                        }
+                    }
+                },
+                {
+                    img: require('../../../assets/icon/ppt/model4-1.png'),
+                    img1: {
+                        img: require('../../../assets/icon/ppt/model4-1.png'),
+                        setting: {
+                            x: "5%",
+                            y: 3,
+                            w: "90%",
+                            color: '372213',
+                            fontSize: 38,
+                            fontFace: '黑体',
+                            align: "center",
+                        }
+                    },
+                    img2: [
+                        {
+                            img: require('../../../assets/icon/ppt/model4-2.png'),
+                            title: {
+                                x: "5%", // 横坐标
+                                y: 1.1,
+                                w: "90%",
+                                color: '372213',
+                                bold: true,
+                                fontSize: 35, // 字号
+                                fontFace: '黑体',
+                                align: "center",
+                            },
+                            subTitle: {
+                                x: "5%", // 横坐标
+                                y: 1.8,
+                                w: "90%",
+                                color: "222222",
+                                fontSize: 20, // 字号
+                                fontFace: '黑体',
+                                align: "center",
+                            },
+                            content: {
+                                x: "20%", // 横坐标
+                                y: 3.2,
+                                w: "60%",
+                                color: "444444",
+                                fontSize: 18, // 字号
+                                fontFace: '黑体',
+                                align: "left",
+                            }
+                        }
+                    ],
+                    imgEnd: {
+                        img: require('../../../assets/icon/ppt/model4-1.png'),
+                        setting: {
+                            x: "5%",
+                            y: 3,
+                            w: "90%",
+                            color: '372213',
+                            fontSize: 38,
+                            fontFace: '黑体',
+                            align: "center",
+                        }
+                    },
+                    color: '372213'
+                },
+                {
+                    img: require('../../../assets/icon/ppt/model5-1.png'),
+                    img1: {
+                        img: require('../../../assets/icon/ppt/model5-1.png'),
+                        setting: {
+                            x: "5%",
+                            y: 3,
+                            w: "90%",
+                            color: '674D40',
+                            fontSize: 38,
+                            fontFace: '黑体',
+                            align: "center",
+                        }
+                    },
+                    img2: [
+                        {
+                            img: require('../../../assets/icon/ppt/model5-2.png'),
+                            title: {
+                                x: "5%", // 横坐标
+                                y: 1.1,
+                                w: "90%",
+                                color: '674D40',
+                                bold: true,
+                                fontSize: 35, // 字号
+                                fontFace: '黑体',
+                                align: "center",
+                            },
+                            subTitle: {
+                                x: "5%", // 横坐标
+                                y: 1.8,
+                                w: "90%",
+                                color: "222222",
+                                fontSize: 20, // 字号
+                                fontFace: '黑体',
+                                align: "center",
+                            },
+                            content: {
+                                x: "20%", // 横坐标
+                                y: 3.2,
+                                w: "60%",
+                                color: "444444",
+                                fontSize: 18, // 字号
+                                fontFace: '黑体',
+                                align: "left",
+                            }
+                        }
+                    ],
+                    imgEnd: {
+                        img: require('../../../assets/icon/ppt/model5-1.png'),
+                        setting: {
+                            x: "5%",
+                            y: 3,
+                            w: "90%",
+                            color: '674D40',
+                            fontSize: 38,
+                            fontFace: '黑体',
+                            align: "center",
+                        }
+                    },
+                },
             ],
             templateIndex: 0,
         };

BIN
src/components/pages/aiAddCourse/input.doc


+ 1219 - 0
src/components/pages/components/exportWorksDialog.vue

@@ -0,0 +1,1219 @@
+<template>
+  <div class="pbl">
+    <!-- <el-dialog
+      title="文件预览"
+      :visible.sync="worksDialog"
+      :before-close="handleClose"
+      class="worksDialogCSS"
+      :append-to-body="true"
+    > -->
+      <div slot="title" class="header-title">
+        <div style="color: #fff">导出作业集</div>
+      </div>
+    <div ref="reportPdf" v-loading="loading">
+      <div
+        class="coverPage"
+        :style="{
+          backgroundColor: schoolImg.bkColor ? schoolImg.bkColor : '#E5EFFE'
+        }"
+      >
+     
+        <div class="coverPageLogo">
+          <img :src="schoolImg.logo ? schoolImg.logo : ''" alt="" />
+        </div>
+        <div class="coverPageFrom" style="z-index: 10;">
+          <div class="coverPageFromTit" >{{ worksDialogCon2.course }}</div>
+          <div
+            style="
+                  font-size: 36px;
+                  font-weight: 600;
+                  color: rgba(54, 129, 252, 1);
+                  margin: 20px 0;
+                "
+          >
+            作业集
+          </div>
+          <div class="fromCss">
+            <div>
+              <span>姓名:</span>
+              <div class="txt">{{ worksDialogCon2.sName }}</div>
+            </div>
+            <div>
+              <span>班级:</span>
+              <div class="txt">{{ worksDialogCon2.class }}</div>
+            </div>
+            <div>
+              <span>学校:</span>
+              <div class="txt">{{ worksDialogCon2.schName }}</div>
+            </div>
+            <!-- <div>
+              <span>指导老师:</span>
+              <div class="txt"></div>
+            </div> -->
+          </div>
+        </div>
+        <div class="coverPageFrom">
+          <img
+          style="z-index: 10;"
+            src="../../../assets/icon/exportPdfworks/cocoroboCon.svg"
+            alt=""
+          />
+        </div>
+      </div>
+      <div class="coverPageCon">
+        <div
+          style="
+                font-size: 24px;
+                font-weight: 600;
+                color: rgba(58, 59, 152, 1);
+                margin: 20px 0 10px 0;
+              "
+        >
+          作业集
+        </div>
+        <div
+          v-if="i.stageData.length"
+          v-for="i in workList"
+          :key="i.id"
+          class="stageCon"
+        >
+          <div style="text-align: center; font-weight: 600; font-size: 16px;margin-bottom: 10px">
+            第{{ i.id * 1 + 1 }}阶段<span v-if="i.name">:{{ i.name }}</span>
+          </div>
+          <div
+            v-for="k in i.taskList"
+            :key="k.id + 'a'"
+            style="margin-bottom: 15px"
+          >
+            <div v-if="k.taskData && k.taskData.length">
+              <div
+                style="
+                      width: 100%;
+                      display: flex;
+                      justify-content: space-between;
+                      margin-bottom: 10px;
+                    "
+              >
+                <div>
+                  <span class="taskTitInd">任务{{ k.id + 1 }}</span>
+                  <span
+                    style="
+                          font-weight: 600;
+                          font-size: 14px;
+                          color: rgba(0, 0, 0, 0.9);
+                        "
+                    >{{ k.name }}</span
+                  >
+                </div>
+                <div>
+                  <!-- <span class="toolTit">文档工具</span> -->
+                </div>
+              </div>
+              <div class="WorksCon" v-for="l in k.taskData" :key="l.id">
+                <!-- 截图图片 -->
+                <div v-if="l.type == 1">
+                  <div style="display: flex; justify-content: flex-end">
+                    <div class="toolTit">截图工具</div>
+                  </div>
+                  <img style="max-width: 200px" :src="l.content" alt="" />
+                  <div>{{ l.content }}</div>
+                </div>
+
+                <!-- 问卷 -->
+                <div v-if="l.type == 2">
+                  <div style="display: flex; justify-content: flex-end">
+                    <div class="toolTit">问卷工具</div>
+                  </div>
+                  <div
+                    style="
+                          font-size: 15px;
+                          font-weight: 600;
+                          margin-bottom: 5px;
+                        "
+                  >
+                    标题:{{ l.content[0].askJson.askTitle }}
+                  </div>
+                  <div
+                    style="margin-bottom: 5px"
+                    v-for="(i, index) in l.content[0].askJson.askJson"
+                    :key="index"
+                  >
+                    <div>题目:{{ i.askstitle }}</div>
+                    <el-radio-group
+                      v-if="!i.type"
+                      v-model="l.content[0].anwer[index]"
+                    >
+                      <el-radio
+                        v-for="(item2, checkIndex) in i.checkList"
+                        :key="checkIndex + 'b'"
+                        :label="checkIndex"
+                        disabled
+                      >
+                        {{ item2 }}
+                      </el-radio>
+                    </el-radio-group>
+                    <el-checkbox-group
+                      v-model="l.content[0].anwer[index]"
+                      v-else
+                    >
+                      <div class="radioBox">
+                        <el-checkbox
+                          v-for="(item2, checkIndex) in i.checkList"
+                          :key="checkIndex + 'c'"
+                          :label="checkIndex"
+                          disabled
+                        >
+                          {{ item2 }}
+                        </el-checkbox>
+                      </div>
+                    </el-checkbox-group>
+                  </div>
+                </div>
+
+                <!-- 问答工具 -->
+                <div v-if="l.type == 3">
+                  <div style="display: flex; justify-content: flex-end">
+                    <div class="toolTit">问答工具</div>
+                  </div>
+                  <div
+                    style="
+                          font-size: 15px;
+                          font-weight: 600;
+                          margin-bottom: 5px;
+                        "
+                  >
+                    题目:{{ l.content[0].answerTitle }}
+                  </div>
+                  <div>回答:{{ l.content[0].answer }}</div>
+                </div>
+
+                <!-- word文档类 -->
+                <div v-if="l.type == 4">
+                  <div style="display: flex; justify-content: flex-end">
+                    <div class="toolTit">word工具</div>
+                  </div>
+                  <div>{{ l.content }}</div>
+                </div>
+                <!-- 视频 -->
+                <div v-if="l.type == 5">
+                  <div style="display: flex; justify-content: flex-end">
+                    <div class="toolTit">视频工具</div>
+                  </div>
+                  <div>{{ l.content }}</div>
+                </div>
+
+                <!-- 选择匹配工具 -->
+                <div v-if="l.type == 7">
+                  <div style="display: flex; justify-content: flex-end">
+                    <div class="toolTit" style="width: 85px">
+                      选择匹配工具
+                    </div>
+                  </div>
+                  <div>{{ l.content }}</div>
+                </div>
+
+                <!-- 选择题工具 -->
+                <div v-if="l.type == 8">
+                  <div style="display: flex; justify-content: flex-end">
+                    <div class="toolTit" style="width: 75px">选择题工具</div>
+                  </div>
+
+                  <div
+                    v-for="(i, index) in l.content.testJson"
+                    :key="index + 'm'"
+                  >
+                    <div>题目:{{ i.teststitle }}</div>
+                    <div
+                      v-if="i.type == 1"
+                      style="display: flex; flex-direction: column"
+                    >
+                      <el-radio-group v-model="l.content.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.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.type == 9">
+                  <div style="display: flex; justify-content: flex-end">
+                    <div class="toolTit" style="width: 85px">排序工具</div>
+                  </div>
+                  <div
+                    v-for="(i, index) in l.content"
+                    :key="index"
+                    style="margin-bottom: 10px"
+                  >
+                    <div
+                      style="
+                            height: 20px;
+                            display: flex;
+                            align-items: center;
+                            flex-wrap: wrap;
+                          "
+                    >
+                      题目:
+                      <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>
+                    </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"
+                      >
+                        {{ i }}
+                      </div>
+                    </div>
+                    <div>
+                      正确答案:
+                      <span style="margin: 0 5px">{{
+                        i.addSentence.join(",")
+                      }}</span>
+                    </div>
+                  </div>
+                </div>
+
+                <!-- 表格 -->
+                <div v-if="l.type == 10">
+                  <div style="display: flex; justify-content: flex-end">
+                    <div class="toolTit">表格工具</div>
+                  </div>
+
+                  <el-form>
+                    <div class="cont" v-html="l.content.text"></div>
+                  </el-form>
+                </div>
+
+                <!-- 文档作业 -->
+                <div v-if="l.type == 13">
+                  <div style="display: flex; justify-content: flex-end">
+                    <div class="toolTit">文档工具</div>
+                  </div>
+                  <div v-html="l.content.text"></div>
+                </div>
+              </div>
+              <div
+                v-if="item.stage == i.id && item.task == k.id && item.data && item.data.length"
+                v-for="(item, index) in elist[i.id]"
+                :key="index"
+              >
+                <div class="taskSco">
+                  <div
+                    style="
+                          display: flex;
+                          justify-content: space-between;
+                          margin-bottom: 10px;
+                          font-size: 16px;
+                        "
+                  >
+                    <div style="font-weight: 600; color: rgba(0, 0, 0, 0.9)">
+                      任务得分:
+                      <span style="color: rgba(54, 129, 252, 1)">{{
+                        totalScore(item.data)
+                      }}</span
+                      >分
+                    </div>
+                    <div
+                      style="
+                            font-size: 12px;
+                            font-weight: 400;
+                            color: rgba(0, 0, 0, 0.6);
+                            line-height: 21px;
+                          "
+                    >
+                      <!-- 提交时间: 2024-07-12 17:36:06 -->
+                    </div>
+                  </div>
+                  <div style="display: flex; justify-content: space-between">
+                    <div style="width: 49%">
+                      <div>
+                        <div class="score_boxTit"><span>分数详情</span></div>
+                        <div
+                          v-for="(l, ind) in item.data"
+                          :key="ind + 's'"
+                          class="score_box"
+                        >
+                          <el-tooltip
+                            class="item"
+                            effect="dark"
+                            :content="l.detail"
+                            placement="top-start"
+                          >
+                            <div class="RootImgBlock">
+                              {{ l.detail }}
+                            </div>
+                          </el-tooltip>
+
+                          <el-rate
+                            class="rate_size"
+                            disabled-void-color="#ccc"
+                            disabled
+                            style="min-width: 120px"
+                            v-model="l.sco"
+                          ></el-rate>
+                        </div>
+                      </div>
+                    </div>
+                    <div style="width: 49%">
+                      <div class="worksTarget" v-if="isShow(item.data)">
+                        <span>目标</span>
+                      </div>
+                      <div class="worksTargetCon" v-if="isShow(item.data)">
+                        <div
+                          v-for="(r, tarIndex) in item.data"
+                          :key="tarIndex"
+                        >
+                          <span> {{ r.target }}</span>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  <!-- </el-dialog> -->
+
+  </div>
+</template>
+
+<script>
+import html2canvas from "html2canvas";
+import jspdf from "jspdf";
+import JSZip from "jszip";
+
+export default {
+  props: ["uid", "cid", "worksDialog", "worksDialogCon","digNum"],
+  data() {
+    return {
+      workList: [],
+      dyList: [],
+      workEvaList: "",
+      elist: [],
+      state: 0,
+      oid: this.$route.query.oid,
+      org: this.$route.query.org,
+      uid2: this.uid,
+      worksDialogCon2: this.worksDialogCon,
+      courseName:'',
+      loading: false,
+      tableData: [],
+      imgList: [
+        {
+          schoolId: "45facc0a-1211-11ec-80ad-005056b86db5",
+          logo: require("../../../assets/icon/exportPdfworks/cocoroboLogo.svg"),
+          conImg: require("../../../assets/icon/exportPdfworks/cocoroboCon.svg"),
+          bkColor: "#E5EFFE"
+        }
+      ],
+      schoolImg: {}
+    };
+  },
+  watch: {
+    // uid(newl) {
+    //     this.getCourseDetail();
+    // }
+  },
+  mounted() {
+    if (this.digNum == 0) {
+      this.downPdf()
+    }else{
+     this.getWorks1()
+    }
+      // this.getCourseDetail();
+  },
+  computed: {
+    isShow() {
+      return function(val) {
+        if (!val) {
+          return 0
+        }
+        let num = 0;
+        val.forEach(i => {
+          if (i.target) {
+            num++;
+          }
+        });
+        return num * 1;
+      };
+    },
+    totalScore() {
+      return function(val) {
+        if (!val) {
+          return "0.0"
+        }
+        let a = 0;
+        val.forEach(e => {
+          if (e.sco) {
+            a += e.sco * 1;
+          }
+        });
+        if (a == 0) return "0.0";
+        return (a / val.length).toFixed(1);
+      };
+    }
+  },
+
+  methods: {
+    // 下载pdf文件
+    async getPdf() {
+      let domHeight = this.$refs.reportPdf.offsetHeight;
+      // console.log('this.$refs.reportPdf',this.$refs.reportPdf.offsetHeight);
+      let maxHeight = 64257;
+      return new Promise((resolve, reject) => {
+        html2canvas(this.$refs.reportPdf, {
+          useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
+          scale: maxHeight / domHeight > 1 ? 1 : maxHeight / domHeight
+        })
+          .then(canvas => {
+            const contentWidth = canvas.width;
+            const contentHeight = canvas.height;
+
+            var pageData = canvas.toDataURL("image/jpeg", 1.0);
+
+            var pdf = new jspdf("", "pt", [contentWidth, contentHeight]);
+
+            //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
+            //当内容未超过pdf一页显示的范围,无需分页
+            // if (leftHeight < pageHeight) {
+            pdf.addImage(pageData, "JPEG", 0, 0, contentWidth, contentHeight);
+
+            pdf.save(
+              this.worksDialogCon2.course +
+                "-作业集-" +
+                this.worksDialogCon2.sName +
+                ".pdf"
+            );
+            return resolve()
+          })
+          .catch(err => {
+            console.log(err);
+          });
+      });
+    },
+
+    // 压缩pdf
+    async getPdf2() {
+      let domHeight = this.$refs.reportPdf.offsetHeight;
+      // console.log('this.$refs.reportPdf',this.$refs.reportPdf.offsetHeight);
+      let maxHeight = 64257;
+      return new Promise((resolve, reject) => {
+        html2canvas(this.$refs.reportPdf, {
+          useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
+          scale: maxHeight / domHeight > 1 ? 1 : maxHeight / domHeight
+        })
+          .then(canvas => {
+            const contentWidth = canvas.width;
+            const contentHeight = canvas.height;
+
+            var pageData = canvas.toDataURL("image/jpeg", 1.0);
+
+            var pdf = new jspdf("", "pt", [contentWidth, contentHeight]);
+
+            //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
+            //当内容未超过pdf一页显示的范围,无需分页
+            // if (leftHeight < pageHeight) {
+            pdf.addImage(pageData, "JPEG", 0, 0, contentWidth, contentHeight);
+
+            var pdfData = {
+              pdfName:
+                this.worksDialogCon2.course +
+                "-作业集-" +
+                this.worksDialogCon2.sName +
+                ".pdf",
+              pdfCon: pdf.output("blob")
+            };
+            // pdfArray.push(pdfData);
+
+            return resolve(pdfData);
+          })
+          .catch(err => {
+            console.log(err);
+          });
+      });
+    },
+
+    // 图片放大查看
+    previewImg(url) {
+      this.$hevueImgPreview(url);
+    },
+    // 获取处理作业信息
+    async exportPdfSet(uid, con) {
+      let params = {
+        uid: this.uid2,
+        cid: this.cid
+      };
+      return new Promise((resolve, reject) => {
+        this.ajax
+          .get(this.$store.state.api + "selectAllWorksDetail", params)
+          .then(res => {
+            var worksDetail = res.data[1];
+            var askInfo = res.data[3]; //问卷
+            var answerInfo = res.data[4]; //问答题
+            var pptInfo = res.data[5];
+            var chooseInfo = res.data[6]; //选择题
+            var pjInfo = res.data[7]; //个人评价作业
+            var xztkInfo = res.data[8]; //选择匹配作业
+            var lccjInfo = res.data[9]; //排序作业
+            var bgInfo = res.data[10]; //表格作业
+            var cocopiInfo = res.data[11]; //cocopi或源码编辑作业
+            var wordInfo = res.data[12]; //文档作业
+            this.workEvaList = res.data[13];
+
+            this.elist = [] 
+            if (res.data[0].length) {
+              let elistData = JSON.parse(res.data[0][0].chapters);
+
+              elistData.forEach((e, i) => {
+                this.elist[i] = [];
+                e.chapterInfo[0].taskJson.forEach((k, kin) => {
+                  this.elist[i].push({ stage: i, task: kin, data: k.eList });
+                });
+              });
+            }
+
+
+            this.elist.forEach((e) => {
+              e.forEach((m, min) => {
+                this.workEvaList.forEach((i) => {
+                  if (
+                    m.stage == i.stage &&
+                    m.task == i.task &&
+                    this.worksDialogCon2.userid == i.userid &&
+                    m.data && m.data.length
+                  ) {
+                    
+                    if (m.data) {
+                      m.data.forEach((l) => {
+                        l.sco = 0;
+                        // console.log('l.detail',l.detail);
+                        
+                        if (isNaN(parseFloat(l.detail)) && l.detail) {
+                          var key2 = l.detail
+                          .match(/[\u4e00-\u9fa5a-zA-Z]+/g)
+                          .join("");
+                        }else{
+                          var key2 = l.detail
+                        }
+                        let rateCopy = JSON.parse(i.rate);
+                        for (const key in rateCopy) {
+                          if (isNaN(parseFloat(l.detail)) && l.detail) {
+                            var key3 = key
+                            .match(/[\u4e00-\u9fa5a-zA-Z]+/g)
+                            .join("");
+                          }else{
+                            var key3 = key
+                          }
+                          if (key2.indexOf(key3) != -1 && key != "content") {
+                            l.sco = rateCopy[key] * 1;
+                          }
+                        }
+                      });
+                    }
+                  }
+                });
+              });
+            });
+
+            res.data[3].forEach(e => {
+              e.content = JSON.parse(e.content);
+            });
+            res.data[4].forEach(e => {
+              e.content = JSON.parse(e.content);
+            });
+
+            res.data[6].forEach((k, i) => {
+              const element1 = JSON.parse(k.content)[0];
+              // console.log("JSON.parse(element1.content)[0]", element1);
+
+              let t = JSON.parse(k.content)[0].testJson;
+              // console.log("t", JSON.parse(JSON.stringify(t)));
+              // console.log("k", k);
+
+              // 处理学生选择答案
+              let e = [];
+              t.testJson.forEach((i, y) => {
+                e.push(element1.anwer[y]);
+              });
+              t.radio = e;
+
+              // 处理选项
+
+              k.content = t;
+            });
+            // console.log("res.data[6]", res.data[6]);
+
+            res.data[9].forEach(e => {
+              e.content = JSON.parse(e.content);
+            });
+
+            res.data[12].forEach(e => {
+              e.content = JSON.parse(e.content);
+            });
+            res.data[10].forEach(e => {
+              e.content = JSON.parse(e.content);
+            });
+
+            let AreaAllWork = [
+              ...res.data[1],
+              ...res.data[3],
+              ...res.data[4],
+              ...res.data[5],
+              ...res.data[6],
+              ...res.data[7],
+              ...res.data[8],
+              ...res.data[9],
+              ...res.data[10],
+              ...res.data[11],
+              ...res.data[12]
+            ];
+
+            AreaAllWork.sort(function(a, b) {
+              return a.stage - b.stage; //从小到大排序
+            });
+
+            let phaseList = JSON.parse(JSON.stringify(this.dyList));
+
+            phaseList.forEach(e => {
+              e.stageData = [];
+              AreaAllWork.forEach((k, index) => {
+                if (k.stage == e.id) {
+                  e.stageData.push(k);
+                }
+              });
+            });
+
+            phaseList.forEach(e => {
+              e.stageData.forEach((l, index) => {
+                e.taskList.forEach(k => {
+                  if (l.task == k.id) {
+                    if (k.taskData && k.taskData.length) {
+                      k.taskData.push(l);
+                    } else {
+                      k.taskData = [];
+                      k.taskData.push(l);
+                    }
+                  }
+                });
+              });
+            });
+            this.loading = false;
+
+            // console.log("phaseList", phaseList);
+            this.workList = phaseList;
+            setTimeout(() => {
+              return resolve();              
+            }, 1000);
+          })
+          .catch(err => {
+            console.error(err);
+          });
+      });
+    },
+    // 获取作业阶段人物信息
+    getCourseDetail() {
+      this.loading = true;
+      let params = {
+        cid: this.cid,
+        choseClass: ""
+      };
+      return new Promise((resolve, reject) => {
+        this.ajax
+          .get(this.$store.state.api + "getCourseWorksReport2", params) //getCourseWorksReport
+          .then(res => {
+            this.state = res.data[0][0].state;
+
+            var dyJSON = JSON.parse(res.data[0][0].chapters);
+
+            let dyList = [];
+            for (var i = 0; i < dyJSON.length; i++) {
+              dyList.push({ name: dyJSON[i].dyName, id: i, taskList: [] });
+              var a = dyJSON[i].chapterInfo[0].taskJson;
+              for (var j = 0; j < a.length; j++) {
+                dyList[i].taskList.push({ name: a[j].task, id: j });
+              }
+            }
+            this.dyList = dyList;
+
+            this.imgList.forEach(e => {
+              if (e.schoolId == this.oid) {
+                this.schoolImg = e;
+              }
+            });
+
+            return resolve();
+          })
+          .catch(err => {
+            console.error(err);
+          });
+      });
+    },
+
+    // 一键打包所有作业
+    async circulatePdf() {
+      let _this = this
+      var zip = new JSZip();
+      let pdfList = [];
+      for (let i = 0; i < this.tableData.length; i++) {
+        this.uid2 = this.tableData[i].userid;
+        this.worksDialogCon2 = this.tableData[i];
+        await this.getCourseDetail();
+        await this.exportPdfSet();
+        let a = await this.getPdf2();
+        pdfList.push(a);
+      }
+
+      pdfList.forEach((e, index) => {
+        zip.file(e.pdfName, e.pdfCon);
+      });
+
+      // 生成压缩包并提供下载链接
+      zip.generateAsync({ type: "blob" }).then(function(content) {
+        // 使用FileSaver保存压缩包
+        saveAs(content,_this.courseName + "-作业集汇总.zip");
+      });
+
+    this.$emit('update:worksDialog', false);
+      // this.worksDialog = false;
+    },
+    handleClose(done) {
+      done();
+    },
+    // 下载单个文件
+    async downPdf() {
+       
+        await this.getCourseDetail();
+        await this.exportPdfSet();
+        await this.getPdf();
+    },
+
+
+
+    // 获取所有作业然后一键打包压缩包
+    getWorks1() {
+      this.loading = true;
+
+      let params = {
+        cid: this.cid,
+        uname: "",
+        choseClass: "",
+        stage: "",
+        task: ""
+      };
+      
+       this.ajax
+        .get(this.$store.state.api +"getCourseWorks6", params) //getCourseWorks4
+        .then(res => {
+          // this.isLoading = false;
+          // this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
+          this.tableData = res.data[0];
+          if (!this.tableData.length){
+            this.loading = false;
+
+            return this.$message.info("课程下未有提交作业");
+          } 
+          this.courseName = this.tableData[0].course
+          this.circulatePdf();
+          // console.log(res.data[0]);
+        })
+        .catch(err => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    }
+  }
+};
+</script>
+
+<style scoped>
+.pbl {
+  width: 100%;
+  height: 100%;
+  box-sizing: border-box;
+  margin: auto;
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  padding: 20px;
+  padding-top: 10px;
+  overflow: auto;
+  border-radius: 10px;
+}
+.pageTit {
+  width: 100%;
+  text-align: left;
+  font-size: 28px;
+  padding: 10px 0;
+  font-weight: bold;
+  border-bottom: 1px solid #ccc;
+  margin-bottom: 10px;
+}
+.full_diy {
+  min-width: 1200px !important;
+}
+.full_diy >>> .el-dialog {
+  height: 80%;
+  margin-top: 10vh !important;
+  display: flex;
+  flex-direction: column;
+}
+.full_diy >>> .el-dialog__body {
+  overflow: auto;
+  flex: 1;
+  padding: 0 !important;
+}
+.full_diy >>> .el-dialog__title {
+  color: #fff !important;
+}
+.full_diy >>> .el-dialog__header {
+  padding: 9px 20px 10px;
+  background: #32455b !important;
+}
+.coverPage {
+  min-height: 743px;
+  background-color: #ccc;
+  position: relative;
+  background-image: url("../../../assets/icon/exportPdfworks/bcg1.svg"), url("../../../assets/icon/exportPdfworks/bcg2.svg");
+  /* 设置每个背景的位置和尺寸,可以使用关键字或者具体的像素值,用逗号分隔 */
+  background-position: top left, bottom;
+  /* background-size: cover, cover; */
+  
+  /* 设置每个背景图片的重复方式,用逗号分隔 */
+  background-repeat: no-repeat, no-repeat;
+}
+.coverPageLogo {
+  padding: 40px;
+  width: 100%;
+  display: flex;
+  justify-content: flex-end;
+  box-sizing: border-box;
+  margin-bottom: 30px;
+}
+.coverPageFrom {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  width: 70%;
+  margin: 0 auto;
+}
+.coverPageFromTit {
+  font-size: 48px;
+  color: rgba(58, 59, 152, 1);
+  font-weight: 600;
+  text-align: center;
+}
+.fromCss {
+  border: 1.5px dashed rgba(158, 208, 255, 1);
+  border-radius: 16px;
+  background-color: #fff;
+  padding: 24px 32px;
+  width: 300px;
+  color: rgba(35, 99, 205, 1);
+}
+.fromCss > div {
+  margin-bottom: 20px;
+  display: flex;
+}
+.fromCss > div > span {
+  flex-shrink: 0;
+  margin-right: 5px;
+  font-size: 16px;
+}
+.fromCss > div:last-child {
+  margin-bottom: 0;
+}
+.txt {
+  width: 100%;
+  border-bottom: 1px solid rgba(192, 210, 229, 1);
+  text-align: center;
+  color: #000;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+.coverPageCon {
+  background-color: #e3edfe;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding: 0 30px;
+  box-sizing: border-box;
+}
+.stageCon {
+  background-color: #fff;
+  padding: 15px 10px;
+  box-sizing: border-box;
+  margin-bottom: 10px;
+  border-radius: 8px;
+  width: 100%;
+}
+.toolTit {
+  background-color: rgba(243, 247, 253, 1);
+  color: rgba(54, 115, 232, 1);
+  font-size: 12px;
+  padding: 3px 5px;
+  border-radius: 4px;
+  box-sizing: border-box;
+  width: 65px;
+  text-align: center;
+  margin: 5px 0;
+}
+.taskTitInd {
+  background-color: rgba(54, 129, 252, 1);
+  color: #fff;
+  padding: 3px 5px;
+  border-radius: 4px;
+  margin-right: 3px;
+  box-sizing: border-box;
+  font-size: 12px;
+}
+.a_addBox {
+  margin: 10px 0;
+  background: #fff;
+  padding: 0 15px;
+  /* max-height: 400px; */
+  /* max-height: 160px; */
+  /* overflow: auto; */
+}
+.redioStyle >>> .el-radio__label {
+  font-size: 18px;
+}
+
+.redioStyle5 >>> .el-radio__label {
+  font-size: 14px;
+  color: #06a7ff !important;
+}
+.redioStyle2 >>> .el-radio__label {
+  font-size: 14px;
+}
+
+.redioStyle3 >>> .el-checkbox__label {
+  font-size: 14px;
+  color: #06a7ff !important;
+}
+.redioStyle4 >>> .el-checkbox__label {
+  font-size: 14px;
+}
+.WorksCon >>> .el-checkbox-group {
+  margin: 0 5px;
+}
+.sortTool {
+  padding: 1px 3px;
+  border: 2px #5d89c4 solid;
+  margin: 0 5px;
+  min-width: 20px;
+  border-radius: 5px;
+  text-align: center;
+}
+/* table 样式 */
+.cont >>> table {
+  border-top: 1px solid #ccc;
+  border-left: 1px solid #ccc;
+}
+
+.cont >>> table td,
+.cont >>> table th {
+  border-bottom: 1px solid #ccc;
+  border-right: 1px solid #ccc;
+  padding: 15px 5px;
+  max-width: 0px;
+}
+
+.cont >>> table th {
+  border-bottom: 2px solid #ccc;
+  text-align: center;
+}
+.taskSco {
+  background-color: rgba(243, 247, 253, 1);
+  border-radius: 8px;
+  padding: 8px;
+  box-sizing: border-box;
+  margin: 8px 0;
+}
+.score_boxTit > span {
+  border-left: 3px solid rgba(54, 129, 252, 1);
+  padding-left: 5px;
+}
+.score_boxTit {
+  /* padding: 0 30px; */
+  box-sizing: border-box;
+  font-size: 14px;
+  font-weight: 600;
+  color: rgba(0, 0, 0, 0.9);
+}
+.inImg {
+  width: 100px;
+}
+.inImg > img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+.radioBox {
+  display: flex;
+  flex-direction: column;
+}
+.WorksCon >>> .el-radio {
+  display: flex;
+  align-items: center;
+  margin: 5px;
+}
+.WorksCon >>> .el-checkbox {
+  display: flex;
+  align-items: center;
+  margin: 5px;
+}
+.RootImgBlock {
+  width: 50%;
+  white-space: nowrap;
+  overflow: hidden;
+  font-size: 12px;
+  text-overflow: ellipsis;
+}
+.score_box {
+  display: flex;
+  align-items: center;
+  font-size: 14px !important;
+  /* justify-content: flex-start; */
+  justify-content: space-between;
+  margin-bottom: 15px;
+  /* margin: 10px 0 0 30px; */
+  margin: 10px 0;
+  position: relative;
+}
+.score_box:last-child {
+  margin-bottom: 0;
+}
+.worksTarget {
+  border-left: 3px solid rgba(54, 129, 252, 1);
+  font-size: 14px;
+  font-weight: 600;
+  color: rgba(0, 0, 0, 0.9);
+}
+.worksTarget > span {
+  margin-left: 5px;
+}
+.worksTargetCon {
+  background-color: #fff;
+  padding: 10px;
+  margin-top: 10px;
+  border-radius: 8px;
+  box-sizing: border-box;
+  font-size: 12px;
+}
+.worksTargetCon > div {
+  margin-bottom: 10px;
+}
+.worksTargetCon > div:last-child {
+  margin: 0 !important;
+}
+.dialog_diy >>> .el-dialog__header {
+  padding: 9px 20px 10px;
+  background: #32455b !important;
+}
+.worksDialogCSS >>> .el-dialog__header {
+  /* padding: 9px 20px 10px; */
+  background: #32455b !important;
+}
+
+.worksDialogCSS >>> .el-dialog__body {
+  width: 643px !important;
+}
+.worksDialogCSS >>> .el-dialog {
+  width: 683px !important;
+}
+</style>

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

@@ -4389,7 +4389,9 @@ export default {
 .max_diy >>> .el-dialog__body {
   height: 800px;
 }
-
+.dialog_diy2 {
+  overflow: hidden;
+}
 .dialog_diy2 >>> .el-dialog__header {
   padding: 9px 20px 10px;
   background: #32455b !important;

+ 19 - 1
src/components/pages/components/workData.vue

@@ -172,6 +172,9 @@
             <div class="JsonTit">
               <div style="width:94%;margin: 0 auto;font-size: 26px;">{{ dataJson.title }}</div>
               <div class="JsonTitBtn" v-if="dialogVisible">
+                <el-button @click="exportWorkPdf" type="primary" size="small"
+                  >一键导出</el-button
+                >
                 <el-button @click="exportData" type="primary" size="small"
                   >自定义导出</el-button
                 >
@@ -194,7 +197,7 @@
               </div>
             </div>
             <!-- <div style="width:94%;margin: 0 auto;font-size: 26px;">{{ dataJson.title }}</div> -->
-            <WorksDetail2 :DState="dataJson.state" :cid="cid" :uid="uid" :ooid="ooid"></WorksDetail2>
+            <WorksDetail2 ref="WorksDetail2Ref" :DState="dataJson.state" :cid="cid" :uid="uid" :ooid="ooid"></WorksDetail2>
             <!-- <el-table
               ref="table"
               :data="tableData"
@@ -578,6 +581,21 @@ export default {
     retPage(){
       console.log('666');
       this.$emit('cancel');
+    },
+    exportWorkPdf(){
+      this.$confirm("是否导出全部学生作业?批量打印需要等待一会哦。", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+      .then(() => {
+        this.$refs.WorksDetail2Ref.exportPdfSetAllWork()
+      })
+      .catch(() => {
+        return;
+      });
+
+
     },
     exportData(){
       this.$emit("update:dialogVisibleBao", true);

Datei-Diff unterdrückt, da er zu groß ist
+ 129 - 950
src/components/pages/components/worksDetail2.vue


+ 17 - 15
src/components/pages/pocAiClassroom/chatArea2.vue

@@ -1,39 +1,41 @@
 <template>
   <div class="chatArea">
-		<iframe ref="iframeRef" class="ca_iframe" allow="camera *; microphone *;display-capture;midi;encrypted-media;" :src="src"></iframe>
+    <iframe
+      ref="iframeRef"
+      class="ca_iframe"
+      allow="camera *; microphone *;display-capture;midi;encrypted-media;"
+      :src="src"
+    ></iframe>
   </div>
 </template>
 
 <script>
-
 export default {
-
   data() {
     return {
       userId: this.$route.query.userid,
       org: this.$route.query.org,
       oid: this.$route.query.oid,
-			src:"https://beta.cloud.cocorobo.cn/aigpt/#/js?active_role=0"
+      type: this.$route.query.type,
+      src: "https://beta.cloud.cocorobo.cn/aigpt/#/js?active_role=0"
     };
   },
-  methods: {
-
-  },
+  methods: {},
   mounted() {
-    
+   
   }
 };
 </script>
 
 <style scoped>
-.chatArea{
-	width: 100vw;
-	height: 100vh;
-	overflow: hidden;
+.chatArea {
+  width: 100vw;
+  height: 100vh;
+  overflow: hidden;
 }
 
-.ca_iframe{
-	width: 100%;
-	height: 100%;
+.ca_iframe {
+  width: 100%;
+  height: 100%;
 }
 </style>

+ 361 - 0
src/components/pages/pocAiClassroom/component/changeChapterDialog.vue

@@ -0,0 +1,361 @@
+<template>
+  <div>
+    <el-dialog
+      :center="true"
+      :visible.sync="show"
+      :close-on-click-modal="true"
+      width="600px"
+      class="settingsDialog"
+    >
+      <!-- <div v-if="showDialog == true" class="a-dialog" v-el-drag-dialog> -->
+      <div class="sd_top">
+        <div class="sd_t_topTit">切换章节</div>
+        <div class="sd_t_right">
+          <span @click.stop="close()">×</span>
+        </div>
+      </div>
+      <div class="sd_box">
+        <div class="sd_b_list">
+          <div
+            class="sd_b_l_item"
+            v-for="(item, index) in classList"
+            :key="index"
+          >
+            <div class="sd_b_i_title" @click.stop="item.open = !item.open">
+              <svg
+                width="16"
+                height="16"
+                viewBox="0 0 16 16"
+								:style="item.open?'transform:rotate(0deg)':'transform:rotate(-90deg)'"
+                fill="none"
+                xmlns="http://www.w3.org/2000/svg"
+              >
+                <path
+                  d="M3.54004 6.45977L4.45928 5.54053L7.99966 9.08091L11.54 5.54053L12.4593 6.45977L7.99966 10.9194L3.54004 6.45977Z"
+                  fill="black"
+                  fill-opacity="0.4"
+                />
+              </svg>
+              <span>{{ item.title }}</span>
+            </div>
+						<div class="sd_b_i_list" v-if="item.open">
+							<div :class="['sd_b_i_l_item',type==`${index}-${index2}`?'sd_b_i_listActive':'']" v-for="(item2,index2) in item.allClass" :key="index+'-'+index2" @click.stop="changeChapter(`${index}-${index2}`)">
+								<span>第{{ index2+1 }}节</span><span>{{ item2.title }}</span>
+							</div>
+						</div>
+          </div>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {},
+  data() {
+    return {
+      show: false,
+      classList: [
+        {
+          title: "第一章:科學入門",
+					open:true,
+          allClass: [
+            {
+              title: "學習科學",
+              type: 0,
+              isComplete: true,
+              subject: 4,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8741724834676182.png"
+            },
+            {
+              title: "科學的實踐",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8731724834767532.png"
+            },
+            {
+              title: "實驗室安全",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8721724834685472.png"
+            },
+            {
+              title: "實驗室儀器及基本實驗技巧",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8751724834771676.png"
+            },
+            {
+              title: "綜合練習",
+              type: 1,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8711724834666052.png"
+            }
+          ]
+        },
+        {
+          title: "第二章:水",
+					open:true,
+          allClass: [
+            {
+              title: "水的物熊變化",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8761724834777931.png"
+            },
+            {
+              title: "水循環",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8771724834845597.png"
+            },
+            {
+              title: "溶解",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8781724834847977.png"
+            },
+            {
+              title: "水的淨化",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8791724834873373.png"
+            },
+            {
+              title: "食水的進一步處理",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8761724834777931.png"
+            },
+            {
+              title: "節約用水和水污染",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8771724834845597.png"
+            },
+            {
+              title: "綜合練習",
+              type: 1,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8721724834685472.png"
+            }
+          ]
+        },
+        {
+          title: "第三章:观察生物",
+					open:true,
+          allClass: [
+            {
+              title: "生物",
+              type: 0,
+              isComplete: true,
+              subject: 4,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8741724834676182.png"
+            },
+            {
+              title: "生物的分類",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8731724834767532.png"
+            },
+            {
+              title: "檢索表",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8721724834685472.png"
+            },
+            {
+              title: "生物多樣性",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8751724834771676.png"
+            },
+            {
+              title: "綜合練習",
+              type: 1,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8711724834666052.png"
+            }
+          ]
+        }
+      ],
+			type:"",
+    };
+  },
+  methods: {
+    open(type='2-1') {
+      this.show = true;
+			this.type = type;
+    },
+    close() {
+      this.show = false;
+      this.init();
+    },
+    init() {
+      this.$nextTick(() => {});
+    },
+		changeChapter(index){
+			this.$emit("success",index)
+		},
+  }
+};
+</script>
+
+<style scoped>
+.settingsDialog >>> .el-dialog {
+  min-width: 600px;
+  max-width: 80%;
+  height: 600px;
+  max-height: 80%;
+  box-shadow: 0px 0 8px 0px #555555;
+  border-radius: 8px;
+  background-color: #fff;
+  /* top: 0px; */
+  /* margin: 0 auto; */
+  overflow: hidden;
+}
+.settingsDialog >>> .el-dialog__body {
+  height: 100%;
+  min-width: 500px;
+  flex-shrink: 0;
+  box-sizing: border-box;
+  padding-bottom: 50px;
+  padding-top: 10px;
+}
+.settingsDialog >>> .el-dialog__header {
+  display: none;
+}
+
+.sd_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;
+  font-size: 24px;
+  font-weight: bold;
+  color: black;
+  /* border-bottom: 1px #ccc solid; */
+}
+.sd_top >>> .el-input__icon {
+  line-height: 32px;
+}
+
+.sd_t_right {
+  cursor: pointer;
+}
+
+.sd_box {
+  width: 100%;
+  padding: 0 30px 20px 30px;
+  box-sizing: border-box;
+  height: calc(100% - 30px);
+}
+
+.sd_b_list {
+  width: 100%;
+  height: 100%;
+  overflow: auto;
+}
+
+.sd_b_l_item {
+  width: 100%;
+  height: auto;
+}
+
+.sd_b_i_title {
+  width: 100%;
+  height: 40px;
+  display: flex;
+  align-items: center;
+  font-size: 20px;
+	cursor: pointer;
+}
+
+.sd_b_i_title>svg{
+	width: 20px;
+	height: 20px;
+	margin-right: 10px;
+}
+
+
+.sd_b_i_title>span{
+	display: flex;
+	max-width: 80%;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+
+.sd_b_i_list{
+	width: 100%;
+	height: auto;
+}
+
+.sd_b_i_l_item{
+	width: 100%;
+	height: 40px;
+	border-radius: 4px;
+	background-color: #fff;
+	font-size: 18px;
+	display: flex;
+	align-items: center;
+	box-sizing: border-box;
+	padding-left: 30px;
+	margin: 5px 0;
+	cursor: pointer;
+}
+
+.sd_b_i_l_item>span{
+	margin-right: 10px;
+}
+
+.sd_b_i_l_item:hover{
+	background-color: #E0EAFB;
+	color: #3681FC;
+	
+}
+
+.sd_b_i_listActive{
+	background-color: #E0EAFB !important;
+	color: #3681FC !important;
+}
+
+</style>

+ 8 - 4
src/components/pages/pocAiClassroom/component/chapterCard.vue

@@ -38,7 +38,7 @@
           <span
             class="cc_b_i_ba_doWorks"
             v-if="[0, 1].includes(item.type)"
-            @click.stop="goWorks(item)"
+            @click.stop="goWorks(item,index)"
             >做练习</span
           >
         </div>
@@ -74,7 +74,11 @@ export default {
     subjectList: {
       type: Array,
       default: () => []
-    }
+    },
+		index:{
+			type:Number,
+			default:0
+		}
   },
   data() {
     return {
@@ -89,9 +93,9 @@ export default {
           `/pocClass?userid=${this.userId}&org=${this.org}&oid=${this.oid}`
         );
     },
-    goWorks(item) {
+    goWorks(item,index) {
       this.$router.push(
-        `/pocDoTask?userid=${this.userId}&org=${this.org}&oid=${this.oid}`
+        `/pocDoTask?userid=${this.userId}&org=${this.org}&oid=${this.oid}&type=${this.index}-${index}`
       );
     }
   }

+ 523 - 10
src/components/pages/pocAiClassroom/doTask.vue

@@ -67,6 +67,9 @@
                   : "[单选题]"
               }}</span
               >{{ taskList[showTaskIndex].teststitle }}
+							<div class="titleImage" v-if="taskList[showTaskIndex].imageUrl">
+								<img :src="taskList[showTaskIndex].imageUrl">
+							</div>
             </div>
             <div class="dt_m_b_l_t_choseList">
               <div
@@ -352,7 +355,12 @@
         </span>
 
 				<div class="dt_c_m_message">
-            这题选:<span>{{ taskList[showTaskIndex].answer }}</span>
+					<span v-text="seekAssistMessage"></span>
+					<!-- 这题选:<span>{{
+            typeof taskList[showTaskIndex].answer == 'object'
+              ? taskList[showTaskIndex].answer.map(i => choseList[i]).join('、')
+              : choseList[taskList[showTaskIndex].answer]
+          }}</span> -->
           </div>
           <div class="dt_c_m_btnArea">
 						<span class="dt_c_m_btn1" @click.stop="doNotKnow()">还是不太明白</span>
@@ -443,6 +451,10 @@
               }}{{ index + 1 }}.{{ item.teststitle }}</span
             >
 
+						<div class="titleImage" v-if="item.imageUrl">
+							<img :src="item.imageUrl">
+						</div>
+
             <div class="dt_is_tl_tb_i_choseList">
               <span
                 v-for="(item2, index2) in item.checkList"
@@ -501,11 +513,19 @@
         </div>
       </div>
     </div>
+		<changeChapterDialog ref="changeChapterDialogRef" @success="changeChapterSuccess"/>
+
+
   </div>
 </template>
 
 <script>
+import changeChapterDialog from './component/changeChapterDialog.vue';
+import { v4 as uuidv4 } from 'uuid'
 export default {
+	components:{
+		changeChapterDialog
+	},
   data() {
     return {
       showTaskIndex: 0,
@@ -703,14 +723,13 @@ export default {
         }
       ],
       taskMessage: {
-        chapter: "第一章",
-        grade: "中",
+        chapter: "",
+        grade: "中",
         semester: "上学期",
         edition: "人教版",
-        subject: "物理",
-        title: "第四课 测量平均速度"
+        subject: "科学",
+        title: ""
       },
-
       isSubmit: false,
       star: 4,
       onlyShowMistake: false,
@@ -763,7 +782,166 @@ export default {
           personality:
             "心思细腻,能够敏锐捕捉到别人的需求,喜欢支持和鼓励他人,富有耐心6"
         }
-      ]
+      ],
+			type:this.$route.query.type,
+			classList: [
+        {
+          title: "第一章:科學入門",
+					open:true,
+          allClass: [
+            {
+              title: "學習科學",
+              type: 0,
+              isComplete: true,
+              subject: 4,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8741724834676182.png"
+            },
+            {
+              title: "科學的實踐",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8731724834767532.png"
+            },
+            {
+              title: "實驗室安全",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8721724834685472.png"
+            },
+            {
+              title: "實驗室儀器及基本實驗技巧",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8751724834771676.png"
+            },
+            {
+              title: "綜合練習",
+              type: 1,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8711724834666052.png"
+            }
+          ]
+        },
+        {
+          title: "第二章:水",
+					open:true,
+          allClass: [
+            {
+              title: "水的物熊變化",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8761724834777931.png"
+            },
+            {
+              title: "水循環",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8771724834845597.png"
+            },
+            {
+              title: "溶解",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8781724834847977.png"
+            },
+            {
+              title: "水的淨化",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8791724834873373.png"
+            },
+            {
+              title: "食水的進一步處理",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8761724834777931.png"
+            },
+            {
+              title: "節約用水和水污染",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8771724834845597.png"
+            },
+            {
+              title: "綜合練習",
+              type: 1,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8721724834685472.png"
+            }
+          ]
+        },
+        {
+          title: "第三章:观察生物",
+					open:true,
+          allClass: [
+            {
+              title: "生物",
+              type: 0,
+              isComplete: true,
+              subject: 4,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8741724834676182.png"
+            },
+            {
+              title: "生物的分類",
+              type: 0,
+              subject: 4,
+              isComplete: true,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8731724834767532.png"
+            },
+            {
+              title: "檢索表",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8721724834685472.png"
+            },
+            {
+              title: "生物多樣性",
+              type: 0,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8751724834771676.png"
+            },
+            {
+              title: "綜合練習",
+              type: 1,
+              subject: 4,
+              isComplete: false,
+              image:
+                "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8711724834666052.png"
+            }
+          ]
+        }
+      ],
+			seekAssistLoading:false,
+			seekAssistMessage:"",
     };
   },
   computed: {
@@ -901,11 +1079,12 @@ export default {
     },
     // 切换章节
     changeChapter() {
-      console.log("切换章节");
+      this.$refs.changeChapterDialogRef.open(this.type);
     },
     //求助
     seekAssist() {
       this.showSeekAssist = true;
+			this.getSeekAssist()
     },
     keepTime() {
       if (this.timer !== null) {
@@ -1007,12 +1186,334 @@ export default {
       }
     },
 		doNotKnow(){
-			this.$message.info("多想想")
-		}
+			this.getSeekAssist();
+		},
+		changeChapterSuccess(index){
+			if(index=='1-0'){
+				// {
+        //   teststitle: '请从以下选项中选出一个由三个不同字母组成的组合。',
+        //   checkList: ['abc', 'aaa', 'bca', 'ccc'],
+        //   timuList: [],
+        //   answer: 0,
+        //   type: '1',
+        //   analyze:
+        //     '本题考核学生对字母的识别能力以及对字母组合的理解。学生需要识别每个选项中的字母,并判断是否由三个不同的字母组成。选项1(abc)和选项3(bca)都由三个不同的字母组成,但根据题目要求,选项1是正确答案。',
+        //   answer2: '',
+        //   uuid: '2b29f3aa-3389-4415-85aa-613f72e23de6',
+        //   isSubmit: false
+        // },
+				let task = [
+					{
+						teststitle:"當冰加熱到0°C時,它會發生什麼變化",
+						checkList:["沸騰","凝結","熔化","蒸發"],
+						answer:2,
+						type: '1',
+						analyze:"當冰加熱到0°C時,它會從固態轉變成液態,這個過程稱為熔化。",
+						answer2: '',
+					},
+					{
+						teststitle:"在自然界中,水能以哪種形式存在?",
+						checkList:["只有液態","只有固態","液態和氣態","三態均有"],
+						answer:3,
+						type: '1',
+						analyze:"水在自然界中可以以固態(冰)、液態(水)和氣態(水汽)三種狀態存在。",
+						answer2: '',
+					},{
+						teststitle:"易拉罐表面在夏天常出現水滴,這是由於水汽的什麼現象?",
+						checkList:["蒸發","熔化","沸騰","凝結"],
+						answer:3,
+						type: '1',
+						analyze:"水汽在接觸冷的易拉罐表面時凝結成液態水,這個過程稱為凝結。",
+						answer2: '',
+					},{
+						teststitle:"在夏天,玻璃杯外面的水滴形成是因為哪種水物態變化?",
+						checkList:["凝固","熔化","沸騰","凝結"],
+						answer:3,
+						type: '1',
+						analyze:"玻璃杯外的水滴是由空氣中的水汽經由凝結形成的。",
+						answer2: '',
+					},{
+						teststitle:"下列哪一項說法正確描述水的熱的物態變化?",
+						checkList:["水的凝結點比沸點高","水在0°C時開始凝固或熔化","水只能通過沸騰轉化為氣態","水在自然界只存在於其中一種狀態"],
+						answer:1,
+						type: '1',
+						analyze:"水在0°C時,可以開始從固態冰凝固成液態水,或者從液態水熔化成固態冰。",
+						answer2: '',
+					},{
+						teststitle:"下列哪項關於物熊變化的敘述是不正確的?",
+						checkList:["凝結會於沸點或以下的温度發生","蒸發過程中不会吸收或釋出能量。","凝固是物質由液熊轉變成固熊的過程","D.固體熔化時的温度保持不變。"],
+						answer:1,
+						type: '1',
+						analyze:"選項B蒸發是液體變成氣體的過程,這個過程需要吸收能量,稱為蒸發熱。因此,蒸發是一個吸熱過程。",
+						answer2: '',
+					},{
+						teststitle:"如圖所示,盛了水的鍋正在爐上加熱。在鍋中和在鍋蓋內壁的水正在發生甚麼物熊變化?",
+						imageUrl:"https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/image%20%281%291725689946082.png",
+						checkList:["鍋中:熔化,鍋蓋內璧:沸騰","鍋中:蒸發,鍋蓋內璧:凝固","鍋中:沸騰,鍋蓋內璧:凝結","鍋中:凝結,鍋蓋內璧:蒸發"],
+						answer:2,
+						type: '1',
+						analyze:"鍋中:沸騰。當鍋中的水被加熱到一定的溫度,即水的沸點時,水分子獲得足夠的能量克服相互之間的吸引力,開始從液態轉變為氣態,形成氣泡並上升到水面,然後氣泡破裂,釋放出水蒸氣。這個過程稱為沸騰,是液體變成氣體的相變過程。鍋蓋內璧:凝結。鍋蓋內璧的溫度通常低於鍋中水的溫度,因此當鍋中產生的水蒸氣遇到較冷的鍋蓋內璧時,水蒸氣分子會失去能量,相互之間的吸引力增強,導致它們重新聚集在一起形成液態水。這個過程稱為凝結,是氣體變成液體的相變過程。",
+						answer2: '',
+					},{
+						teststitle:"下列哪項正確顯示冰變成水時的水粒子變化?",
+						imageUrl:"https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/image%20%282%291725690023281.png",
+						checkList:["A","B","C","D"],
+						answer:0,
+						type: '1',
+						analyze:"冰變成水時,水分子間的距離增大,分子運動加快。",
+						answer2: '',
+					},{
+						teststitle:"當水冷卻到0°C時,它會發生什麼變化?",
+						checkList:["熔化","凝固","沸騰","蒸發"],
+						answer:1,
+						type: '1',
+						analyze:"當水冷卻到0°C時,它會從液態轉變成固態,這個過程稱為凝固。",
+						answer2: '',
+					},{
+						teststitle:"水蒸發需要具備哪些條件?",
+						checkList:["高於100°C的溫度","僅能在沸點發生","低於沸點的任何溫度","僅能在冰點發生"],
+						answer:2,
+						type: '1',
+						analyze:"水蒸發可以在低於沸點的任何溫度發生,並不需要達到沸點。",
+						answer2: '',
+					}
+				]
+				this.taskList = task;
+			}else if(index=='1-1'){
+				let task = [
+					{
+						teststitle:`在下列哪個(些)情况下,濕衣服會乾得很慢?
+(1)把衣服摺起來
+(2)空氣濕度低
+(3)把衣服晾在陽光下
+`,
+						checkList:["只有 (1)","只有 (1)和 (2)","只有 (1) 和 (3)","只有 (2) 和 (3)"],
+						answer:0,
+						type: '1',
+						analyze:"當衣服被折疊起來時,水分蒸發的表面積減少,因為衣服內部的水分不容易接觸到流通的空氣,這會減慢幹燥過程。,水分蒸发的表面积减少,因为衣服内部的水分不容易接触到流通的空气,这会减慢干燥过程。",
+						answer2: '',
+					},
+					{
+						teststitle:"下列各容器盛有相同分量的水。把它們置在陽光下幾小時後,哪個容器會剩下最少水?",
+						imageUrl:"https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/image%20%283%291725690506088.png",
+						checkList:["A","B","C","D"],
+						answer:2,
+						type: '1',
+						analyze:"表面積越大,水分接觸空氣的面積越多,蒸發得越快。",
+						answer2: '',
+					},{
+						teststitle:`一把濕雨傘收起後掛在窗邊。下列哪個(些)方法能使目4濕傘快些乾透?
+(1)把雨傘放在陽光下。
+(2)開動風扇,再把雨傘放在風扇前方
+(3)完全打開傘。
+`,
+						checkList:["只有 (1)","只有 (2)和 (3)","只有(1)和(2)","全部(1)(2)和(3)"],
+						answer:3,
+						type: '1',
+						analyze:"(1)將雨傘放在陽光直射的地方,可以利用太陽的熱量來提高雨傘的溫度,這是加快水分蒸發的一個有效方法。(2)使用風扇或其他形式的人工通風可以增加空氣中的對流,幫助將潮濕的空氣帶走,並帶來更幹燥的空氣,這同樣有助於加速雨傘的幹燥。(3)雨傘完全打開時,增加了與空氣接觸的表面積,這意味著有更多的水分可以同時蒸發,從而加快了整體的幹燥過程。",
+						answer2: '',
+					},{
+						teststitle:"下列哪項關於大自然中水的敘述是正確的 ?",
+						checkList:["地球上的水因蒸發不斷流失。","地球上的水因凝結不斷增加。","海洋中水由液熊水轉變成水汽。","高空的水滴不會返回地面。"],
+						answer:2,
+						type: '1',
+						analyze:"A 雖然地球上的水會通過蒸發變成水蒸氣進入大氣中,但這個過程是水循環的一部分,水蒸氣最終會通過凝結成雲,再以雨、雪等形式返回地面,補充到地球上的水源中。B 凝結是水循環中的一個環節,這個過程並不會導致地球上總水量的增加,因為水循環是一個動態平衡的系統。D高空中的水滴可以通過多種方式返回地面,最常見的是水滴凝結成雲,然後以雨、雪、冰雹等形式降落到地面。",
+						answer2: '',
+					},{
+						teststitle:"以下哪個現象不屬於水循環的一部分?",
+						checkList:["蒸發","火山爆發","降水","凝結"],
+						answer:1,
+						type: '1',
+						analyze:"水循環涉及蒸發、凝結、運輸和降水等過程,而火山爆發不是水循環的一部分。",
+						answer2: '',
+					},{
+						teststitle:"以下哪種因素不直接影響水的蒸發速率?",
+						checkList:["溫度","空氣流動","衣服的顏色","表面積"],
+						answer:2,
+						type: '1',
+						analyze:"水的蒸發速率主要受溫度、空氣流動和表面積的影響,衣服的顏色不直接影響水的蒸發。",
+						answer2: '',
+					},{
+						teststitle:"在水循環中,海洋的主要作用是什麼?",
+						// imageUrl:"https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/image%20%281%291725689946082.png",
+						checkList:["提供空氣濕度","儲存地球上大部分水量","為陸地提供地下水","提供生態系統"],
+						answer:1,
+						type: '1',
+						analyze:"海洋覆蓋地球表面的約 70%,儲存了地球總水量的 97%,是水循環的主要儲水地。",
+						answer2: '',
+					},{
+						teststitle:"下列關於水循環的敘述,哪一項是不正確的?",
+						checkList:["降水可以是雨、雪、或冰雹","水循環是由人類活動主導的","降水主要發生在海洋","凝結形成雲"],
+						answer:1,
+						type: '1',
+						analyze:"水循環是自然過程,主要受到太陽能量驅動,而非人類活動。",
+						answer2: '',
+					},{
+						teststitle:"為什麼高空的水滴容易凝結?",
+						checkList:["因為空氣中的二氧化碳含量高","因為高空的溫度較低","因為水的密度變大","因為地心引力的作用"],
+						answer:1,
+						type: '1',
+						analyze:"高空的溫度較低,這樣水汽容易凝結成小水滴。",
+						answer2: '',
+					},{
+						teststitle:"以下哪項活動會加快水的蒸發速率?",
+						checkList:["將盛水的容器蓋住","將水置於陰暗角落","將水置於陽光直射下","增加室內濕度"],
+						answer:2,
+						type: '1',
+						analyze:"在陽光直射下,水分子吸收更多的能量,蒸發速率會增加。",
+						answer2: '',
+					}
+				]
+				this.taskList = task;
+			}else{
+				let task = [
+					{
+						teststitle:"當冰加熱到0°C時,它會發生什麼變化",
+						checkList:["沸騰","凝結","熔化","蒸發"],
+						answer:2,
+						type: '1',
+						analyze:"當冰加熱到0°C時,它會從固態轉變成液態,這個過程稱為熔化。",
+						answer2: '',
+					},
+					{
+						teststitle:"在自然界中,水能以哪種形式存在?",
+						checkList:["只有液態","只有固態","液態和氣態","三態均有"],
+						answer:3,
+						type: '1',
+						analyze:"水在自然界中可以以固態(冰)、液態(水)和氣態(水汽)三種狀態存在。",
+						answer2: '',
+					},{
+						teststitle:"易拉罐表面在夏天常出現水滴,這是由於水汽的什麼現象?",
+						checkList:["蒸發","熔化","沸騰","凝結"],
+						answer:3,
+						type: '1',
+						analyze:"水汽在接觸冷的易拉罐表面時凝結成液態水,這個過程稱為凝結。",
+						answer2: '',
+					},{
+						teststitle:"在夏天,玻璃杯外面的水滴形成是因為哪種水物態變化?",
+						checkList:["凝固","熔化","沸騰","凝結"],
+						answer:3,
+						type: '1',
+						analyze:"玻璃杯外的水滴是由空氣中的水汽經由凝結形成的。",
+						answer2: '',
+					},{
+						teststitle:"下列哪一項說法正確描述水的熱的物態變化?",
+						checkList:["水的凝結點比沸點高","水在0°C時開始凝固或熔化","水只能通過沸騰轉化為氣態","水在自然界只存在於其中一種狀態"],
+						answer:1,
+						type: '1',
+						analyze:"水在0°C時,可以開始從固態冰凝固成液態水,或者從液態水熔化成固態冰。",
+						answer2: '',
+					},{
+						teststitle:"下列哪項關於物熊變化的敘述是不正確的?",
+						checkList:["凝結會於沸點或以下的温度發生","蒸發過程中不会吸收或釋出能量。","凝固是物質由液熊轉變成固熊的過程","D.固體熔化時的温度保持不變。"],
+						answer:1,
+						type: '1',
+						analyze:"選項B蒸發是液體變成氣體的過程,這個過程需要吸收能量,稱為蒸發熱。因此,蒸發是一個吸熱過程。",
+						answer2: '',
+					},{
+						teststitle:"如圖所示,盛了水的鍋正在爐上加熱。在鍋中和在鍋蓋內壁的水正在發生甚麼物熊變化?",
+						imageUrl:"https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/image%20%281%291725689946082.png",
+						checkList:["鍋中:熔化,鍋蓋內璧:沸騰","鍋中:蒸發,鍋蓋內璧:凝固","鍋中:沸騰,鍋蓋內璧:凝結","鍋中:凝結,鍋蓋內璧:蒸發"],
+						answer:2,
+						type: '1',
+						analyze:"鍋中:沸騰。當鍋中的水被加熱到一定的溫度,即水的沸點時,水分子獲得足夠的能量克服相互之間的吸引力,開始從液態轉變為氣態,形成氣泡並上升到水面,然後氣泡破裂,釋放出水蒸氣。這個過程稱為沸騰,是液體變成氣體的相變過程。鍋蓋內璧:凝結。鍋蓋內璧的溫度通常低於鍋中水的溫度,因此當鍋中產生的水蒸氣遇到較冷的鍋蓋內璧時,水蒸氣分子會失去能量,相互之間的吸引力增強,導致它們重新聚集在一起形成液態水。這個過程稱為凝結,是氣體變成液體的相變過程。",
+						answer2: '',
+					},{
+						teststitle:"下列哪項正確顯示冰變成水時的水粒子變化?",
+						imageUrl:"https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/image%20%282%291725690023281.png",
+						checkList:["A","B","C","D"],
+						answer:0,
+						type: '1',
+						analyze:"冰變成水時,水分子間的距離增大,分子運動加快。",
+						answer2: '',
+					},{
+						teststitle:"當水冷卻到0°C時,它會發生什麼變化?",
+						checkList:["熔化","凝固","沸騰","蒸發"],
+						answer:1,
+						type: '1',
+						analyze:"當水冷卻到0°C時,它會從液態轉變成固態,這個過程稱為凝固。",
+						answer2: '',
+					},{
+						teststitle:"水蒸發需要具備哪些條件?",
+						checkList:["高於100°C的溫度","僅能在沸點發生","低於沸點的任何溫度","僅能在冰點發生"],
+						answer:2,
+						type: '1',
+						analyze:"水蒸發可以在低於沸點的任何溫度發生,並不需要達到沸點。",
+						answer2: '',
+					}
+				]
+				this.taskList = task;
+			}
+			this.showTaskIndex = 0;
+			this.time = 0;
+			this.time2 = 0;
+			this.startTime = new Date().getTime();
+			this.type = index;
+			this.taskMessage.chapter = this.classList[parseInt(index.split('-')[0])].title;
+			this.taskMessage.title = `第${parseInt(index.split('-')[1])+1}节 ${this.classList[parseInt(index.split('-')[0])].allClass[parseInt(index.split('-')[1])].title}`;
+			this.$refs.changeChapterDialogRef.close();
+		},
+		getSeekAssist() {
+			if(this.seekAssistLoading)return;
+      return new Promise(resolve => {
+        this.seekAssistLoading = true
+				this.seekAssistMessage = "我想想哦...";
+        let task = this.taskList[this.showTaskIndex]
+        let taskMsg = `${typeof task.answer == 'object' ? '【多选题】' : '【单选题】'}${task.teststitle}
+${task.checkList.map((i, index) => this.choseList[index] + '.' + i).join('\n')}
+正确答案:${
+          typeof task.answer == 'object'
+            ? task.answer.map(i => this.choseList[i]).join('、')
+            : this.choseList[task.answer]
+        }
+解析:${task.analyze}
+`
+
+        let _msg = `Language: Please use the same language as the user requirement, if the user speaks Traditional Chinese, the specific text of your answer should also be in Traditional Chinese.
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
+Instruction: Based on the context, follow "Format example", write content
+
+#Context
+這是一道題目相關的資料,你面向的是一位中學一年級的學生。現在學生求解這道題遇到了困難。請你扮演一位香港中學科學老師,請你使用1-3句完整的話,結合該題目考核的具體選項,從側面對題目選項進行暗示,務必不要直接給出答案。請堅持使用繁體中文,並使用香港人習慣使用的表達方式,請使用偏口語的方式表達,適當給予學生鼓勵。
+##題目內容:
+${taskMsg}
+
+#Format example
+(只需要输出一句话即可,不需要输出其他内容,不要输出Object)
+`
+
+        let params = {
+          assistant_id: '6063369f-289a-11ef-8bf4-12e77c4cb76b',
+          userId: this.userId,
+          message: [{ type: 'text', text: _msg }],
+          session_name: uuidv4(),
+          // uid: _uuid,
+          file_ids: [],
+          model: 'gpt-4o-2024-08-06'
+        }
+
+        this.ajax.post("https://gpt4.cocorobo.cn/ai_agent_park_chat", params).then(res => {
+          let _result = res.data.FunctionResponse.message;
+					if(_result){
+						this.seekAssistMessage = _result;
+						this.seekAssistLoading = false;
+					}else{
+						console.log(_result);
+					this.$message.error("获取失败,请重试");
+					this.showSeekAssist = false;
+					}
+        }).catch(e=>{
+					console.log(e);
+					this.$message.error("获取失败,请重试");
+					this.showSeekAssist = false;
+				})
+      })
+    }
   },
   mounted() {
     this.keepTime();
     this.sortTaskList();
+		this.changeChapterSuccess(this.type)
   }
 };
 </script>
@@ -1877,6 +2378,8 @@ export default {
   max-width: 100%;
   font-size: 24px;
   padding: 10px 30px;
+	max-height: 48%;
+	overflow: auto;
 }
 
 .dt_c_m_message > span {
@@ -1914,4 +2417,14 @@ export default {
 	color: #fff;
 	padding: 12px 40px !important;
 }
+
+.titleImage{
+	width: 100%;
+	height: auto;
+}
+
+.titleImage>img{
+	max-width: 80%;
+	max-height: 400px;
+}
 </style>

+ 37 - 34
src/components/pages/pocAiClassroom/index.vue

@@ -136,11 +136,12 @@
       >
     </div> -->
 
-    <div class="pac_box">
+    <div class="pac_box" v-if="subject==='' || subject===4">
       <chapterCard
         v-for="(item, index) in classList"
         :key="index"
         :data="item"
+				:index="index"
         :subjectList="subjectList"
       />
     </div>
@@ -176,7 +177,7 @@
           <div class="pac_fd_b_r_message">
             Hi,{{
               userInfo.userName
-            }}同学,欢迎回来!你是否开始下一节课的学习,学习<span>【运动的快慢】</span>?
+            }}同学,欢迎回来!你是否开始下一节课的学习,学习<span>【水循环】</span>?
           </div>
           <div class="pac_fd_b_r_btnArea">
             <span class="pac_fd_b_r_ba_btn1" @click.stop="dialogBtn(3)"
@@ -230,14 +231,15 @@ export default {
       userId: this.$route.query.userid,
       org: this.$route.query.org,
       oid: this.$route.query.oid,
-      subject: "",
-      edition: "",
+      subject: 4,
+      edition: 0,
       searchValue: "",
       grade: 7,
+	
       showDialog: true,
       userInfo: {
         userName: "科科",
-				grade:7,
+				grade:6,
 				userAvatar:"",
         choseCharacter: 0,
       },
@@ -323,16 +325,17 @@ export default {
       //   { value: 8, label: "政治" }
       // ],
       editionList: [
-        { value: 0, label: "人教版" },
-        { value: 1, label: "教科版" },
-        { value: 2, label: "北师大版" },
-        { value: 3, label: "苏教版" },
-        { value: 4, label: "沪教版" },
-        { value: 5, label: "浙教版" },
-        { value: 6, label: "冀教版" },
-        { value: 7, label: "鲁教版" },
-        { value: 8, label: "人教A版" },
-        { value: 9, label: "人教B版" }
+				{ value: 0, label: "牛津大學" },
+        // { value: 0, label: "人教版" },
+        // { value: 1, label: "教科版" },
+        // { value: 2, label: "北师大版" },
+        // { value: 3, label: "苏教版" },
+        // { value: 4, label: "沪教版" },
+        // { value: 5, label: "浙教版" },
+        // { value: 6, label: "冀教版" },
+        // { value: 7, label: "鲁教版" },
+        // { value: 8, label: "人教A版" },
+        // { value: 9, label: "人教B版" }
       ],
       classList: [
         {
@@ -342,34 +345,34 @@ export default {
               title: '學習科學',
               type: 0,
               isComplete: true,
-              subject: 0,
+              subject: 4,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8741724834676182.png'
             },
             {
               title: '科學的實踐',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: true,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8731724834767532.png'
             },
             {
               title: '實驗室安全',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: false,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8721724834685472.png'
             },
             {
               title: '實驗室儀器及基本實驗技巧',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: false,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8751724834771676.png'
             },
             {
               title: '綜合練習',
               type: 1,
-              subject: 0,
+              subject: 4,
               isComplete: false,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8711724834666052.png'
             }
@@ -381,49 +384,49 @@ export default {
             {
               title: '水的物熊變化',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: true,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8761724834777931.png'
             },
             {
               title: '水循環',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: true,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8771724834845597.png'
             },
             {
               title: '溶解',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: true,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8781724834847977.png'
             },
             {
               title: '水的淨化',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: true,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8791724834873373.png'
             },
             {
               title: '食水的進一步處理',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: false,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8761724834777931.png'
             },
             {
               title: '節約用水和水污染',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: false,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8771724834845597.png'
             },
             {
               title: '綜合練習',
               type: 1,
-              subject: 0,
+              subject: 4,
               isComplete: false,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8721724834685472.png'
             },
@@ -436,34 +439,34 @@ export default {
               title: '生物',
               type: 0,
               isComplete: true,
-              subject: 0,
+              subject: 4,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8741724834676182.png'
             },
             {
               title: '生物的分類',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: true,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8731724834767532.png'
             },
             {
               title: '檢索表',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: false,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8721724834685472.png'
             },
             {
               title: '生物多樣性',
               type: 0,
-              subject: 0,
+              subject: 4,
               isComplete: false,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8751724834771676.png'
             },
             {
               title: '綜合練習',
               type: 1,
-              subject: 0,
+              subject: 4,
               isComplete: false,
               image: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/%E5%9B%BE%E7%89%8711724834666052.png'
             }
@@ -489,12 +492,12 @@ export default {
         this.showDialog = false;
       } else if (type == 1) {
         this.$router.push(
-          `/pocClass?userid=${this.userId}&org=${this.org}&oid=${this.oid}`
+          `/pocClass?userid=${this.userId}&org=${this.org}&oid=${this.oid}&type=1`
         );
         // console.log("开始学习新的内容");
       } else if (type == 2) {
         this.$router.push(
-          `/pocClass?userid=${this.userId}&org=${this.org}&oid=${this.oid}`
+          `/pocClass?userid=${this.userId}&org=${this.org}&oid=${this.oid}&type=2`
         );
         // console.log("复习上一节课");
       } else if (type == 3) {

+ 8 - 1
src/components/pages/pocAiClassroom/pocClass.vue

@@ -13,6 +13,7 @@ export default {
       userId: this.$route.query.userid,
       org: this.$route.query.org,
       oid: this.$route.query.oid,
+			type:this.$route.query.type,
 			src:"https://beta.cloud.cocorobo.cn/aigpt/#/js?active_role=3"
     };
   },
@@ -20,7 +21,13 @@ export default {
 
   },
   mounted() {
-    
+		if (this.type == 1) {
+      this.src = `https://beta.cloud.cocorobo.cn/aigpt/#/js?active_role=${5}`;
+			console.log("5")
+    } else if (this.type == 2) {
+      this.src = `https://beta.cloud.cocorobo.cn/aigpt/#/js?active_role=${3}`;
+			console.log(3)
+    }
   }
 };
 </script>

+ 1 - 60
src/components/pages/pocAiClassroom/startIndex.vue

@@ -1,18 +1,6 @@
 <template>
 	<div class="startIndex">
-		<div class="si_start">
-			<div class="si_s_heardImage"></div>
-			<div class="si_s_messageArea">
-				<span>Hi~同学!😆</span>
-				<span>我是智能学伴,是陪你学习和聊天的小伙伴!😎</span>
-				<span>有什么问题,你都可以随时召唤我🫡</span>
-				<span>请你先帮我取一个名字吧😜</span>
-			</div>
-			<div class="si_s_inputArea">
-				<div class="si_s_inputLeft"></div>
-				<span></span>
-			</div>
-		</div>
+
 	</div>
 </template>
 
@@ -41,51 +29,4 @@
 	justify-content: center;
 }
 
-.si_start{
-	width: auto;
-	height: auto;
-	display: flex;
-	flex-direction: column;
-	align-items: center;
-	justify-content: center;
-}
-
-.si_s_messageArea{
-	display: flex;
-	flex-direction: column;
-	padding: 30px;
-	background-color: #fff;
-	border-radius: 10px;
-	border: solid 2px black;
-}
-
-.si_s_messageArea>span{
-	color:#6F93F0;
-	font-size: 20px;
-}
-
-.si_s_inputArea{
-	margin-top: 20px;
-	width: 250px;
-	height: 50px;
-	background-color: #fff;
-	border: solid 2px black;
-	border-radius: 0 10px 10px 10px;
-}
-.si_s_inputLeft{
-	width: 200px;
-	height: 50px;
-	display: flex;
-	justify-content: center;
-	align-items: center;
-}
-
-.si_s_inputArea>span{
-	width: 50px;
-	height: 50px;
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	background-color: gray;
-}
 </style>

+ 16 - 5
src/components/pages/studentManage/student.vue

@@ -716,19 +716,25 @@ export default {
             arr.push(obj);
           });
           console.log(arr);
+          if(arr.length > 70){
+            _this.$message.error("限制上传学生数量不能超过70个");
+            _this.fileListUpload = [];
+            loading.close();
+            return;
+          }
           let _b = 1;
           for (var i = 0; i < arr.length; i++) {
             let item = arr[i];
             if (item.class === "") {
-              _b = 1;
+              _b = 2;
               _this.$message.error("学生班级不能为空,请重新上传");
               break;
             } else if (item.name === "") {
-              _b = 1;
+              _b = 2;
               _this.$message.error("学生姓名不能为空,请重新上传");
               break;
             } else if (item.sId === "") {
-              _b = 1;
+              _b = 2;
               _this.$message.error("学生学号不能为空,请重新上传");
             }
             // else if (item.phone === "") {
@@ -741,7 +747,7 @@ export default {
             //   break;
             // }
             else if (item.mail === "") {
-              _b = 1;
+              _b = 2;
               _this.$message.error("学生账号不能为空,请重新上传");
               break;
             } else if (
@@ -749,7 +755,7 @@ export default {
                 item.mail
               )
             ) {
-              _b = 1;
+              _b = 2;
               _this.$message.error("有学生账号格式不正确,请重新上传");
               break;
             }
@@ -981,6 +987,11 @@ export default {
             //   loading.close();
             //#endregion
           }
+          if(_b == 2){
+            _this.fileListUpload = [];
+            loading.close();
+            return
+          }
           let z = 2;
           let newArr = JSON.stringify(arr);
           let params = [

+ 1 - 1
src/components/pages/sz/dataBoardArea/dataCenter/chartList/toolUser/index.vue

@@ -138,7 +138,7 @@ export default {
       return data;
     },
     setData() {
-      let year = Object.keys(this.Josn)[0].split('-')[0];
+      // let year = Object.keys(this.Josn)[0].split('-')[0];
       var t = this.gettime();
       this.ooption = this.getVirtualData(t)
       if (!this.chartObj) {

+ 2 - 2
src/components/pages/sz/dataBoardArea/dataCenter/index.vue

@@ -300,7 +300,7 @@ export default {
               }
             }
           }
-          let _yearCount = _monthArray[_monthArray.length - 1].usernum - _monthArray[_monthArray.length - 2].usernum 
+          let _yearCount = _monthArray.length ? _monthArray[_monthArray.length - 1].usernum - _monthArray[_monthArray.length - 2].usernum : 0
           this.BasicOverview[2] = _yearCount > 0 ? _yearCount : 0 //较上月新增登录次数
 
           this.monthArray = loginCountMonthArray
@@ -339,7 +339,7 @@ export default {
           for(let i = 0;i < _loginTime.length;i++){
             _loginTimearray[_loginTime[i].time] = _loginTime[i].usernum
           }
-          this.loginCountYearArray = _loginTimearray
+          this.loginCountYearArray = _loginTime.length ? _loginTimearray : []
 
           let _course = res.data[11] // 带分类的课程
           let weekArray = {

+ 323 - 0
src/components/pages/test/dataCom/cascader.vue

@@ -0,0 +1,323 @@
+<template>
+    <div class="cascader">
+        <div class="title" @click="showBox">{{ checkArray.length ? setCheckName(checkArray) : '点击选择教研室范围' }}</div>
+        <div class="box" v-if="show" v-loading="loading">
+            <div class="inputBox">
+                <input v-model="searchTerm" placeholder="输入教师名字搜索" />
+                <i class="search" @click="searchTeacher"></i>
+            </div>
+            <div class="options">
+                <div v-if="filteredOptions.length" class="ul">
+                    <div @click="selectOption(option)" v-for="(option, index) in filteredOptions" :key="index"
+                        class="li" :class="{ active: checkF === option.id }">
+                        <span>{{ option.name }}</span>
+                    </div>
+                </div>
+                <div v-if="children.length" class="ul">
+                    <div v-for="(option, index) in children" :key="index" class="li" @click="selectOption2(option)"
+                        :class="{ active: checkF2 === option.id }">
+                        <span>{{ option.name }}</span>
+                    </div>
+                </div>
+                <div v-else-if="checkF" class="ul">
+                    <div class="liNone">无子分类</div>
+                </div>
+                <div v-if="teacher.length" class="ul">
+                    <div class="li" @click="checkAll()"
+                    :class="{ active: panCheckAll === 1 }"><span>全部</span> </div>
+                    <div v-for="(teacher, index) in teacher" :key="index" class="li" @click="selectOption3(teacher)"
+                    :class="{ active: checkTeacher(teacher) === 2 }">
+                        <span>{{ teacher.name }}</span>
+                    </div>
+                </div>
+                <div v-else-if="checkF2" class="ul">
+                    <div class="liNone">暂无教师</div>
+                </div>
+            </div>
+            <div class="button">
+                <el-button size="small" @click="reset">重置</el-button>
+                <el-button type="primary" size="small" @click="confirm">确认</el-button>
+
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    name: 'Cascader',
+    props: {
+        options: {
+            type: Array,
+            required: true
+        }
+    },
+    data() {
+        return {
+            searchTerm: '',
+            filteredOptions: this.options,
+            checkF: "",
+            checkF2: "",
+            children: [],
+            teacher: [],
+            loading: false,
+            show: false,
+            checkArray: [],
+            checkArray2: []
+        };
+    },
+    computed: {
+        setCheckName() {
+            return function (arr) {
+                let content = ''
+                if(arr.length < 3){
+                    content = arr.map((item) => item.name).join(" 、 ");
+                }else {
+                    content = arr.slice(0, 2).map((item) => item.name).join(" 、 ") + "...共"+arr.length+"位老师";
+                }
+                return content;
+            };
+        },
+        checkTeacher() {
+            return function (teacher) {
+                let a = 1
+                this.checkArray2.forEach(element => {
+                   if (element.userid == teacher.userid) {
+                       a = 2
+                   }
+                   
+                });
+                return a
+            };
+        },
+        panCheckAll(){
+            if(this.teacher.length && this.checkArray2.length){
+                let userid = this.checkArray2.map((item) => item.userid)
+                let userid2 = this.teacher.map((item) => item.userid)
+                let userid3 = this.arrayToArray(userid, userid2)
+                if(userid2.length == userid3.length){
+                    return 1
+                }else{
+                    return 2
+                }
+            }else{
+                return 2
+            }
+        }
+    },
+    methods: {
+        showBox(){
+            if(this.show){
+                this.reset()
+            }else{
+                this.checkArray2 = JSON.parse(JSON.stringify(this.checkArray));
+            }
+            this.show = !this.show
+        },
+        arrayToArray(arrayo, arrayt) {
+            let array1 = arrayo;
+            let array2 = arrayt;
+
+            let commonElements = [];
+
+            for (let i = 0; i < array1.length; i++) {
+                for (let j = 0; j < array2.length; j++) {
+                if (array1[i] === array2[j]) {
+                    commonElements.push(array1[i]);
+                }
+                }
+            }
+            return commonElements;
+        },
+        reset() {
+            this.checkArray2 = []
+            this.checkF = ''
+            this.checkF2 = ''
+            this.teacher = [],
+            this.children = []
+        },
+        confirm() {
+            this.checkArray = JSON.parse(JSON.stringify(this.checkArray2));
+            let array = this.checkArray.map(item => item.userid)
+            this.$emit('setTeacher', array)
+            this.show = false
+        },
+        selectOption(option) {
+            console.log(option);
+            this.checkF2 = '';
+            this.teacher = []
+            this.checkF = option.id;
+            this.children = option.child;
+            this.$forceUpdate();
+        },
+        selectOption2(option) {
+            this.checkF2 = option.id;
+            this.teacher = []
+            this.loading = true
+            let params = {
+                cid: option.id,
+                name: this.searchTerm,
+                userid: this.$route.query.userid
+            };
+            this.ajax
+                .get(this.$store.state.api + "getTypeTeacher", params)
+                .then((res) => {
+                    this.teacher = res.data[0];
+                    this.loading = false
+
+                })
+                .catch((err) => {
+                    this.loading = false;
+                    console.error(err);
+                });
+        },
+        searchTeacher() {
+            if(!this.checkF2){
+                this.$message.error('请先选择子分类');
+            }
+            this.teacher = []
+            this.loading = true
+            let params = {
+                cid: this.checkF2,
+                name: this.searchTerm,
+                userid: this.$route.query.userid
+            };
+            this.ajax
+                .get(this.$store.state.api + "getTypeTeacher", params)
+                .then((res) => {
+                    this.teacher = res.data[0];
+                    this.loading = false
+
+                })
+                .catch((err) => {
+                    this.loading = false;
+                    console.error(err);
+                });
+        },
+        selectOption3(teacher){
+            if(this.checkTeacher(teacher) == 1){
+                this.checkArray2.push(teacher)
+            }else {
+                this.checkArray2 = this.checkArray2.filter(item => item.userid != teacher.userid)
+            }
+        },
+        checkAll(){
+            let userid = this.checkArray2.map((item) => item.userid)
+            let userid2 = this.teacher.map((item) => item.userid)
+            if(this.panCheckAll == 1){
+                this.checkArray2 = this.checkArray2.filter(item => !userid2.includes(item.userid))
+            }else{
+                let userAarray = this.arrayToArray(userid, userid2)
+                let teacher = this.teacher.filter(item => !userAarray.includes(item.userid))
+                teacher.forEach(item => {
+                    this.checkArray2.push(item)
+                })
+            }
+        },
+    }
+};
+</script>
+
+<style scoped>
+.cascader {
+    position: relative;
+}
+
+.cascader>.title {
+    min-width: 300px;
+    background: #fff;
+    border-radius: 5px;
+    height: 30px;
+    display: flex;
+    align-items: center;
+    padding: 0 10px;
+    box-sizing: border-box;
+    cursor: pointer;
+    color: #00000066;
+}
+
+.box {
+    position: absolute;
+    z-index: 999;
+    border-radius: 5px;
+    overflow: hidden;
+    background: #fff;
+    box-shadow: 0 0 3px 2px #0000002b;
+}
+
+.inputBox {
+    padding: 5px 8px;
+    border-bottom: 1px solid #c4c4c4;
+    display: flex;
+    box-sizing: border-box;
+    width: 100%;
+    align-items: center;
+    position: relative
+}
+
+.inputBox>input {
+    width: 100%;
+    background: #fff;
+    border-radius: 5px;
+    height: 30px;
+    padding: 0 10px;
+    border: 1px solid #c4c4c4;
+    outline: none;
+}
+
+.inputBox>.search {
+    position: absolute;
+    right: 20px;
+    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;
+}
+
+.options {
+    height: 200px;
+    display: flex;
+}
+
+.options>.ul {
+    height: 100%;
+    overflow-y: auto;
+    list-style: none;
+    padding: 0;
+    width: 135px;
+    border-right: 1px solid #c4c4c4;
+    /* width: 100%; */
+    text-align: center;
+}
+
+.options>.ul:nth-child(3) {
+    border-right: none;
+}
+
+.options>.ul>.li.active,
+.options>.ul>.li:hover {
+    color: #3681FC;
+}
+
+.options>.ul>.li,
+.options>.ul>.liNone {
+    cursor: pointer;
+    padding: 10px 8px;
+    max-width: 100%;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.button {
+    padding: 5px 8px;
+    border-top: 1px solid #c4c4c4;
+    display: flex;
+    justify-content: flex-end;
+    box-sizing: border-box;
+    width: 100%;
+}
+</style>

+ 246 - 0
src/components/pages/test/dataCom/radarTeacher.vue

@@ -0,0 +1,246 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%" v-if="this.ooption.xdata.length">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+        <div style="width: 100%; height: 100%;display: flex;align-items: center;justify-content: center;"
+            v-show="!this.ooption.xdata.length">暂无数据</div>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        evCourseArray: {
+            type: Object,
+            default: function () {
+                return {}
+            }
+        },
+        evCourseArray2: {
+            type: Array,
+            default: []
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                xdata2: [],
+                sdata: [],
+            },
+            option: {
+                tooltip: {},
+                radar: {
+                    axisName: {
+                        color: "#000"
+                    },
+                    // shape: 'circle',
+                    indicator: [
+                        // { name: '目标一', max: 5 },
+                        // { name: '目标二', max: 5 },
+                        // { name: '目标三', max: 5 },
+                        // { name: '目标四', max: 5 },
+                        // { name: '目标五', max: 5 }
+                    ]
+                },
+                series: [
+                    {
+                        name: '教师考核',
+                        type: 'radar',
+                        data: [
+                            // {
+                            //     areaStyle: {
+                            //         opacity: 0.2,
+                            //         color: '#0061FF'
+                            //     },
+                            //     itemStyle: {
+                            //         color: '#0061FF',
+                            //         lineStyle: {
+                            //         color: '#0061FF'
+                            //         }
+                            //     },
+                            //     value: [],
+                            //     name: ''
+                            // }
+                        ]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                this.option.radar.indicator = option.sdata;
+                if (option.xdata.length > 0) {
+                    this.option.series[0].data[0] = {
+                        // areaStyle: {
+                        //     opacity: 0.2,
+                        //     color: '#0061FF'
+                        // },
+                        itemStyle: {
+                            color: '#0061FF',
+                            lineStyle: {
+                                color: '#0061FF'
+                            }
+                        },
+                        value: option.xdata,
+                        name: '全体教师平均得分率'
+                    }
+                }
+                if (option.xdata2.length > 0) {
+                    this.option.series[0].data[1] = {
+                        // areaStyle: {
+                        //     opacity: 0.2,
+                        //     color: '#68bbc4'
+                        // },
+                        itemStyle: {
+                            color: '#68bbc4',
+                            lineStyle: {
+                                color: '#68bbc4'
+                            }
+                        },
+                        value: option.xdata2,
+                        name: '平均得分率'
+                    }
+                }
+                // this.option.series[0].data[0].value = option.xdata;
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array, type) {
+            this.ooption.sdata = Object.keys(this.evCourseArray).map((item) => {
+                return {
+                    name: item,
+                    max: 100,
+                };
+            });
+            if (type == 1) {
+                this.ooption.xdata = Object.keys(array).map((item) => {
+                    return array[item].cogScore;
+                })
+            }
+            if (this.evCourseArray2.length) {
+                let xdata2 = []
+                for(var i = 0; i < this.ooption.sdata.length; i++) {
+                    let name = this.ooption.sdata[i]
+                    for(var j = 0; j < this.evCourseArray2.length; j++) {
+                        if(this.evCourseArray2[j].name == name.name) {
+                            xdata2.push(this.evCourseArray2[j].cogScore)
+                            break
+                        }
+                    }
+                }
+                this.ooption.xdata2 = xdata2
+            }
+            if (!this.chartObj) {
+                this.setChart(this.ooption);
+            } else {
+                this.option.radar.indicator = this.ooption.sdata;
+                if (this.ooption.xdata.length > 0) {
+                    this.option.series[0].data[0] = {
+                        // areaStyle: {
+                        //     opacity: 0.2,
+                        //     color: '#0061FF'
+                        // },
+                        itemStyle: {
+                            color: '#0061FF',
+                            lineStyle: {
+                                color: '#0061FF'
+                            }
+                        },
+                        value: this.ooption.xdata,
+                        name: '全体教师平均得分率'
+                    }
+                }
+                if (this.ooption.xdata2.length > 0) {
+                    this.option.series[0].data[1] = {
+                        // areaStyle: {
+                        //     opacity: 0.2,
+                        //     color: '#68bbc4'
+                        // },
+                        itemStyle: {
+                            color: '#68bbc4',
+                            lineStyle: {
+                                color: '#68bbc4'
+                            }
+                        },
+                        value: this.ooption.xdata2,
+                        name: '平均得分率'
+                    }
+                }
+                this.chartObj.setOption(this.option);
+            }
+            setTimeout(() => {
+                if (this.chartObj) {
+                    this.chartObj.resize();
+                }
+            }, 200);
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        evCourseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.ooption.xdata = [];
+                this.setArray(newValue, 1)
+                this.$forceUpdate();
+            },
+        },
+        evCourseArray2: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.ooption.xdata2 = [];
+                this.setArray(newValue, 2)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.ooption = {
+            xdata: [],
+            xdata2: [],
+            sdata: [],
+        }
+        this.setArray(this.evCourseArray, 1)
+        // this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 90%;
+    background: #fff;
+}
+</style>

+ 241 - 0
src/components/pages/test/dataCom/radarZong.vue

@@ -0,0 +1,241 @@
+<template>
+    <div class="data_body">
+        <div style="width: 100%; height: 100%" v-if="this.ooption.xdata.length">
+            <div id="charts_canvas" class="echart" style="width: 100%; height: 100%; "></div>
+        </div>
+        <div style="width: 100%; height: 100%;display: flex;align-items: center;justify-content: center;"
+            v-show="!this.ooption.xdata.length">暂无数据</div>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        evCourseArray: {
+            type: Object,
+            default: function () {
+                return {}
+            }
+        },
+        evCourseArray2: {
+            type: Object,
+            default: function () {
+                return {}
+            }
+        },
+    },
+    data() {
+        return {
+            chartObj: null,
+            ooption: {
+                xdata: [],
+                xdata2: [],
+                sdata: [],
+            },
+            option: {
+                legend: {},
+                tooltip: {},
+                radar: {
+                    axisName: {
+                        color: "#000"
+                    },
+                    // shape: 'circle',
+                    indicator: [
+                        // { name: '目标一', max: 5 },
+                        // { name: '目标二', max: 5 },
+                        // { name: '目标三', max: 5 },
+                        // { name: '目标四', max: 5 },
+                        // { name: '目标五', max: 5 }
+                    ]
+                },
+                series: [
+                    {
+                        name: '教师考核',
+                        type: 'radar',
+                        data: [
+                            // {
+                            //     areaStyle: {
+                            //         opacity: 0.2,
+                            //         color: '#0061FF'
+                            //     },
+                            //     itemStyle: {
+                            //         color: '#0061FF',
+                            //         lineStyle: {
+                            //         color: '#0061FF'
+                            //         }
+                            //     },
+                            //     value: [],
+                            //     name: ''
+                            // }
+                        ]
+                    }
+                ]
+            },
+        };
+    },
+    methods: {
+        setChart(option) {
+            // 雷达图显示的标签
+            let newPromise = new Promise((resolve) => {
+                resolve();
+            });
+            //然后异步执行echarts的初始化函数
+            newPromise.then(() => {
+                const chartObj = this.$echarts.init(
+                    //劳动课程
+                    this.$el.querySelector("#charts_canvas")
+                );
+                this.option.radar.indicator = option.sdata;
+                if (option.xdata.length > 0) {
+                    this.option.series[0].data[0] = {
+                        // areaStyle: {
+                        //     opacity: 0.2,
+                        //     color: '#0061FF'
+                        // },
+                        itemStyle: {
+                            color: '#0061FF',
+                            lineStyle: {
+                                color: '#0061FF'
+                            }
+                        },
+                        value: option.xdata,
+                        name: '全体教师平均得分率'
+                    }
+                }
+                if (option.xdata2.length > 0) {
+                    this.option.series[0].data[1] = {
+                        // areaStyle: {
+                        //     opacity: 0.2,
+                        //     color: '#68bbc4'
+                        // },
+                        itemStyle: {
+                            color: '#68bbc4',
+                            lineStyle: {
+                                color: '#68bbc4'
+                            }
+                        },
+                        value: option.xdata2,
+                        name: '平均得分率'
+                    }
+                }
+                // this.option.series[0].data[0].value = option.xdata;
+                // 初始化雷达图
+                this.chartObj = chartObj;
+                this.chartObj.setOption(this.option);
+            });
+        },
+        setArray(array, type) {
+            this.ooption.sdata = Object.keys(array).map((item) => {
+                return {
+                    name: item,
+                    max: 100,
+                };
+            });
+            if (type == 1) {
+                this.ooption.xdata = Object.keys(array).map((item) => {
+                    return array[item].cogScore;
+                })
+            }
+            if (type == 2) {
+                this.ooption.xdata2 = Object.keys(array).map((item) => {
+                    return array[item].cogScore;
+                })
+            }
+            if (!this.chartObj) {
+                this.setChart(this.ooption);
+            } else {
+                this.option.radar.indicator = this.ooption.sdata;
+                if (this.ooption.xdata.length > 0) {
+                    this.option.series[0].data[0] = {
+                        // areaStyle: {
+                        //     opacity: 0.2,
+                        //     color: '#0061FF'
+                        // },
+                        itemStyle: {
+                            color: '#0061FF',
+                            lineStyle: {
+                                color: '#0061FF'
+                            }
+                        },
+                        value: this.ooption.xdata,
+                        name: '全体教师平均得分率'
+                    }
+                }
+                if (this.ooption.xdata2.length > 0) {
+                    this.option.series[0].data[1] = {
+                        // areaStyle: {
+                        //     opacity: 0.2,
+                        //     color: '#68bbc4'
+                        // },
+                        itemStyle: {
+                            color: '#68bbc4',
+                            lineStyle: {
+                                color: '#68bbc4'
+                            }
+                        },
+                        value: this.ooption.xdata2,
+                        name: '平均得分率'
+                    }
+                }
+                this.chartObj.setOption(this.option);
+            }
+            setTimeout(() => {
+                if (this.chartObj) {
+                    this.chartObj.resize();
+                }
+            }, 200);
+            this.$forceUpdate();
+        },
+    },
+    watch: {
+        evCourseArray: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.ooption.xdata = [];
+                this.setArray(newValue, 1)
+                this.$forceUpdate();
+            },
+        },
+        evCourseArray2: {
+            immediate: true,
+            deep: true,
+            handler(newValue, oldValue) {
+                this.ooption.xdata2 = [];
+                this.setArray(newValue, 2)
+                this.$forceUpdate();
+            },
+        },
+    },
+    mounted() {
+        this.ooption = {
+            xdata: [],
+            xdata2: [],
+            sdata: [],
+        }
+        this.setArray(this.evCourseArray, 1)
+        // this.setChart(this.ooption);
+        var _this = this;
+        window.addEventListener("resize", () => {
+            if (_this.chartObj) {
+                _this.chartObj.resize();
+            }
+        });
+    },
+};
+</script>
+
+<style scoped>
+.data_body {
+    height: 100%;
+    /* display: flex; */
+    position: relative;
+    border-radius: 5px;
+    /* border: 1px solid #eee; */
+    margin: 0 auto;
+    box-sizing: border-box;
+    padding: 0;
+    width: 95%;
+    background: #fff;
+}
+</style>

+ 498 - 0
src/components/pages/test/databoard.vue

@@ -0,0 +1,498 @@
+<template>
+    <div class="pb_content" style="height: auto; width: calc(100% - 40px); margin: 0 auto;background: unset;">
+        <div style="width:100%;padding:0;box-sizing: border-box;">
+            <div class="pb_head top">
+                <div style="display: flex;align-items: center;">
+                    <span class="subClick" @click="
+                        goTo(
+                            '/test?userid=' +
+                            userid +
+                            '&oid=' +
+                            oid +
+                            '&org=' +
+                            org +
+                            '&role=' +
+                            role
+                        )
+                        ">表单管理</span>
+                    <!-- v-show="oid == '4c686762-1d0a-11ed-8c78-005056b86db5'" -->
+                    <span class="subClick" @click="
+                        goTo(
+                            '/trainCourse?userid=' +
+                            userid +
+                            '&oid=' +
+                            oid +
+                            '&org=' +
+                            org +
+                            '&role=' +
+                            role
+                        )
+                        ">培训管理</span>
+                    <span class="sub_head">数据看板</span>
+                </div>
+            </div>
+        </div>
+        <div class="bbox_serch">
+            <Cascader :options="typeInfo" v-if="typeInfo.length" @setTeacher="setTeacher"></Cascader>
+        </div>
+        <div class="bbox" v-loading="tabLoading">
+            <div class="bbox_nav">
+                <div class="teaLis">
+                    <div class="teal" @click="cutPage(2)" :class="[pType == 2 ? 'Tbor' : '']">
+                        专任教师
+                    </div>
+                    <div class="teal" @click="cutPage(1)" :class="[pType == 1 ? 'Tbor' : '']">
+                        班主任
+                    </div>
+                </div>
+                <el-select v-model="checkSet" @change="setArray" style="margin-left: auto">
+                    <el-option label="综合排序" value=""> </el-option>
+                    <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+                    </el-option>
+                </el-select>
+
+            </div>
+            <div class="randarZong">
+                <radarZong :evCourseArray="zongJson" :evCourseArray2="zongJson2" v-if="teacherArray.length"></radarZong>
+                <radarZong :evCourseArray="zongJson" v-else></radarZong>
+            </div>
+            <div class="randarBox">
+                <div class="title">教师详情</div>
+                <div class="randarTeacher" v-for="(item, index) in tableData" :key="index">
+                    <div class="randarTitle">
+                        <span>{{ item.username }}</span>
+                        <span>{{ getScore(item.json) }}</span>
+                    </div>
+                    <div class="randar">
+                        <radarTeacher :evCourseArray="zongJson2" :evCourseArray2="item.json"></radarTeacher>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+var OpenCC = require("opencc-js");
+let converter = OpenCC.Converter({
+    from: 'hk',
+    to: 'cn'
+})
+
+import radarZong from "./dataCom/radarZong.vue";
+import radarTeacher from "./dataCom/radarTeacher.vue";
+
+import Cascader from "./dataCom/cascader.vue";
+
+
+export default {
+    name: 'testDataBoard',
+    components: { radarZong, radarTeacher, Cascader },
+    data() {
+        return {
+            userid: this.$route.query.userid, //用户id
+            oid: this.$route.query.oid, //学校id
+            org: this.$route.query.org, //组织id
+            pType: 2,
+            teacherName: '',
+            tabLoading: false,
+            tableData: [],
+            zongJson: {},
+            zongJson2: {},
+            checkSet: "",
+            options: [],
+            data: [],
+            typeInfo: [],
+            teacherArray: [],
+        };
+    },
+    computed: {
+        getScore() {
+            return (item) => {
+                let score = 0;
+                for (var i = 0; i < item.length; i++) {
+                    score += item[i].cogScore
+                }
+                score = (score / item.length).toFixed(0);
+                return score;
+            }
+        }
+    },
+    methods: {
+        goTo(path) {
+            this.$router.push(path);
+        },
+        cutPage(type) {
+            this.checkSet = ""
+            this.pType = type
+            this.getData()
+        },
+        scoreChildren(children) {
+            let score = 0;
+            children.forEach(item => {
+                if (item.sco2 && parseFloat(item.sco2) > 0) {
+                    score += parseFloat(item.sco2);
+                }
+            });
+            return score;
+        },
+        getData() {
+            this.tabLoading = true;
+            let params = [{
+                oid: this.oid,
+                org: this.org,
+                type: this.pType,
+                tname: this.teacherName
+            }];
+            // console.log(params);
+            this.ajax
+                .post(this.$store.state.api + "selectTestExaminePersonData2", params)
+                .then(res => {
+                    let data = res.data[0];
+
+                    data.forEach(e => {
+                        e.json = JSON.parse(e.json);
+                    });
+
+                    data.forEach(e => {
+                        e.evaSca = 0;
+                        e.cogSco = 0;
+                        e.step = 0;
+                        e.allStep = 0;
+
+                        e.json.forEach(i => {
+                            i.evaScore = 0 // 自评
+                            i.cogScore = 0 //考核
+                            i.score = 0 //考核
+                            i.children.forEach(k => {
+                                e.evaSca = e.evaSca + k.sco1 * 1;
+                                e.cogSco = e.cogSco + k.sco2 * 1;
+                                i.evaScore = i.evaScore + k.sco1 * 1;
+                                i.cogScore = i.cogScore + k.sco2 * 1;
+                                i.score = i.score + k.score * 1;
+                                e.allStep++;
+                                if (!!k.sco2 * 1) {
+                                    e.step++;
+                                }
+                            });
+                        });
+                    });
+
+                    data.forEach(e => {
+                        if (e.step == e.allStep) {
+                            e.state = "已完成";
+                        } else {
+                            e.state = "未完成";
+                        }
+                        if (!e.tea) {
+                            e.tea = "";
+                        }
+                        e.evaSca = e.evaSca.toFixed(0);
+                        e.cogSco = e.cogSco.toFixed(0);
+                    });
+                    let _data = []
+                    let zongJson = {}
+                    // zongJson.count = data.length
+                    data.forEach((e, index) => {
+                        _data[index] = {}
+                        _data[index].username = e.username
+                        _data[index].evaSca = e.evaSca
+                        _data[index].cogSco = e.cogSco
+                        _data[index].json = []
+
+                        e.json.forEach((i, iindex) => {
+                            if (converter(i.name) == converter("科组评价") || converter(i.name) == converter("行政巡查")) {
+                                return;
+                            }
+                            _data[index].json[iindex] = {}
+                            _data[index].json[iindex].name = i.name
+                            let _evaScore = parseInt((i.evaScore * (100 / i.score)).toFixed(0))
+                            let _cogScore = parseInt((i.cogScore * (100 / i.score)).toFixed(0))
+                            _data[index].json[iindex].evaScore = _evaScore  // 自评
+                            _data[index].json[iindex].cogScore = _cogScore // 考核
+                            zongJson[i.name] ? "" : zongJson[i.name] = {}
+                            zongJson[i.name].evaScore ? zongJson[i.name].evaScore += _evaScore : zongJson[i.name].evaScore = _evaScore
+                            zongJson[i.name].cogScore ? zongJson[i.name].cogScore += _cogScore : zongJson[i.name].cogScore = _cogScore
+                        });
+                    });
+                    let zongArray = Object.keys(zongJson)
+                    for (var i = 0; i < zongArray.length; i++) {
+                        zongJson[zongArray[i]].evaScore = (zongJson[zongArray[i]].evaScore / data.length).toFixed(0)
+                        zongJson[zongArray[i]].cogScore = (zongJson[zongArray[i]].cogScore / data.length).toFixed(0)
+                    }
+
+                    this.tableData = _data;
+                    console.log(this.tableData);
+                    this.zongJson = zongJson
+                    this.zongJson2 = zongJson
+                    console.log(zongJson);
+                    this.options = Object.keys(zongJson).map(item => {
+                        return { label: item, value: item }
+                    })
+                    this.data = data
+                    console.log(data);
+
+                    this.tabLoading = false;
+                })
+                .catch(error => {
+                    this.tabLoading = false;
+                    console.log(error);
+                });
+        },
+        setTeacher(array){
+            this.teacherArray = array
+            this.setArray()
+        },
+        setArray() {
+            let checkSet = this.checkSet
+            let _data = []
+            let zongJson = {}
+            let data = this.data
+            if(this.teacherArray.length){
+                data = data.filter((e) => {
+                    return this.teacherArray.includes(e.userid)
+                })
+            }
+            data.forEach((e, index) => {
+                _data[index] = {}
+                _data[index].username = e.username
+                if (checkSet == "") {
+                    _data[index].evaSca = e.evaSca
+                    _data[index].cogSco = e.cogSco
+                    _data[index].json = []
+                }
+
+
+                e.json.forEach((i, iindex) => {
+                    if (converter(i.name) == converter("科组评价") || converter(i.name) == converter("行政巡查")) {
+                        return;
+                    }
+                    if (checkSet == i.name) {
+                        _data[index].evaSca = i.evaScore
+                        _data[index].cogSco = i.cogScore
+                        _data[index].json = []
+                        i.children.forEach((ic, icindex) => {
+                            _data[index].json[icindex] = {}
+                            _data[index].json[icindex].name = ic.name
+                            let _evaScore = parseInt((ic.sco1 * 1 * (100 / ic.score)).toFixed(0))
+                            let _cogScore = parseInt((ic.sco2 * 1 * (100 / ic.score)).toFixed(0))
+                            _data[index].json[icindex].evaScore = _evaScore  // 自评
+                            _data[index].json[icindex].cogScore = _cogScore // 考核
+                            zongJson[ic.name] ? "" : zongJson[ic.name] = {}
+                            zongJson[ic.name].evaScore ? zongJson[ic.name].evaScore += _evaScore : zongJson[ic.name].evaScore = _evaScore
+                            zongJson[ic.name].cogScore ? zongJson[ic.name].cogScore += _cogScore : zongJson[ic.name].cogScore = _cogScore
+                        })
+                    } else if (checkSet == "") {
+                        _data[index].json[iindex] = {}
+                        _data[index].json[iindex].name = i.name
+                        let _evaScore = parseInt((i.evaScore * (100 / i.score)).toFixed(0))
+                        let _cogScore = parseInt((i.cogScore * (100 / i.score)).toFixed(0))
+                        _data[index].json[iindex].evaScore = _evaScore  // 自评
+                        _data[index].json[iindex].cogScore = _cogScore // 考核
+                        zongJson[i.name] ? "" : zongJson[i.name] = {}
+                        zongJson[i.name].evaScore ? zongJson[i.name].evaScore += _evaScore : zongJson[i.name].evaScore = _evaScore
+                        zongJson[i.name].cogScore ? zongJson[i.name].cogScore += _cogScore : zongJson[i.name].cogScore = _cogScore
+                    }
+
+                });
+            });
+            let zongArray = Object.keys(zongJson)
+            for (var i = 0; i < zongArray.length; i++) {
+                zongJson[zongArray[i]].evaScore = (zongJson[zongArray[i]].evaScore / data.length).toFixed(0)
+                zongJson[zongArray[i]].cogScore = (zongJson[zongArray[i]].cogScore / data.length).toFixed(0)
+            }
+            this.tableData = _data;
+            console.log(this.tableData);
+            this.zongJson2 = zongJson
+            console.log(zongJson);
+        },
+        //获取分类类名
+        getTypeInfo() {
+            this.tabLoading = true;
+            let params = {
+                oid: this.oid
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectPerInfoAllTea", params)
+                .then((res) => {
+                    this.typeInfo = res.data[0];
+                    let typeInfo = res.data[1];
+                    this.typeInfo.forEach((e) => {
+                        e.child = [];
+                        e.value = '';
+                        typeInfo.forEach((i) => {
+                            if (e.id == i.parentid) {
+                                e.child.push({ id: i.id, name: i.name })
+                            }
+                        })
+                    })
+                    this.getData()
+                })
+                .catch((err) => {
+                    this.tabLoading = false;
+                    console.error(err);
+                });
+        },
+    },
+    mounted() {
+        this.getTypeInfo()
+    },
+};
+</script>
+
+<style scoped>
+.bbox_serch{
+    width: 100%;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+}
+
+.top {
+    display: flex;
+    justify-content: space-between;
+    width: 100% !important;
+    box-sizing: border-box;
+    margin: 0px auto;
+    padding: 10px 0;
+    height: 54px;
+}
+
+
+.subClick {
+    font-size: 16px;
+    cursor: pointer;
+    margin-left: 10px;
+    /* color: #ab582f; */
+    color: #409eff;
+}
+
+.sub_head {
+    position: relative;
+    font-size: 20px;
+    font-weight: bold;
+    padding: 0 15px;
+}
+
+.sub_head::after {
+    content: "";
+    width: 100%;
+    background: #3681FC;
+    height: 2px;
+    position: absolute;
+    left: 0;
+    bottom: -8px;
+}
+
+.subClick {
+    /* font-size: 16px; */
+    font-size: 20px;
+    cursor: pointer;
+    /* margin-left: 17.5px; */
+    /* color: #ab582f; */
+    /* color: #409eff; */
+    color: #999;
+    padding: 0 15px;
+}
+
+.subClick:hover {
+    color: #000;
+}
+
+.sub_head+.subClick,
+.subClick+.subClick,
+.subClick+.sub_head {
+    margin-left: 17.5px;
+}
+
+.bbox {
+    background: #fff;
+    border-radius: 0 5px 5px 5px;
+    padding: 15px 0;
+    box-sizing: border-box;
+    min-height: 900px;
+}
+
+.bbox_nav {
+    display: flex;
+    width: 100%;
+    box-sizing: border-box;
+    padding: 0 20px;
+    align-items: center;
+}
+
+.teaLis {
+    display: flex;
+}
+
+.teal {
+    padding: 10px 20px;
+    cursor: pointer;
+}
+
+.Tbor {
+    border-bottom: 2px rgba(54, 129, 252, 1) solid;
+    font-weight: 600;
+}
+
+
+.randarZong {
+    max-width: 100%;
+    width: 500px;
+    height: 500px;
+    margin: 0 auto;
+}
+
+.randarBox {
+    padding: 20px;
+    width: 100%;
+    box-sizing: border-box;
+    display: flex;
+    flex-wrap: wrap;
+}
+
+.randarBox .title {
+    width: 100%;
+    font-size: 18px;
+    font-weight: 700;
+    margin-bottom: 20px;
+}
+
+.randarTeacher {
+    width: calc(100% / 4 - 20px);
+    margin-right: 20px;
+    margin-bottom: 20px;
+}
+
+
+.randarTitle {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 10px;
+}
+
+.randarTitle>span:nth-child(1) {}
+
+.randarTitle>span:nth-child(2) {}
+
+.randar {
+    width: calc(100%);
+    height: 350px;
+    border: 1px solid #e4e4e4;
+    border-radius: 5px;
+}
+
+@media screen and (max-width: 1280px) {
+    .randarTeacher {
+        width: calc(100% / 2 - 20px);
+    }
+}
+
+@media screen and (max-width: 800px) {
+    .randarTeacher {
+        width: calc(100%);
+        margin-right: 0;
+    }
+}
+</style>

+ 12 - 0
src/components/pages/test/index.vue

@@ -17,6 +17,18 @@
                             role
                         )
                         ">培训管理</span>
+                    <span class="subClick" v-if="examineData.length" @click="
+                        goTo(
+                            '/testDataBoard?userid=' +
+                            userid +
+                            '&oid=' +
+                            oid +
+                            '&org=' +
+                            org +
+                            '&role=' +
+                            role
+                        )
+                        ">数据看板</span>
                 </div>
             </div>
         </div>

+ 33 - 1
src/components/pages/trainCourse/course.vue

@@ -19,6 +19,18 @@
             )
             ">表单管理</span>
           <span class="sub_head">培训管理</span>
+          <span class="subClick" v-if="examineData.length" @click="
+            goTo(
+                '/testDataBoard?userid=' +
+                userid +
+                '&oid=' +
+                oid +
+                '&org=' +
+                org +
+                '&role=' +
+                role
+            )
+            ">数据看板</span>
         </div>
         <div class="student_button">
           <!-- <el-button type="primary" class="bgColor" @click="openCourse">协同编辑</el-button> -->
@@ -390,10 +402,29 @@ export default {
       typed: "",
       pTypeCheck: [],
       pTypeCheckName: [],
-      btnDisplay: false
+      btnDisplay: false,
+      examineData:[]
     };
   },
   methods: {
+    // 获取基础页面数据
+    getPageBase() {
+      let params = {
+          typ: 2,
+          org: this.org,
+          oid: this.oid
+      };
+      // console.log(params);
+      this.ajax
+          .get(this.$store.state.api + "selectTestExamineBase", params)
+          .then(res => {
+              console.log('selectTestExamineBase',res.data[0]);
+              this.examineData=res.data[0]
+          })
+          .catch(error => {
+          console.log(error);
+          });
+    },
     change(val) {
       console.log(val);
     },
@@ -1152,6 +1183,7 @@ export default {
     if (this.role == "1") {
       this.groupA = "4";
     }
+    this.getPageBase()
     this.page = 1;
     // this.selectType();
     this.selectAllType();

+ 28 - 0
src/components/tools/hevue-img-preview/package-lock.json

@@ -0,0 +1,28 @@
+{
+  "name": "hevue-img-preview",
+  "version": "5.0.3",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "hevue-img-preview",
+      "version": "5.0.3",
+      "license": "MIT",
+      "dependencies": {
+        "hevue-img-preview": "file:"
+      }
+    },
+    "node_modules/hevue-img-preview": {
+      "resolved": "",
+      "link": true
+    }
+  },
+  "dependencies": {
+    "hevue-img-preview": {
+      "version": "file:",
+      "requires": {
+        "hevue-img-preview": "file:"
+      }
+    }
+  }
+}

+ 4 - 1
src/components/tools/hevue-img-preview/package.json

@@ -58,5 +58,8 @@
     "type": "git",
     "url": "git+https://github.com/heyongsheng/hevue-img-preview.git"
   },
-  "version": "5.0.3"
+  "version": "5.0.3",
+  "dependencies": {
+    "hevue-img-preview": "file:"
+  }
 }

+ 10 - 0
src/router/index.js

@@ -113,6 +113,7 @@ import dataBoardArea from '@/components/pages/sz/dataBoardArea'
 import addSynergyCourse from '@/components/pages/synergyCourse/addCourse'
 import synergyCourse from '@/components/pages/synergyCourse/course'
 import test from '@/components/pages/test/index'
+import testDataBoard from '@/components/pages/test/databoard'
 import addTest from '@/components/pages/test/add/addTest'
 import testStudent from '@/components/pages/testStudent/index'
 import testPerson from '@/components/pages/testPerson/index'
@@ -932,6 +933,15 @@ export default new Router({
                 requireAuth: '' // 是否需要判断是否登录,这里是需要判断
             }
         },
+        {
+            path: '/testDataBoard',
+            name: 'testDataBoard',
+            component: testDataBoard,
+            meta: {
+                keepAlive: false,
+                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+            }
+        },
         {
             path: '/testStudent',
             component: testStudent,

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