浏览代码

Merge branch 'beta' into HK

lsc 7 月之前
父节点
当前提交
be0301a10e
共有 39 个文件被更改,包括 7838 次插入2305 次删除
  1. 4 0
      dist/index.html
  2. 0 0
      dist/static/css/app.f37dd605b7c34e752d0b6a21763ba975.css
  3. 0 0
      dist/static/css/app.f37dd605b7c34e752d0b6a21763ba975.css.map
  4. 0 40
      dist/static/img/aiWait.bc90766.svg
  5. 30 0
      dist/static/img/practice.25766a7.svg
  6. 1 0
      dist/static/js/app.4e5a18ff73bfa8fcddd5.js
  7. 0 0
      dist/static/js/app.4e5a18ff73bfa8fcddd5.js.map
  8. 二进制
      dist/static/js/app.63c882eeeceee71c5868.js
  9. 1 0
      dist/static/js/app.63c882eeeceee71c5868.js.map
  10. 0 0
      dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map
  11. 0 0
      dist/static/js/vendor.b5a78a47ec38c79eb330.js
  12. 0 0
      dist/static/js/vendor.b5a78a47ec38c79eb330.js.map
  13. 0 0
      src/assets/drawIcon/SourceHanSans-Regular.otf
  14. 30 0
      src/assets/icon/course/practice.svg
  15. 3 0
      src/assets/icon/course/setting2.svg
  16. 二进制
      src/assets/icon/course/start2.png
  17. 9 0
      src/assets/icon/newIcons/Brootper.svg
  18. 二进制
      src/assets/icon/newIcons/blueRoot.png
  19. 二进制
      src/assets/icon/newIcons/commG.png
  20. 二进制
      src/assets/icon/newIcons/fullScreen.png
  21. 二进制
      src/assets/icon/newIcons/likeG.png
  22. 756 78
      src/components/classRoomHelper/component/AnnotationCanvas.vue
  23. 1435 923
      src/components/classRoomHelper/component/countdown.vue
  24. 658 582
      src/components/classRoomHelper/component/languageAssistant.vue
  25. 56 16
      src/components/classRoomHelper/component/levitatedSphere.vue
  26. 723 0
      src/components/classRoomHelper/component/reviewArea.vue
  27. 857 230
      src/components/classRoomHelper/component/searchArea.vue
  28. 234 58
      src/components/classRoomHelper/component/taskArea.vue
  29. 318 25
      src/components/classRoomHelper/index.vue
  30. 1 1
      src/components/components/answerData2.vue
  31. 1 1
      src/components/components/askStatic.vue
  32. 2 2
      src/components/components/askStatic2.vue
  33. 28 0
      src/components/courseDetail.vue
  34. 1489 0
      src/components/easy2/commpont/markDialog.vue
  35. 302 181
      src/components/easy2/commpont/markScore.vue
  36. 687 30
      src/components/easy2/studyStudent.vue
  37. 114 52
      src/components/easy3/studyStudent.vue
  38. 1 0
      src/components/scoreZong/index.vue
  39. 98 86
      src/components/studyStudent.vue

+ 4 - 0
dist/index.html

@@ -27,7 +27,11 @@
     html,
     body{
       font-family: '黑体';
+<<<<<<< HEAD
     }</style><link href=./static/css/app.5b0dede8bdfbc1b781b478175fd2d6d9.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.7707b4b07bf11db2f61a.js></script><script type=text/javascript src=./static/js/app.4e5a18ff73bfa8fcddd5.js></script></body></html><script>function stopSafari() {
+=======
+    }</style><link href=./static/css/app.f37dd605b7c34e752d0b6a21763ba975.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.b5a78a47ec38c79eb330.js></script><script type=text/javascript src=./static/js/app.63c882eeeceee71c5868.js></script></body></html><script>function stopSafari() {
+>>>>>>> beta
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

文件差异内容过多而无法显示
+ 0 - 0
dist/static/css/app.f37dd605b7c34e752d0b6a21763ba975.css


文件差异内容过多而无法显示
+ 0 - 0
dist/static/css/app.f37dd605b7c34e752d0b6a21763ba975.css.map


文件差异内容过多而无法显示
+ 0 - 40
dist/static/img/aiWait.bc90766.svg


+ 30 - 0
dist/static/img/practice.25766a7.svg

@@ -0,0 +1,30 @@
+<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2.38623 10.9008C2.38623 12.0768 2.61796 13.2414 3.0682 14.3279C3.51843 15.4144 4.17835 16.4017 5.01027 17.2333C5.84219 18.0649 6.82982 18.7245 7.91678 19.1746C9.00374 19.6246 10.1687 19.8563 11.3453 19.8563C12.5218 19.8563 13.6868 19.6246 14.7737 19.1746C15.8607 18.7245 16.8483 18.0649 17.6802 17.2333C18.5122 16.4017 19.1721 15.4144 19.6223 14.3279C20.0725 13.2414 20.3043 12.0768 20.3043 10.9008C20.3043 8.52566 19.3604 6.24779 17.6802 4.56831C16.0001 2.88883 13.7213 1.94531 11.3453 1.94531C8.96917 1.94531 6.69041 2.88883 5.01027 4.56831C3.33012 6.24779 2.38623 8.52566 2.38623 10.9008Z" fill="#F7FAFF"/>
+<path d="M2.38623 10.9008C2.38623 12.0768 2.61796 13.2414 3.0682 14.3279C3.51843 15.4144 4.17835 16.4017 5.01027 17.2333C5.84219 18.0649 6.82982 18.7245 7.91678 19.1746C9.00374 19.6246 10.1687 19.8563 11.3453 19.8563C12.5218 19.8563 13.6868 19.6246 14.7737 19.1746C15.8607 18.7245 16.8483 18.0649 17.6802 17.2333C18.5122 16.4017 19.1721 15.4144 19.6223 14.3279C20.0725 13.2414 20.3043 12.0768 20.3043 10.9008C20.3043 8.52566 19.3604 6.24779 17.6802 4.56831C16.0001 2.88883 13.7213 1.94531 11.3453 1.94531C8.96917 1.94531 6.69041 2.88883 5.01027 4.56831C3.33012 6.24779 2.38623 8.52566 2.38623 10.9008Z" fill="#3681FC"/>
+<path d="M5.6427 11.4946L13.5813 8.28714C13.6979 8.24001 13.8299 8.29657 13.877 8.41205L17.1895 17.046C17.2366 17.1627 17.1801 17.2947 17.0646 17.3418L9.12601 20.5493C9.00935 20.5964 8.87738 20.5398 8.83024 20.4244L5.51662 11.7904C5.46949 11.6737 5.52605 11.5418 5.6427 11.4946Z" fill="#E7E7E7"/>
+<path d="M6.09808 10.5573L14.0365 7.34986C14.0642 7.33874 14.0937 7.33319 14.1235 7.33351C14.1533 7.33383 14.1828 7.34002 14.2101 7.35174C14.2375 7.36345 14.2624 7.38045 14.2832 7.40176C14.304 7.42307 14.3204 7.44828 14.3315 7.47594L17.644 16.1104C17.6552 16.1379 17.6608 16.1674 17.6605 16.1971C17.6603 16.2268 17.6542 16.2562 17.6426 16.2836C17.631 16.3109 17.6141 16.3357 17.5929 16.3566C17.5718 16.3774 17.5467 16.3938 17.5191 16.405L9.58044 19.6122C9.5528 19.6233 9.52324 19.6289 9.49345 19.6286C9.46365 19.6283 9.43422 19.6221 9.40682 19.6104C9.37943 19.5986 9.35461 19.5816 9.33379 19.5603C9.31297 19.539 9.29656 19.5138 9.2855 19.4861L5.97306 10.8518C5.96191 10.8243 5.9563 10.7948 5.95655 10.7651C5.9568 10.7354 5.96289 10.706 5.97449 10.6786C5.98609 10.6513 6.00296 10.6265 6.02415 10.6057C6.04533 10.5848 6.07053 10.5685 6.09808 10.5573Z" fill="white"/>
+<path d="M9.71794 10.6019L13.2413 9.17842C13.2857 9.16149 13.335 9.16264 13.3785 9.18162C13.4221 9.20061 13.4565 9.23592 13.4743 9.27997C13.4921 9.32401 13.4919 9.37329 13.4738 9.41721C13.4556 9.46112 13.421 9.49618 13.3773 9.51485L9.85404 10.9384C9.83194 10.9473 9.8083 10.9518 9.78447 10.9516C9.76064 10.9514 9.73708 10.9465 9.71514 10.9372C9.6932 10.9279 9.67331 10.9144 9.65661 10.8974C9.6399 10.8804 9.62671 10.8602 9.61778 10.8381C9.60885 10.816 9.60436 10.7924 9.60457 10.7686C9.60478 10.7447 9.60968 10.7212 9.61899 10.6992C9.6283 10.6773 9.64184 10.6574 9.65884 10.6407C9.67584 10.624 9.69596 10.6108 9.71806 10.6019H9.71794ZM9.98837 11.325L11.8349 10.5791C11.8792 10.5622 11.9285 10.5633 11.9721 10.5823C12.0156 10.6013 12.05 10.6366 12.0678 10.6807C12.0856 10.7247 12.0854 10.774 12.0673 10.8179C12.0492 10.8618 12.0145 10.8969 11.9708 10.9156L10.1244 11.6615C10.08 11.6781 10.031 11.6767 9.98762 11.6577C9.94429 11.6386 9.91011 11.6034 9.89238 11.5595C9.87465 11.5156 9.87478 11.4665 9.89274 11.4227C9.91069 11.3789 9.94505 11.3439 9.98849 11.325H9.98837ZM7.71109 11.0201L8.35129 10.7613C8.42489 10.7315 8.50363 10.7166 8.58302 10.7173C8.66241 10.7179 8.74088 10.7343 8.81396 10.7653C8.88704 10.7963 8.95329 10.8414 9.00892 10.8981C9.06456 10.9547 9.10848 11.0217 9.13819 11.0954L9.39649 11.7345C9.42625 11.8081 9.44122 11.8869 9.44054 11.9662C9.43986 12.0456 9.42354 12.1241 9.39252 12.1972C9.36149 12.2703 9.31637 12.3365 9.25973 12.3921C9.20309 12.4478 9.13605 12.4917 9.06242 12.5214L8.42222 12.7801C8.34873 12.8099 8.27007 12.825 8.19073 12.8245C8.1114 12.8239 8.03296 12.8077 7.9599 12.7768C7.88685 12.7458 7.8206 12.7008 7.76497 12.6443C7.70933 12.5877 7.66539 12.5207 7.63567 12.4472L7.37749 11.808C7.31728 11.6593 7.31858 11.4928 7.38111 11.345C7.44364 11.1973 7.56229 11.0804 7.71097 11.0201H7.71109Z" fill="#E7E7E7"/>
+<path d="M8.50487 11.9268C8.54022 11.9418 8.57675 11.941 8.60939 11.9278C8.62593 11.9212 8.64097 11.9113 8.6536 11.8988C8.66624 11.8863 8.67621 11.8713 8.68292 11.8548L9.05799 10.9713C9.0708 10.9384 9.07029 10.9017 9.05656 10.8692C9.04282 10.8366 9.01695 10.8107 8.98443 10.7969C8.9519 10.7831 8.91528 10.7825 8.88233 10.7953C8.84938 10.808 8.8227 10.8331 8.80794 10.8652L8.48672 11.6241L8.08066 11.4525C8.04774 11.4397 8.01111 11.4402 7.97856 11.454C7.94601 11.4677 7.92009 11.4936 7.90629 11.5261C7.8925 11.5586 7.89192 11.5952 7.90467 11.6282C7.91742 11.6611 7.94251 11.6878 7.97461 11.7026L8.50487 11.9268Z" fill="white"/>
+<path d="M10.7136 13.0444L14.2369 11.6208C14.2814 11.6035 14.3309 11.6043 14.3748 11.6232C14.4186 11.6421 14.4533 11.6775 14.4712 11.7218C14.4891 11.7661 14.4888 11.8156 14.4705 11.8597C14.4521 11.9038 14.4171 11.9388 14.373 11.9573L10.8495 13.3809C10.8051 13.3979 10.7559 13.3967 10.7123 13.3778C10.6688 13.3588 10.6344 13.3235 10.6166 13.2794C10.5988 13.2354 10.599 13.1861 10.6171 13.1422C10.6352 13.0983 10.6698 13.0632 10.7135 13.0445L10.7136 13.0444ZM10.9841 13.7674L12.8306 13.0216C12.8749 13.0049 12.924 13.0063 12.9673 13.0253C13.0106 13.0444 13.0448 13.0796 13.0625 13.1235C13.0803 13.1674 13.0801 13.2165 13.0622 13.2603C13.0442 13.3041 13.0099 13.3391 12.9664 13.358L11.1201 14.104C11.0754 14.122 11.0255 14.1216 10.9812 14.1028C10.9369 14.084 10.9018 14.0483 10.8838 14.0037C10.8658 13.9591 10.8662 13.9091 10.885 13.8648C10.9038 13.8205 10.9395 13.7855 10.9841 13.7674ZM8.70668 13.4625L9.34699 13.2038C9.42059 13.1741 9.49932 13.1591 9.57871 13.1598C9.65809 13.1604 9.73656 13.1768 9.80964 13.2078C9.88272 13.2388 9.94897 13.2839 10.0046 13.3405C10.0602 13.3971 10.1042 13.4642 10.1339 13.5378L10.3921 14.177C10.4218 14.2506 10.4368 14.3294 10.4361 14.4088C10.4354 14.4882 10.4191 14.5666 10.3881 14.6397C10.3571 14.7128 10.312 14.779 10.2553 14.8347C10.1987 14.8903 10.1316 14.9342 10.058 14.9639L9.41781 15.2226C9.34432 15.2524 9.26566 15.2675 9.18633 15.2669C9.10701 15.2663 9.02858 15.2501 8.95554 15.2192C8.88249 15.1883 8.81626 15.1432 8.76064 15.0867C8.70501 15.0301 8.66109 14.9631 8.63138 14.8896L8.37308 14.2505C8.31287 14.1017 8.31419 13.9352 8.37674 13.7874C8.4393 13.6396 8.55797 13.5228 8.70668 13.4625Z" fill="#E7E7E7"/>
+<path d="M9.49917 14.3688C9.5344 14.3837 9.57093 14.3829 9.60369 14.3697C9.63645 14.3565 9.66331 14.3316 9.67722 14.2969L10.0522 13.4132C10.0645 13.3804 10.0637 13.3441 10.0499 13.3119C10.0361 13.2796 10.0104 13.254 9.97809 13.2403C9.94581 13.2266 9.90949 13.2259 9.87671 13.2384C9.84394 13.2508 9.81725 13.2755 9.80224 13.3072L9.48102 14.066L9.07602 13.8941C9.0431 13.8813 9.00648 13.8818 8.97392 13.8956C8.94137 13.9093 8.91545 13.9352 8.90165 13.9677C8.88786 14.0002 8.88728 14.0368 8.90003 14.0698C8.91278 14.1027 8.93787 14.1294 8.96997 14.1442L9.49905 14.3688H9.49917Z" fill="white"/>
+<path d="M11.7089 15.4876L15.2324 14.064C15.2545 14.0551 15.2782 14.0506 15.302 14.0508C15.3258 14.051 15.3494 14.0559 15.3713 14.0652C15.3933 14.0745 15.4132 14.0881 15.4299 14.1051C15.4466 14.1221 15.4598 14.1422 15.4687 14.1643C15.4776 14.1864 15.4821 14.21 15.4819 14.2338C15.4817 14.2577 15.4768 14.2812 15.4675 14.3032C15.4582 14.3251 15.4446 14.345 15.4276 14.3617C15.4106 14.3784 15.3905 14.3916 15.3684 14.4005L11.8449 15.824C11.8005 15.8409 11.7513 15.8398 11.7077 15.8208C11.6642 15.8018 11.6298 15.7665 11.612 15.7224C11.5942 15.6784 11.5944 15.6291 11.6125 15.5852C11.6306 15.5413 11.6652 15.5062 11.7089 15.4876ZM11.9796 16.2107L13.826 15.4647C13.8706 15.4467 13.9206 15.4471 13.9649 15.4659C14.0092 15.4847 14.0442 15.5204 14.0622 15.565C14.0803 15.6096 14.0798 15.6596 14.061 15.7039C14.0422 15.7482 14.0066 15.7832 13.9619 15.8012L12.1155 16.5471C12.0711 16.5641 12.0218 16.5629 11.9783 16.5439C11.9347 16.525 11.9003 16.4896 11.8825 16.4456C11.8647 16.4016 11.8649 16.3523 11.883 16.3084C11.9012 16.2644 11.9358 16.2294 11.9795 16.2107H11.9796ZM9.70208 15.9058L10.3424 15.647C10.416 15.6172 10.4947 15.6023 10.5741 15.6029C10.6535 15.6036 10.732 15.6199 10.8051 15.651C10.8782 15.682 10.9444 15.7271 11 15.7838C11.0557 15.8404 11.0996 15.9074 11.1293 15.9811L11.3875 16.6202C11.4172 16.6938 11.4322 16.7725 11.4315 16.8519C11.4309 16.9313 11.4146 17.0098 11.3836 17.0828C11.3525 17.1559 11.3074 17.2222 11.2508 17.2778C11.1942 17.3335 11.1271 17.3774 11.0535 17.4071L10.4132 17.6658C10.3397 17.6956 10.2611 17.7107 10.1818 17.7101C10.1024 17.7095 10.024 17.6933 9.95097 17.6624C9.87792 17.6315 9.81169 17.5865 9.75606 17.5299C9.70044 17.4734 9.6565 17.4064 9.62678 17.3329L9.36849 16.6937C9.30824 16.545 9.30954 16.3784 9.37209 16.2306C9.43465 16.0828 9.55335 15.9659 9.70208 15.9056V15.9058Z" fill="#E7E7E7"/>
+<path d="M10.4947 16.8115C10.53 16.8264 10.5665 16.8256 10.5993 16.8124C10.6158 16.8058 10.6309 16.796 10.6435 16.7834C10.6561 16.7709 10.6661 16.7559 10.6728 16.7395L11.0479 15.8559C11.061 15.823 11.0607 15.7862 11.047 15.7534C11.0333 15.7207 11.0074 15.6946 10.9747 15.6807C10.9421 15.6669 10.9053 15.6663 10.8722 15.6792C10.8392 15.6921 10.8125 15.7174 10.7978 15.7498L10.4766 16.5086L10.0716 16.3367C10.0387 16.3239 10.0021 16.3244 9.96953 16.3381C9.93698 16.3519 9.91105 16.3777 9.89726 16.4103C9.88346 16.4428 9.88288 16.4794 9.89564 16.5123C9.90839 16.5453 9.93348 16.572 9.96557 16.5867L10.4947 16.8115Z" fill="white"/>
+<path d="M4.50902 4.61806L5.68351 5.09259C5.79211 5.13938 5.87809 5.22681 5.92305 5.33618C5.96801 5.44555 5.96838 5.56817 5.92408 5.67781C5.87978 5.78745 5.79434 5.8754 5.68602 5.92284C5.5777 5.97028 5.45512 5.97345 5.3445 5.93167L4.17001 5.45714C4.06141 5.41036 3.97543 5.32292 3.93047 5.21355C3.88551 5.10418 3.88514 4.98156 3.92944 4.87192C3.97374 4.76228 4.05919 4.67433 4.1675 4.62689C4.27582 4.57945 4.3984 4.57628 4.50902 4.61806Z" fill="#DBE0E9"/>
+<path d="M8.9059 4.00339C7.56206 3.46044 6.0316 4.10918 5.48866 5.45301C4.94571 6.79685 5.59489 8.32622 6.93982 8.86961C8.28475 9.41299 9.81412 8.76381 10.3571 7.41998C10.8989 6.0757 10.2497 4.54633 8.9059 4.00339ZM8.73595 4.42402C9.84817 4.87338 10.3854 6.13891 9.93643 7.25003C9.48751 8.36115 8.22198 8.89834 7.10977 8.44897C5.99755 7.99961 5.46037 6.73408 5.90929 5.62296C6.35821 4.51184 7.62374 3.97465 8.73595 4.42402Z" fill="#DBE0E9"/>
+<path d="M8.71738 4.47004C8.19552 4.25919 7.61132 4.26418 7.0933 4.4839C6.57528 4.70361 6.16588 5.12006 5.95515 5.64164C5.74442 6.16321 5.74963 6.74718 5.96963 7.26507C6.18964 7.78297 6.60641 8.19238 7.12828 8.40322C7.65014 8.61407 8.23434 8.60908 8.75236 8.38937C9.27038 8.16965 9.67978 7.7532 9.89051 7.23163C10.1012 6.71005 10.096 6.12609 9.87603 5.60819C9.65602 5.09029 9.23925 4.68089 8.71738 4.47004Z" fill="#DBE0E9"/>
+<path d="M4.74535 4.14639L5.91984 4.62091C6.02844 4.6677 6.11442 4.75513 6.15938 4.8645C6.20434 4.97387 6.20471 5.09649 6.16041 5.20613C6.11611 5.31577 6.03066 5.40372 5.92235 5.45116C5.81403 5.49861 5.69145 5.50177 5.58083 5.45999L4.40634 4.98546C4.29774 4.93868 4.21176 4.85125 4.1668 4.74188C4.12184 4.63251 4.12147 4.50988 4.16577 4.40024C4.21007 4.2906 4.29551 4.20265 4.40383 4.15521C4.51214 4.10777 4.63473 4.1046 4.74535 4.14639Z" fill="white"/>
+<path d="M9.14223 3.53171C7.79839 2.98876 6.26793 3.6375 5.72499 4.98133C5.18204 6.32517 5.83122 7.85454 7.17615 8.39793C8.52108 8.94131 10.0504 8.29213 10.5934 6.9483C11.1352 5.60402 10.4861 4.07465 9.14223 3.53171ZM8.97228 3.95234C10.0845 4.4017 10.6217 5.66723 10.1728 6.77835C9.72384 7.88948 8.45831 8.42666 7.3461 7.97729C6.23388 7.52793 5.6967 6.2624 6.14562 5.15128C6.59454 4.04016 7.86007 3.50297 8.97228 3.95234Z" fill="white"/>
+<path d="M8.95176 3.99836C8.69336 3.89396 8.41694 3.84145 8.13828 3.84383C7.85962 3.8462 7.58418 3.90342 7.32768 4.01222C7.07118 4.12101 6.83865 4.27924 6.64337 4.47789C6.44808 4.67654 6.29386 4.9117 6.18952 5.16996C6.08518 5.42821 6.03276 5.7045 6.03524 5.98305C6.03773 6.2616 6.09507 6.53696 6.20401 6.79339C6.31294 7.04983 6.47133 7.28233 6.67013 7.47761C6.86893 7.6729 7.10425 7.82714 7.36265 7.93154C7.62105 8.03594 7.89747 8.08845 8.17613 8.08608C8.45479 8.0837 8.73024 8.02648 8.98673 7.91769C9.24323 7.8089 9.47576 7.65066 9.67105 7.45201C9.86633 7.25337 10.0205 7.0182 10.1249 6.75995C10.2292 6.50169 10.2817 6.2254 10.2792 5.94685C10.2767 5.6683 10.2193 5.39295 10.1104 5.13651C10.0015 4.88007 9.84308 4.64757 9.64428 4.45229C9.44548 4.25701 9.21016 4.10276 8.95176 3.99836Z" fill="#E0EAFB"/>
+<path d="M13.5427 5.4766C13.6289 5.39635 13.7434 5.35358 13.8612 5.35769C13.9789 5.3618 14.0901 5.41245 14.1705 5.49852L14.4735 5.82339C14.5537 5.9096 14.5965 6.02413 14.5924 6.14184C14.5883 6.25955 14.5376 6.37082 14.4516 6.45122C14.3654 6.53147 14.2508 6.57424 14.1331 6.57013C14.0154 6.56602 13.9041 6.51537 13.8237 6.4293L13.5208 6.10443C13.4405 6.01822 13.3978 5.90369 13.4019 5.78598C13.406 5.66827 13.4566 5.557 13.5427 5.4766Z" fill="#DBE0E9"/>
+<path d="M17.3567 10.2182L18.0065 9.6123L18.5905 10.89L17.3567 10.2182Z" fill="#E7E7E7"/>
+<path d="M17.8616 10.7593L18.5114 10.1533L19.0954 11.431L17.8616 10.7593Z" fill="#E7E7E7"/>
+<path d="M13.6216 6.21296L14.2714 5.60693L18.0067 9.61263L17.357 10.2185L13.6216 6.21296Z" fill="#E7E7E7"/>
+<path d="M13.4248 5.00544C13.6041 4.83829 13.8855 4.84812 14.0527 5.02737L14.3557 5.35227C14.5228 5.53152 14.513 5.81298 14.3337 5.98013C14.1545 6.14729 13.873 6.13746 13.7059 5.95821L13.4029 5.63331C13.2357 5.45406 13.2456 5.1726 13.4248 5.00544Z" fill="#FF6363"/>
+<path d="M12.8982 5.09187C13.0775 4.92471 13.3589 4.93454 13.5261 5.1138L13.8291 5.43869C13.9962 5.61794 13.9864 5.8994 13.8071 6.06656C13.6279 6.23371 13.3464 6.22389 13.1793 6.04463L12.8763 5.71974C12.7091 5.54048 12.719 5.25903 12.8982 5.09187Z" fill="#FF4D4D"/>
+<path d="M17.239 9.74705L17.8888 9.14111L18.4728 10.4188L17.239 9.74705Z" fill="#FFEAB8"/>
+<path d="M17.7437 10.2881L18.3934 9.68213L18.9775 10.9598L17.7437 10.2881Z" fill="#6A6A6A"/>
+<path d="M17.239 9.74682L17.5639 9.44385L18.4728 10.4185L17.239 9.74682Z" fill="#F2C36C"/>
+<path d="M17.7437 10.2881L18.3934 9.68213L18.9775 10.9598L17.7437 10.2881Z" fill="#64583E"/>
+<path d="M13.5037 5.74119L14.1535 5.13525L17.8888 9.14087L17.239 9.74681L13.5037 5.74119Z" fill="#FFD87A"/>
+<path d="M13.1787 6.04442L13.8285 5.43848L17.5638 9.44409L16.914 10.05L13.1787 6.04442Z" fill="#FFCB4F"/>
+</svg>

文件差异内容过多而无法显示
+ 1 - 0
dist/static/js/app.4e5a18ff73bfa8fcddd5.js


文件差异内容过多而无法显示
+ 0 - 0
dist/static/js/app.4e5a18ff73bfa8fcddd5.js.map


二进制
static/SourceHanSans-Regular.otf → dist/static/js/app.63c882eeeceee71c5868.js


文件差异内容过多而无法显示
+ 1 - 0
dist/static/js/app.63c882eeeceee71c5868.js.map


文件差异内容过多而无法显示
+ 0 - 0
dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map


文件差异内容过多而无法显示
+ 0 - 0
dist/static/js/vendor.b5a78a47ec38c79eb330.js


文件差异内容过多而无法显示
+ 0 - 0
dist/static/js/vendor.b5a78a47ec38c79eb330.js.map


+ 0 - 0
dist/static/SourceHanSans-Regular.otf → src/assets/drawIcon/SourceHanSans-Regular.otf


+ 30 - 0
src/assets/icon/course/practice.svg

@@ -0,0 +1,30 @@
+<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M2.38623 10.9008C2.38623 12.0768 2.61796 13.2414 3.0682 14.3279C3.51843 15.4144 4.17835 16.4017 5.01027 17.2333C5.84219 18.0649 6.82982 18.7245 7.91678 19.1746C9.00374 19.6246 10.1687 19.8563 11.3453 19.8563C12.5218 19.8563 13.6868 19.6246 14.7737 19.1746C15.8607 18.7245 16.8483 18.0649 17.6802 17.2333C18.5122 16.4017 19.1721 15.4144 19.6223 14.3279C20.0725 13.2414 20.3043 12.0768 20.3043 10.9008C20.3043 8.52566 19.3604 6.24779 17.6802 4.56831C16.0001 2.88883 13.7213 1.94531 11.3453 1.94531C8.96917 1.94531 6.69041 2.88883 5.01027 4.56831C3.33012 6.24779 2.38623 8.52566 2.38623 10.9008Z" fill="#F7FAFF"/>
+<path d="M2.38623 10.9008C2.38623 12.0768 2.61796 13.2414 3.0682 14.3279C3.51843 15.4144 4.17835 16.4017 5.01027 17.2333C5.84219 18.0649 6.82982 18.7245 7.91678 19.1746C9.00374 19.6246 10.1687 19.8563 11.3453 19.8563C12.5218 19.8563 13.6868 19.6246 14.7737 19.1746C15.8607 18.7245 16.8483 18.0649 17.6802 17.2333C18.5122 16.4017 19.1721 15.4144 19.6223 14.3279C20.0725 13.2414 20.3043 12.0768 20.3043 10.9008C20.3043 8.52566 19.3604 6.24779 17.6802 4.56831C16.0001 2.88883 13.7213 1.94531 11.3453 1.94531C8.96917 1.94531 6.69041 2.88883 5.01027 4.56831C3.33012 6.24779 2.38623 8.52566 2.38623 10.9008Z" fill="#3681FC"/>
+<path d="M5.6427 11.4946L13.5813 8.28714C13.6979 8.24001 13.8299 8.29657 13.877 8.41205L17.1895 17.046C17.2366 17.1627 17.1801 17.2947 17.0646 17.3418L9.12601 20.5493C9.00935 20.5964 8.87738 20.5398 8.83024 20.4244L5.51662 11.7904C5.46949 11.6737 5.52605 11.5418 5.6427 11.4946Z" fill="#E7E7E7"/>
+<path d="M6.09808 10.5573L14.0365 7.34986C14.0642 7.33874 14.0937 7.33319 14.1235 7.33351C14.1533 7.33383 14.1828 7.34002 14.2101 7.35174C14.2375 7.36345 14.2624 7.38045 14.2832 7.40176C14.304 7.42307 14.3204 7.44828 14.3315 7.47594L17.644 16.1104C17.6552 16.1379 17.6608 16.1674 17.6605 16.1971C17.6603 16.2268 17.6542 16.2562 17.6426 16.2836C17.631 16.3109 17.6141 16.3357 17.5929 16.3566C17.5718 16.3774 17.5467 16.3938 17.5191 16.405L9.58044 19.6122C9.5528 19.6233 9.52324 19.6289 9.49345 19.6286C9.46365 19.6283 9.43422 19.6221 9.40682 19.6104C9.37943 19.5986 9.35461 19.5816 9.33379 19.5603C9.31297 19.539 9.29656 19.5138 9.2855 19.4861L5.97306 10.8518C5.96191 10.8243 5.9563 10.7948 5.95655 10.7651C5.9568 10.7354 5.96289 10.706 5.97449 10.6786C5.98609 10.6513 6.00296 10.6265 6.02415 10.6057C6.04533 10.5848 6.07053 10.5685 6.09808 10.5573Z" fill="white"/>
+<path d="M9.71794 10.6019L13.2413 9.17842C13.2857 9.16149 13.335 9.16264 13.3785 9.18162C13.4221 9.20061 13.4565 9.23592 13.4743 9.27997C13.4921 9.32401 13.4919 9.37329 13.4738 9.41721C13.4556 9.46112 13.421 9.49618 13.3773 9.51485L9.85404 10.9384C9.83194 10.9473 9.8083 10.9518 9.78447 10.9516C9.76064 10.9514 9.73708 10.9465 9.71514 10.9372C9.6932 10.9279 9.67331 10.9144 9.65661 10.8974C9.6399 10.8804 9.62671 10.8602 9.61778 10.8381C9.60885 10.816 9.60436 10.7924 9.60457 10.7686C9.60478 10.7447 9.60968 10.7212 9.61899 10.6992C9.6283 10.6773 9.64184 10.6574 9.65884 10.6407C9.67584 10.624 9.69596 10.6108 9.71806 10.6019H9.71794ZM9.98837 11.325L11.8349 10.5791C11.8792 10.5622 11.9285 10.5633 11.9721 10.5823C12.0156 10.6013 12.05 10.6366 12.0678 10.6807C12.0856 10.7247 12.0854 10.774 12.0673 10.8179C12.0492 10.8618 12.0145 10.8969 11.9708 10.9156L10.1244 11.6615C10.08 11.6781 10.031 11.6767 9.98762 11.6577C9.94429 11.6386 9.91011 11.6034 9.89238 11.5595C9.87465 11.5156 9.87478 11.4665 9.89274 11.4227C9.91069 11.3789 9.94505 11.3439 9.98849 11.325H9.98837ZM7.71109 11.0201L8.35129 10.7613C8.42489 10.7315 8.50363 10.7166 8.58302 10.7173C8.66241 10.7179 8.74088 10.7343 8.81396 10.7653C8.88704 10.7963 8.95329 10.8414 9.00892 10.8981C9.06456 10.9547 9.10848 11.0217 9.13819 11.0954L9.39649 11.7345C9.42625 11.8081 9.44122 11.8869 9.44054 11.9662C9.43986 12.0456 9.42354 12.1241 9.39252 12.1972C9.36149 12.2703 9.31637 12.3365 9.25973 12.3921C9.20309 12.4478 9.13605 12.4917 9.06242 12.5214L8.42222 12.7801C8.34873 12.8099 8.27007 12.825 8.19073 12.8245C8.1114 12.8239 8.03296 12.8077 7.9599 12.7768C7.88685 12.7458 7.8206 12.7008 7.76497 12.6443C7.70933 12.5877 7.66539 12.5207 7.63567 12.4472L7.37749 11.808C7.31728 11.6593 7.31858 11.4928 7.38111 11.345C7.44364 11.1973 7.56229 11.0804 7.71097 11.0201H7.71109Z" fill="#E7E7E7"/>
+<path d="M8.50487 11.9268C8.54022 11.9418 8.57675 11.941 8.60939 11.9278C8.62593 11.9212 8.64097 11.9113 8.6536 11.8988C8.66624 11.8863 8.67621 11.8713 8.68292 11.8548L9.05799 10.9713C9.0708 10.9384 9.07029 10.9017 9.05656 10.8692C9.04282 10.8366 9.01695 10.8107 8.98443 10.7969C8.9519 10.7831 8.91528 10.7825 8.88233 10.7953C8.84938 10.808 8.8227 10.8331 8.80794 10.8652L8.48672 11.6241L8.08066 11.4525C8.04774 11.4397 8.01111 11.4402 7.97856 11.454C7.94601 11.4677 7.92009 11.4936 7.90629 11.5261C7.8925 11.5586 7.89192 11.5952 7.90467 11.6282C7.91742 11.6611 7.94251 11.6878 7.97461 11.7026L8.50487 11.9268Z" fill="white"/>
+<path d="M10.7136 13.0444L14.2369 11.6208C14.2814 11.6035 14.3309 11.6043 14.3748 11.6232C14.4186 11.6421 14.4533 11.6775 14.4712 11.7218C14.4891 11.7661 14.4888 11.8156 14.4705 11.8597C14.4521 11.9038 14.4171 11.9388 14.373 11.9573L10.8495 13.3809C10.8051 13.3979 10.7559 13.3967 10.7123 13.3778C10.6688 13.3588 10.6344 13.3235 10.6166 13.2794C10.5988 13.2354 10.599 13.1861 10.6171 13.1422C10.6352 13.0983 10.6698 13.0632 10.7135 13.0445L10.7136 13.0444ZM10.9841 13.7674L12.8306 13.0216C12.8749 13.0049 12.924 13.0063 12.9673 13.0253C13.0106 13.0444 13.0448 13.0796 13.0625 13.1235C13.0803 13.1674 13.0801 13.2165 13.0622 13.2603C13.0442 13.3041 13.0099 13.3391 12.9664 13.358L11.1201 14.104C11.0754 14.122 11.0255 14.1216 10.9812 14.1028C10.9369 14.084 10.9018 14.0483 10.8838 14.0037C10.8658 13.9591 10.8662 13.9091 10.885 13.8648C10.9038 13.8205 10.9395 13.7855 10.9841 13.7674ZM8.70668 13.4625L9.34699 13.2038C9.42059 13.1741 9.49932 13.1591 9.57871 13.1598C9.65809 13.1604 9.73656 13.1768 9.80964 13.2078C9.88272 13.2388 9.94897 13.2839 10.0046 13.3405C10.0602 13.3971 10.1042 13.4642 10.1339 13.5378L10.3921 14.177C10.4218 14.2506 10.4368 14.3294 10.4361 14.4088C10.4354 14.4882 10.4191 14.5666 10.3881 14.6397C10.3571 14.7128 10.312 14.779 10.2553 14.8347C10.1987 14.8903 10.1316 14.9342 10.058 14.9639L9.41781 15.2226C9.34432 15.2524 9.26566 15.2675 9.18633 15.2669C9.10701 15.2663 9.02858 15.2501 8.95554 15.2192C8.88249 15.1883 8.81626 15.1432 8.76064 15.0867C8.70501 15.0301 8.66109 14.9631 8.63138 14.8896L8.37308 14.2505C8.31287 14.1017 8.31419 13.9352 8.37674 13.7874C8.4393 13.6396 8.55797 13.5228 8.70668 13.4625Z" fill="#E7E7E7"/>
+<path d="M9.49917 14.3688C9.5344 14.3837 9.57093 14.3829 9.60369 14.3697C9.63645 14.3565 9.66331 14.3316 9.67722 14.2969L10.0522 13.4132C10.0645 13.3804 10.0637 13.3441 10.0499 13.3119C10.0361 13.2796 10.0104 13.254 9.97809 13.2403C9.94581 13.2266 9.90949 13.2259 9.87671 13.2384C9.84394 13.2508 9.81725 13.2755 9.80224 13.3072L9.48102 14.066L9.07602 13.8941C9.0431 13.8813 9.00648 13.8818 8.97392 13.8956C8.94137 13.9093 8.91545 13.9352 8.90165 13.9677C8.88786 14.0002 8.88728 14.0368 8.90003 14.0698C8.91278 14.1027 8.93787 14.1294 8.96997 14.1442L9.49905 14.3688H9.49917Z" fill="white"/>
+<path d="M11.7089 15.4876L15.2324 14.064C15.2545 14.0551 15.2782 14.0506 15.302 14.0508C15.3258 14.051 15.3494 14.0559 15.3713 14.0652C15.3933 14.0745 15.4132 14.0881 15.4299 14.1051C15.4466 14.1221 15.4598 14.1422 15.4687 14.1643C15.4776 14.1864 15.4821 14.21 15.4819 14.2338C15.4817 14.2577 15.4768 14.2812 15.4675 14.3032C15.4582 14.3251 15.4446 14.345 15.4276 14.3617C15.4106 14.3784 15.3905 14.3916 15.3684 14.4005L11.8449 15.824C11.8005 15.8409 11.7513 15.8398 11.7077 15.8208C11.6642 15.8018 11.6298 15.7665 11.612 15.7224C11.5942 15.6784 11.5944 15.6291 11.6125 15.5852C11.6306 15.5413 11.6652 15.5062 11.7089 15.4876ZM11.9796 16.2107L13.826 15.4647C13.8706 15.4467 13.9206 15.4471 13.9649 15.4659C14.0092 15.4847 14.0442 15.5204 14.0622 15.565C14.0803 15.6096 14.0798 15.6596 14.061 15.7039C14.0422 15.7482 14.0066 15.7832 13.9619 15.8012L12.1155 16.5471C12.0711 16.5641 12.0218 16.5629 11.9783 16.5439C11.9347 16.525 11.9003 16.4896 11.8825 16.4456C11.8647 16.4016 11.8649 16.3523 11.883 16.3084C11.9012 16.2644 11.9358 16.2294 11.9795 16.2107H11.9796ZM9.70208 15.9058L10.3424 15.647C10.416 15.6172 10.4947 15.6023 10.5741 15.6029C10.6535 15.6036 10.732 15.6199 10.8051 15.651C10.8782 15.682 10.9444 15.7271 11 15.7838C11.0557 15.8404 11.0996 15.9074 11.1293 15.9811L11.3875 16.6202C11.4172 16.6938 11.4322 16.7725 11.4315 16.8519C11.4309 16.9313 11.4146 17.0098 11.3836 17.0828C11.3525 17.1559 11.3074 17.2222 11.2508 17.2778C11.1942 17.3335 11.1271 17.3774 11.0535 17.4071L10.4132 17.6658C10.3397 17.6956 10.2611 17.7107 10.1818 17.7101C10.1024 17.7095 10.024 17.6933 9.95097 17.6624C9.87792 17.6315 9.81169 17.5865 9.75606 17.5299C9.70044 17.4734 9.6565 17.4064 9.62678 17.3329L9.36849 16.6937C9.30824 16.545 9.30954 16.3784 9.37209 16.2306C9.43465 16.0828 9.55335 15.9659 9.70208 15.9056V15.9058Z" fill="#E7E7E7"/>
+<path d="M10.4947 16.8115C10.53 16.8264 10.5665 16.8256 10.5993 16.8124C10.6158 16.8058 10.6309 16.796 10.6435 16.7834C10.6561 16.7709 10.6661 16.7559 10.6728 16.7395L11.0479 15.8559C11.061 15.823 11.0607 15.7862 11.047 15.7534C11.0333 15.7207 11.0074 15.6946 10.9747 15.6807C10.9421 15.6669 10.9053 15.6663 10.8722 15.6792C10.8392 15.6921 10.8125 15.7174 10.7978 15.7498L10.4766 16.5086L10.0716 16.3367C10.0387 16.3239 10.0021 16.3244 9.96953 16.3381C9.93698 16.3519 9.91105 16.3777 9.89726 16.4103C9.88346 16.4428 9.88288 16.4794 9.89564 16.5123C9.90839 16.5453 9.93348 16.572 9.96557 16.5867L10.4947 16.8115Z" fill="white"/>
+<path d="M4.50902 4.61806L5.68351 5.09259C5.79211 5.13938 5.87809 5.22681 5.92305 5.33618C5.96801 5.44555 5.96838 5.56817 5.92408 5.67781C5.87978 5.78745 5.79434 5.8754 5.68602 5.92284C5.5777 5.97028 5.45512 5.97345 5.3445 5.93167L4.17001 5.45714C4.06141 5.41036 3.97543 5.32292 3.93047 5.21355C3.88551 5.10418 3.88514 4.98156 3.92944 4.87192C3.97374 4.76228 4.05919 4.67433 4.1675 4.62689C4.27582 4.57945 4.3984 4.57628 4.50902 4.61806Z" fill="#DBE0E9"/>
+<path d="M8.9059 4.00339C7.56206 3.46044 6.0316 4.10918 5.48866 5.45301C4.94571 6.79685 5.59489 8.32622 6.93982 8.86961C8.28475 9.41299 9.81412 8.76381 10.3571 7.41998C10.8989 6.0757 10.2497 4.54633 8.9059 4.00339ZM8.73595 4.42402C9.84817 4.87338 10.3854 6.13891 9.93643 7.25003C9.48751 8.36115 8.22198 8.89834 7.10977 8.44897C5.99755 7.99961 5.46037 6.73408 5.90929 5.62296C6.35821 4.51184 7.62374 3.97465 8.73595 4.42402Z" fill="#DBE0E9"/>
+<path d="M8.71738 4.47004C8.19552 4.25919 7.61132 4.26418 7.0933 4.4839C6.57528 4.70361 6.16588 5.12006 5.95515 5.64164C5.74442 6.16321 5.74963 6.74718 5.96963 7.26507C6.18964 7.78297 6.60641 8.19238 7.12828 8.40322C7.65014 8.61407 8.23434 8.60908 8.75236 8.38937C9.27038 8.16965 9.67978 7.7532 9.89051 7.23163C10.1012 6.71005 10.096 6.12609 9.87603 5.60819C9.65602 5.09029 9.23925 4.68089 8.71738 4.47004Z" fill="#DBE0E9"/>
+<path d="M4.74535 4.14639L5.91984 4.62091C6.02844 4.6677 6.11442 4.75513 6.15938 4.8645C6.20434 4.97387 6.20471 5.09649 6.16041 5.20613C6.11611 5.31577 6.03066 5.40372 5.92235 5.45116C5.81403 5.49861 5.69145 5.50177 5.58083 5.45999L4.40634 4.98546C4.29774 4.93868 4.21176 4.85125 4.1668 4.74188C4.12184 4.63251 4.12147 4.50988 4.16577 4.40024C4.21007 4.2906 4.29551 4.20265 4.40383 4.15521C4.51214 4.10777 4.63473 4.1046 4.74535 4.14639Z" fill="white"/>
+<path d="M9.14223 3.53171C7.79839 2.98876 6.26793 3.6375 5.72499 4.98133C5.18204 6.32517 5.83122 7.85454 7.17615 8.39793C8.52108 8.94131 10.0504 8.29213 10.5934 6.9483C11.1352 5.60402 10.4861 4.07465 9.14223 3.53171ZM8.97228 3.95234C10.0845 4.4017 10.6217 5.66723 10.1728 6.77835C9.72384 7.88948 8.45831 8.42666 7.3461 7.97729C6.23388 7.52793 5.6967 6.2624 6.14562 5.15128C6.59454 4.04016 7.86007 3.50297 8.97228 3.95234Z" fill="white"/>
+<path d="M8.95176 3.99836C8.69336 3.89396 8.41694 3.84145 8.13828 3.84383C7.85962 3.8462 7.58418 3.90342 7.32768 4.01222C7.07118 4.12101 6.83865 4.27924 6.64337 4.47789C6.44808 4.67654 6.29386 4.9117 6.18952 5.16996C6.08518 5.42821 6.03276 5.7045 6.03524 5.98305C6.03773 6.2616 6.09507 6.53696 6.20401 6.79339C6.31294 7.04983 6.47133 7.28233 6.67013 7.47761C6.86893 7.6729 7.10425 7.82714 7.36265 7.93154C7.62105 8.03594 7.89747 8.08845 8.17613 8.08608C8.45479 8.0837 8.73024 8.02648 8.98673 7.91769C9.24323 7.8089 9.47576 7.65066 9.67105 7.45201C9.86633 7.25337 10.0205 7.0182 10.1249 6.75995C10.2292 6.50169 10.2817 6.2254 10.2792 5.94685C10.2767 5.6683 10.2193 5.39295 10.1104 5.13651C10.0015 4.88007 9.84308 4.64757 9.64428 4.45229C9.44548 4.25701 9.21016 4.10276 8.95176 3.99836Z" fill="#E0EAFB"/>
+<path d="M13.5427 5.4766C13.6289 5.39635 13.7434 5.35358 13.8612 5.35769C13.9789 5.3618 14.0901 5.41245 14.1705 5.49852L14.4735 5.82339C14.5537 5.9096 14.5965 6.02413 14.5924 6.14184C14.5883 6.25955 14.5376 6.37082 14.4516 6.45122C14.3654 6.53147 14.2508 6.57424 14.1331 6.57013C14.0154 6.56602 13.9041 6.51537 13.8237 6.4293L13.5208 6.10443C13.4405 6.01822 13.3978 5.90369 13.4019 5.78598C13.406 5.66827 13.4566 5.557 13.5427 5.4766Z" fill="#DBE0E9"/>
+<path d="M17.3567 10.2182L18.0065 9.6123L18.5905 10.89L17.3567 10.2182Z" fill="#E7E7E7"/>
+<path d="M17.8616 10.7593L18.5114 10.1533L19.0954 11.431L17.8616 10.7593Z" fill="#E7E7E7"/>
+<path d="M13.6216 6.21296L14.2714 5.60693L18.0067 9.61263L17.357 10.2185L13.6216 6.21296Z" fill="#E7E7E7"/>
+<path d="M13.4248 5.00544C13.6041 4.83829 13.8855 4.84812 14.0527 5.02737L14.3557 5.35227C14.5228 5.53152 14.513 5.81298 14.3337 5.98013C14.1545 6.14729 13.873 6.13746 13.7059 5.95821L13.4029 5.63331C13.2357 5.45406 13.2456 5.1726 13.4248 5.00544Z" fill="#FF6363"/>
+<path d="M12.8982 5.09187C13.0775 4.92471 13.3589 4.93454 13.5261 5.1138L13.8291 5.43869C13.9962 5.61794 13.9864 5.8994 13.8071 6.06656C13.6279 6.23371 13.3464 6.22389 13.1793 6.04463L12.8763 5.71974C12.7091 5.54048 12.719 5.25903 12.8982 5.09187Z" fill="#FF4D4D"/>
+<path d="M17.239 9.74705L17.8888 9.14111L18.4728 10.4188L17.239 9.74705Z" fill="#FFEAB8"/>
+<path d="M17.7437 10.2881L18.3934 9.68213L18.9775 10.9598L17.7437 10.2881Z" fill="#6A6A6A"/>
+<path d="M17.239 9.74682L17.5639 9.44385L18.4728 10.4185L17.239 9.74682Z" fill="#F2C36C"/>
+<path d="M17.7437 10.2881L18.3934 9.68213L18.9775 10.9598L17.7437 10.2881Z" fill="#64583E"/>
+<path d="M13.5037 5.74119L14.1535 5.13525L17.8888 9.14087L17.239 9.74681L13.5037 5.74119Z" fill="#FFD87A"/>
+<path d="M13.1787 6.04442L13.8285 5.43848L17.5638 9.44409L16.914 10.05L13.1787 6.04442Z" fill="#FFCB4F"/>
+</svg>

+ 3 - 0
src/assets/icon/course/setting2.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.69636 2.3999C8.53916 2.3999 9.34745 2.71597 9.9434 3.27858C10.5394 3.84119 10.8742 4.60425 10.8742 5.3999V6.5999H12.1982C12.3957 6.59991 12.5861 6.66936 12.7323 6.79471C12.8785 6.92006 12.97 7.09232 12.989 7.2779L12.9927 7.3499V7.5999C12.9925 7.72734 12.9409 7.84992 12.8482 7.94259C12.7555 8.03525 12.6289 8.09102 12.4941 8.09849C12.3593 8.10596 12.2266 8.06457 12.1231 7.98277C12.0196 7.90098 11.9531 7.78495 11.9371 7.6584L11.9334 7.5999H3.45929V12.5999H7.16937C7.2991 12.5999 7.42431 12.6449 7.52125 12.7263C7.61819 12.8076 7.68012 12.9198 7.6953 13.0414L7.69901 13.0999C7.69899 13.2224 7.65136 13.3406 7.56516 13.4321C7.47896 13.5236 7.36017 13.5821 7.23134 13.5964L7.16937 13.5999H3.19447C2.99698 13.5999 2.80658 13.5304 2.66038 13.4051C2.51419 13.2797 2.42269 13.1075 2.40373 12.9219L2.40002 12.8499V7.3499C2.40003 7.16346 2.4736 6.98371 2.60638 6.84569C2.73916 6.70768 2.92163 6.6213 3.11821 6.6034L3.19447 6.5999H4.51856V5.3999C4.51853 4.62371 4.83717 3.87772 5.40753 3.31867C5.97789 2.75961 6.75558 2.43101 7.57719 2.4019L7.69636 2.3999ZM7.69636 3.3999C7.13449 3.3999 6.59563 3.61062 6.19833 3.98569C5.80103 4.36076 5.57783 4.86947 5.57783 5.3999V6.5999H9.81489V5.3999C9.81489 4.88678 9.60599 4.39329 9.23138 4.0215C8.85678 3.6497 8.34514 3.42806 7.80229 3.4024L7.69636 3.3999ZM9.81516 11.1C9.81516 11.2989 9.89886 11.4897 10.0478 11.6303C10.1968 11.771 10.3989 11.85 10.6096 11.85C10.8203 11.85 11.0224 11.771 11.1714 11.6303C11.3204 11.4897 11.4041 11.2989 11.4041 11.1C11.4041 10.9011 11.3204 10.7103 11.1714 10.5697C11.0224 10.429 10.8203 10.35 10.6096 10.35C10.3989 10.35 10.1968 10.429 10.0478 10.5697C9.89886 10.7103 9.81516 10.9011 9.81516 11.1ZM9.10781 8.6H12.1108L13.6002 11.1L12.1108 13.6H9.10781L7.61848 11.1L9.10781 8.6ZM12.3847 11.1L11.4912 9.6H9.72695L8.83346 11.1L9.72748 12.6H11.4906L12.3847 11.1Z" fill="black" fill-opacity="0.9"/>
+</svg>

二进制
src/assets/icon/course/start2.png


+ 9 - 0
src/assets/icon/newIcons/Brootper.svg

@@ -0,0 +1,9 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7.25 6.25C7.25 6.66422 6.91422 7 6.5 7C6.08578 7 5.75 6.66422 5.75 6.25C5.75 5.83578 6.08578 5.5 6.5 5.5C6.91422 5.5 7.25 5.83578 7.25 6.25Z" fill="#3681FC"/>
+<path d="M9.5 7C9.91422 7 10.25 6.66422 10.25 6.25C10.25 5.83578 9.91422 5.5 9.5 5.5C9.08578 5.5 8.75 5.83578 8.75 6.25C8.75 6.66422 9.08578 7 9.5 7Z" fill="#3681FC"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.5 2.5C8.5 2.22386 8.27614 2 8 2C7.72386 2 7.5 2.22386 7.5 2.5V3H4.5C4.22386 3 4 3.22386 4 3.5V9.5C4 9.77614 4.22386 10 4.5 10H6.5V10.5H3C2.72386 10.5 2.5 10.7239 2.5 11V13.5C2.5 13.7761 2.72386 14 3 14H12.5C12.7761 14 13 13.7761 13 13.5V11C13 10.7239 12.7761 10.5 12.5 10.5H9.5V10H11.5C11.7761 10 12 9.77614 12 9.5V3.5C12 3.22386 11.7761 3 11.5 3H8.5V2.5ZM7 11.5C7.27614 11.5 7.5 11.2761 7.5 11V10H8.5V11C8.5 11.2761 8.72386 11.5 9 11.5H12V13H3.5V11.5H7ZM5 9V4H11V9H5Z" fill="#3681FC"/>
+<path d="M3 4.5C3.27614 4.5 3.5 4.72386 3.5 5V8C3.5 8.27614 3.27614 8.5 3 8.5C2.72386 8.5 2.5 8.27614 2.5 8V5C2.5 4.72386 2.72386 4.5 3 4.5Z" fill="#3681FC"/>
+<path d="M1.5 5.5C1.77614 5.5 2 5.72386 2 6V7C2 7.27614 1.77614 7.5 1.5 7.5C1.22386 7.5 1 7.27614 1 7V6C1 5.72386 1.22386 5.5 1.5 5.5Z" fill="#3681FC"/>
+<path d="M14.5 5.5C14.7761 5.5 15 5.72386 15 6V7C15 7.27614 14.7761 7.5 14.5 7.5C14.2239 7.5 14 7.27614 14 7V6C14 5.72386 14.2239 5.5 14.5 5.5Z" fill="#3681FC"/>
+<path d="M13.5 5C13.5 4.72386 13.2761 4.5 13 4.5C12.7239 4.5 12.5 4.72386 12.5 5V8C12.5 8.27614 12.7239 8.5 13 8.5C13.2761 8.5 13.5 8.27614 13.5 8V5Z" fill="#3681FC"/>
+</svg>

二进制
src/assets/icon/newIcons/blueRoot.png


二进制
src/assets/icon/newIcons/commG.png


二进制
src/assets/icon/newIcons/fullScreen.png


二进制
src/assets/icon/newIcons/likeG.png


+ 756 - 78
src/components/classRoomHelper/component/AnnotationCanvas.vue

@@ -8,11 +8,40 @@
 					@mousedown="handleMouseDown"
 					@mousemove="handleMouseMove"
 					@mouseup="handleMouseUp"
-					@mouseleave="handleMouseUp"
 					@touchstart="handleTouchStart"
 					@touchmove="handleTouchMove"
 					@touchend="handleTouchEnd"
 				></canvas>
+
+				<canvas
+					ref="canvas2"
+					class="drawing-canvas"
+					v-show="showCanvas2"
+					@mousedown="handleMouseDown"
+					@mousemove="handleMouseMove"
+					@mouseup="handleMouseUp"
+					@touchstart="handleTouchStart"
+					@touchmove="handleTouchMove"
+					@touchend="handleTouchEnd"
+				></canvas>
+
+				<!-- <canvas
+					ref="canvas3"
+					class="drawing-canvas screenshotCanvas"
+					v-show="mode==='screenshot'"
+					@mousedown="screenshotMouseDown"
+					@mousemove="screenshotMouseMove"
+					@mouseup="screenshotMouseUp"
+					@touchstart="screenshotTouchStart"
+					@touchmove="screenshotTouchMove"
+					@touchend="screenshotTouchEnd"
+				></canvas>
+
+				<div class="screenshotBox" v-show="showCanvas4">
+					<canvas ref="canvas4" :style="`position:absolute;left:${startX}px;top:${startY}px`">
+
+					</canvas>
+				</div> -->
 			</el-col>
 		</el-row>
 		<el-row
@@ -28,12 +57,21 @@
 						:class="{ active: mode === 'draw' }"
 						>画笔</el-button
 					> -->
-					<el-tooltip class="item" effect="light" content="画笔" placement="top">
+					<el-tooltip
+						class="item"
+						effect="light"
+						content="画笔"
+						placement="top"
+					>
 						<svg
 							width="24"
 							height="24"
 							viewBox="0 0 24 24"
-							:style="mode === 'draw' ? `background-color:${brushColor}` : ''"
+							:style="
+								mode === 'draw' && canDraw
+									? `background-color:${brushColor}`
+									: ''
+							"
 							fill="none"
 							xmlns="http://www.w3.org/2000/svg"
 							@click.stop="setMode('draw')"
@@ -42,13 +80,25 @@
 								fill-rule="evenodd"
 								clip-rule="evenodd"
 								d="M12 6.75C12.2508 6.75 12.4849 6.87533 12.624 7.08397L15.624 11.584C15.7062 11.7072 15.75 11.8519 15.75 12V21C15.75 21.4142 15.4142 21.75 15 21.75C14.5858 21.75 14.25 21.4142 14.25 21V12.75H9.75V21C9.75 21.4142 9.41421 21.75 9 21.75C8.58579 21.75 8.25 21.4142 8.25 21V12C8.25 11.8519 8.29383 11.7072 8.37596 11.584L11.376 7.08397C11.5151 6.87533 11.7492 6.75 12 6.75ZM10.4014 11.25H13.5986L12 8.85208L10.4014 11.25Z"
-								:fill="mode === 'draw' ? brushColor==='#FFFFFF'?'black':'#fff' : '#3681FC'"
+								:fill="
+									mode === 'draw' && canDraw
+										? brushColor === '#FFFFFF'
+											? 'black'
+											: '#fff'
+										: '#3681FC'
+								"
 							/>
 							<path
 								fill-rule="evenodd"
 								clip-rule="evenodd"
 								d="M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21ZM12 22.5C17.799 22.5 22.5 17.799 22.5 12C22.5 6.20101 17.799 1.5 12 1.5C6.20101 1.5 1.5 6.20101 1.5 12C1.5 17.799 6.20101 22.5 12 22.5Z"
-								:fill="mode === 'draw' ? brushColor==='#FFFFFF'?'black':'#fff' : 'black'"
+								:fill="
+									mode === 'draw' && canDraw
+										? brushColor === '#FFFFFF'
+											? 'black'
+											: '#fff'
+										: 'black'
+								"
 								fill-opacity="0.9"
 							/>
 						</svg>
@@ -57,7 +107,7 @@
 					<el-tooltip
 						class="item"
 						effect="light"
-						content="切换颜色"
+						content="切换颜色与大小"
 						placement="top"
 					>
 						<el-button
@@ -68,8 +118,15 @@
 							"
 						></el-button>
 					</el-tooltip>
-					<div class="brushBtn_colorBox" v-if="openBrushColorBox">
-						<span
+					<div class="brushBtn_colorBox" v-if="openBrushColorBox"  v-click-outside="handleBlur">
+						<div class="bb_cb_drawSize">
+							<div>大小</div>
+							<el-slider v-model="drawSize" :min="1" :max="20"></el-slider>
+							<div>颜色</div>
+						</div>
+						<div class="bb_cb_drawColor">
+							
+							<span
 							v-for="(item, index) in colorList"
 							:key="index"
 							:style="`background-color: ${item};${
@@ -77,24 +134,217 @@
 							}`"
 							@click="setColor(item)"
 						></span>
+						</div>
+						
 					</div>
 				</div>
-
-				<!-- <div>
-					<el-slider
-						v-model="brushSize"
-						:min="1"
-						:max="100"
-						style="width: 100px"
-					></el-slider>
-				</div> -->
-
 				<!-- <div>
 					<el-color-picker
 						v-model="brushColor"
 						@active-change="setColor"
 					></el-color-picker>
 				</div> -->
+<!-- 
+				<div>
+					<el-slider v-model="drawSize" :min="1" :max="20" style="width: 100px;"></el-slider>
+				</div> -->
+
+				<div class="shape">
+					<div
+						:class="[
+							['line', 'circle', 'arrow', 'rect'].includes(shape) && canShape
+								? 'shapeActive'
+								: '',
+						]"
+						@click.stop="setShape('open')"
+					>
+						<svg
+							v-if="shape === 'line'"
+							t="1723428738446"
+							class="icon"
+							viewBox="0 0 1024 1024"
+							version="1.1"
+							xmlns="http://www.w3.org/2000/svg"
+							p-id="5383"
+							width="200"
+							height="200"
+							fill="black"
+						>
+							<path
+								d="M195.584 866.816l-38.4-38.4c-12.288-12.288-12.288-31.744 0-43.52L784.384 157.184c12.288-12.288 31.744-12.288 43.52 0l38.4 38.4c12.288 12.288 12.288 31.744 0 43.52L239.104 866.816c-11.776 12.288-31.232 12.288-43.52 0z"
+								p-id="5384"
+							></path>
+						</svg>
+						<svg
+							v-else-if="shape === 'circle'"
+							t="1723428969048"
+							class="icon"
+							viewBox="0 0 1024 1024"
+							version="1.1"
+							xmlns="http://www.w3.org/2000/svg"
+							p-id="6395"
+							width="200"
+							height="200"
+							fill="black"
+						>
+							<path
+								d="M512 928C282.624 928 96 741.376 96 512S282.624 96 512 96s416 186.624 416 416-186.624 416-416 416z m0-768C317.92 160 160 317.92 160 512s157.92 352 352 352 352-157.92 352-352S706.08 160 512 160z"
+								p-id="6396"
+							></path>
+						</svg>
+						<svg
+							v-else-if="shape === 'arrow'"
+							t="1723429061277"
+							class="icon"
+							viewBox="0 0 1024 1024"
+							version="1.1"
+							xmlns="http://www.w3.org/2000/svg"
+							p-id="7359"
+							width="200"
+							height="200"
+						>
+							<path
+								d="M708.864 343.872l4.48 3.84 146.112 146.176a25.6 25.6 0 0 1 0 36.224l-146.112 146.112a40 40 0 0 1-60.416-52.032l3.84-4.48 67.584-67.712H168a40 40 0 1 1 0-80h556.48l-67.712-67.648a40 40 0 0 1-3.84-52.096l3.84-4.48a40 40 0 0 1 52.096-3.84z"
+								p-id="7360"
+							></path>
+						</svg>
+						<svg
+							v-else
+							t="1723428698910"
+							class="icon"
+							viewBox="0 0 1024 1024"
+							version="1.1"
+							xmlns="http://www.w3.org/2000/svg"
+							p-id="4240"
+							width="200"
+							height="200"
+							fill="black"
+						>
+							<path
+								d="M864 896H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h704a32 32 0 0 1 32 32v704a32 32 0 0 1-32 32zM192 832h640V192H192v640z"
+								p-id="4241"
+							></path>
+						</svg>
+					</div>
+					<el-tooltip
+						class="item"
+						effect="light"
+						content="切换形状"
+						placement="top"
+					>
+						<el-button
+							class="selectBox"
+							@click.stop="changeOpenShape(!openShapeBox)"
+							:icon="openShapeBox ? 'el-icon-arrow-down' : 'el-icon-arrow-up'"
+						></el-button>
+					</el-tooltip>
+					<div class="shapeBox" v-if="openShapeBox" v-click-outside="handleBlur">
+						<div
+							class="shapeItem"
+							:class="{ shapeItemActive: shape === 'line' }"
+							@click.stop="setShape('line')"
+						>
+							<svg
+								t="1723428738446"
+								class="icon"
+								viewBox="0 0 1024 1024"
+								version="1.1"
+								xmlns="http://www.w3.org/2000/svg"
+								p-id="5383"
+								width="200"
+								height="200"
+								fill="black"
+							>
+								<path
+									d="M195.584 866.816l-38.4-38.4c-12.288-12.288-12.288-31.744 0-43.52L784.384 157.184c12.288-12.288 31.744-12.288 43.52 0l38.4 38.4c12.288 12.288 12.288 31.744 0 43.52L239.104 866.816c-11.776 12.288-31.232 12.288-43.52 0z"
+									p-id="5384"
+								></path>
+							</svg>
+							<span>直线</span>
+						</div>
+						<div
+							class="shapeItem"
+							:class="{ shapeItemActive: shape === 'circle' }"
+							@click.stop="setShape('circle')"
+						>
+							<svg
+								t="1723428969048"
+								class="icon"
+								viewBox="0 0 1024 1024"
+								version="1.1"
+								xmlns="http://www.w3.org/2000/svg"
+								p-id="6395"
+								width="200"
+								height="200"
+								fill="black"
+							>
+								<path
+									d="M512 928C282.624 928 96 741.376 96 512S282.624 96 512 96s416 186.624 416 416-186.624 416-416 416z m0-768C317.92 160 160 317.92 160 512s157.92 352 352 352 352-157.92 352-352S706.08 160 512 160z"
+									p-id="6396"
+								></path>
+							</svg>
+							<span>圆形</span>
+						</div>
+						<div
+							class="shapeItem"
+							:class="{ shapeItemActive: shape === 'arrow' }"
+							@click.stop="setShape('arrow')"
+						>
+							<svg
+								t="1723429061277"
+								class="icon"
+								viewBox="0 0 1024 1024"
+								version="1.1"
+								xmlns="http://www.w3.org/2000/svg"
+								p-id="7359"
+								width="200"
+								height="200"
+							>
+								<path
+									d="M708.864 343.872l4.48 3.84 146.112 146.176a25.6 25.6 0 0 1 0 36.224l-146.112 146.112a40 40 0 0 1-60.416-52.032l3.84-4.48 67.584-67.712H168a40 40 0 1 1 0-80h556.48l-67.712-67.648a40 40 0 0 1-3.84-52.096l3.84-4.48a40 40 0 0 1 52.096-3.84z"
+									p-id="7360"
+								></path>
+							</svg>
+							<span>箭头</span>
+						</div>
+						<div
+							class="shapeItem"
+							:class="{ shapeItemActive: shape === 'rect' }"
+							@click.stop="setShape('rect')"
+						>
+							<svg
+								t="1723428698910"
+								class="icon"
+								viewBox="0 0 1024 1024"
+								version="1.1"
+								xmlns="http://www.w3.org/2000/svg"
+								p-id="4240"
+								width="200"
+								height="200"
+								fill="black"
+							>
+								<path
+									d="M864 896H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h704a32 32 0 0 1 32 32v704a32 32 0 0 1-32 32zM192 832h640V192H192v640z"
+									p-id="4241"
+								></path>
+							</svg>
+							<span>矩形</span>
+						</div>
+					</div>
+					<!-- <div class="brushBtn_colorBox" v-if="openShapeBox">
+						<span
+							v-for="(item, index) in colorList"
+							:key="index"
+							:style="`background-color: ${item};${
+								item === '#FFFFFF' ? 'border:solid 2px #E2E1E5' : ''
+							}`"
+							@click="setShapeColor(item)"
+						></span>
+						<div class="bb_cb_drawSize">
+							<el-slider v-model="shapeSize" :min="1" :max="20"></el-slider>
+						</div>
+					</div> -->
+				</div>
 
 				<div class="eraserBtn">
 					<el-tooltip
@@ -108,7 +358,7 @@
 							height="24"
 							viewBox="0 0 24 24"
 							fill="none"
-							:class="{ eraserBtnActive: mode === 'erase' }"
+							:class="{ eraserBtnActive: mode === 'erase' && canDraw }"
 							xmlns="http://www.w3.org/2000/svg"
 							@click.stop="setMode('erase')"
 						>
@@ -116,26 +366,63 @@
 								fill-rule="evenodd"
 								clip-rule="evenodd"
 								d="M13.6464 6.14645C13.8417 5.95118 14.1583 5.95118 14.3536 6.14645L17.8536 9.64645C18.0488 9.84171 18.0488 10.1583 17.8536 10.3536L11.2071 17H17.5V18H10C9.86739 18 9.74021 17.9473 9.64645 17.8536L6.14645 14.3536C5.95118 14.1583 5.95118 13.8417 6.14645 13.6464L13.6464 6.14645ZM10 16.7929L7.20711 14L9 12.2071L11.7929 15L10 16.7929ZM12.5 14.2929L16.7929 10L14 7.20711L9.70711 11.5L12.5 14.2929Z"
-								fill="black"
+								:fill="mode === 'erase' && canDraw ? '#fff' : 'black'"
 								fill-opacity="0.9"
 							/>
 						</svg>
+						
 					</el-tooltip>
-					<!-- <el-button
-						@click="setMode('erase')"
+					<el-tooltip
+						class="item"
+						effect="light"
+						content="选择大小"
+						placement="top"
+					>
+						<el-button
+							class="selectBox"
+							@click.stop="changeOpenEraser(!openEraserBox)"
+							:icon="openEraserBox ? 'el-icon-arrow-down' : 'el-icon-arrow-up'"
+						></el-button>
+					</el-tooltip>
+					<div class="eb_changeSize" v-if="openEraserBox"  v-click-outside="handleBlur">
+						<el-slider v-model="eraserSize" :min="5" :max="30" style="width: 150px;"></el-slider>
+					</div>
+				</div>
+
+				<!-- <el-button
+						@click="screenshot()"
 						icon="el-icon-connection"
-						:class="{ active: mode === 'erase' }"
-						>橡皮擦</el-button
+						:class="{ active: mode === 'screenshot' }"
+						>截图</el-button
 					> -->
-				</div>
-				<!-- <el-button @click="setMode('line')" :class="{ active: mode === 'line' }">直线</el-button>
-        <el-button @click="setMode('rect')" :class="{ active: mode === 'rect' }">矩形</el-button>
-        <el-button @click="setMode('circle')" :class="{ active: mode === 'circle' }">圆圈</el-button> -->
+
+				<!-- <el-button @click="setMode('line')" :class="{ active: mode === 'line' }"
+          >直线</el-button
+        >
+        <el-button @click="setMode('rect')" :class="{ active: mode === 'rect' }"
+          >矩形</el-button
+        >
+        <el-button
+          @click="setMode('circle')"
+          :class="{ active: mode === 'circle' }"
+          >圆圈</el-button
+        >
+
+        <el-button
+          @click="setMode('arrow')"
+          :class="{ active: mode === 'arrow' }"
+          >箭头</el-button
+        > -->
 				<div class="clearScreenBtn">
 					<!-- <el-button @click="clearCanvas" icon="el-icon-refresh-left"
 						>清空画布</el-button
 					> -->
-					<el-tooltip class="item" effect="light" content="清空" placement="top">
+					<el-tooltip
+						class="item"
+						effect="light"
+						content="清空"
+						placement="top"
+					>
 						<svg
 							width="24"
 							height="24"
@@ -258,20 +545,56 @@
 </template>
 
 <script>
-// import html2canvas from "html2canvas";
+import html2canvas from "html2canvas";
 import "element-ui/lib/theme-chalk/index.css";
-
+// 自定义指令,用于处理点击外部区域的事件
+const clickOutside = {
+  bind(el, binding) {
+    // 在元素上绑定一个点击事件监听器
+    el.clickOutsideEvent = function (event) {
+      // 检查点击事件是否发生在元素的内部
+      if (!(el === event.target || el.contains(event.target))) {
+        // 如果点击事件发生在元素的外部,则触发指令绑定的方法,将点击的event数据传过去
+        binding.value(event);
+      }
+    };
+    // 在文档上添加点击事件监听器
+    document.addEventListener("mousedown", el.clickOutsideEvent);
+  },
+  unbind(el) {
+    // 在元素上解除点击事件监听器
+    document.removeEventListener("mousedown", el.clickOutsideEvent);
+  },
+};
 export default {
 	emits: ["close"],
+	directives: {
+    "click-outside": clickOutside, // 注册自定义指令
+  },
 	data() {
 		return {
 			show: false,
 			showTool: false,
 			canvas: null,
+			showCanvas2: false,
+			showCanvas3: false,
+			showCanvas4: false,
+			canvas2: null,
+			ctx2: null,
+			// canvas3: null,
+			// ctx3: null,
+			// canvas4:null,
+			// ctx4:null,
 			ctx: null,
 			brushColor: "#000000",
-			brushSize: 5,
+			shapeColor:"#000000",
+			drawSize: 5,
+			shapeSize:5,
+			eraserSize:5,
 			mode: "draw",
+			canDraw: true,
+			canShape: false,
+			shape: "rect",
 			history: [],
 			historyStep: -1,
 			startX: 0,
@@ -280,6 +603,8 @@ export default {
 			tempShape: null,
 			tempCtx: null,
 			openBrushColorBox: false,
+			openShapeBox: false,
+			openEraserBox:false,
 			colorList: [
 				"#000000",
 				"#E2E1E5",
@@ -333,13 +658,70 @@ export default {
 		},
 		initCanvas() {
 			this.canvas = this.$refs.canvas;
+			this.canvas2 = this.$refs.canvas2;
+			// this.canvas3 = this.$refs.canvas3;
+			// this.canvas4 = this.$refs.canvas4;
+
 			this.ctx = this.canvas.getContext("2d");
+			this.ctx2 = this.canvas2.getContext("2d");
+			// this.ctx3 = this.canvas3.getContext("2d");
+			// this.ctx4 = this.canvas4.getContext("2d");
+
 			this.canvas.width = window.innerWidth;
 			this.canvas.height = window.innerHeight;
+
+			this.canvas2.width = window.innerWidth;
+			this.canvas2.height = window.innerHeight;
+
+			// this.canvas3.width = window.innerWidth;
+			// this.canvas3.height = window.innerHeight;
+
+			// this.canvas4.width = window.innerWidth;
+			// this.canvas4.height = window.innerHeight;
 			this.saveState();
 		},
-		setMode(mode) {
+		setMode(mode,type=true) {
+			this.openBrushColorBox = false;
+			this.openShapeBox = false;
+			this.openEraserBox = false;
+			if (this.mode == mode && this.canDraw && type) return (this.canDraw = false);
+			this.canDraw = true;
 			this.mode = mode;
+			this.canShape = false;
+			
+			// this.mode = mode;
+			// this.openShapeBox = false;
+			// if(this.mode==="screenshot"){
+			// 	this.ctx3.fillStyle = '#00000044';
+			// 	this.ctx3.fillRect(0, 0, this.canvas3.width, this.canvas3.height);
+			// }
+		},
+		setShape(shape) {
+			this.openBrushColorBox = false;
+			this.openShapeBox = false;
+			this.openEraserBox = false;
+			if (this.shape == shape && this.canShape) return (this.canShape = false);
+			if (shape === "open") {
+				if (this.canShape) this.canShape = false;
+				else this.canShape = true;
+				return (this.canDraw = false);
+			}
+
+			
+			this.canShape = true;
+			this.shape = shape;
+			this.canDraw = false;
+			
+		},
+		setShapeColor(newColor){
+			this.shapeColor = newColor;
+			this.openShapeColorBox = false;
+		},
+		changeOpenShape(newValue) {
+			this.openShapeBox = newValue;
+		},
+		changeOpenEraser(newValue){
+			this.openEraserBox = newValue
 		},
 		clearCanvas() {
 			this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
@@ -403,11 +785,16 @@ export default {
 				this.ctx.drawImage(img, 0, 0);
 			};
 		},
+		handleBlur(){
+			this.openEraserBox = false;
+			this.openShapeBox = false;
+			this.openBrushColorBox = false;
+		},
 		handleMouseDown(event) {
-			if (this.mode === "erase" || this.mode === "draw") {
+			if (["erase", "draw"].includes(this.mode) && this.canDraw) {
 				this.ctx.strokeStyle =
 					this.mode === "erase" ? "white" : this.brushColor;
-				this.ctx.lineWidth = this.brushSize;
+				this.ctx.lineWidth = this.mode=='draw'?this.drawSize:this.eraserSize;
 				this.ctx.lineCap = "round";
 				this.ctx.lineJoin = "round";
 				this.isDrawing = true;
@@ -416,68 +803,90 @@ export default {
 				this.startX = event.clientX - rect.left;
 				this.startY = event.clientY - rect.top;
 				this.ctx.moveTo(this.startX, this.startY);
-			} else if (["line", "rect", "circle"].includes(this.mode)) {
-				this.tempShape = document.createElement("canvas");
-				this.tempShape.width = this.canvas.width;
-				this.tempShape.height = this.canvas.height;
-				this.tempCtx = this.tempShape.getContext("2d");
-				this.tempCtx.strokeStyle = this.brushColor;
-				this.tempCtx.lineWidth = this.brushSize;
-				this.tempCtx.fillStyle = this.brushColor;
+			} else if (
+				["line", "rect", "circle", "arrow"].includes(this.shape) &&
+				this.canShape
+			) {
+				this.showCanvas2 = true;
+				// this.ctx2.strokeStyle = this.brushColor;
+				this.ctx2.strokeStyle = "#000000";
+
+				// this.ctx2.lineWidth = this.drawSize;
+				this.ctx2.lineWidth = 5;
+
+				// this.ctx2.fillStyle = this.brushColor;
+				this.ctx2.fillStyle = "#000000";
 				this.isDrawing = true;
-				const rect = this.canvas.getBoundingClientRect();
+				const rect = this.canvas2.getBoundingClientRect();
 				this.startX = event.clientX - rect.left;
 				this.startY = event.clientY - rect.top;
 			}
 		},
 		handleMouseMove(event) {
 			if (!this.isDrawing) return;
+
 			const rect = this.canvas.getBoundingClientRect();
 			const x = event.clientX - rect.left;
 			const y = event.clientY - rect.top;
-			// this.drawPreviewSize(x,y)
 
-			if (this.mode === "draw") {
+			if (this.mode === "draw" && this.canDraw) {
 				this.ctx.lineTo(x, y);
 				this.ctx.stroke();
-			} else if (this.mode === "erase") {
+			} else if (this.mode === "erase" && this.canDraw) {
 				this.ctx.beginPath();
 				this.ctx.clearRect(
-					x - this.brushSize / 2,
-					y - this.brushSize / 2,
-					this.brushSize * 2,
-					this.brushSize * 2
+					x - this.eraserSize / 2,
+					y - this.eraserSize / 2,
+					this.eraserSize * 3,
+					this.eraserSize * 3
 				);
-			} else if (this.tempShape) {
-				this.tempCtx.clearRect(
-					0,
-					0,
-					this.tempShape.width,
-					this.tempShape.height
-				);
-				if (this.mode === "line") {
-					this.tempCtx.beginPath();
-					this.tempCtx.moveTo(this.startX, this.startY);
-					this.tempCtx.lineTo(x, y);
-					this.tempCtx.stroke();
-				} else if (this.mode === "rect") {
-					this.tempCtx.strokeRect(
+			} else if (this.showCanvas2) {
+				// 清除临时画布上的内容
+				this.ctx2.clearRect(0, 0, this.canvas2.width, this.canvas2.height);
+
+				if (this.shape === "line" && this.canShape) {
+					this.ctx2.beginPath();
+					this.ctx2.moveTo(this.startX, this.startY);
+					this.ctx2.lineTo(x, y);
+					this.ctx2.stroke();
+				} else if (this.shape === "rect" && this.canShape) {
+					this.ctx2.strokeRect(
 						this.startX,
 						this.startY,
 						x - this.startX,
 						y - this.startY
 					);
-				} else if (this.mode === "circle") {
+				} else if (this.shape === "circle" && this.canShape) {
 					const radius = Math.sqrt(
 						Math.pow(x - this.startX, 2) + Math.pow(y - this.startY, 2)
 					);
-					this.tempCtx.beginPath();
-					this.tempCtx.arc(this.startX, this.startY, radius, 0, Math.PI * 2);
-					this.tempCtx.stroke();
+					this.ctx2.beginPath();
+					this.ctx2.arc(this.startX, this.startY, radius, 0, Math.PI * 2);
+					this.ctx2.stroke();
+				} else if (this.shape === "arrow" && this.canShape) {
+					// 计算箭头的角度
+					const headlen = 5 * 5; // 箭头的长度
+					const angle = Math.atan2(y - this.startY, x - this.startX);
+
+					// 画箭头的主线
+					this.ctx2.beginPath();
+					this.ctx2.moveTo(this.startX, this.startY);
+					this.ctx2.lineTo(x, y);
+					this.ctx2.stroke();
+
+					// 画箭头的两条边
+					this.ctx2.moveTo(x - 1, y);
+					this.ctx2.lineTo(
+						x - headlen * Math.cos(angle - Math.PI / 6),
+						y - headlen * Math.sin(angle - Math.PI / 6)
+					);
+					this.ctx2.moveTo(x + 1, y);
+					this.ctx2.lineTo(
+						x - headlen * Math.cos(angle + Math.PI / 6),
+						y - headlen * Math.sin(angle + Math.PI / 6)
+					);
+					this.ctx2.stroke();
 				}
-				this.ctx.drawImage(this.tempShape, 0, 0);
-				// this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
-				this.restoreState();
 			}
 		},
 		drawPreviewSize(x, y) {
@@ -502,12 +911,15 @@ export default {
 		},
 		handleMouseUp() {
 			if (!this.isDrawing) return;
+
 			this.isDrawing = false;
 			this.ctx.closePath();
-			if (this.tempShape) {
-				this.ctx.drawImage(this.tempShape, 0, 0);
-				this.tempShape = null;
-				this.tempCtx = null;
+			if (this.showCanvas2) {
+				this.showCanvas2 = false;
+				this.ctx.drawImage(this.canvas2, 0, 0);
+				this.ctx2.clearRect(0, 0, this.canvas2.width, this.canvas2.height);
+				//   // this.tempShape = null;
+				//   // this.tempCtx = null;
 			}
 			this.saveState();
 		},
@@ -534,11 +946,129 @@ export default {
 		setColor(newColor) {
 			this.brushColor = newColor;
 			this.openBrushColorBox = false;
-			this.setMode("draw");
+			this.setMode("draw",false);
 		},
 		changeOpenBrushColorBox(newValue) {
 			this.openBrushColorBox = newValue;
 		},
+		screenshotMouseDown(e) {
+			this.isDrawing = true;
+			this.ctx3.fillStyle = "#00000044";
+			this.startX = e.clientX;
+			this.startY = e.clientY;
+		},
+		screenshotMouseMove(e) {
+			if (!this.isDrawing) return;
+			this.ctx3.clearRect(0, 0, this.canvas3.width, this.canvas3.height);
+			this.ctx3.fillStyle = "#00000044";
+			this.ctx3.fillRect(0, 0, this.canvas3.width, this.canvas3.height);
+
+			const width = e.clientX - this.startX;
+			const height = e.clientY - this.startY;
+
+			this.ctx3.globalCompositeOperation = "destination-out";
+			this.ctx3.clearRect(this.startX, this.startY, width, height);
+			this.ctx3.globalCompositeOperation = "source-over";
+		},
+		screenshotMouseUp(e) {
+			if (!this.isDrawing) return;
+			console.log("👇");
+			console.log(this.startX, this.startY);
+			console.log(e.clientX, e.clientY);
+			console.log("👆");
+			this.isDrawing = false;
+			// 截取指定区域
+			const rect = {
+				x: Math.min(this.startX, e.clientX),
+				y: Math.min(this.startY, e.clientY),
+				width: Math.abs(e.clientX - this.startX),
+				height: Math.abs(e.clientY - this.startY),
+			};
+			console.log(rect);
+			html2canvas(document.body, {
+				x: rect.x,
+				y: rect.y,
+				width: rect.width,
+				height: rect.height,
+				windowWidth: document.body.scrollWidth,
+				windowHeight: document.body.scrollHeight,
+				scale: window.devicePixelRatio,
+			}).then((result) => {
+				this.mode = "";
+				this.showCanvas4 = true;
+				this.canvas4.width = rect.width;
+				this.canvas4.height = rect.height;
+				this.ctx4.drawImage(result, 0, 0, rect.width, rect.height);
+				// 移除覆盖的 canvas
+			});
+		},
+		screenshotTouchStart(e) {
+			e.preventDefault();
+			const touch = e.touches[0];
+			this.screenshotMouseDown({
+				clientX: touch.clientX,
+				clientY: touch.clientY,
+			});
+		},
+		screenshotTouchMove(e) {
+			e.preventDefault();
+			const touch = e.touches[0];
+			this.screenshotMouseMove({
+				clientX: touch.clientX,
+				clientY: touch.clientY,
+			});
+		},
+		screenshotTouchEnd(e) {
+			e.preventDefault();
+			this.screenshotMouseUp();
+		},
+		screenshot(){
+				// return console.log(document.clientWidth,document.clientHeight)
+				html2canvas(document.body, {
+					x: 0,
+					y: 0,
+					width: document.documentElement.clientWidth,
+					height: document.documentElement.clientHeight,
+					useCORS:true,
+					windowWidth: 0,
+					windowHeight: 0,
+					scale: window.devicePixelRatio,
+				}).then((result) => {
+					console.log(result);
+					// this.mode = "";
+					// this.showCanvas4 = true;
+					// this.canvas4.width = result.width/2;
+					// this.canvas4.height = result.height/2;
+					// this.ctx4.drawImage(
+					// 	result,
+					// 	0,
+					// 	0,
+					// 	document.clientWidth,
+					// 	document.clientHeight
+					// );
+					// return
+					var imgURL = result.toDataURL({
+						format: "image/png",
+						quality: 1,
+						width: result.width,
+						height: result.height,
+					});
+					var dlLink = document.createElement("a");
+					dlLink.download = "fileName";
+					dlLink.href = imgURL;
+					dlLink.dataset.downloadurl = [
+						"png",
+						dlLink.download,
+						dlLink.href,
+					].join(":");
+					document.body.appendChild(dlLink);
+					dlLink.click();
+					document.body.removeChild(dlLink);
+					// 移除覆盖的 canvas
+				});
+				// this.ctx3.fillStyle = '#00000044';
+				// this.ctx3.fillRect(0, 0, this.canvas3.width, this.canvas3.height);
+		}
 	},
 	watch: {
 		brushColor(newColor) {
@@ -561,6 +1091,20 @@ export default {
 	background-color: rgba(255, 255, 255, 0);
 }
 
+.screenshotBox {
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100vw;
+	height: 100vh;
+	background-color: #00000044;
+	z-index: 12;
+}
+
+.screenshotCanvas {
+	z-index: 11;
+}
+
 .toolbar {
 	position: fixed;
 	bottom: 0;
@@ -576,6 +1120,7 @@ export default {
 	box-shadow: 0px 6px 30px 5px #0000000d;
 	transform: translateX(-50%);
 	max-width: 100vw;
+	z-index: 10;
 }
 
 .toolbar-container {
@@ -616,6 +1161,10 @@ export default {
 	cursor: pointer;
 }
 
+.eraserBtn{
+	position: relative;
+}
+
 .eraserBtn > svg {
 	width: 40px;
 	height: 40px;
@@ -648,8 +1197,18 @@ export default {
 	justify-content: center;
 	flex-wrap: wrap;
 }
+.bb_cb_drawColor{
+	width: 250px;
+	height: auto;
+	background-color: #ffffff;
+	padding: 4px, 8px, 4px, 8px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-wrap: wrap;
+}
 
-.brushBtn_colorBox > span {
+.bb_cb_drawColor > span {
 	width: 25px;
 	height: 25px;
 	border-radius: 100%;
@@ -667,4 +1226,123 @@ export default {
 	padding: 5px !important;
 	margin-left: 5px;
 }
+
+.shape {
+	position: relative;
+}
+
+.shape > div {
+	width: 40px;
+	height: 40px;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	cursor: pointer;
+	border-radius: 8px;
+}
+
+.shape > div > svg {
+	width: 80%;
+	height: 80%;
+}
+.shapeActive {
+	background-color: #3681fc;
+}
+
+.shapeActive > svg {
+	fill: #fff;
+}
+
+.shapeBox {
+	position: absolute;
+	left: 0;
+	bottom: calc(100% + 10px);
+	width: auto !important;
+	height: auto !important;
+	background-color: #fff;
+	box-shadow: 0px 4px 10px 0px #1d398314;
+	box-shadow: 1px 1px 20px 4px #1d39830d;
+	border-radius: 6px;
+	padding: 8px;
+	cursor: default;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+}
+
+.shapeItem {
+	width: auto;
+	height: auto;
+	padding: 5px;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	cursor: pointer;
+	border-radius: 8px;
+	color: black;
+	margin-bottom: 5px;
+}
+
+.shapeItem > span {
+	width: 2em;
+}
+
+.shapeItem > svg {
+	width: 25px;
+	height: 25px;
+	margin-right: 10px;
+}
+
+.shapeItem:hover {
+	background-color: #e6e6e6;
+	color: black;
+}
+
+.shapeItemActive {
+	background-color: #3681fc !important;
+	color: #fff !important;
+	fill: #fff !important;
+}
+
+.shapeItemActive > svg {
+	fill: #fff !important;
+}
+
+.eraserBtnActive {
+	background-color: #3681fc !important;
+	color: #fff !important;
+	fill: #fff !important;
+	border-radius: 8px;
+}
+
+.bb_cb_drawSize {
+	width: 100%;
+	box-sizing: border-box;
+	padding: 5px 20px;
+	color: black;
+}
+
+.eb_changeSize{
+	position: absolute;
+	left: 0;
+	bottom: calc(100% + 10px);
+	width: auto !important;
+	height: auto !important;
+	background-color: #fff;
+	box-shadow: 0px 4px 10px 0px #1d398314;
+	box-shadow: 1px 1px 20px 4px #1d39830d;
+	border-radius: 6px;
+	padding: 8px 15px 8px 15px;
+	cursor: default;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+}
+
+.selectBox{
+	border: none;
+	background-color: none;
+}
 </style>

文件差异内容过多而无法显示
+ 1435 - 923
src/components/classRoomHelper/component/countdown.vue


文件差异内容过多而无法显示
+ 658 - 582
src/components/classRoomHelper/component/languageAssistant.vue


+ 56 - 16
src/components/classRoomHelper/component/levitatedSphere.vue

@@ -1,20 +1,20 @@
 <template>
   <div class="levitatedSphere" v-show="show">
-    <div :class="['ls_hello']" v-show="showIndex == 0">
+    <div :class="['ls_hello']" v-show="showIndex == 0" @click="stopOne()" @dblclick="stopTwo()">
       <el-image
-        style="width: 100%; height: 100%"
+        style="width: 110%; height: 110%"
         v-show="aiStatus == 1"
         :src="require('../../../assets/icon/course/aiTalk.svg')"
         fit="fill"
       ></el-image>
       <el-image
-        style="width: 100%; height: 100%"
+        style="width: 110%; height: 110%"
         v-show="aiStatus == 2"
         :src="require('../../../assets/icon/course/aiVanish.svg')"
         fit="fill"
       ></el-image>
       <el-image
-        style="width: 100%; height: 100%;transform: scale(1.3,1.3);"
+        style="width: 110%; height: 110%;transform: scale(1.3,1.3);"
         v-show="aiStatus == 0"
         :src="require('../../../assets/icon/course/aiWait2.svg')"
         fit="fill"
@@ -62,8 +62,8 @@ export default {
   data() {
     return {
       show: false,
-      showIndex: 0, //0 :在说话 1 : 接收 2:待命
-      aiStatus: 0,
+      showIndex: 0,
+      aiStatus: 0, //0 :在说话 1 : 接收 2:待命
       aiText: "您好,我是小可,有什么可以帮助您的?",
       userText: "",
       showTextIndex: 0, //0:ai,1:用户, 2:组织语言  3: 无
@@ -85,6 +85,28 @@ export default {
     }
   },
   methods: {
+		stopTwo(){
+			this.show = false;
+      this.showTextIndex = 3;
+      this.aiStatus = 2;
+      this.aiText = "";
+      this.userText = "";
+      this.stopRecord();
+		},
+		stopOne(){
+			if(this.source){
+				this.source.close();
+				this.source = null;
+			}
+			if (this.talkLoading) {
+        this.stopTalk();
+      }
+			this.showIndex = 0;
+			this.showTextIndex = 0;
+			this.aiText = "您好,我是小可,有什么可以帮助您的?";
+			this.aiStatus = 0;
+			this.chatLoading = false;
+		},
     recordStart(_text) {
       var OpenCC = require("opencc-js");
       let converter = OpenCC.Converter({
@@ -101,9 +123,20 @@ export default {
         "languageOptions"
       ).selectedIndex = 2; //普通话
       iiframe.contentWindow.testdoContinuousPronunciationAssessment();
-      this.$message.success("已开启语音助手,请说“可可同学”来唤醒");
+			this.talkTextList.push("我在");
+			this.talkText();
+			// return;
+      // this.$message.success("已开启语音助手,请说“可可同学”来唤醒");
       this.$parent.changeRecordType(1);
       this.isOpen = true;
+      this.aiText = "您好,我是小可,有什么可以帮助您的?";
+      this.aiStatus = 0;
+      this.showIndex = 0;
+			this.showTextIndex = 0;
+			this.chatLoading = false;
+			this.talkLoading == false;
+      this.show = true;
+      console.log("已唤醒");
       iiframe.contentWindow.onRecognizedResult = e => {
         let _msg = converter(e.privText);
         // let _msg2 = e.privText;
@@ -112,14 +145,16 @@ export default {
         console.log(_msg);
         // _msg = converter(_msg)
         if (!_msg) return console.log("输出为空");
-        if (_msg.indexOf(converter("可可同学")) != -1 && !this.show) {
-          this.aiText = "您好,我是小可,有什么可以帮助您的?";
-          this.aiStatus = 0;
-          this.showIndex = 0;
-          this.show = true;
-          console.log("已唤醒");
-          return;
-        } else if (this.show == true) {
+        // if (_msg.indexOf(converter("可可同学")) != -1 && !this.show) {
+        //   this.aiText = "您好,我是小可,有什么可以帮助您的?";
+        //   this.aiStatus = 0;
+        //   this.showIndex = 0;
+        //   this.show = true;
+        //   console.log("已唤醒");
+        //   return;
+        // } else
+
+        if (this.show == true) {
           if (
             _msg.indexOf(converter("可可同学")) != -1 &&
             _msg.indexOf(converter("停止")) != -1
@@ -192,7 +227,8 @@ export default {
                   message: this.userText,
                   session_name: _uuid + "-qgt",
                   uid: _uuid,
-                  file_ids: []
+                  file_ids: [],
+									model: "gpt-4o-2024-08-06",
                 };
                 this.ajax
                   // .post("https://claude3.cocorobo.cn/chat", params)
@@ -207,6 +243,7 @@ export default {
                       converter("发送成功")
                     ) {
                       this.userText = "";
+											this.showIndex = 0;
                     } else {
                       // this.$message.warning(res.data.FunctionResponse.result);
                       console.log(res.data.FunctionResponse.result);
@@ -363,6 +400,8 @@ export default {
       // let _talkIndex = 0;
       // const md = new MarkdownIt();
       this.source.onmessage = _e => {
+				this.showIndex = 0;
+				this.aiStatus = 0
         let _eData = JSON.parse(_e.data);
         if (_eData.content.replace("'", "").replace("'", "") == "[DONE]") {
           let _result = [];
@@ -472,6 +511,7 @@ export default {
   position: absolute;
   top: 0;
   right: 0;
+	cursor: pointer;
   animation: smallToBig 1s both;
 }
 

+ 723 - 0
src/components/classRoomHelper/component/reviewArea.vue

@@ -0,0 +1,723 @@
+<template>
+  <div class="reviewArea" v-loading="loading">
+		<div class="pzTop2">
+ 
+        <div class="checkbox">
+
+					<div class="cb-tabList">
+						<div :class="[commentTagShow==0?'cb-tabItem':'']" @click="commentTagShow=0">评论</div>
+
+						<div :class="[commentTagShow==2?'cb-tabItem':'']" @click="commentTagShow=2">总评</div>
+					</div>
+          <el-select v-model="pzStype" @change="selectPz" class="selectBox" v-show="commentTagShow == 0">
+            <el-option label="时间降序" :value="1"></el-option>
+            <el-option label="时间升序" :value="2"></el-option>
+            <el-option label="我的评课" :value="3"></el-option>
+          </el-select>
+        </div>
+      </div>
+			<div :class="pzList && pzList.length ? 'pzBox' : 'noPzBox'" v-if="commentTagShow==0">
+        <div class="pzListBox" v-if="pzList && pzList.length">
+          <div class="pzList" v-for="(pz, pzIndex) in pzList" :key="pzIndex">
+            <div class="pzNavTop">
+              <div>评</div>
+              <div>
+                {{
+                  pz.username && pz.username.length > 5
+                    ? pz.username.substring(0, 5) + "..."
+                    : pz.username
+                }}的评论
+              </div>
+              <div
+                class="pzDelete"
+                v-if="pz.userid == userid"
+                @click="deletePz(pz.id)"
+              >
+                删除
+              </div>
+            </div>
+            <div
+              @click="checkImg(getImgList(pz.content))"
+              class="pzContent cont"
+              v-html="pz.content"
+              v-if="pz.type == '1'"
+            ></div>
+            <div class="pzContent" v-if="pz.type == '2'">
+              <audio :src="pz.content" controls="controls" ref="audio">
+                Your browser does not support the audio element.
+              </audio>
+            </div>
+            <div class="pzContent" v-if="pz.type == '3'">
+              <img
+                :src="pz.content"
+                style="width: 90%; margin: 0 auto; display: block"
+                @click="previewImg(pz.content)"
+              />
+            </div>
+            <div class="timeAndReply">
+              <div class="time">
+                {{ pz.time }}
+              </div>
+              <div @click="setReplyIndex(pz.id, pzIndex)">回复</div>
+            </div>
+
+            <div v-if="pz.hfList && pz.hfList.length > 0" class="hfBox">
+              <div
+                v-for="(h, hIndex) in pz.hfList"
+                :key="hIndex"
+                class="hfItem"
+              >
+                <div class="whoReplyWho">
+                  <div class="hfName">{{ h.username }}</div>
+                  <div class="hfImg">
+                    <img src="../../../assets/icon/newIcons/right.png" alt="" />
+                  </div>
+                  <div class="hfName">{{ pz.username }}</div>
+                </div>
+                <div class="hfContent" v-html="h.content"></div>
+                <div class="hfBottom">
+                  <div class="hfTime">{{ h.time }}</div>
+                  <div
+                    class="deleteHfItem"
+                    @click="deleteReply(h.id)"
+                    v-if="userid == h.userid"
+                  >
+                    <img src="../../../assets/icon/newIcons/delete.png" alt="" />
+                  </div>
+                </div>
+              </div>
+            </div>
+
+            <!-- <div class="replyBox" v-if="replyIndex[pzIndex] && replyIndex[pzIndex] == true">
+              <div class="replyInput">
+                <el-input v-model="reply[pzIndex]"></el-input>
+              </div>
+              <el-button @click="addHf(pz.id, pzIndex)">回复</el-button>
+            </div> -->
+          </div>
+        </div>
+        <div class="noPz" v-else>
+          <img src="../../../assets/icon/noPz.png" alt="" />
+        </div>
+        <div class="addPzButton">
+          <div class="addPz" @click="(addPzDialog = true), (pzType = 1)">
+            添加评论
+          </div>
+          <!-- <div class="img1">
+            <div @click="(addPzDialog = true), (pzType = 2)">
+              <img src="../assets/audio.png" /><span>音频</span>
+            </div>
+          </div> -->
+        </div>
+      </div>
+			<div class="scoreList" v-if="commentTagShow==1">
+				<scoreItem v-for="item in scoreList.datalist" @refresh="getScoreList" :data="item" :isScore="scoreList.isScoreList.filter(i=>(i.userid==item.userid && i.courseid == item.courseId))" :key="item.courseId"/>
+			</div>
+			<div class="scoreList" v-if="commentTagShow==2" style="position: relative">
+        <scoreZong :courseid="id" :userid="userid" @insertMemorandum="insertMemorandum"></scoreZong>
+			</div>
+			<div v-if="addPzDialog == true" class="addDialogCss" v-el-drag-dialog>
+      <div class="pzTop">
+        <div class="teacherPz">
+          <div class="teacherPzImg">
+            <img src="../../../assets/icon/teacherPz.png" alt="" />
+          </div>
+          <div style="margin-left: 10px; height: 25px">教师评论</div>
+        </div>
+        <div @click="addPzDialog = false">
+          <img src="../../../assets/close1.png" class="pzClose" alt="" />
+        </div>
+      </div>
+      <div class="addPzBox">
+        <div class="addPzCheck">
+          <span :class="{ isChooseActive: pzType == 1 }" @click="pzType = 1"
+            >文本</span
+          >
+          <!-- <span :class="{isChooseActive:pzType==3}" @click="pzType = 3">图片</span> -->
+          <span :class="{ isChooseActive: pzType == 2 }" @click="pzType = 2"
+            >音频</span
+          >
+        </div>
+        <div style="height: calc(100% - 95px)">
+          <!-- <textarea class="binfo_input pzConText" cols placeholder="请填写项目课程关键问题...." v-model="pzConText"
+            v-if="pzType == 1"></textarea> -->
+          <editor-bar
+            class="binfo_input pzConText"
+            style="width: 100% !important"
+            placeholder="请输入任务描述"
+            v-model="pzConText"
+            @change="change"
+            v-if="pzType == 1"
+          ></editor-bar>
+          <Audio @addPz="addPz" class="pzAudioClass" v-if="pzType == 2"></Audio>
+          <!-- <div class="pzAudioClass" v-if="pzType == 3">
+            <div @click="addImg($event)">
+              <el-button type="primary">上传图片</el-button>
+              <input type="file" accept="image/png, image/gif, image/jpeg" style="display: none"
+                @change="beforeUpload1($event, 4)" />
+            </div>
+          </div> -->
+        </div>
+        <div class="addTextCss" @click="addPz('1')" v-if="pzType == 1">
+          确定
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import scoreItem from '../../scoreList/scoreItem.vue'
+import scoreZong from '../../scoreZong/index.vue'
+import EditorBar from "../../tools/wangEnduit.vue";
+import Audio from "../../components/audio.vue";
+export default {
+	components:{
+		scoreItem,
+		scoreZong,
+		EditorBar,
+		Audio
+	},	
+	props:{
+		taskCount:{
+			type:Number,
+			default:0
+		},
+		courseType:{
+			type:Number,
+			default:0
+		},
+		
+	},
+	watch:{
+		taskCount(){
+			this.selectPz();
+		},
+		courseType(){
+			this.selectPz();
+		}
+	},
+  data() {
+    return {
+      commentTagShow: 0,
+      pzStype: 1,
+      pzList: [],
+			loading:false,
+			pzDialog:false,
+      id: this.$route.query.courseId,
+      userid: this.$route.query.userid,
+			addPzDialog:false,
+			pzType:0,
+			pzConText:"",
+			scoreList:{
+				datalist:[],
+				isScoreList:[]
+			},
+    };
+  },
+  methods: {
+		insertMemorandum(_html) {
+      //保存行为操作
+      //variable
+      //btn
+      let params = [
+        {
+          uid: this.userid,
+          courseId: this.courseId+(this.tcid2?this.tcid2:""),
+          content: _html
+        }
+      ];
+
+      this.ajax
+        .post(
+          this.$store.state.api + "insert_systemOperation_countdownBehavior",
+          params
+        )
+        .then(res => {
+          if (res.data == 1) {
+            console.log("保存操作成功");
+          } else {
+            console.log("保存操作失败");
+          }
+        })
+        .catch(e => {
+          console.log("保存操作失败");
+          console.log(e);
+        });
+    },
+    selectPz() {
+      let params = {
+        cid: this.id,
+        s: this.courseType,
+        t: this.taskCount,
+        type: this.pzStype,
+        uid: this.userid
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectPzListType", params)
+        .then(res => {
+          this.pzList = res.data[0];
+          var a = res.data[1];
+          for (var i = 0; i < a.length; i++) {
+            for (var j = 0; j < this.pzList.length; j++) {
+              if (!this.pzList[j].hfList) {
+                this.pzList[j].hfList = [];
+              }
+              if (a[i].pid == this.pzList[j].id) {
+                this.pzList[j].hfList.push(a[i]);
+              }
+            }
+          }
+        })
+        .catch(err => {
+          console.error(err);
+        });
+    },
+		getScoreList(){
+			let params = {
+        cid: this.id,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTestCourseByCid", params)
+        .then((res) => {
+					let result = res.data;
+					this.scoreList.datalist = result[0];
+					this.scoreList.isScoreList = result[1];
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+		},
+		addPz(type, content) {
+      if (type == "1" && this.pzConText == "") {
+        this.$message.error("评论不能为空!");
+        return;
+      }
+      let params = [
+        {
+          cid: this.id,
+          uid: this.userid,
+          s: this.courseType,
+          t: this.taskCount,
+          c: type == "1" ? this.pzConText : content,
+          type: type,
+        },
+      ];
+      this.ajax
+        .post(this.$store.state.api + "addPz2", params)
+        .then((res) => {
+          this.$message({
+            message: "添加成功",
+            type: "success",
+          });
+          this.pzConText = "";
+          this.addPzDialog = false;
+          this.selectPz();
+					this.insertMemorandum(`使用<span class="btn">评论</span>功能,添加评论`)
+        })
+        .catch((err) => {
+          this.$message.error("添加失败");
+          console.error(err);
+        });
+				
+    },
+		change(val){
+			console.log(val);
+		}
+  },
+	mounted() {
+		this.selectPz();
+		this.getScoreList();
+	},
+};
+</script>
+
+<style scoped>
+.reviewArea {
+  width: 100%;
+  height: 100%;
+	
+}
+
+.pzTop2 .check {
+  text-align: center;
+  cursor: pointer;
+  box-sizing: border-box;
+  display: flex;
+}
+
+.pzTop2 img {
+  width: 25px;
+  cursor: pointer;
+}
+
+.pzTop2 .checkbox {
+  display: flex;
+  align-items: center;
+  padding: 5px 10px;
+  flex: 0 0 auto;
+  font-weight: bold;
+  border-bottom: 1px solid #eee;
+  justify-content: space-between;
+}
+
+.checkbox>.cb-tabList{
+	height:40px;
+	display:flex;
+	align-items:center;
+}
+
+.cb-tabList>div{
+	margin-right:20px;
+	font-weight:400;
+	cursor:pointer;
+}
+
+.cb-tabList>.cb-tabItem{
+	color:#1684FC;
+	position:relative;
+}
+
+.cb-tabItem::after{
+	content:"";
+	width:100%;
+	height:2px;
+	background:#1684FC;
+	position:absolute;
+	bottom:-5px;
+	left:0
+}
+
+.pzBox,
+.noPzBox {
+  height: calc(100% - 60px);
+  /* background: #ededed; */
+  background: #fff;
+  /* border-radius: 0 0 15px 15px; */
+}
+
+.noPzBox {
+  display: flex;
+  flex-direction: column;
+  flex-wrap: nowrap;
+  justify-content: center;
+  align-items: center;
+}
+
+.pzList {
+  background: #f7f7f7;
+  width: 90%;
+  margin: 0 auto 15px;
+  border-radius: 5px;
+}
+
+.pzNavTop {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  padding: 10px 10px 0 10px;
+  align-items: center;
+}
+
+.pzDelete {
+  cursor: pointer;
+  margin-left: auto;
+  font-size: 14px;
+  color: #afafaf;
+}
+
+.pzNavTop > div:nth-child(1) {
+  background: #3760af;
+  width: 35px;
+  height: 35px;
+  color: #fff;
+  text-align: center;
+  line-height: 35px;
+  border-radius: 50%;
+  font-size: 14px;
+}
+
+.pzNavTop > div:nth-child(2) {
+  font-size: 18px;
+  color: #959595;
+  margin-left: 5px;
+}
+
+.pzContent {
+  padding: 10px;
+  word-break: break-word;
+}
+
+.pzContent audio {
+  width: 100%;
+}
+
+.pzContent audio::-webkit-media-controls-panel {
+  background: #fff;
+}
+
+.pzContent >>> img {
+  max-width: 100%;
+}
+
+.pzListBox {
+  padding-top: 15px;
+  height: calc(100% - 110px);
+  overflow: auto;
+}
+
+.addPzButton {
+  position: relative;
+  margin-top: 3px;
+  width: 100%;
+}
+
+.addPzButton .img1 {
+  position: absolute;
+  top: 50%;
+  right: 25px;
+  transform: translateY(-50%);
+  height: 100%;
+  display: flex;
+  align-items: center;
+}
+
+.addPzButton .img1 div {
+  display: flex;
+}
+
+.addPzButton .img1 div img {
+  width: 28px;
+  margin-left: 10px;
+  cursor: pointer;
+}
+
+.addPzButton .img1 div span {
+  font-size: 14px;
+  margin: 4px 0 0 3px;
+  color: #afafaf;
+}
+
+.addPz {
+  background: #4b79ce;
+  width: 100px;
+  color: #fff;
+  font-size: 12px;
+  height: 30px;
+  margin: 0 auto;
+  text-align: center;
+  line-height: 30px;
+  border-radius: 10px;
+  cursor: pointer;
+}
+
+.addDialogCss {
+  position: fixed;
+  width: 600px;
+  height: 70%;
+  min-height: 450px;
+  box-shadow: 0px 0 8px 0px #555555;
+  border-radius: 15px;
+  z-index: 999;
+  left: 50%;
+  top: 50%;
+  margin: -18% 0 0 -300px;
+}
+
+.teacherPz {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  flex-wrap: nowrap;
+}
+
+.teacherPzImg {
+  width: 30px;
+  height: 30px;
+}
+
+.teacherPzImg > img {
+  width: 100%;
+  height: 100%;
+}
+
+.addPzBox {
+  height: calc(100% - 40px);
+  background: #ededed;
+  border-bottom-left-radius: 15px;
+  border-bottom-right-radius: 15px;
+}
+
+.pzAudioClass {
+  margin: 15px 14px;
+  background: #fff;
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+
+.pzConText {
+  width: 95%;
+  height: 100%;
+  margin: 10px auto 0;
+  border: none;
+  background: #fff;
+  border-radius: 0px;
+}
+
+.pzConText >>> .text {
+  height: calc(100% - 82px);
+}
+
+.whoReplyWho > .hfImg {
+  width: 12px;
+  height: 12px;
+  margin: 0 5px;
+}
+.whoReplyWho > .hfImg > img {
+  width: 100%;
+  height: 100%;
+}
+.hfContent {
+  padding-top: 10px;
+  box-sizing: border-box;
+  display: -webkit-box;
+  overflow: hidden;
+  white-space: normal !important;
+  text-overflow: ellipsis;
+  word-wrap: break-word;
+  -webkit-box-orient: vertical;
+}
+
+.hfTime {
+  text-align: left;
+  box-sizing: border-box;
+  padding: 10px 0 10px 0px;
+  color: #bfbfbf;
+  font-size: 14px;
+}
+
+.timeAndReply {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  justify-content: space-between;
+  align-items: center;
+  font-size: 14px;
+  box-sizing: border-box;
+  padding: 0 10px 10px 0px;
+}
+.timeAndReply .time {
+  color: #bfbfbf;
+  padding: 0 0 0 10px;
+  box-sizing: border-box;
+}
+.timeAndReply > div:last-child {
+  cursor: pointer;
+  color: #777;
+}
+
+.hfBox {
+  padding: 10px;
+  box-sizing: border-box;
+}
+
+.whoReplyWho {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: baseline;
+  justify-content: flex-start;
+}
+.hfBottom {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 14px;
+}
+.deleteHfItem {
+  cursor: pointer;
+  width: 20px;
+  height: 20px;
+}
+
+.deleteHfItem > img {
+  width: 100%;
+  height: 100%;
+}
+
+.addPzCheck {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  padding: 10px 15px 0;
+}
+
+.addPzCheck span {
+  cursor: pointer;
+  padding-bottom: 5px;
+  font-weight: bold;
+}
+
+.addPzCheck span + span {
+  margin-left: 10px;
+}
+
+.addPzCheck .isChooseActive {
+  color: #3e88f4;
+  border-bottom: 2px solid #2f80f3;
+}
+.pzTop {
+  color: #fff;
+  background: #000;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+  justify-content: space-between;
+  height: 40px;
+  border-radius: 15px 15px 0 0;
+  user-select: none;
+}
+
+.pzTop > div:nth-child(1) {
+  padding-left: 10px;
+}
+
+.pzTop > div:nth-child(2) {
+  width: 15px;
+  height: 15px;
+  padding-right: 10px;
+  cursor: pointer;
+}
+
+.pzTop > div:nth-child(2) > img {
+  width: 100%;
+  height: 100%;
+}
+
+
+.addTextCss {
+  background: #4b79ce;
+  width: 80px;
+  height: 30px;
+  text-align: center;
+  color: #fff;
+  line-height: 30px;
+  border-radius: 10px;
+  margin: 10px auto 0;
+  cursor: pointer;
+}
+
+.scoreList{
+	width:100%;
+	height:100%;
+	box-sizing:border-box;
+	padding:10px 15px;
+	overflow:auto;
+	padding-bottom:80px;
+}
+</style>

文件差异内容过多而无法显示
+ 857 - 230
src/components/classRoomHelper/component/searchArea.vue


文件差异内容过多而无法显示
+ 234 - 58
src/components/classRoomHelper/component/taskArea.vue


+ 318 - 25
src/components/classRoomHelper/index.vue

@@ -10,6 +10,9 @@
         :fileId="fileId"
         :recordType="recordType"
         v-if="itemType == 1"
+				:canShowTips="canShowTips"
+				:showTipsLoading="showTipsLoading"
+				:tipsList="tipsList"
       />
       <taskArea
         :courseDetail="courseDetail"
@@ -30,6 +33,8 @@
       />
 
       <languageAssistant ref="languageAssistantRef" v-if="itemType == 4" />
+
+			<reviewArea ref="reviewAreaRef" v-if="itemType==5" :courseType="courseType" :taskCount="taskCount"/>
       <!-- <dialogArea
         :courseDetail="courseDetail"
 				:openMegaphone="openMegaphone"
@@ -40,7 +45,7 @@
     </div>
     <div class="ch_nav_box">
       <div class="ch_nav_box_top">
-        <div @click="changeFold(!fold)" ref="foldBtnRef">
+        <div @click.stop="changeFold(!fold)" ref="foldBtnRef">
           <el-tooltip
             class="item"
             effect="dark"
@@ -50,12 +55,12 @@
             <img
               :src="require('../../assets/icon/course/foldIcon.svg')"
               alt=""
-              :style="`${fold ? 'transform: rotate(90deg);' : ''}`"
+							:class="[!fold?'':'foldActive']"
             />
           </el-tooltip>
         </div>
 
-        <div @click="$emit('review')" v-if="tType == 1">
+        <div @click="changeItemType(5)" v-if="tType == 1">
           <el-tooltip class="item" effect="dark" content="评论" placement="top">
             <img
               :src="require('../../assets/icon/course/comment2.svg')"
@@ -150,7 +155,7 @@
         </div>
       </div>
       <div class="ch_nav_box_bottom">
-        <div @click.stop="commentAndAnnotate()">
+        <div @click.stop="commentAndAnnotate()" style="z-index: 9999;">
           <el-tooltip class="item" effect="dark" content="批注" placement="top">
             <img
               :src="require('../../assets/icon/course/edit2.svg')"
@@ -224,9 +229,8 @@
         </div>
       </div>
     </div>
-    <div v-show="fold" class="itemFold" ref="itemFoldRef">
+    <div v-if="fold" class="itemFold" ref="itemFoldRef"  v-click-outside="handleBlur">
       <div @click="$emit('backPage')">
-       
           <img :src="require('../../assets/icon/course/return.png')" alt="" />
 				<span>返回</span>
       </div>
@@ -237,7 +241,7 @@
       </div>
 
       <div @click="$emit('authority')" v-if="tType == 1 || tType == 4">
-          <img :src="require('../../assets/icon/course/setting.png')" alt="" />
+          <img :src="require('../../assets/icon/course/setting2.svg')" alt="" />
 					<span>权限</span>
       </div>
     </div>
@@ -260,6 +264,27 @@ import timepiece from "./component/timepiece.vue";
 import countdown from "./component/countdown.vue";
 import AnnotationCanvas from "./component/AnnotationCanvas.vue";
 import languageAssistant from "./component/languageAssistant.vue";
+import reviewArea from "./component/reviewArea.vue";
+import { v4 as uuidv4 } from "uuid";
+// 自定义指令,用于处理点击外部区域的事件
+const clickOutside = {
+  bind(el, binding) {
+    // 在元素上绑定一个点击事件监听器
+    el.clickOutsideEvent = function (event) {
+      // 检查点击事件是否发生在元素的内部
+      if (!(el === event.target || el.contains(event.target))) {
+        // 如果点击事件发生在元素的外部,则触发指令绑定的方法,将点击的event数据传过去
+        binding.value(event);
+      }
+    };
+    // 在文档上添加点击事件监听器
+    document.addEventListener("click", el.clickOutsideEvent);
+  },
+  unbind(el) {
+    // 在元素上解除点击事件监听器
+    document.removeEventListener("click", el.clickOutsideEvent);
+  },
+};
 export default {
   emits: [
     "refresh",
@@ -270,6 +295,9 @@ export default {
     "stopRecording",
     "startRecording"
   ],
+	directives: {
+    "click-outside": clickOutside, // 注册自定义指令
+  },
   components: {
     searchArea,
     taskArea,
@@ -278,7 +306,8 @@ export default {
     timepiece,
     countdown,
     AnnotationCanvas,
-    languageAssistant
+    languageAssistant,
+		reviewArea
   },
   props: {
     courseDetail: {
@@ -286,7 +315,7 @@ export default {
       default: () => {}
     },
     tType: {
-      type: Number,
+      type:String,
       default: 0
     },
     navList: {
@@ -322,6 +351,7 @@ export default {
     return {
       userid: this.$route.query.userid,
       courseId: this.$route.query.courseId,
+			tcid2: this.$route.query.tcid,
       type: 0,
       itemType: 0, //0--无  1-搜索  2-任务 3-对话
       fileId: [],
@@ -330,14 +360,133 @@ export default {
       fold: false,
       openMegaphone: false, //是否打开喇叭
       getFileIdLoading: false,
-      AnnotationCanvasShow: false
+      AnnotationCanvasShow: false,
+			canShowTips:false,
+			showTipsLoading:false,
+			tipsList:[],
+			firstEnterTime:null,
+			canGetTips:true,
+			getTipsTimer:null,
+			getWangLoading:false,
+			canUseWangData:false,
+			wangData:"",
     };
   },
   mounted() {
     this.setWidth();
     this.getFileId();
+		this.firstEnterTime = new Date().getTime();
+		this.getWantSearch();
+		setTimeout(()=>{
+			this.canGetTips = true;
+			this.getTipsList()
+		},3000)
   },
   methods: {
+		getTipsListTime(time = 5000){
+			if(this.getTipsTimer)clearTimeout(this.getTipsListTime)
+			this.getTipsTimer = setTimeout(()=>{
+				this.canGetTips = true;
+				this.getTipsList();
+				this.getTipsTimer = null;
+			},time)
+		},
+		getTipsList(){
+			return new Promise((resolve)=>{
+				if(!this.canGetTips)return;
+			this.showTipsLoading = true;
+			let nowTaskObj = this.navList[this.courseType].task[this.taskCount]
+			let nowTask = `【任务${this.taskCount+1}:${nowTaskObj.taskName}】`
+			let _textData = `课程名称:${this.courseDetail.title}\n分类:${this.courseDetail.name}\n\n`;
+      let _chapters = JSON.parse(this.courseDetail.chapters);
+      _chapters.forEach((i1, index1) => {
+        if (i1.dyName) {
+          _textData += `阶段${index1 + 1}:${i1.dyName}\n`;
+        }
+        i1.chapterInfo[0].taskJson.forEach((i2, index2) => {
+          if (i2.task) {
+            _textData += `任务${index2 + 1}:${i2.task}\n`;
+            _textData += `${i2.taskDetail}\n`;
+          }
+        });
+        _textData += "\n";
+      });
+			let _msg = `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.
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
+Instruction: Based on the context, follow "Format example", write content
+
+#Context
+## 任务
+你是专业的教学评估员,擅长分析课堂动态和学生的认知状态,能够根据教师的当前思路提供有效的教学建议。
+你需要根据我提供的信息,推测分析,之后给出3个具体的操作步骤的建议。
+
+##工作流程
+1. 仔细阅读并分析我提供的课堂信息或课堂实录内容。
+2. 观察课堂上学生的行为和反应,推测他们的认知状态。
+3. 通过教师的言行和教学安排,推测教师当前的思路和教学目标。
+4. 根据教师的思路和学生的认知状态,提出一个教学建议,并给出3个具体的操作步骤。只需要描述对应的动作,不需要指出该动作的目标和作用。
+
+##输出
+###输出要求
+1. 最终输出仅包含具体操作步骤。
+2. 具体操作步骤以数组形式输出,包含3个步骤。
+3. 每个步骤用一句话描述,详细一些
+
+##课堂内容
+当前进行到:${nowTask}
+
+##Format example
+["步骤的描述","步骤的描述","步骤的描述"]
+${_textData}
+`
+let params = {
+        // assistant_id: "6063369f-289a-11ef-8bf4-12e77c4cb76b",
+        // userId: this.userid,
+        // message: [{ type: "text", text: _msg }],
+        // session_name: uuidv4(),
+        // // uid: _uuid,
+        // file_ids: this.fileId,
+				// model: "gpt-4o-2024-08-06",
+					model: "gpt-4o-2024-08-06",
+					temperature: 0,
+					max_tokens: 4096,
+					top_p: 1,
+					frequency_penalty: 0,
+					presence_penalty: 0,
+					messages: [{ role: "user", content: _msg }],
+					uid: uuidv4(),
+					mind_map_question: "",
+					stream: false,
+      };
+      this.ajax
+        // .post("https://gpt4.cocorobo.cn/chat", params)
+        // .post("https://claude3.cocorobo.cn/chat", params)
+        .post("https://gpt4.cocorobo.cn/chat", params)
+        .then(res => {
+          let _data = res.data.FunctionResponse.choices[0].message.content;
+          _data = _data.replaceAll("```json", "").replaceAll("```", "");
+					console.log(_data)
+          const match = _data.match(/\[\s*[^]*\s*\]/);
+          let _result = JSON.parse(match[0]) || [];
+					
+					this.tipsList.push(_result)
+					
+          this.showTipsLoading = false;
+					this.canShowTips = true;
+					this.canGetTips = false;
+					resolve()
+        })
+        .catch(e => {
+          this.showTipsLoading = false;
+          this.$message.error("获取课堂小贴士失败");
+          console.log(e);
+        });
+			})
+		},
+		handleBlur(){
+			// console.log(this.fold)
+			this.fold = !this.fold;
+		},
     changeAnnotationCanvasShow(newValue) {
       this.AnnotationCanvasShow = newValue;
     },
@@ -352,7 +501,7 @@ export default {
       let params = [
         {
           uid: this.userid,
-          courseId: this.courseId,
+          courseId: this.courseId+(this.tcid2?this.tcid2:""),
           content: _html
         }
       ];
@@ -382,12 +531,23 @@ export default {
     openSetting() {
       this.type = this.type == 1 ? 0 : 1;
       this.$nextTick(() => {
+				if(this.type==1){
+					this.$parent.mlDialog = false
+				}
         this.setWidth();
       });
     },
     changeItemType(type) {
       this.type = 0;
-      this.openSetting();
+			
+      
+			if(this.itemType==type){
+				this.itemType = 0;
+				this.type = 1;
+				this.openSetting();
+				return;
+			}
+			this.openSetting();
       // this.$message.info("切换到"+type)
       this.$nextTick(() => {
         // if (this.itemType == 1 && type != 1) {
@@ -419,7 +579,7 @@ export default {
       this.fileId = [];
       let _this = this;
       let _successFileUrl = [];
-      if (this.fileList.length <= 0) retrun;
+      if (this.fileList.length <= 0) return;
       let addType = ["DOCX", "DOC", "PPT", "PPTX", "MD", "TXT", "PDF"];
       this.fileList.forEach(i => {
         if (
@@ -465,8 +625,8 @@ export default {
         this.$refs.levitatedSphereRef.recordStart();
       } else if (this.recordType == 1) {
         // this.$message.info("关闭")
-        // this.changeRecordType(0)
-        this.$refs.levitatedSphereRef.stopRecord();
+        this.$refs.levitatedSphereRef.stopTwo();
+				// this.changeRecordType(0)
       }
     },
     changeMegaphone() {
@@ -481,28 +641,26 @@ export default {
     changeFold(newValue) {
       // this.$message.info("展开");
       this.fold = newValue;
-			console.log(this.$refs.foldBtnRef)
-			let e1 = this.$refs.foldBtnRef.getBoundingClientRect();
+			this.$nextTick(()=>{
+				let e1 = this.$refs.foldBtnRef.getBoundingClientRect();
 			let e2 = this.$refs.ch_box.getBoundingClientRect();
-
+			
 			console.log('👇👇')
 			console.log(e1.top - e2.top)
 			this.$refs.itemFoldRef.style.top = e1.top - e2.top + "px";
+			})
     },
     // 收起
     changeUnfold(newValue) {
       // this.$message.info("收起");
       this.fold = newValue;
     },
-    insertMemorandum(text) {
-      this.$refs.MemorandumRef.insertMemorandum(text);
-    },
     // 语音识别
     startRecord() {
       this.$refs.levitatedSphereRef.startRecord();
     },
     stopRecord() {
-      this.$refs.levitatedSphereRef.stopRecord();
+      this.$refs.levitatedSphereRef.stopTwo();
     },
     // 语音合成
     startSpeak() {
@@ -512,12 +670,124 @@ export default {
       this.recordType = type;
     },
     commentAndAnnotate() {
-      this.$refs.AnnotationCanvasRef.open();
-      this.insertMemorandum(`开始使用<span class="btn">批注</span>功能`);
+			if(this.AnnotationCanvasShow){
+				this.$refs.AnnotationCanvasRef.close()
+			}else{
+				this.$refs.AnnotationCanvasRef.open();
+      	this.insertMemorandum(`开始使用<span class="btn">批注</span>功能`);
+			}
+      
     },
     endCommentAndAnnotate() {
       this.insertMemorandum(`结束使用<span class="btn">批注</span>功能`);
-    }
+    },
+		getWantSearch() {
+			console.log("获取猜你想搜")
+      let _uuid = uuidv4();
+			this.getWangLoading = true
+			this.canUseWangData = false
+			this.wangData=""
+      let _msg = `
+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.
+ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
+Instruction: Based on the context, follow "Format example", write content
+
+## 任务
+你的任务是根据“课程信息”,提供用户需要的搜索建议,将搜索建议的结果以有序列表的形式返回给用户。
+## 课程信息
+#### 课程标题:${this.courseDetail.title ? this.courseDetail.title : ""}
+#### 分类:${this.courseDetail.name ? this.courseDetail.name : "无"}
+#### 学生年级:${
+        this.courseDetail.classname ? this.courseDetail.classname : "无"
+      }
+
+## 规则
+输出结果基于“课程信息”,避免提供无关的信息。
+搜索建议的结果符合伦理规范。
+## 输出
+输出应包括6个相关的搜索建议,每个搜索建议需要以问号的方式结束。
+请一步步思考如何根据现有信息推送搜索建议,但是不需要输出搜索建议以外的内
+
+## 输出格式
+搜索建议应以有序列表形式呈现,每个建议包括关键词和简短描述。输出JSON格式的
+
+## Format example
+[{"index": 1,"title": "垃圾分类标准","label": "不同国家的垃圾分类标准和方法?"},{"index": 2,"title":"可回收垃圾处理","label": "可回收垃圾的处理流程和再利用方法?"},{  "index": 3,  "title": "有害垃圾的影响",  "label": "有害垃圾对环境和人体健康的潜在影响?"},{  "index": 4,  "title": "垃圾分类标准",  "label": "不同国家的垃圾分类标准和方法?"},{  "index": 5,  "title": "可回收垃圾处理",  "label": "可回收垃圾的处理流程和再利用方法?"},{  "index": 6,  "title": "有害垃圾的影响",  "label": "有害垃圾对环境和人体健康的潜在影响?"}]
+`;
+
+      // let params = {
+      //   model: "gpt-3.5-turbo",
+      //   temperature: 0,
+      //   max_tokens: 4096,
+      //   top_p: 1,
+      //   frequency_penalty: 0,
+      //   presence_penalty: 0,
+      //   messages: [{ role: "user", content: _msg }],
+      //   uid: _uuid,
+      //   mind_map_question: ""
+      // };
+      let params = {
+        assistant_id: "6063369f-289a-11ef-8bf4-12e77c4cb76b",
+        userId: this.userid,
+        message: [{ type: "text", text: _msg }],
+        session_name: _uuid,
+        // uid: _uuid,
+        file_ids: this.fileId,
+        model: "gpt-4o-2024-08-06"
+      };
+      // let params = {
+      //   message: {
+      //     anthropic_version: "bedrock-2023-05-31",
+      //     max_tokens: 4096,
+      //     temperature: 0,
+      //     top_p: 1,
+      //     messages: [{ role: "user", content: _msg }]
+      //   },
+      //   uid: _uuid,
+      //   model: "Claude 3 Sonnet" // Claude 3 Sonnet或者Claude 3 Haiku
+      // };
+      this.text = "";
+
+      this.ajax
+        // .post("https://gpt4.cocorobo.cn/chat", params)
+        // .post("https://claude3.cocorobo.cn/chat", params)
+        .post("https://gpt4.cocorobo.cn/ai_agent_park_chat", params)
+        .then(res => {
+          // console.log(res);
+          let _data = res.data.FunctionResponse.message;
+          _data = _data.replaceAll("```json", "").replaceAll("```", "");
+          const match = _data.match(/\[\s*{[^]*}\s*\]/);
+					this.wangData = match[0];
+					this.canUseWangData = true;
+					this.getWangLoading = false;
+          // console.log(_data);
+          // console.log(match);
+          // this.chatList.find(i => i.uid == _uuid).aiContent = JSON.parse(
+          //   match[0]
+          // );
+          // this.chatList.find(i => i.uid == _uuid).isalltext = true;
+          // this.chatList.find(i => i.uid == _uuid).isShowSynchronization = true;
+          // this.chatList.find(i => i.uid == _uuid).loading = false;
+          // this.scrollBottom();
+          // this.chatLoading = false;
+        })
+        .catch(e => {
+          this.chatLoading = false;
+					this.canUseWangData = false;
+					this.getWangLoading = false;
+					console.log(e);
+        });
+      // this.getWAntSearchContent(_uuid);
+    },
+		getWanData(){
+			if(this.wangData && this.canUseWangData){
+				const _result = this.wangData;
+				this.wangData = "";
+				this.canUseWangData = false;
+				this.getWantSearch();
+				return _result;
+			}
+		}
   }
 };
 </script>
@@ -671,4 +941,27 @@ export default {
 .itemFold > div > span{
 	margin-left:10px;
 }
+
+@media screen and (max-height: 820px) {
+	.ch_nav_box_bottom > div {
+		height: auto;
+		padding: 8px 0;
+	}
+
+	.ch_nav_box_middle_item{
+		height: auto;
+		padding: 8px 0;
+	}
+
+	.ch_nav_box_top > div{
+		height: auto;
+		padding: 8px 0;
+	}
+}
+
+.foldActive{
+	background-color: #F0F2F5;
+	padding: 10px;
+	border-radius: 10px;
+}
 </style>

+ 1 - 1
src/components/components/answerData2.vue

@@ -200,7 +200,7 @@ export default {
             count++;
           }
         }
-        console.log(this.person);
+        // console.log(this.person);
         this.count = count;
         if (!this.chartObj) {
           this.setChart(this.ooption);

+ 1 - 1
src/components/components/askStatic.vue

@@ -183,7 +183,7 @@ export default {
         for (var i = 0; i < this.checkJson.length; i++) {
           // debuggerA
           let el = this.checkJson[i];
-          console.log(el);
+          // console.log(el);
         }
         this.checkJson2 = this.checkJson;
       },

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

@@ -223,7 +223,7 @@ export default {
         for (var i = 0; i < this.checkJson.length; i++) {
           // debuggerA
           let el = this.checkJson[i];
-          console.log(el);
+          // console.log(el);
         }
         this.checkJson2 = this.checkJson;
       },
@@ -234,7 +234,7 @@ export default {
     this.askJSONC = this.askJSON ? this.askJSON : {};
     for (var i = 0; i < this.checkJson.length; i++) {
       let el = this.checkJson[i];
-      console.log(el);
+      // console.log(el);
     }
     this.checkJson2 = this.checkJson;
   },

+ 28 - 0
src/components/courseDetail.vue

@@ -1188,6 +1188,26 @@ export default {
     };
   },
   methods: {
+		insertMemorandum(_html,tcid=""){//保存行为操作
+			//variable
+			//btn
+			let params = [{
+				uid:this.userid,
+				courseId:this.id+tcid,
+				content:_html
+			}]
+
+			this.ajax.post(this.$store.state.api+'insert_systemOperation_countdownBehavior',params).then(res=>{
+				if(res.data==1){
+					console.log('保存操作成功')
+				}else{
+					console.log('保存操作失败')
+				}
+			}).catch(e=>{
+				console.log('保存操作失败')
+				console.log(e)
+			})
+		},
     handleClose(done) {
       done();
     },
@@ -1209,6 +1229,13 @@ export default {
       this.$router.push(path);
     },
     gotoCourse(id) {
+			if(!id){
+				this.insertMemorandum(`开始为<span class='variable'>全部班级</span>授课`)
+			}else{
+				let _classData = this.classList.find(item=>item.id == id)
+				this.insertMemorandum(`开始为<span class='variable'>${_classData.name}</span>授课`,id)
+			}
+
       if (this.courseDetail.state == 1) {
         if (this.classList.length) {
           this.goTo(
@@ -1340,6 +1367,7 @@ export default {
     goToStudyOrDia(l) {
       if (l.length > 0) {
         this.dialogVisibleSk = true;
+				this.insertMemorandum("点击<span class='btn'>以班级授课</span>")
       } else {
 				this.getCourseDetail1().then(_=>{
 					if(this.classList.length<=0){

+ 1489 - 0
src/components/easy2/commpont/markDialog.vue

@@ -0,0 +1,1489 @@
+<template>
+  <div class="markDialog" v-loading="vLoading">
+    <div
+      style="overflow: auto;overflow-x: hidden;width: 315px;box-sizing: content-box;border-right: 1px rgba(231, 231, 231, 1) solid;"
+    >
+      <div class="left">
+        <div
+          v-if="finalMarkList == toolIndex"
+          v-loading="ScLoading"
+        >
+          <div class="scoreTit">
+            <div>任务得分</div>
+            <div>
+              <span style="color: rgba(54, 129, 252, 1);margin-right: 3px;">{{
+                totalScore ? totalScore : 0
+              }}</span
+              >分
+            </div>
+          </div>
+          <div class="allD">
+            <div class="scoreStar">
+              <div
+                v-show="reveal"
+                v-for="(e, index) in scoTitList"
+                :key="index + 'a'"
+              >
+                <div class="scoreStarBack" >
+                  <el-tooltip
+                    class="item"
+                    effect="dark"
+                    :content="e.detail"
+                    placement="top"
+                  >
+                    <div class="briefTit" >
+                      <img v-if="e.isai == 1 && e.isai" class="titRoot" src="../../../assets/icon/newIcons/blueRoot.png" alt="">
+                      {{ e.detail }}
+                    </div>
+                  </el-tooltip>
+                  <el-rate @change="submit" v-model="e.cog"></el-rate>
+                </div>
+              </div>
+              <div
+                v-show="!reveal"
+                v-for="(e, index) in scoTitList.slice(0, 3)"
+                :key="index + 'b'"
+              >
+                <div class="scoreStarBack">
+                  <el-tooltip
+                    class="item"
+                    effect="dark"
+                    :content="e.detail"
+                    placement="top"
+                  >
+                    <div class="briefTit">
+                      <img class="titRoot" v-if="e.isai == 1 && e.isai" src="../../../assets/icon/newIcons/blueRoot.png" alt="">
+                      {{ e.detail }}
+                    </div>
+                  </el-tooltip>
+                  <el-rate @change="submit" v-model="e.cog"></el-rate>
+                </div>
+              </div>
+            </div>
+
+            <div
+              v-if="reveal && scoTitList.length > 3"
+              class="scoreStar2"
+              @click="revealBtn"
+            >
+              折叠 <i class="el-icon-arrow-up"></i>
+            </div>
+            <div
+              v-if="!reveal && scoTitList.length > 3"
+              class="scoreStar2"
+              @click="revealBtn"
+            >
+              全部 <i class="el-icon-arrow-down"></i>
+            </div>
+          </div>
+          <div class="AreaCss">
+            <el-input
+              type="textarea"
+              placeholder="您可在此输入评语"
+              v-model="textarea"
+               @blur="submit"
+            >
+            <!-- style="padding-bottom: 10px;" -->
+
+            </el-input>
+            <!-- <div
+              class="AreaBtn"
+              v-if="
+                currentUid.type == 10 || currentUid.type == 13 || isMarkCom == 1
+              "
+              @click="generateMsg(currentUid)"
+            >
+              <span>重新生成</span>
+            </div> -->
+          </div>
+
+          <div
+            style="width:100%;display:flex;height: 25px;;justify-content: space-between;"
+          >
+            
+            <div ></div>
+
+            <div style="display: flex;">
+              <div
+                class="ScrBtn"
+                @click="reset"
+                style="color: rgba(0, 0, 0, 0.6);background-color: rgba(243, 247, 253, 1);border: none;"
+              >
+                清空
+              </div>
+              <div
+                class="ScrBtn"
+                style="margin-left: 10px;"
+                @click="AIsubmit(currentUid)"
+                v-if="
+                  currentUid.type == 10 || currentUid.type == 13 || isMarkCom == 1
+                "
+              >
+                <img
+                  src="../../../assets/icon/newIcons/Brootper.svg"
+                  alt=""
+                />AI评分
+              </div>
+              <!-- <div
+                class="ScrBtn"
+                @click="submit"
+                style="margin-left: 10px;color:#fff;border: none;background-color: rgba(54, 129, 252, 1);"
+              >
+                确认
+              </div> -->
+            </div>
+          </div>
+        </div>
+
+        <!-- 提交列表 -->       
+        <div style="flex: 1;display: flex;flex-direction: column;overflow: auto;">
+          <div class="workListTit" @click="workListTitBtn">
+            <i class="el-icon-arrow-down"></i>提交列表 ({{ workList.length }})
+          </div>
+          <div style="overflow: auto;flex: 1;">
+            <div
+              v-if="workListShow"
+              v-for="(i, index) in workList"
+              :key="index"
+              :class="['schPer', i.userid == DgUid ? 'selBlock' : '']"
+              style="cursor: pointer;"
+              @click="cutPer(i.userid,index)"
+            >
+              <img v-if="i.headportrait" :src="i.headportrait" alt="" />
+              <img
+                v-else
+                src="https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/static/img/portal.b3cf7fa.png"
+                alt=""
+              />
+
+              <div class="con">
+                <div class="tit">
+                  <span
+                    style="font-size: 14px;color: rgba(0, 0, 0, 0.9);font-weight: 400;"
+                    >{{ i.name }}</span
+                  >
+
+                  <span
+                    style="font-size: 14px;color:rgba(0, 0, 0, 0.4);"
+                    v-if="i.markSco == null"
+                    >未评分</span
+                  >
+                  <span
+                    v-else
+                    style="font-size: 16px;color: rgba(0, 0, 0, 0.9);font-weight: 600;"
+                    >{{ i.markSco }}</span
+                  >
+                </div>
+                <div class="Timer">{{ i.time }}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <!-- 作业展示区 -->
+    <div class="Rig">
+      <div class="RigTop">
+        <div
+          style="display: flex;align-items: center;justify-content: space-between;width: 100%;"
+        >
+          <div
+            class="schPer"
+            style="border: none;width: 300px;padding: 0;margin: 0;"
+          >
+            <img
+              v-if="currentUid.headportrait"
+              :src="currentUid.headportrait"
+              alt=""
+            />
+            <img
+              v-else
+              src="https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/static/img/portal.b3cf7fa.png"
+              alt=""
+            />
+            <div class="con">
+              <div class="tit">
+                <span
+                  style="font-size: 14px;color: rgba(0, 0, 0, 0.9);font-weight: 400;"
+                  >{{ currentUid.name }}</span
+                >
+              </div>
+              <div class="Timer">{{ currentUid.time }}</div>
+            </div>
+          </div>
+          <div class="cutStuBtn">
+            <div>
+              <span v-if="current == 0"  style="cursor: pointer;color:#ccc">上一个</span>
+              <span v-else @click="prevStu" style="cursor: pointer;color: rgba(54, 129, 252, 1)">上一个</span>
+            </div>
+            <div>
+              <span v-if="current >= workList.length -1"  style="cursor: pointer;color: #ccc">下一个</span>
+              <span v-else @click="nextStu" style="cursor: pointer;color: rgba(54, 129, 252, 1)">下一个</span>
+            </div>
+            <!-- <div><span @click="prevStu" v-if="this.current > 0">上一个</span></div>
+            <div><span @click="nextStu" v-if="this.current < this.workList.length-1">下一个</span></div> -->
+          </div>
+        </div>
+      </div>
+      <div class="RigConTit">
+        <div :class="[cutNum ? '' : 'RigConTitOn']" @click="cutPage(0)">
+          学生作业
+        </div>
+        <div :class="[cutNum ? 'RigConTitOn' : '']" @click="cutPage(1)">
+          点赞与评论
+        </div>
+      </div>
+      <div class="RigCon">
+        <!-- 作业内容  -->
+        <div v-if="cutNum == 0" style="height: 97%;">
+          <div
+            v-if="
+              currentUid.type == 13 || currentUid.type == 10
+              // currentUid.type == 15
+            "
+          >
+            <div class="cont" v-html="currentUid.content.text"></div>
+          </div>
+          <div v-if="currentUid.type == 1">
+            <img
+              @click="previewImg(currentUid.content)"
+              style="max-width: 100%;object-fit: cover;"
+              :src="currentUid.content"
+              alt=""
+            />
+          </div>
+          <div v-if="currentUid.type == 3">
+            <div style="width: 100%;text-align: center;">
+              <div
+                style="margin-bottom: 20px;font-weight: 600;font-size: 16px;"
+              >
+                {{ currentUid.content[0].answerTitle }}
+              </div>
+              <div>{{ currentUid.content[0].answer }}</div>
+            </div>
+          </div>
+          <div v-if="currentUid.type == 4" style="height: 100%;">
+            <iframe
+              v-if="ifPdf == 1"
+              style="width: 100%; height: 99%; border: none"
+              :src="
+                'https://cloud.cocorobo.cn/pdf.js/web/viewer.html?file=' +
+                  encodeURIComponent(currentUid.content)
+              "
+            ></iframe>
+
+            <iframe
+              v-else
+              style="width: 100%; height: 100%; border: none"
+              :src="
+                'https://view.officeapps.live.com/op/view.aspx?src=' +
+                  encodeURIComponent(currentUid.content)
+              "
+              frameborder="0"
+            ></iframe>
+          </div>
+          <div v-if="currentUid.type == 12" style="height: 100%;">
+            <!-- <div style="margin-bottom: 10px;">
+              <div
+                style="cursor: pointer;"
+                @click="downloadFile(currentUid.content)"
+              >
+                下载文件
+              </div>
+            </div> -->
+            <div>{{ TxtMd }}</div>
+            <!-- <div
+              v-html="htmlContent(currentUid.content)"
+            ></div> -->
+            
+          </div>
+          <div v-if="currentUid.type == 15" style="height: 100%;">
+            <div
+              class="worksAnswer"
+              v-if="currentUid.content"
+              @click="
+                openCocoPi(57, toolIndex, currentUid.userid, currentUid.name)
+              "
+            >
+              <img src="../../../assets/icon/codeFile.png" />
+              <div>点击打开CocoPi</div>
+            </div>
+          </div>
+          <div v-if="currentUid.type == 5" style="height: 100%;">
+            <video-player
+              class="video-player vjs-custom-skin"
+              :playsinline="true"
+              :options="playerOptions"
+              @play="onPlayerPlay($event)"
+              style="width: 90%; height: 95%; margin: 0 0 0 30px"
+            ></video-player>
+          </div>
+        </div>
+        <!-- 点赞与评论  -->
+        <div v-if="cutNum == 1">
+          <div style="display: flex;align-items: center;">
+            <img
+              style="margin-right: 3px;"
+              src="../../../assets/icon/newIcons/likeG.png"
+              alt=""
+            />点赞({{ likeList.length }})
+          </div>
+          <div class="likeList">
+            <div v-for="i in likeList" :key="i.id">{{ i.username }}</div>
+          </div>
+          <div style="display: flex;align-items: center;">
+            <img
+              style="margin-right: 3px;"
+              src="../../../assets/icon/newIcons/commG.png"
+              alt=""
+            />评论({{ commentList.length }})
+          </div>
+          <div class="commentListCss" v-if="commentList.length">
+            <div
+              style="padding-bottom: 25px;display: flex;justify-content: space-between;"
+              v-for="i in commentList"
+              :key="i.id"
+            >
+              <div class="schPer2" style="border: none;width: 90%;padding: 0;">
+                <img v-if="i.headportrait" :src="i.headportrait" alt="" />
+                <img
+                  v-else
+                  src="https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/static/img/portal.b3cf7fa.png"
+                  alt=""
+                />
+                <div class="con">
+                  <div class="tit2">
+                    <div class="TitName">{{ i.username }}</div>
+                    <span
+                      style="font-size: 14px;color: rgba(0, 0, 0, 0.9);font-weight: 400;width: 200px;"
+                      >{{ i.time }}</span
+                    >
+                  </div>
+                  <div class="Timer">{{ i.comment }}</div>
+                </div>
+              </div>
+              <div>
+                <span
+                  style="color: #3B7BD7;cursor: pointer;"
+                  @click="deleteComment(i.id)"
+                  >删除</span
+                >
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { v4 as uuidv4 } from "uuid";
+import MarkdownIt from "markdown-it";
+const getFile = (url) => {
+	return new Promise((resolve, reject) => {
+		var credentials = {
+			accessKeyId: "AKIATLPEDU37QV5CHLMH",
+			secretAccessKey: "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",
+		}; //秘钥形式的登录上传
+		window.AWS.config.update(credentials);
+		window.AWS.config.region = "cn-northwest-1"; //设置区域
+		let url2 = url;
+		let _url2 = "";
+		if (
+			url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+		) {
+			_url2 = url2.split(
+				"https://view.officeapps.live.com/op/view.aspx?src="
+			)[1];
+		} else {
+			_url2 = url2;
+		}
+		var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
+		let name = decodeURIComponent(
+			_url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+		);
+		var params = {
+			Bucket: "ccrb",
+			Key: name,
+		};
+		s3.getObject(params, function (err, data) {
+			if (err) {
+				console.log(err, err.stack);
+				resolve({ data: 1 });
+			} else {
+				const fileContent = data.Body.toString('utf-8');
+				resolve({ data: fileContent });
+			} // sxuccessful response
+		});
+		// axios({
+	});
+};
+export default {
+  props: [
+    "uid",
+    "stage",
+    "toolIndex",
+    "task",
+    "scoTit",
+    "markScoreVisible",
+    "markScoreworksStudent",
+    "finalMarkList"
+  ],
+  data() {
+    return {
+      textarea: "",
+      reveal: false, //得分详情框全部与折叠
+      workListShow: true, //作业显示
+      cutNum: 0, //作业与评论切换
+      scoTitList: [], //得分详情框数据
+      workList: [], //作业列表
+      cid: this.$route.query.courseId,
+      cUserid: this.$route.query.userid, //账号登录人id
+      cuScoCon: "", //学生作业内容
+      TxtMd:'',   //txt,md作业内容
+      currentUid: {}, //当前评分框学生信息
+      current: "", //上一位下一位中的第几位
+      DgUid: this.uid, //当前评分框学生id
+      likeList: [], //喜欢list
+      commentList: [], //评分list
+      workId: "", //作业id。用于分类评论与点赞list
+      vLoading: false,
+      allSco: 0,
+      ifPdf: 1,
+      ScLoading: false,
+      playerOptions: {
+        playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
+        autoplay: false, //如果true,浏览器准备好时开始回放。
+        muted: false, // 默认情况下将会消除任何音频。
+        loop: false, // 导致视频一结束就重新开始。
+        preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
+        language: "zh-CN",
+        aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
+        fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
+        sources: [
+          {
+            type: "video/mp4", //这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目   || "video/ogg"|| "video/webm"
+            src: "" //url地址require("../../../assets/media/aaa.mp4")
+          }
+        ],
+        // poster: require("../../../assets/tu31.png"), //你的封面地址
+        // poster: dataRes.imgUrl, //你的封面地址
+        notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
+        controlBar: {
+          timeDivider: true, //当前时间和持续时间的分隔符
+          durationDisplay: true, //显示持续时间
+          remainingTimeDisplay: false, //是否显示剩余时间功能
+          fullscreenToggle: true //全屏按钮
+        }
+      },
+      xianObj: ["DOCX", "MD", "TXT", "PDF"]
+    };
+  },
+  watch: {
+    markScoreVisible(newVal) {
+      this.workListShow = true;
+      this.reveal = false;
+      this.cutNum = 0;
+      this.textarea = "";
+      this.scoTitList = JSON.parse(JSON.stringify(this.scoTit));
+      this.selectSWorksData();
+    }
+  },
+  computed: {
+    totalScore() {
+      let a = 0;
+
+      this.scoTitList.forEach(e => {
+        if (e.cog) {
+          a += e.cog * 1;
+        }
+      });
+      
+      return (a / this.scoTit.length).toFixed(1);
+    },
+    isMarkCom() {
+      // console.log('a',this.currentUid);
+      if (this.currentUid.type == 4 || this.currentUid.type == 12) {
+        let a = this.currentUid.content.slice(
+          this.currentUid.content.lastIndexOf(".") + 1
+        );
+
+        if (this.xianObj.indexOf(a.toUpperCase()) != -1) {
+          return 1;
+        } else {
+          return 0;
+        }
+      } else {
+        return 0;
+      }
+    }
+  },
+  mounted() {
+    this.scoTitList = JSON.parse(JSON.stringify(this.scoTit));
+
+    this.selectSWorksData();
+  },
+  methods: {
+    // 预览图片
+    previewImg(url) {
+      //预览图片
+      this.$hevueImgPreview(url);
+    },
+    onPlayerPlay() {},
+
+    // 获取文档id
+    createFileid(url) {
+      let _this = this;
+      return new Promise((resolve, reject) => {
+        try {
+          _this.ajax
+            .put("https://gpt4.cocorobo.cn/upload_file_knowledge", {
+              url: url
+            })
+            .then(res => {
+              let _data = res.data.FunctionResponse;
+              if (_data.result && _data.result.id) {
+                resolve(_data.result.id);
+              } else {
+                resolve(1);
+              }
+            })
+            .catch(function(error) {
+              resolve(1);
+            });
+        } catch (e) {
+          resolve(1);
+        }
+      });
+    },
+
+    // 老师提交评分
+    submit() {
+      let data = this.scoTitList.map(e => {
+        return e.detail + ":" + e.cog;
+      });
+      // console.log("data", data);
+      const processedData = {};
+
+      data.forEach(item => {
+        const [key, value] = item.split(":");
+        processedData[key] = Number(value) ? Number(value) : 0;
+      });
+
+      processedData.content = this.textarea;
+      // console.log(processedData);
+      let params = {
+        cid: this.cid,
+        s: this.stage,
+        t: this.task,
+        rate: JSON.stringify(processedData),
+        uid: this.DgUid
+      };
+      // return console.log(params);
+      this.ajax
+        .get(this.$store.state.api + "updateWorksEva", params)
+        .then(res => {
+          // this.$message({
+          //   message: "评价成功",
+          //   type: "success"
+          // });
+          this.ScLoading = false;
+
+          // this.selectSWorksData();
+          // this.$emit("refreshOther", this.toolIndex);
+        })
+        .catch(err => {
+          this.$message.error("评价失败");
+          console.error(err);
+        });
+    },
+
+    // 重置
+    reset() {
+      this.$confirm("是否清空评分和评语?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          this.scoTitList.forEach(e => {
+            e.cog = 0;
+          });
+          this.textarea = "";
+        })
+        .catch(() => {});
+    
+      // this.scoTitList = JSON.parse(JSON.stringify(this.scoTit));
+    },
+
+    // ai评分
+    async AIsubmit(work) {
+      // return console.log("con", this.scoTit, this.cuScoCon);
+      this.ScLoading = true;
+      let _fileid = "";
+      if (work.type == 4 || work.type == 12) {
+        _fileid = await this.createFileid(work.content);
+      }
+      let tit = JSON.parse(JSON.stringify(this.scoTit));
+      tit.forEach((e, index) => {
+        if (!e.isai) {
+          e.isai = 1;
+        }
+      });
+      let con = this.cuScoCon;
+
+      let laws = "";
+      for (let i = 0; i < tit.length; i++) {
+        if (tit[i].isai == 1) {
+          let a = tit[i].detail
+          let result = a.match(/[\u4e00-\u9fa5a-zA-Z]+/g).join("");
+        
+          laws += `评价维度:“${result}”, 评价细则:${tit[i].rule} \n`;
+        }
+      }
+
+      let msg = `NOTICE
+      Role: 你是一个专业的项目式学习导师,你要对学生的评价高度负责。你要根据“六级评价细则”给学生作品评分,并生成需要的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.
+      ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
+      Instruction: Based on the context, follow "Format example", write content.
+
+      #Context
+      ##要求
+      根据<评价细则>和<作业内容>的相关性评价作业,判断该作业属于六级中的哪个等级,结合“评价细则”和等级写评语。如果作业内容与评价细则无关,则直接评为0星。
+
+      ##评分资料
+      评价细则:${laws}
+      作业内容:${_fileid ? "上传的文件内容" : con}
+
+      #输出要求#
+      输出每个维度的“等级”和作业的综合性“评语”
+      “评语”控制在150字左右
+      评价维度要按原样输出,只输出 ##评分资料 “评分细则”引号内的
+
+
+      # Format example
+      [{'评价维度':'评价等级0-5(数字)'},{'评价维度':'评价等级0-5(数字)'},{'评价维度':'评价等级0-5(数字)'},{'评价维度':'评价等级0-5(数字)'},{'评语':'评语(150个字左右)'}]
+      `;
+      // console.log(msg);
+      this.aiGet2(msg, _fileid);
+    },
+
+    // ai打分
+    aiGet2(messages, _fileid) {
+      let _this = this;
+
+      let params = {
+        assistant_id: "6063369f-289a-11ef-8bf4-12e77c4cb76b",
+        message: [
+          {
+            type: "text",
+            text: messages.replaceAll("\n", " ").replaceAll("*", "")
+          }
+        ],
+        session_name: uuidv4(),
+        userId: this.cUserid,
+        file_ids: _fileid ? [_fileid] : [],
+        model: "gpt-4o-2024-08-06"
+      };
+      this.ajax
+        .post("https://gpt4.cocorobo.cn/ai_agent_park_chat", params)
+        .then(response => {
+          let data = response.data.FunctionResponse;
+          console.log("data", data);
+          if (data.message) {
+            let dArray = {};
+            try {
+              dArray = JSON.parse(
+                data.message.replaceAll("```json", "").replaceAll("```", "")
+              );
+            } catch (error) {
+              console.log("error_________________" + error);
+              try {
+                let regex = new RegExp("(?<=```json)([\\s\\S]*?)(?=```)");
+
+                let match = data.message.match(regex);
+                dArray = JSON.parse(
+                  match[0]
+                    .replace(/\n/g, "")
+                    .replace(/\s{2,}/g, "")
+                    .replace(/\'/g, '"')
+                );
+              } catch (error) {
+                try {
+                  dArray = JSON.parse(
+                    data.message
+                      .replaceAll("```json", "")
+                      .replaceAll("# Solution", "")
+                      .replaceAll("```", "")
+                      .replace(/\n/g, "")
+                      .replace(/\s{2,}/g, "")
+                      .replace(/\'/g, '"')
+                  );
+                } catch (error) {
+                  console.log("error_________________" + error);
+                }
+                console.log("error_________________" + error);
+              }
+            }
+
+            let processedData = {};
+            // console.log(JSON.parse(JSON.stringify(dArray)));
+
+            dArray.forEach(function(item) {
+              let key = Object.keys(item)[0];
+              let value = item[key];
+              processedData[key] = value;
+            });
+
+
+            // 判断返回数据正确数量
+            let IsAIsuccess = 0
+            for (const tKey in this.scoTitList) {
+              for (const key in processedData) {
+                let result = this.scoTitList[tKey].detail.match(/[\u4e00-\u9fa5a-zA-Z]+/g).join("");
+                let key2 = key.match(/[\u4e00-\u9fa5a-zA-Z]+/g).join("");
+                if (key != "评语") {
+                  let isNumK = /^\d+(\.\d+)?$/.test(processedData[key]);
+                  if (result.indexOf(key2) != -1 && isNumK) {
+                     IsAIsuccess++
+                  }
+                  continue;
+                }
+              }
+              continue;
+            }
+
+            // 计算可以ai评分的评价标准数量
+            let scotNum = 0
+            this.scoTitList.forEach(e=>{
+              if (e.isai == 1 && e.isai) {
+                scotNum++
+              }
+            })
+
+
+            if (IsAIsuccess != scotNum) {
+              console.log('评价失败');
+              
+              this.aiGet2(messages,_fileid)
+              return
+            }
+
+            for (const key in processedData) {
+              if (key == "评语") {
+                processedData.content = processedData[key];
+              }
+            }
+            delete processedData["评语"];
+
+            let params = {
+              cid: _this.cid,
+              s: _this.stage,
+              t: _this.task,
+              rate: JSON.stringify(processedData),
+              uid: _this.DgUid
+            };
+            _this.ajax
+              .get(_this.$store.state.api + "updateWorksEva", params)
+              .then(res => {
+                _this.$message({
+                  message: "评价成功",
+                  type: "success"
+                });
+
+                _this.ScLoading = false;
+                _this.selectSWorksData();
+              })
+              .catch(err => {
+                // _this.ScLoading = false;
+                // _this.$message.error("评价失败");
+                this.aiGet2(messages,_fileid)
+
+                console.error(err);
+              });
+          }
+          this.$forceUpdate();
+        })
+        .catch(error => {
+          // _this.$message.error("评价失败");
+          // _this.ScLoading = false;
+          this.aiGet2(messages,_fileid)
+
+          console.log(error);
+        });
+    },
+    // 上一个
+    prevStu() {
+      if (this.ScLoading) return this.$message.info("请稍后,正在ai评价中");
+      if (this.current > 0) {
+        this.current--;
+        this.DgUid = this.workList[this.current].userid;
+        this.selectSWorksData();
+      } else {
+        this.$message.info("已经是第一位了");
+      }
+    },
+    // 下一个
+    nextStu() {
+      if (this.ScLoading) return this.$message.info("请稍后,正在ai评价中");
+
+      if (this.current < this.workList.length - 1) {
+        this.current++;
+        this.DgUid = this.workList[this.current].userid;
+        this.selectSWorksData2();
+      } else {
+        this.$message.info("已经是最后一位了");
+      }
+    },
+    // 提交列表点击切换
+    cutPer(val,index) {
+      if (this.ScLoading) return this.$message.info("请稍后,正在ai评价中");
+
+      this.current = index;
+      this.DgUid = val;
+      this.selectSWorksData2();
+    },
+    // 任务得分折叠
+    revealBtn() {
+      this.reveal = !this.reveal;
+    },
+    // 提交列表折叠
+    workListTitBtn() {
+      this.workListShow = !this.workListShow;
+    },
+    // 点赞与评论切换
+    cutPage(val) {
+      this.cutNum = val;
+    },
+    // 删除评论
+    deleteComment(wid) {
+      this.$confirm("确定删除此评论吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          let params = {
+            id: wid
+          };
+          this.ajax
+            .get(this.$store.state.api + "deleteComment2", params)
+            .then(res => {
+              this.$message({
+                message: "删除评论成功",
+                type: "success"
+              });
+              this.selectSWorksData();
+            })
+            .catch(err => {
+              console.error(err);
+            });
+        })
+        .catch(() => {});
+    },
+    openCocoPi(tool, i, uid, uname) {
+      // return console.log('?????',tool, i, uid, uname);
+
+      let student = {
+        userid: uid,
+        student: uname
+      };
+      if (tool == 57) {
+        window.parent.postMessage(
+          {
+            tools: tool + "teacher",
+            cid: this.cid,
+            stage: this.stage,
+            task: this.task,
+            tool: this.toolIndex,
+            student: student
+          },
+          "*"
+        );
+      }
+    },
+    //全部作业
+    selectSWorksData() {
+      this.vLoading = true;
+      this.textarea = "";
+
+      let params = {
+        uid: this.DgUid,
+        cid: this.cid,
+        s: this.stage,
+        t: this.task,
+        g: this.toolIndex
+      };
+      // return console.log(params);
+      this.ajax
+        .get(this.$store.state.api + "selectMarkDialogWorks", params)
+        .then(res => {
+          let data = res.data[0];
+
+          // markSco为提交列表展示的分数
+          data.forEach(e => {
+            if (e.rate) {
+              let data2 = JSON.parse(e.rate);
+
+              e.markSco = 0;
+              let k = 0
+
+              for (const key in data2) {
+                if (data2[key] && key != "content" || data2[key] == "0" ) {
+                  e.markSco += data2[key] * 1;
+                }else{
+                  k += 1
+                }
+              }
+              
+              if (k > 1) {
+                e.markSco = null;
+              }else{
+                e.markSco = (e.markSco / this.scoTitList.length).toFixed(1);
+              }
+            } else {
+              e.markSco = null;
+            }
+          });
+          // 提交列表
+          this.workList = data;
+
+          data.forEach((e, index) => {
+            if (e.userid == this.DgUid) {
+              this.currentUid = e;
+              console.log('e',e);
+              
+              // 1截图  3问答 4word文档类型 5视频  10表格 13文档 
+
+              if (
+                this.currentUid.type == 3 ||
+                this.currentUid.type == 10 ||
+                this.currentUid.type == 13
+                // this.currentUid.type == 15
+              ) {
+                this.currentUid.content = JSON.parse(e.content);
+                this.cuScoCon = this.currentUid.content.text;
+              }
+              if (this.currentUid.type == 4) {
+                let a = this.currentUid.content;
+                let data = a.slice(a.lastIndexOf(".") + 1);
+                this.cuScoCon = this.currentUid.content;
+
+                if (data == "pdf") {
+                  this.ifPdf = 1;
+                } else {
+                  this.ifPdf = 0;
+                }
+              }
+              if (this.currentUid.type == 5) {
+                this.playerOptions.sources[0].src = this.currentUid.content;
+              }
+              if (this.currentUid.type == 12) {
+                this.TxtMd = ''
+                getFile(this.currentUid.content).then(res=>{
+                  this.TxtMd = res.data;
+                })
+               
+              }
+              this.current = index;
+              this.workId = e.id;
+              this.appraise(e);
+            }
+          });
+
+          let likeData = res.data[1];
+          this.likeList = [];
+          likeData.forEach(e => {
+            if (e.workId == this.workId) {
+              this.likeList.push(e);
+            }
+          });
+
+          let commentData = res.data[2];
+          this.commentList = [];
+          commentData.forEach(e => {
+            if (e.workId == this.workId) {
+              this.commentList.push(e);
+            }
+          });
+          this.vLoading = false;
+        });
+    },
+
+    selectSWorksData2() {
+      this.vLoading = true;
+      this.textarea = "";
+
+      let params = {
+        uid: this.DgUid,
+        cid: this.cid,
+        s: this.stage,
+        t: this.task,
+        g: this.toolIndex
+      };
+      // return console.log(params);
+      this.ajax
+        .get(this.$store.state.api + "selectMarkDialogWorks", params)
+        .then(res => {
+          let data = res.data[0];
+
+          // 计算markSco提交列表分数
+          data.forEach(e => {
+            if (e.rate) {
+              let data2 = JSON.parse(e.rate);
+
+              e.markSco = 0;
+              let k = 0
+
+              for (const key in data2) {
+                if (data2[key] && key != "content" || data2[key] == "0" ) {
+                  e.markSco += data2[key] * 1;
+                }else{
+                  k += 1
+                }
+              }
+              
+              if (k > 1) {
+                e.markSco = null;
+              }else{
+                e.markSco = (e.markSco / this.scoTitList.length).toFixed(1);
+              }
+            } else {
+              e.markSco = null;
+            }
+          });
+          // 提交列表
+          this.workList = data;
+
+
+          // 划分作业类型
+          data.forEach((e, index) => {
+            if (e.userid == this.DgUid) {
+              this.currentUid = e;
+              // 1截图  3问答 4word文档类型 5视频  10表格 13文档 
+              if (
+                this.currentUid.type == 3 ||
+                this.currentUid.type == 10 ||
+                this.currentUid.type == 13
+                // this.currentUid.type == 15
+              ) {
+                this.currentUid.content = JSON.parse(e.content);
+                this.cuScoCon = this.currentUid.content.text;
+              }
+              if (this.currentUid.type == 4) {
+                let a = this.currentUid.content;
+                let data = a.slice(a.lastIndexOf(".") + 1);
+
+                if (data == "pdf") {
+                  this.ifPdf = 1;
+                } else {
+                  this.ifPdf = 0;
+                }
+                this.cuScoCon = this.currentUid.content;
+
+              }
+              if (this.currentUid.type == 5) {
+                this.playerOptions.sources[0].src = this.currentUid.content;
+              }
+              if (this.currentUid.type == 12) {
+                this.TxtMd = ''
+                getFile(this.currentUid.content).then(res=>{
+                  this.TxtMd = res.data;
+                })
+               
+              }
+              
+              this.workId = e.id;
+              this.appraise(e);
+            }
+          });
+
+          let likeData = res.data[1];
+          this.likeList = [];
+          likeData.forEach(e => {
+            if (e.workId == this.workId) {
+              this.likeList.push(e);
+            }
+          });
+
+          let commentData = res.data[2];
+          this.commentList = [];
+          commentData.forEach(e => {
+            if (e.workId == this.workId) {
+              this.commentList.push(e);
+            }
+          });
+          this.vLoading = false;
+        });
+    },
+    
+    downloadFile(url) {
+      var credentials = {
+        accessKeyId: "AKIATLPEDU37QV5CHLMH",
+        secretAccessKey: "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"
+      }; //秘钥形式的登录上传
+      window.AWS.config.update(credentials);
+      window.AWS.config.region = "cn-northwest-1"; //设置区域
+      let url2 = url;
+      let _url2 = "";
+      if (
+        url2.indexOf("https://view.officeapps.live.com/op/view.aspx?src=") != -1
+      ) {
+        _url2 = url2.split(
+          "https://view.officeapps.live.com/op/view.aspx?src="
+        )[1];
+      } else {
+        _url2 = url2;
+      }
+      const loading2 = this.$loading.service({
+        background: "rgba(255, 255, 255, 0.7)",
+        target: document.body,
+        text: "文件加载中..."
+      });
+      var s3 = new window.AWS.S3({ params: { Bucket: "ccrb" } });
+      let name = decodeURIComponent(
+        _url2.split("https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/")[1]
+      );
+      var params = {
+        Bucket: "ccrb",
+        Key: name
+      };
+      s3.getObject(params, function(err, data) {
+        loading2.close();
+        if (err) console.log(err, err.stack);
+        // an error occurred
+        else {
+          let url = window.URL.createObjectURL(new Blob([data.Body]));
+          let a = document.createElement("a");
+          a.name = name;
+          a.href = url;
+          a.download = name;
+          a.click();
+          console.log(data);
+        } // sxuccessful response
+      });
+    },
+    // 处理任务的分展示
+    appraise(val) {
+      if (val.rate) {
+       
+        let data = JSON.parse(val.rate);
+        this.scoTitList.forEach((e, index) => {
+          e.cog = null;
+          for (const key in data) {
+
+            let result = e.detail.match(/[\u4e00-\u9fa5a-zA-Z]+/g).join("");
+            let key2 = key.match(/[\u4e00-\u9fa5a-zA-Z]+/g).join("");
+
+            if (result.indexOf(key2) != -1) {
+              e.cog = data[key];
+            }
+            if ("content" == key) {
+              this.textarea = data[key];
+            }
+          }
+        });
+      } else {
+        this.scoTitList.forEach(e => {
+          e.cog = 0;
+        });
+      }
+    }
+  }
+};
+</script>
+
+<style scoped>
+.markDialog {
+  display: flex;
+  /* height: 100%; */
+  min-height: 600px;
+  height: 100%;
+}
+.left {
+  /* overflow: auto; */
+  width: 310px;
+  /* border-right: 1px rgba(231, 231, 231, 1) solid; */
+  padding: 20px 20px 0;
+  box-sizing: border-box;
+  padding-right: 10px;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+}
+
+.Rig {
+  flex: 1;
+  padding: 15px;
+  display: flex;
+  flex-direction: column;
+}
+.RigTop {
+  border-bottom: 1px rgba(231, 231, 231, 1) solid;
+  padding: 0px 0 15px;
+}
+.AreaCss {
+  position: relative;
+  margin-bottom: 5px;
+}
+.AreaCss >>> .el-textarea__inner {
+  min-height: 150px !important;
+  /* max-height: 150px; */
+  /* padding-bottom: 20px; */
+}
+.AreaBtn {
+  position: absolute;
+  width: calc(100% - 30px);
+  text-align: right;
+  background-color: #fff;
+  bottom: 11px;
+  right: 20px;
+  color: rgba(54, 129, 252, 1);
+  cursor: pointer;
+}
+.likeList {
+  width: 100%;
+  display: flex;
+  padding: 10px 0;
+  flex-wrap: wrap;
+}
+.likeList > div {
+  padding: 4px 0px;
+  background-color: rgba(243, 247, 253, 1);
+  margin-right: 10px;
+  width: calc((100% - 60px) / 7);
+  text-align: center;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+  margin-bottom: 10px;
+}
+.likeList > div:nth-child(7n) {
+  margin-right: 0px;
+}
+.commentListCss {
+  background-color: #fafafa;
+  padding: 25px 15px 0;
+  box-sizing: border-box;
+  margin-top: 10px;
+  border-radius: 5px;
+}
+.RigConTit {
+  width: 100%;
+  display: flex;
+  margin: 10px 0;
+}
+.RigConTit > div {
+  font-size: 14px;
+  color: rgba(0, 0, 0, 0.6);
+  padding: 8px;
+  cursor: pointer;
+}
+.RigConTitOn {
+  border-bottom: 3px solid rgba(54, 129, 252, 1);
+}
+.RigCon {
+  width: 100%;
+  overflow: auto;
+  flex: 1;
+  padding: 10px 0;
+  box-sizing: border-box;
+  /* background-color: aqua; */
+}
+.selBlock {
+  background-color: #f3f7fd !important;
+  border: 1px #68a0fc solid !important;
+}
+.cutStuBtn {
+  display: flex;
+  color: rgba(54, 129, 252, 1);
+}
+.cutStuBtn > div {
+  margin-left: 10px;
+}
+.scoreTit {
+  font-size: 16px;
+  font-weight: 600;
+  display: flex;
+  justify-content: space-between;
+  box-sizing: border-box;
+  color: rgba(0, 0, 0, 0.9);
+}
+.allD {
+  margin: 10px 0;
+  min-height: 60px;
+  background-color: #f3f7fd;
+  margin-left: 17px;
+
+}
+.scoreStar2 {
+  padding: 0 10px 10px;
+  height: 100%;
+  flex: 1;
+  color: rgba(54, 129, 252, 1);
+  cursor: pointer;
+}
+.scoreStar {
+  padding: 0px 10px 10px;
+  height: 100%;
+  flex: 1;
+}
+
+.scoreStarBack {
+  flex: 1;
+  display: flex;
+  justify-content: space-between;
+  padding-top: 10px;
+  position: relative;
+}
+/* .scoreStar > div:first-child > .scoreStarBack {
+  margin-top: 0;
+} */
+.ScrBtn {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  cursor: pointer;
+  padding: 2px 8px;
+  border-radius: 5px;
+  color: rgba(54, 129, 252, 1);
+  border: 1px rgba(54, 129, 252, 1) solid;
+}
+.worksAnswer {
+  color: #4078dd;
+  margin: 10px 0;
+  font-size: 16px;
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+}
+
+.worksAnswer > img {
+  width: 100%;
+  height: 300px;
+  object-fit: contain;
+  margin: 0 auto;
+  display: block;
+}
+
+.briefTit {
+  width: 120px;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  
+}
+.briefTit > .titRoot{
+  position: absolute;
+  top: 0;
+  left: -27px;
+  transform: translate(0,10px);
+}
+.workListTit {
+  color: rgba(0, 0, 0, 0.6);
+  font-size: 12px;
+  font-weight: 400;
+  margin: 10px 0;
+  cursor: pointer;
+}
+.schPer2 {
+  padding: 10px;
+  box-sizing: border-box;
+  display: flex;
+  border-radius: 5px;
+  border: 1px solid rgba(240, 242, 245, 1);
+  /* margin-bottom: 10px; */
+}
+.schPer2 > img {
+  width: 45px;
+  height: 45px;
+  border-radius: 50%;
+  object-fit: cover;
+}
+.schPer {
+  padding: 10px;
+  box-sizing: border-box;
+  display: flex;
+  border-radius: 5px;
+  border: 1px solid rgba(240, 242, 245, 1);
+  margin-bottom: 10px;
+}
+.schPer > img {
+  width: 40px;
+  height: 40px;
+  border-radius: 50%;
+  object-fit: cover;
+}
+.con {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  padding: 0 10px;
+  box-sizing: border-box;
+}
+.con > .tit {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+.con > .tit2 {
+  width: 100%;
+  display: flex;
+  margin-bottom: 15px;
+}
+
+.TitName {
+  width: 70px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  margin-right: 10px;
+}
+.worksAnswer {
+  color: #4078dd;
+  margin: 10px 0;
+  font-size: 16px;
+  position: relative;
+}
+
+.worksAnswer > img {
+  width: 500px;
+  height: 300px;
+  object-fit: contain;
+  margin: 0 auto;
+  display: block;
+}
+.cont {
+  overflow-wrap: break-word;
+  word-break: break-word;
+  white-space: pre-line;
+}
+.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: 5px 10px;
+  max-width: 0px;
+  height: 30px;
+  vertical-align: baseline;
+  box-sizing: border-box;
+}
+.video-player >>> .video-js {
+  height: 100%;
+}
+.markBox{
+  padding: 20px 14px;
+  line-height: 29px;
+  font-size: 16px;
+  background: #f4f4f4;
+  border-radius: 5px;
+}
+</style>

+ 302 - 181
src/components/easy2/commpont/markScore.vue

@@ -1,33 +1,65 @@
 <template>
   <div>
-    <div v-loading="loading">
+    <div v-loading="loading" style="cursor: pointer;" @click.stop="markScoreDigBtn">
       <div class="scoreTit">
         <div>任务得分</div>
         <div>{{ totalScore ? totalScore : 0 }}分</div>
       </div>
-      <div class="scoreStar">
-        <div v-for="(e, index) in scoTitList" :key="index">
-          <div class="scoreStarBack">
-            <el-tooltip
-              class="item"
-              effect="dark"
-              :content="e.value"
-              placement="top"
-            >
-              <div class="briefTit">{{ e.value }}</div>
-            </el-tooltip>
-
-            <el-rate v-model="e.cog"></el-rate>
+      <div class="allD">
+        <div class="scoreStarBack2">
+          <div
+            v-for="(e, index) in scoTitList"
+            :key="index"
+            style="height: 30px;"
+          >
+            <img
+              class="rootImg"
+              v-if="e.isai == 1 && e.isai"
+              src="../../../assets/icon/newIcons/blueRoot.png"
+              alt=""
+            />
           </div>
         </div>
+        <div class="scoreStar">
+          <div v-for="(e, index) in scoTitList" :key="index">
+            <div class="scoreStarBack">
+              <el-tooltip
+                class="item"
+                effect="dark"
+                :content="e.detail"
+                placement="top"
+              >
+                <div class="briefTit">
+                  {{ e.detail }}
+                </div>
+              </el-tooltip>
+              <el-rate
+                disabled
+                disabled-void-color="#ccc"
+                v-model="e.cog"
+              ></el-rate>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="AreaCss">
+        {{ textarea }}
+        <!-- <el-input
+          type="textarea"
+          disabled
+          placeholder="您可在此输入评语"
+          v-model="textarea"
+          style="padding-bottom: 10px;"
+        >
+        </el-input> -->
       </div>
-      <div style="width:100%;display:flex;justify-content: flex-end;">
+      <!-- <div style="width:100%;display:flex;justify-content: flex-end;">
         <el-button size="mini" @click="reset">重置</el-button>
         <el-button type="primary" size="mini" @click="submit">确认</el-button>
         <el-button type="primary" size="mini" @click="AIsubmit"
           >AI评分</el-button
         >
-      </div>
+      </div> -->
     </div>
   </div>
 </template>
@@ -42,12 +74,9 @@ export default {
     "scoCon",
     "task",
     "stage",
-    "allData",
     "loading",
     "wIndex",
     "toolIndex",
-    "toolDetail",
-    "refreshKey"
   ],
 
   data() {
@@ -65,17 +94,31 @@ export default {
   computed: {
     totalScore() {
       let a = 0;
+      let isPing = 0;
       this.scoTitList.forEach(e => {
-        a += e.cog;
+        if (e.cog || e.cog == "0") {
+          a += e.cog * 1;
+        } else {
+          isPing += 1;
+        }
       });
+
       let data = 0;
-      data = (a / this.scoTit.length).toFixed(1);
-      this.$emit("updateDocSco", {
-        val: this.toolIndex,
-        val2: this.wIndex,
-        val3: data
-      });
-    
+      if (isPing == this.scoTit.length) {
+        this.$emit("updateDocSco", {
+          val: this.toolIndex,
+          val2: this.wIndex,
+          val3: null
+        });
+      } else {
+        data = (a / this.scoTit.length).toFixed(1);
+        this.$emit("updateDocSco", {
+          val: this.toolIndex,
+          val2: this.wIndex,
+          val3: data
+        });
+      }
+
       return data;
     }
   },
@@ -86,8 +129,38 @@ export default {
   },
 
   methods: {
+   
+    // // 获取文档id
+    createFileid(url) {
+      let _this = this;
+      return new Promise((resolve, reject) => {
+        try {
+          _this.ajax
+            .put("https://gpt4.cocorobo.cn/upload_file_knowledge", {
+              url: url
+            })
+            .then(res => {
+              let _data = res.data.FunctionResponse;
+              if (_data.result && _data.result.id) {
+                resolve(_data.result.id);
+              } else {
+                resolve(1);
+              }
+            })
+            .catch(function(error) {
+              resolve(1);
+            });
+        } catch (e) {
+          resolve(1);
+        }
+      });
+    },
+
     // 获取单个数据
     getData() {
+      // this.fileId =[]
+      // console.log(' this.scoCon', this.scoCon);
+      
       let params = {
         uid: this.scoCon.userid,
         cid: this.id
@@ -95,83 +168,81 @@ export default {
       this.ajax
         .get(this.$store.state.api + "selectWorksEvaScore", params)
         .then(res => {
-          // console.log(res);
+          // console.log("res", res.data);
+
           if (res.data[0].length > 0) {
-            let data2 = [];
+            var data2 = [];
             res.data[0].forEach((val, index) => {
               if (val.task == this.task) {
                 data2 = res.data[0][index];
+                this.homeworkVal = res.data[0][index];
               }
             });
-
-            let data = JSON.parse(data2.rate);
-
-            this.scoTitList.forEach((e, index) => {
-              e.cog = 0;
-              for (const key in data) {
-                if (e.value == key) {
-                  e.cog = data[key] * 1;
+            // console.log('data2',data2);
+            
+            if (data2.length == 0) {
+              this.scoTitList = JSON.parse(JSON.stringify(this.scoTit));
+            } else {
+              let data = JSON.parse(data2.rate);
+              this.scoTitList.forEach((e, index) => {
+                e.cog = null;
+                for (const key in data) {
+                  // if (e.value.endsWith('。')) {
+                  //   e.value = e.value.slice(0, -1); // 如果字符串以句号结尾,则去除最后一个字符
+                  // }
+                  let result = e.detail.match(/[\u4e00-\u9fa5a-zA-Z]+/g).join("");
+                  let key2 = key.match(/[\u4e00-\u9fa5a-zA-Z]+/g).join("");
+
+                  if (result.indexOf(key2) != -1) {
+                    e.cog = data[key];
+                  }
+                  if ("content" == key) {
+                    this.textarea = data[key];
+                  }
                 }
-              }
-            });
+              });
+              this.scoTitList = JSON.parse(JSON.stringify(this.scoTitList));
 
-            // console.log("this.scoTitList", this.scoTitList);
+              // console.log(this.scoTitList);
+            }
+          } else {
+            this.scoTitList = JSON.parse(JSON.stringify(this.scoTit));
           }
         })
         .catch(err => {
           console.error(err);
         });
     },
+    markScoreDigBtn() {
+      this.$emit("markScoreDig", {
+        val: this.stUid,
+        val2: this.toolIndex,
+        tit: this.scoTit,
+        uname:this.scoCon.sName
+      });
+    },
     // 重置
     reset() {
-      console.log("this.scoTitList", this.scoTitList);
       this.scoTitList.forEach(e => {
         e.cog = 0;
+        // console.log(e.cog);
       });
-      // let data = this.scoTitList.map(e => {
-      //   return e.value + ":" + e.cog;
-      // });
-      // // console.log("data", data);
-      // const processedData = {};
-
-      // data.forEach(item => {
-      //   const [key, value] = item.split(":");
-      //   processedData[key] = 0;
-      // });
-      // processedData.content = "";
-      // this.scoTitList = processedData
-      // // return console.log(processedData);
-      // let params = {
-      //   cid: this.id,
-      //   s: this.stage,
-      //   t: this.task,
-      //   rate: JSON.stringify(processedData),
-      //   uid: this.stUid
-      // };
-      // // return console.log(params);
-      // this.ajax
-      //   .get(this.$store.state.api + "updateWorksEva", params)
-      //   .then(res => {
-      //     this.getData();
-      //   })
-      //   .catch(err => {
-      //     this.$message.error("重置失败");
-      //     console.error(err);
-      //   });
     },
+
     // 老师提交评分
     submit() {
       let data = this.scoTitList.map(e => {
-        return e.value + ":" + e.cog;
+        return e.detail + ":" + e.cog;
       });
       // console.log("data", data);
       const processedData = {};
 
       data.forEach(item => {
         const [key, value] = item.split(":");
-        processedData[key] = Number(value);
+        processedData[key] = Number(value) ? Number(value) : 0;
       });
-      processedData.content = "";
+
+      processedData.content = this.textarea;
       // console.log(processedData);
       let params = {
         cid: this.id,
@@ -188,6 +259,7 @@ export default {
             message: "评价成功",
             type: "success"
           });
+          this.$emit("refreshOther", this.toolIndex);
         })
         .catch(err => {
           this.$message.error("评价失败");
@@ -198,8 +270,12 @@ export default {
     // ai评分
     AIsubmit() {
       let tit = this.scoTit;
+      tit.forEach((e, index) => {
+        if (!e.isai) {
+          e.isai = 1;
+        }
+      });
       let con = JSON.parse(this.scoCon.works);
-      // this.markScoPopover = true;
       this.$emit("updateLoading", {
         val: this.toolIndex,
         val2: this.wIndex,
@@ -207,28 +283,32 @@ export default {
       });
       let _text = "";
       for (let i = 0; i < tit.length; i++) {
-        _text += `评价名称:${tit[i].value} 评价描述:${tit[i].detail} \n`;
+        if (tit[i].isai == 1) {
+          _text += `评价名称:${tit[i].value} 评价描述:${tit[i].detail} \n`;
+        }
+      }
+      let laws = "";
+      for (let i = 0; i < tit.length; i++) {
+        if (tit[i].isai == 1) {
+          laws += `评价维度:${tit[i].value} 评价细则:${tit[i].rule} \n`;
+        }
       }
-      // console.log(_text);
+
+      //  console.log(_text);
       let msg = `NOTICE
-      Role: 你是一个专业的项目式学习导师,你要对学生的评价高度负责。你要根据“五级评价细则”给学生作品评分,并生成需要的JSON数据。
+      Role: 你是一个专业的项目式学习导师,你要对学生的评价高度负责。你要根据“级评价细则”给学生作品评分,并生成需要的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.
       ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
       Instruction: Based on the context, follow "Format example", write content.
 
       #Context
       ##要求
-      根据<评价细则>和<作业内容>与<作业题目>的相关性评价作业,判断该作业属于五级中的哪个等级。
-      具体的评价标准分为5级——1级,2级,3级,4级,5级。
-      1 级,没有识别问题和需求;
-      2 级,问题或需求没有被清晰理解或准确识别;
-      3 级,问题或需求的一部分被识别;
-      4 级,问题或需求的大部分被识别;
-      5 级,问题或需求都被识别。
+      根据<评价细则>和<作业内容>的相关性评价作业,判根据细则评价作业,判断该作业属于六级中的哪个等级。如果作业内容与评价细则无关,则直接评为0星。
+      
+
       
       ##评分资料
-      评价细则:${_text}
-      作业题目:${this.toolDetail}
+      评价细则:${laws}
       作业内容:${con.text}
 
       # Format example
@@ -237,72 +317,52 @@ export default {
       // console.log(msg);
       this.aiGet2(msg);
     },
+
     // ai打分
-    aiGet2(messages, callback) {
-      console.log(this.toolIndex,this.wIndex);
+    aiGet2(messages) {
+      // console.log(this.toolIndex, this.wIndex);
       let _this = this;
-      // let parm = {
-      //   assistant_id: "6063369f-289a-11ef-8bf4-12e77c4cb76b",
-      //   message: [
-      //     {
-      //       type: "text",
-      //       text: messages.replaceAll("\n", " ").replaceAll("*", "")
-      //     }
-      //   ],
-      //   session_name: uuidv4(),
-      //   userId: this.userid,
-      //   file_ids: ""
-      // };
+
       let params = {
-        // "model": "Chat",
-        model: "gpt-3.5-turbo",
-        temperature: 0,
-        max_tokens: 4096,
-        top_p: 1,
-        frequency_penalty: 0,
-        presence_penalty: 0,
-        messages: [
+        assistant_id: "6063369f-289a-11ef-8bf4-12e77c4cb76b",
+        message: [
           {
-            content: messages.replaceAll("\n", " ").replaceAll("*", ""),
-            role: "user"
+            type: "text",
+            text: messages.replaceAll("\n", " ").replaceAll("*", "")
           }
         ],
-        stream: false,
-        uid: this.userid,
-        mind_map_question: ""
+        session_name: uuidv4(),
+        userId: this.userid,
+        file_ids: [],
+        model: "gpt-4o-2024-08-06"
       };
       this.ajax
-        .post("https://gpt4.cocorobo.cn/chat", params)
+        .post("https://gpt4.cocorobo.cn/ai_agent_park_chat", params)
         .then(response => {
           let data = response.data.FunctionResponse;
           // console.log("data", data);
-          if (data.choices && data.choices.length && data.choices[0].message) {
+          if (data.message) {
             let dArray = {};
             try {
               dArray = JSON.parse(
-                data.choices[0].message.content
-                  .replaceAll("```json", "")
-                  .replaceAll("```", "")
+                data.message.replaceAll("```json", "").replaceAll("```", "")
               );
             } catch (error) {
               console.log("error_________________" + error);
               try {
                 let regex = new RegExp("(?<=```json)([\\s\\S]*?)(?=```)");
-                // console.log("dArray666", data.choices[0].message.content);
 
-                let match = data.choices[0].message.content.match(regex);
-                // console.log("dArray2", match);
+                let match = data.message.match(regex);
                 dArray = JSON.parse(
                   match[0]
                     .replace(/\n/g, "")
                     .replace(/\s{2,}/g, "")
                     .replace(/\'/g, '"')
                 );
-                // dArray = data.choices[0].message.content
               } catch (error) {
                 try {
                   dArray = JSON.parse(
-                    data.choices[0].message.content
+                    data.message
                       .replaceAll("```json", "")
                       .replaceAll("# Solution", "")
                       .replaceAll("```", "")
@@ -323,6 +383,7 @@ export default {
             //   _this.$emit("updateLoading", {val:_this.task,val2:_this.wIndex,val3:false});
             // }
             let processedData = {};
+            // return console.log(dArray);
 
             dArray.forEach(function(item) {
               let key = Object.keys(item)[0];
@@ -331,12 +392,12 @@ export default {
             });
 
             for (const key in processedData) {
-              if (!Number.isFinite(processedData[key]*1)) {
-                processedData[key] = 0
+              if (!Number.isFinite(processedData[key] * 1)) {
+                processedData[key] = 0;
               }
             }
 
-            processedData.content = "";
+            processedData.content = this.textarea;
 
             let params = {
               cid: _this.id,
@@ -353,13 +414,13 @@ export default {
                   message: "评价成功",
                   type: "success"
                 });
-                console.log(_this.wIndex, _this.task);
+                // console.log(_this.wIndex, _this.task);
                 _this.$emit("updateLoading", {
                   val: _this.toolIndex,
                   val2: _this.wIndex,
                   val3: false
                 });
-
+                _this.$emit("refreshOther", _this.toolIndex);
                 _this.getData();
                 // _this.markScoPopover = false;
                 // _this.$emit("update:loading", false);
@@ -376,7 +437,6 @@ export default {
           }
           this.$forceUpdate();
 
-          callback ? callback() : "";
         })
         .catch(error => {
           // _this.markScoPopover = false;
@@ -392,53 +452,43 @@ export default {
           console.log(error);
         });
     },
+
+
     // ai循环评分
-    aiupdetaSco(messages, uid, stage, task, callback) {
+    async aiupdetaSco(messages, uid, stage, task,_fileid) {
       let _this = this;
-
       let params = {
-        // "model": "Chat",
-        model: "gpt-3.5-turbo",
-        temperature: 0,
-        max_tokens: 4096,
-        top_p: 1,
-        frequency_penalty: 0,
-        presence_penalty: 0,
-        messages: [
+        assistant_id: "6063369f-289a-11ef-8bf4-12e77c4cb76b",
+        message: [
           {
-            content: messages.replaceAll("\n", " ").replaceAll("*", ""),
-            role: "user"
+            type: "text",
+            text: messages.replaceAll("\n", " ").replaceAll("*", "")
           }
         ],
-        stream: false,
-        uid: this.userid,
-        mind_map_question: ""
+        session_name: uuidv4(),
+        userId: this.userid,
+        file_ids: _fileid ? [_fileid] : [],
+        model: "gpt-4o-2024-08-06"
       };
-      return new Promise(resolve => {
+      return new Promise((resolve,reject) => {
         this.ajax
-          .post("https://gpt4.cocorobo.cn/chat", params)
-          .then(response => {
+          .post("https://gpt4.cocorobo.cn/ai_agent_park_chat", params)
+          .then( response => {
             let data = response.data.FunctionResponse;
-            // console.log(data);
+            console.log(data);
 
-            if (
-              data.choices &&
-              data.choices.length &&
-              data.choices[0].message
-            ) {
+            if (data.message) {
               let dArray = {};
               try {
                 dArray = JSON.parse(
-                  data.choices[0].message.content
-                    .replaceAll("```json", "")
-                    .replaceAll("```", "")
+                  data.message.replaceAll("```json", "").replaceAll("```", "")
                 );
               } catch (error) {
                 console.log("error_________________" + error);
                 try {
                   let regex = new RegExp("(?<=```json)([\\s\\S]*?)(?=```)");
 
-                  let match = data.choices[0].message.content.match(regex);
+                  let match = data.message.match(regex);
                   // console.log("dArray2", match);
                   dArray = JSON.parse(
                     match[0]
@@ -450,8 +500,9 @@ export default {
                 } catch (error) {
                   try {
                     dArray = JSON.parse(
-                      data.choices[0].message.content
+                      data.message
                         .replaceAll("```json", "")
+                        .replaceAll("```javaScript", "")
                         .replaceAll("# Solution", "")
                         .replaceAll("```", "")
                         .replace(/\n/g, "")
@@ -472,16 +523,45 @@ export default {
                 processedData[key] = value;
               });
 
-              for (const key in processedData) {
-                if (!Number.isFinite(processedData[key]*1)) {
-                  processedData[key] = 0
+              let IsAIsuccess = 0
+
+              for (const tKey in this.scoTitList) {
+                for (const key in processedData) {
+                  let result = this.scoTitList[tKey].detail.match(/[\u4e00-\u9fa5a-zA-Z]+/g).join("");
+                  let key2 = key.match(/[\u4e00-\u9fa5a-zA-Z]+/g).join("");
+                  if (key != "评语") {
+                  let isNumK = /^\d+(\.\d+)?$/.test(processedData[key]);
+
+                    if (result.indexOf(key2) != -1 && isNumK) {
+                      IsAIsuccess++
+                    }
+                    continue;
+                  }
                 }
+                continue;
               }
+              let scotNum = 0
+              this.scoTitList.forEach(e=>{
+                if (e.isai == 1 && e.isai) {
+                  scotNum++
+                }
+              })
 
 
+              if (IsAIsuccess != scotNum) {
+                console.log("评价失败");
+                _this.ScLoading = false;
+               return  _this.aiupdetaSco(messages, uid, stage, task,_fileid).then(_=>{
+                  resolve();
+                })
+              }
 
-              processedData.content = "";
-
+              for (const key in processedData) {
+                if (key == "评语") {
+                  processedData.content = processedData[key];
+                }
+              }
+              delete processedData["评语"];
 
               let params = {
                 cid: _this.id,
@@ -494,28 +574,32 @@ export default {
               _this.ajax
                 .get(_this.$store.state.api + "updateWorksEva", params)
                 .then(res => {
-                  resolve(1);
-                  _this.$message({
-                    message: "评价成功",
-                    type: "success"
-                  });
+                  console.log('999999999999999999999999999999999999999999999999999');
+                  
+                  return resolve(1);
+                  
                 })
                 .catch(err => {
-                  resolve(1);
-                  _this.$message.error("评价失败");
                   console.error(err);
+
+                  return _this.aiupdetaSco(messages, uid, stage, task,_fileid).then(_=>{
+                  resolve();
+                })
+
                 });
+                
             }
-            callback ? callback() : "";
           })
           .catch(error => {
-            resolve(1);
-            _this.$message.error("评价失败");
-            // _this.loading = false
             console.log(error);
+            
+            return _this.aiupdetaSco(messages, uid, stage, task,_fileid).then(_=>{
+                  resolve();
+                })
           });
       });
-    }
+    },
+    
   }
 };
 </script>
@@ -525,21 +609,58 @@ export default {
   font-weight: 600;
   display: flex;
   justify-content: space-between;
+  box-sizing: border-box;
+}
+.allD {
+  margin: 5px 0;
+  display: flex;
+  width: 100%;
+  overflow: auto;
+  max-height: 100px;
+  min-height: 60px;
 }
 .scoreStar {
   background-color: #f3f7fd;
   padding: 10px;
-  margin: 10px 0;
-  max-height: 100px;
-  min-height: 60px;
-  overflow: auto;
+  height: 100%;
+  flex: 1;
+}
+.scoreStar > div:last-child > .scoreStarBack {
+  margin-bottom: 0;
 }
 .scoreStarBack {
-  width: 100%;
+  flex: 1;
   display: flex;
   justify-content: space-between;
   margin-bottom: 10px;
 }
+
+.rootImg {
+  padding-top: 1px;
+  box-sizing: border-box;
+  display: block;
+}
+
+.scoreStarBack2 {
+  padding: 10px 0;
+  margin-right: 2px;
+}
+
+.AreaCss {
+  margin-bottom: 5px;
+  -webkit-line-clamp: 2;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  /* margin-left: 20px; */
+}
+.AreaCss >>> .el-textarea__inner {
+  min-height: 60px;
+  max-height: 150px;
+  padding-bottom: 20px;
+}
+
 .briefTit {
   width: 150px;
   text-overflow: ellipsis;

文件差异内容过多而无法显示
+ 687 - 30
src/components/easy2/studyStudent.vue


+ 114 - 52
src/components/easy3/studyStudent.vue

@@ -1360,10 +1360,10 @@
                     </div>
                     <div class="tooldetail" v-if="tool.toolDetail != ''" :class="{isUpdateToolDetailClass:toolDetailIndex == toolIndex}">
                       <!-- <div class="toolTitle">工具描述</div> -->
+                      <!-- @click.stop="updateToolDetail(toolIndex, 2)" 点击开启修改-->
                       <div style="height:100%;"
                         v-html="contentConvent(tool.toolDetail)"
                         v-if="toolDetailIndex != toolIndex"
-                        @click.stop="updateToolDetail(toolIndex, 2)"
                       ></div>
                       <div v-else @click.stop="" style="height:100%;">
                         <textarea @change="() => { $forceUpdate() }" class="checkTextArea" rows="3" v-autoHeight="70" type="text" placeholder="请输入任务描述" v-model="updateToolDetailInner"></textarea>
@@ -1372,7 +1372,7 @@
                     <el-button
                       type="primary"
                       v-if="tool.tool[0] == 32"
-                      style="position: absolute; right: 30px; top: 30px"
+                      style="position: absolute; right: 30px; top: -45px"
                       @click="addImg($event)"
                       >上传作业<input
                         type="file"
@@ -1383,7 +1383,7 @@
                     <el-button
                       type="primary"
                       v-if="tool.tool[0] == 15"
-                      style="position: absolute; right: 30px; top: 30px"
+                      style="position: absolute; right: 30px; top: -45px"
                       @click="openWordCloud(toolIndex)"
                       >生成词云</el-button
                     >
@@ -1392,7 +1392,7 @@
                       v-if="
                         tool.tool[0] == 16 && worksStudent[toolIndex].length > 0
                       "
-                      style="position: absolute; right: 30px; top: 30px"
+                      style="position: absolute; right: 30px; top: -45px"
                       @click="uploadWorks(toolIndex)"
                       >导出作业</el-button
                     >
@@ -1437,7 +1437,7 @@
                         <div class="workImg" v-if="w.type == 0">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2155,7 +2155,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2230,7 +2230,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2305,7 +2305,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2380,7 +2380,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2455,7 +2455,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <img
@@ -2554,7 +2554,7 @@
                               <!-- @click="commentOther(w, toolIndex, wIndex)" -->
                               <img
                                 :src="w.works"
-                                @click="previewImg(w.works)"
+                                @click="previewImg(w.works,w)"
                                 alt
                               />
                               <div
@@ -2738,7 +2738,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -2807,7 +2807,7 @@
                           <!-- @click="commentOther(w, toolIndex, wIndex)" -->
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2991,7 +2991,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -3303,7 +3303,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -3473,7 +3473,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -3574,7 +3574,7 @@
                           <!-- @click="commentOther(w, toolIndex, wIndex)" -->
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -3723,7 +3723,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -4364,7 +4364,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -4486,7 +4486,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -4610,7 +4610,7 @@
                             <div class="workImg">
                               <img
                                 :src="w.works"
-                                @click="previewImg(w.works)"
+                                @click="previewImg(w.works,w)"
                                 alt
                               />
                               <div
@@ -4658,7 +4658,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -4726,7 +4726,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -4770,7 +4770,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -4894,7 +4894,7 @@
                             <div class="workImg">
                               <img
                                 :src="w.works"
-                                @click="previewImg(w.works)"
+                                @click="previewImg(w.works,w)"
                                 alt
                               />
                               <div
@@ -4942,7 +4942,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -5010,7 +5010,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -5054,7 +5054,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -5178,7 +5178,7 @@
                             <div class="workImg">
                               <img
                                 :src="w.works"
-                                @click="previewImg(w.works)"
+                                @click="previewImg(w.works,w)"
                                 alt
                               />
                               <div
@@ -5226,7 +5226,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -5294,7 +5294,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -5338,7 +5338,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -5461,7 +5461,7 @@
                             <div class="workImg">
                               <img
                                 :src="w.works"
-                                @click="previewImg(w.works)"
+                                @click="previewImg(w.works,w)"
                                 alt
                               />
                               <div
@@ -5509,7 +5509,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -5577,7 +5577,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -5621,7 +5621,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -5727,7 +5727,7 @@
                         <div class="workImg" v-if="w.type == 0">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <img
@@ -5864,7 +5864,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -6433,7 +6433,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -6664,7 +6664,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -6884,7 +6884,7 @@
                               <div class="workImg" v-if="w.type == 0">
                                 <img
                                   :src="w.works"
-                                  @click="previewImg(w.works)"
+                                  @click="previewImg(w.works,w)"
                                   alt
                                 />
                                 <div
@@ -7084,7 +7084,8 @@
                                           userid,
                                           1,
                                           null,
-                                          w.isLikes
+                                          w.isLikes,
+																					w.sName
                                         )
                                       "
                                     >
@@ -8258,7 +8259,7 @@
 				<scoreItem v-for="item in scoreList.datalist" @refresh="getScoreList" :data="item" :isScore="scoreList.isScoreList.filter(i=>(i.userid==item.userid && i.courseid == item.courseId))" :key="item.courseId"/>
 			</div>
       <div class="scoreList" v-if="commentTagShow==2" style="position: relative">
-        <scoreZong :courseid="id" :userid="userid"></scoreZong>
+        <scoreZong :courseid="id" :userid="userid" @insertMemorandum="insertMemorandum"></scoreZong>
 			</div>
     </div>
     <div
@@ -9831,7 +9832,8 @@
                     userid,
                     1,
                     null,
-                    commentDetail.isLikes
+                    commentDetail.isLikes,
+										commentDetail.sName
                   )
                 "
                 :src="commentDetail.isLikes == true ? likes : noLikes"
@@ -9958,7 +9960,7 @@
         >
         <el-button
           type="primary"
-          @click="addComment(commentDetail.wid, userid, 2)"
+          @click="addComment(commentDetail.wid, userid, 2,commentDetail)"
           >确 定</el-button
         >
       </div>
@@ -10488,7 +10490,7 @@
         <el-button
           type="primary"
           v-if="courseDetail.userid == userid"
-          @click="scoreWork(commentDetail.wid)"
+          @click="scoreWork(commentDetail.wid,commentDetail.sName)"
           >确 定
         </el-button>
       </span>
@@ -12438,6 +12440,28 @@ export default {
 				this.oidArray = oidArray;
 			})
 		},
+		insertMemorandum(_html){//保存行为操作
+			//variable
+			//btn
+			let params = [{
+				uid:this.userid,
+				courseId:this.id+(this.tcid2?this.tcid2:''),
+				content:_html
+			}]
+
+			console.log(params)
+
+			this.ajax.post(this.$store.state.api+'insert_systemOperation_countdownBehavior',params).then(res=>{
+				if(res.data==1){
+					console.log('保存操作成功')
+				}else{
+					console.log('保存操作失败')
+				}
+			}).catch(e=>{
+				console.log('保存操作失败')
+				console.log(e)
+			})
+		},
     gx(){
       this.$forceUpdate();
     },
@@ -12709,6 +12733,8 @@ export default {
         }, 0);
       }
       this.navId = ""
+			let flag = this.courseType == i;
+			let flag2 = this.taskCount == j
       if (l) {
         this.courseType = i;
         // this.navId = l;
@@ -12716,6 +12742,15 @@ export default {
         this.selectPz();
         this.getHomeWork();
         this.getCourseDetail(2);
+				if(flag){
+					if(flag2){
+						this.insertMemorandum(`选择<span class="variable">工具${k+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
+					}else{
+						this.insertMemorandum(`选择<span class="variable">任务${j+1}${this.navList[i].task[j].taskName?':'+this.navList[i].task[j].taskName:''}</span>→<span class="variable">工具${k+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
+					}
+				}else{
+					this.insertMemorandum(`选择<span class="variable">阶段${i+1}${this.navList[i].dyName?':'+this.navList[i].dyName:''}</span>→<span class="variable">任务${j+1}${this.navList[i].task[j].taskName?':'+this.navList[i].task[j].taskName:''}</span>→<span class="variable">工具${k+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
+				}
       }
 
       // var b = this.$refs["bz" + k][0];
@@ -12798,8 +12833,11 @@ export default {
       }
       this.dialogVisibleMember = false;
     },
-    previewImg(url) {
+    previewImg(url,w) {
       this.$hevueImgPreview(url);
+			if(w){
+				this.insertMemorandum(`查看<span class="variable">${w.sName}</span>的作业`)
+			}
     },
     checkImg(list) {
       if (!list.length) {
@@ -14052,7 +14090,7 @@ export default {
       this.videoDetail = this.playerOptions1;
       this.videoVisible = true;
     },
-    isLikes(wid, uid, t, c, isLikes) {
+    isLikes(wid, uid, t, c, isLikes,sName) {
       if (isLikes == false) {
         let params = [
           {
@@ -14071,6 +14109,7 @@ export default {
             });
             this.selectSWorks();
             this.selectStudent();
+						this.insertMemorandum(`对<span class="variable">${sName}</span>的作业进行<span class="btn">点赞</span>`)
           })
           .catch((err) => {
             this.$message.error("点赞失败");
@@ -14225,8 +14264,9 @@ export default {
         
         this.englishVoiceJson = JSON.parse(JSON.stringify(englishVoiceJson));
       }
+			this.insertMemorandum(`查看<span class="variable">${w.sName}</span>的作业`)
     },
-    addComment(wid, uid, t) {
+    addComment(wid, uid, t,detail) {
       if (this.commentText == "") {
         this.$message.error("请输入评论");
         return;
@@ -14262,6 +14302,7 @@ export default {
                 this.commentText = "";
                 this.selectSWorks();
                 this.selectStudent();
+								this.insertMemorandum(`对<span class="variable">${detail.sName}</span>的作业进行<span class="btn">评论</span>`)
               })
               .catch((err) => {
                 this.$message.error("评论失败");
@@ -14274,7 +14315,7 @@ export default {
           console.error(err);
         });
     },
-    scoreWork(wid) {
+    scoreWork(wid,sName) {
       if (this.wScore == 0) {
         this.$message.error("请评分");
         return;
@@ -14300,6 +14341,7 @@ export default {
           this.dialogVisibleScore = false;
           this.selectSWorks();
           this.selectStudent();
+					this.insertMemorandum(`对<span class="variable">${sName}</span>的作业进行<span class="btn">评分</span>`)
         })
         .catch((err) => {
           this.$message.error("评分失败");
@@ -14324,6 +14366,7 @@ export default {
       this.selectAnswer = { answer: a, stu: w.sName };
       this.isSelect = true;
       this.dialogVisibleSelect = true;
+			this.insertMemorandum(`查看<span class="variable">${w.sName}</span>的作业`)
     },
     openSen(w, i) {
       this.sentenceList1 = JSON.parse(w.works);
@@ -16241,6 +16284,10 @@ export default {
         this.navList[s].task[n].isOpen = !this.navList[s].task[n].isOpen;
         return;
       }
+
+			let flag = this.courseType==s;
+
+	
       this.courseType = s;
       this.navId = i;
       this.taskCount = n;
@@ -16294,6 +16341,11 @@ export default {
       this.selectPz();
       this.getHomeWork();
       this.getCourseDetail(2);
+			if(flag){
+				this.insertMemorandum(`进入<span class="variable">任务${n+1}${this.navList[s].task[n].taskName?':'+this.navList[s].task[n].taskName:''}</span>`)
+			}else{
+				this.insertMemorandum(`进入<span class="variable">阶段${s+1}${this.navList[s].dyName?':'+this.navList[s].dyName:''}</span>→<span class="variable">任务${n+1}${this.navList[s].task[n].taskName?':'+this.navList[s].task[n].taskName:''}</span>`)
+			}
     },
 
     get(i) {
@@ -16929,6 +16981,7 @@ export default {
           this.pzConText = "";
           this.addPzDialog = false;
           this.selectPz();
+					this.insertMemorandum(`使用<span class="btn">评论</span>功能,添加评论`)
         })
         .catch((err) => {
           this.$message.error("添加失败");
@@ -17426,6 +17479,7 @@ export default {
       // this.isClickNav = "video" + i;
       this.isClickNav = i;
       this.$forceUpdate();
+			this.insertMemorandum(`查看文件<span class="variable">任务${this.taskCount+1}:${this.vChapterData[this.taskCount].find(i=>i.url==u).name}</span>`)
     },
     lookText(i, t) {
       this.isClickNav = "";
@@ -17435,6 +17489,7 @@ export default {
       this.showType = 1;
       // this.isClickNav = "text" + t;
       this.isClickNav = t;
+			this.insertMemorandum(`查看文件<span class="variable">任务${this.taskCount+1}:${this.vChapterData[this.taskCount][t].name}.doc</span>`)
     },
     lookTools(i, t) {
       this.chapTools = this.chapToolList[i][t];
@@ -17460,14 +17515,17 @@ export default {
         this.showPDF = true;
         this.dialogVisible3 = true;
       }
+			this.insertMemorandum(`查看<span class="variable">${w.sName}</span>的作业`)
     },
     openTable(f) {
       this.tableJson = JSON.parse(f.works);
       this.dialogVisibleTable2 = true;
+			this.insertMemorandum(`查看<span class="variable">${f.sName}的作业</span>`)
     },
     openWord(f) {
       this.tableJson = JSON.parse(f.works);
       this.dialogVisibleTable3 = true;
+			this.insertMemorandum(`查看<span class="variable">${f.sName}的作业</span>`)
     },
     doUrl(url, i) {
       this.isClickNav = "";
@@ -17490,6 +17548,7 @@ export default {
       this.pptImgUrl1 = f.url;
       this.isClickNav = i;
       this.$forceUpdate();
+			this.insertMemorandum(`查看文件<span class="variable">任务${this.taskCount+1}:${this.vChapterData[this.taskCount][i].name}</span>`)
     },
     async downFile(f, i) {
       this.isClickNav = "";
@@ -17525,6 +17584,7 @@ export default {
       }
       // this.isClickNav = "word" + i;
       this.isClickNav = i;
+			this.insertMemorandum(`查看文件<span class="variable">任务${this.taskCount+1}:${this.vChapterData[this.taskCount][i].name}</span>`)
     },
     downFileList(i) {
       window.open(this.noImgList[i].url);
@@ -17927,6 +17987,7 @@ export default {
       //   this.questionAnswer = z[0].answer;
       //   this.answerDialogVisible = true;
       // }
+			this.insertMemorandum(`查看<span class="variable">${sName}</span>的作业`)
     },
 
     fastText(p, t) {
@@ -18451,6 +18512,7 @@ export default {
           ].toolChoose[i].videoJson;
         this.dialogVisibleVideo = true;
       }
+			this.insertMemorandum(`点击工作区<span class="variable">工具${index+1}:${this.toolsList[t]}</span>`)
     },
     teacherWorkSubmit(t, i, index, s) {
       this.sStudent = s;
@@ -20476,7 +20538,7 @@ export default {
 }
 
 .filebox .tooldetail {
-  width: calc(100% - 280px);
+  width: calc(100%);
   margin: 0px 12px;
   padding: 12px;
   line-height: 30px;
@@ -21426,7 +21488,7 @@ export default {
 
 .toolHeng2 {
   width: 100%;
-  padding-left: 37px;
+  padding-left: 15px;
   box-sizing: border-box;
 }
 

+ 1 - 0
src/components/scoreZong/index.vue

@@ -195,6 +195,7 @@ export default {
                 .catch((err) => {
                     console.error(err);
                 });
+						this.$emit('insertMemorandum',`使用<span class="btn">评论</span>功能,添加总评`)
         },
         getList() {
             let params =

+ 98 - 86
src/components/studyStudent.vue

@@ -1329,10 +1329,10 @@
                     </div>
                     <div class="tooldetail" v-if="tool.toolDetail != ''" :class="{isUpdateToolDetailClass:toolDetailIndex == toolIndex}">
                       <!-- <div class="toolTitle">工具描述</div> -->
+                        <!-- @click.stop="updateToolDetail(toolIndex, 2)" -->
                       <div style="height:100%;"
                         v-html="contentConvent(tool.toolDetail)"
                         v-if="toolDetailIndex != toolIndex"
-                        @click.stop="updateToolDetail(toolIndex, 2)"
                       ></div>
                       <div v-else @click.stop="" style="height:100%;">
                         <textarea @change="() => { $forceUpdate() }" class="checkTextArea" rows="3" v-autoHeight="70" type="text" placeholder="请输入任务描述" v-model="updateToolDetailInner"></textarea>
@@ -1341,7 +1341,7 @@
                     <el-button
                       type="primary"
                       v-if="tool.tool[0] == 32"
-                      style="position: absolute; right: 30px; top: 30px"
+                      style="position: absolute; right: 30px; top: -45px"
                       @click="addImg($event)"
                       >上传作业<input
                         type="file"
@@ -1352,7 +1352,7 @@
                     <el-button
                       type="primary"
                       v-if="tool.tool[0] == 15"
-                      style="position: absolute; right: 30px; top: 30px"
+                      style="position: absolute; right: 30px; top: -45px"
                       @click="openWordCloud(toolIndex)"
                       >生成词云</el-button
                     >
@@ -1361,7 +1361,7 @@
                       v-if="
                         tool.tool[0] == 16 && worksStudent[toolIndex].length > 0
                       "
-                      style="position: absolute; right: 30px; top: 30px"
+                      style="position: absolute; right: 30px; top: -45px"
                       @click="uploadWorks(toolIndex)"
                       >导出作业</el-button
                     >
@@ -1406,7 +1406,7 @@
                         <div class="workImg" v-if="w.type == 0">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -1442,7 +1442,7 @@
                           />
                         </div>
                         <div class="workImg" v-if="w.type == 1">
-                          <img :src="word" @click="openFile(w.works)" alt />
+                          <img :src="word" @click="openFile(w.works,w)" alt />
                           <div
                             class="answerScore"
                             v-if="w.score"
@@ -2124,7 +2124,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2199,7 +2199,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2274,7 +2274,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2349,7 +2349,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2424,7 +2424,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <img
@@ -2523,7 +2523,7 @@
                               <!-- @click="commentOther(w, toolIndex, wIndex)" -->
                               <img
                                 :src="w.works"
-                                @click="previewImg(w.works)"
+                                @click="previewImg(w.works,w)"
                                 alt
                               />
                               <div
@@ -2565,7 +2565,7 @@
                               />
                             </div>
                             <div class="workImg" v-if="w.type == 1">
-                              <img :src="word" @click="openFile(w.works)" alt />
+                              <img :src="word" @click="openFile(w.works,w)" alt />
                               <!-- @click="openFile(w.works)" -->
                               <div
                                 class="answerScore"
@@ -2707,7 +2707,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -2776,7 +2776,7 @@
                           <!-- @click="commentOther(w, toolIndex, wIndex)" -->
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -2818,7 +2818,7 @@
                           />
                         </div>
                         <div class="workImg" v-if="w.type == 1">
-                          <img :src="word" @click="openFile(w.works)" alt />
+                          <img :src="word" @click="openFile(w.works,w)" alt />
                           <!-- @click="openFile(w.works)" -->
                           <div
                             class="answerScore"
@@ -2960,7 +2960,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -3272,7 +3272,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -3442,7 +3442,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -3543,7 +3543,7 @@
                           <!-- @click="commentOther(w, toolIndex, wIndex)" -->
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -3589,7 +3589,7 @@
                           style="cursor: pointer"
                           v-if="w.type == 1"
                         >
-                          <img :src="word" @click="openFile(w.works)" alt />
+                          <img :src="word" @click="openFile(w.works,w)" alt />
                           <!-- @click="openFile(w.works)" -->
                           <div
                             class="answerScore"
@@ -3692,7 +3692,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -4333,7 +4333,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -4455,7 +4455,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -4579,7 +4579,7 @@
                             <div class="workImg">
                               <img
                                 :src="w.works"
-                                @click="previewImg(w.works)"
+                                @click="previewImg(w.works,w)"
                                 alt
                               />
                               <div
@@ -4627,7 +4627,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -4695,7 +4695,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -4739,7 +4739,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -4863,7 +4863,7 @@
                             <div class="workImg">
                               <img
                                 :src="w.works"
-                                @click="previewImg(w.works)"
+                                @click="previewImg(w.works,w)"
                                 alt
                               />
                               <div
@@ -4911,7 +4911,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -4979,7 +4979,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -5023,7 +5023,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -5147,7 +5147,7 @@
                             <div class="workImg">
                               <img
                                 :src="w.works"
-                                @click="previewImg(w.works)"
+                                @click="previewImg(w.works,w)"
                                 alt
                               />
                               <div
@@ -5195,7 +5195,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -5263,7 +5263,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -5307,7 +5307,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -5430,7 +5430,7 @@
                             <div class="workImg">
                               <img
                                 :src="w.works"
-                                @click="previewImg(w.works)"
+                                @click="previewImg(w.works,w)"
                                 alt
                               />
                               <div
@@ -5478,7 +5478,7 @@
                                   <div
                                     class="commentImg"
                                     @click="
-                                      isLikes(w.wid, userid, 1, null, w.isLikes)
+                                      isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                     "
                                   >
                                     <img
@@ -5546,7 +5546,7 @@
                         <div class="workImg">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <div
@@ -5590,7 +5590,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -5696,7 +5696,7 @@
                         <div class="workImg" v-if="w.type == 0">
                           <img
                             :src="w.works"
-                            @click="previewImg(w.works)"
+                            @click="previewImg(w.works,w)"
                             alt
                           />
                           <img
@@ -5710,7 +5710,7 @@
                           />
                         </div>
                         <div class="workImg" v-if="w.type == 1">
-                          <img :src="word" @click="openFile(w.works)" alt />
+                          <img :src="word" @click="openFile(w.works,w)" alt />
                           <img
                             class="deleteImg"
                             src="../assets/deleteworks.png"
@@ -5833,7 +5833,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -6402,7 +6402,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -6633,7 +6633,7 @@
                               <div
                                 class="commentImg"
                                 @click="
-                                  isLikes(w.wid, userid, 1, null, w.isLikes)
+                                  isLikes(w.wid, userid, 1, null, w.isLikes,w.sName)
                                 "
                               >
                                 <img
@@ -6853,7 +6853,7 @@
                               <div class="workImg" v-if="w.type == 0">
                                 <img
                                   :src="w.works"
-                                  @click="previewImg(w.works)"
+                                  @click="previewImg(w.works,w)"
                                   alt
                                 />
                                 <div
@@ -6899,7 +6899,7 @@
                               <div class="workImg" v-if="w.type == 1">
                                 <img
                                   :src="word"
-                                  @click="openFile(w.works)"
+                                  @click="openFile(w.works,w)"
                                   alt
                                 />
                                 <!-- @click="openFile(w.works)" -->
@@ -7053,7 +7053,8 @@
                                           userid,
                                           1,
                                           null,
-                                          w.isLikes
+                                          w.isLikes,
+																					w.sName
                                         )
                                       "
                                     >
@@ -9776,7 +9777,8 @@
                     userid,
                     1,
                     null,
-                    commentDetail.isLikes
+                    commentDetail.isLikes,
+										commentDetail.sName
                   )
                 "
                 :src="commentDetail.isLikes == true ? likes : noLikes"
@@ -9903,7 +9905,7 @@
         >
         <el-button
           type="primary"
-          @click="addComment(commentDetail.wid, userid, 2)"
+          @click="addComment(commentDetail.wid, userid, 2,commentDetail)"
           >确 定</el-button
         >
       </div>
@@ -10433,7 +10435,7 @@
         <el-button
           type="primary"
           v-if="courseDetail.userid == userid"
-          @click="scoreWork(commentDetail.wid)"
+          @click="scoreWork(commentDetail.wid,commentDetail.sName)"
           >确 定
         </el-button>
       </span>
@@ -12417,14 +12419,15 @@ export default {
 			})
 		},
 		insertMemorandum(_html){//保存行为操作
-			return;
 			//variable
 			//btn
 			let params = [{
 				uid:this.userid,
-				courseId:this.id,
+				courseId:this.id+(this.tcid2?this.tcid2:''),
 				content:_html
 			}]
+			console.log("👇👇")
+			console.log(params)
 
 			this.ajax.post(this.$store.state.api+'insert_systemOperation_countdownBehavior',params).then(res=>{
 				if(res.data==1){
@@ -12713,18 +12716,19 @@ export default {
         this.courseType = i;
         // this.navId = l;
         this.taskCount = j;
+				
+        this.selectPz();
+        this.getHomeWork();
+        this.getCourseDetail(2);
 				if(flag){
 					if(flag2){
-						this.insertMemorandum(`选择<span class="variable">工具${w+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
+						this.insertMemorandum(`选择<span class="variable">工具${k+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
 					}else{
-						this.insertMemorandum(`选择<span class="variable">任务${this.taskCount+1}${this.navList[this.courseType].task[this.taskCount].taskName?':'+this.navList[this.courseType].task[this.taskCount].taskName:''}</span>→<span class="variable">工具${w+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
+						this.insertMemorandum(`选择<span class="variable">任务${j+1}${this.navList[i].task[j].taskName?':'+this.navList[i].task[j].taskName:''}</span>→<span class="variable">工具${k+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
 					}
 				}else{
-					this.insertMemorandum(`选择<span class="variable">阶段${this.courseType+1}${this.navList[this.courseType].dyName?':'+this.navList[this.courseType].dyName:''}</span>→<span class="variable">任务${this.taskCount+1}${this.navList[this.courseType].task[this.taskCount].taskName?':'+this.navList[this.courseType].task[this.taskCount].taskName:''}</span>→<span class="variable">工具${w+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
+					this.insertMemorandum(`选择<span class="variable">阶段${i+1}${this.navList[i].dyName?':'+this.navList[i].dyName:''}</span>→<span class="variable">任务${j+1}${this.navList[i].task[j].taskName?':'+this.navList[i].task[j].taskName:''}</span>→<span class="variable">工具${k+1}:${this.toolsList[this.navList[i].task[j].tool[k].tool]}</span>`)
 				}
-        this.selectPz();
-        this.getHomeWork();
-        this.getCourseDetail(2);
       }
 
       // var b = this.$refs["bz" + k][0];
@@ -12807,9 +12811,11 @@ export default {
       }
       this.dialogVisibleMember = false;
     },
-    previewImg(url) {
-			this.$message.info('查看作业-图片')
+    previewImg(url,w=null) {
       this.$hevueImgPreview(url);
+			if(w){
+				this.insertMemorandum(`查看<span class="variable">${w.sName}</span>的作业`)
+			}
     },
     checkImg(list) {
       if (!list.length) {
@@ -14062,7 +14068,7 @@ export default {
       this.videoDetail = this.playerOptions1;
       this.videoVisible = true;
     },
-    isLikes(wid, uid, t, c, isLikes) {
+    isLikes(wid, uid, t, c, isLikes,sName) {
       if (isLikes == false) {
         let params = [
           {
@@ -14081,6 +14087,7 @@ export default {
             });
             this.selectSWorks();
             this.selectStudent();
+						this.insertMemorandum(`对<span class="variable">${sName}</span>的作业进行<span class="btn">点赞</span>`)
           })
           .catch((err) => {
             this.$message.error("点赞失败");
@@ -14134,8 +14141,6 @@ export default {
         .catch(() => {});
     },
     async commentOther(w, toolIndex, wIndex, gindex, gid) {
-			this.$message.info("预览作业")
-			console.log(w,1)
       this.commentIndexJson = {
         toolIndex: toolIndex,
         wIndex: wIndex,
@@ -14188,8 +14193,7 @@ export default {
       }
     },
     async openScore(w, index) {
-			this.$message.info("预览作业")
-			console.log(w,2)
+			
       this.wScore = 0;
       this.wScore = w.score ? JSON.parse(w.score).wScore : 0;
       this.scoreDetail = w.score ? JSON.parse(w.score).detail : "";
@@ -14237,8 +14241,10 @@ export default {
         
         this.englishVoiceJson = JSON.parse(JSON.stringify(englishVoiceJson));
       }
+			this.insertMemorandum(`查看<span class="variable">${w.sName}</span>的作业`)
     },
-    addComment(wid, uid, t) {
+    addComment(wid, uid, t,detail) {
+			
       if (this.commentText == "") {
         this.$message.error("请输入评论");
         return;
@@ -14274,6 +14280,7 @@ export default {
                 this.commentText = "";
                 this.selectSWorks();
                 this.selectStudent();
+								this.insertMemorandum(`对<span class="variable">${detail.sName}</span>的作业进行<span class="btn">评论</span>`)
               })
               .catch((err) => {
                 this.$message.error("评论失败");
@@ -14286,7 +14293,7 @@ export default {
           console.error(err);
         });
     },
-    scoreWork(wid) {
+    scoreWork(wid,sName) {
       if (this.wScore == 0) {
         this.$message.error("请评分");
         return;
@@ -14312,6 +14319,7 @@ export default {
           this.dialogVisibleScore = false;
           this.selectSWorks();
           this.selectStudent();
+					this.insertMemorandum(`对<span class="variable">${sName}</span>的作业进行<span class="btn">评分</span>`)
         })
         .catch((err) => {
           this.$message.error("评分失败");
@@ -14319,8 +14327,7 @@ export default {
         });
     },
     openXz(w, i) {
-			this.$message.info("预览作业")
-			console.log(w,3)
+			
       this.selectJson = this.chapInfoList[this.courseType].chapterInfo[0]
         .taskJson[this.taskCount].toolChoose[i].selectJson
         ? JSON.parse(
@@ -14338,17 +14345,18 @@ export default {
       this.selectAnswer = { answer: a, stu: w.sName };
       this.isSelect = true;
       this.dialogVisibleSelect = true;
+			this.insertMemorandum(`查看<span class="variable">${w.sName}</span>的作业`)
     },
     openSen(w, i) {
-			this.$message.info("预览作业")
-			console.log(w,4)
+			console.log("openSen")
+			// this.insertMemorandum(`查看<span class="variable">${w.sName}</span>的作业`)
       this.sentenceList1 = JSON.parse(w.works);
       this.sentenceList1.stuName = w.sName;
       this.dialogVisibleSentence1 = true;
     },
     openPj(w, toolindex) {
-			this.$message.info("预览作业")
-			console.log(w,5)
+			console.log("openPJ")
+			// this.insertMemorandum(`查看<span class="variable">${w.sName}</span>的作业`)
       this.isStar = true;
       this.eScore = JSON.parse(w);
       this.rateJson =
@@ -16268,11 +16276,7 @@ export default {
 			
       this.navId = i;
       this.taskCount = n;
-			if(flag){
-				this.insertMemorandum(`进入<span class="variable">任务${this.taskCount+1}${this.navList[this.courseType].task[this.taskCount].taskName?':'+this.navList[this.courseType].task[this.taskCount].taskName:''}</span>`)
-			}else{
-				this.insertMemorandum(`进入<span class="variable">阶段${this.courseType+1}${this.navList[this.courseType].dyName?':'+this.navList[this.courseType].dyName:''}</span>→<span class="variable">任务${this.taskCount+1}${this.navList[this.courseType].task[this.taskCount].taskName?':'+this.navList[this.courseType].task[this.taskCount].taskName:''}</span>`)
-			}
+			
 			
       if(ctype == 2){
         this.navList[s].task[n].isOpen = true
@@ -16328,6 +16332,11 @@ export default {
       this.selectPz();
       this.getHomeWork();
       this.getCourseDetail(2);
+			if(flag){
+				this.insertMemorandum(`进入<span class="variable">任务${n+1}${this.navList[s].task[n].taskName?':'+this.navList[s].task[n].taskName:''}</span>`)
+			}else{
+				this.insertMemorandum(`进入<span class="variable">阶段${s+1}${this.navList[s].dyName?':'+this.navList[s].dyName:''}</span>→<span class="variable">任务${n+1}${this.navList[s].task[n].taskName?':'+this.navList[s].task[n].taskName:''}</span>`)
+			}
     },
 
     get(i) {
@@ -16962,12 +16971,13 @@ export default {
           this.pzConText = "";
           this.addPzDialog = false;
           this.selectPz();
+					this.insertMemorandum(`使用<span class="btn">评论</span>功能,添加评论`)
         })
         .catch((err) => {
           this.$message.error("添加失败");
           console.error(err);
         });
-				this.insertMemorandum(`使用<span class="btn">评论</span>功能,添加评论`)
+				
     },
     setReplyIndex(id, i) {
       this.replyIndex = i;
@@ -17476,7 +17486,7 @@ export default {
       this.chapTools = this.chapToolList[i][t];
       this.dialogVisible2 = true;
     },
-    async openFile(f) {
+    async openFile(f,w) {
       this.pptImgUrl = "";
       var a = ["PPT", "PPTX", "XLSX", "XLS", "DOC", "DOCX"];
       if (
@@ -17495,6 +17505,7 @@ export default {
         this.showPDF = true;
         this.dialogVisible3 = true;
       }
+			this.insertMemorandum(`查看<span class="variable">${w.sName}</span>的作业`)
     },
     openTable(f) {
       this.tableJson = JSON.parse(f.works);
@@ -17502,10 +17513,9 @@ export default {
 			this.insertMemorandum(`查看<span class="variable">${f.sName}的作业</span>`)
     },
     openWord(f) {
-			this.$message.info("预览作业")
-			console.log(f,7)
       this.tableJson = JSON.parse(f.works);
       this.dialogVisibleTable3 = true;
+			this.insertMemorandum(`查看<span class="variable">${f.sName}的作业</span>`)
 	
     },
     doUrl(url, i) {
@@ -17917,6 +17927,7 @@ export default {
         });
     },
     openTools(t, i, index, c, sName,id) {
+			
       var z = JSON.parse(c);
       this.noteName = sName;
       if (t == 4) {
@@ -17966,6 +17977,7 @@ export default {
       //   this.questionAnswer = z[0].answer;
       //   this.answerDialogVisible = true;
       // }
+			this.insertMemorandum(`查看<span class="variable">${sName}</span>的作业`)
     },
 
     fastText(p, t) {
@@ -19034,7 +19046,7 @@ export default {
       x.send();
     },
     downloadFile(url) {
-			this.$message.info("查看作业-下载文件")
+			// this.$message.info("查看作业-下载文件")
       var credentials = {
         accessKeyId: "AKIATLPEDU37QV5CHLMH",
         secretAccessKey: "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",
@@ -20502,7 +20514,7 @@ export default {
 }
 
 .filebox .tooldetail {
-  width: calc(100% - 280px);
+  width: calc(100%);
   margin: 0px 12px;
   padding: 12px;
   line-height: 30px;
@@ -21452,7 +21464,7 @@ export default {
 
 .toolHeng2 {
   width: 100%;
-  padding-left: 37px;
+  padding-left: 15px;
   box-sizing: border-box;
 }
 

部分文件因为文件数量过多而无法显示