Selaa lähdekoodia

Merge branch 'beta'

lsc 3 viikkoa sitten
vanhempi
commit
d8a5e9fa6f
74 muutettua tiedostoa jossa 10725 lisäystä ja 1302 poistoa
  1. 1 1
      dist/index.html
  2. 0 0
      dist/static/css/app.2048185de4e9b26261a7c06a5a2415c7.css
  3. 0 0
      dist/static/css/app.2048185de4e9b26261a7c06a5a2415c7.css.map
  4. 0 0
      dist/static/css/app.a48046a97091992c49c965216837369a.css
  5. BIN
      dist/static/img/toux.3282a78.png
  6. 8 0
      dist/static/img/workTest.768f8df.svg
  7. 0 0
      dist/static/js/app.d9fb356934b971ca24e6.js
  8. 0 0
      dist/static/js/app.d9fb356934b971ca24e6.js.map
  9. 0 0
      dist/static/js/manifest.161e82026ac2ae03ab6f.js.map
  10. 3 0
      src/assets/clear.svg
  11. 3 0
      src/assets/delicon.svg
  12. 30 0
      src/assets/icon/liyuan/Group.svg
  13. 5 0
      src/assets/icon/liyuan/aiTest.svg
  14. 3 0
      src/assets/icon/liyuan/backPage.svg
  15. 11 0
      src/assets/icon/liyuan/bz.svg
  16. 30 0
      src/assets/icon/liyuan/classlook.svg
  17. 4 0
      src/assets/icon/liyuan/edit.svg
  18. 20 0
      src/assets/icon/liyuan/gerendangan.svg
  19. 26 0
      src/assets/icon/liyuan/hymj.svg
  20. 5 0
      src/assets/icon/liyuan/jiaoshihuaxiang.svg
  21. 30 0
      src/assets/icon/liyuan/ketangguancha.svg
  22. 4 0
      src/assets/icon/liyuan/lpot.svg
  23. 9 0
      src/assets/icon/liyuan/mbL.svg
  24. 8 0
      src/assets/icon/liyuan/mbll.svg
  25. 24 0
      src/assets/icon/liyuan/niandukaohe.svg
  26. 30 0
      src/assets/icon/liyuan/scolr.svg
  27. 20 0
      src/assets/icon/liyuan/seva.svg
  28. 26 0
      src/assets/icon/liyuan/stumange.svg
  29. 30 0
      src/assets/icon/liyuan/teamange.svg
  30. 5 0
      src/assets/icon/liyuan/teapic.svg
  31. 3 0
      src/assets/icon/liyuan/tele.svg
  32. BIN
      src/assets/icon/liyuan/toux.png
  33. 20 0
      src/assets/icon/liyuan/userrecord.svg
  34. 8 0
      src/assets/icon/liyuan/workTest.svg
  35. 24 0
      src/assets/icon/liyuan/yearass.svg
  36. 5 0
      src/assets/icon/liyuan/zhinengbiaodan.svg
  37. 30 0
      src/assets/icon/liyuan/zlsj.svg
  38. 3 0
      src/components/pages/classroomObservation/components/analysisTemplateDialog.vue
  39. 268 81
      src/components/pages/classroomObservation/dialog/batchCreationClassDialog.vue
  40. 1 3
      src/components/pages/classroomObservation/dialog/uploadFileToCreateClassDialog.vue
  41. 5 1
      src/components/pages/classroomObservation/index.vue
  42. 67 18
      src/components/pages/classroomObservation/newComponents/batchClassCard.vue
  43. 738 0
      src/components/pages/classroomObservation/test.vue
  44. 59 23
      src/components/pages/classroomObservation/tools/mixin.js
  45. 18 4
      src/components/pages/course.vue
  46. 1 0
      src/components/pages/course/index.vue
  47. 7 1
      src/components/pages/evaluation.vue
  48. 51 0
      src/components/pages/liyuan/CourseCon.vue
  49. 58 0
      src/components/pages/liyuan/aiOffice.vue
  50. 46 0
      src/components/pages/liyuan/components/backPage.vue
  51. 95 0
      src/components/pages/liyuan/components/card.vue
  52. 32 0
      src/components/pages/liyuan/components/topBar.vue
  53. 945 0
      src/components/pages/liyuan/page/examine/index.vue
  54. 72 0
      src/components/pages/liyuan/page/portrait/chordDiagramView.vue
  55. 48 0
      src/components/pages/liyuan/page/portrait/eChartView.vue
  56. 1054 0
      src/components/pages/liyuan/page/portrait/index.vue
  57. 1202 0
      src/components/pages/liyuan/page/safeTest.vue
  58. 1542 0
      src/components/pages/liyuan/page/student.vue
  59. 1204 0
      src/components/pages/liyuan/page/teadTest.vue
  60. 555 0
      src/components/pages/liyuan/page/userInfoL.vue
  61. 47 0
      src/components/pages/liyuan/schoolSafe.vue
  62. 48 0
      src/components/pages/liyuan/studentEva.vue
  63. 59 0
      src/components/pages/liyuan/teacherDevelop.vue
  64. 12 2
      src/components/pages/synergyCourse/course.vue
  65. 9 0
      src/components/pages/sz/teacher.vue
  66. 1 0
      src/components/pages/test/add/addTest.vue
  67. 11 2
      src/components/pages/test/aggregate/index.vue
  68. 722 25
      src/components/pages/test/check/index.vue
  69. 9 4
      src/components/pages/test/index.vue
  70. 1 1
      src/components/pages/testPerson/examine/index.vue
  71. 43 1
      src/components/pages/testPerson/test/test.vue
  72. 12 4
      src/components/pages/testStudent/view/preview.vue
  73. 40 29
      src/components/pages/works.vue
  74. 1215 1102
      src/router/index.js

+ 1 - 1
dist/index.html

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

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/app.2048185de4e9b26261a7c06a5a2415c7.css


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/app.2048185de4e9b26261a7c06a5a2415c7.css.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/css/app.a48046a97091992c49c965216837369a.css


BIN
dist/static/img/toux.3282a78.png


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 8 - 0
dist/static/img/workTest.768f8df.svg


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/app.d9fb356934b971ca24e6.js


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/app.d9fb356934b971ca24e6.js.map


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
dist/static/js/manifest.161e82026ac2ae03ab6f.js.map


+ 3 - 0
src/assets/clear.svg

@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7 4H9V2H7V4ZM10 2V4H13C13.5523 4 14 4.44772 14 5V7C14 7.50427 13.6267 7.92137 13.1414 7.99007L13.8369 12.8586C13.923 13.461 13.4555 14 12.847 14H3.15301C2.54446 14 2.077 13.461 2.16306 12.8586L2.85856 7.99007C2.37326 7.92137 2 7.50427 2 7V5C2 4.44772 2.44772 4 3 4H6V2C6 1.44772 6.44772 1 7 1H9C9.55228 1 10 1.44772 10 2ZM12.1327 7H13V5H9H7H3L3 7H3.8673H12.1327ZM12.1327 8H3.8673L3.15301 13H5V11H6V13H7.5V11H8.5V13H10V11H11V13H12.847L12.1327 8Z" fill="black" fill-opacity="0.9"/>
+</svg>

+ 3 - 0
src/assets/delicon.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M10 19.7456C14.8325 19.7456 18.75 15.8281 18.75 10.9956C18.75 6.16307 14.8325 2.24556 10 2.24556C5.16751 2.24556 1.25 6.16307 1.25 10.9956C1.25 15.8281 5.16751 19.7456 10 19.7456ZM9.24988 5.99556H10.7498V7.4955H9.24988V5.99556ZM9.38202 9.12056H10.632V15.9953H9.38202V9.12056Z" fill="#D54941"/>
+</svg>

+ 30 - 0
src/assets/icon/liyuan/Group.svg

@@ -0,0 +1,30 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_27_4)">
+<path d="M49 21H29C26.7909 21 25 22.7909 25 25V45C25 47.2091 26.7909 49 29 49H49C51.2091 49 53 47.2091 53 45V25C53 22.7909 51.2091 21 49 21Z" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.667" height="54.667"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_27_4_clip_path);height:100%;width:100%"></div></foreignObject><path data-figma-bg-blur-radius="4" d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" fill="white" fill-opacity="0.7" stroke="white"/>
+<mask id="mask0_27_4" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="39" y="34" width="36" height="36">
+<path d="M74.6087 34H39V69.6087H74.6087V34Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_27_4)">
+<mask id="mask1_27_4" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="37" y="32" width="40" height="40">
+<path d="M76.6615 32.636L37.7705 32.4956L37.6302 71.3866L76.5211 71.5269L76.6615 32.636Z" fill="white"/>
+</mask>
+<g mask="url(#mask1_27_4)">
+<path d="M56.9224 47.8758C55.6586 47.849 54.4358 48.3253 53.5232 49.2C52.6106 50.0747 52.0828 51.2761 52.056 52.54C52.0292 53.8038 52.5055 55.0265 53.3802 55.9391C54.2549 56.8518 55.4563 57.3795 56.7202 57.4063C57.984 57.4332 59.2067 56.9568 60.1194 56.0821C61.032 55.2074 61.5597 54.006 61.5866 52.7422C61.6134 51.4783 61.137 50.2556 60.2623 49.343C59.3876 48.4304 58.1862 47.9026 56.9224 47.8758ZM56.6528 60.5832C54.5464 60.5385 52.544 59.6589 51.0862 58.1378C49.6284 56.6168 48.8345 54.5789 48.8791 52.4725C48.9238 50.3662 49.8035 48.3638 51.3245 46.906C52.8455 45.4481 54.8834 44.6542 56.9898 44.6989C59.0962 44.7436 61.0985 45.6232 62.5564 47.1443C64.0142 48.6653 64.8081 50.7032 64.7634 52.8096C64.7187 54.916 63.8391 56.9183 62.3181 58.3762C60.797 59.834 58.7592 60.6279 56.6528 60.5832ZM57.074 40.7279C49.1319 40.5593 42.2445 45.3554 39.3486 52.2703C41.9486 59.3018 48.6264 64.3858 56.5685 64.5543C64.5107 64.7228 71.3981 59.9267 74.294 53.0118C71.694 45.9803 65.0162 40.8964 57.074 40.7279Z" fill="black"/>
+</g>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_27_4" x="0.6" y="0.6" width="104.467" height="103.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_27_4"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_27_4" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_27_4_clip_path" transform="translate(-30 -25)"><path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z"/>
+</clipPath></defs>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 5 - 0
src/assets/icon/liyuan/aiTest.svg


+ 3 - 0
src/assets/icon/liyuan/backPage.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.78578 10L13.6783 15.8925L12.4999 17.0709L6.01828 10.5892C5.86205 10.4329 5.77429 10.221 5.77429 10C5.77429 9.77906 5.86205 9.56714 6.01828 9.41087L12.4999 2.9292L13.6783 4.10753L7.78578 10Z" fill="black"/>
+</svg>

+ 11 - 0
src/assets/icon/liyuan/bz.svg

@@ -0,0 +1,11 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_1540_2621)">
+<path d="M7 7H6C5.46957 7 4.96086 7.21071 4.58579 7.58579C4.21071 7.96086 4 8.46957 4 9V18C4 18.5304 4.21071 19.0391 4.58579 19.4142C4.96086 19.7893 5.46957 20 6 20H15C15.5304 20 16.0391 19.7893 16.4142 19.4142C16.7893 19.0391 17 18.5304 17 18V17" stroke="#9747FF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M16 5.00011L19 8.00011M20.385 6.58511C20.7788 6.19126 21.0001 5.65709 21.0001 5.10011C21.0001 4.54312 20.7788 4.00895 20.385 3.61511C19.9912 3.22126 19.457 3 18.9 3C18.343 3 17.8088 3.22126 17.415 3.61511L9 12.0001V15.0001H12L20.385 6.58511Z" stroke="#9747FF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<clipPath id="clip0_1540_2621">
+<rect width="24" height="24" fill="white"/>
+</clipPath>
+</defs>
+</svg>

+ 30 - 0
src/assets/icon/liyuan/classlook.svg

@@ -0,0 +1,30 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5_532)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6667" height="54.6667"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_5_532_clip_path);height:100%;width:100%"></div></foreignObject><path data-figma-bg-blur-radius="4" d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" fill="white" fill-opacity="0.7" stroke="white"/>
+<g clip-path="url(#clip1_5_532)">
+<g clip-path="url(#clip2_5_532)">
+<path d="M56.9219 47.8758C55.658 47.849 54.4353 48.3253 53.5227 49.2C52.6101 50.0748 52.0823 51.2762 52.0555 52.54C52.0287 53.8038 52.505 55.0266 53.3797 55.9392C54.2544 56.8518 55.4558 57.3796 56.7197 57.4064C57.9835 57.4332 59.2062 56.9569 60.1188 56.0822C61.0315 55.2075 61.5592 54.006 61.586 52.7422C61.6129 51.4784 61.1365 50.2557 60.2618 49.343C59.3871 48.4304 58.1857 47.9026 56.9219 47.8758ZM56.6523 60.5832C54.5459 60.5385 52.5435 59.6589 51.0857 58.1379C49.6278 56.6168 48.8339 54.579 48.8786 52.4726C48.9233 50.3662 49.8029 48.3638 51.324 46.906C52.845 45.4482 54.8829 44.6543 56.9893 44.699C59.0957 44.7437 61.098 45.6233 62.5559 47.1443C64.0137 48.6654 64.8076 50.7032 64.7629 52.8096C64.7182 54.916 63.8386 56.9184 62.3175 58.3762C60.7965 59.834 58.7586 60.6279 56.6523 60.5832ZM57.0735 40.7279C49.1314 40.5594 42.244 45.3555 39.3481 52.2704C41.9481 59.3019 48.6259 64.3858 56.568 64.5543C64.5101 64.7228 71.3975 59.9267 74.2935 53.0118C71.6934 45.9803 65.0157 40.8964 57.0735 40.7279Z" fill="black"/>
+</g>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_5_532" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5_532"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5_532" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_5_532_clip_path" transform="translate(-30 -25)"><path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z"/>
+</clipPath><clipPath id="clip1_5_532">
+<rect width="35.6087" height="35.6087" fill="white" transform="translate(39 34)"/>
+</clipPath>
+<clipPath id="clip2_5_532">
+<rect width="38.8912" height="38.8912" fill="white" transform="translate(37.77 32.4956) rotate(0.206764)"/>
+</clipPath>
+</defs>
+</svg>

+ 4 - 0
src/assets/icon/liyuan/edit.svg

@@ -0,0 +1,4 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7 7H6C5.46957 7 4.96086 7.21071 4.58579 7.58579C4.21071 7.96086 4 8.46957 4 9V18C4 18.5304 4.21071 19.0391 4.58579 19.4142C4.96086 19.7893 5.46957 20 6 20H15C15.5304 20 16.0391 19.7893 16.4142 19.4142C16.7893 19.0391 17 18.5304 17 18V17" stroke="#BDBDBD" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M16 4.99998L19 7.99998M20.385 6.58499C20.7788 6.19114 21.0001 5.65697 21.0001 5.09998C21.0001 4.543 20.7788 4.00883 20.385 3.61498C19.9912 3.22114 19.457 2.99988 18.9 2.99988C18.343 2.99988 17.8088 3.22114 17.415 3.61498L9 12V15H12L20.385 6.58499Z" stroke="#BDBDBD" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 20 - 0
src/assets/icon/liyuan/gerendangan.svg

@@ -0,0 +1,20 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3380_909)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6667" height="54.6665"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_3380_909_clip_path);height:100%;width:100%"></div></foreignObject><path data-figma-bg-blur-radius="4" d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" fill="white" fill-opacity="0.7" stroke="white"/>
+<path d="M61.6304 37.189C62.426 37.189 63.1891 37.505 63.7517 38.0676L69.4128 43.7288C69.9754 44.2914 70.2915 45.0544 70.2915 45.8501V65.391C70.2911 65.7815 70.1357 66.1559 69.8594 66.4319C69.5832 66.7079 69.2087 66.8629 68.8182 66.8629H45.0583C44.6686 66.8602 44.2957 66.7043 44.02 66.4289C43.7443 66.1535 43.5881 65.7807 43.585 65.391V38.6608C43.585 37.8477 44.2452 37.189 45.0583 37.189H61.6304ZM56.9382 51.2841C57.922 51.2841 58.8654 50.8933 59.561 50.1977C60.2567 49.502 60.6475 48.5586 60.6475 47.5748C60.6475 46.5911 60.2567 45.6476 59.561 44.952C58.8654 44.2564 57.922 43.8656 56.9382 43.8656C55.9545 43.8656 55.011 44.2564 54.3154 44.952C53.6198 45.6476 53.229 46.5911 53.229 47.5748C53.229 48.5586 53.6198 49.502 54.3154 50.1977C55.011 50.8933 55.9545 51.2841 56.9382 51.2841ZM51.4699 56.3439C50.4448 57.8073 51.8631 59.4444 53.6499 59.4444H60.2266C62.0133 59.4444 63.4317 57.8073 62.4065 56.3439C62.1157 55.9288 61.7766 55.5452 61.3936 55.2021C60.169 54.1048 58.5825 53.4981 56.9382 53.4981C55.2939 53.4981 53.7074 54.1048 52.4828 55.2021C52.0998 55.5452 51.7607 55.9288 51.4699 56.3439Z" fill="black"/>
+</g>
+<defs>
+<filter id="filter0_d_3380_909" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3380_909"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3380_909" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_3380_909_clip_path" transform="translate(-30 -25)"><path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z"/>
+</clipPath></defs>
+</svg>

+ 26 - 0
src/assets/icon/liyuan/hymj.svg

@@ -0,0 +1,26 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5_3028)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6667" height="54.6667"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_5_3028_clip_path);height:100%;width:100%"></div></foreignObject><g data-figma-bg-blur-radius="4">
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z" fill="white" fill-opacity="0.7"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z" fill="white"/>
+<path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" stroke="white"/>
+</g>
+<path d="M62.25 42.25C62.25 39.3505 59.8995 37 57 37C54.1005 37 51.75 39.3505 51.75 42.25V52C51.75 54.8995 54.1005 57.25 57 57.25C59.8995 57.25 62.25 54.8995 62.25 52V42.25Z" fill="black" stroke="black" stroke-width="2" stroke-linejoin="round"/>
+<path d="M45.75 51.25C45.75 57.463 50.787 62.5 57 62.5M57 62.5C63.213 62.5 68.25 57.463 68.25 51.25M57 62.5V67" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<filter id="filter0_d_5_3028" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5_3028"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5_3028" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_5_3028_clip_path" transform="translate(-30 -25)"><path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z"/>
+</clipPath></defs>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 5 - 0
src/assets/icon/liyuan/jiaoshihuaxiang.svg


+ 30 - 0
src/assets/icon/liyuan/ketangguancha.svg

@@ -0,0 +1,30 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3380_925)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6667" height="54.6665"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_3380_925_clip_path);height:100%;width:100%"></div></foreignObject><path data-figma-bg-blur-radius="4" d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" fill="white" fill-opacity="0.7" stroke="white"/>
+<g clip-path="url(#clip1_3380_925)">
+<g clip-path="url(#clip2_3380_925)">
+<path d="M56.922 47.8756C55.6582 47.8488 54.4354 48.3251 53.5228 49.1998C52.6102 50.0745 52.0824 51.2759 52.0556 52.5398C52.0288 53.8036 52.5051 55.0263 53.3798 55.9389C54.2545 56.8516 55.4559 57.3793 56.7198 57.4061C57.9836 57.433 59.2063 56.9566 60.119 56.0819C61.0316 55.2072 61.5593 54.0058 61.5862 52.742C61.613 51.4781 61.1366 50.2554 60.2619 49.3428C59.3872 48.4302 58.1858 47.9024 56.922 47.8756ZM56.6524 60.583C54.546 60.5383 52.5436 59.6587 51.0858 58.1376C49.628 56.6166 48.8341 54.5787 48.8787 52.4723C48.9234 50.366 49.8031 48.3636 51.3241 46.9058C52.8451 45.4479 54.883 44.654 56.9894 44.6987C59.0958 44.7434 61.0981 45.623 62.556 47.1441C64.0138 48.6651 64.8077 50.703 64.763 52.8094C64.7183 54.9158 63.8387 56.9181 62.3177 58.376C60.7966 59.8338 58.7588 60.6277 56.6524 60.583ZM57.0736 40.7277C49.1315 40.5591 42.2441 45.3552 39.3482 52.2701C41.9482 59.3016 48.626 64.3856 56.5681 64.5541C64.5103 64.7226 71.3977 59.9265 74.2936 53.0116C71.6936 45.9801 65.0158 40.8962 57.0736 40.7277Z" fill="black"/>
+</g>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_3380_925" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3380_925"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3380_925" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_3380_925_clip_path" transform="translate(-30 -25)"><path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z"/>
+</clipPath><clipPath id="clip1_3380_925">
+<rect width="35.6087" height="35.6087" fill="white" transform="translate(39 34)"/>
+</clipPath>
+<clipPath id="clip2_3380_925">
+<rect width="38.8912" height="38.8912" fill="white" transform="translate(37.77 32.4956) rotate(0.206764)"/>
+</clipPath>
+</defs>
+</svg>

+ 4 - 0
src/assets/icon/liyuan/lpot.svg

@@ -0,0 +1,4 @@
+<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="15" cy="15" r="15" fill="#0663FE"/>
+<path d="M12.5001 7.5H17.5001L19.1667 9.16667H22.5001C22.7211 9.16667 22.9331 9.25446 23.0893 9.41074C23.2456 9.56702 23.3334 9.77899 23.3334 10V21.6667C23.3334 21.8877 23.2456 22.0996 23.0893 22.2559C22.9331 22.4122 22.7211 22.5 22.5001 22.5H7.50008C7.27907 22.5 7.06711 22.4122 6.91083 22.2559C6.75455 22.0996 6.66675 21.8877 6.66675 21.6667V10C6.66675 9.77899 6.75455 9.56702 6.91083 9.41074C7.06711 9.25446 7.27907 9.16667 7.50008 9.16667H10.8334L12.5001 7.5ZM15.0001 20.8333C16.3262 20.8333 17.5979 20.3065 18.5356 19.3689C19.4733 18.4312 20.0001 17.1594 20.0001 15.8333C20.0001 14.5073 19.4733 13.2355 18.5356 12.2978C17.5979 11.3601 16.3262 10.8333 15.0001 10.8333C13.674 10.8333 12.4022 11.3601 11.4645 12.2978C10.5269 13.2355 10.0001 14.5073 10.0001 15.8333C10.0001 17.1594 10.5269 18.4312 11.4645 19.3689C12.4022 20.3065 13.674 20.8333 15.0001 20.8333ZM15.0001 19.1667C14.116 19.1667 13.2682 18.8155 12.6431 18.1904C12.0179 17.5652 11.6667 16.7174 11.6667 15.8333C11.6667 14.9493 12.0179 14.1014 12.6431 13.4763C13.2682 12.8512 14.116 12.5 15.0001 12.5C15.8841 12.5 16.732 12.8512 17.3571 13.4763C17.9822 14.1014 18.3334 14.9493 18.3334 15.8333C18.3334 16.7174 17.9822 17.5652 17.3571 18.1904C16.732 18.8155 15.8841 19.1667 15.0001 19.1667Z" fill="black"/>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 9 - 0
src/assets/icon/liyuan/mbL.svg


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 8 - 0
src/assets/icon/liyuan/mbll.svg


+ 24 - 0
src/assets/icon/liyuan/niandukaohe.svg

@@ -0,0 +1,24 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_3380_904)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6667" height="54.6665"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_3380_904_clip_path);height:100%;width:100%"></div></foreignObject><g data-figma-bg-blur-radius="4">
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z" fill="white" fill-opacity="0.7"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z" fill="black"/>
+<path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" stroke="white"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_3380_904" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_3380_904"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_3380_904" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_3380_904_clip_path" transform="translate(-30 -25)"><path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z"/>
+</clipPath></defs>
+</svg>

+ 30 - 0
src/assets/icon/liyuan/scolr.svg

@@ -0,0 +1,30 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5_2945)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6667" height="54.6667"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_5_2945_clip_path);height:100%;width:100%"></div></foreignObject><path data-figma-bg-blur-radius="4" d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" fill="white" fill-opacity="0.7" stroke="white"/>
+<g clip-path="url(#clip1_5_2945)">
+<g clip-path="url(#clip2_5_2945)">
+<path d="M50.9999 39.6227L43.6666 43.9013L43.6666 64.6667L50.9999 61.644L50.9999 39.6227ZM53.6666 61.2133L54.9999 62L54.9999 60.7267L60.3332 55.3933L60.3332 42.7867L53.6666 38.8493L53.6666 61.2133ZM70.3332 39.3333L70.3332 51.2933L67.3826 48.344L62.9999 52.7267L62.9999 42.356L70.3332 39.3333ZM72.8852 57.6187L67.3826 52.1147L57.6666 61.8307L57.6679 67.3333L63.1706 67.3333L72.8852 57.6187ZM64.2679 59L65.9999 60.7333L62.0666 64.6667L60.3332 64.6667L60.3332 62.9333L64.2679 59Z" fill="black"/>
+</g>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_5_2945" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5_2945"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5_2945" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_5_2945_clip_path" transform="translate(-30 -25)"><path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z"/>
+</clipPath><clipPath id="clip1_5_2945">
+<rect width="35.6087" height="35.6087" fill="white" transform="translate(39 33.7295)"/>
+</clipPath>
+<clipPath id="clip2_5_2945">
+<rect width="32" height="32" fill="white" transform="translate(40.9999 36)"/>
+</clipPath>
+</defs>
+</svg>

+ 20 - 0
src/assets/icon/liyuan/seva.svg

@@ -0,0 +1,20 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5_2937)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6667" height="54.6667"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_5_2937_clip_path);height:100%;width:100%"></div></foreignObject><path data-figma-bg-blur-radius="4" d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" fill="white" fill-opacity="0.7" stroke="white"/>
+<path d="M52.5 68C52.1022 68 51.7206 67.842 51.4393 67.5607C51.158 67.2794 51 66.8978 51 66.5V62H45C44.2044 62 43.4413 61.6839 42.8787 61.1213C42.3161 60.5587 42 59.7956 42 59V41C42 40.2044 42.3161 39.4413 42.8787 38.8787C43.4413 38.3161 44.2044 38 45 38H69C69.7956 38 70.5587 38.3161 71.1213 38.8787C71.6839 39.4413 72 40.2044 72 41V59C72 59.7956 71.6839 60.5587 71.1213 61.1213C70.5587 61.6839 69.7956 62 69 62H59.85L54.3 67.565C54 67.85 53.625 68 53.25 68H52.5ZM63 56V54.5C63 52.505 58.995 51.5 57 51.5C55.005 51.5 51 52.505 51 54.5V56H63ZM57 44C56.2044 44 55.4413 44.3161 54.8787 44.8787C54.3161 45.4413 54 46.2044 54 47C54 47.7956 54.3161 48.5587 54.8787 49.1213C55.4413 49.6839 56.2044 50 57 50C57.7956 50 58.5587 49.6839 59.1213 49.1213C59.6839 48.5587 60 47.7956 60 47C60 46.2044 59.6839 45.4413 59.1213 44.8787C58.5587 44.3161 57.7956 44 57 44Z" fill="black"/>
+</g>
+<defs>
+<filter id="filter0_d_5_2937" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5_2937"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5_2937" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_5_2937_clip_path" transform="translate(-30 -25)"><path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z"/>
+</clipPath></defs>
+</svg>

+ 26 - 0
src/assets/icon/liyuan/stumange.svg

@@ -0,0 +1,26 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5_3045)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6667" height="54.6667"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_5_3045_clip_path);height:100%;width:100%"></div></foreignObject><g data-figma-bg-blur-radius="4">
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z" fill="white" fill-opacity="0.7"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z" fill="white"/>
+<path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" stroke="white"/>
+</g>
+<path d="M42.75 43L51 40L59.25 43L55.5 45.25V47.5C55.5 47.5 54.4995 46.75 51 46.75C47.5005 46.75 46.5 47.5 46.5 47.5V45.25L42.75 43ZM42.75 43V49" stroke="black" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M55.5 46.75V48.0835C55.5 50.6605 53.4855 52.75 51 52.75C48.5145 52.75 46.5 50.6605 46.5 48.0835V46.75M61.977 50.545C61.977 50.545 62.7045 50.0155 65.25 50.0155C67.7955 50.0155 68.523 50.5435 68.523 50.5435M61.977 50.545V49L59.25 47.5L65.25 45.25L71.25 47.5L68.523 49V50.5435M61.977 50.545V50.977C61.977 51.8451 62.3218 52.6776 62.9356 53.2914C63.5494 53.9052 64.3819 54.25 65.25 54.25C66.1181 54.25 66.9506 53.9052 67.5644 53.2914C68.1782 52.6776 68.523 51.8451 68.523 50.977V50.5435M63 64H68.5575C69.717 64 70.638 63.436 71.466 62.647C73.161 61.033 70.3785 59.743 69.318 59.1115C68.3749 58.5548 67.3276 58.1975 66.2409 58.0615C65.1542 57.9255 64.0512 58.0139 63 58.321M45.5775 57.889C44.163 58.6795 40.4535 60.292 42.7125 62.3095C43.8165 63.295 45.045 64 46.5915 64H55.4085C56.9535 64 58.1835 63.295 59.2875 62.3095C61.5465 60.292 57.837 58.6795 56.4225 57.889C53.1045 56.0365 48.8955 56.0365 45.5775 57.889Z" stroke="black" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
+</g>
+<defs>
+<filter id="filter0_d_5_3045" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5_3045"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5_3045" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_5_3045_clip_path" transform="translate(-30 -25)"><path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z"/>
+</clipPath></defs>
+</svg>

+ 30 - 0
src/assets/icon/liyuan/teamange.svg

@@ -0,0 +1,30 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_1_11)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6667" height="54.6667"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_1_11_clip_path);height:100%;width:100%"></div></foreignObject><g data-figma-bg-blur-radius="4">
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7398L54.5863 50.7337C54.1452 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z" fill="white" fill-opacity="0.7"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7398L54.5863 50.7337C54.1452 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z" fill="white"/>
+<path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" stroke="white"/>
+</g>
+<g clip-path="url(#clip1_1_11)">
+<path d="M50.5625 56.875C50.4412 56.875 50.3198 56.8928 50.204 56.9304C49.5459 57.1441 48.8537 57.2812 48.125 57.2812C47.3963 57.2812 46.7042 57.1441 46.0455 56.9304C45.9298 56.8928 45.8089 56.875 45.6875 56.875C42.5361 56.875 39.9833 59.4384 40 62.594C40.0071 63.9275 41.1035 65 42.4375 65H53.8125C55.1466 65 56.2429 63.9275 56.25 62.594C56.2668 59.4384 53.714 56.875 50.5625 56.875ZM48.125 55.25C50.8175 55.25 53 53.0674 53 50.375C53 47.6826 50.8175 45.5 48.125 45.5C45.4326 45.5 43.25 47.6826 43.25 50.375C43.25 53.0674 45.4326 55.25 48.125 55.25ZM70.0625 39H50.5625C49.2184 39 48.125 40.1299 48.125 41.5182V43.875C49.3143 43.875 50.4153 44.2193 51.375 44.7789V42.25H69.25V56.875H66V53.625H59.5V56.875H55.6285C56.5984 57.7225 57.3103 58.8418 57.644 60.125H70.0625C71.4067 60.125 72.5 58.9951 72.5 57.6068V41.5182C72.5 40.1299 71.4067 39 70.0625 39Z" fill="black"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_1_11" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1_11"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1_11" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_1_11_clip_path" transform="translate(-30 -25)"><path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7398L54.5863 50.7337C54.1452 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7398L54.5863 50.7337C54.1452 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z"/>
+</clipPath><clipPath id="clip1_1_11">
+<rect width="32.5" height="26" fill="white" transform="translate(40 39)"/>
+</clipPath>
+</defs>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 5 - 0
src/assets/icon/liyuan/teapic.svg


+ 3 - 0
src/assets/icon/liyuan/tele.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M5.51667 8.99167C6.71667 11.35 8.65 13.2833 11.0083 14.4833L12.8417 12.65C13.075 12.4167 13.4 12.35 13.6917 12.4417C14.625 12.75 15.625 12.9167 16.6667 12.9167C16.8877 12.9167 17.0996 13.0045 17.2559 13.1607C17.4122 13.317 17.5 13.529 17.5 13.75V16.6667C17.5 16.8877 17.4122 17.0996 17.2559 17.2559C17.0996 17.4122 16.8877 17.5 16.6667 17.5C12.9094 17.5 9.30609 16.0074 6.64932 13.3507C3.99256 10.6939 2.5 7.09057 2.5 3.33333C2.5 3.11232 2.5878 2.90036 2.74408 2.74408C2.90036 2.5878 3.11232 2.5 3.33333 2.5H6.25C6.47101 2.5 6.68298 2.5878 6.83926 2.74408C6.99554 2.90036 7.08333 3.11232 7.08333 3.33333C7.08333 4.375 7.25 5.375 7.55833 6.30833C7.65 6.6 7.58333 6.925 7.35 7.15833L5.51667 8.99167Z" fill="#969BA3"/>
+</svg>

BIN
src/assets/icon/liyuan/toux.png


+ 20 - 0
src/assets/icon/liyuan/userrecord.svg

@@ -0,0 +1,20 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5_516)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6667" height="54.6667"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_5_516_clip_path);height:100%;width:100%"></div></foreignObject><path data-figma-bg-blur-radius="4" d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" fill="white" fill-opacity="0.7" stroke="white"/>
+<path d="M61.6304 37.189C62.426 37.189 63.1891 37.505 63.7517 38.0676L69.4128 43.7288C69.9754 44.2914 70.2915 45.0544 70.2915 45.8501V65.391C70.2911 65.7815 70.1357 66.1559 69.8594 66.4319C69.5832 66.7079 69.2087 66.8629 68.8182 66.8629H45.0583C44.6686 66.8602 44.2957 66.7043 44.02 66.4289C43.7443 66.1535 43.5881 65.7807 43.585 65.391V38.6608C43.585 37.8477 44.2452 37.189 45.0583 37.189H61.6304ZM56.9382 51.2841C57.922 51.2841 58.8654 50.8933 59.561 50.1977C60.2567 49.502 60.6475 48.5586 60.6475 47.5748C60.6475 46.5911 60.2567 45.6476 59.561 44.952C58.8654 44.2564 57.922 43.8656 56.9382 43.8656C55.9545 43.8656 55.011 44.2564 54.3154 44.952C53.6198 45.6476 53.229 46.5911 53.229 47.5748C53.229 48.5586 53.6198 49.502 54.3154 50.1977C55.011 50.8933 55.9545 51.2841 56.9382 51.2841ZM51.4699 56.3439C50.4448 57.8073 51.8631 59.4444 53.6499 59.4444H60.2266C62.0133 59.4444 63.4317 57.8073 62.4065 56.3439C62.1157 55.9288 61.7766 55.5452 61.3936 55.2021C60.169 54.1048 58.5825 53.4981 56.9382 53.4981C55.2939 53.4981 53.7074 54.1048 52.4828 55.2021C52.0998 55.5452 51.7607 55.9288 51.4699 56.3439Z" fill="black"/>
+</g>
+<defs>
+<filter id="filter0_d_5_516" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5_516"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5_516" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_5_516_clip_path" transform="translate(-30 -25)"><path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z"/>
+</clipPath></defs>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 8 - 0
src/assets/icon/liyuan/workTest.svg


+ 24 - 0
src/assets/icon/liyuan/yearass.svg

@@ -0,0 +1,24 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5_511)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6665" height="54.6667"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_5_511_clip_path);height:100%;width:100%"></div></foreignObject><g data-figma-bg-blur-radius="4">
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z" fill="white" fill-opacity="0.7"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z" fill="black"/>
+<path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" stroke="white"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_5_511" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5_511"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5_511" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_5_511_clip_path" transform="translate(-30 -25)"><path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z"/>
+</clipPath></defs>
+</svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 5 - 0
src/assets/icon/liyuan/zhinengbiaodan.svg


+ 30 - 0
src/assets/icon/liyuan/zlsj.svg

@@ -0,0 +1,30 @@
+<svg width="106" height="105" viewBox="0 0 106 105" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d_5_3020)">
+<rect x="25" y="21" width="28" height="28" rx="4" fill="#0663FE"/>
+<foreignObject x="30" y="25" width="54.6665" height="54.6667"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(2px);clip-path:url(#bgblur_0_5_3020_clip_path);height:100%;width:100%"></div></foreignObject><g data-figma-bg-blur-radius="4">
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z" fill="white" fill-opacity="0.7"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z" fill="white"/>
+<path d="M75.1582 29.5C76.567 29.5 77.7696 29.9785 78.7305 30.9395C79.6914 31.9005 80.169 33.1029 80.167 34.5117V70.1582C80.167 71.5667 79.6894 72.7695 78.7305 73.7305C77.771 74.6918 76.5672 75.1679 75.1553 75.166L39.5117 75.167C38.1017 75.167 36.8988 74.6897 35.9395 73.7305C34.9801 72.7711 34.5021 71.5677 34.5 70.1562V34.5117C34.5 33.1012 34.978 31.8978 35.9395 30.9385C36.9002 29.9798 38.1025 29.502 39.5107 29.5H75.1582Z" stroke="white"/>
+</g>
+<g clip-path="url(#clip1_5_3020)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M63.2499 50.7501C63.2499 51.735 63.0559 52.7102 62.679 53.6202C62.3021 54.5301 61.7496 55.3569 61.0532 56.0534C60.3567 56.7498 59.5299 57.3022 58.62 57.6792C57.7101 58.0561 56.7348 58.2501 55.7499 58.2501C54.765 58.2501 53.7897 58.0561 52.8797 57.6792C51.9698 57.3022 51.143 56.7498 50.4466 56.0534C49.7501 55.3569 49.1977 54.5301 48.8208 53.6202C48.4439 52.7102 48.2499 51.735 48.2499 50.7501C48.2499 48.7609 49.04 46.8533 50.4466 45.4468C51.8531 44.0402 53.7607 43.2501 55.7499 43.2501C57.739 43.2501 59.6466 44.0402 61.0532 45.4468C62.4597 46.8533 63.2499 48.7609 63.2499 50.7501ZM62.2674 59.9201C59.9683 61.5546 57.139 62.2659 54.3403 61.9127C51.5416 61.5596 48.9776 60.1679 47.1566 58.0135C45.3356 55.8591 44.3904 53.0992 44.5084 50.2807C44.6264 47.4623 45.7989 44.791 47.7936 42.7963C49.7883 40.8016 52.4596 39.6291 55.278 39.5111C58.0965 39.3931 60.8564 40.3383 63.0108 42.1593C65.1653 43.9803 66.5569 46.5442 66.9101 49.343C67.2632 52.1417 66.552 54.971 64.9174 57.2701L71.4499 63.8001C71.6341 63.9717 71.7818 64.1787 71.8843 64.4087C71.9868 64.6387 72.0419 64.887 72.0464 65.1388C72.0508 65.3905 72.0045 65.6406 71.9102 65.8741C71.8159 66.1075 71.6755 66.3196 71.4975 66.4977C71.3194 66.6757 71.1073 66.8161 70.8739 66.9104C70.6404 67.0047 70.3903 67.051 70.1386 67.0465C69.8868 67.0421 69.6385 66.987 69.4085 66.8845C69.1785 66.782 68.9715 66.6343 68.7999 66.4501L62.2674 59.9201Z" fill="black"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_d_5_3020" x="-5.4" y="-12.4" width="115.8" height="116.467" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="12.2"/>
+<feComposite in2="hardAlpha" operator="out"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.168627 0 0 0 0 0.290196 0 0 0 0 0.741176 0 0 0 0.4 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_5_3020"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_5_3020" result="shape"/>
+</filter>
+<clipPath id="bgblur_0_5_3020_clip_path" transform="translate(-30 -25)"><path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703ZM39.5113 74.6667C38.2253 74.6667 37.1524 74.2367 36.2925 73.3769C35.4327 72.5171 35.0019 71.4432 35 70.1553V34.5113C35 33.2253 35.4308 32.1524 36.2925 31.2925C37.1542 30.4327 38.2272 30.0019 39.5113 30H75.1581C76.4423 30 77.5152 30.4308 78.3769 31.2925C79.2386 32.1542 79.6685 33.2272 79.6667 34.5113V70.1581C79.6667 71.4423 79.2367 72.5152 78.3769 73.3769C77.5171 74.2386 76.4432 74.6685 75.1553 74.6667H39.5113Z"/>
+<path d="M53.0062 53.0703L57.0123 57.0736C57.4162 57.5147 57.9335 57.7352 58.5645 57.7352C59.1935 57.7352 59.7277 57.5147 60.1669 57.0736L69.8958 47.4005V52.4031C69.8958 52.7642 70.0289 53.0759 70.295 53.3383C70.5612 53.5989 70.8934 53.7292 71.2917 53.7292C71.6527 53.7292 71.9756 53.5961 72.2604 53.33C72.5451 53.0638 72.6875 52.7316 72.6875 52.3333V44.8182C72.6875 44.204 72.4642 43.6754 72.0175 43.2325C71.5727 42.7858 71.0441 42.5625 70.4318 42.5625H62.8469C62.4858 42.5625 62.175 42.7049 61.9145 42.9896C61.6539 43.2744 61.5227 43.5973 61.5208 43.9583C61.5208 44.3566 61.6539 44.6888 61.92 44.955C62.1862 45.2211 62.5184 45.3542 62.9167 45.3542H67.8495L58.5896 54.7397L54.5863 50.7337C54.1453 50.2833 53.6102 50.0581 52.9811 50.0581C52.3502 50.0581 51.8328 50.2833 51.429 50.7337L43.5034 58.6062C43.2317 58.9021 43.0958 59.2399 43.0958 59.6196C43.0958 59.9992 43.2317 60.3194 43.5034 60.5799C43.8012 60.887 44.1399 61.0405 44.5196 61.0405C44.8992 61.0405 45.2194 60.887 45.4799 60.5799L53.0062 53.0703Z"/>
+</clipPath><clipPath id="clip1_5_3020">
+<rect width="30" height="30" fill="white" transform="translate(42 37)"/>
+</clipPath>
+</defs>
+</svg>

+ 3 - 0
src/components/pages/classroomObservation/components/analysisTemplateDialog.vue

@@ -627,6 +627,7 @@ export default {
 							this.dialogTagList2 = tagList.dialogTagList
 						}
             this.tagBox = 2;
+            this.$forceUpdate();
           } else {
             this.$message.error("获取模板详细为空");
           }
@@ -1175,6 +1176,7 @@ export default {
   background-color: #fff;
   box-sizing: border-box;
   padding: 12px;
+  display: block !important;
 }
 
 .ad_h_top {
@@ -1252,6 +1254,7 @@ export default {
   overflow: auto;
   padding: 12px;
   box-sizing: border-box;
+  display: block !important;
 }
 
 .bb_preview:hover {

+ 268 - 81
src/components/pages/classroomObservation/dialog/batchCreationClassDialog.vue

@@ -64,6 +64,11 @@
                   >批量导出doc</span
                 >
               </span>
+              <span>
+                <span @click="regenerateTheReport" style="color:#409EFF"
+                  >批量重新生成报告</span
+                >
+              </span>
               <span>
                 <span @click="delSelectBtn" style="color: red;">删除</span>
                 <!-- <img
@@ -252,6 +257,11 @@ export default {
         i => !i.isOtherData && i.jsonData.name != "词频词汇分析"
       );
 
+      _analysisList.forEach(i => {
+        if (i.jsonData.spectrogramData) {
+          delete i.jsonData.spectrogramData;
+        }
+      });
       let promiseList = [];
 
       fileDataList.forEach(i => {
@@ -773,6 +783,25 @@ export default {
           .catch(() => {
             console.log("不暂停");
           });
+      } else if (type === "regenerateTheReport" && id) {
+        this.$confirm("您确定要重新生成任报告吗?。", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            this.dataList.find(i => i.id === id).status = "0";
+            this.dataList
+              .find(i => i.id === id)
+              .jsonData.steps.find(i => i.type == "generateReport").status =
+              "0";
+            if (!this.dataList.some(i => i.status == "1")) {
+              this.startTask(id);
+            }
+          })
+          .catch(() => {
+            console.log("不暂停");
+          });
       }
     },
     async startTask(id) {
@@ -820,15 +849,48 @@ export default {
           //按顺序处理任务
           let _step = _stepList[i];
           console.log(_step);
-          if (!this.nowDoTaskId.includes(_startData.id)) break;
-          if (_step.status === "1") continue;
+          if (!this.nowDoTaskId.includes(_startData.id)){
+            if (
+                this.dataList.find(i => i.id === _startData.id).status == "1"
+              ) {
+                this.dataList.find(i => i.id === _startData.id).status = "0";
+                if (this.dataList.find(i => i.status == "0")) {
+                  let id = this.dataList.find(i => i.status == "0").id;
+                  this.startTask(id);
+                }
+              }
+            break;
+          };
+          if (_step.status == "1") {
+            if (_step.type == "createClass") {
+              if (
+                this.dataList.find(i => i.id === _startData.id).status == "1"
+              ) {
+                this.dataList.find(i => i.id === _startData.id).status = "2";
+                this.updateTask(_startData.id);
+                if (this.dataList.find(i => i.status == "0")) {
+                  let id = this.dataList.find(i => i.status == "0").id;
+                  this.startTask(id);
+                }
+              }
+              break;
+            } else {
+              continue;
+            }
+          }
           if (_step.type === "uploadFile") continue;
           if (_step.type === "getVideoVoice") {
             //视频提取音频
             _stepList[i].status = "2";
+            _stepList[i].startTime =
+              new Date().toLocaleDateString().replaceAll("/", "-") +
+              " " +
+              new Date().toLocaleTimeString();
+
             this.dataList.find(
               i => i.id === _startData.id
             ).jsonData.steps = _stepList;
+            this.$forceUpdate()
             let _fileData = _startData.jsonData.fileData;
             let audioFile = await this.getVideoToVoiceAndUploadMixin(_fileData);
             if (audioFile.data == 3) {
@@ -840,6 +902,10 @@ export default {
               };
 
               this.dataList.find(i => i.id === _startData.id).status = "3";
+              if (this.dataList.find(i => i.status == "0")) {
+                let id = this.dataList.find(i => i.status == "0").id;
+                this.startTask(id);
+              }
               break;
             }
             if (!this.nowDoTaskId.includes(_startData.id)) break;
@@ -872,9 +938,15 @@ export default {
             if (fileData.type === "text/plain") {
               //txt文件
               _stepList[i].status = "2";
+              _stepList[i].startTime =
+                new Date().toLocaleDateString().replaceAll("/", "-") +
+                " " +
+                new Date().toLocaleTimeString();
+
               this.dataList.find(
                 i => i.id === _startData.id
               ).jsonData.steps = _stepList;
+              this.$forceUpdate()
               let { editorBarData } = await this.getTextContentMixin(fileData);
               if (!this.nowDoTaskId.includes(_startData.id)) break;
               this.dataList.find(
@@ -899,10 +971,15 @@ export default {
             ) {
               //mp4与wav文件
               _stepList[i].status = "2";
+              _stepList[i].startTime =
+                new Date().toLocaleDateString().replaceAll("/", "-") +
+                " " +
+                new Date().toLocaleTimeString();
+
               this.dataList.find(
                 i => i.id === _startData.id
               ).jsonData.steps = _stepList;
-
+              this.$forceUpdate()
               let _file = _startData.jsonData.fileData.fileObj;
               if (!_file && JSON.stringify(_file) != "{}") {
                 let fileBody = await this.getFileBody(
@@ -925,15 +1002,28 @@ export default {
                   _file = _data.data;
                 } else {
                   console.log("报错👉", _data);
+                  if (this.dataList.find(i => i.status == "0")) {
+                    let id = this.dataList.find(i => i.status == "0").id;
+                    this.startTask(id);
+                  }
+                  break;
                 }
               }
               console.log("转录文件", _file);
 
               let {
                 transcriptionContent,
-                editorBarData
+                editorBarData,
+                data
               } = await this.wavAudioToTextAndObjMixin(_file);
-
+              if (data === 1) {
+                //转录失败,直接退出
+                if (this.dataList.find(i => i.status == "0")) {
+                  let id = this.dataList.find(i => i.status == "0").id;
+                  this.startTask(id);
+                }
+                break;
+              }
               this.dataList.find(
                 i => i.id === _startData.id
               ).jsonData.baseMessage.transcriptionData = transcriptionContent;
@@ -955,55 +1045,17 @@ export default {
             }
           } else if (_step.type === "automaticCoding") {
             if (_startData.jsonData.automaticCoding) {
-              // const fileData = _startData.jsonData.fileData;
-              // if (fileData.type === "text/plain") {
-              //   _stepList[i].status = "2";
-              //   this.dataList.find(
-              //     i => i.id === _startData.id
-              //   ).jsonData.steps = _stepList;
-              //   //选择了字段编码
-              //   let _content =
-              //     _startData.jsonData.baseMessage.editorBarData.content;
-              //   let _tableList =
-              //     _startData.jsonData.baseMessage.editorBarData.table;
-              //   if (!_content) {
-              //     _content = await this.getFile(
-              //       _startData.jsonData.baseMessage.editorBarData.url
-              //     );
-              //     _content = _content.data;
-              //     this.dataList.find(
-              //       i => i.id === _startData.id
-              //     ).jsonData.baseMessage.editorBarData.content = _content;
-              //   }
-
-              //   if (!_tableList) {
-              //     let _result = [];
-              //     let _data = _content;
-              //     let _div = document.createElement("div");
-              //     _div.innerHTML = _data;
-              //     let _tableRows = _div.querySelectorAll(`table tbody tr`);
-              //     _tableRows.forEach((i, index) => {
-              //       if (index == 0) return;
-              //       let obj = {
-              //         index: i.cells[0].textContent,
-              //         startTime: i.cells[1].textContent,
-              //         endTime: i.cells[2].textContent,
-              //         value: i.cells[3].textContent,
-              //         time: i.cells[4].textContent,
-              //         role: i.cells[5] ? i.cells[5].textContent : "",
-              //         code: i.cells[6] ? i.cells[6].textContent : ""
-              //       };
-              //       _result.push(obj);
-              //     });
-
-              //     _tableList = _result;
-              //   }
-              // } else {
               const fileData = _startData.jsonData.fileData;
               _stepList[i].status = "2";
+              _stepList[i].startTime =
+                new Date().toLocaleDateString().replaceAll("/", "-") +
+                " " +
+                new Date().toLocaleTimeString();
+
               this.dataList.find(
                 i => i.id === _startData.id
               ).jsonData.steps = _stepList;
+              this.$forceUpdate()
               //选择了字段编码
               let _content =
                 _startData.jsonData.baseMessage.editorBarData.content;
@@ -1091,9 +1143,15 @@ export default {
           } else if (_step.type === "getFileIds") {
             //文件获取fileId
             _stepList[i].status = "2";
+            _stepList[i].startTime =
+              new Date().toLocaleDateString().replaceAll("/", "-") +
+              " " +
+              new Date().toLocaleTimeString();
+
             this.dataList.find(
               i => i.id === _startData.id
             ).jsonData.steps = _stepList;
+            this.$forceUpdate()
             let _fileData = _startData.jsonData.baseMessage.editorBarData;
             let { fileId } = await this.getFileIdMixin(_fileData.url);
             if (!this.nowDoTaskId.includes(_startData.id)) break;
@@ -1115,10 +1173,15 @@ export default {
           } else if (_step.type == "getWordCloudMap") {
             //文件获取fileId
             _stepList[i].status = "2";
+            _stepList[i].startTime =
+              new Date().toLocaleDateString().replaceAll("/", "-") +
+              " " +
+              new Date().toLocaleTimeString();
+
             this.dataList.find(
               i => i.id === _startData.id
             ).jsonData.steps = _stepList;
-
+            this.$forceUpdate()
             let _fileData = _startData.jsonData.baseMessage.editorBarData;
 
             let _content = await this.getFile(_fileData.url);
@@ -1142,9 +1205,15 @@ export default {
           } else if (_step.type === "generateReport") {
             //生成报告
             _stepList[i].status = "2";
+            _stepList[i].startTime =
+              new Date().toLocaleDateString().replaceAll("/", "-") +
+              " " +
+              new Date().toLocaleTimeString();
+
             this.dataList.find(
               i => i.id === _startData.id
             ).jsonData.steps = _stepList;
+            this.$forceUpdate()
             let _analysisList = _startData.jsonData.analysisList;
 
             let promises = [];
@@ -1157,6 +1226,7 @@ export default {
               _content = _content.data;
               _startData.jsonData.baseMessage.editorBarData.content = _content;
             }
+            console.log(_analysisList.length)
             promises = _analysisList.map((i, index) => {
               return new Promise(async resolve => {
                 _startData.jsonData.analysisList[index].status = "default"; //默认状态
@@ -1168,7 +1238,7 @@ export default {
                       _startData.jsonData.analysisList[index].status
                     )
                   ) {
-                    return resolve(_startData.jsonData.analysisList[index]);
+                    return resolve();
                   }
                   if (_num >= _maxNum) {
                     _startData.jsonData.analysisList[index].status =
@@ -1196,8 +1266,9 @@ export default {
                     assistantData: _assistantData,
                     baseMessage: _startData.jsonData.baseMessage
                   });
-                  if (!this.nowDoTaskId.includes(_startData.id))
-                    return resolve();
+                  console.log("👉xxx",data,index)
+
+                  if (!this.nowDoTaskId.includes(_startData.id)) return resolve();
                   if (data.data == 1) {
                     if (_num < _maxNum) {
                       //重试
@@ -1232,15 +1303,33 @@ export default {
                   this.dataList.find(i => i.id === _startData.id).jsonData
                 )
               );
+              if (
+                this.dataList
+                  .find(i => i.id === _startData.id)
+                  .jsonData.steps.find(i => i.type === "createClass").status ===
+                "1"
+              ) {
+                this.dataList.find(i => i.id === _startData.id).status = "2";
+                if (this.dataList.find(i => i.status == "0")) {
+                  let id = this.dataList.find(i => i.status == "0").id;
+                  this.startTask(id);
+                }
+              }
             });
+
             if (!this.nowDoTaskId.includes(_startData.id)) break;
           } else if (_step.type === "createClass") {
             //创建课堂
             _stepList[i].status = "2";
+            _stepList[i].startTime =
+              new Date().toLocaleDateString().replaceAll("/", "-") +
+              " " +
+              new Date().toLocaleTimeString();
+
             this.dataList.find(
               i => i.id === _startData.id
             ).jsonData.steps = _stepList;
-
+            this.$forceUpdate()
             //创建课堂   赋值好fileid   替换创建后课堂的基础数据  继续下一个任务
             let newOption = await this.createClassMixin(_startData.jsonData);
 
@@ -1277,6 +1366,16 @@ export default {
               let id = this.dataList.find(i => i.status == "0").id;
               this.startTask(id);
             }
+            break;
+          }
+
+          console.log(this.dataList.find(i => i.id === _startData.id));
+          if (this.dataList.find(i => i.id === _startData.id).status == "1") {
+            this.dataList.find(i => i.id === _startData.id).status = "0";
+            if (this.dataList.find(i => i.status == "0")) {
+              let id = this.dataList.find(i => i.status == "0").id;
+              this.startTask(id);
+            }
           }
         }
       }
@@ -1306,6 +1405,13 @@ export default {
         this.nowDoTaskId = this.nowDoTaskId.filter(i => i !== id);
       }
 
+      if (
+        stopTask.jsonData.steps.find(i => i.type == "createClass").status == 1
+      ) {
+        this.dataList.find(i => i.id === id).status = "2";
+        this.nowDoTaskId = this.nowDoTaskId.filter(i => i !== id);
+      }
+
       console.log(stopTask);
 
       let _waitTask = this.dataList.find(i => i.status === "0");
@@ -1337,7 +1443,7 @@ export default {
     test() {
       this.testMixin();
     },
-    exportDoc() {
+    async exportDoc() {
       let _exportList = this.dataList.filter(
         i =>
           this.selectList.includes(i.id) &&
@@ -1360,34 +1466,115 @@ export default {
         showClose: false
       });
 
-      _exportList.forEach((i, index) => {
-        i.jsonData.baseMessage.courseName =
-          i.jsonData.baseMessage.courseName + "_" + index;
-        promise.push(this.getDocFnPromise(i));
-      });
+      let _copyExportData = JSON.parse(JSON.stringify(_exportList));
 
-      Promise.all(promise)
-        .then(res => {
-          _notify.close();
-          console.log(res);
-          if (res.length == 1) {
-            saveAs(res[0], `${res[0].name}`);
-            this.$message.success("导出报告成功");
-          } else if (res.length > 1) {
-            const zip = new JSZip();
-            res.forEach(i => {
-              zip.file(`${i.name}`, i, { binary: true });
-            });
-            zip.generateAsync({ type: "blob" }).then(content => {
-              // 生成二进制流
-              saveAs(content, `课堂观察报告.zip`); // 利用file-saver保存文件  自定义文件名
-            });
-            this.$message.success("导出报告成功");
-          }
-        })
-        .catch(err => {
-          console.log("err", err);
+      let fileList = [];
+
+      for (let i = 0; i < _copyExportData.length; i++) {
+        // _copyExportData[i].jsonData.baseMessage.courseName =
+        // _copyExportData[i].jsonData.baseMessage.courseName + "_" + i;
+        fileList.push(await this.getDocFnPromise(_copyExportData[i]));
+      }
+
+      if (fileList.length == 1) {
+        saveAs(fileList[0], `${fileList[0].name}`);
+        this.$message.success("导出报告成功");
+      } else if (fileList.length > 1) {
+        const zip = new JSZip();
+
+        fileList.forEach((i, index) => {
+          let fileName = i.name;
+
+          if (
+            fileList
+              .map(i => i.name)
+              .filter((fi, findex) => findex !== index)
+              .includes(fileName)
+          )
+            fileName =
+              fileName.replace(/\.[^/.]+$/, "") +
+              `(${index}).` +
+              fileName.replace(/^.*\./, "");
+          // let fileName = i.name;
+          // let fileNames = fileList.map(file => file.name);
+          // let count = 1;
+          // while (fileNames.includes(fileName)) {
+          //   let nameWithoutExtension = fileName.replace(/\.[^/.]+$/, "");
+          //   let extension = fileName.replace(nameWithoutExtension, "");
+          //   fileName = `${nameWithoutExtension}(${count})${extension}`;
+          //   count++;
+          // }
+          zip.file(fileName, i, { binary: true });
+        });
+        zip.generateAsync({ type: "blob" }).then(content => {
+          // 生成二进制流
+          saveAs(content, `课堂观察报告.zip`); // 利用file-saver保存文件  自定义文件名
         });
+
+        this.$message.success("导出报告成功");
+      }
+      _notify.close();
+
+      // _exportList.forEach((i, index) => {
+      //   i.jsonData.baseMessage.courseName =
+      //     i.jsonData.baseMessage.courseName + "_" + index;
+      //   promise.push(this.getDocFnPromise(i));
+      // });
+
+      // Promise.all(promise)
+      //   .then(res => {
+      //     _notify.close();
+      //     console.log(res);
+      //     if (res.length == 1) {
+      //       saveAs(res[0], `${res[0].name}`);
+      //       this.$message.success("导出报告成功");
+      //     } else if (res.length > 1) {
+      //       const zip = new JSZip();
+      //       res.forEach(i => {
+      //         zip.file(`${i.name}`, i, { binary: true });
+      //       });
+      //       zip.generateAsync({ type: "blob" }).then(content => {
+      //         // 生成二进制流
+      //         saveAs(content, `课堂观察报告.zip`); // 利用file-saver保存文件  自定义文件名
+      //       });
+      //       this.$message.success("导出报告成功");
+      //     }
+      //   })
+      //   .catch(err => {
+      //     console.log("err", err);
+      //   });
+    },
+    async regenerateTheReport() {
+      let _generateList = this.dataList.filter(
+        i =>
+          this.selectList.includes(i.id) &&
+          (this.selectStatus === "99" ||
+            this.statusList
+              .find(i2 => i2.value === this.selectStatus)
+              .allow.includes(i.status)) &&
+          i.status == "2"
+      );
+
+      if (_generateList.length <= 0)
+        return this.$message.info("请先选择已经完成的任务列表");
+
+      this.$confirm("确认要重新生成课堂观察报告吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        _generateList.forEach(i => {
+          this.dataList.find(i2 => i2.id == i.id).status = "0";
+          this.dataList
+            .find(i2 => i2.id === i.id)
+            .jsonData.steps.find(i2 => i2.type == "generateReport").status =
+            "0";
+        });
+
+        if (!this.dataList.some(i => i.status == "1")) {
+          this.startTask(_generateList[0].id);
+        }
+      });
     }
   },
   mounted() {

+ 1 - 3
src/components/pages/classroomObservation/dialog/uploadFileToCreateClassDialog.vue

@@ -245,13 +245,11 @@ export default {
 
       input.addEventListener("change", async e => {
         let files = e.target.files;
-        console.log(files)
         for (let i = 0; i < files.length; i++) {
-
           if (
             ["video/mp4", "audio/wav", "audio/x-m4a", "text/plain","audio/mpeg"].includes(files[i].type)
           ) {
-            let _file = files[i];
+            let _file = new File([files[i]], files[i].name.replace(/\s+/g, ''), {type: files[i].type});
             if(_file.type==='audio/wav'){
               _file = new File([_file], _file.name.toLowerCase(), {type: _file.type});
             }

+ 5 - 1
src/components/pages/classroomObservation/index.vue

@@ -157,7 +157,10 @@
             />
           </el-tooltip>
         </div>
-
+        <div :class="['co-h2-r-btn2']"  v-if="gotype" @click.stop="$router.go(-1)">
+          <!-- <span class="co-h2-r-b-icon3"></span> -->
+          返回
+        </div>
         <!-- <div :class="['co-h2-r-btn2']" @click.stop="home">
 					<el-tooltip
 						class="item"
@@ -249,6 +252,7 @@ export default {
   },
   data() {
     return {
+      gotype:sessionStorage.getItem('gotype'),
       loading: false,
       createTime: new Date().toLocaleString().replaceAll("/", "-"),
       tid: "",

+ 67 - 18
src/components/pages/classroomObservation/newComponents/batchClassCard.vue

@@ -24,7 +24,7 @@
             <div>
               <span>{{ cardData.jsonData.baseMessage.courseName }}</span>
               <img
-                v-show="cardData.status!='2'"
+
                 src="../../../../assets/icon/classroomObservation/table_edit.svg"
                 @click="editBaseMessage"
               />
@@ -39,9 +39,50 @@
         <div class="bcc_r_t_right">
           <span class="status_wait" v-if="cardData.status == '3'">待开始</span>
           <span class="status_fail" v-if="cardData.status == '4'">失败</span>
-          <span class="status_success" v-if="cardData.status == '2'"
-            >已完成</span
-          >
+          <span class="status_success" v-if="cardData.status == '2'">
+            <span style="cursor: pointer;" @click="changeShowSteps(!showSteps)">已完成</span>
+            <div class="stepBox" v-show="showSteps">
+              <div
+                class="sb_item"
+                v-for="(item, index) in cardData.jsonData.steps"
+                :key="index"
+              >
+                <!-- 1完成 -->
+                <img
+                  src="../../../../assets/icon/classroomObservation/successStatus_icon.svg"
+                  v-if="item.status=='1'"
+                />
+
+
+                <!-- 0等待 -->
+                <img
+                  class="rotation"
+                  src="../../../../assets/icon/classroomObservation/waitStatus_icon.svg"
+                  v-if="item.status=='0'"
+                />
+
+
+                <!-- 2处理中 -->
+                <img
+                  class="rotation"
+                  src="../../../../assets/icon/classroomObservation/isDoStatus_icon.svg"
+                  v-if="item.status=='2'"
+                />
+                <div>{{ item.text }}</div>
+                <span>
+                  <span v-if="item.startTime">{{ item.startTime }}</span>
+                  <!-- <span
+                    v-if="
+                      item.status == '2' &&
+                        item.progress &&
+                        item.progress !== '0'
+                    "
+                    >{{ item.progress }}%</span> -->
+
+                  </span>
+              </div>
+            </div>
+          </span>
           <span class="status_doing" v-if="cardData.status == '1'">
             <span style="cursor: pointer;" @click="changeShowSteps(!showSteps)">处理中</span>
             <div class="stepBox" v-show="showSteps">
@@ -53,7 +94,7 @@
                 <!-- 1完成 -->
                 <img
                   src="../../../../assets/icon/classroomObservation/successStatus_icon.svg"
-                  v-if="item.status==='1'"
+                  v-if="item.status=='1'"
                 />
 
 
@@ -61,7 +102,7 @@
                 <img
                   class="rotation"
                   src="../../../../assets/icon/classroomObservation/waitStatus_icon.svg"
-                  v-if="item.status==='0'"
+                  v-if="item.status=='0'"
                 />
 
 
@@ -69,18 +110,20 @@
                 <img
                   class="rotation"
                   src="../../../../assets/icon/classroomObservation/isDoStatus_icon.svg"
-                  v-if="item.status==='2'"
+                  v-if="item.status=='2'"
                 />
                 <div>{{ item.text }}</div>
                 <span>
-                  <span
+                  <span v-if="item.startTime">{{ item.startTime }}</span>
+                  <!-- <span
                     v-if="
                       item.status == '2' &&
                         item.progress &&
                         item.progress !== '0'
                     "
                     >{{ item.progress }}%</span
-                  ></span
+                  > -->
+                  </span
                 >
               </div>
             </div>
@@ -111,12 +154,12 @@
             v-if="['2'].includes(cardData.status)"
             >查看报告</el-button
           >
-          <!-- <el-button
+          <el-button
             size="small"
             @click="regenerate"
-            v-if="['2', '3'].includes(cardData.status)"
-            >重新生成</el-button
-          > -->
+            v-if="['2'].includes(cardData.status)"
+            >重新生成报告</el-button
+          >
           <el-button
             size="small"
             type="primary"
@@ -160,7 +203,7 @@ export default {
   data() {
     return {
       checked: false,
-      showSteps:true,
+      showSteps:false,
       cardData: {
         id: "1",
         name: "文件名称文件名称文件名称",
@@ -245,6 +288,11 @@ export default {
         if (newValue) {
           this.cardData = JSON.parse(JSON.stringify(newValue));
           this.$forceUpdate();
+          if(newValue.status === "1"){
+            this.showSteps = true;
+          }else{
+            this.showSteps = false;
+          }
         }
       }
     }
@@ -275,7 +323,8 @@ export default {
     },
     //重新生成
     regenerate() {
-      this.$message.info("重新生成");
+      // this.$message.info("重新生成");
+      this.$emit("taskBtn", { type: "regenerateTheReport", id: this.cardData.id });
     },
     changeRemarks(newValue) {
       if (this.data.remarks != newValue) {
@@ -382,7 +431,7 @@ export default {
 }
 
 .stepBox {
-  width: 200px;
+  width: 315px;
   height: auto;
   background-color: #fff;
   position: absolute;
@@ -411,7 +460,7 @@ export default {
 }
 
 .sb_item > div {
-  max-width: calc(100% - 20px - 35px - 15px);
+  max-width: calc(100% - 20px - 140px - 15px);
   width: calc(100% - 20px - 35px - 15px);
   height: 100%;
   margin: 0 5px 0 10px;
@@ -426,7 +475,7 @@ export default {
   display: flex;
   align-items: center;
   justify-content: center;
-  width: 35px;
+  width: 150px;
   height: 100%;
   color: rgba(54, 129, 252, 1);
 }

+ 738 - 0
src/components/pages/classroomObservation/test.vue

@@ -0,0 +1,738 @@
+<template>
+  <div>
+   <div class="left">
+    <el-button type="primary" @click="start">开始</el-button>
+   </div>
+   <div class="right">
+
+   </div>
+  </div>
+</template>
+
+<script>
+import markdownIt from "markdown-it";
+
+import QRCode from "qrcodejs2";
+import * as echarts from "echarts";
+import "echarts-wordcloud";
+// word
+import htmlDocx from "html-docx-js/dist/html-docx";
+import JSZip from "jszip";
+export default {
+  data() {
+    return {
+      tidList: [
+        "1f01ab3b-2249-453d-9b97-980fed675f94",
+        "3f854673-e3a3-4165-994d-d9bac0ea41cd",
+        "02a78b78-322a-4f43-9671-6ac533efd110",
+        "c2903392-1066-4512-8e8d-3256db2d2518",
+        "a4300c9c-4fc5-4f72-b337-f285fa9d033f",
+        "bb8d66ab-9876-4d17-b0e4-a095ecea58d1",
+        "2655a7b9-4add-472f-a62b-3c72bccc7a07",
+        "659af006-7415-4c73-aba6-2946d8b9ac6c",
+        "90926fc7-1c39-46e6-aa3e-34eeada89fa6",
+        "734bbdd4-a6eb-4e0e-acdb-bd5127cc8260",
+        "af8c74e5-cde8-4a33-ab3e-db077c37cec4",
+        "f665bb6f-54e5-4041-9b9b-489ea5814c7a",
+        "95453e35-9182-4e0c-a045-6757a84b7933",
+        "08958289-8d62-4468-b050-2e84a68edb26",
+        "2420d2d4-0627-43cc-9a8e-758ed074169c",
+        "4334e60d-f705-42bd-a89c-2bfc69b7615b",
+        "62e76f44-1f25-4a13-a699-93c4e58dc5ce",
+        "83891871-9eed-4aae-a318-9a1a1b52c047",
+        "7e32c688-051d-40b6-b2bd-a076fcf83ff5",
+      ],
+      message:[],
+      doTid: "",
+      dataList: [],
+      bmData: [],
+      dialogTagList: [
+        { value: 0, name: "通用课堂分析", loading: false },
+        { value: 1, name: "学科课堂分析", loading: false },
+        { value: 2, name: "扩展分析", loading: false }
+      ],
+      imageList: [],
+      tag: {
+        0: "一",
+        1: "二",
+        2: "三",
+        3: "四",
+        4: "五",
+        5: "六",
+        6: "七",
+        7: "八",
+        8: "九",
+        9: "十",
+        10: "十一",
+        11: "十二",
+        12: "十三",
+        13: "十四",
+        14: "十五",
+        15: "十六",
+        16: "十七",
+        17: "十八",
+        18: "十九",
+        19: "二十"
+      }
+    };
+  },
+  methods: {
+    start() {
+      this.getData();
+    },
+    init() {
+      this.doTid = "";
+      this.dataList = [];
+      this.bmData = {};
+      this.dialogTagList = [
+        { value: 0, name: "通用课堂分析", loading: false },
+        { value: 1, name: "学科课堂分析", loading: false },
+        { value: 2, name: "扩展分析", loading: false }
+      ];
+      this.imageList = [];
+    },
+    getAnalysisData(type) {
+      if (!this.doTid) return;
+      return new Promise(resolve => {
+        let params = {
+          tid: this.doTid,
+          type: type
+        };
+
+        if (type == 0) {
+          this.bmData = {
+            id: "",
+            tId: this.doTid,
+            tIndex: 0,
+            jsonData: {
+              activity_methods: "",
+              activity_structure: "",
+              classroom_resources: "",
+              courseName: "",
+              name: "",
+              studentNum: 0,
+              subject: "",
+              textbook: ""
+            }
+          };
+          this.imageList = [];
+          this.dataList = [];
+          this.dialogTagList = [
+            { value: 0, name: "通用课堂分析", loading: true },
+            { value: 1, name: "学科课堂分析", loading: true },
+            { value: 2, name: "扩展分析", loading: true }
+          ];
+        }
+
+        this.ajax
+          .post(
+            "https://gpt4.cocorobo.cn/get_classroom_observation_new",
+            params
+          )
+          .then(res => {
+            let _data = res.data.FunctionResponse.result.length
+              ? JSON.parse(res.data.FunctionResponse.result)
+              : [];
+
+            if (type == 0) {
+              //第一个分析
+              let _bmData = _data.find(i => i.tIndex == 0);
+              let _dialogTagList = [];
+              // 基础信息
+              _bmData.jsonData = JSON.parse(_bmData.jsonData);
+              _dialogTagList = _bmData.jsonData.dialogTagList || [
+                { value: 0, name: "通用课堂分析", loading: false },
+                { value: 1, name: "学科课堂分析", loading: false },
+                { value: 2, name: "扩展分析", loading: false }
+              ];
+              // 图片
+              let _imageList = _data.find(i => i.tIndex == 1);
+              _imageList.jsonData = JSON.parse(_imageList.jsonData);
+
+              if (!_imageList.jsonData.videoList) {
+                _imageList.jsonData.videoList = [];
+              }
+              if (!_imageList.jsonData.NephogramList) {
+                _imageList.jsonData.NephogramList = [];
+              }
+              //通用分析
+              let currency = [];
+              for (let i = 2; i < _data.length; i++) {
+                let _currency = _data[i];
+                _currency.jsonData = JSON.parse(_currency.jsonData);
+                currency.push(_currency);
+              }
+
+              //判断是否有保留装了文稿数据
+              this.dataList.push(...currency);
+              this.bmData = _bmData;
+              this.dialogTagList = _dialogTagList;
+              this.imageList = _imageList;
+              resolve();
+            } else {
+              let _analysisData = [];
+              for (let i = 0; i < _data.length; i++) {
+                let _analysis = _data[i];
+                _analysis.jsonData = JSON.parse(_analysis.jsonData);
+                _analysisData.push(_analysis);
+              }
+              this.dataList.push(..._analysisData);
+              resolve();
+            }
+          })
+          .catch(e => {
+            console.log(type, "获取分析失败", e);
+            resolve();
+          });
+      });
+    },
+    async getData() {
+      let fileData = [];
+
+      for (let i = 0; i < this.tidList.length; i++) {
+        this.doTid = this.tidList[i];
+        let dataList2 = [];
+        let bmData2 = {};
+        let dialogTagList2 = [
+          { value: 0, name: "通用课堂分析", loading: false },
+          { value: 1, name: "学科课堂分析", loading: false },
+          { value: 2, name: "扩展分析", loading: false }
+        ];
+        let imageList2 = [];
+        await this.getAnalysisData(0);
+        let promise = [];
+        this.dialogTagList.forEach(i2 => {
+          if (i2.value == 0) return;
+          promise.push(this.getAnalysisData(i2.value));
+        });
+
+        await Promise.all(promise);
+
+        this.dataList.sort((a, b) => a.tIndex - b.tIndex);
+        this.dataList.sort((a, b) => a.Type - b.Type);
+
+        dataList2 = JSON.parse(JSON.stringify(this.dataList));
+        bmData2 = JSON.parse(JSON.stringify(this.bmData));
+        dialogTagList2 = JSON.parse(JSON.stringify(this.dialogTagList));
+        imageList2 = JSON.parse(JSON.stringify(this.imageList));
+
+        // return
+        let file = await this.getDocFnPromise({
+          bmData: bmData2.jsonData,
+          dataList: dataList2,
+          tagList: dialogTagList2,
+          tid: this.doTid
+        });
+        fileData.push(file);
+        // console.log("👉file",file,this.doTid)
+        console.log("=========================")
+        console.log(`进度:${(i+1)}/${this.tidList.length}`)
+        console.log("课程id:",this.doTid)
+        console.log("文件名:",file.name)
+        console.log("文件:",file)
+        console.log("=========================")
+        this.init();
+      }
+
+      console.log("👉文件列表", fileData);
+
+      if (fileData.length == 1) {
+        saveAs(fileData[0], `${fileData[0].name}`);
+        this.$message.success("导出报告成功");
+      } else if (fileData.length > 1) {
+        const zip = new JSZip();
+        fileData.forEach((i, index) => {
+          let fileName = i.name;
+          if (fileData.map(i => i.name).filter((fi,findex)=>findex!==index).includes(fileName))
+            fileName =
+              fileName.replace(/\.[^/.]+$/, "") +
+              `(${index}).` +
+              fileName.replace(/^.*\./, "");
+          zip.file(fileName, i, { binary: true });
+        });
+        zip.generateAsync({ type: "blob" }).then(content => {
+          // 生成二进制流
+          saveAs(content, `课堂观察报告.zip`); // 利用file-saver保存文件  自定义文件名
+        });
+
+        this.$message.success("导出报告成功");
+      }
+    },
+    getQrCodeImageSrc(url) {
+      return new Promise((resolve, reject) => {
+        let qrcode = new QRCode(document.createElement("div"), {
+          text: url, // 需要转换为二维码的内容
+          width: 150,
+          height: 150,
+          colorDark: "#000000",
+          colorLight: "#ffffff",
+          correctLevel: QRCode.CorrectLevel.H
+        });
+        let img = qrcode._el.getElementsByTagName("img")[0];
+        img.onload = () => {
+          resolve(img.src);
+        };
+      });
+    },
+    getEChartsImageSrc(option) {
+      return new Promise(resolve => {
+        try {
+          let hiddenDiv = document.createElement("div");
+          hiddenDiv.style.width = "400px";
+          hiddenDiv.style.height = "400px";
+          hiddenDiv.style.position = "absolute";
+          hiddenDiv.style.left = "-9999px"; // 隐藏div
+          document.body.appendChild(hiddenDiv);
+
+          // 初始化图表
+          let myChart = echarts.init(hiddenDiv);
+
+
+          let time;
+          myChart
+            .on("rendered", async () => {
+              // console.log("生成echarts成功")
+              // 获取图表的图片
+
+              clearTimeout(time);
+              time = setTimeout(() => {
+                let base64Image = myChart.getDataURL({
+                  type: "png", // 图片格式
+                  pixelRatio: 0.9, // 图像清晰度
+                  backgroundColor: "#fff" // 背景颜色
+                });
+
+                resolve(base64Image);
+                // 清除隐藏的div和图表实例
+                document.body.removeChild(hiddenDiv);
+                myChart.dispose();
+              }, 200);
+            })
+            .on("error", error => {
+              console.log("生成echarts失败", error);
+              resolve("#");
+            });
+
+          // 设置图标配置
+          myChart.setOption(option);
+          // console.log("词云图???",option)
+        } catch (error) {
+          console.log(error, "error");
+          resolve("#");
+        }
+      });
+    },
+    getImageSrcToBase64(src) {
+      return new Promise((resolve, reject) => {
+        const image = new Image();
+        image.src = src;
+        image.onload = () => {
+          const canvas = document.createElement("canvas");
+          canvas.width = image.naturalWidth;
+          canvas.height = image.naturalHeight;
+          canvas.style.width = `${canvas.width / window.devicePixelRatio}px`;
+          canvas.style.height = `${canvas.height / window.devicePixelRatio}px`;
+
+          const context = canvas.getContext("2d");
+          context.drawImage(image, 0, 0);
+          const base64 = canvas.toDataURL("image/png");
+          resolve(base64);
+        };
+      });
+    },
+    getEChartsSpectrogramImage(data) {
+      return new Promise(resolve => {
+        try {
+          let canvas = document.createElement("canvas");
+          let ctx = canvas.getContext("2d");
+          canvas.width = 600 * window.devicePixelRatio;
+          canvas.height = 200 * window.devicePixelRatio;
+          // 缩放绘图上下文
+          ctx.scale(1, 1);
+
+          let canvasWidth = canvas.width;
+          let canvasWidth2 = canvasWidth - 20;
+          let canvasHeight = canvas.height;
+          ctx.imageSmoothingEnabled = false;
+          ctx.lineWidth = 1;
+
+          // 设置颜色和文字
+          const teacherColor = "#5470C6"; // 老师的颜色
+          const studentColor = "#91CC75"; // 学生的颜色
+          const fontSize = 14; //字体大小
+
+          ctx.fillStyle = teacherColor;
+          this.drawRoundedRect(ctx, 0, canvasHeight - 20, 20, 15, 4);
+          // ctx.fillRect(0, canvasHeight - 20, 25, 20);
+          ctx.fillStyle = "black";
+          ctx.font = `${fontSize}px serif`;
+          ctx.fillText("老师", 28, canvasHeight - 7);
+
+          ctx.fillStyle = studentColor;
+          // ctx.fillRect(100, canvasHeight - 20, 25, 20);
+          this.drawRoundedRect(ctx, 100, canvasHeight - 20, 20, 15, 4);
+          ctx.fillStyle = "black";
+          ctx.font = `${fontSize}px serif`;
+          ctx.fillText("学生", 128, canvasHeight - 7);
+          let sum = data.data.reduce((pre, cur) => (pre += cur.value), 0);
+          // 当前x位置的起始点
+          let currentX = 10;
+          // 计算并绘制每个区域
+          data.data.forEach(i => {
+            const segmentWidth = parseFloat(
+              (i.value / (sum / canvasWidth2)).toFixed(2)
+            );
+            ctx.fillStyle = i.type == 0 ? teacherColor : studentColor;
+            ctx.fillRect(currentX, 20, segmentWidth, canvasHeight - 100);
+
+            // 更新x位置
+            currentX += segmentWidth;
+          });
+
+          // 绘制红色垂直线(指定位置)
+          // ctx.strokeStyle = "red";
+          // ctx.lineWidth = 2;
+
+          // data.breakpoint.forEach(i => {
+          //   const breakpointPo = parseFloat(
+          //     (i / (sum / canvasWidth2)).toFixed(2)
+          //   );
+          //   ctx.beginPath();
+          //   ctx.moveTo(breakpointPo, 10);
+          //   ctx.lineTo(breakpointPo, canvasHeight - 70);
+          //   ctx.stroke();
+          // });
+
+          let interval = parseFloat((300 / (sum / canvasWidth2)).toFixed(2));
+          //绘制竖线
+          let _lastI = 0;
+          //绘制竖线
+          for (let i = 0; i < canvasWidth2; i += interval) {
+            ctx.beginPath();
+            ctx.strokeStyle = "#BFBFBF";
+            ctx.moveTo(i == 0 ? 10 : i, canvasHeight - 70);
+            ctx.lineTo(i == 0 ? 10 : i, canvasHeight - 55);
+            ctx.stroke();
+            ctx.fillStyle = "#868686";
+            let timeLabel = (((i / canvasWidth2) * sum) / 60).toFixed(0); // 时间标识计算
+            ctx.font = `${fontSize}px serif`;
+            if (i == 0) {
+              ctx.fillText(`${timeLabel}min`, i + 10, canvasHeight - 40);
+            } else if (i + interval >= canvasWidth2) {
+              ctx.fillText(`${timeLabel}min`, i - 20, canvasHeight - 40);
+            } else {
+              ctx.fillText(`${timeLabel}min`, i - 15, canvasHeight - 40);
+            }
+            _lastI = i;
+          }
+          if (canvasWidth2 - _lastI > 60) {
+            ctx.beginPath();
+            ctx.strokeStyle = "#BFBFBF";
+            ctx.moveTo(canvasWidth2 + 10, canvasHeight - 70);
+            ctx.lineTo(canvasWidth2 + 10, canvasHeight - 55);
+            ctx.stroke();
+            ctx.fillStyle = "#868686";
+            let timeLabel = (sum / 60).toFixed(0); // 时间标识计算
+            ctx.font = `${fontSize}px serif`;
+            ctx.fillText(
+              `${timeLabel}min`,
+              canvasWidth2 - 20,
+              canvasHeight - 40
+            );
+          }
+
+          ctx.beginPath();
+          ctx.strokeStyle = "#BFBFBF";
+          ctx.moveTo(10, canvasHeight - 55);
+          ctx.lineTo(canvasWidth2 + 10, canvasHeight - 55);
+          ctx.stroke();
+
+          // 将 canvas 转换为 base64 格式的图片地址
+          const base64Image = canvas.toDataURL("image/png");
+          resolve(base64Image);
+        } catch (e) {
+          console.log(e);
+          resolve("#");
+        }
+      });
+    },
+    getEChartsechartsRTCHImage(data) {
+      return new Promise(resolve => {
+        try {
+          let canvas = document.createElement("canvas");
+          let ctx = canvas.getContext("2d");
+          canvas.width = 300 * window.devicePixelRatio;
+          canvas.height = 350 * window.devicePixelRatio;
+          // 缩放绘图上下文
+          ctx.scale(1, 1);
+
+          let canvasWidth = canvas.width;
+          let canvasHeight = canvas.height;
+          let fontColor = "#1a7ad3";
+          ctx.imageSmoothingEnabled = false;
+          ctx.lineWidth = 1;
+          const img = new Image();
+          img.src = require("../../../assets/icon/classroomObservation/rt-ch_echarts2.svg"); //ch_echarts2
+          img.onload = () => {
+            ctx.drawImage(img, 0, 0, canvasWidth, canvasWidth);
+            ctx.beginPath();
+            let _showWidth = canvasWidth - (canvasWidth / 8.8) * 2;
+            ctx.fillStyle = fontColor;
+            ctx.arc(
+              canvasWidth / 8.8 + _showWidth * parseFloat(data.RT),
+              canvasWidth / 8.8 + _showWidth - _showWidth * parseFloat(data.CH),
+              4,
+              0,
+              2 * Math.PI
+            );
+            ctx.lineWidth = 0.5; // 设置边框大小
+            // ctx.arc((canvasWidth*parseFloat(this.data.RT))+(canvasWidth/8.8),(canvasWidth-(canvasWidth*parseFloat(this.data.CH))+(canvasWidth/8.8)), 4, 0, 2 * Math.PI);
+            ctx.fill();
+            ctx.stroke();
+            ctx.fillStyle = fontColor;
+            ctx.font = "italic bold 24px Arial";
+            const text = `RT=${data.RT}    CH=${data.CH}`;
+            const textWidth = ctx.measureText(text).width;
+            ctx.fillText(
+              text,
+              (canvasWidth - textWidth) / 2,
+              canvasHeight - canvasWidth / 12
+            );
+            const base64Image = canvas.toDataURL("image/png");
+            resolve(base64Image);
+          };
+        } catch (e) {
+          console.log(e);
+          resolve("#");
+        }
+      });
+    },
+    drawRoundedRect(ctx, x, y, width, height, radius) {
+      // 限制 radius 的最大值,防止它超过矩形的宽度或高度的一半
+      const actualRadius = Math.min(radius, width / 2, height / 2);
+
+      ctx.beginPath();
+      ctx.moveTo(x + actualRadius, y); // 起点,矩形顶部的左侧
+
+      // 右上角的弧线
+      ctx.arcTo(x + width, y, x + width, y + height, actualRadius);
+
+      // 右下角的弧线
+      ctx.arcTo(x + width, y + height, x, y + height, actualRadius);
+
+      // 左下角的弧线
+      ctx.arcTo(x, y + height, x, y, actualRadius);
+
+      // 左上角的弧线
+      ctx.arcTo(x, y, x + width, y, actualRadius);
+
+      ctx.closePath();
+      ctx.fill(); // 填充颜色
+    },
+    async getDocFnPromise({ bmData, dataList, tagList, tid }) {
+      return new Promise(async resolve => {
+        try {
+          const md = new markdownIt();
+          let showBrief = true;
+          tagList.forEach(i => (i.dataList = []));
+          let url = `https://beta.cloud.cocorobo.cn/aigpt/#/classroom_observation_board?tid=${tid}`;
+          const qRCodeSrc = await this.getQrCodeImageSrc(url);
+
+          // dataList.sort((a, b) => a.tIndex - b.tIndex);
+
+          dataList.sort((a, b) => a.tIndex - b.tIndex);
+          dataList.sort((a, b) => a.Type - b.Type);
+          dataList.forEach(i1 => {
+            tagList.forEach(i2 => {
+              if (i2.value == i1.Type) {
+                i2.dataList.push(i1);
+              }
+            });
+          });
+
+          let directoryHtml = `<div style="margin-bottom:1in"><div style="text-align:center;font-size:20pt;margin-bottom:0.5in">目录</div>`;
+
+          let analysisHtml = ``;
+
+          for (let c = 0; c < tagList.length; c++) {
+            let i = tagList[c];
+            let dire = `<div>`;
+            let tagHtml = `<div style="margin-bottom:0.5in">`;
+            if (i.value == 0) {
+              i.dataList = i.dataList.filter(i2 => i2.tIndex != 2);
+            }
+            i.dataList.sort((a, b) => a.tIndex - b.tIndex);
+            tagHtml += `<h1 style="font-size:16pt;margin-bottom:-1in">${
+              this.tag[i.value]
+            }、${i.name}</h1>`;
+            dire += `<p style="font-size:14pt;margin-bottom:-0.8in">${
+              this.tag[i.value]
+            }、${i.name}</p>`;
+
+            for (let d = 0; d < i.dataList.length; d++) {
+              let i2 = i.dataList[d];
+              let i2Index = d;
+              tagHtml += `<h2 style="font-size:14pt;margin-bottom:-1in">${i2Index +
+                1}、${
+                i2.jsonData.anotherName
+                  ? i2.jsonData.anotherName
+                  : i2.jsonData.name
+              }</h2>`;
+              dire += `<p style="font-size:11pt;margin-bottom:-0.8in;margin-left:0.1in">${i2Index +
+                1}、${
+                i2.jsonData.anotherName
+                  ? i2.jsonData.anotherName
+                  : i2.jsonData.name
+              }</p>`;
+              if (showBrief && i2.jsonData.result) {
+                tagHtml += `<p style="font-size:10.5pt;font-style:italic;margin-bottom:-0.7in;color:#6b798e">${i2.jsonData.result}</p>`;
+              }
+              if (i2.jsonData.eChartData) {
+                tagHtml += `<div style="width:100vw;padding:70%;box-sizing: border-box;text-align:center"><img style="margin:auto" src="${await this.getEChartsImageSrc(
+                  i2.jsonData.eChartData
+                )}"/></div>`;
+              }
+
+              if (i2.jsonData.spectrogramData) {
+                tagHtml += `<div style="width:100vw;padding:70%;box-sizing: border-box;text-align:center"><img style="margin:auto" src="${await this.getEChartsSpectrogramImage(
+                  i2.jsonData.spectrogramData
+                )}"/></div>`;
+              }
+
+              if (i2.jsonData.CH && i2.jsonData.RT) {
+                tagHtml += `<div style="width:100vw;text-align:center;padding:70%;box-sizing: border-box;"><img style="margin:auto" src="${await this.getEChartsechartsRTCHImage(
+                  {
+                    RT: i2.jsonData.RT,
+                    CH: i2.jsonData.CH
+                  }
+                )}"/></div>`;
+              }
+              let _content = md
+                .render(i2.jsonData.content ? i2.jsonData.content : "")
+                .replace(/<p>/g, "")
+                .replace(/<\/p>/g, "")
+                .replace(/<strong>/g, '<span style="font-weight: bold;">')
+                .replace(/<\/strong>/g, "</span>");
+              tagHtml += `<p style="font-size:10.5pt;margin-bottom:-0.5in">${_content}</p>`;
+            }
+            tagHtml += "</div>";
+            dire += "</div>";
+            analysisHtml += tagHtml;
+            directoryHtml += dire;
+          }
+
+          directoryHtml += "</div>";
+          let _html = `
+				<div>
+					<p style="width:100vw;margin-bottom:1.5in">*分析结果仅供参考</p>
+					<p style="font-size:28pt;width:100vw;text-align:center;">课堂观察报告</p>
+					<p style="font-size:10pt;width:100vw;text-align:center;margin-bottom:0.6in">报告生成时间:${new Date().toLocaleString()}</p>
+					<div style="font-size:16pt;width:100vw;text-align:center;margin-bottom:1in">
+						<p style="font-size:20pt;margin-bottom:0.7in">《${bmData.courseName}》</p>
+						<p style="margin-bottom:-1in">授课老师:${
+              bmData.teacherName ? bmData.teacherName : "未填写"
+            }</p>
+						<p style="margin-bottom:-1in">授课年级:${
+              bmData.grade ? bmData.grade : "未填写"
+            }</p>
+						<p style="margin-bottom:-1in">授课科目:${
+              bmData.subject ? bmData.subject : "未填写"
+            }</p>
+						<p style="margin-bottom:-1in">授课时间:${
+              bmData.time ? bmData.time : "未填写"
+            }</p>
+					</div>
+					<div style="font-size:16pt;width:100vw;text-align:center;margin-bottom:0.5in">
+						<img src="${qRCodeSrc}" style="width:150px;height:150px;margin:auto;"/>
+						<p>扫码查看网页版</p>
+					</div>
+				</div>
+				${directoryHtml}
+
+				<div>
+					${analysisHtml}
+				</div>
+				`;
+
+          const content = `<!DOCTYPE html>
+				<html xmlns:v='urn:schemas-microsoft-com
+				:vml'xmlns:o='urn:schemas-microsoft-com:office
+				:office'xmlns:w='urn:schemas-microsoft-com:office
+				:word'xmlns:m='http://schemas.microsoft.com/office/2004/12/omml'
+				xmlns='http://www.w3.org/TR/REC-html40'
+				xmlns='http://www.w3.org/1999/xhtml'>
+				<head>
+						<meta charset="UTF-8">
+						<meta http-equiv="X-UA-Compatible" content="IE=edge">
+						<meta name="viewport" content="width=device-width, initial-scale=1.0">
+						<title>《${bmData.courseName}》课堂观察报告</title>
+						<style>
+							*{
+								font-family: '宋体';
+								margin:0;
+								padding:0;
+								line-height:1;
+							}
+							table {
+								border-collapse: collapse; /* 折叠边框 */
+								width: 100%;
+								font-size:10.5pt;
+							}
+							th, td {
+								border: 1px solid black; /* 线条样式 */
+								padding: 8px;
+								text-align: left;
+								font-size:10.5pt;
+							}
+							ol,ul{
+								margin:0;
+								padding:0;
+								margin-right:-1in;
+							}
+							li{
+								position: relative;
+								padding-left: 1.5em; /* 控制项目符号与文本的距离 */
+								margin-bottom: 0.5em;
+								text-indent: -1.5em; /* 负缩进使文本与符号对齐 */
+								mso-special-format: bullet;
+								margin-left: 0;
+								padding-left: 10pt;
+								text-indent: -10pt;
+								mso-style-name: "Normal";
+								mso-style-priority: 99;
+								mso-style-unhide: no;
+								mso-style-qformat: yes;
+								mso-style-parent: "";
+							}
+							p{
+								margin:0;
+								padding:0
+							}
+						</style>
+				</head>
+				<body>
+				${_html}
+				</body>
+				</html>`;
+          // debugger
+          let blob = htmlDocx.asBlob(content);
+          const file = new File(
+            [blob],
+            `${bmData.courseName}课堂观察报告.docx`,
+            {
+              type: ".docx",
+              lastModified: new Date().getTime()
+            }
+          );
+          resolve(file);
+        } catch (error) {
+          console.log("👉", error);
+          resolve(error);
+        }
+      });
+    }
+  }
+};
+</script>
+
+<style scoped></style>

+ 59 - 23
src/components/pages/classroomObservation/tools/mixin.js

@@ -384,9 +384,11 @@ ${arr.map(row => `<tr>
               if (resultData.CH) analysisData.CH = resultData.CH;
               return resolve({ data: analysisData })
             } else if (assistantData.id == "bfe844b1-7a45-11ef-9b30-005056b86db5") {//课堂活动光谱图
+
               let resultData = await this.getSpectrogram(_result, fileId, content, assistantData)
+              console.log("管谱图数据",resultData)
               if (resultData.message) analysisData.content = resultData.message;
-              if (resultData.eCharts) analysisData.getSpectrogram = resultData.eCharts;
+              if (resultData.eCharts) analysisData.spectrogramData = resultData.eCharts;
               return resolve({ data: analysisData })
             }
           } catch (error) {
@@ -969,10 +971,9 @@ CH:${_CH}
     getSpectrogram(_dataList, fileId, content, assistant) {
       return new Promise(async (resolve) => {
         try {
-          this.getContentTableMixin(content).then(async res => {
-            if (res.length <= 0) {
-              resolve({ data: 1, err: "无表格数据" })
-            }
+          let _msg = assistant.tips;
+          let message = await this.getAiContentMixin({ _msg: _msg, fileId: fileId })
+          this.getContentTableMixin(message.data).then(async res => {
             let _tableData = res;
             let _delIndex = _tableData.findIndex(i => i.includes("时间点"))
             _tableData = _tableData.slice(_delIndex + 1)
@@ -984,6 +985,7 @@ CH:${_CH}
             let upTime = '00:00:00';
 
             _dataList.forEach((item, index) => {
+              if(!item.role)return;
               if (index == 0) {
                 //第一个
                 identity = item.role;
@@ -1022,7 +1024,7 @@ CH:${_CH}
 
             let breakpoint = [];
 
-            breakpoint = _tableData.map(i => this.convertToSeconds(i[0]))
+            // breakpoint = _tableData.map(i => this.convertToSeconds(i[0]))
 
             _result = _result.filter(
               i =>
@@ -1038,9 +1040,7 @@ CH:${_CH}
             _data.data = _result.map(i => ({ role: i.identity, type: i.identity == "老师" ? 0 : 1, value: i.sumTime }));
             _data.breakpoint = breakpoint;
 
-            let _msg = assistant.tips;
 
-            let message = await this.getAiContentMixin({ _msg: _msg, fileId: fileId })
 
             if (message.data == 1) {
               return resolve({ eCharts: _data, message: "" })
@@ -1052,6 +1052,7 @@ CH:${_CH}
 
           });
         } catch (e) {
+          console.log("光谱生成失败",e)
           return resolve({ data: 1, err: e })
         }
       })
@@ -1213,12 +1214,25 @@ CH:${_CH}
         let _startTime = 0;
         let _endTime = 0;
 
+        let timer = null;
+
+        timer = setTimeout(()=>{//五分钟无响应就算报错
+          resolve({ data: 1,transcriptionContent:null,editorBarData:null,err: "转录超时" })
+        },180000)
+
         // 转录中
         iframeRef.contentWindow.onRecognizedResult = (e) => {
           let privText = e.privText;
           let privSpeakerId = e.privSpeakerId;
           let privDuration = e.privDuration;
           let privOffset = e.privOffset;
+
+          if(timer){
+            clearTimeout(timer)
+            timer = setTimeout(()=>{//五分钟无响应就算报错
+              resolve({ data: 1,transcriptionContent:null,editorBarData:null,err: "转录超时" })
+            },180000)
+          }
           if (!privText || !privSpeakerId || privSpeakerId == "Unknown") {//不记录
             return;
           }
@@ -1240,6 +1254,9 @@ CH:${_CH}
 
         //转录结束
         iframeRef.contentWindow.onSessionStopped = async (e) => {
+          if(timer){
+            clearTimeout(timer)
+          }
           tableContent = `<table
 	border="0"
 	width="100%"
@@ -1469,7 +1486,7 @@ CH:${_CH}
 
         console.log("说话人身份编码开始")
         // 说话人身份编码
-        while (tableList.some(i => i.role == '')) {
+        while (tableList.some(i => i.role == '' &&  i.value != "" && i.index !=="")) {
           let _ajaxList = tableList.filter(i => i.role == '').slice(0, 10);
           console.log(`说话人身份编码:`, _ajaxList)
           const params = {
@@ -1573,6 +1590,7 @@ CH:${_CH}
         console.log("说话人行为编码完成")
 
         tableList.forEach((item, index) => {
+          if(item.value=="")return;
           tableContent += `<tr>
           <td>${index + 1}</td>
           <td>${item.startTime}</td>
@@ -1675,7 +1693,7 @@ CH:${_CH}
       return new Promise(resolve => {
         try {
           let hiddenDiv = document.createElement("div");
-        hiddenDiv.style.width = "400px";
+        hiddenDiv.style.width = "600px";
         hiddenDiv.style.height = "400px";
         hiddenDiv.style.position = "absolute";
         hiddenDiv.style.left = "-9999px"; // 隐藏div
@@ -1684,22 +1702,37 @@ CH:${_CH}
         // 初始化图表
         let myChart = echarts.init(hiddenDiv);
 
+       console.log(option)
+       option.animation = false;
+
+       let time;
+        myChart.on("rendered", async () => {
+          // console.log("生成echarts成功")
+          // 获取图表的图片
+
+          clearTimeout(time)
+          time = setTimeout(()=>{
+            let base64Image = myChart.getDataURL({
+              type: "png", // 图片格式
+              pixelRatio: 0.9, // 图像清晰度
+              backgroundColor: "#fff" // 背景颜色
+            });
+
+            resolve(base64Image);
+            // 清除隐藏的div和图表实例
+            document.body.removeChild(hiddenDiv);
+            myChart.dispose();
+          },200)
+
+        }).on("error", (error) => {
+          console.log("生成echarts失败",error)
+          resolve("#")
+        });
+
         // 设置图标配置
         myChart.setOption(option);
           // console.log("词云图???",option)
-        myChart.on("finished", () => {
-          // 获取图表的图片
-          let base64Image = myChart.getDataURL({
-            type: "png", // 图片格式
-            pixelRatio: 0.9, // 图像清晰度
-            backgroundColor: "#fff" // 背景颜色
-          });
 
-          resolve(base64Image);
-          // 清除隐藏的div和图表实例
-          document.body.removeChild(hiddenDiv);
-          myChart.dispose();
-        });
         } catch (error) {
           console.log(error,"error")
           resolve("#")
@@ -1969,12 +2002,14 @@ CH:${_CH}
               tagHtml += `<p style="font-size:10.5pt;font-style:italic;margin-bottom:-0.7in;color:#6b798e">${i2.jsonData.result}</p>`;
             }
             if (i2.jsonData.eChartData) {
+              // console.log("处理i2.jsonData.eChartData",i2.jsonData)
               tagHtml += `<div style="width:100vw;padding:70%;box-sizing: border-box;text-align:center"><img style="margin:auto" src="${await this.getEChartsImageSrc(
                 i2.jsonData.eChartData
               )}"/></div>`;
             }
 
             if (i2.jsonData.spectrogramData) {
+              // console.log("处理i2.jsonData.spectrogramData",i2.jsonData)
               tagHtml += `<div style="width:100vw;padding:70%;box-sizing: border-box;text-align:center"><img style="margin:auto" src="${await this.getEChartsSpectrogramImage(
                 i2.jsonData.spectrogramData
               )}"/></div>`;
@@ -1982,6 +2017,7 @@ CH:${_CH}
             }
 
             if (i2.jsonData.CH && i2.jsonData.RT) {
+              // console.log("处理i2.jsonData.CHRT",i2.jsonData)
               tagHtml += `<div style="width:100vw;text-align:center;padding:70%;box-sizing: border-box;"><img style="margin:auto" src="${await this.getEChartsechartsRTCHImage(
                 {
                   RT: i2.jsonData.RT,
@@ -2224,4 +2260,4 @@ CH:${_CH}
       })
     }
   }
-};
+};

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

@@ -1,8 +1,13 @@
 <template>
-  <div class="pb_content" style="height: auto; width: 94%; margin: 10px auto;background: unset;">
+  <div class="pb_content" style="height: auto; width: 94%; margin: 10px auto;background: unset;"
+  :class="[gotype? 'liyuan':'']"
+  >
+
+    <backPage style="padding: 30px 0 0;" v-if="gotype" tit="课程管理"></backPage>
+
     <div style="width:100%;padding:0 21px;background:#fff;border-radius: 5px;box-sizing: border-box;">
       <div class="pb_head top">
-        <div style="
+        <div v-if="!gotype" style="
     display: flex;
     align-items: center;
 ">
@@ -20,6 +25,7 @@
             )
             ">评价管理</span>
         </div>
+        <div v-if="gotype"></div>
         <div class="student_button">
           <!-- <el-button type="primary" class="bgColor" @click="openCourse">协同编辑</el-button> -->
           <!-- <el-button type="primary" class="bgColor" @click="goToCourse3()">创建极简式课程</el-button>
@@ -421,12 +427,14 @@ import templateDialog from "./aiAddCourse/templateDialog.vue";
 import templateDialogE from "./aiEasy/templateDialog.vue";
 import { v4 as uuidv4 } from "uuid";
 import { myMixin } from "@/mixins/mixin.js"
+import backPage from "./liyuan/components/backPage.vue";
 
 export default {
-  components: { EditorBar, CourseProblem,shareDialog,templateDialog,templateDialogE },
+  components: { EditorBar, CourseProblem,shareDialog,templateDialog,templateDialogE,backPage },
   mixins: [ myMixin ],
   data() {
     return {
+      gotype:sessionStorage.getItem('gotype'),
       itemCount: 1,
       courseTitle: "",
       courseText: "",
@@ -2322,4 +2330,10 @@ export default {
 
 .buttonBox>div:hover {
   background: #f6f8ff;
-}</style>
+}
+.liyuan{
+    width: 100% !important;
+    padding: 0 90px !important;
+    box-sizing: border-box !important;
+}
+</style>

+ 1 - 0
src/components/pages/course/index.vue

@@ -215,6 +215,7 @@
 </template>
 
 <script>
+
 export default {
   data() {
     return {

+ 7 - 1
src/components/pages/evaluation.vue

@@ -8,8 +8,10 @@
       margin: 0;
       box-sizing: border-box;
     "
+    :style="{padding: gotype ? '0 90px' :'20px'}"
   >
     <div>
+      <backPage style="padding: 40px 0 0;" v-if="gotype" tit="目标管理"></backPage>
       <div
         class="pb_content_body"
         style="
@@ -18,6 +20,7 @@
           box-sizing: border-box;
           border-radius: 5px;
         "
+        :style="{width: gotype ? '100%' :'94%'}"
       >
         <div class="pb_head top">
           <span>目标管理设置</span>
@@ -36,7 +39,7 @@
           </div>
         </div>
       </div>
-      <div class="pb_content_body" style="height: 100%">
+      <div class="pb_content_body" style="height: 100%" :style="{width: gotype ? '100%' :'94%'}">
         <el-table
           ref="table"
           :data="dataArray"
@@ -552,14 +555,17 @@
 import Mind from "../tools/jsmind";
 import Sunburst from "../tools/sunburst";
 import SeeBoard from "../tools/seeBoard";
+import backPage from "./liyuan/components/backPage.vue";
 export default {
   components: {
     Mind,
     Sunburst,
     SeeBoard,
+    backPage
   },
   data() {
     return {
+        gotype:sessionStorage.getItem('gotype'),
       data: {
         isLoading: false,
         meta: {

+ 51 - 0
src/components/pages/liyuan/CourseCon.vue

@@ -0,0 +1,51 @@
+<template>
+  <div class="teacherDevelop">
+    <topBar title="课程建设" detail="智能课程管理 · 数字化教学资源 · AI赋能备课教学"></topBar>
+    <div class="cardBox">
+      <card v-for="item in cardArray" :key="item.title" :title="item.title" :icon="item.icon" :to="item.to" :type="item.type"></card>
+    </div>
+  </div>
+</template>
+
+<script>
+import topBar from './components/topBar'
+import card from './components/card.vue';
+export default {
+  components: {
+    topBar,
+    card
+  },
+  data() {
+    return {
+      cardArray: [
+        { title: '课程管理', icon: require('../../../assets/icon/liyuan/niandukaohe.svg'), type: 1, to: "/course" },
+        { title: '课程中心', icon: require('../../../assets/icon/liyuan/gerendangan.svg'), type: 4, to: `/pbl-student-table/dist/#/index?userid=${this.$route.query.userid}&oid=${this.$route.query.oid}&org=${this.$route.query.org}&tType=${this.$route.query.tType}&cid=&screenType=3&gotype=1` },
+        { title: 'AI应用', icon: require('../../../assets/icon/liyuan/jiaoshihuaxiang.svg'), type: 3, to: `?userid=${this.$route.query.userid}&oid=${this.$route.query.oid}&org=${this.$route.query.org}&role=${this.$route.query.role}&tab=0&gotype=1` },
+        { title: '工作空间', icon: require('../../../assets/icon/liyuan/ketangguancha.svg'), type: 3, to:`?userid=${this.$route.query.userid}&oid=${this.$route.query.oid}&org=${this.$route.query.org}&role=${this.$route.query.role}&tab=1&gotype=1` },
+        { title: '知识库', icon: require('../../../assets/icon/liyuan/zhinengbiaodan.svg'), type:3, to: `?userid=${this.$route.query.userid}&oid=${this.$route.query.oid}&org=${this.$route.query.org}&role=${this.$route.query.role}&tab=2&gotype=1`  },
+        { title: '协同建构', icon: require('../../../assets/icon/liyuan/zhinengbiaodan.svg'), type: 1, to: "/synergyCourse" },
+      ]
+    }
+  },
+}
+</script>
+
+<style scoped>
+.teacherDevelop{
+  width: 100%;
+  height: 100%;
+  padding: 40px 90px;
+
+  box-sizing: border-box;
+  background: #FAFAFA;
+
+}
+
+.cardBox{
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
+  gap: 20px;
+  width: 100%;
+  margin-top: 20px;
+}
+</style>

+ 58 - 0
src/components/pages/liyuan/aiOffice.vue

@@ -0,0 +1,58 @@
+<template>
+  <div class="teacherDevelop">
+    <topBar title="智能教务" detail="日常资料收集 · AI智能分析 · 会议智能转录 · 平台账号管理"></topBar>
+    <div class="cardBox">
+      <card v-for="item in cardData(cardArray)" :key="item.title" :title="item.title" :icon="item.icon" :to="item.to" :type="item.type"></card>
+    </div>
+  </div>
+</template>
+
+<script>
+import topBar from './components/topBar'
+import card from './components/card.vue';
+export default {
+  components: {
+    topBar,
+    card
+  },
+  data() {
+    return {
+      role: this.$route.query.role,
+      cardArray: [
+        { title: '资料收集', icon: require('../../../assets/icon/liyuan/zlsj.svg'), type: 1, to: "/teadTest",role:0 },
+        { title: '会议妙记', icon: require('../../../assets/icon/liyuan/hymj.svg'), type: 2, to: `/aigpt/?userid=${this.$route.query.userid}&oid=${this.$route.query.oid}&org=${this.$route.query.org}&role=${this.$route.query.role}`,role:0 },
+        { title: '教师管理', icon: require('../../../assets/icon/liyuan/teamange.svg'), type: 1, to: "/teacher",role:1 },
+        { title: '学生管理', icon: require('../../../assets/icon/liyuan/stumange.svg'), type: 1, to: "/Listudent",role:0 },
+        { title: '办公表单', icon: require('../../../assets/icon/liyuan/workTest.svg'), type: 1, to: "/test",role:1 },
+      ]
+    }
+  },
+  computed:{
+    // 进行权限判断一些只有管理员能看
+    cardData(){
+      return (val)=>{
+          let com = val.filter(e=> e.role==0 || (this.role == 1 && e.role == 1) )
+          return com
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.teacherDevelop{
+  width: 100%;
+  height: 100%;
+  padding: 40px 90px;
+  box-sizing: border-box;
+  background: #FAFAFA;
+}
+
+.cardBox{
+  display: grid;
+  grid-template-columns: repeat(5, 1fr);
+  gap: 20px;
+  width: 100%;
+  margin-top: 20px;
+}
+</style>

+ 46 - 0
src/components/pages/liyuan/components/backPage.vue

@@ -0,0 +1,46 @@
+<template>
+    <div class="pgb" @click="backO">
+        <img src="../../../../assets/icon/liyuan/backPage.svg" alt="">
+        <div>{{ tit }}</div>
+    </div>
+</template>
+
+<script>
+    export default {
+        props:['tit'],
+        data(){
+            return{
+                betaL:'beta',
+                userid: this.$route.query.userid,
+                oid: this.$route.query.oid,
+                org: this.$route.query.org,
+                tType: this.$route.query.tType,
+                role: this.$route.query.role,
+                to: this.$route.query.to,
+            }
+        },
+        methods:{
+            backO(){
+                this.$router.push({ path: sessionStorage.getItem('gotype'), query: { userid: this.userid, oid: this.oid, org: this.org, role: this.role, gotype: 1,tType:this.tType } })
+                sessionStorage.removeItem('gotype');
+            }
+        },
+        mounted(){
+            // this.betaL = window.location.href.includes("beta") ? "beta" : "cloud"
+        }
+    }
+</script>
+
+<style scoped>
+.pgb{
+    /* font-family: PingFang SC; */
+    font-weight: bold;
+    font-size: 20px;
+    display: flex;align-items: center;
+    gap: 10px;
+    cursor: pointer;
+    padding:40px 90px 0;
+    /* height: 23.8px; */
+    margin-bottom: 15px;
+}
+</style>

+ 95 - 0
src/components/pages/liyuan/components/card.vue

@@ -0,0 +1,95 @@
+<template>
+    <div class="card" @click="goTo()">
+        <div class="card-title">{{ title }}</div>
+        <div class="card-icon">
+            <img :src="icon" alt="">
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        title: {
+            type: String,
+        },
+        icon: {
+            type: String,
+        },
+        to: {
+            type: String,
+        },
+        type: {
+            type: Number,
+        },
+    },
+    data() {
+        return {
+            betaL:'beta',
+            userid: this.$route.query.userid,
+            oid: this.$route.query.oid,
+            org: this.$route.query.org,
+            tType: this.$route.query.tType,
+            role: this.$route.query.role,
+        }
+    },
+    methods: {
+        goTo() {
+            sessionStorage.setItem('gotype', this.$route.path);
+
+            if (this.type == 1) {
+                this.$router.push({ path: this.to, query: { userid: this.userid, oid: this.oid, org: this.org, role: this.role,tType: this.tType, gotype: 1 } })
+            }else if (this.type == 2) {
+                let con = this.betaL =='beta'? 'https://beta.cloud.cocorobo.cn' : 'https://cloud.cocorobo.cn'
+                console.log( `${con}${this.to}`);
+                window.location.href = `${con}${this.to}`;
+                
+            }else if (this.type == 4) {
+                let con = this.betaL =='beta'? 'https://beta.pbl.cocorobo.cn' : 'https://pbl.cocorobo.cn'
+                console.log( `${con}${this.to}`);
+                 window.location.href = `${con}${this.to}`;
+            }else {
+                let con = this.betaL =='beta'? '//beta.app.cocorobo.cn/#/' : '//app.cocorobo.cn/#/'
+                console.log( `${con}${this.to}`);
+
+                window.location.href = `${con}${this.to}`;
+            }
+        }
+    },
+    mounted(){
+        // this.betaL = window.location.href.includes("beta") ? "beta" : "cloud"
+    }
+}
+</script>
+
+<style scoped>
+.card {
+    background: #fff;
+    border-radius: 10px;
+    cursor: pointer;
+    display: flex;
+    justify-content: space-between;
+    align-items: flex-end;
+    width: 100%;
+    padding: 20px ;
+    box-shadow: 0px 4px 10px 0px #0000001A;
+    transition: all .3s;
+    box-sizing: border-box;
+}
+
+.card:hover{
+    background: #e6e6e6;
+}
+
+.card > .card-title {}
+
+.card > .card-icon {
+    display: flex;
+}
+
+.card > .card-icon > img{
+    width: 85px;
+    margin-bottom: -20px;
+    margin-right: -20px;
+}
+</style>

+ 32 - 0
src/components/pages/liyuan/components/topBar.vue

@@ -0,0 +1,32 @@
+<template>
+  <div class="ly_title">
+    <div class="title">{{ title }}</div>
+    <div class="detail">{{ detail }}</div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'lyTitle',
+  props: {
+    title: {
+      type: String,
+    },
+    detail: {
+      type: String,
+    }
+  }
+}
+</script>
+
+<style scoped>
+.ly_title{}
+.ly_title > .title{
+  font-size: 20px;
+  font-weight: bold;
+  margin-bottom: 15px;
+}
+.ly_title > .detail{
+  color: #989da5;
+}
+</style>

+ 945 - 0
src/components/pages/liyuan/page/examine/index.vue

@@ -0,0 +1,945 @@
+<template>
+  <div class="testPersonExamine">
+    <backPage v-if="gotype" tit="年度考核"></backPage>
+    <div class="testTit" style="padding: 0 90px;box-sizing: border-box;">
+      <div class="teaLis">
+        <div
+          class="teal"
+          @click="cutPage(2)"
+          v-if="bArray.length"
+          :class="[pType == 2 ? 'Tbor' : '']"
+        >
+          专任教师
+        </div>
+        <div
+          class="teal"
+          @click="cutPage(1)"
+          v-if="aArray.length"
+          :class="[pType == 1 ? 'Tbor' : '']"
+        >
+          班主任考核
+        </div>
+      </div>
+      <div style="margin-right: 30px;display: flex;">
+        <!-- <el-button
+          type="primary"
+          size="mini"
+          style="margin-right: 15px;"
+          @click="saveTab"
+          v-if="allData.type == 1"
+          >保存</el-button
+        > -->
+
+        <div style="margin: 0 20px;" v-if="timeListA.length>0 && pType == 1">
+          <el-select v-model="timeA" placeholder="请选择">
+            <el-option
+              v-for="item in timeListA"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </div>
+
+        <div style="margin: 0 20px;" v-if="timeListB.length>0 && pType == 2">
+          <el-select v-model="timeB" placeholder="请选择">
+            <el-option
+              v-for="item in timeListB"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </div>
+
+        <el-button
+          v-if="allData.type != 2"
+          type="primary"
+          size="mini"
+          @click="Submit"
+          >提交</el-button
+        >
+      </div>
+    </div>
+    <div style="flex: 1;overflow: hidden;" class="notes">
+      注:评价积分周期为2023年6月30日至2024年6月30日
+    </div>
+    <div style="height:100%;overflow: auto;padding: 0 90px;box-sizing: border-box;" v-loading="tabLoad">
+      <div class="sBox_table">
+        <div class="table_title">
+          <div style="width: 110px;">一级指标</div>
+          <div style="width: 140px;min-width: 140px;">二级指标</div>
+          <div style="width: 700px;min-width: 700px;">评价方法</div>
+          <div style="width: 100px;">分值</div>
+          <div style="width: 100px;">自评</div>
+          <div style="flex: 1;min-width: 150px;">自评概述</div>
+          <div style="flex: 0.5;min-width: 100px;">数据来源</div>
+          <!-- <div style="width: 100px;">认定</div>
+          <div style="flex: 1;">认定概述</div> -->
+        </div>
+        <div style="height: 100%;">
+          <div
+            class="table_Content"
+            v-for="item in PageBaseData"
+            :key="item.id"
+          >
+            <div class="twoCol">
+              <div class="ColTit">{{ item.name }}</div>
+              <div class="ColCon">
+                <div class="twoCon" v-for="k in item.children" :key="k.id">
+                  <div>{{ k.name }}</div>
+                  <div style="padding: 10px;box-sizing: border-box;">
+                    {{ k.evaMethod }}
+                  </div>
+                  <div>{{ k.score }}</div>
+                  <div>
+                    <div v-if="k.type == 1" class="ScoreStep">
+                      <el-input
+                        class="num_input"
+                        v-if="allData.type * 1 != 2"
+                        @blur="
+                          saveTab(
+                            parseFloat(k.sco1) > k.score
+                              ? (k.sco1 = k.score)
+                              : '' || k.sco1 < 0
+                              ? (k.sco1 = '')
+                              : ''
+                          )
+                        "
+                        v-model="k.sco1"
+                        v-stopMousewheel
+                        type="number"
+                      ></el-input>
+                      <div v-else>{{ k.sco1 }}</div>
+                    </div>
+                    <div v-else class="ScoreStep">/</div>
+                  </div>
+                  <div class="tArea">
+                    <div
+                      v-if="k.type == 1"
+                      style="height: 100%;height: 100%;width: 100%;text-align: left;"
+                    >
+                      <!-- <textarea
+                      v-if="allData.type * 1 != 2"
+                      @blur="saveTab"
+                      :placeholder="
+                        k.cueWordType == 1 ? '【自评后请简述测算过程】' : ''
+                      "
+                      v-model.trim="k.selfSummary"
+                    /> -->
+                      <el-input
+                        v-if="allData.type * 1 != 2"
+                        type="textarea"
+                        @blur="saveTab"
+                        :placeholder="
+                          k.cueWordType == 1 ? '【自评后请简述测算过程】' : ''
+                        "
+                        v-model="k.selfSummary"
+                      >
+                      </el-input>
+                      <div
+                        v-else
+                        style="width: 100%;padding: 5px;height: 100%;box-sizing: border-box;"
+                      >
+                        {{ k.selfSummary }}
+                      </div>
+                    </div>
+                    <div v-else class="ScoreStep">/</div>
+                  </div>
+                  <div>
+                    <div v-if="!k.testid.test.length">/</div>
+                    <div v-else style="padding-top: 10px;">
+                      <!-- {{ k.testid.test }} -->
+                      <div
+                        v-for="(item2) in k.testid.test"
+                        :key="item2.courseId"
+                        class="orgData"
+                      >
+                        <div @click="lookPrize(item2.courseId)">
+                          {{ item2.title }}:{{ item2.num }}份
+                        </div>
+                        <div
+                          style="color: black;"
+                          @click="goFillIn(item2.courseId)"
+                        >
+                          去填写
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                  <!-- <div style="display: flex;justify-content: center;">
+                    {{ k.sco2 }}
+                  </div>
+                  <div style="display: flex;justify-content: center;">
+                    {{ k.cogSum }}
+                  </div> -->
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <!-- 点击数据来源 -->
+    <el-dialog
+      title=""
+      :visible.sync="diaIframe"
+      :append-to-body="true"
+      width="95%"
+      :before-close="handleClose"
+      class="dialog_diy"
+    >
+      <div style="height: 100%;">
+        <iframe
+          ref="viframe"
+          style="width: 100%; height: 99%; border: none"
+          :src="ifmUrl"
+        ></iframe>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="diaIframe = false">关 闭</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import backPage from "../../components/backPage.vue";
+export default {
+  components:{
+    backPage
+  },
+  directives: {
+    stopMousewheel: {
+      inserted: function(el) {
+        const ele = el.tagName === "INPUT" ? el : el.querySelector("input");
+        ele.addEventListener("mousewheel", () => {
+          ele.blur();
+        });
+      }
+    }
+  },
+  data() {
+    return {
+      gotype:sessionStorage.getItem('gotype'),
+      pType: 2,
+      allData: {
+        type: 1,
+        rjson: ""
+      },
+      // 页面填写数据
+      tableJsonCon: [],
+      // 页面基础ui
+      PageBaseData: [],
+      tabLoad: false, //表格加载状态
+      userid: this.$route.query.userid, //用户id
+      oid: this.$route.query.oid, //学校id
+      org: this.$route.query.org, //组织id
+      role: this.$route.query.role,
+      ifmUrl: "", //数据来源地址
+      diaIframe: false, //数据来源弹框
+      aArray: [],
+      bArray: [],
+      timeListB:[],
+      timeListA:[],
+      timeA:"",
+      timeB:"",
+      testExamineBaseList:[],
+    };
+  },
+  watch: {
+    pType(newVal, oldVal) {
+      this.getPageBase();
+    },
+    timeA(){
+      this.getPageBase();
+    },
+    timeB(){
+      this.getPageBase();
+    }
+  },
+  computed: {},
+  activated() {
+    // 当组件被激活时调用
+    this.getPageBase();
+    this.getPageBase2(1)
+    this.getPageBase2(2)
+  },
+  mounted() {
+    this.getPageBase();
+    this.getPageBase2(1)
+    this.getPageBase2(2)
+    // console.log(JSON.stringify(this.TeaTabJson));
+  },
+  methods: {
+    // 禁用滚轮事件
+    handleWheel(event) {
+      event.preventDefault();
+    },
+    goFillIn(val) {
+      this.$router.push(
+        `/doTest?cid=${val}&org=${this.org}&type=3&role=${this.role}&isN=&oid=${this.oid}&userid=${this.userid}`
+      );
+      // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.userid}`;
+      // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/test?userid=${this.userid}&oid=45facc0a-1211-11ec-80ad-005056b86db5&org=&role=0`;
+      // this.diaIframe = true;
+    },
+    // 提交
+    Submit() {
+      // if (this.allData.type == 2) {
+      //   this.$message({
+      //     type: "info",
+      //     message: "您已提交过,请勿重复提交"
+      //   });
+      //   return;
+      // }
+      let judgeNum = 0;
+
+      // i.type == 1 这个用来判断 科组评价的因为最后两个教师不能打分所以type设为2,下面的循环将他们两个排除出去
+      this.PageBaseData.forEach(e => {
+        e.children.forEach(i => {
+          if (i.type == 1) {
+            if (!i.sco1) {
+              judgeNum = 1;
+            }
+            if (i.sco1 * 1 < 0) {
+              judgeNum = 2;
+            }
+          }
+        });
+      });
+
+      if (judgeNum == 1) {
+        this.$message({
+          message: "请将【自评】分数列填写完整后再提交。",
+          type: "warning"
+        });
+        return;
+      }
+      if (judgeNum == 2) {
+        this.$message({
+          message: "自评分数不可低于0,请检查后重新输入。",
+          type: "warning"
+        });
+        return;
+      }
+
+      for (const e of this.PageBaseData) {
+        for (const k of e.children) {
+          if (k.testid.test.length > 0) {
+            k.testid.test = k.testid.test.map(item => item.courseId);
+          }
+        }
+      }
+
+      this.$confirm("提交后无法修改,是否确定提交?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "info"
+      })
+        .then(() => {
+          let params = [
+            {
+              uid: this.userid,
+              oid: this.oid,
+              org: this.org,
+              type: this.pType,
+              json: JSON.stringify(this.PageBaseData),
+              ttype: 2,
+              tid:this.testExamineBaseList[0].id
+            }
+          ];
+          this.ajax
+            .post(this.$store.state.api + "addTestExamineWorks2", params)
+            .then(res => {
+              this.getData();
+            })
+            .catch(error => {
+              console.log(error);
+            });
+        })
+        .catch(() => {
+          this.handleData();
+
+          this.$message({
+            type: "info",
+            message: "已取消提交"
+          });
+        });
+    },
+    // 保存
+    saveTab() {
+      this.$forceUpdate();
+      let PageBaseDataCopy = JSON.parse(JSON.stringify(this.PageBaseData));
+
+      for (const e of PageBaseDataCopy) {
+        for (const k of e.children) {
+          if (k.testid.test.length > 0) {
+            k.testid.test = k.testid.test.map(item => item.courseId);
+          }
+        }
+      }
+
+      let params = [
+        {
+          uid: this.userid,
+          oid: this.oid,
+          org: this.org,
+          type: this.pType,
+          json: JSON.stringify(PageBaseDataCopy),
+          ttype: 1,
+          tid:this.testExamineBaseList[0].id
+        }
+      ];
+      // return console.log(params);
+      this.ajax
+        .post(this.$store.state.api + "addTestExamineWorks2", params)
+        .then(res => {
+          console.log("addTestExamineWorks2", res);
+          // this.getData();
+          // this.handleData();
+        })
+        .catch(error => {
+          console.log(error);
+        });
+    },
+    // 切换专任,班主任
+    cutPage(e) {
+      this.pType = e;
+    },
+    // 获取页面数据
+    getData() {
+      this.tabLoad = true;
+      let params = {
+        uid: this.userid,
+        type: this.pType,
+        tid:this.testExamineBaseList[0].id
+      };
+      this.ajax
+        .get(this.$store.state.api + "getTestExamineByUserId2", params)
+        .then(res => {
+          console.log("getTestExamineByUserId", res);
+
+          if (res.data[0].length > 0) {
+            this.allData = res.data[0][0];
+            let val = JSON.parse(res.data[0][0].json);
+
+            this.PageBaseData.forEach(e => {
+              val.forEach(i => {
+                if (e.id == i.id) {
+                  e.children.forEach(a => {
+                    i.children.forEach(b => {
+                      if (a.id == b.id) {
+                        a.sco1 = b.sco1;
+                        a.sco2 = b.sco2;
+                        a.cogSum = b.cogSum;
+                        a.selfSummary = b.selfSummary;
+                      }
+                    });
+                  });
+                }
+              });
+            });
+
+            this.handleData();
+            return (this.tabLoad = false);
+          } else {
+            this.allData.type = 1;
+            this.allData.rjson = "";
+            this.handleData();
+            this.tabLoad = false;
+          }
+          // this.$forceUpdate();
+          //  else {
+          //   this.allData.type = 1;
+          //   this.getPageBase();
+          //   this.tabLoad = false;
+          // }
+        })
+        .catch(error => {
+          console.log(error);
+        });
+    },
+    // 获取页面基础ui信息
+    getPageBase() {
+      let params = {
+        typ: this.pType,
+        org: this.org,
+        oid: this.oid,
+        time:this.pType==1?this.timeA:this.timeB
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTestExamineBase2", params)
+        .then(res => {
+          // console.log("resresresres", res.data[0]);
+          // this.allData = res.data[0][0];
+          let testExamineBaseList = res.data[0];
+          this.testExamineBaseList = testExamineBaseList;
+          console.log("selectTestExamineBase", res.data[0][0]);
+          this.PageBaseData = JSON.parse(res.data[0][0].json);
+          // 先获取基础模板,然后再获取用户又没有填写过,填写过就开始循环赋值给基础模板,最后提交基础模板
+          this.getData();
+
+          // this.handleData();
+        })
+        .catch(error => {
+          console.log(error);
+        });
+    },
+    // 获取页面基础ui信息
+    getPageBase2(type) {
+      let params = {
+        typ: type,
+        org: this.org,
+        oid: this.oid,
+        time:type==1?this.timeA:this.timeB
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTestExamineBase2", params)
+        .then(res => {
+          if(type == 1){
+            this.aArray = res.data[0];
+            this.timeListA = this.aArray.map(i=>{return {value:i.time,label:i.timeLabel}})
+            if(this.timeListA.length>0)this.timeA = this.timeListA[0].value;
+          }else {
+            this.bArray = res.data[0];
+            this.timeListB = this.bArray.map(i=>{return {value:i.time,label:i.timeLabel}})
+            if(this.timeListB.length>0)this.timeB = this.timeListB[0].value;
+            if(!this.bArray.length){
+              this.pType = 1
+            }
+          }
+        })
+        .catch(error => {
+          console.log(error);
+        });
+    },
+    async handleData() {
+      for (const e of this.PageBaseData) {
+        for (const k of e.children) {
+          if (k.testid.test.length > 0) {
+            k.testid.test = await this.computedTest(k.testid.test);
+          }
+        }
+      }
+    },
+    computedTest(val) {
+      let params = [
+        {
+          uid: this.userid,
+          testId: val.join(",")
+        }
+      ];
+      return new Promise(resolve => {
+        this.ajax
+          .post(this.$store.state.api + "selectExamineTestName", params)
+          .then(res => {
+            resolve(res.data[0]);
+          })
+          .catch(error => {
+            console.log(error);
+          });
+      });
+    },
+    // 查看数据来源
+    lookPrize(val) {
+      // return;
+      this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.userid}&tType=${this.pType}&examineId=${this.testExamineBaseList[0].id}`;
+      // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/test?userid=${this.userid}&oid=45facc0a-1211-11ec-80ad-005056b86db5&org=&role=0`;
+      this.diaIframe = true;
+    },
+    // 关闭弹框
+    handleClose(done) {
+      this.getPageBase();
+      done();
+    }
+  }
+};
+</script>
+
+<style scoped>
+.testPersonExamine {
+  width: 100%;
+  min-width: calc(100px * 10);
+  height: 100%;
+  /* overflow-x: scroll; */
+  /* overflow: auto; */
+  display: flex;
+  flex-direction: column;
+  /* padding: 10px; */
+  box-sizing: border-box;
+  background-color: #fff;
+	/* margin: 10px 0; */
+	border-radius: 5px;
+}
+/* .tArea { */
+  /* box-sizing: border-box; */
+  /* padding: 5px; */
+/* } */
+.tArea > div > textarea {
+  border: none;
+  width: 100%;
+  height: 100%;
+  resize: none;
+  box-sizing: border-box;
+  padding: 5px;
+  outline-style: none;
+}
+.tArea > div >>> .el-textarea {
+  height: 100%;
+}
+.tArea > div >>> .el-textarea__inner {
+  border: none !important;
+  height: 100%;
+  resize: none;
+}
+
+.testPersonExamine > .testTit {
+  height: 100px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.notes {
+  color: #fb5a3f;
+  font-weight: 600;
+  font-size: 20px;
+}
+.ScoreStep {
+  height: 100%;
+  display: flex;
+  width: 100%;
+  text-align: center;
+  align-items: center;
+  justify-content: center;
+}
+.ScoreStep > input {
+  height: 100% !important;
+  outline-style: none;
+  width: 100%;
+  padding: 5px;
+  text-align: center;
+  box-sizing: border-box;
+  border-radius: 4px;
+  border: none !important;
+
+  /* border: 1px solid #dcdfe6 !important; */
+}
+.teaLis {
+  display: flex;
+}
+.teal {
+  padding: 10px 20px;
+  cursor: pointer;
+}
+.Tbor {
+  border-bottom: 2px rgba(54, 129, 252, 1) solid;
+  font-weight: 600;
+}
+.testCon {
+  box-sizing: border-box;
+  padding: 20px;
+}
+
+.orgData {
+  cursor: pointer;
+  color: #528df6;
+  margin-bottom: 10px;
+}
+
+.diaScoreTop {
+  display: flex;
+  justify-content: space-between;
+  height: 60px;
+}
+
+.diaScoreLeft {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.diaScoreLeft > div {
+  margin-right: 30px;
+}
+
+.diaScoreRight {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.TabBtn {
+  cursor: pointer;
+  color: #528df6;
+}
+
+.sBox_table {
+  width: 100%;
+  min-width: 1300px;
+  margin: 0 auto;
+  height: 100%;
+  box-sizing: border-box;
+  padding-bottom: 60px;
+  font-size: 14px;
+}
+
+.table_title {
+  width: calc(100% - 6px);
+  min-width: calc(110px * 9);
+  height: 50px;
+  background: #e0eafb;
+  border: 1px solid #d5d8df;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+}
+
+/* 容器不显示滚动条,但仍然可以滚动 */
+.container {
+  overflow: auto;
+  scrollbar-width: none; /* 对于Firefox */
+}
+
+/* 针对WebKit浏览器,比如Chrome和Safari,使滚动条不占据空间 */
+.container::-webkit-scrollbar {
+  display: none; /* 隐藏滚动条 */
+}
+
+/* 针对IE和Edge,使滚动条不占据空间 */
+.container {
+  -ms-overflow-style: none; /* IE 10+ */
+  scrollbar-width: none; /* Firefox */
+}
+.table_title > div {
+  /* width: calc(100% / 9); */
+  min-width: 110px;
+  box-sizing: border-box;
+  text-align: center;
+  height: 100%;
+  line-height: 50px;
+  border-right: 1px solid #d5d8df;
+  border-left: 1px solid #d5d8df;
+  background: #e0eafb;
+}
+
+/* .table_title2 {
+  width: 100%;
+  min-width: calc(110px * 8);
+  height: 50px;
+  background: #e0eafb;
+  border: 1px solid #d5d8df;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+}
+.table_title2 > div {
+  width: calc(100% / 8);
+  min-width: 110px;
+  text-align: center;
+  height: 100%;
+  line-height: 50px;
+  border-right: 1px solid #d5d8df;
+} */
+
+.table_title > div:last-child {
+  border: none;
+}
+
+.table_Content {
+  width: 100%;
+  min-width: calc(110px * 9);
+  /* border: 1px solid #d5d8df; */
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  text-align: center;
+  align-items: center;
+}
+/* .table_Content2 {
+  width: 100%;
+  min-width: calc(110px * 8);
+  border: 1px solid #d5d8df;
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  text-align: center;
+  align-items: center;
+} */
+
+.twoCol {
+  width: 100%;
+  display: flex;
+}
+
+.ColTit {
+  width: 110px !important;
+  min-width: 110px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  border-bottom: 1px #ccc solid;
+  border-left: 1px solid #d5d8df;
+}
+
+/* 取消[type='number']的input的上下箭头 */
+input::-webkit-inner-spin-button {
+  -webkit-appearance: none !important;
+}
+
+input::-webkit-outer-spin-button {
+  -webkit-appearance: none !important;
+}
+
+input[type="number"] {
+  -moz-appearance: textfield;
+}
+.twoCon {
+  display: flex;
+  width: 100%;
+}
+.twoCon > div {
+  /* width: 10%; */
+  min-width: 110px;
+  min-height: 50px;
+  /* line-height: 50px; */
+  display: flex;
+  box-sizing: border-box;
+  justify-content: center;
+  align-items: center;
+  border-left: 1px #ccc solid;
+  border-bottom: 1px #ccc solid;
+}
+
+.twoCon > div:nth-child(1) {
+  width: 140px !important;
+}
+.twoCon > div:nth-child(2) {
+  width: 700px !important;
+  white-space: pre-line;
+  word-break: break-all;
+  text-align: left;
+  justify-content:flex-start;
+  /* background-color:red; */
+}
+.twoCon > div:nth-child(3) {
+  width: 100px !important;
+}
+.twoCon > div:nth-child(4) {
+  width: 100px !important;
+}
+.twoCon > div:nth-child(5) {
+  flex: 1;
+  min-width: 150px;
+}
+.twoCon > div:nth-child(6) {
+  flex: 0.5;
+  min-width: 100px;
+}
+.twoCon > div:nth-child(7) {
+  width: 100px !important;
+}
+.twoCon > div:nth-child(8) {
+  flex: 1;
+}
+
+/* .twoCon > div >>> .el-input-number {
+  height: 100% !important;
+} */
+/* .twoCon > div >>> .el-input {
+  height: 100% !important;
+} */
+.ScoreStep >>> .el-input-number {
+  height: 100% !important;
+}
+.ScoreStep >>> .el-input {
+  height: 100% !important;
+}
+.ScoreStep >>> .el-input__inner {
+  height: 100%;
+  padding-left: 15px;
+  border: none;
+  padding-right: 15px;
+}
+.twoCon > div > input {
+  border: none;
+  width: 100%;
+  height: 100%;
+  outline-style: none;
+  text-align: center;
+}
+/* .twoCon > div >>> .el-input__inner {
+  height: 100%;
+  border: none;
+  padding-left: 15px;
+  padding-right: 15px;
+} */
+.ColCon {
+  flex: 1;
+}
+.ColCon:nth-child(-1) > div {
+  border-bottom: none;
+}
+.twoCon > div > textarea {
+  border: none;
+  width: 100%;
+  height: 100%;
+  resize: none;
+  outline-style: none;
+}
+.dialog_diy >>> .el-dialog {
+  height: 95%;
+  margin: 0 auto !important;
+  margin-top: 20px !important;
+  overflow: hidden;
+}
+
+.dialog_diy >>> .el-dialog__header {
+  background: #454545 !important;
+  padding: 25px 20px;
+}
+
+.dialog_diy >>> .el-dialog__body {
+  height: calc(100% - 50px);
+  box-sizing: border-box;
+  padding: 0px;
+}
+
+.dialog_diy >>> .el-dialog__title {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn {
+  top: 19px;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__body,
+.dialog_diy >>> .el-dialog__footer {
+  background: #fafafa;
+}
+
+.num_input>>>input{
+  padding-right: 0px;
+  -moz-appearance: textfield;
+  -webkit-appearance: textfield;
+  line-height: 1px !important;
+}
+
+.num_input>>>input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button {
+  -webkit-appearance: none;
+  margin: 0;
+}
+</style>

+ 72 - 0
src/components/pages/liyuan/page/portrait/chordDiagramView.vue

@@ -0,0 +1,72 @@
+<template>
+  <div class="data_body">
+    <div style="width: 100%; height: 100%;align-items: center;justify-content: center;">
+      <!-- <div id="cateRank" class="echart" style="width: 100%; height: 100%"></div> -->
+      <highcharts :options="data" style="width: 100%; height: 95%;"></highcharts>
+    </div>
+  </div>
+</template>
+
+<script>
+import {Chart} from 'highcharts-vue'
+import HighCharts from 'highcharts'
+//和弦图的引入依赖
+import HC_sankey from 'highcharts/modules/sankey';
+import dependencywheel from 'highcharts/modules/dependency-wheel';
+import { data } from 'jquery';
+HC_sankey(HighCharts);
+dependencywheel(HighCharts);
+
+export default {
+  components: {
+    highcharts: Chart,
+  },
+  props: {
+    data:{
+			type:Object,
+			default:()=>{}
+		}
+  },
+  data() {
+    return {
+      chartObj: null,
+    };
+  },
+  methods: {
+    setChart() {
+      // 雷达图显示的标签
+      let newPromise = new Promise((resolve) => {
+        resolve();
+      });
+      //然后异步执行echarts的初始化函数
+      newPromise.then(() => {
+        this.chartObj = Highcharts.chart('cateRank',this.data);
+      });
+			window.addEventListener("resize", () => {
+					this.chartObj.resize();
+      });
+    },
+  },
+  mounted() {
+    this.$nextTick(()=>{
+      this.setChart();
+    })
+
+  },
+};
+</script>
+
+<style scoped>
+.data_body {
+  height: 100%;
+  /* display: flex; */
+  position: relative;
+  border-radius: 5px;
+  /* border: 1px solid #eee; */
+  margin: 0 auto;
+  box-sizing: border-box;
+  padding: 0;
+  width: 95%;
+  /* background: #fff; */
+}
+</style>

+ 48 - 0
src/components/pages/liyuan/page/portrait/eChartView.vue

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

+ 1054 - 0
src/components/pages/liyuan/page/portrait/index.vue

@@ -0,0 +1,1054 @@
+<template>
+  <div class="portrait">
+    <backPage v-if="gotype" tit="教师画像"></backPage>
+
+    <div class="p_top" v-if="timeSort.length >1">
+      <el-select v-model="selectTime" placeholder="请选择" @change="changeTimeSort">
+    <el-option
+      v-for="item in timeSort"
+      :key="item.id"
+      :label="item.label"
+      :value="item.id">
+    </el-option>
+  </el-select>
+    </div>
+    <div class="p_bottom">
+      <div class="p_left">
+      <div class="p_l_top">
+        <div class="teachingActivity" v-loading="cardNumLoading">
+					<img :src="require('../../../../../assets/icon/testPerson/bg1.png')" alt="">
+          <div>
+            <span>教学活动</span>
+            <el-tooltip
+              class="item"
+              effect="light"
+              content="教学活动"
+              placement="top"
+            >
+              <svg
+                width="16"
+                height="16"
+                viewBox="0 0 16 16"
+                fill="none"
+                xmlns="http://www.w3.org/2000/svg"
+              >
+                <path
+                  d="M7.50562 11.9998V6.5H8.50562V11.9998H7.50562Z"
+                  fill="black"
+                  fill-opacity="0.4"
+                />
+                <path
+                  d="M8.59985 4H7.3999V5.19995H8.59985V4Z"
+                  fill="black"
+                  fill-opacity="0.4"
+                />
+                <path
+                  d="M1 8C1 11.866 4.13403 15 8 15C11.866 15 15 11.866 15 8C15 4.13403 11.866 1 8 1C4.13403 1 1 4.13403 1 8ZM2 8C2 4.68628 4.68628 2 8 2C11.3137 2 14 4.68628 14 8C14 11.3137 11.3137 14 8 14C4.68628 14 2 11.3137 2 8Z"
+                  fill="black"
+                  fill-opacity="0.4"
+                />
+              </svg>
+            </el-tooltip>
+          </div>
+          <span style="color: #3681FC;">{{ teachingActivityNum }}</span>
+        </div>
+        <div class="teachingAndResearchActivities" v-loading="cardNumLoading">
+					<img :src="require('../../../../../assets/icon/testPerson/bg2.png')" alt="">
+          <div>
+            <span>教研活动</span>
+            <el-tooltip
+              class="item"
+              effect="light"
+              content="教研活动"
+              placement="top"
+            >
+              <svg
+                width="16"
+                height="16"
+                viewBox="0 0 16 16"
+                fill="none"
+                xmlns="http://www.w3.org/2000/svg"
+              >
+                <path
+                  d="M7.50562 11.9998V6.5H8.50562V11.9998H7.50562Z"
+                  fill="black"
+                  fill-opacity="0.4"
+                />
+                <path
+                  d="M8.59985 4H7.3999V5.19995H8.59985V4Z"
+                  fill="black"
+                  fill-opacity="0.4"
+                />
+                <path
+                  d="M1 8C1 11.866 4.13403 15 8 15C11.866 15 15 11.866 15 8C15 4.13403 11.866 1 8 1C4.13403 1 1 4.13403 1 8ZM2 8C2 4.68628 4.68628 2 8 2C11.3137 2 14 4.68628 14 8C14 11.3137 11.3137 14 8 14C4.68628 14 2 11.3137 2 8Z"
+                  fill="black"
+                  fill-opacity="0.4"
+                />
+              </svg>
+            </el-tooltip>
+          </div>
+          <span style="color: #F2873B;">{{
+            teachingAndResearchActivitiesNum
+          }}</span>
+        </div>
+        <div
+          class="trainingActivity"
+					v-show="oid == '4c686762-1d0a-11ed-8c78-005056b86db5'"
+          v-loading="cardNumLoading"
+        >
+				<img :src="require('../../../../../assets/icon/testPerson/bg3.png')" alt="">
+          <div>
+            <span>培训活动</span>
+            <el-tooltip
+              class="item"
+              effect="light"
+              content="培训活动"
+              placement="top"
+            >
+              <svg
+                width="16"
+                height="16"
+                viewBox="0 0 16 16"
+                fill="none"
+                xmlns="http://www.w3.org/2000/svg"
+              >
+                <path
+                  d="M7.50562 11.9998V6.5H8.50562V11.9998H7.50562Z"
+                  fill="black"
+                  fill-opacity="0.4"
+                />
+                <path
+                  d="M8.59985 4H7.3999V5.19995H8.59985V4Z"
+                  fill="black"
+                  fill-opacity="0.4"
+                />
+                <path
+                  d="M1 8C1 11.866 4.13403 15 8 15C11.866 15 15 11.866 15 8C15 4.13403 11.866 1 8 1C4.13403 1 1 4.13403 1 8ZM2 8C2 4.68628 4.68628 2 8 2C11.3137 2 14 4.68628 14 8C14 11.3137 11.3137 14 8 14C4.68628 14 2 11.3137 2 8Z"
+                  fill="black"
+                  fill-opacity="0.4"
+                />
+              </svg>
+            </el-tooltip>
+          </div>
+          <span style="color: #31B476;">{{ teachingActivityNum }}</span>
+        </div>
+      </div>
+      <div class="p_l_bottom">
+        <div class="p_title">
+          <span>教研活动</span>
+        </div>
+        <div class="p_eCharts" v-loading="eChartsLoading">
+          <eChartView
+            :data="teachingAndResearchActivitiesECharts"
+            v-if="!eChartsLoading"
+          />
+        </div>
+      </div>
+    </div>
+    <div
+      class="p_center"
+      v-if="ExamineBase.length > 0 && annualAssessmentECharts.radar.indicator.length > 0"
+      v-loading="annualAssessmentLoading"
+    >
+      <div class="p_title">
+        <span>年度考核</span>
+        <div>
+          <el-button-group>
+            <el-button
+              v-if="bArray.length"
+              @click="changeAnnualAssessmentStatus(2)"
+              :type="annualAssessmentStatus === 2 ? 'primary' : ''"
+              >专任教师</el-button
+            >
+            <el-button
+              v-if="aArray.length"
+              @click="changeAnnualAssessmentStatus(1)"
+              :type="annualAssessmentStatus === 1 ? 'primary' : ''"
+              >班主任</el-button
+            >
+          </el-button-group>
+        </div>
+      </div>
+      <div class="p_eCharts" v-if="!annualAssessmentLoading">
+        <eChartView
+          ref="annualAssessmentEChartsRef"
+          :data="annualAssessmentECharts"
+        />
+      </div>
+    </div>
+		<div class="p_center" v-else>
+			<img :src="require('../../../../../assets/icon/testPerson/bg4.png')" alt="">
+		</div>
+    <div class="p_right">
+      <div class="p_r_top">
+        <div class="p_title">
+          <span>教学活动</span>
+        </div>
+        <div class="p_eCharts" v-loading="eChartsLoading">
+          <eChartView :data="teachingActivityECharts" v-if="!eChartsLoading" />
+        </div>
+      </div>
+      <div class="p_r_bottom">
+        <div class="p_title">
+          <span>跨学科情况</span>
+        </div>
+        <div class="p_eCharts" v-loading="eChartsLoading">
+          <chordDiagramView
+            :data="interdisciplinarySituationECharts"
+            v-if="!eChartsLoading"
+          />
+        </div>
+      </div>
+    </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import eChartView from "./eChartView.vue";
+import chordDiagramView from "./chordDiagramView.vue";
+import backPage from "../../components/backPage.vue";
+
+var OpenCC = require("opencc-js");
+let converter = OpenCC.Converter({
+  from: "hk",
+  to: "cn"
+});
+export default {
+  components: {
+    eChartView,
+    chordDiagramView,
+    backPage
+  },
+  props: {
+    ExamineBase: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      gotype:sessionStorage.getItem('gotype'),
+      teachingActivityNum: 0,
+      teachingAndResearchActivitiesNum: 0,
+      trainingActivityNum: 0,
+      cardNumLoading: true,
+      eChartsLoading: true,
+      annualAssessmentStatus: 2, //2专任教师 1班主任
+      teachingAndResearchActivitiesEChartsLoading: true,
+      teachingAndResearchActivitiesECharts: {
+        tooltip: {
+          trigger: "axis",
+          axisPointer: { type: "shadow" }
+        },
+        legend: {
+          data: ["我发布的", "我收到的"],
+          bottom: 0,
+          orient: "horizontal",
+          left: "center"
+        },
+        grid: {
+          left: "3%",
+          right: "4%",
+          bottom: "10%",
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: "category",
+            data: ["评论次数", "评课次数", "字数", "语音数"]
+          }
+        ],
+        yAxis: [
+          {
+            type: "value"
+          }
+        ],
+        series: []
+      },
+      annualAssessmentLoading: true,
+      annualAssessmentECharts: {
+        legend: {
+          data: ["自评得分率", "认定得分率", "全体教师平均得分率"],
+          bottom: 0,
+          textStyle: {
+            color: "black"
+          }
+        },
+        radar: {
+          // shape: 'circle',
+          indicator: [],
+          name: {
+            textStyle: {
+              color: "black"
+            }
+          }
+        },
+        series: [
+          {
+            name: "",
+            type: "radar",
+            data: [],
+            label: {
+              color: "black"
+            }
+          }
+        ]
+      },
+      teachingActivityECharts: {
+        tooltip: {
+          trigger: "item"
+        },
+        // legend: {
+        //   orient: "vertical",
+        //   right: "5%",
+        //   top: "center",
+        //   itemGap: 20
+        // },
+        series: [
+          {
+            name: "",
+            type: "pie",
+            radius: ["40%", "70%"],
+            avoidLabelOverlap: false,
+            label: {
+              show: true,
+              position: "outside",
+              formatter: "{b}: {c}"
+            },
+            emphasis: {
+              label: {
+                show: true,
+                fontSize: "20",
+                fontWeight: "bold"
+              }
+            },
+            labelLine: {
+              show: true,
+              length: 15,
+              length2: 10
+            },
+            data: []
+          }
+        ]
+      },
+      interdisciplinarySituationECharts: {
+        title: {
+          text: null
+        },
+        chart: {
+          backgroundColor: "rgba(0,0,0,0)"
+        },
+        credits: {
+          enabled: false //不显示LOGO
+        },
+        tooltip: {
+          formatter: function() {
+            // 自定义弹窗内容的回调函数
+            var point = this.point;
+            if (point.from) {
+              var tooltipText =
+                "<b>" +
+                point.from +
+                "</b> - <b>" +
+                point.to +
+                "</b>: " +
+                point.weight;
+              return tooltipText;
+            } else {
+              var tooltipText = "<b>" + point.name + "</b>: " + point.sum;
+              return tooltipText;
+            }
+          }
+        },
+        series: [
+          {
+            keys: ["from", "to", "weight"],
+            data: [],
+            type: "dependencywheel",
+            name: "",
+            dataLabels: {
+              color: "#333",
+              textPath: {
+                enabled: true,
+                attributes: {
+                  dy: 5
+                }
+              },
+              distance: 10
+            },
+            size: "95%"
+          }
+        ]
+      },
+      userid: this.$route.query.userid,
+      oid: this.$route.query.oid,
+      org: this.$route.query.org,
+      teacherName: "",
+      aArray: [],
+      bArray: [],
+      timeSort:[],
+      selectTime:"",
+    };
+  },
+  methods: {
+    // 获取页面基础ui信息
+    getPageBase2(type) {
+      let params = {
+        typ: type,
+        org: this.org,
+        oid: this.oid
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTestExamineBase", params)
+        .then(res => {
+          if(type == 1){
+            this.aArray = res.data[0];
+          }else {
+            this.bArray = res.data[0];
+            if(!this.bArray.length){
+              this.changeAnnualAssessmentStatus(1)
+            }
+          }
+          this.timeSort = res.data[0].map(item => {return {label:item.timeName,id:item.time,time:item.timeName.split('~')[0]}});
+          if(this.timeSort.length>0){
+            this.selectTime = this.timeSort[0].id;
+          }
+        })
+        .catch(error => {
+          console.log(error);
+        });
+    },
+    changeAnnualAssessmentStatus(status) {
+      if (this.annualAssessmentLoading) return;
+      this.annualAssessmentStatus = status;
+      this.getAnnualAssessmentEChartsData();
+    },
+    getAnnualAssessmentEChartsData() {
+      this.annualAssessmentLoading = true;
+      let params = [
+        {
+          oid: this.oid,
+          org: this.org,
+          type: this.annualAssessmentStatus,
+          tname: this.teacherName
+        }
+      ];
+      // console.log(params);
+      this.ajax
+        .post(this.$store.state.api + "selectTestExaminePersonData2", params)
+        .then(res => {
+          let data = res.data[0];
+
+          if(this.selectTime && this.timeSort.length > 1 ){
+            data = data.filter(item => item.time == this.selectTime);
+          }
+
+          console.log("👉xxx",data)
+
+          data.forEach(e => {
+            e.json = JSON.parse(e.json);
+          });
+
+          data.forEach(e => {
+            e.evaSca = 0;
+            e.cogSco = 0;
+            e.step = 0;
+            e.allStep = 0;
+
+            e.json.forEach(i => {
+              i.evaScore = 0; // 自评
+              i.cogScore = 0; //考核
+              i.score = 0; //考核
+              i.children.forEach(k => {
+                e.evaSca = e.evaSca + k.sco1 * 1;
+                e.cogSco = e.cogSco + k.sco2 * 1;
+                i.evaScore = i.evaScore + k.sco1 * 1;
+                i.cogScore = i.cogScore + k.sco2 * 1;
+                i.score = i.score + k.score * 1;
+                e.allStep++;
+                if (!!k.sco2 * 1) {
+                  e.step++;
+                }
+              });
+            });
+          });
+
+          data.forEach(e => {
+            if (e.step == e.allStep) {
+              e.state = "已完成";
+            } else {
+              e.state = "未完成";
+            }
+            if (!e.tea) {
+              e.tea = "";
+            }
+            e.evaSca = e.evaSca.toFixed(0);
+            e.cogSco = e.cogSco.toFixed(0);
+          });
+          let _data = [];
+          let zongJson = {};
+          // zongJson.count = data.length
+          data.forEach((e, index) => {
+            _data[index] = {};
+            _data[index].username = e.username;
+            _data[index].evaSca = e.evaSca;
+            _data[index].cogSco = e.cogSco;
+            _data[index].json = [];
+
+            e.json.forEach((i, iindex) => {
+              if (
+                converter(i.name) == converter("科组评价") ||
+                converter(i.name) == converter("行政巡查")
+              ) {
+                return;
+              }
+              _data[index].json[iindex] = {};
+              _data[index].json[iindex].name = i.name;
+							console.log(i)
+              let _evaScore = parseInt(
+                (i.evaScore * (100 / i.score)).toFixed(0)
+              );
+              let _cogScore = parseInt(
+                (i.cogScore * (100 / i.score)).toFixed(0)
+              );
+
+							// let _ideScore = parseInt(
+							// 	(i.score * (100 / i.score)).toFixed(0)
+							// );
+              _data[index].json[iindex].evaScore = _evaScore; // 自评
+              _data[index].json[iindex].cogScore = _cogScore; // 考核
+              zongJson[i.name] ? "" : (zongJson[i.name] = {});
+              zongJson[i.name].evaScore // 全体教师自评平均得分
+                ? (zongJson[i.name].evaScore += _evaScore)
+                : (zongJson[i.name].evaScore = _evaScore);
+              zongJson[i.name].cogScore // 全体教师考核平均得分
+                ? (zongJson[i.name].cogScore += _cogScore)
+                : (zongJson[i.name].cogScore = _cogScore);
+							if(e.userid == this.userid){
+								zongJson[i.name].selfEvaScore = _evaScore;
+								zongJson[i.name].selfCogScore = _cogScore;
+							}
+            });
+          });
+          let zongArray = Object.keys(zongJson);
+          for (var i = 0; i < zongArray.length; i++) {
+            zongJson[zongArray[i]].evaScore = (
+              zongJson[zongArray[i]].evaScore / data.length
+            ).toFixed(0);
+            zongJson[zongArray[i]].cogScore = (
+              zongJson[zongArray[i]].cogScore / data.length
+            ).toFixed(0);
+          }
+
+          this.annualAssessmentECharts.radar.indicator = Object.keys(
+            zongJson
+          ).map(item => {
+            return { name: item, max: 100 };
+          });
+
+          let _eChartsData = [
+            {
+              value: [],
+              name: "自评得分率",
+              label: {
+                show: true,
+                formatter: `{c}`,
+                fontSize: 12,
+                color: "#000000" // 设置字体颜色为黑色
+              }
+            },
+            {
+              value: [],
+              name: "认定得分率",
+              label: {
+                show: true,
+                formatter: `{c}`,
+                fontSize: 12,
+                color: "#000000" // 设置字体颜色为黑色
+              }
+            },
+            {
+              value: [],
+              name: "全体教师平均得分率",
+              label: {
+                show: true,
+                formatter: `{c}`,
+                fontSize: 12,
+                color: "#000000" // 设置字体颜色为黑色
+              }
+            }
+          ];
+
+          zongArray.forEach(i => {
+						if(zongJson[i].selfEvaScore || zongJson[i].selfEvaScore === 0){
+							_eChartsData[0].value.push(zongJson[i].selfEvaScore);
+						}else{
+							_eChartsData[0].value.push(0);
+						}
+						if(zongJson[i].selfCogScore || zongJson[i].selfCogScore === 0){
+							_eChartsData[2].value.push(zongJson[i].selfCogScore);
+						}else{
+							_eChartsData[2].value.push(0);
+						}
+						if(zongJson[i].cogScore || zongJson[i].cogScore === 0){
+							_eChartsData[1].value.push(zongJson[i].cogScore)
+						}else{
+							_eChartsData[1].value.push(0);
+						}
+            // _eChartsData[0].value.push(zongJson[i].selfScore);
+            // _eChartsData[1].value.push(zongJson[i].evaScore);
+            // _eChartsData[2].value.push(zongJson[i].cogScore);
+          });
+					console.log(data)
+					console.log(zongJson)
+						console.log(_eChartsData)
+          this.annualAssessmentECharts.series[0].data = _eChartsData;
+          // this.$refs.annualAssessmentEChartsRef.setChart();
+          this.annualAssessmentLoading = false;
+        })
+        .catch(error => {
+          this.annualAssessmentLoading = false;
+          console.log(error);
+        });
+    },
+    getCardData() {
+      this.cardNumLoading = true;
+      let params = {
+        uid: this.userid,
+        oid: this.oid,
+        org: this.org
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTestUserY", params)
+        .then(res => {
+          let _data1 =  res.data[4];
+          let _data2 = res.data[5];
+          let _data3 = res.data[3];
+
+          if(this.selectTime && this.timeSort.length>1){
+            _data1 = _data1.filter(i=>{
+              let _time = this.timeSort.find(j=>j.id == this.selectTime).time;
+              let _iTime = new Date(i.update_at).getFullYear();
+              return _iTime == _time;
+            })
+
+            _data2 = _data2.filter(i=>{
+              let _time = this.timeSort.find(j=>j.id == this.selectTime).time;
+              let _iTime = new Date(i.create_at).getFullYear();
+              return _iTime == _time;
+            })
+
+            _data3 = _data3.filter(i=>{
+              let _time = this.timeSort.find(j=>j.id == this.selectTime).time;
+              let _iTime = new Date(i.update_at).getFullYear();
+              return _iTime == _time;
+            })
+
+          }
+
+          this.teachingActivityNum = _data1.length;
+          this.teachingAndResearchActivitiesNum = _data2.length;
+          this.trainingActivityNum =_data3.length;
+          this.cardNumLoading = false;
+        })
+        .catch(err => {
+          this.cardNumLoading = false;
+          console.error(err);
+        });
+    },
+    getData() {
+      this.eChartsLoading = true;
+      let params = {
+        uid: this.userid
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectPortraitData", params)
+        .then(res => {
+          let array1 = res.data[0];
+          let array2 = res.data[1];
+          let array3 = res.data[2];
+          let typeList = res.data[3];
+
+
+          if(this.selectTime && this.timeSort.length>1){
+            array1 = array1.filter(i=>{
+              let _time = this.timeSort.find(j=>j.id == this.selectTime).time;
+              let _iTime = new Date(i.create_at).getFullYear();
+              return _iTime == _time;
+            })
+
+            array2 = array2.filter(i=>{
+              let _time = this.timeSort.find(j=>j.id == this.selectTime).time;
+              let _iTime = new Date(i.create_at).getFullYear();
+              return _iTime == _time;
+            })
+
+            array3 = array3.filter(i=>{
+              let _time = this.timeSort.find(j=>j.id == this.selectTime).time;
+              let _iTime = new Date(i.update_at).getFullYear();
+              return _iTime == _time;
+            })
+          }
+
+
+          let countCourse1 = [];
+          let wordCount1 = 0;
+          let audioCount1 = 0;
+          let courseArray1 = {};
+          let countCourse2 = [];
+          let wordCount2 = 0;
+          let audioCount2 = 0;
+          let courseArray2 = {};
+          // 我发布的
+          array1.forEach(element => {
+            if (!courseArray1[element.courseId]) {
+              courseArray1[element.courseId] = {
+                bool: false,
+                title: element.title,
+                type: element.type2,
+                name: element.creator,
+                array: []
+              };
+            }
+            courseArray1[element.courseId].array.push(element);
+            if (countCourse1.indexOf(element.courseId) == -1) {
+              countCourse1.push(element.courseId);
+            }
+            if (element.type == 1) {
+              wordCount1 += element.content.replace(/<[^>]+>/g, "").length;
+            }
+            if (element.type == 2) {
+              audioCount1++;
+            }
+          });
+
+          //我收到的
+          array2.forEach(element => {
+            if (!courseArray2[element.courseId]) {
+              courseArray2[element.courseId] = {
+                bool: false,
+                title: element.title,
+                type: element.type2,
+                name: element.creator,
+                array: []
+              };
+            }
+            courseArray2[element.courseId].array.push(element);
+            if (countCourse2.indexOf(element.courseId) == -1) {
+              countCourse2.push(element.courseId);
+            }
+            if (element.type == 1) {
+              wordCount2 += element.content.replace(/<[^>]+>/g, "").length;
+            }
+            if (element.type == 2) {
+              audioCount2++;
+            }
+          });
+
+          //2 1 3 4
+          let _eChartsData = [
+            {
+              name: "我发布的",
+              type: "bar",
+              data: [
+                array1.length,
+                countCourse1.length,
+                wordCount1,
+                audioCount1
+              ],
+              itemStyle: {
+                color: "#5470c6"
+              }
+            },
+            {
+              name: "我收到的",
+              type: "bar",
+              data: [
+                array2.length,
+                countCourse2.length,
+                wordCount2,
+                audioCount2
+              ],
+              itemStyle: {
+                color: "#91cc75"
+              }
+            }
+          ];
+
+          let _eChartsData2 = [];
+					let _eChartsData3 = [];
+          typeList.forEach(item => {
+            _eChartsData2.push({ value: 0, name: item.name, id: item.id });
+          });
+          array3.forEach(item => {
+            let type = item.type.split(",");
+						type.sort((a,b)=>a-b);
+            type.forEach(i => {
+              let _findIndex = _eChartsData2.findIndex(j => j.id == i);
+              if (_findIndex != -1) {
+                _eChartsData2[_findIndex].value += 1;
+              }
+            });
+          });
+
+          let resultSubject = [];
+          for (let i = 0; i < typeList.length - 1; i++) {
+            for (let j = i + 1; j < typeList.length; j++) {
+              resultSubject.push({
+                id: [typeList[i].id, typeList[j].id],
+                name: [typeList[i].name, typeList[j].name],
+                count: 0,
+              });
+            }
+          }
+
+          for (var i = 0; i < array3.length; i++) {
+            let array = array3[i].type.split(",");
+            for (var j = 0; j < resultSubject.length; j++) {
+              if (this.checkArrayInclusion(resultSubject[j].id, array)) {
+                resultSubject[j].count++;
+              }
+            }
+          }
+
+          let resultSubject2 = [];
+
+          for (var i = 0; i < resultSubject.length; i++) {
+            let el = resultSubject[i];
+            if (el.count > 0) {
+              resultSubject2.push([el.name[0], el.name[1], el.count]);
+            }
+          }
+					_eChartsData3 = resultSubject.filter(i=>i.count!==0).map(i=>([i.name[0],i.name[1],i.count]));
+					console.log(_eChartsData3)
+          _eChartsData2 = _eChartsData2.filter(i => i.value != 0);
+          this.teachingActivityECharts.series[0].data = _eChartsData2;
+          this.teachingAndResearchActivitiesECharts.series = _eChartsData;
+					this.interdisciplinarySituationECharts.series[0].data = _eChartsData3;
+          this.eChartsLoading = false;
+        })
+        .catch(err => {
+          this.eChartsLoading = false;
+          console.error(err);
+        });
+    },
+		checkArrayInclusion(arr1, arr2) {
+      return arr1.every((item) => arr2.includes(item));
+    },
+    changeTimeSort(){
+      console.log(this.selectTime)
+      this.getAnnualAssessmentEChartsData();
+      this.getCardData();
+      this.getData();
+    },
+  },
+  mounted() {
+    this.getPageBase2(1)
+    this.getPageBase2(2)
+    this.getAnnualAssessmentEChartsData();
+    this.getData();
+    this.getCardData();
+  }
+};
+</script>
+
+<style scoped>
+.portrait {
+  width: 100%;
+  height: calc(100% - 20px);
+  /* margin: 10px 0; */
+  display: flex;
+  flex-direction: column;
+  overflow: auto;
+}
+
+.p_top {
+ width: 100%;
+ height: 60px;
+ padding: 0 90px;
+ box-sizing: border-box;
+}
+
+.p_bottom{
+  width: 100%;
+  flex: 1;
+  display: flex;
+  padding: 0 80px;
+  box-sizing: border-box;
+}
+
+.p_bottom > div {
+  margin: 0 10px;
+  /* background-color: #fff; */
+  border-radius: 5px;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+}
+.p_left {
+  width: 28.5%;
+  display: flex;
+  flex-direction: column;
+  background-color: none;
+
+}
+
+.p_l_top {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+	position: relative;
+}
+
+
+
+.p_l_top > div {
+  flex: 1;
+  border-radius: 5px;
+  /* margin: 10px 0; */
+  background-color: #fff;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  box-sizing: border-box;
+  padding: 0 30px;
+  position: relative;
+	overflow: hidden;
+}
+
+.p_l_top >div> img{
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	z-index: 1;
+	object-fit: fill;
+}
+
+.p_l_top > div > div {
+  display: flex;
+  align-items: center;
+  margin-bottom: 20px;
+	z-index: 2;
+}
+
+.p_l_top > div > div > span {
+  font-size: 22px;
+  /* font-weight: bold; */
+}
+
+.p_l_top > div > div > svg {
+  width: 20px;
+  height: 20px;
+  margin-left: 10px;
+  cursor: pointer;
+}
+
+.p_l_top > div > span {
+  font-size: 2.6em;
+  font-weight: bold;
+	z-index: 2;
+}
+
+.p_l_top > div:not(:first-child):not(:last-child) {
+  margin: 20px 0;
+}
+
+.teachingActivity {
+  background: linear-gradient(
+    290deg,
+    rgba(231, 238, 254, 0.1) 0%,
+    #e7eefe 100%
+  );
+}
+
+.teachingAndResearchActivities {
+  background: linear-gradient(
+    290deg,
+    rgba(243, 254, 231, 0.1) 0%,
+    #fef2e7 100%
+  );
+}
+
+.trainingActivity {
+  background: linear-gradient(
+    290deg,
+    rgba(231, 254, 251, 0.1) 0%,
+    #e7feef 100%
+  );
+}
+
+.p_l_bottom {
+  flex: 1;
+  margin-top: 20px;
+  border-radius: 5px;
+  background-color: #fff;
+  border: 1px solid rgba(255, 255, 255, 0.55);
+  box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
+  padding: 20px;
+  display: flex;
+  flex-direction: column;
+}
+
+.p_center {
+  width: calc(100% - 57%);
+  background-color: #fff;
+  border: 1px solid rgba(255, 255, 255, 0.55);
+  box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
+  padding: 20px;
+}
+
+.p_center>img{
+	width: 100%;
+	height: auto;
+	margin: auto;
+	transform: scaleX(-1);
+}
+
+.p_right {
+  width: 28.5%;
+  display: flex;
+  flex-direction: column;
+}
+
+.p_r_top {
+  flex: 1;
+  background-color: #fff;
+  border: 1px solid rgba(255, 255, 255, 0.55);
+  box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
+  padding: 20px;
+  border-radius: 5px;
+  display: flex;
+  flex-direction: column;
+}
+
+.p_r_bottom {
+  flex: 1;
+  background-color: #fff;
+  border: 1px solid rgba(255, 255, 255, 0.55);
+  box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
+  padding: 20px;
+  margin-top: 20px;
+  border-radius: 5px;
+  display: flex;
+  flex-direction: column;
+}
+
+.p_title {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.p_title > span {
+  font-size: 28px;
+}
+
+.p_eCharts {
+  width: 100%;
+  flex: 1;
+  margin-top: 10px;
+}
+</style>

+ 1202 - 0
src/components/pages/liyuan/page/safeTest.vue

@@ -0,0 +1,1202 @@
+<template>
+    <div class="i_body_box" style="padding: 0 90px;">
+        <backPage style="padding: 40px 0 0;" tit="安全巡查"></backPage>
+        <div class="check_nav" >
+            <!-- <div class="nav all" v-show="this.ExamineBase.length > 0" :class="{ active: type == '1' }" @click="checkType('1')">
+                年度考核
+            </div> -->
+            <div class="nav all" :class="{ active: checkTypeValue == typeListStr }" 
+            @click="changeShowType(typeListStr)">
+                全部
+            </div>
+            <div class="nav" v-for="item in typeList" :key="item.id" :class="{ active: checkTypeValue == item.id,all:['8bfa67ce-e82a-11ef-b508-005056924926','9d3289d2-e82a-11ef-b508-005056924926','a824c728-e82a-11ef-b508-005056924926','8085418b-e82a-11ef-b508-005056924926'].includes(item.id)}" 
+            @click="changeShowType(item.id,item)">{{ item.name }}</div>
+           
+        </div>
+        <div class="check_box" v-loading="loading" >
+            <!-- <examine v-if="type==1"></examine> -->
+            <div class="noneData"  v-if="!worksArray.length && type!=1" style="text-align: center; margin-top: 20px;">
+                暂无数据
+            </div>
+            <template  v-if="type!=1">
+                <div class="test_panel" v-for="(item, index) in worksArray" :key="index">
+                    <div class="test_panel_title">
+                        <div class="title" :style="{paddingLeft: (item.array.length > 0 || item.carray.length > 0) ? '0' : '30px'}" @click="openWork(index)">
+                            <span class="open" :class="{active: item.open}" v-if="item.array.length > 0 || item.carray.length > 0"></span>
+                            <el-tooltip :content="item.title" placement="top" effect="dark">
+                                <span class="titleN">{{ item.title }}</span>
+                            </el-tooltip>
+                        </div>
+                        <div class="state">
+                            <span :class="{ is: item.array.length > 0, no: !item.array.length }">{{ item.array.length > 0 ? "已完成" : "未完成" }}</span>
+                        </div>
+                        <div class="time">
+                            <span v-if="item.overtime" :class="{isDead: isDeadlinePassed(item.overtime)}">截止时间:{{ item.overtime }}</span>
+                            <span v-else></span>
+                        </div>
+                        <div class="creator" :style="{paddingRight:(!item.carray.length > 0) ? '0' : '0px'}">
+                            <el-tooltip :content="item.username" placement="top" effect="dark">
+                                <span>创建者:{{ item.username }}</span>
+                            </el-tooltip>
+                        </div>
+                        <div class="editBtn2" :style="`${item.open?'display:flex':''}`" v-if="!item.carray.length > 0">
+                            <span v-if="item.array.length === 0">去填写</span>
+                            <span v-else>再填一份</span>
+                        </div>
+                        <div @click="doTest2(item.courseid)" class="editBtn" :style="`${item.open?'display:flex':''}`" v-if="!item.carray.length > 0">
+                            <span v-if="item.array.length === 0">去填写</span>
+                            <span v-else>再填一份</span>
+                        </div>
+                    </div>
+                    <div class="test_panel_box" v-if="item.open">
+                        <div class="test_add_box"
+                            v-if="item.array">
+                            <div class="test" v-for="(test, index) in item.array" :key="test.id">
+                                <div class="time">
+                                    <span>提交记录{{item.array.length - index}}</span>
+                                </div>
+                                <!-- <img @click="deleteTest(test.id)" class="delete"
+                                    src="../../../../assets/icon/test/delete.png" alt="" /> -->
+                                <div class="utime">
+                                    <span>{{ test.utime }}</span>
+                                </div>
+                                <div class="mask">
+                                    <div @click="doTest(test.courseid, test.id)">
+                                        <span>编辑</span>
+                                    </div>
+                                    <div @click="deleteTest(test.id)" class="delete">
+                                        <span>删除</span>
+                                    </div>
+                                    <!-- <div @click="checkTest(test.courseid, test.id)">
+                                        <span></span><span>查看</span>
+                                    </div>
+                                    <div @click="copyTest(test.id)">
+                                        <span></span><span>复制</span>
+                                    </div> -->
+                                </div>
+                            </div>
+                        </div>
+                        <div class="test_add_box"
+                            v-else-if="item.carray" v-loading="!item.carray.length">
+                            <!-- <div class="courseLength" v-for="(course, index) in item.carray" :key="index" @click="doTest3(item, course)">
+                                <span class="finish" :class="{is: course.array.length}"></span>
+                                <span>{{ index+1 }}、</span>
+                                <span>{{ course.title }}</span>
+                                <span>{{ course.username }}</span>
+                            </div> -->
+                            <div class="test courseLength" v-for="(course, index) in item.carray" :key="index">
+                                <div class="time">
+                                    <el-tooltip :content="course.title+'-'+course.username" placement="top" effect="dark">
+                                        <span>{{ course.title }}-{{ course.username }}</span>
+                                    </el-tooltip>
+                                </div>
+                                <div class="finishBox" :class="{is: course.array.length}">
+                                    <span class="finish"></span>
+                                    <span v-if="course.array.length">已评分</span>
+                                    <span v-else>未评分</span>
+                                </div>
+                                <div class="utime" style="margin-left: 30px;">
+                                    <span v-if="course.array.length">{{ course.array[0].utime }}</span>
+                                    <span v-else></span>
+                                </div>
+                                <div class="mask">
+                                    <div @click="doTest3(item, course)">
+                                        <span>评分</span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </template>
+            
+        </div>
+    </div>
+</template>
+
+<script>
+import backPage from '../components/backPage.vue'
+export default {
+    
+    components:{
+        backPage
+    },
+    data() {
+        return {
+            userid: this.$route.query.userid,
+            oid: this.$route.query.oid,
+            type: "",
+            typeId:'fb2a14c5-e828-11ef-b508-005056924926',
+            typeList:[],
+            ExamineBase: [],
+            typeArray: [],
+            typeArrayCheck: [],
+            worksArray: [],
+            org: this.$route.query.org,
+            role: this.$route.query.role,
+            loading: false,
+            checkTypeValue:""
+        };
+    },
+    computed: {
+        getNum() {
+            return function (array) {
+                let _array = JSON.parse(array);
+                let num = 0;
+                _array.forEach(el => {
+                    if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+                        el.array.forEach(item => {
+                            if (item.ttype == 2 && item.array.length > 0) {
+                                item.array.forEach(item2 => {
+                                    if (item2.ttype == 1 && item2.json) {
+                                        num++;
+                                    }
+                                });
+                            } else if (item.ttype == 1 && item.json) {
+                                num++;
+                            }
+                        });
+                    } else if (el.ttype == 1 && el.json) {
+                        num++;
+                    }
+                });
+                return num;
+            };
+        },
+        getScore() {
+            return function (array) {
+                // let _array = JSON.parse(array)
+                let _score = 0;
+                let scoreArray = [];
+                for (var i = 0; i < array.length; i++) {
+                    let _array = JSON.parse(array[i].courseJson);
+                    let score = 0;
+                    for (var j = 0; j < _array.length; j++) {
+                        let el = _array[j];
+                        if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+                            for (var k = 0; k < el.array.length; k++) {
+                                let item = el.array[k];
+                                if (item.ttype == 2 && item.array.length > 0) {
+                                    for (var z = 0; z < item.array.length; z++) {
+                                        let item2 = item.array[z];
+                                        if (item2.ttype == 1 && item2.json && item2.json.score2) {
+                                            score += parseInt(item2.json.score2);
+                                        }
+                                    }
+                                } else if (item.ttype == 1 && item.json && item.json.score2) {
+                                    score += parseInt(item.json.score2);
+                                }
+                            }
+                        } else if (el.ttype == 1 && el.json && el.json.score2) {
+                            score += parseInt(el.json.score2);
+                        }
+                    }
+                    scoreArray.push(score);
+                }
+                scoreArray.forEach(el => {
+                    _score += el;
+                });
+                console.log(scoreArray);
+                return _score ? _score / scoreArray.length : 0;
+            };
+        },
+        getImg() {
+            return function (array) {
+                let _array = JSON.parse(array);
+                let _img = "";
+                s: for (var j = 0; j < _array.length; j++) {
+                    let el = _array[j];
+                    if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+                        for (var k2 = 0; k2 < el.array.length; k2++) {
+                            let item = el.array[k2];
+                            console.log(k2);
+                            if (item.ttype == 2 && item.array.length > 0) {
+                                for (var z = 0; z < item.array.length; z++) {
+                                    let item2 = item.array[z];
+                                    if (
+                                        item2.ttype == 1 &&
+                                        item2.type == 5 &&
+                                        item2.json &&
+                                        item2.json.file &&
+                                        item2.json.file.length > 0
+                                    ) {
+                                        for (var k4 = 0; k4 < item2.json.file.length; k4++) {
+                                            let ik = item2.json.file[k4];
+                                            if (ik.type == 3) {
+                                                _img = ik.url;
+                                                break s;
+                                            }
+                                        }
+                                    }
+                                }
+                            } else if (
+                                item.ttype == 1 &&
+                                item.type == 5 &&
+                                item.json &&
+                                item.json.file &&
+                                item.json.file.length > 0
+                            ) {
+                                for (var k3 = 0; k3 < item.json.file.length; k3++) {
+                                    let ik = item.json.file[k3];
+                                    if (ik.type == 3) {
+                                        _img = ik.url;
+                                        break s;
+                                    }
+                                }
+                            }
+                        }
+                    } else if (
+                        el.ttype == 1 &&
+                        el.type == 5 &&
+                        el.json &&
+                        el.json.file &&
+                        el.json.file.length > 0
+                    ) {
+                        for (var k = 0; k < el.json.file.length; k++) {
+                            let ik = el.json.file[k];
+                            if (ik.type == 3) {
+                                _img = ik.url;
+                                break s;
+                            }
+                        }
+                    }
+                }
+                return _img;
+            };
+        },
+        typeListStr(){
+          let _result = "";
+
+          if(this.typeList.length){
+            _result = this.typeList.map(i=>i.id)
+            _result.push(this.typeId);
+            _result = _result.join(',')
+          }
+
+          return _result;
+        }
+    },
+    watch:{
+      typeId(newValue){
+        this.changeShowType(newValue)
+      }
+    },
+    methods: {
+        getNavType() {
+            let params = {
+                oid: "",//this.oid
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectTestType", params)
+                .then(res => {
+                    let _data = res.data[0];
+                    console.log('_data',_data);
+                    // _data.fliter(e=>{
+
+                    // })
+                    this.typeList = _data.filter(function(item, index) {
+                        return item.pid == 'fb2a14c5-e828-11ef-b508-005056924926';
+                    });
+                    this.changeShowType(this.typeListStr)
+
+                    //  = _data.fliter(e =>{ return e.pid == 'e18d88b3-e828-11ef-b508-005056924926'})
+                    console.log('this.typeList',this.typeList);
+
+                    
+                })
+                .catch(err => {
+                    console.log(err);
+                });
+        },
+        getPageBase(type = 1) {
+            let params = {
+                typ: type,
+                org: this.org,
+                oid: this.oid
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectTestExamineBase", params)
+                .then(res => {
+                this.ExamineBase = res.data[0];
+                if(type == 1 && !res.data[0].length){
+                    this.getPageBase(2)
+                }
+                // console.log("selectTestExamineBase", res.data);
+                })
+                .catch(error => {
+                console.log(error);
+            });
+        },
+        isDeadlinePassed(deadline) {
+            let _line = new Date(deadline)
+            const currentDate = new Date();
+            return currentDate > _line;
+        },
+        checkType(type) {
+            this.type = type;
+            this.getWorks();
+        },
+        selectTestType(type) {
+            let params = {
+                oid: this.oid
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectTestType", params)
+                .then(res => {
+                    this.typeArray = res.data[0];
+                    if(type == 1){
+                        this.type = ''
+                        // if (this.typeArray.length) {
+                        //     this.type = this.typeArray[0].id;
+                        // } else {
+                        //     this.type = '0';
+                        // }
+                    }
+                    this.getWorks()
+                })
+                .catch(err => {
+                    console.error(err);
+                });
+        },
+        getWorks() {
+            this.loading = true;
+            let params = {
+                uid: this.userid,
+                typeid: this.checkTypeValue
+            };
+            this.ajax
+                .get(this.$store.state.api + "getTestWorksPerson_2type", params)
+                .then(res => {
+                    let array = res.data[0];
+                    let array2 = res.data[1];
+                    // 用于存储归类后的数据的对象
+                    let worksArray = {};
+
+                    // 遍历原始数据,根据 parentId 进行分组
+                    array2.forEach(item => {
+                        // console.log(item.chapters);
+                        worksArray[item.courseId] = {
+                            id: item.id,
+                            courseid: item.courseId,
+                            title: item.title,
+                            time: item.time,
+                            utime: item.utime,
+                            overtime: item.overtime,
+                            username: item.username,
+                            chapters: item.chapters,
+                            brief: item.brief,
+                            typeid: item.typeid,
+                            array: item.typeid == 'dda9728e-5f11-469e-89ee-aca518daf123' ? 0 : [],
+                            carray: [],
+                            open: false
+                        };
+                    });
+                    worksArray = Object.values(worksArray);
+                    worksArray.forEach(async el => {
+                        if (el.typeid == 'dda9728e-5f11-469e-89ee-aca518daf123') {
+                            let courseJson = this.returnCourseJSON(el.chapters)
+                            if(courseJson && courseJson.courses.length){
+                                let courses = courseJson.courses.join(',')
+                                let _res = await this.getAllCourse(courses)
+                                console.log(_res);
+                                let _carray = []
+                                for(var i=0;i<_res.length;i++){
+                                    _carray.push({
+                                        courseid: _res[i].courseId,
+                                        title: _res[i].title,
+                                        username: _res[i].username,
+                                        array: []
+                                    })
+                                }
+                                el.carray = _carray
+                            }
+                        }
+
+                        array.forEach(el2 => {
+                            if (el.courseid == el2.courseid && el.typeid != 'dda9728e-5f11-469e-89ee-aca518daf123') {
+                                el.array.push(el2);
+                            }
+
+                            if(el.courseid == el2.courseid && el.typeid == 'dda9728e-5f11-469e-89ee-aca518daf123'){
+                                let courseid = this.returnCourseId(el2.courseJson)
+                                for(var c = 0; c<el.carray.length;c++){
+                                    if(el.carray[c].courseid == courseid){
+                                        el.carray[c].array.push(el2);
+                                        break
+                                    }
+                                }
+                            }
+                        });
+                    });
+                    // worksArray[item.courseid].array.push(item);
+
+                    this.worksArray = worksArray;
+                    this.loading = false;
+
+                    this.$forceUpdate();
+                })
+                .catch(err => {
+                    this.loading = false;
+                    console.error(err);
+                });
+        },
+        openWork(index){
+            if(this.worksArray[index].array.length === 0 && this.worksArray[index].carray.length === 0){
+                return
+            }
+            this.worksArray[index].open = !this.worksArray[index].open
+            this.$forceUpdate()
+        },
+        returnA() {
+            this.$router.push(
+                "/testStudent?userid=" +
+                this.userid +
+                "&oid=" +
+                this.oid +
+                "&org=" +
+                this.org +
+                "&role=" +
+                this.role
+            );
+        },
+        checkTest(cid, tid) {
+            this.$router.push(
+                "/checkTest?cid=" +
+                cid +
+                "&tid=" +
+                tid +
+                "&userid=" +
+                this.userid +
+                "&oid=" +
+                this.oid +
+                "&org=" +
+                this.org +
+                "&type=3" +
+                "&role=" +
+                this.role
+            );
+        },
+        doTest(cid, tid) {
+            this.$router.push(
+                "/doTest?cid=" +
+                cid +
+                "&tid=" +
+                tid +
+                "&userid=" +
+                this.userid +
+                "&oid=" +
+                this.oid +
+                "&org=" +
+                this.org +
+                "&type=3" +
+                "&role=" +
+                this.role
+            );
+        },
+        doTest2(cid) {
+            this.$router.push(
+                "/doTest?cid=" +
+                cid +
+                "&userid=" +
+                this.userid +
+                "&oid=" +
+                this.oid +
+                "&org=" +
+                this.org +
+                "&type=3" +
+                "&role=" +
+                this.role
+            );
+        },
+        doTest3(item, course){
+            if(course.array.length){
+                this.$router.push(
+                    "/doTest?cid=" +
+                    item.courseid +
+                    "&tid=" +
+                    course.array[0].id +
+                    "&userid=" +
+                    this.userid +
+                    "&oid=" +
+                    this.oid +
+                    "&org=" +
+                    this.org +
+                    "&type=3" +
+                    "&role=" +
+                    this.role
+                );
+            }else{
+                this.$router.push(
+                    "/doTest?cid=" +
+                    item.courseid +
+                    "&userid=" +
+                    this.userid +
+                    "&oid=" +
+                    this.oid +
+                    "&org=" +
+                    this.org +
+                    "&type=3" +
+                    "&courseid=" +
+                    course.courseid +
+                    "&role=" +
+                    this.role
+                );
+            }
+        },
+        copyTest(tid) {
+            let params = [
+                {
+                    tid: tid,
+                    uid: this.userid
+                }
+            ];
+            this.ajax
+                .post(this.$store.state.api + "copyTestWorks", params)
+                .then(res => {
+                    this.$message.success("复制成功");
+                    this.getWorks();
+                })
+                .catch(err => {
+                    console.error(err);
+                });
+        },
+        deleteTest(tid) {
+            let _this = this;
+            _this
+                .$confirm("确定删除此填写的表单么?", "提示", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning"
+                })
+                .then(() => {
+                    let params = [
+                        {
+                            tid: tid
+                        }
+                    ];
+                    _this.ajax
+                        .post(_this.$store.state.api + "deleteTestCourseWorks", params)
+                        .then(res => {
+                            _this.$message.success("删除成功");
+                            _this.getWorks();
+                        })
+                        .catch(err => {
+                            console.error(err);
+                        });
+                })
+                .catch(() => {
+                    return;
+                });
+        },
+        returnCourseJSON(array) {
+            let _array = JSON.parse(array);
+            let courseJson = '';
+            s: for (var j = 0; j < _array.length; j++) {
+                let el = _array[j];
+                if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+                    for (var k2 = 0; k2 < el.array.length; k2++) {
+                        let item = el.array[k2];
+                        console.log(k2);
+                        if (item.ttype == 2 && item.array.length > 0) {
+                            for (var z = 0; z < item.array.length; z++) {
+                                let item2 = item.array[z];
+                                if (
+                                    item2.ttype == 1 &&
+                                    item2.type == 6 &&
+                                    item2.json
+                                ) {
+                                    courseJson = item2.json
+                                    break s;
+                                }
+                            }
+                        } else if (
+                            item.ttype == 1 &&
+                            item.type == 6 &&
+                            item.json
+                        ) {
+                            courseJson = item.json
+                                    break s;
+                        }
+                    }
+                } else if (
+                    el.ttype == 1 &&
+                    el.type == 6 &&
+                    el.json
+                ) {
+                    courseJson = el.json
+                                    break s;
+                }
+            }
+            return courseJson;
+        },
+        returnCourseId(array) {
+            let _array = JSON.parse(array);
+            let courseJson = '';
+            s: for (var j = 0; j < _array.length; j++) {
+                let el = _array[j];
+                if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+                    for (var k2 = 0; k2 < el.array.length; k2++) {
+                        let item = el.array[k2];
+                        console.log(k2);
+                        if (item.ttype == 2 && item.array.length > 0) {
+                            for (var z = 0; z < item.array.length; z++) {
+                                let item2 = item.array[z];
+                                if (
+                                    item2.ttype == 1 &&
+                                    item2.type == 6 &&
+                                    item2.json && item2.json.answer2
+                                ) {
+                                    courseJson = item2.json.answer2
+                                    break s;
+                                }
+                            }
+                        } else if (
+                            item.ttype == 1 &&
+                            item.type == 6 &&
+                            item.json && item.json.answer2
+                        ) {
+                            courseJson = item.json.answer2
+                                    break s;
+                        }
+                    }
+                } else if (
+                    el.ttype == 1 &&
+                    el.type == 6 &&
+                    el.json  && el.json.answer2
+                ) {
+                    courseJson = el.json.answer2
+                                    break s;
+                }
+            }
+            return courseJson;
+        },
+        async getAllCourse(id) {
+            let params = {
+                cid: id,
+            };
+            let res = await this.ajax.get(this.$store.state.api + "getCourseInfoTestAll", params)
+            return res.data[0]
+        },
+        changeShowType(value){
+            console.log('value',value);
+            
+          this.checkTypeValue = value;
+          this.getWorks();
+        }
+    },
+    mounted() {
+        // this.selectTestType(1);
+        // this.getPageBase()
+        this.getNavType()
+        
+        console.log('this.typeListStr',this.typeListStr);
+        
+        // if(this.typeListStr){
+        //   this.changeShowType(this.typeListStr)
+          // this.checkTypeValue = this.typeId
+        // }
+    },
+    // activated(){
+    //     // this.selectTestType(2);
+    //     if(this.typeListStr){
+    //       this.changeShowType(this.typeListStr)
+    //       // this.checkTypeValue = this.typeId
+    //     }
+    // },
+};
+</script>
+
+<style scoped>
+.i_body_box {
+    height: calc(100% - 10px);
+    padding: 10px 0 0;
+    box-sizing: border-box;
+}
+
+.check_nav {
+    display: flex;
+    height: 50px;
+    align-items: center;
+    padding: 0;
+    box-sizing: border-box;
+    width: 100%;
+    overflow: auto;
+}
+
+.check_nav>.nav {
+    width: 120px;
+    height: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    color: rgb(167, 167, 167);
+    /* background: #000000; */
+    cursor: pointer;
+    min-width: fit-content;
+    margin-right: 10px;
+}
+
+.check_nav>.active {
+    color: #3681fc;
+    background: rgb(248, 250, 254);
+    border-radius: 10px 10px 0 0;
+}
+
+.check_nav>.all::before,
+.check_nav>.gr::before,
+.check_nav>.md::before,
+.check_nav>.jy::before,
+.check_nav>.bj::before,
+.check_nav>.yy::before {
+    content: "";
+    display: block;
+    width: 18px;
+    height: 18px;
+    background-size: 100% 100%;
+    margin-right: 5px;
+}
+
+.check_nav>.all::before {
+
+    background-image: url('../../../../assets/icon/test/all_icon.png');
+}
+
+.check_nav>.active.all::before {
+    background-image: url('../../../../assets/icon/test/all_icon_active.png');
+}
+
+.check_nav>.gr::before {
+    background-image: url('../../../../assets/icon/test/gr_icon.png');
+}
+
+.check_nav>.active.gr::before {
+    background-image: url('../../../../assets/icon/test/gr_icon_active.png');
+}
+
+.check_nav>.md::before {
+    background-image: url('../../../../assets/icon/test/md_icon.png');
+}
+
+.check_nav>.active.md::before {
+    background-image: url('../../../../assets/icon/test/md_icon_active.png');
+}
+
+.check_nav>.jy::before {
+    background-image: url('../../../../assets/icon/test/jy_icon.png');
+}
+
+.check_nav>.active.jy::before {
+    background-image: url('../../../../assets/icon/test/jy_icon_active.png');
+}
+
+.check_nav>.yy::before {
+    background-image: url('../../../../assets/icon/test/yy_icon.png');
+}
+
+.check_nav>.active.yy::before {
+    background-image: url('../../../../assets/icon/test/yy_icon_active.png');
+}
+
+.check_nav>.bj::before {
+    background-image: url('../../../../assets/icon/test/bj_icon.png');
+}
+
+.check_nav>.active.bj::before {
+    background-image: url('../../../../assets/icon/test/bj_icon_active.png');
+}
+
+
+.check_box {
+    height: calc(100% - 130px);
+    overflow: auto;
+    padding: 0 0 20px;
+    box-sizing: border-box;
+    background: rgb(248, 250, 254);
+}
+
+.test_panel {
+    width: calc(100% - 40px);
+    margin: 20px auto 0;
+    background: #fff;
+    border-radius: 10px;
+    /* height: 300px; */
+    overflow: hidden;
+    box-shadow: 0 2px 5px 1px #0001;
+}
+
+.test_panel:hover{
+	box-shadow: 0 0 2px 1px #3681FC;
+}
+
+.test_panel:hover>.test_panel_title>.title{
+	color:#5996FD
+}
+
+.test_panel_title:hover>.editBtn{
+	display: flex;
+}
+.test_panel_title:hover>.editBtn2{
+	display: flex;
+}
+
+
+.test_panel+.test_panel {
+    margin-top: 15px;
+}
+
+.test_panel_title {
+    height: 50px;
+    display: flex;
+    align-items: center;
+    width: 100%;
+    position: relative;
+    /* justify-content: space-between; */
+    /* padding: 0 20px; */
+    box-sizing: border-box;
+    /* border-bottom: 2px solid #f0f0f0; */
+}
+
+.test_panel_title>.title {
+    display: flex;
+    align-items: center;
+    width: 300px;
+    margin-left: 20px;
+    cursor: pointer;
+}
+
+.test_panel_title>.title>.open{
+    width: 20px;
+    height:20px;
+    margin-right: 10px;
+    background-image: url('../../../../assets/icon/test/chevron-right.png');
+    background-size: 100% 100%;
+    cursor:pointer;
+    transition:all .3s;
+    opacity: .5;
+}
+
+.test_panel_title>.title>.open.active{
+    transform: rotate(90deg);
+    opacity: 1;
+}
+
+.test_panel_title>.state{
+    margin-left: auto;
+    min-width: fit-content;
+}
+
+.test_panel_title>.state > span {
+    font-size: 14px;
+    padding: 5px 8px;
+    border-radius: 5px;
+    margin-right: 0;
+}
+
+.test_panel_title>.state>.is:nth-child(1) {
+    color: #17C469;
+    background: #EFFCF5;
+    border: 1px solid #EFFCF5;
+}
+
+.test_panel_title>.state>.no:nth-child(1) {
+    color: #3681FC;
+    background: #E0EAFB;
+    border: 1px solid #E0EAFB;
+}
+
+.test_panel_title>.title>.titleN {
+    font-size: 18px;
+    font-weight: 600;
+    max-width: calc(100% - 20px - 10px);
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.test_panel_title>.time {
+    font-size: 16px;
+    color: #a1a1a1;
+    min-width: 160px;
+    margin: 0 30px;
+}
+
+.test_panel_title>.creator {
+    font-size: 16px;
+    color: #a1a1a1;
+    max-width: 160px;
+    min-width: 160px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.test_panel_title>.editBtn {
+    font-size: 16px;
+    color: #fff;
+    background: #3681fc;
+    height: 100%;
+    display: none;
+    align-items: center;
+    padding: 0 15px;
+    cursor: pointer;
+    position: absolute;
+    right: 0;
+}
+.test_panel_title>.editBtn2 {
+    font-size: 16px;
+    color: #fff;
+    background: #3681fc;
+    height: 100%;
+    display: none;
+    align-items: center;
+    padding: 0 15px;
+    cursor: pointer;
+}
+
+.test_panel_title>.time>span+span {
+    margin-left: 10px;
+}
+
+.test_panel_box {
+    border-top: 2px solid #f0f0f0;
+    width: 100%;
+    display: flex;
+    align-items: center;
+    padding: 5px 20px;
+    box-sizing: border-box;
+}
+
+.test_panel_box>.detail {
+    width: calc(100% - 350px - 20px);
+    margin-right: 20px;
+    color: #a1a1a1;
+    font-size: 14px;
+    line-height: 24px;
+    word-break: break-all;
+    display: -webkit-box;
+    -webkit-line-clamp: 4;
+    -webkit-box-orient: vertical;
+    overflow: hidden;
+}
+
+.test_panel_box>.panel {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 350px;
+    min-width: 350px;
+}
+
+.test_panel_box>.panel>.score {
+    height: 110px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+    border: 1px solid #dbdbdb;
+    background: rgb(252, 252, 252);
+    width: 120px;
+    border-radius: 5px;
+}
+
+.test_panel_box>.panel>.score:nth-child(1) {
+    display: flex;
+}
+
+.test_panel_box>.panel>.score>div:nth-child(1)>span:nth-child(1) {
+    font-size: 30px;
+    font-weight: 700;
+}
+
+.test_panel_box>.panel>.score>div:nth-child(1)>span:nth-child(2) {
+    margin-left: 5px;
+}
+
+.test_panel_box>.panel>.score>div:nth-child(2) {
+    font-size: 14px;
+    margin-top: 10px;
+    color: #a1a1a1;
+}
+
+.test_panel_box>.panel>.btn {
+    height: 100px;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+}
+
+.test_panel_box>.panel>.btn>div {
+    display: flex;
+    color: rgb(69, 141, 255);
+    align-items: center;
+    cursor: pointer;
+    font-size: 14px;
+}
+
+/* .test_panel_box > .panel >.btn > div + div{
+      margin: 15px 0 0 0;
+    } */
+.test_panel_box>.panel>.btn>div>span:nth-child(1) {
+    display: block;
+    width: 13px;
+    height: 13px;
+    background-size: 100% 100%;
+    margin-right: 7px;
+}
+
+.test_panel_box>.panel>.btn>div:nth-child(1)>span:nth-child(1) {
+    background-image: url('../../../../assets/icon/test/edit_icon.png');
+}
+
+.test_panel_box>.panel>.btn>div:nth-child(2)>span:nth-child(1) {
+    background-image: url('../../../../assets/icon/test/check_icon.png');
+}
+
+.test_panel_box>.panel>.btn>div:nth-child(3)>span:nth-child(1) {
+    background-image: url('../../../../assets/icon/test/paste_icon.png');
+}
+
+.test_add_box {
+    width: 100%;
+    box-sizing: border-box;
+}
+
+
+.test_add_box>.test {
+    width: 100%;
+    height: 40px;
+    border-radius: 5px;
+    display: flex;
+    align-items: center;
+}
+
+
+.test_add_box>.test>img {
+    width: 100%;
+    height: 100%;
+    object-fit: cover;
+    border-radius: 5px;
+}
+
+.test_add_box>.test+.test {
+    /* margin-left: 10px; */
+}
+
+.test_add_box>.test>.time {
+    display: flex;
+    /* justify-content: center; */
+    align-items: center;
+    font-size: 14px;
+    width: 300px;
+    padding-left: 30px;
+    box-sizing: border-box;
+}
+
+.test_add_box>.test>.time>span {
+    /* margin-top: 5px; */
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+.test_add_box>.test>.utime {
+    font-size: 14px;
+    width: 160px;
+    min-width: 160px;
+    margin: 0 30px 0 auto;
+}
+.test_add_box>.test>.mask {
+    display: flex;
+    align-items: center;
+    padding-right: 58px;
+    max-width: 160px;
+    min-width: 160px;
+}
+
+.test_add_box>.test>.delete {
+    position: absolute;
+    width: 20px;
+    height: 20px;
+    right: -5px;
+    top: -5px;
+    cursor: pointer;
+    z-index: 2;
+    display: none;
+}
+
+.test_add_box>.test>.mask>div {
+    display: flex;
+    align-items: center;
+    cursor: pointer;
+    font-size: 14px;
+    color: #3681FC;
+}
+
+.test_add_box>.test>.mask>.delete {
+    color: #EE3E3E;
+}
+
+.test_add_box>.test>.mask>div+div {
+    /* margin: 10px 0 0 0; */
+    margin-left: 15px;
+}
+
+/*
+.test_add_box>.test>.mask>div>span:nth-child(1) {
+  display: block;
+  width: 13px;
+  height: 13px;
+  background-size: 100% 100%;
+  margin-right: 7px;
+}
+
+.test_add_box>.test>.mask>div:nth-child(1)>span:nth-child(1) {
+  background-image: url('../../../../assets/icon/test/edit_icon.png');
+}
+
+.test_add_box>.test>.mask>div:nth-child(2)>span:nth-child(1) {
+  background-image: url('../../../../assets/icon/test/check_icon.png');
+}
+
+.test_add_box>.test>.mask>div:nth-child(3)>span:nth-child(1) {
+  background-image: url('../../../../assets/icon/test/paste_icon.png');
+} */
+
+.bgColor {
+    background: #466b99;
+}
+
+/* .courseLength{
+    width: 100%;
+    cursor: pointer;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+}
+.courseLength > span + span{
+    margin-left: 10px;
+} */
+.courseLength > .finishBox {
+    display: flex;
+    color: #a1a1a1;
+    font-size: 14px;
+    margin-left: auto;
+    align-items: center;
+}
+.courseLength > .finishBox > .finish{
+    width: 15px;
+    height: 15px;
+    background-image: url('../../../../assets/icon/test/icon_course.png');
+    background-size: 100% 100%;
+    margin-right: 5px;
+}
+.courseLength > .finishBox.is > .finish{
+    background-image: url('../../../../assets/icon/test/icon_course_check.png');
+}
+.courseLength > .finishBox.is{
+    color: #000
+}
+
+.isDead{
+    color:#EE3E3E;
+}
+</style>

+ 1542 - 0
src/components/pages/liyuan/page/student.vue

@@ -0,0 +1,1542 @@
+<template>
+  <div class="pb_content" style="background: unset">
+    <backPage  v-if="gotype" tit="学生管理"></backPage>
+
+    <div class="sm_box">
+
+      <div class="sm_right">
+        <div class="pb_content_body" style="
+        background: #fff;
+        padding: 0px 25px;
+        box-sizing: border-box;
+        border-radius: 5px;
+      ">
+          <div class="pb_head">
+            <div>
+              <span>学生管理</span>
+
+            </div>
+          </div>
+          <div class="student_head">
+            <div class="head_left">
+              <el-input v-model="sPhoneUser" class="student_input" placeholder="请输入用户名"></el-input>
+              <el-select v-model="cid" placeholder="请选择班级" class="student_input" @change="searchStudent">
+                <el-option label="所有人" value=""></el-option>
+                <el-option v-for="(item, index) in classJuri" :key="index" :label="item.name"
+                  :value="item.id"></el-option>
+              </el-select>
+              <el-button class="student_button" @click="searchStudent" type="primary">查询</el-button>
+            </div>
+            <div class="head_right">
+              <el-button @click="addStudent" type="primary" class="student_button">添加学生</el-button>
+              <el-upload class="upload-demo newCss" :http-request="handleChange" :on-remove="handleRemove" action="#"
+                :file-list="fileListUpload" accept=".xlsx">
+                <el-button size="primary" type="primary">批量添加</el-button>
+                <div slot="tip" class="el-upload__tip" style="margin-left: 10px">
+                  只能上传xlsx文件,且不超过500kb
+                </div>
+              </el-upload>
+              <!-- <el-button @click="exportExcel">导出学生</el-button> -->
+              <div @click="getExcel">xls 上传样例</div>
+            </div>
+          </div>
+        </div>
+        <div class="pb_content_body">
+          <div class="student_table">
+            <el-table ref="table" :data="tableData" border :height="tableHeight" :fit="true" v-loading="isLoading"
+              style="width: 100%" :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }"
+              :row-class-name="tableRowClassName">
+              <el-table-column label="姓名" min-width="10" align="center">
+                <template slot-scope="scope">
+                  <div class="userImg">
+                    <div class="tx">
+                      <img :src="scope.row.headportrait != null
+                        ? scope.row.headportrait
+                        : tx
+                        " alt />
+                    </div>
+                    <div style="
+                      width: 150px;
+                      text-align: left;
+                      white-space: nowrap;
+                      overflow: hidden;
+                      text-overflow: ellipsis;
+                    ">
+                      {{ scope.row.name }}
+                    </div>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="学生账号" min-width="15" align="center">
+                <template slot-scope="scope">
+                  <div>{{ scope.row.un ? scope.row.un : "" }}</div>
+                </template>
+              </el-table-column>
+              <!-- <el-table-column label="电话" min-width="15" align="center">
+              <template slot-scope="scope">
+                <div>{{scope.row.phonenumber ? scope.row.phonenumber : "" }}</div>
+              </template>
+            </el-table-column> -->
+              <!-- <el-table-column prop="studentid" label="学号" min-width="10" align="center"></el-table-column> -->
+              <!-- <el-table-column
+              prop="school"
+              label="学校"
+              min-width="30"
+              align="center"
+            >
+            </el-table-column>-->
+              <el-table-column prop="classname2" label="班级" min-width="15" align="center">
+              </el-table-column>
+              <el-table-column label="操作" width="250px">
+                <template slot-scope="scope">
+                  <div class="btnBox">
+                    <el-button class="de_button" type="primary" size="small" style="
+                      width: auto;
+                      padding: 5px !important;
+                      line-height: 15px;
+                    " @click="iniPassword(scope.row.userid)">初始化密码</el-button>
+                    <el-button class="de_button" type="primary" size="small"
+                      @click="updateStudentA(scope.row)">修改</el-button>
+                    <div class="delete">
+                      <img src="../../../../assets/remove.png" alt
+                        @click="deleteStudent(scope.row.userid, scope.row.state)" />
+                    </div>
+                  </div>
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+          <div class="student_page">
+            <el-pagination background layout="prev, pager, next" :page-size="10" :total="total" v-if="page"
+              @current-change="handleCurrentChange"></el-pagination>
+          </div>
+        </div>
+      </div>
+    </div>
+    <el-dialog :visible.sync="dialogVisible" :append-to-body="true" width="700px" :before-close="handleClose"
+      class="add_student">
+      <div slot="title" class="header-title">
+        <div class="logoImg">
+          <img src="../../../../assets/logo.png" alt />
+        </div>
+        <div class="title_add_student">添加学生</div>
+      </div>
+      <el-form>
+        <el-form-item label="学生姓名" :label-width="formLabelWidth">
+          <span>
+            <el-input placeholder="请输入学生姓名" clearable v-model="sName" class="add_input"></el-input>
+          </span>
+        </el-form-item>
+        <!-- <el-form-item label="学生学号" :label-width="formLabelWidth">
+          <span>
+            <el-input
+              placeholder="请输入学生学号"
+              clearable
+              v-model="sId"
+              class="add_input"
+            ></el-input>
+          </span>
+        </el-form-item>
+        <el-form-item label="学生手机号" :label-width="formLabelWidth">
+          <span>
+            <el-input
+              placeholder="请输入学生手机号"
+              clearable
+              v-model="sPhone"
+              class="add_input"
+            ></el-input>
+          </span>
+        </el-form-item> -->
+        <el-form-item label="学生账号" :label-width="formLabelWidth">
+          <span>
+            <el-input placeholder="请输入学生账号" clearable v-model="sMail" class="add_input"></el-input>
+          </span>
+        </el-form-item>
+        <el-form-item label="所属学校" :label-width="formLabelWidth">
+          <el-input disabled style="width: 300px" v-model="schoolName"></el-input>
+        </el-form-item>
+        <el-form-item label="班级" :label-width="formLabelWidth">
+          <el-select multiple collapse-tags v-model="sByClass" placeholder="请选择班级" filterable>
+            <el-option v-for="(item, index) in classJuri" :key="index" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <div style="text-align: center; color: #adb3b7">
+          注:添加学生的账号密码为Coco1234
+        </div>
+      </el-form>
+      <span slot="footer" class="dialog-footer flex">
+        <el-button class="right" @click="insertStudent">确认</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="dialogVisibleUpdate" :append-to-body="true" width="700px" :before-close="handleClose"
+      class="add_student">
+      <div slot="title" class="header-title">
+        <div class="logoImg">
+          <img src="../../../../assets/logo.png" alt />
+        </div>
+        <div class="title_add_student">修改学生</div>
+      </div>
+      <el-form>
+        <el-form-item label="学生名称" :label-width="formLabelWidth">
+          <span>
+            <el-input placeholder="请输入学生姓名" clearable v-model="userinfo.name" class="add_input"></el-input>
+          </span>
+        </el-form-item>
+        <!-- <el-form-item label="学生学号" :label-width="formLabelWidth">
+          <span>
+            <el-input placeholder="请输入学生学号" clearable v-model="userinfo.studentid" class="add_input"></el-input>
+          </span>
+        </el-form-item>
+        <el-form-item label="学生手机号" :label-width="formLabelWidth">
+          <span>
+            <el-input placeholder="请输入学生手机号" clearable v-model="userinfo.phonenumber" class="add_input"></el-input>
+          </span>
+        </el-form-item> -->
+        <el-form-item label="学生账号" :label-width="formLabelWidth">
+          <span>
+            <el-input placeholder="请输入学生账号" clearable v-model="userinfo.un" class="add_input"></el-input>
+          </span>
+        </el-form-item>
+        <el-form-item label="所属学校" :label-width="formLabelWidth">
+          <el-input disabled style="width: 300px" v-model="schoolName"></el-input>
+        </el-form-item>
+        <el-form-item label="班级" :label-width="formLabelWidth">
+          <el-select multiple collapse-tags v-model="userinfo.classid" placeholder="请选择班级">
+            <el-option v-for="(item, index) in classJuri" :key="index" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <div style="text-align: center; color: #adb3b7">
+          注:添加学生的账号密码为Coco1234
+        </div>
+      </el-form>
+      <span slot="footer" class="dialog-footer flex">
+        <el-button class="right" @click="updateStudent">修改</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import $ from "jquery";
+import pinyin from "../../../../../node_modules/js-pinyin/index";
+import { myMixin } from "@/mixins/mixin.js"
+import backPage from "../components/backPage.vue";
+
+export default {
+  mixins: [ myMixin ],
+  components: {
+    backPage
+  },
+  data() {
+    return {
+      gotype:sessionStorage.getItem('gotype'),
+      tableHeight: "500px",
+      isLoading: false,
+      formLabelWidth: "100px",
+      tableData: [],
+      dialogVisible: false,
+      dialogVisibleUpdate: false,
+      userinfo: {},
+      userinfoA: {},
+      sName: "",
+      sPhone: "",
+      sId: "",
+      schoolName: "",
+      // sBySchool: [],
+      // sBySchoolName:"",
+      sByClass: "",
+      sMail: "",
+      schoolJuri: [],
+      classJuri: [],
+      fileListUpload: [],
+      page: 1,
+      total: 0,
+      sPhoneUser: "",
+      userid: this.$route.query.userid,
+      oid: this.$route.query.oid,
+      org: this.$route.query.org,
+      role: this.$route.query.role,
+      cid: "",
+      tx: require("../../../../assets/avatar.png"),
+      userSuffix: "",
+      schoolChar: "",
+    };
+  },
+  mounted() {
+    this.$nextTick(function () {
+      this.getUser()
+      this.tableHeight =
+        window.innerHeight - this.$refs.table.$el.offsetTop - 200;
+      if (this.tableHeight <= 530) {
+        this.tableHeight = 530;
+      }
+      // 监听窗口大小变化
+      let self = this;
+      window.onresize = function () {
+        self.tableHeight =
+          window.innerHeight - self.$refs.table.$el.offsetTop - 200;
+        if (self.tableHeight <= 530) {
+          self.tableHeight = 530;
+        }
+      };
+    });
+  },
+  methods: {
+    goTo(path) {
+      this.$router.push(path);
+    },
+    getUser() {
+      let params = {
+        userid: this.userid
+      }
+      this.ajax
+        .get(this.$store.state.api + "selectUser", params)
+        .then((res) => {
+          this.userSuffix = res.data[0][0].accountNumber.split("@")[1]
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    tableRowClassName({ row, rowIndex }) {
+      if ((rowIndex + 1) % 2 === 0) {
+        return "even_row";
+      } else {
+        return "";
+      }
+    },
+    searchStudent() {
+      this.page = 1;
+      this.getStudent();
+    },
+    addStudent() {
+      this.dialogVisible = true;
+      (this.sName = ""), (this.sPhone = ""), (this.sByClass = ""), this.sMail;
+      this.getClass();
+      // this.getSchool();
+    },
+    handleClose(done) {
+      done();
+    },
+    getExcel(res) {
+      require.ensure([], () => {
+        const { export_json_to_excel } = require("../../../../common/Export2Excel");
+        const tHeader = ["学生姓名", "学生账号", "班级"];//"学号", "学生手机号", 
+        const data = [];
+        export_json_to_excel(tHeader, data, "上传学生样例");
+      });
+    },
+    handleCurrentChange(val) {
+      this.page = val;
+      this.getStudent();
+    },
+    time() {
+      if (!this.now) {
+        this.now = new Date().getTime();
+        return true;
+      } else {
+        let time = new Date().getTime();
+        if (time - this.now > 3000) {
+          this.now = time;
+          return true;
+        } else {
+          return false;
+        }
+      }
+    },
+    //新增学生
+    insertStudent() {
+      this.dialogVisible = true;
+      if (this.sName === "") {
+        this.$message.error("学生姓名不能为空");
+        return;
+      } else if (this.sByClass === "") {
+        this.$message.error("请为学生选择班级");
+        return;
+      } else if (
+        this.sPhone != "" &&
+        !/^[1][3,4,5,7,8][0-9]{9}$/.test(this.sPhone)
+      ) {
+        this.$message.error("手机号格式不正确");
+        return;
+      } else if (
+        // !/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(this.sMail)
+        this.sMail === ""
+      ) {
+        // this.$message.error("邮箱格式不正确");
+        this.$message.error("学生账号不能为空");
+        return;
+      }
+
+      // else if (this.sId === "") {
+      //   this.$message.error("学生学号不能为空");
+      //   return;
+      // } else if (this.sPhone === "") {
+      //   this.$message.error("学生手机号不能为空");
+      //   return;
+      // }
+      let mail = '';
+      if(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(this.sMail)){
+        mail = this.sMail;
+      }else{
+        if(this.org != "" && this.org != "null"  && this.org != undefined && this.org && this.schoolChar){
+          mail = this.sMail + "@" + this.schoolChar + '.' + this.userSuffix
+        }else {
+          mail = this.sMail + "@" + this.userSuffix
+        }
+        // mail = this.sMail + "@" + this.userSuffix
+      }
+      if (this.time()) {
+        // let params = { un: this.sPhone };
+        // this.ajax
+        //   .get(this.$store.state.api + "findPhone", params)
+        //   .then((res) => {
+        //     if (res.data[0].length > 0) {
+        //       this.$message.error("此学生手机号码已被注册");
+        //     } else {
+        let params = { un: mail };
+        this.ajax
+          .get(this.$store.state.api + "findMail", params)
+          .then((res) => {
+            if (res.data[0].length > 0) {
+              this.$message.error("此学生账号已被注册");
+            } else {
+              // let params = { un: this.sId };
+              // this.ajax
+              //   .get(this.$store.state.api + "findSid", params)
+              //   .then((res) => {
+              // if (res.data[0].length > 0) {
+              //   this.$message.error("此学生学号已被注册");
+              // } else {
+              this.add_Student();
+              // }
+              // })
+              // .catch((err) => {
+              //   console.error(err);
+              // });
+            }
+          })
+          .catch((err) => {
+            console.error(err);
+          });
+        // }
+        // })
+        // .catch((err) => {
+        //   console.error(err);
+        // });
+      }
+    },
+    add_Student() {
+      let mail = '';
+      if(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(this.sMail)){
+        mail = this.sMail;
+      }else{
+        if(this.org != "" && this.org != "null"  && this.org != undefined && this.org && this.schoolChar){
+          mail = this.sMail + "@" + this.schoolChar + '.' + this.userSuffix
+        }else {
+          mail = this.sMail + "@" + this.userSuffix
+        }
+      }
+      let params = [
+        {
+          username: mail,
+          userpassword: 'Coco1234',
+          alias: this.sName,
+          oid: this.oid,
+          ph: this.sPhone,
+          sid: this.sId,
+          cid: this.sByClass.join(","),
+          org: this.org,
+        },
+      ];
+      this.ajax
+        .post(this.$store.state.api + "batchRegistrationOrg", params)
+        .then((res) => {
+          // console.log(res.data.uid, res.data.ph, res.data.oid, res.data.cid);
+          // this.isLoading = false;
+
+          // let params = [
+          //   {
+          //     userid: res.data.uid,
+          //     username: this.sName,
+          //     sid: this.sId,
+          //     type: 2,
+          //     oid: res.data.oid,
+          //     phone: res.data.ph,
+          //     cid: res.data.cid,
+          //     intro: "",
+          //     sex: "0",
+          //     org: this.org,
+          //   },
+          // ];
+          // this.ajax
+          //   // .post(this.$store.state.api + "updateUser", params)
+          //   .post(this.$store.state.api + "updateUserByEduOrg", params)
+          //   .then((res) => {
+          //     console.log(res);
+          //   })
+          //   .catch((err) => {
+          //     console.error(err);
+          //   });
+          this.$message({
+            message: "新增成功",
+            type: "success",
+          });
+
+          this.dialogVisible = false;
+          this.sPhone = "";
+          this.sName = "";
+          // this.sBySchool = [];
+          this.sByClass = [];
+          this.sMail = "";
+          this.getStudent();
+          this.addOp3('1', "", { type: "student_user_add" }, "success")
+
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          this.addOp3('1', "", { type: "student_user_add" }, err)
+
+          this.$message({
+            message: "新增失败",
+            type: "error",
+          });
+          console.error(err);
+        });
+    },
+    //获取班级列表
+    getClass() {
+      this.isLoading = true;
+      let params = {
+        oid: this.oid,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectClassBySchool", params)
+        .then((res) => {
+          this.isLoading = false;
+          this.classJuri = res.data[0];
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+    // getSchool() {
+    // 	this.isLoading = true;
+    // 	let params = {
+    // 		page: this.page,
+    // 	};
+    // 	this.ajax
+    // 		.get(this.$store.state.api + "selectOrg", params)
+    // 		.then((res) => {
+    // 			this.isLoading = false;
+    // 			this.schoolJuri = res.data[0];
+    // 		})
+    // 		.catch((err) => {
+    // 			this.isLoading = false;
+    // 			console.error(err);
+    // 		});
+    // },
+    getStudent() {
+      this.isLoading = true;
+      let params = {
+        oid: this.oid,
+        cid: this.cid,
+        cu: "",
+        cn: this.sPhoneUser,
+        page: this.page,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectStudent2", params)
+        .then((res) => {
+          this.isLoading = false;
+          this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
+          this.tableData = res.data[0];
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+    handleChange(file) {
+      this.fileTemp = file.file;
+      if (this.fileTemp) {
+        if (
+          this.fileTemp.type ==
+          "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
+          this.fileTemp.type == "application/vnd.ms-excel"
+        ) {
+          this.importCount = 1;
+          this.importfxx(this.fileTemp);
+          this.addOp3('1', "", { type: "student_user_adds" }, "success")
+        } else {
+          this.addOp3('1', "", { type: "student_user_adds" }, "附件格式错误")
+          this.$message({
+            type: "warning",
+            message: "附件格式错误,请删除后重新上传!",
+          });
+        }
+      } else {
+        this.$message({
+          type: "warning",
+          message: "请上传附件!",
+        });
+      }
+    },
+    handleRemove(file, fileList) {
+      this.fileTemp = null;
+    },
+    exportExcel() {
+      try {
+        let params = {
+          oid: this.oid,
+        };
+        this.ajax
+          .get(this.$store.state.api + "selectUserBySchool", params)
+          .then((res) => {
+            var res = res.data[0];
+            //如果value的json字段的key值和想要的headers值不一致时,可做如下更改
+            //将和下面的Object.fromEntries结合,将json字段的key值改变为要求的excel的header值
+            var array = [];
+            for (var i = 0; i < res.length; i++) {
+              var _json = {};
+              _json["用户名"] = res[i].username;
+              _json["姓名"] = res[i].alias ? res[i].alias : "";
+              _json["班级"] = res[i].classid ? res[i].classid : "";
+              array.push(_json);
+            }
+
+            var XLSX = require("xlsx");
+            const workbook = XLSX.utils.book_new(); //创建一个新的工作簿对象
+            let ws = XLSX.utils.json_to_sheet(array); //将json对象数组转化成工作表
+            ws["!cols"] = [
+              //设置每一列的宽度
+              { wch: 50 },
+              { wch: 50 },
+              { wch: 50 },
+            ];
+            XLSX.utils.book_append_sheet(workbook, ws, "sheet1"); //把sheet添加到workbook里,第三个参数是sheet名
+            XLSX.writeFile(workbook, "学生信息.xlsx");
+            // const wopts = { bookType: "xlsx", bookSST: false, type: "array" };//写入的样式bookType:输出的文件类型,type:输出的数据类型,bookSST: 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
+            // const wbout = XLSX.write(workbook, wopts);// 浏览器端和node共有的API,实际上node可以直接使用xlsx.writeFile来写入文件,但是浏览器没有该API
+            // FileSaver.saveAs(new Blob([wbout], { type: "application/octet-stream" }), `${title} demo.xlsx`);//保存文件
+            this.$message({
+              message: "导出成功",
+              type: "success",
+            });
+          })
+          .catch((err) => {
+            console.error(err);
+          });
+      } catch (e) {
+        console.log(e, e.stack);
+      }
+    },
+    importfxx(obj) {
+      const loading = this.$loading.service({
+        background: "rgba(255, 255, 255, 0.7)",
+        target: document.body,
+      });
+      var _$ = $;
+      this.importCount++;
+      let _this = this;
+      // 通过DOM取文件数据
+      this.file = obj;
+      var rABS = false; //是否将文件读取为二进制字符串
+      var f = this.file;
+      var reader = new FileReader();
+      //if (!FileReader.prototype.readAsBinaryString) {
+      FileReader.prototype.readAsBinaryString = function (f) {
+        var binary = "";
+        var rABS = false; //是否将文件读取为二进制字符串
+        var pt = this;
+        var wb; //读取完成的数据
+        var outdata;
+        var reader = new FileReader();
+        reader.onload = function (e) {
+          var bytes = new Uint8Array(reader.result);
+          var length = bytes.byteLength;
+          for (var i = 0; i < length; i++) {
+            binary += String.fromCharCode(bytes[i]);
+          }
+          var XLSX = require("xlsx");
+          if (rABS) {
+            wb = XLSX.read(btoa(fixdata(binary)), {
+              //手动转化
+              type: "base64",
+            });
+          } else {
+            wb = XLSX.read(binary, {
+              type: "binary",
+            });
+          }
+          outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); //outdata就是你想要的东西
+          this.da = [...outdata];
+          let arr = [];
+          this.da.map((v) => {
+            let obj = {};
+            let a = "";
+            var num = "";
+            for (var cj = 0; cj < 3; cj++) {
+              num += Math.floor(Math.random() * 10);
+            }
+            // a =
+            //   pinyin.getFullChars(v["学生姓名"]).toLowerCase() +
+            //   num +
+            //   "@cocorobo.cc";
+             a =
+              pinyin.getFullChars(v["学生姓名"]).toLowerCase() +
+              num + _this.userSuffix;
+            obj.sId = v["学号"];
+            obj.name = v["学生姓名"];
+            // obj.mail = v["学生账号"] ? v["学生账号"] : a;
+            // console.log('v["学生账号"]',v["学生账号"]==true,v["学生账号"]);
+            if (v["学生账号"]) {
+              if(/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(v["学生账号"])){
+                obj.mail = v["学生账号"];
+              }else{
+                if(_this.org != "" && _this.org != "null"  && _this.org != undefined && _this.org && _this.schoolChar){
+                  obj.mail = v["学生账号"] + "@" + _this.schoolChar + '.' + _this.userSuffix
+                }else {
+                  obj.mail = v["学生账号"] + "@" + _this.userSuffix
+                }
+                // obj.mail = v["学生账号"] + "@" + _this.userSuffix
+              }
+              
+            }else{
+              obj.mail = a;
+            }
+            obj.phone = v["学生手机号"];
+            obj.class = v["班级"];
+            arr.push(obj);
+          });
+          console.log(arr);
+          if(arr.length > 70){
+            _this.$message.error("限制上传学生数量不能超过70个");
+            _this.fileListUpload = [];
+            loading.close();
+            return;
+          }
+          let _b = 1;
+          for (var i = 0; i < arr.length; i++) {
+            let item = arr[i];
+            if (item.class === "") {
+              _b = 2;
+              _this.$message.error("学生班级不能为空,请重新上传");
+              break;
+            } else if (item.name === "") {
+              _b = 2;
+              _this.$message.error("学生姓名不能为空,请重新上传");
+              break;
+            } else if (item.sId === "") {
+              _b = 2;
+              _this.$message.error("学生学号不能为空,请重新上传");
+            }
+            // else if (item.phone === "") {
+            //   _b = 1;
+            //   _this.$message.error("学生手机号不能为空,请重新上传");
+            //   break;
+            // } else if (!/^[1][3,4,5,7,8][0-9]{9}$/.test(item.phone)) {
+            //   _b = 1;
+            //   _this.$message.error("有学生手机号格式不正确,请重新上传");
+            //   break;
+            // }
+            else if (item.mail === "") {
+              _b = 2;
+              _this.$message.error("学生账号不能为空,请重新上传");
+              break;
+            } else if (
+              !/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(
+                item.mail
+              )
+            ) {
+              _b = 2;
+              _this.$message.error("有学生账号格式不正确,请重新上传");
+              break;
+            }
+            //#region 
+            //  else if (item.school === "") {
+            // 	_b = 1;
+            // 	_this.$message.error("学生学校不能为空,请重新上传");
+            // 	break;
+            // }
+            // else if (item.sex === "") {
+            // 	_b = 1;
+            // 	_this.$message.error("学生性别不能为空,请重新上传");
+            // 	break;
+            // }
+            // if (item.class != "") {
+            //   let _a;
+            //   let params = {
+            //     className: item.class,
+            //   };
+
+            //   _$.ajax({
+            //     url: _this.$store.state.api + "selectC", //url路径
+            //     type: "GET", //GET
+            //     async: false, //或false,是否异步
+            //     data: params,
+            //     timeout: 5000, //超时时间
+            //     dataType: "json", //返回的数据格式:
+            //     beforeSend: function (xhr) {},
+            //     success: function (res, textStatus, jqXHR) {
+            //       if (res[0].length == 0) {
+            //         _a = 1;
+            //         _this.$message.error(
+            //           "有学生班级不存在,请去添加后并重新上传"
+            //         );
+            //       } else {
+            //         item.classid = res[0][0].id;
+            //       }
+            //     },
+            //     error: function (xhr, textStatus) {
+            //       console.log(textStatus);
+            //     },
+            //     complete: function () {},
+            //   });
+            //   if (_a == 1) {
+            //     _b = 1;
+            //     break;
+            //   }
+            // }
+            // if (item.school != "") {
+            // 	let _a;
+            // 	let params = {
+            // 		schoolName: item.school,
+            // 	};
+
+            // 	_$.ajax({
+            // 		url: _this.$store.state.api + "selectS", //url路径
+            // 		type: "GET", //GET
+            // 		async: false, //或false,是否异步
+            // 		data: params,
+            // 		timeout: 5000, //超时时间
+            // 		dataType: "json", //返回的数据格式:
+            // 		beforeSend: function (xhr) {},
+            // 		success: function (res, textStatus, jqXHR) {
+            // 			if (res[0].length == 0) {
+            // 				_a = 1;
+            // 				_this.$message.error(
+            // 					"有学生学校不存在,请去添加后并重新上传"
+            // 				);
+            // 			} else {
+            // 				item.schoolid = res[0][0].id;
+            // 			}
+            // 		},
+            // 		error: function (xhr, textStatus) {
+            // 			console.log(textStatus);
+            // 		},
+            // 		complete: function () {},
+            // 	});
+            // 	if (_a == 1) {
+            // 		_b = 1;
+            // 		break;
+            // 	}
+            // }
+            //   for (var k = 0; k < arr.length; k++) {
+            //     if (item.phone != "") {
+            //       let params = { un: item.phone };
+            //       let _a;
+            //       _$.ajax({
+            //         url: _this.$store.state.api + "findPhone", //url路径
+            //         type: "GET", //GET
+            //         async: false, //或false,是否异步
+            //         data: params,
+            //         timeout: 5000, //超时时间
+            //         dataType: "json", //返回的数据格式:
+            //         beforeSend: function (xhr) {},
+            //         success: function (res, textStatus, jqXHR) {
+            //           if (res[0].length > 0) {
+            //             _this.$message.error("有学生手机号码已被注册");
+            //             _a = 1;
+            //           }
+            //         },
+            //         error: function (xhr, textStatus) {
+            //           console.log(textStatus);
+            //         },
+            //         complete: function () {},
+            //       });
+            //       if (_a == 1) {
+            //         _b = 1;
+            //         break;
+            //       }
+            //     }
+            //     if (item.mail != "") {
+            //       let params = { un: item.mail };
+            //       let _a;
+            //       _$.ajax({
+            //         url: _this.$store.state.api + "findMail", //url路径
+            //         type: "GET", //GET
+            //         async: false, //或false,是否异步
+            //         data: params,
+            //         timeout: 5000, //超时时间
+            //         dataType: "json", //返回的数据格式:
+            //         beforeSend: function (xhr) {},
+            //         success: function (res, textStatus, jqXHR) {
+            //           if (res[0].length > 0) {
+            //             _this.$message.error("有学生账号已被注册");
+            //             _a = 1;
+            //           }
+            //         },
+            //         error: function (xhr, textStatus) {
+            //           console.log(textStatus);
+            //         },
+            //         complete: function () {},
+            //       });
+            //       if (_a == 1) {
+            //         _b = 1;
+            //         break;
+            //       }
+            //     }
+            //     if (item.sId != "") {
+            //       let params = { un: item.sId };
+            //       let _a;
+            //       _$.ajax({
+            //         url: _this.$store.state.api + "findSid", //url路径
+            //         type: "GET", //GET
+            //         async: false, //或false,是否异步
+            //         data: params,
+            //         timeout: 5000, //超时时间
+            //         dataType: "json", //返回的数据格式:
+            //         beforeSend: function (xhr) {},
+            //         success: function (res, textStatus, jqXHR) {
+            //           if (res[0].length > 0) {
+            //             _this.$message.error("有学生学号重复");
+            //             _a = 1;
+            //           }
+            //         },
+            //         error: function (xhr, textStatus) {
+            //           console.log(textStatus);
+            //         },
+            //         complete: function () {},
+            //       });
+            //       if (_a == 1) {
+            //         _b = 1;
+            //         break;
+            //       }
+            //     }
+            //     _b = 2;
+            //   }
+            // }
+            // if (_b == 2) {
+
+            // for (var i = 0; i < arr.length; i++) {
+            //   let _i = i;
+            //   let item = arr[i];
+            //   let params = [
+            //     {
+            //       alias: item.name,
+            //       username: item.mail,
+            //       userpassword: 123456,
+            //       oid: _this.oid,
+            //       ph: item.phone,
+            //       cid: item.class,
+            //     },
+            //   ];
+
+            //   _this.ajax
+            //     .post(_this.$store.state.api + "batchRegistration", params)
+            //     .then((res) => {
+            //       let params = [
+            //         {
+            //           userid: res.data.uid,
+            //           username: item.name,
+            //           sId: item.sId,
+            //           type: 2,
+            //           oid: res.data.oid,
+            //           phone: res.data.ph ? res.data.ph : "",
+            //           cid: res.data.cid ? res.data.cid : "",
+            //           intro: "",
+            //           sex: "0",
+            //         },
+            //       ];
+            //       _this.ajax
+            //         .post(_this.$store.state.api + "updateUserByEdu", params)
+            //         .then((res) => {
+            //           console.log(res);
+            //         })
+            //         .catch((err) => {
+            //           console.error(err);
+            //         });
+            //       loading.close();
+            //       // _this.$message({
+            //       //   message: "新增成功",
+            //       //   type: "success",
+            //       // });
+            //       _this.getStudent();
+            //       // if (_i == arr.length - 1) {
+            //       //   loading.close();
+            //       //   _this.$message({
+            //       //     message: "上传成功",
+            //       //     type: "success",
+            //       //   });
+            //       //   _this.getStudent();
+            //       // }
+            //     })
+            //     .catch((err) => {
+            //       _this.$message.error("上传失败");
+            //       console.error(err);
+            //     });
+            // }
+            // } else {
+            //   loading.close();
+            //#endregion
+          }
+          if(_b == 2){
+            _this.fileListUpload = [];
+            loading.close();
+            return
+          }
+          let z = 2;
+          let newArr = JSON.stringify(arr);
+          let params = [
+            {
+              arr: newArr,
+              userpassword: 'Coco1234',
+              oid: _this.oid,
+            },
+          ];
+          _this.ajax
+            .post(_this.$store.state.api + "batchRegistrationMore", params)
+            .then((res) => {
+              if (res.data.type == 1) {
+                _this.$message.error("有学生手机号码已被注册");
+                z = 1;
+              }
+              if (res.data.type == 2) {
+                _this.$message.error("有学生账号已被注册");
+                z = 1;
+              }
+              if (res.data.type == 3) {
+                _this.$message.error("有学生学号重复");
+                z = 1;
+              }
+              if (z == 2) {
+                _this.$message({
+                  message: "新增成功",
+                  type: "success",
+                });
+                _this.getStudent();
+              }
+              loading.close();
+            })
+            .catch((err) => {
+              console.error(err);
+            });
+          _this.fileListUpload = [];
+        };
+
+        reader.readAsArrayBuffer(f);
+      };
+
+      if (rABS) {
+        reader.readAsArrayBuffer(f);
+      } else {
+        reader.readAsBinaryString(f);
+      }
+    },
+    getSchoolName() {
+      let params = {
+        oid: this.oid,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectSchoolName2", params)
+        .then((res) => {
+          this.schoolName = res.data[0][0].name;
+          const cleanedSchoolName = res.data[0][0].name.replace(/[,。;:!“”‘’()()]/g, ''); // 去掉标点符号
+          console.log(pinyin);
+          console.log(pinyin.getFullChars(cleanedSchoolName));
+          console.log(pinyin.getCamelChars(cleanedSchoolName));
+          this.schoolChar = pinyin.getCamelChars(cleanedSchoolName).toLowerCase()
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    deleteStudent(id, state) {
+      state = 0;
+      let params = [{ uid: id, state: state }];
+      this.$confirm("确定" + "删除" + "此学生吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.ajax
+            .post(this.$store.state.api + "deleteStudent", params)
+            .then((res) => {
+              this.$message({
+                message: "操作成功",
+                type: "success",
+              });
+              this.getStudent();
+            })
+            .catch((err) => {
+              this.$message.error("操作失败");
+              console.error(err);
+            });
+        })
+        .catch(() => { });
+    },
+    iniPassword(id) {
+      this.$confirm("确定" + "初始化" + "此学生的密码吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          let params = [
+            {
+              uid: id,
+              pa: 'Coco1234',
+            },
+          ];
+          this.ajax
+            .post(this.$store.state.api + "iniPassword", params)
+            .then((res) => {
+              this.$message({
+                message: "初始化密码成功!",
+                type: "success",
+              });
+            })
+            .catch((err) => {
+              console.error(err);
+            });
+        })
+        .catch(() => { });
+    },
+    updateStudentA(res) {
+      this.userinfo = JSON.parse(JSON.stringify(res));
+      this.userinfoA = JSON.parse(JSON.stringify(res));
+      this.userinfo.classid = this.userinfo.classid.split(",");
+      this.dialogVisibleUpdate = true;
+    },
+    updateStudent() {
+      if (this.userinfo.name === "") {
+        this.$message.error("学生姓名不能为空");
+        return;
+      } else if (!this.userinfo.classid) {
+        this.$message.error("请为学生选择班级");
+        return;
+      } else if (
+        this.userinfo.phonenumber &&
+        !/^[1][3,4,5,7,8][0-9]{9}$/.test(this.userinfo.phonenumber)
+      ) {
+        this.$message.error("手机号格式不正确");
+        return;
+      } else if (
+        !/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/.test(
+          this.userinfo.un
+        )
+      ) {
+        this.$message.error("邮箱格式不正确");
+        return;
+      }
+
+      if (this.time()) {
+        if (this.userinfoA.un != this.userinfo.un) {
+          let params = { un: this.userinfo.un };
+          this.ajax
+            .get(this.$store.state.api + "findMail", params)
+            .then((res) => {
+              if (res.data[0].length > 0) {
+                this.$message.error("此学生账号已被注册");
+              } else {
+                this.update_Student();
+              }
+            })
+            .catch((err) => {
+              console.error(err);
+            });
+        } else {
+          this.update_Student();
+        }
+      }
+    },
+    update_Student() {
+      let params = [
+        {
+          userid: this.userinfo.userid,
+          username: this.userinfo.un,
+          alias: this.userinfo.name,
+          ph: this.userinfo.phonenumber,
+          sid: this.userinfo.studentid,
+          cid: this.userinfo.classid.join(","),
+        },
+      ];
+      this.ajax
+        .post(this.$store.state.api + "updateStudentInfo", params)
+        .then((res) => {
+          this.$message({
+            message: "修改成功",
+            type: "success",
+          });
+          this.dialogVisibleUpdate = false;
+          this.getStudent();
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          this.$message({
+            message: "修改失败",
+            type: "error",
+          });
+          console.error(err);
+        });
+    },
+  },
+  created() {
+    this.page = 1;
+    this.getStudent();
+    this.getSchoolName();
+    this.getClass();
+  },
+};
+</script>
+
+<style scoped>
+.pb_head>span:nth-child(2) {
+  font-size: 20px;
+  margin-left: 5px;
+  color: #828282;
+}
+
+.pb_head {
+  margin: 0 !important;
+  width: 100% !important;
+}
+
+.student_page {
+  margin-top: 10px;
+  display: flex;
+  justify-content: flex-end;
+}
+
+.student_head {
+  margin-top: 10px;
+  padding-bottom: 10px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.head_left {
+  display: flex;
+  align-items: center;
+  line-height: 40px;
+}
+
+.head_right {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: center;
+}
+
+.student_input>>>.el-input__inner {
+  height: 30px;
+  width: 190px;
+  font-size: 13px;
+  padding: 0 10px;
+}
+
+.student_button {
+  color: #fff;
+  background: #2268bc;
+  width: 60px;
+  height: 30px;
+  padding: 0 !important;
+  font-size: 12px;
+  line-height: 30px;
+}
+
+.head_right>button:nth-child(1) {
+  color: #fff;
+  background: #2268bc;
+  width: 70px;
+  height: 30px;
+  padding: 0 !important;
+  font-size: 12px;
+  line-height: 30px;
+}
+
+.head_right>button:nth-child(2) {
+  color: #fff;
+  background: #2268bc;
+  width: 70px;
+  height: 30px;
+  padding: 0 !important;
+  font-size: 12px;
+  line-height: 30px;
+}
+
+.head_right>div {
+  font-size: 12px;
+  line-height: 40px;
+  margin-left: 10px;
+  color: #2a6dbe;
+  text-decoration: underline;
+  cursor: pointer;
+}
+
+.student_table>>>.el-table--border td {
+  border-right: 0px !important;
+}
+
+.student_table>>>.el-table,
+.student_table>>>.el-table__body-wrapper {
+  height: auto !important;
+}
+
+.el-table>>>.even_row {
+  background-color: #f1f1f1 !important;
+}
+
+.de_button {
+  color: #fff;
+  background: #5190fd;
+  width: 50px;
+  height: 25px;
+  padding: 0 !important;
+  font-size: 12px;
+  line-height: 25px;
+}
+
+.add_student>>>.el-dialog__header {
+  padding: 20px 20px 10px;
+  text-align: center;
+  background: #32455b;
+}
+
+.add_student>>>.el-dialog__title {
+  font-size: 14px !important;
+  color: #fff !important;
+}
+
+.add_student>>>.el-dialog__headerbtn {
+  font-size: 20px !important;
+}
+
+.add_student>>>.el-form-item__label {
+  margin-left: 65px;
+}
+
+.add_student>>>.el-form-item {
+  display: flex;
+}
+
+.add_student>>>.el-form-item__content {
+  margin: 0 !important;
+}
+
+.add_input {
+  width: 365px;
+}
+
+.add_student>>>.el-dialog__footer {
+  text-align: center !important;
+}
+
+.right {
+  width: 250px;
+  color: #fff;
+  background: #0e72e6;
+  margin-bottom: 20px;
+}
+
+.header-title {
+  display: flex;
+}
+
+.logoImg {
+  width: 30px;
+}
+
+.logoImg>img {
+  width: 100%;
+  height: 100%;
+}
+
+.title_add_student {
+  margin: 0 auto;
+  color: #fff;
+}
+
+.upload-demo {
+  line-height: 0px !important;
+}
+
+.upload-demo>>>.el-button {
+  color: #fff;
+  background: #2268bc;
+  width: 70px;
+  height: 30px;
+  padding: 0 !important;
+  font-size: 12px;
+  line-height: 0 !important;
+}
+
+.userImg {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-items: center;
+}
+
+.tx {
+  width: 40px;
+  margin-right: 10px;
+}
+
+.delete {
+  width: 25px;
+  height: 25px;
+  cursor: pointer;
+  margin-left: 10px;
+}
+
+.tx>img,
+.delete>img {
+  width: 100%;
+  height: 100%;
+}
+
+.newCss {
+  display: flex;
+  flex-direction: row;
+  flex-wrap: nowrap;
+  align-items: baseline;
+}
+
+.student_input.el-input {
+  width: auto;
+}
+
+.student_input {
+  margin-right: 10px;
+}
+
+.student_input>>>.el-input__icon {
+  line-height: unset;
+}
+
+.btnBox {
+  display: flex;
+  align-items: center;
+}
+
+.sub_head {
+  position: relative;
+}
+
+.sub_head::after {
+  content: "";
+  width: 100%;
+  background: #5a9cea;
+  height: 2px;
+  position: absolute;
+  left: 0;
+  bottom: -10px;
+}
+
+.subClick {
+  /* font-size: 16px; */
+  font-size: 26px;
+  cursor: pointer;
+  /* margin-left: 17.5px; */
+  /* color: #ab582f; */
+  /* color: #409eff; */
+  color: #999;
+}
+
+.subClick:hover {
+  color: #000;
+}
+
+.sub_head+.subClick,
+.subClick+.subClick,
+.subClick+.sub_head {
+  margin-left: 17.5px;
+}
+
+.pb_content_body {
+  width: 100% !important;
+}
+
+.sm_box {
+  display: flex;
+  width: calc(100% - 20px);
+  margin: 0 auto;
+  padding: 0 90px;
+  box-sizing: border-box;
+}
+
+.sm_right {
+  width: 100%;
+  /* margin-left: 210px; */
+}
+
+.sm_left {
+  width: 200px;
+  background: #fff;
+  height: calc(100vh - 20px);
+  position: fixed;
+  left: 10px;
+  top: 10px;
+  border-radius: 5px;
+  overflow: hidden;
+}
+
+
+
+.nav {
+  height: 55px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+  color: #777777;
+  transition: all .5s;
+}
+
+.nav:hover {
+  background: rgb(204, 204, 204);
+}
+
+.nav.active {
+  background: #3d67bc !important;
+  color: #fff;
+}
+
+.nav .icon {
+  width: 16px;
+  height: 16px;
+  margin-right: 5px;
+  background-size: 100% 100%;
+}
+
+.nav .name {}
+
+.nav .icon.gradeI {
+  background-image: url(../../../../assets/icon/studentManage/grade.png);
+}
+
+.nav .icon.classI {
+  background-image: url(../../../../assets/icon/studentManage/class.png);
+}
+
+.nav .icon.studentI {
+  background-image: url(../../../../assets/icon/studentManage/student.png);
+}
+
+.nav.active .icon.gradeI {
+  background-image: url(../../../../assets/icon/studentManage/grade-a.png);
+}
+
+.nav.active .icon.classI {
+  background-image: url(../../../../assets/icon/studentManage/class-a.png);
+}
+
+.nav.active .icon.studentI {
+  background-image: url(../../../../assets/icon/studentManage/student-a.png);
+}
+
+</style>

+ 1204 - 0
src/components/pages/liyuan/page/teadTest.vue

@@ -0,0 +1,1204 @@
+<template>
+    <div class="i_body_box">
+        <backPage tit="资料搜集"></backPage>
+        <div class="check_nav">
+            <!-- <div class="nav all" v-show="this.ExamineBase.length > 0" :class="{ active: type == '1' }" @click="checkType('1')">
+                年度考核
+            </div> -->
+            <div class="nav all" :class="{ active: checkTypeValue == typeListStr }" 
+            @click="changeShowType(typeListStr)">
+                全部
+            </div>
+            <div class="nav" v-for="item in typeList" :key="item.id" :class="{ active: checkTypeValue == item.id,all:['8bfa67ce-e82a-11ef-b508-005056924926','9d3289d2-e82a-11ef-b508-005056924926','a824c728-e82a-11ef-b508-005056924926','8085418b-e82a-11ef-b508-005056924926'].includes(item.id)}" 
+            @click="changeShowType(item.id,item)">{{ item.name }}</div>
+           
+        </div>
+        <div class="check_box" v-loading="loading">
+            <!-- <examine v-if="type==1"></examine> -->
+            <div class="noneData"  v-if="!worksArray.length && type!=1" style="text-align: center; margin-top: 20px;">
+                暂无数据
+            </div>
+            <template  v-if="type!=1">
+                <div class="test_panel" v-for="(item, index) in worksArray" :key="index">
+                    <div class="test_panel_title">
+                        <div class="title" :style="{paddingLeft: (item.array.length > 0 || item.carray.length > 0) ? '0' : '30px'}" @click="openWork(index)">
+                            <span class="open" :class="{active: item.open}" v-if="item.array.length > 0 || item.carray.length > 0"></span>
+                            <el-tooltip :content="item.title" placement="top" effect="dark">
+                                <span class="titleN">{{ item.title }}</span>
+                            </el-tooltip>
+                        </div>
+                        <div class="state">
+                            <span :class="{ is: item.array.length > 0, no: !item.array.length }">{{ item.array.length > 0 ? "已完成" : "未完成" }}</span>
+                        </div>
+                        <div class="time">
+                            <span v-if="item.overtime" :class="{isDead: isDeadlinePassed(item.overtime)}">截止时间:{{ item.overtime }}</span>
+                            <span v-else></span>
+                        </div>
+                        <div class="creator" :style="{paddingRight:(!item.carray.length > 0) ? '0' : '0px'}">
+                            <el-tooltip :content="item.username" placement="top" effect="dark">
+                                <span>创建者:{{ item.username }}</span>
+                            </el-tooltip>
+                        </div>
+                        <div class="editBtn2" :style="`${item.open?'display:flex':''}`" v-if="!item.carray.length > 0">
+                            <span v-if="item.array.length === 0">去填写</span>
+                            <span v-else>再填一份</span>
+                        </div>
+                        <div @click="doTest2(item.courseid)" class="editBtn" :style="`${item.open?'display:flex':''}`" v-if="!item.carray.length > 0">
+                            <span v-if="item.array.length === 0">去填写</span>
+                            <span v-else>再填一份</span>
+                        </div>
+                    </div>
+                    <div class="test_panel_box" v-if="item.open">
+                        <div class="test_add_box"
+                            v-if="item.array">
+                            <div class="test" v-for="(test, index) in item.array" :key="test.id">
+                                <div class="time">
+                                    <span>提交记录{{item.array.length - index}}</span>
+                                </div>
+                                <!-- <img @click="deleteTest(test.id)" class="delete"
+                                    src="../../../../assets/icon/test/delete.png" alt="" /> -->
+                                <div class="utime">
+                                    <span>{{ test.utime }}</span>
+                                </div>
+                                <div class="mask">
+                                    <div @click="doTest(test.courseid, test.id)">
+                                        <span>编辑</span>
+                                    </div>
+                                    <div @click="deleteTest(test.id)" class="delete">
+                                        <span>删除</span>
+                                    </div>
+                                    <!-- <div @click="checkTest(test.courseid, test.id)">
+                                        <span></span><span>查看</span>
+                                    </div>
+                                    <div @click="copyTest(test.id)">
+                                        <span></span><span>复制</span>
+                                    </div> -->
+                                </div>
+                            </div>
+                        </div>
+                        <div class="test_add_box"
+                            v-else-if="item.carray" v-loading="!item.carray.length">
+                            <!-- <div class="courseLength" v-for="(course, index) in item.carray" :key="index" @click="doTest3(item, course)">
+                                <span class="finish" :class="{is: course.array.length}"></span>
+                                <span>{{ index+1 }}、</span>
+                                <span>{{ course.title }}</span>
+                                <span>{{ course.username }}</span>
+                            </div> -->
+                            <div class="test courseLength" v-for="(course, index) in item.carray" :key="index">
+                                <div class="time">
+                                    <el-tooltip :content="course.title+'-'+course.username" placement="top" effect="dark">
+                                        <span>{{ course.title }}-{{ course.username }}</span>
+                                    </el-tooltip>
+                                </div>
+                                <div class="finishBox" :class="{is: course.array.length}">
+                                    <span class="finish"></span>
+                                    <span v-if="course.array.length">已评分</span>
+                                    <span v-else>未评分</span>
+                                </div>
+                                <div class="utime" style="margin-left: 30px;">
+                                    <span v-if="course.array.length">{{ course.array[0].utime }}</span>
+                                    <span v-else></span>
+                                </div>
+                                <div class="mask">
+                                    <div @click="doTest3(item, course)">
+                                        <span>评分</span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </template>
+            
+        </div>
+    </div>
+</template>
+
+<script>
+import backPage from '../components/backPage.vue'
+export default {
+    
+    components:{
+        backPage
+    },
+    data() {
+        return {
+            userid: this.$route.query.userid,
+            oid: this.$route.query.oid,
+            type: "",
+            typeId:'e18d88b3-e828-11ef-b508-005056924926',
+            typeList:[],
+            ExamineBase: [],
+            typeArray: [],
+            typeArrayCheck: [],
+            worksArray: [],
+            org: this.$route.query.org,
+            role: this.$route.query.role,
+            loading: false,
+            checkTypeValue:""
+        };
+    },
+    computed: {
+        getNum() {
+            return function (array) {
+                let _array = JSON.parse(array);
+                let num = 0;
+                _array.forEach(el => {
+                    if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+                        el.array.forEach(item => {
+                            if (item.ttype == 2 && item.array.length > 0) {
+                                item.array.forEach(item2 => {
+                                    if (item2.ttype == 1 && item2.json) {
+                                        num++;
+                                    }
+                                });
+                            } else if (item.ttype == 1 && item.json) {
+                                num++;
+                            }
+                        });
+                    } else if (el.ttype == 1 && el.json) {
+                        num++;
+                    }
+                });
+                return num;
+            };
+        },
+        getScore() {
+            return function (array) {
+                // let _array = JSON.parse(array)
+                let _score = 0;
+                let scoreArray = [];
+                for (var i = 0; i < array.length; i++) {
+                    let _array = JSON.parse(array[i].courseJson);
+                    let score = 0;
+                    for (var j = 0; j < _array.length; j++) {
+                        let el = _array[j];
+                        if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+                            for (var k = 0; k < el.array.length; k++) {
+                                let item = el.array[k];
+                                if (item.ttype == 2 && item.array.length > 0) {
+                                    for (var z = 0; z < item.array.length; z++) {
+                                        let item2 = item.array[z];
+                                        if (item2.ttype == 1 && item2.json && item2.json.score2) {
+                                            score += parseInt(item2.json.score2);
+                                        }
+                                    }
+                                } else if (item.ttype == 1 && item.json && item.json.score2) {
+                                    score += parseInt(item.json.score2);
+                                }
+                            }
+                        } else if (el.ttype == 1 && el.json && el.json.score2) {
+                            score += parseInt(el.json.score2);
+                        }
+                    }
+                    scoreArray.push(score);
+                }
+                scoreArray.forEach(el => {
+                    _score += el;
+                });
+                console.log(scoreArray);
+                return _score ? _score / scoreArray.length : 0;
+            };
+        },
+        getImg() {
+            return function (array) {
+                let _array = JSON.parse(array);
+                let _img = "";
+                s: for (var j = 0; j < _array.length; j++) {
+                    let el = _array[j];
+                    if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+                        for (var k2 = 0; k2 < el.array.length; k2++) {
+                            let item = el.array[k2];
+                            console.log(k2);
+                            if (item.ttype == 2 && item.array.length > 0) {
+                                for (var z = 0; z < item.array.length; z++) {
+                                    let item2 = item.array[z];
+                                    if (
+                                        item2.ttype == 1 &&
+                                        item2.type == 5 &&
+                                        item2.json &&
+                                        item2.json.file &&
+                                        item2.json.file.length > 0
+                                    ) {
+                                        for (var k4 = 0; k4 < item2.json.file.length; k4++) {
+                                            let ik = item2.json.file[k4];
+                                            if (ik.type == 3) {
+                                                _img = ik.url;
+                                                break s;
+                                            }
+                                        }
+                                    }
+                                }
+                            } else if (
+                                item.ttype == 1 &&
+                                item.type == 5 &&
+                                item.json &&
+                                item.json.file &&
+                                item.json.file.length > 0
+                            ) {
+                                for (var k3 = 0; k3 < item.json.file.length; k3++) {
+                                    let ik = item.json.file[k3];
+                                    if (ik.type == 3) {
+                                        _img = ik.url;
+                                        break s;
+                                    }
+                                }
+                            }
+                        }
+                    } else if (
+                        el.ttype == 1 &&
+                        el.type == 5 &&
+                        el.json &&
+                        el.json.file &&
+                        el.json.file.length > 0
+                    ) {
+                        for (var k = 0; k < el.json.file.length; k++) {
+                            let ik = el.json.file[k];
+                            if (ik.type == 3) {
+                                _img = ik.url;
+                                break s;
+                            }
+                        }
+                    }
+                }
+                return _img;
+            };
+        },
+        typeListStr(){
+          let _result = "";
+
+          if(this.typeList.length){
+            _result = this.typeList.map(i=>i.id)
+            _result.push(this.typeId);
+            _result = _result.join(',')
+          }
+
+          return _result;
+        }
+    },
+    watch:{
+      typeId(newValue){
+        this.changeShowType(newValue)
+      }
+    },
+    methods: {
+        getNavType() {
+            let params = {
+                oid: "",//this.oid
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectTestType", params)
+                .then(res => {
+                    let _data = res.data[0];
+                    console.log('_data',_data);
+                    // _data.fliter(e=>{
+
+                    // })
+                    this.typeList = _data.filter(function(item, index) {
+                        return item.pid == 'e18d88b3-e828-11ef-b508-005056924926';
+                    });
+                    this.changeShowType(this.typeListStr)
+
+                    //  = _data.fliter(e =>{ return e.pid == 'e18d88b3-e828-11ef-b508-005056924926'})
+                    console.log('this.typeList',this.typeList);
+
+                    
+                })
+                .catch(err => {
+                    console.log(err);
+                });
+        },
+        getPageBase(type = 1) {
+            let params = {
+                typ: type,
+                org: this.org,
+                oid: this.oid
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectTestExamineBase", params)
+                .then(res => {
+                this.ExamineBase = res.data[0];
+                if(type == 1 && !res.data[0].length){
+                    this.getPageBase(2)
+                }
+                // console.log("selectTestExamineBase", res.data);
+                })
+                .catch(error => {
+                console.log(error);
+            });
+        },
+        isDeadlinePassed(deadline) {
+            let _line = new Date(deadline)
+            const currentDate = new Date();
+            return currentDate > _line;
+        },
+        checkType(type) {
+            this.type = type;
+            this.getWorks();
+        },
+        selectTestType(type) {
+            let params = {
+                oid: this.oid
+            };
+            this.ajax
+                .get(this.$store.state.api + "selectTestType", params)
+                .then(res => {
+                    this.typeArray = res.data[0];
+                    if(type == 1){
+                        this.type = ''
+                        // if (this.typeArray.length) {
+                        //     this.type = this.typeArray[0].id;
+                        // } else {
+                        //     this.type = '0';
+                        // }
+                    }
+                    this.getWorks()
+                })
+                .catch(err => {
+                    console.error(err);
+                });
+        },
+        getWorks() {
+            this.loading = true;
+            let params = {
+                uid: this.userid,
+                typeid: this.checkTypeValue
+            };
+            this.ajax
+                .get(this.$store.state.api + "getTestWorksPerson_2type", params)
+                .then(res => {
+                    let array = res.data[0];
+                    let array2 = res.data[1];
+                    // 用于存储归类后的数据的对象
+                    let worksArray = {};
+
+                    // 遍历原始数据,根据 parentId 进行分组
+                    array2.forEach(item => {
+                        // console.log(item.chapters);
+                        worksArray[item.courseId] = {
+                            id: item.id,
+                            courseid: item.courseId,
+                            title: item.title,
+                            time: item.time,
+                            utime: item.utime,
+                            overtime: item.overtime,
+                            username: item.username,
+                            chapters: item.chapters,
+                            brief: item.brief,
+                            typeid: item.typeid,
+                            array: item.typeid == 'dda9728e-5f11-469e-89ee-aca518daf123' ? 0 : [],
+                            carray: [],
+                            open: false
+                        };
+                    });
+                    worksArray = Object.values(worksArray);
+                    worksArray.forEach(async el => {
+                        if (el.typeid == 'dda9728e-5f11-469e-89ee-aca518daf123') {
+                            let courseJson = this.returnCourseJSON(el.chapters)
+                            if(courseJson && courseJson.courses.length){
+                                let courses = courseJson.courses.join(',')
+                                let _res = await this.getAllCourse(courses)
+                                console.log(_res);
+                                let _carray = []
+                                for(var i=0;i<_res.length;i++){
+                                    _carray.push({
+                                        courseid: _res[i].courseId,
+                                        title: _res[i].title,
+                                        username: _res[i].username,
+                                        array: []
+                                    })
+                                }
+                                el.carray = _carray
+                            }
+                        }
+
+                        array.forEach(el2 => {
+                            if (el.courseid == el2.courseid && el.typeid != 'dda9728e-5f11-469e-89ee-aca518daf123') {
+                                el.array.push(el2);
+                            }
+
+                            if(el.courseid == el2.courseid && el.typeid == 'dda9728e-5f11-469e-89ee-aca518daf123'){
+                                let courseid = this.returnCourseId(el2.courseJson)
+                                for(var c = 0; c<el.carray.length;c++){
+                                    if(el.carray[c].courseid == courseid){
+                                        el.carray[c].array.push(el2);
+                                        break
+                                    }
+                                }
+                            }
+                        });
+                    });
+                    // worksArray[item.courseid].array.push(item);
+
+                    this.worksArray = worksArray;
+                    this.loading = false;
+
+                    this.$forceUpdate();
+                })
+                .catch(err => {
+                    this.loading = false;
+                    console.error(err);
+                });
+        },
+        openWork(index){
+            if(this.worksArray[index].array.length === 0 && this.worksArray[index].carray.length === 0){
+                return
+            }
+            this.worksArray[index].open = !this.worksArray[index].open
+            this.$forceUpdate()
+        },
+        returnA() {
+            this.$router.push(
+                "/testStudent?userid=" +
+                this.userid +
+                "&oid=" +
+                this.oid +
+                "&org=" +
+                this.org +
+                "&role=" +
+                this.role
+            );
+        },
+        checkTest(cid, tid) {
+            this.$router.push(
+                "/checkTest?cid=" +
+                cid +
+                "&tid=" +
+                tid +
+                "&userid=" +
+                this.userid +
+                "&oid=" +
+                this.oid +
+                "&org=" +
+                this.org +
+                "&type=3" +
+                "&role=" +
+                this.role
+            );
+        },
+        doTest(cid, tid) {
+            this.$router.push(
+                "/doTest?cid=" +
+                cid +
+                "&tid=" +
+                tid +
+                "&userid=" +
+                this.userid +
+                "&oid=" +
+                this.oid +
+                "&org=" +
+                this.org +
+                "&type=3" +
+                "&role=" +
+                this.role
+            );
+        },
+        doTest2(cid) {
+            this.$router.push(
+                "/doTest?cid=" +
+                cid +
+                "&userid=" +
+                this.userid +
+                "&oid=" +
+                this.oid +
+                "&org=" +
+                this.org +
+                "&type=3" +
+                "&role=" +
+                this.role
+            );
+        },
+        doTest3(item, course){
+            if(course.array.length){
+                this.$router.push(
+                    "/doTest?cid=" +
+                    item.courseid +
+                    "&tid=" +
+                    course.array[0].id +
+                    "&userid=" +
+                    this.userid +
+                    "&oid=" +
+                    this.oid +
+                    "&org=" +
+                    this.org +
+                    "&type=3" +
+                    "&role=" +
+                    this.role
+                );
+            }else{
+                this.$router.push(
+                    "/doTest?cid=" +
+                    item.courseid +
+                    "&userid=" +
+                    this.userid +
+                    "&oid=" +
+                    this.oid +
+                    "&org=" +
+                    this.org +
+                    "&type=3" +
+                    "&courseid=" +
+                    course.courseid +
+                    "&role=" +
+                    this.role
+                );
+            }
+        },
+        copyTest(tid) {
+            let params = [
+                {
+                    tid: tid,
+                    uid: this.userid
+                }
+            ];
+            this.ajax
+                .post(this.$store.state.api + "copyTestWorks", params)
+                .then(res => {
+                    this.$message.success("复制成功");
+                    this.getWorks();
+                })
+                .catch(err => {
+                    console.error(err);
+                });
+        },
+        deleteTest(tid) {
+            let _this = this;
+            _this
+                .$confirm("确定删除此填写的表单么?", "提示", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning"
+                })
+                .then(() => {
+                    let params = [
+                        {
+                            tid: tid
+                        }
+                    ];
+                    _this.ajax
+                        .post(_this.$store.state.api + "deleteTestCourseWorks", params)
+                        .then(res => {
+                            _this.$message.success("删除成功");
+                            _this.getWorks();
+                        })
+                        .catch(err => {
+                            console.error(err);
+                        });
+                })
+                .catch(() => {
+                    return;
+                });
+        },
+        returnCourseJSON(array) {
+            let _array = JSON.parse(array);
+            let courseJson = '';
+            s: for (var j = 0; j < _array.length; j++) {
+                let el = _array[j];
+                if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+                    for (var k2 = 0; k2 < el.array.length; k2++) {
+                        let item = el.array[k2];
+                        console.log(k2);
+                        if (item.ttype == 2 && item.array.length > 0) {
+                            for (var z = 0; z < item.array.length; z++) {
+                                let item2 = item.array[z];
+                                if (
+                                    item2.ttype == 1 &&
+                                    item2.type == 6 &&
+                                    item2.json
+                                ) {
+                                    courseJson = item2.json
+                                    break s;
+                                }
+                            }
+                        } else if (
+                            item.ttype == 1 &&
+                            item.type == 6 &&
+                            item.json
+                        ) {
+                            courseJson = item.json
+                                    break s;
+                        }
+                    }
+                } else if (
+                    el.ttype == 1 &&
+                    el.type == 6 &&
+                    el.json
+                ) {
+                    courseJson = el.json
+                                    break s;
+                }
+            }
+            return courseJson;
+        },
+        returnCourseId(array) {
+            let _array = JSON.parse(array);
+            let courseJson = '';
+            s: for (var j = 0; j < _array.length; j++) {
+                let el = _array[j];
+                if ((el.ttype == 3 || el.ttype == 2) && el.array.length > 0) {
+                    for (var k2 = 0; k2 < el.array.length; k2++) {
+                        let item = el.array[k2];
+                        console.log(k2);
+                        if (item.ttype == 2 && item.array.length > 0) {
+                            for (var z = 0; z < item.array.length; z++) {
+                                let item2 = item.array[z];
+                                if (
+                                    item2.ttype == 1 &&
+                                    item2.type == 6 &&
+                                    item2.json && item2.json.answer2
+                                ) {
+                                    courseJson = item2.json.answer2
+                                    break s;
+                                }
+                            }
+                        } else if (
+                            item.ttype == 1 &&
+                            item.type == 6 &&
+                            item.json && item.json.answer2
+                        ) {
+                            courseJson = item.json.answer2
+                                    break s;
+                        }
+                    }
+                } else if (
+                    el.ttype == 1 &&
+                    el.type == 6 &&
+                    el.json  && el.json.answer2
+                ) {
+                    courseJson = el.json.answer2
+                                    break s;
+                }
+            }
+            return courseJson;
+        },
+        async getAllCourse(id) {
+            let params = {
+                cid: id,
+            };
+            let res = await this.ajax.get(this.$store.state.api + "getCourseInfoTestAll", params)
+            return res.data[0]
+        },
+        changeShowType(value){
+            console.log('value',value);
+            
+          this.checkTypeValue = value;
+          this.getWorks();
+        }
+    },
+    mounted() {
+        // this.selectTestType(1);
+        // this.getPageBase()
+        this.getNavType()
+        
+        console.log('this.typeListStr',this.typeListStr);
+        
+        // if(this.typeListStr){
+        //   this.changeShowType(this.typeListStr)
+          // this.checkTypeValue = this.typeId
+        // }
+    },
+    // activated(){
+    //     // this.selectTestType(2);
+    //     if(this.typeListStr){
+    //       this.changeShowType(this.typeListStr)
+    //       // this.checkTypeValue = this.typeId
+    //     }
+    // },
+};
+</script>
+
+<style scoped>
+.i_body_box {
+    /* height: calc(100% - 10px); */
+    height: 100%;
+}
+
+.check_nav {
+    display: flex;
+    height: 50px;
+    align-items: center;
+    box-sizing: border-box;
+    width: 100%;
+    padding: 0 90px;
+    box-sizing: border-box;
+    overflow: auto;
+}
+
+.check_nav>.nav {
+    width: 120px;
+    height: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    color: rgb(167, 167, 167);
+    /* background: #000000; */
+    cursor: pointer;
+    min-width: fit-content;
+    margin-right: 10px;
+    
+}
+
+.check_nav>.active {
+    color: #3681fc;
+    background: rgb(248, 250, 254);
+    border-radius: 10px 10px 0 0;
+}
+
+.check_nav>.all::before,
+.check_nav>.gr::before,
+.check_nav>.md::before,
+.check_nav>.jy::before,
+.check_nav>.bj::before,
+.check_nav>.yy::before {
+    content: "";
+    display: block;
+    width: 18px;
+    height: 18px;
+    background-size: 100% 100%;
+    margin-right: 5px;
+}
+
+.check_nav>.all::before {
+
+    background-image: url('../../../../assets/icon/test/all_icon.png');
+}
+
+.check_nav>.active.all::before {
+    background-image: url('../../../../assets/icon/test/all_icon_active.png');
+}
+
+.check_nav>.gr::before {
+    background-image: url('../../../../assets/icon/test/gr_icon.png');
+}
+
+.check_nav>.active.gr::before {
+    background-image: url('../../../../assets/icon/test/gr_icon_active.png');
+}
+
+.check_nav>.md::before {
+    background-image: url('../../../../assets/icon/test/md_icon.png');
+}
+
+.check_nav>.active.md::before {
+    background-image: url('../../../../assets/icon/test/md_icon_active.png');
+}
+
+.check_nav>.jy::before {
+    background-image: url('../../../../assets/icon/test/jy_icon.png');
+}
+
+.check_nav>.active.jy::before {
+    background-image: url('../../../../assets/icon/test/jy_icon_active.png');
+}
+
+.check_nav>.yy::before {
+    background-image: url('../../../../assets/icon/test/yy_icon.png');
+}
+
+.check_nav>.active.yy::before {
+    background-image: url('../../../../assets/icon/test/yy_icon_active.png');
+}
+
+.check_nav>.bj::before {
+    background-image: url('../../../../assets/icon/test/bj_icon.png');
+}
+
+.check_nav>.active.bj::before {
+    background-image: url('../../../../assets/icon/test/bj_icon_active.png');
+}
+
+
+.check_box {
+    height: calc(100% - 90px);
+    overflow: auto;
+    padding: 0 0px 20px;
+    margin: 0 90px;
+    box-sizing: border-box;
+    background: rgb(248, 250, 254);
+}
+
+.test_panel {
+    width: calc(100% - 40px);
+    margin: 20px auto 0;
+    background: #fff;
+    border-radius: 10px;
+    /* height: 300px; */
+    overflow: hidden;
+    box-shadow: 0 2px 5px 1px #0001;
+}
+
+.test_panel:hover{
+	box-shadow: 0 0 2px 1px #3681FC;
+}
+
+.test_panel:hover>.test_panel_title>.title{
+	color:#5996FD
+}
+
+.test_panel_title:hover>.editBtn{
+	display: flex;
+}
+.test_panel_title:hover>.editBtn2{
+	display: flex;
+}
+
+
+.test_panel+.test_panel {
+    margin-top: 15px;
+}
+
+.test_panel_title {
+    height: 50px;
+    display: flex;
+    align-items: center;
+    width: 100%;
+    position: relative;
+    /* justify-content: space-between; */
+    /* padding: 0 20px; */
+    box-sizing: border-box;
+    /* border-bottom: 2px solid #f0f0f0; */
+}
+
+.test_panel_title>.title {
+    display: flex;
+    align-items: center;
+    width: 300px;
+    margin-left: 20px;
+    cursor: pointer;
+}
+
+.test_panel_title>.title>.open{
+    width: 20px;
+    height:20px;
+    margin-right: 10px;
+    background-image: url('../../../../assets/icon/test/chevron-right.png');
+    background-size: 100% 100%;
+    cursor:pointer;
+    transition:all .3s;
+    opacity: .5;
+}
+
+.test_panel_title>.title>.open.active{
+    transform: rotate(90deg);
+    opacity: 1;
+}
+
+.test_panel_title>.state{
+    margin-left: auto;
+    min-width: fit-content;
+}
+
+.test_panel_title>.state > span {
+    font-size: 14px;
+    padding: 5px 8px;
+    border-radius: 5px;
+    margin-right: 0;
+}
+
+.test_panel_title>.state>.is:nth-child(1) {
+    color: #17C469;
+    background: #EFFCF5;
+    border: 1px solid #EFFCF5;
+}
+
+.test_panel_title>.state>.no:nth-child(1) {
+    color: #3681FC;
+    background: #E0EAFB;
+    border: 1px solid #E0EAFB;
+}
+
+.test_panel_title>.title>.titleN {
+    font-size: 18px;
+    font-weight: 600;
+    max-width: calc(100% - 20px - 10px);
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.test_panel_title>.time {
+    font-size: 16px;
+    color: #a1a1a1;
+    min-width: 160px;
+    margin: 0 30px;
+}
+
+.test_panel_title>.creator {
+    font-size: 16px;
+    color: #a1a1a1;
+    max-width: 160px;
+    min-width: 160px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.test_panel_title>.editBtn {
+    font-size: 16px;
+    color: #fff;
+    background: #3681fc;
+    height: 100%;
+    display: none;
+    align-items: center;
+    padding: 0 15px;
+    cursor: pointer;
+    position: absolute;
+    right: 0;
+}
+.test_panel_title>.editBtn2 {
+    font-size: 16px;
+    color: #fff;
+    background: #3681fc;
+    height: 100%;
+    display: none;
+    align-items: center;
+    padding: 0 15px;
+    cursor: pointer;
+}
+
+.test_panel_title>.time>span+span {
+    margin-left: 10px;
+}
+
+.test_panel_box {
+    border-top: 2px solid #f0f0f0;
+    width: 100%;
+    display: flex;
+    align-items: center;
+    padding: 5px 20px;
+    box-sizing: border-box;
+}
+
+.test_panel_box>.detail {
+    width: calc(100% - 350px - 20px);
+    margin-right: 20px;
+    color: #a1a1a1;
+    font-size: 14px;
+    line-height: 24px;
+    word-break: break-all;
+    display: -webkit-box;
+    -webkit-line-clamp: 4;
+    -webkit-box-orient: vertical;
+    overflow: hidden;
+}
+
+.test_panel_box>.panel {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    width: 350px;
+    min-width: 350px;
+}
+
+.test_panel_box>.panel>.score {
+    height: 110px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+    border: 1px solid #dbdbdb;
+    background: rgb(252, 252, 252);
+    width: 120px;
+    border-radius: 5px;
+}
+
+.test_panel_box>.panel>.score:nth-child(1) {
+    display: flex;
+}
+
+.test_panel_box>.panel>.score>div:nth-child(1)>span:nth-child(1) {
+    font-size: 30px;
+    font-weight: 700;
+}
+
+.test_panel_box>.panel>.score>div:nth-child(1)>span:nth-child(2) {
+    margin-left: 5px;
+}
+
+.test_panel_box>.panel>.score>div:nth-child(2) {
+    font-size: 14px;
+    margin-top: 10px;
+    color: #a1a1a1;
+}
+
+.test_panel_box>.panel>.btn {
+    height: 100px;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+}
+
+.test_panel_box>.panel>.btn>div {
+    display: flex;
+    color: rgb(69, 141, 255);
+    align-items: center;
+    cursor: pointer;
+    font-size: 14px;
+}
+
+/* .test_panel_box > .panel >.btn > div + div{
+      margin: 15px 0 0 0;
+    } */
+.test_panel_box>.panel>.btn>div>span:nth-child(1) {
+    display: block;
+    width: 13px;
+    height: 13px;
+    background-size: 100% 100%;
+    margin-right: 7px;
+}
+
+.test_panel_box>.panel>.btn>div:nth-child(1)>span:nth-child(1) {
+    background-image: url('../../../../assets/icon/test/edit_icon.png');
+}
+
+.test_panel_box>.panel>.btn>div:nth-child(2)>span:nth-child(1) {
+    background-image: url('../../../../assets/icon/test/check_icon.png');
+}
+
+.test_panel_box>.panel>.btn>div:nth-child(3)>span:nth-child(1) {
+    background-image: url('../../../../assets/icon/test/paste_icon.png');
+}
+
+.test_add_box {
+    width: 100%;
+    box-sizing: border-box;
+}
+
+
+.test_add_box>.test {
+    width: 100%;
+    height: 40px;
+    border-radius: 5px;
+    display: flex;
+    align-items: center;
+}
+
+
+.test_add_box>.test>img {
+    width: 100%;
+    height: 100%;
+    object-fit: cover;
+    border-radius: 5px;
+}
+
+.test_add_box>.test+.test {
+    /* margin-left: 10px; */
+}
+
+.test_add_box>.test>.time {
+    display: flex;
+    /* justify-content: center; */
+    align-items: center;
+    font-size: 14px;
+    width: 300px;
+    padding-left: 30px;
+    box-sizing: border-box;
+}
+
+.test_add_box>.test>.time>span {
+    /* margin-top: 5px; */
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+.test_add_box>.test>.utime {
+    font-size: 14px;
+    width: 160px;
+    min-width: 160px;
+    margin: 0 30px 0 auto;
+}
+.test_add_box>.test>.mask {
+    display: flex;
+    align-items: center;
+    padding-right: 58px;
+    max-width: 160px;
+    min-width: 160px;
+}
+
+.test_add_box>.test>.delete {
+    position: absolute;
+    width: 20px;
+    height: 20px;
+    right: -5px;
+    top: -5px;
+    cursor: pointer;
+    z-index: 2;
+    display: none;
+}
+
+.test_add_box>.test>.mask>div {
+    display: flex;
+    align-items: center;
+    cursor: pointer;
+    font-size: 14px;
+    color: #3681FC;
+}
+
+.test_add_box>.test>.mask>.delete {
+    color: #EE3E3E;
+}
+
+.test_add_box>.test>.mask>div+div {
+    /* margin: 10px 0 0 0; */
+    margin-left: 15px;
+}
+
+/*
+.test_add_box>.test>.mask>div>span:nth-child(1) {
+  display: block;
+  width: 13px;
+  height: 13px;
+  background-size: 100% 100%;
+  margin-right: 7px;
+}
+
+.test_add_box>.test>.mask>div:nth-child(1)>span:nth-child(1) {
+  background-image: url('../../../../assets/icon/test/edit_icon.png');
+}
+
+.test_add_box>.test>.mask>div:nth-child(2)>span:nth-child(1) {
+  background-image: url('../../../../assets/icon/test/check_icon.png');
+}
+
+.test_add_box>.test>.mask>div:nth-child(3)>span:nth-child(1) {
+  background-image: url('../../../../assets/icon/test/paste_icon.png');
+} */
+
+.bgColor {
+    background: #466b99;
+}
+
+/* .courseLength{
+    width: 100%;
+    cursor: pointer;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+}
+.courseLength > span + span{
+    margin-left: 10px;
+} */
+.courseLength > .finishBox {
+    display: flex;
+    color: #a1a1a1;
+    font-size: 14px;
+    margin-left: auto;
+    align-items: center;
+}
+.courseLength > .finishBox > .finish{
+    width: 15px;
+    height: 15px;
+    background-image: url('../../../../assets/icon/test/icon_course.png');
+    background-size: 100% 100%;
+    margin-right: 5px;
+}
+.courseLength > .finishBox.is > .finish{
+    background-image: url('../../../../assets/icon/test/icon_course_check.png');
+}
+.courseLength > .finishBox.is{
+    color: #000
+}
+
+.isDead{
+    color:#EE3E3E;
+}
+</style>

+ 555 - 0
src/components/pages/liyuan/page/userInfoL.vue

@@ -0,0 +1,555 @@
+<template>
+  <div
+    class="pb_contentO"
+  >
+  <backPage tit="个人档案"></backPage>
+  <div class="pb_content">
+    <div class="leftInfo">
+      <div class="leftInfoCon">
+        <div v-loading="uploadImageLoading" style="position: relative;width: 80px;height: 80px;">
+          <img style="width: 100%;height: 100%;object-fit: cover;border-radius: 50%;"
+           :src="ruleForm.headportrait ? ruleForm.headportrait :require('../../../../assets/icon/liyuan/toux.png')" alt="">
+          <img @click="uploadFile" style="position: absolute;right: 0;bottom: 0;cursor: pointer;" src="../../../../assets/icon/liyuan/lpot.svg" alt="">
+        </div>
+        <div>{{ruleForm.name}}</div>
+        <div style="display: flex;flex-direction: column;gap: 10px;">
+          <div style="font-family: Inter;
+            font-weight: 600;
+            font-size: 16px;
+            line-height: 100%;
+            text-align: center;
+            color: #969BA3;
+          ">{{ ruleForm.type }}</div>
+          <div style="font-family: Inter;
+            font-weight: 300;
+            font-size: 16px;
+            line-height: 100%;
+            text-align: center;
+            color: #969BA3;
+            display: flex;
+            align-items: center;
+            gap: 6px;
+            "
+           
+          ><img src="../../../../assets/icon/liyuan/tele.svg" alt="">{{ !ruleForm.phone ? '暂无' : ruleForm.phone }}
+        </div>
+        </div>
+      </div>
+    </div>
+    <div class="rightCon">
+      <div style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 40px;">
+          <span style="font-family: Inter;
+          font-weight: 600;
+          font-size: 20px;
+          line-height: 100%;
+          text-align: center;
+          ">基础信息</span>
+          <img :src=" editType ? require('../../../../assets/icon/liyuan/edit.svg') : require('../../../../assets/icon/liyuan/bz.svg')" @click="editInfo" style="cursor: pointer;" alt="">
+      </div>
+
+      <el-form
+        :model="ruleForm"
+        ref="ruleForm"
+        label-width="100px"
+        label-position="left"
+      >
+        <el-form-item label="姓名" prop="name">
+          <el-input
+            v-model="ruleForm.name"
+            style="width: 300px"
+            :disabled="editType"
+            placeholder="请输入姓名"
+          ></el-input>
+          
+        </el-form-item>
+
+        <el-form-item label="性别" prop="sex">
+          <el-select
+            v-model="ruleForm.sex"
+            clearable
+            :disabled="editType"
+          >
+            <el-option label="男" value="男"></el-option>
+            <el-option label="女" value="女"></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="组织" prop="org">
+          <el-select
+            v-model="ruleForm.org"
+            clearable
+            placeholder="暂无组织"
+            disabled
+          >
+            <el-option
+              v-for="item in orgJuri"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="教研室">
+          <el-select
+            v-model="ccName"
+            clearable
+            placeholder="暂无教研室"
+            disabled
+          >
+          </el-select>
+        </el-form-item>
+        
+        <el-form-item label="学校" prop="sBySchool">
+          <el-select
+            v-model="ruleForm.sBySchool"
+            clearable
+            placeholder="请选择学校"
+            disabled
+          >
+            <el-option :value="ruleForm.sBySchool"> </el-option>
+          </el-select>
+        </el-form-item>
+
+        <!-- <div class="info_span" v-for="item in teaType" :key="item.id" :class="{ 'error-text': !item.value.length, 'error-border': !item.value.length }">
+          <span>
+            {{ item.name + ":" }}
+          </span>
+          <el-select v-model="item.value" multiple :placeholder="'请选择'+item.name" @change="Ochange">
+            <el-option v-for="i in item.child" :key="i.id" :label="i.name" :value="i.id">
+            </el-option>
+          </el-select>
+        </div> -->
+        <template v-for="item in teaType">
+          <el-form-item  v-if="['2a1379bd-54a0-11ef-b873-005056b86db5','2d255541-54a0-11ef-b873-005056b86db5'].indexOf(item.id) != -1"  :key="item.id" :label="item.name">
+            <el-select
+              v-model="item.value"
+              multiple
+              placeholder="请选择"
+              :disabled="editType"
+              @change="Ochange"
+            >
+              <el-option
+                v-for="ind in item.child"
+                :key="ind.id"
+                :label="ind.name"
+                :value="ind.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </template>
+
+        <el-form-item label="简介" prop="type">
+          <el-input
+            type="textarea"
+            resize="none"
+            rows="6"
+            v-model="ruleForm.intro"
+            placeholder="简介"
+            :disabled="editType"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div class="diaBtn" v-if="!editType" style="display: flex;justify-content: flex-end;">
+        <div style="color: #000;" @click="feaClo()">取消</div>
+        <div
+          style="
+            background: #fff;
+          "
+          :style="{border: editType ? '1px #9747FF solid':'1px #0663fe solid',
+          color: editType ? '#9747FF' : '#0663fe'}"
+          @click="setJsonL()"
+          >保存</div
+        >
+      </div>
+    </div>
+  </div>
+
+
+  </div>
+</template>
+
+<script>
+import backPage from "../components/backPage.vue";
+
+export default {
+  components:{
+    backPage
+  },
+  data() {
+    return {
+      uploadImageLoading:false,
+      options:[],
+      teaType:[],
+      schoolJuri:[],
+      editType: true,
+      ruleFormCopy:'',
+      ruleForm: {
+        name: "",
+        type: "", //身份。教师还是学生还是管理员
+        sex: "男",
+        intro: "", //简介
+        phone: "", //手机号
+        sBySchool: "", //学校
+        org: "", //组织
+        headportrait: "", //头像
+      },
+      ccName: "",
+
+      orgJuri: [],
+      userid: this.$route.query.userid,
+      oid: this.$route.query.oid,
+
+    };
+  },
+
+  methods: {
+    feaClo(){
+      this.editType = true
+      this.ruleForm = JSON.parse(JSON.stringify(this.ruleFormCopy))
+    },
+		uploadFile(accept = "image/*") {
+			return new Promise((resolve) => {
+				const input = document.createElement("input");
+				input.type = "file";
+				input.accept = accept;
+				input.onchange = (event) => {
+					const file = event.target.files[0];
+					if (file) {
+						let credentials = {
+							accessKeyId: "AKIATLPEDU37QV5CHLMH",
+							secretAccessKey: "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",
+						}; //秘钥形式的登录上传
+						window.AWS.config.update(credentials);
+						window.AWS.config.region = "cn-northwest-1"; //设置区域
+						let bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
+            this.uploadImageLoading = true
+
+						let params = {
+							Key:
+								file.name.split(".")[0] +
+								new Date().getTime() +
+								"." +
+								file.name.split(".")[file.name.split(".").length - 1],
+							ContentType: file.type,
+							Body: file,
+							"Access-Control-Allow-Credentials": "*",
+							ACL: "public-read",
+						}; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
+						let options = {
+							partSize: 2048 * 1024 * 1024,
+							queueSize: 2,
+							leavePartsOnError: true,
+						};
+
+						bucket
+							.upload(params, options)
+							.on("httpUploadProgress", (evt) => {
+								console.log(evt);
+							})
+							.send((err, data) => {
+								if (err) {
+									this.$message.error("上传失败");
+                  this.uploadImageLoading = false
+
+									// return resolve("");
+								} else {
+                  this.ruleForm.headportrait = data.Location
+                  this.uploadImageLoading = false
+                  this.setJsonL()
+									return resolve();
+								}
+							});
+					} else {
+						resolve("");
+            this.uploadImageLoading = false
+
+						console.log("没上传成功");
+					}
+				};
+				input.click();
+			});
+		},
+    setJsonL(){
+      if (!this.ruleForm.name.trim()) return this.$message.error('请输入姓名')
+      let con = this.teaType.filter(e=> e.id == '2a1379bd-54a0-11ef-b873-005056b86db5')
+      if (con[0].value.length == 0) return this.$message.error('请选择职务')
+      let con1 = this.teaType.filter(e=> e.id == '2d255541-54a0-11ef-b873-005056b86db5')
+      if (con1[0].value.length == 0) return this.$message.error('请选择司龄')
+
+      
+      let allC = []
+      this.teaType.forEach(e=>{
+        allC = [...allC,...e.value]
+      })
+      console.log('allC',allC);
+      
+
+
+      let params = [{
+        userid: this.userid,
+        h: this.ruleForm.headportrait ? this.ruleForm.headportrait : '',
+        username: this.ruleForm.name,
+        sex:this.ruleForm.sex == '男' ? 0 : 1,
+        cclassid: allC.join(','),
+        intro: this.ruleForm.intro,
+        
+      }];
+          // this.editType = true
+      
+     console.log('params',params);
+      //  return
+      this.ajax
+        .post(this.$store.state.api + "updateliyuanUser", params)
+        .then((res) => {
+          this.$message.success('修改成功')
+          this.editType = true
+          
+          this.getData()
+          // this.$emit("update:dialogVisibleInfo", false);
+        })
+        .catch((err) => {
+          this.$message.error("网络不佳");
+          console.error(err);
+        });
+
+      
+    },
+    editInfo(){
+      this.editType = !this.editType
+      if (this.editType == true) {
+        this.ruleForm = JSON.parse(JSON.stringify(this.ruleFormCopy))
+      }
+    },
+    getOrg() {
+      this.isLoading = true;
+      this.ajax
+        .get(this.$store.state.api + "selectorg2", "")
+        .then((res) => {
+          this.isLoading = false;
+          this.orgJuri = res.data[0];
+        })
+        .catch((err) => {
+          this.isLoading = false;
+          console.error(err);
+        });
+    },
+//获取分类类名
+    getTypeInfo() {
+      return new Promise((resolve, reject) => {
+        let params = {
+          oid: this.oid
+        };
+        this.ajax
+          .get(this.$store.state.api + "selectPerInfoAllTea", params)
+          .then((res) => {
+            
+            this.teaType = res.data[0];
+            
+            let typeInfo = res.data[1];
+
+            this.teaType.forEach((e) => {
+              e.child = [];
+              e.value = [];
+              typeInfo.forEach((i) => {
+                if (e.id == i.parentid) {
+                  e.child.push({ id: i.id, name: i.name })
+                }
+              })
+            })
+
+            this.options = res.data[2];
+            resolve(1)
+          })
+          .catch((err) => {
+            reject(1)
+            console.error(err);
+          });
+        })
+      
+    },
+    async getData() {
+
+      await this.getTypeInfo()
+      let params = {
+        uid: this.userid,
+      };
+      this.ajax
+        .get(this.$store.state.api + "selectTestUser", params)
+        .then((res) => {
+
+           res.data[0][0].sex = res.data[0][0].sex ? "女" : "男";
+            this.ruleForm = res.data[0][0];
+            this.ruleForm.org = res.data[0][0].org
+              ? res.data[0][0].org.split(",")[0]
+              : "";
+            this.ruleForm.type =
+              res.data[0][0].type == 1
+                ? "老师"
+                : res.data[0][0].type == 2
+                ? "学生"
+                : "管理员";
+                this.ruleForm.sBySchool = res.data[0][0].organizationname
+               
+                
+            this.getCcName(res.data[0][0].organizeid);
+        
+            this.teaType.forEach(e =>{
+              let array2 = []
+              for (var i = 0; i < e.child.length; i++) {
+                array2.push(e.child[i].id)
+              }
+              e.value = this.arrayToArray(this.ruleForm.cclassid.split(','), array2)
+
+          })
+
+           this.ruleFormCopy = JSON.parse(JSON.stringify(this.ruleForm))
+            console.log('this.ruleForm',JSON.parse(JSON.stringify(this.ruleForm)));
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    arrayToArray(arrayo, arrayt) {
+      let array1 = arrayo;
+      let array2 = arrayt;
+
+      let commonElements = [];
+
+      for (let i = 0; i < array1.length; i++) {
+        for (let j = 0; j < array2.length; j++) {
+          if (array1[i] === array2[j]) {
+            commonElements.push(array1[i]);
+          }
+        }
+      }
+      return commonElements;
+    },
+   
+    getCcName(oid) {
+      let params = { oid: oid };
+      this.ajax
+        .get(this.$store.state.api + "selectTeacherOfficeBySchool", params)
+        .then((res) => {
+          var cBox = res.data[0];
+          var str = this.ruleForm.cclassid;
+          var arr = str.split(",");
+          for (var k = 0; k < cBox.length; k++) {
+            for (var i = 0; i < arr.length; i++) {
+              if (cBox[k].id == arr[i] && cBox[k].parentid == '6') {
+                if (this.ccName == "") {
+                  this.ccName = cBox[k].name;
+                } else {
+                  this.ccName += "," + cBox[k].name;
+                }
+              }
+            }
+          }
+        })
+        .catch((err) => {
+          console.error(err);
+        });
+    },
+    Ochange() {
+      this.$forceUpdate()
+    }
+  },
+  created() {
+    this.getOrg();
+    // this.getSchool()
+    this.getData()
+    // this.getDetail();
+  },
+};
+</script>
+
+<style scoped>
+.pb_contentO{
+  display: flex;
+  flex-direction: column;
+  display: flex;
+  gap: 20px;
+  height: 100%;
+  width: 100%;
+  background: #fff;
+  /* padding: 20px;
+  box-sizing: border-box; */
+}
+.pb_content{
+  display: flex;
+  gap: 20px;
+  height: 100%;
+  width: 100%;
+  background: #fff;
+  padding: 0 90px;
+  box-sizing: border-box;
+}
+.leftInfo{
+  width: 20%;
+}
+.leftInfoCon{
+  box-sizing: border-box;
+  display: flex;
+  justify-content: center;
+  flex-direction: column;
+  align-items: center;
+  box-shadow: 0px 4px 20px 0px #0000001A;
+  background: #fff;
+  border-radius: 12px;
+  padding-top: 40px;
+  padding-right: 50px;
+  padding-bottom: 40px;
+  padding-left: 50px;
+  gap: 19px;
+
+}
+.rightCon{
+  width: 80%;
+  box-shadow: 0px 4px 20px 0px #0000001A;
+  border-radius: 12px;
+  padding-top: 40px;
+  padding-right: 50px;
+  padding-bottom: 40px;
+  padding-left: 50px;
+  box-sizing: border-box;
+}
+
+.rightCon >>> .el-select{
+  width: 100%;
+}
+
+.rightCon >>> .el-input{
+  width: 100% !important;
+}
+.rightCon >>> .el-form-item{
+    margin-bottom: 15px !important;
+}
+.rightCon >>> .el-form-item__label{
+  color: #000 !important;
+}
+.diaBtn {
+	display: flex;
+	justify-content: flex-end;
+	gap: 10px;
+	/* height: 40px; */
+	align-items: center;
+	padding: 10px 0px 0 !important;
+	box-sizing: border-box;
+	/* min-height: 60px; */
+}
+.diaBtn > div {
+	background: #e7e7e7;
+	border-radius: 25px;
+	height: 24px;
+	width: 56px;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	box-sizing: border-box;
+	font-family: PingFang SC;
+	font-weight: 400;
+	font-size: 12px;
+	cursor: pointer;
+}
+</style>

+ 47 - 0
src/components/pages/liyuan/schoolSafe.vue

@@ -0,0 +1,47 @@
+<template>
+  <div class="teacherDevelop">
+    <topBar title="平安校园" detail="日常巡查记录 · AI辅助分析"></topBar>
+    <div class="cardBox">
+      <card v-for="item in cardArray" :key="item.title" :title="item.title" :icon="item.icon" :to="item.to" :type="item.type"></card>
+    </div>
+  </div>
+</template>
+
+<script>
+import topBar from './components/topBar'
+import card from './components/card.vue';
+export default {
+  components: {
+    topBar,
+    card
+  },
+  data() {
+    return {
+      cardArray: [
+        { title: '安全巡查', icon: require('../../../assets/icon/liyuan/mbll.svg'), type: 1, to: "/safeTest" },
+        { title: '安全表单', icon: require('../../../assets/icon/liyuan/workTest.svg'), type: 1, to: "/test" }
+      ]
+    }
+  },
+}
+</script>
+
+<style scoped>
+.teacherDevelop{
+  width: 100%;
+  height: 100%;
+  padding: 40px 90px;
+
+  box-sizing: border-box;
+  background: #FAFAFA;
+
+}
+
+.cardBox{
+  display: grid;
+  grid-template-columns: repeat(5, 1fr);
+  gap: 20px;
+  width: 100%;
+  margin-top: 20px;
+}
+</style>

+ 48 - 0
src/components/pages/liyuan/studentEva.vue

@@ -0,0 +1,48 @@
+<template>
+  <div class="teacherDevelop">
+    <topBar title="学生评价" detail="科学的目标体系 · 多维度评价分析 · 全面的成长报告"></topBar>
+    <div class="cardBox">
+      <card v-for="item in cardArray" :key="item.title" :title="item.title" :icon="item.icon" :to="item.to" :type="item.type"></card>
+    </div>
+  </div>
+</template>
+
+<script>
+import topBar from './components/topBar'
+import card from './components/card.vue';
+export default {
+  components: {
+    topBar,
+    card
+  },
+  data() {
+    return {
+      cardArray: [
+        { title: '目标管理', icon: require('../../../assets/icon/liyuan/mbll.svg'), type: 1, to: "/evaluation" },
+        { title: '学生评价', icon: require('../../../assets/icon/liyuan/seva.svg'), type: 1, to: "/works" },
+        // { title: '成绩录入', icon: require('../../../assets/icon/liyuan/scolr.svg'), type: 1, to: "/portraitL" }
+      ]
+    }
+  },
+}
+</script>
+
+<style scoped>
+.teacherDevelop{
+  width: 100%;
+  height: 100%;
+  padding: 40px 90px;
+
+  box-sizing: border-box;
+  background: #FAFAFA;
+
+}
+
+.cardBox{
+  display: grid;
+  grid-template-columns: repeat(5, 1fr);
+  gap: 20px;
+  width: 100%;
+  margin-top: 20px;
+}
+</style>

+ 59 - 0
src/components/pages/liyuan/teacherDevelop.vue

@@ -0,0 +1,59 @@
+<template>
+  <div class="teacherDevelop">
+    <topBar title="教师发展" detail="教师年度考核 · 教师成长画像 · AI课堂观察"></topBar>
+    <div class="cardBox">
+      <card v-for="item in cardData(cardArray)" :key="item.title" :title="item.title" :icon="item.icon" :to="item.to" :type="item.type"></card>
+    </div>
+  </div>
+</template>
+
+<script>
+import topBar from './components/topBar'
+import card from './components/card.vue';
+export default {
+  components: {
+    topBar,
+    card
+  },
+  computed:{
+    // 进行权限判断一些只有管理员能看
+    cardData(){
+      return (val)=>{
+          let com = val.filter(e=> e.role==0 || (this.role == 1 && e.role == 1) )
+          return com
+      }
+    }
+  },
+  data() {
+    return {
+      role: this.$route.query.role,
+
+      cardArray: [
+        { title: '年度考核', icon: require('../../../assets/icon/liyuan/niandukaohe.svg'), type: 1, to: "/examineL",role:0 },
+        { title: '个人档案', icon: require('../../../assets/icon/liyuan/gerendangan.svg'), type: 1, to: "/userInfoL",role:0 },
+        { title: '教师画像', icon: require('../../../assets/icon/liyuan/jiaoshihuaxiang.svg'), type: 1, to: "/portraitL",role:0 },
+        { title: '课堂观察', icon: require('../../../assets/icon/liyuan/ketangguancha.svg'), type: 1, to: "/classroomObservation",role:0 },
+        { title: '智能表单', icon: require('../../../assets/icon/liyuan/zhinengbiaodan.svg'), type: 1, to: "/test",role:1 },
+      ]
+    }
+  },
+}
+</script>
+
+<style scoped>
+.teacherDevelop{
+  width: 100%;
+  height: 100%;
+  padding: 40px 90px;
+  box-sizing: border-box;
+  background: #FAFAFA;
+}
+
+.cardBox{
+  display: grid;
+  grid-template-columns: repeat(5, 1fr);
+  gap: 20px;
+  width: 100%;
+  margin-top: 20px;
+}
+</style>

+ 12 - 2
src/components/pages/synergyCourse/course.vue

@@ -1,5 +1,7 @@
 <template>
-  <div class="pb_content" style="height: auto; width: 94%; margin: 10px auto;background: unset;">
+  <div class="pb_content" style="height: auto; width: 94%; margin: 10px auto;background: unset;box-sizing: border-box;" :class="[gotype ? 'liyuan' :'']" >
+    <backPage style="padding: 40px 0 0;" v-if="gotype" tit="协同建构"></backPage>
+    
     <div style="width:100%;padding:0 21px;background:#fff;border-radius: 5px;box-sizing: border-box;">
       <div class="pb_head top">
         <div style="
@@ -299,13 +301,15 @@ import "../../../common/aws-sdk-2.235.1.min";
 import EditorBar from "../../../components/tools/wangEnduit";
 // import CourseProblem from "./components/courseProblem";
 import { myMixin } from "@/mixins/mixin.js"
+import backPage from "../liyuan/components/backPage.vue";
 
 export default {
   mixins: [ myMixin ],
 
-  components: { EditorBar },
+  components: { EditorBar,backPage },
   data() {
     return {
+      gotype:sessionStorage.getItem('gotype'),
       itemCount: 1,
       courseTitle: "",
       courseText: "",
@@ -2035,4 +2039,10 @@ export default {
 .buttonBox>div:hover {
   background: #f6f8ff;
 }
+.liyuan{
+  padding: 0 90px !important;
+  width: 100% !important;
+  box-sizing: border-box !important;
+  margin: 0 !important;
+}
 </style>

+ 9 - 0
src/components/pages/sz/teacher.vue

@@ -2,7 +2,10 @@
   <div
     class="pb_content"
     style="background: unset; height: 100%; overflow: auto"
+    :style="{padding: gotype? '0 57px' :''}"
   >
+    <backPage style="padding: 40px 33px 0;" v-if="gotype" tit="教师管理"></backPage>
+
     <div
       class="pb_content_body"
       style="
@@ -300,9 +303,15 @@
 <script>
 import $ from "jquery";
 // import pinyin from "../../../../node_modules/js-pinyin/index";
+import backPage from '../liyuan/components/backPage.vue'
+
 export default {
+  components:{
+        backPage
+    },
   data() {
     return {
+      gotype: sessionStorage.getItem('gotype'),
       tableHeight: "500px",
       isLoading: false,
       formLabelWidth: "100px",

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

@@ -65,6 +65,7 @@ export default {
     },
     data() {
         return {
+            gotype:sessionStorage.getItem('gotype'),
             userid: this.$route.query.userid,
             oid: this.$route.query.oid,
             org: this.$route.query.org,

+ 11 - 2
src/components/pages/test/aggregate/index.vue

@@ -50,7 +50,7 @@
               width="130"
               :resizable="false"
             >
-              <template slot="header" slot-scope="{ column, $index }">
+              <template slot="header" slot-scope="{ column }">
                 <el-tooltip
                   class="item"
                   effect="dark"
@@ -122,6 +122,7 @@
 export default {
   data() {
     return {
+      betaL:'',
       userid: this.$route.query.userid,
       oid: this.$route.query.oid,
       org: this.$route.query.org,
@@ -136,6 +137,8 @@ export default {
   },
 
   mounted() {
+    this.betaL = window.location.href.includes("beta") ? "beta" : "cloud"
+
     this.getData();
     this.getTeaList();
   },
@@ -159,7 +162,11 @@ export default {
     },
     gotoFrom(val, uid) {
       // return console.log(val, uid);
-      this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${uid}`;
+      if(this.betaL == 'beta'){
+        this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${uid}`;
+      }else{
+        this.ifmUrl = `https://pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${uid}`;
+      }
       // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/test?userid=${this.userid}&oid=45facc0a-1211-11ec-80ad-005056b86db5&org=&role=0`;
       this.diaIframe = true;
     },
@@ -239,6 +246,8 @@ export default {
       this.$router.push(
         "/checkToTest?cid=" +
           column.property +
+          "&userid=" +
+          this.userid +
           "&oid=" +
           this.oid +
           "&org=" +

+ 722 - 25
src/components/pages/test/check/index.vue

@@ -214,6 +214,155 @@
                 >
                   AI分析
                 </div>
+
+
+
+                 <el-popover
+                 v-if="stype == 2"
+                  placement="top-start"
+                  width="320"
+                  ref="popover1"
+                  :visible-arrow="false"
+                  trigger="click"
+
+                  >
+                    <div class="openCeBox" v-loading="aiscoLoading">
+                        <div style="display: flex;justify-content: space-between;align-items: center;">
+                          <div class="TopTit">智能分析列</div>
+                          <el-popover
+                            placement="bottom"
+                            @click.native.stop
+                            :visible-arrow="false"
+                            width="300"
+                            ref="popover2"
+                            v-model="opQvisible"
+                            trigger="click">
+                            <div>
+                              <div style="display: flex;align-items: center;margin-bottom: 10px;">
+                                <img src="../../../../assets/delicon.svg" alt="">是否确认清空
+                              </div>
+                              <div style="padding: 0 20px;box-sizing: border-box;">清空会删除所有配置信息,并同步删除已经生成完成的数据列。请谨慎操作!</div>
+                              <div style="display: flex;justify-content: flex-end;margin-top: 10px;">
+                                  <el-button class="BtnOPC" @click="opQvisible = false"> 取消</el-button>
+                                  <el-button class="BtnOPC" @click="cleancueWord" style="background: #1456F0;" type="primary">确定</el-button>
+                              </div>
+                            </div>
+                            <div class="Topkong" slot="reference">
+                              <img src="../../../../assets/clear.svg" alt="">
+                              清空
+                            </div>
+                          </el-popover>
+
+                        </div>
+                        <div style="font-size: 12px;color: #6E6B6B;">标题</div>
+                        <div>
+                          <el-input v-model="cueWord.openCeTit" placeholder="输入列标题"></el-input>
+                        </div>
+                        <div style="font-size: 12px;color: #6E6B6B;">配置</div>
+                        <div style="background: #F5F6F7;padding: 10px;box-sizing: border-box;border-radius: 5px;">
+                          <div style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 5px;">
+                            <div style="font-size: 12px;color: #6E6B6B;">输入指令*</div>
+
+                              <div style="position: relative;font-size: 12px;color: #3992EA;" >
+                                <div style="cursor: pointer;" @click="quoteShow">
+                                    <i class="el-icon-circle-plus-outline"></i>
+                                    引用字段
+                                </div>
+
+
+                                <div class="quoteBlock" v-if="quoteV">
+                                  <el-input  v-model="opcInp" placeholder="请输入内容">
+                                    <i slot="prefix" class="el-input__icon el-icon-search"></i>
+                                  </el-input>
+                                  <div class="quoteBlockCon">
+                                    <div v-if="!opcInp.trim() ? true : '序号'.includes(opcInp)" :class="[cueWord.fieldList.indexOf('序号') != -1 ? 'selCss' :'']"
+                                    @click="addfield('序号')">序号</div>
+
+                                    <div v-if="!opcInp.trim() ? true :'提交人'.includes(opcInp)" :class="[cueWord.fieldList.indexOf('提交人') != -1 ? 'selCss' :'']"
+                                    @click="addfield('提交人')">提交人</div>
+
+                                    <template  v-for="(i,index) in teaType">
+                                      <div v-if="!opcInp.trim() ? true : i.name.includes(opcInp)" :class="[cueWord.fieldList.indexOf(i.name) != -1 ? 'selCss' :'']"
+                                       @click="addfield(i.name)" :key="index+'a'">
+                                        <el-tooltip class="item" effect="dark" :content="i.name" placement="top">
+                                            <div style="
+                                            white-space: nowrap;
+                                            overflow: hidden;
+                                            text-overflow: ellipsis;">
+                                            {{ i.name }}</div>
+                                        </el-tooltip>
+                                      </div>
+                                    </template>
+
+
+                                    <div v-if="!opcInp.trim() ? true : '提交时间'.includes(opcInp)" :class="[cueWord.fieldList.indexOf('提交时间') != -1 ? 'selCss' :'']"
+                                    @click="addfield('提交时间')">提交时间</div>
+
+                                    <template v-for="(i,index) in fie(chapters)">
+                                      <div :class="[cueWord.fieldList.indexOf(i.json.title) != -1 ? 'selCss' :'']"
+                                        v-if="!opcInp.trim() ? true :i.json.title.includes(opcInp)" @click="addfield(i.json.title)"
+                                        :key="index+'b'">
+
+                                         <el-tooltip class="item" effect="dark" :content="i.json.title" placement="top">
+                                            <div style="
+                                            white-space: nowrap;
+                                            overflow: hidden;
+                                            text-overflow: ellipsis;">
+                                            {{ i.json.title }}</div>
+                                        </el-tooltip>
+
+                                      </div>
+                                    </template>
+
+                                  </div>
+
+                                </div>
+                                <div class="maskCss" v-if="quoteV" @click.stop="quoteV = false,opcInp=''"></div>
+
+                              </div>
+
+                          </div>
+                          <div style="display: flex;gap: 8px;margin-bottom: 5px;flex-wrap: wrap;">
+                            <span class="SPCE" v-for="(i,index) in cueWord.fieldList" :key="index+'c'">
+                              {{ i }} <i @click="addfield(i)" class="el-icon-close" style="cursor: pointer;"></i>
+                            </span>
+                          </div>
+                          <div>
+                            <el-input
+                              resize="none"
+                              type="textarea"
+                              :rows="8"
+                              placeholder="请输入内容"
+                              v-model="cueWord.openCeCon">
+                            </el-input>
+                          </div>
+                        </div>
+                        <!-- <div style="display: flex;justify-content: flex-start;align-items: center;gap: 5px;">
+                          <el-switch
+                            v-model="openCeVal"
+                            >
+                          </el-switch>
+                          <span>自动更新
+                             <el-tooltip class="item" effect="dark" content="开启后,当前字段将跟随配置内容的变化同步更新" placement="top">
+                                <i class="el-icon-warning-outline"></i>
+                              </el-tooltip>
+                            </span>
+                        </div> -->
+                        <div style="margin-top: 10px;display: flex;justify-content: flex-end;">
+                          <el-button @click="opQvisible0 = false">取消</el-button>
+                          <el-button style="background: #1456F0;" @click="markSco()" type="primary">确定</el-button>
+                        </div>
+                    </div>
+
+
+                    <div
+                      slot="reference"
+                      class="btnA"
+                    >
+                      智能分析列
+                    </div>
+                </el-popover>
+
                 <!--v-if="this.worksArray.length"-->
               </div>
             </div>
@@ -1169,7 +1318,7 @@
                 width="170px"
                 align="left"
               >
-              <template slot="header" slot-scope="scope">
+              <template slot="header">
                   <div
                   style="display: flex; align-items: center"
                   >
@@ -1228,7 +1377,7 @@
                 "
               >
                 <!--  item.type==8?getTimeFilterText(item,index): item.type==8?(value,row)=>{return filterTime(value,row,index)}:  item.type == 8 ||-->
-                <template slot="header" slot-scope="scope">
+                <template slot="header">
                   <div
                     v-if="item.type == 8"
                     style="display: flex; align-items: center"
@@ -1369,9 +1518,24 @@
                   </div>
                 </template>
               </el-table-column>
+              <el-table-column
+                label="dee"
+                width="150px"
+                fixed="right"
+                v-if="scoList.length"
+              >
+              <template #header>
+                <div>
+                  <span>{{ cueWordCopy.openCeTit }} <span class="proBar" v-if="aiscoLoading">AI生成中{{ LoadingProgress }}%</span></span>
+                </div>
+              </template>
+                <template slot-scope="scope">
+                  <span>{{ userSco(scope.row.userid) }}</span>
+                </template>
+              </el-table-column>
               <el-table-column
                 label="操作"
-                width="200px"
+                width="250px"
                 fixed="right"
                 v-if="isN != 1"
               >
@@ -1382,8 +1546,16 @@
                     v-if="(examineData && examineData.type == 1) || !examineData"
                     size="small"
                     >查看</el-button
+                  >
 
+                  <el-button
+                    @click="editTest(scope.row)"
+                    type="primary"
+                    v-if="(examineData && examineData.type == 1) || !examineData"
+                    size="small"
+                    >编辑</el-button
                   >
+
                   <!-- <el-button @click="setWordHtml(scope.row)" type="primary" size="small">导出答题信息</el-button>
 									<el-button @click="setWordTemplate(scope.row)" type="primary" size="small">word导出</el-button> -->
                   <el-button
@@ -1898,6 +2070,26 @@ export default {
   },
   data() {
     return {
+      aiscoId:'',
+      aiscoLoading:true,
+      cueWord:{
+        openCeCon:'', //指令
+        openCeTit:'', //标题
+        fieldList:[]
+      },
+      cueWordCopy:{
+        openCeCon:'', //指令
+        openCeTit:'', //标题
+        fieldList:[]
+      },
+      scoList:[],
+      quoteV:false,
+      openCeVal:false,
+      LoadingProgress:0,
+      opQvisible:false,
+      opQvisible2:false,
+      opcInp:'',
+      languageSetting: 0,
       userid: this.$route.query.userid,
       oid: this.$route.query.oid,
       org: this.$route.query.org,
@@ -1969,6 +2161,24 @@ export default {
   },
   watch: {},
   computed: {
+     // 去除不能评分的指令
+    fie(){
+      return function (val) {
+        console.log('fie',val);
+
+        const con = val.filter(e => [12,11,6,14].indexOf(e.type) == -1)
+        return con
+      }
+    },
+    // ai评分分数
+    userSco(){
+      return function (val) {
+        const con = this.scoList.find(u => u.uid === val);
+        // console.log('con',con);
+
+        return con ? con.sco : '';
+      }
+    },
     TeachNameCpt: function () {
       // `this` 指向 vm 实例
       return this.TeachingOptions.filter((i) => {
@@ -2133,6 +2343,345 @@ export default {
     }
   },
   methods: {
+// 清除分数
+    cleancueWord(){
+      if (!this.aiscoId) return
+      let params = [{
+        tid:this.cid
+      }]
+      console.log('params',params);
+       this.ajax
+        .post(this.$store.state.api + "deltestAisco", params)
+        .then((res) => {
+          console.log(res);
+           this.$message({
+            message: "删除成功",
+            type: "success"
+          });
+          this.getAiSco()
+        })
+        .catch((err) => {
+          this.$message({
+            message: "删除失败",
+            type: "error"
+          });
+          console.error(err);
+        });
+        this.opQvisible = false
+    },
+ // 点击开始评分
+    async markSco(){
+      if (!this.cueWord.openCeTit.trim()) return this.$message.error('请输入标题')
+      if (!this.cueWord.openCeCon.trim()) return this.$message.error('请输入指令')
+      if (this.cueWord.fieldList.length == 0) return this.$message.error('请选择引用字段')
+        this.aiscoLoading = true
+
+      let forAllList = [];
+      // this.scoList = []
+
+      for (let index = 0; index < this.tableWorksArray.length; index++) {
+          let mkAwit = this.loopSco(this.tableWorksArray[index],index)
+          forAllList.push(mkAwit);
+      }
+
+      Promise.all(forAllList)
+        .then(values => {
+          console.log("values", values);
+
+          this.uploadSCo()
+
+          setTimeout(() => {
+            this.LoadingProgress = 0
+          }, 1000);
+        })
+        .catch(reason => {
+          this.aiscoLoading = false
+
+          this.$message({
+            message: "评价失败",
+            type: "error"
+          });
+          console.error("reasonreasonreasonreasonreason", reason);
+          // 输出“失败原因”
+        });
+    },
+    // ai评分循环
+    async loopSco(val){
+      // console.log('6666',val);
+
+      console.log('loopSco',val);
+
+      let userWork =[]
+      let _fileid = ''
+for (let index = 0; index < val.array.length; index++) {
+          if (val.array[index].type == 3 && this.cueWord.fieldList.includes(val.array[index].json.title)) {
+            userWork += val.array[index].json.title +':'+ val.array[index].json.answer2+','
+            // userWork.push( {
+            //   // type:'文本',
+            //   tit: val.array[index].json.title,
+            //   con: val.array[index].json.answer2
+            // })
+          }
+          if (val.array[index].type == 5 && this.cueWord.fieldList.includes(val.array[index].json.title)) {
+            // console.log('qqq',val.array[index].json.file)
+            // console.log('888',this.cueWord.fieldList)
+
+            if (val.array[index].json.file && val.array[index].json.file[0].url) {
+              // console.log('6666')
+              _fileid = await this.createFileid(val.array[index].json.file[0].url)
+            }
+
+            userWork += val.array[index].json.title+':' + _fileid+','
+            // userWork.push( {
+            //   // type:"附件",
+            //   detail:val.array[index].json.detail,
+            //   tit: val.array[index].json.title,
+            //   con: _fileid
+            // })
+          }
+          if (val.array[index].type == 7 && this.cueWord.fieldList.includes(val.array[index].json.title)) {
+            userWork += val.array[index].json.title+':'+val.array[index].json.answer2+','
+            // userWork.push( {
+            //   // type:"评分",
+            //   rule:`${val.array[index].json.small}分-${val.array[index].json.big}分`,
+            //   detail:val.array[index].json.detail,
+            //   tit: val.array[index].json.title,
+            //   con: val.array[index].json.answer2
+            // })
+          }
+          if (val.array[index].type == 1 && this.cueWord.fieldList.includes(val.array[index].json.title)) {
+            let kk = []
+            val.array[index].json.answer2.forEach((e)=>{
+              kk.push(val.array[index].json.array[e].option)
+            })
+            userWork += val.array[index].json.title+':' +kk.join(',')+','
+            // userWork.push( {
+            //   tit: val.array[index].json.title,
+            //   con: kk.join(','),
+            //   type: val.array[index].json.type == 1?"单选题": "多选题",
+            // })
+          }
+        }
+      return new Promise((resolve, reject) => {
+        // const result = userWork.filter(item => this.cueWord.fieldList.includes(item.tit));
+
+        let messages = `NOTICE
+                Role: 你是一个资深的教师,你要根据评分标准,对用户回答进行评分
+                  Language: ${this.getLang()}
+
+                  #目标
+                  作业内容中tit是题目,con是用户回答。
+                  根据用户信息与作业内容进行评分。
+
+                 #评分资料#
+
+                  评价标准:${this.cueWord.openCeCon}
+
+                  作业内容 ${this.cueWord.fieldList.includes('提交人') ? '提交人:' +val.name :''}
+                          ${this.cueWord.fieldList.includes('学段') ? '学段:' +this.getTType(this.teaType[0].id,val.cclassid) :''}
+                          ${this.cueWord.fieldList.includes('年级') ? '年级:' +this.getTType(this.teaType[1].id,val.cclassid) :''}
+                          ${this.cueWord.fieldList.includes('学科') ? '学科:' +this.getTType(this.teaType[2].id,val.cclassid) :''}
+                          ${this.cueWord.fieldList.includes('职务') ? '职务:' +this.getTType(this.teaType[3].id,val.cclassid) :''}
+                          ${this.cueWord.fieldList.includes('教龄') ? '教龄:' +this.getTType(this.teaType[4].id,val.cclassid) :''}
+                          ${this.cueWord.fieldList.includes('作业提交时间') ? '作业提交时间:' +val.time :''}
+                          ${userWork}
+
+                  #输出要求#
+                  根据评价标准对作业内容进行评分,直接输出合计分数!只输出数字,不要输入任何其他无关内容!
+
+                  #输出格式#
+                  分数
+                  `;
+
+                  // console.log('messages',messages);
+
+          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.userid,
+          file_ids: _fileid ? [_fileid] : [],
+          isImage: "",
+          model: "gpt-4o-2024-11-20"
+          };
+          this.ajax
+            .post("https://gpt4.cocorobo.cn/ai_agent_park_chat", params)
+            .then(response => {
+                 let data = response.data.FunctionResponse;
+                  console.log("data", data);
+
+              try {
+                  //  const prompt = [
+                  //     {
+                  //       role: 'user',
+                  //       content: `输出一个json格式的格式如下:{uid:${ val.userid },sco: ${data.message}}}`,
+                  //     },
+                  //   ];
+                  //   this.chat_no_stream(prompt, { type: 'json_object' }).then((res) => {
+                  //     // this.suggestList = JSON.parse(res).suggest;
+                  //     console.log(res);
+                  //   });
+                  let ind = this.scoList.findIndex(e=> e.uid == val.userid )
+                 console.log('ind',ind);
+
+                  if (ind != -1) {
+                    this.scoList.splice(ind,1,{uid: val.userid ,sco: data.message})
+                  }else{
+                    this.scoList.push({uid: val.userid ,sco: data.message})
+                  }
+
+              } catch (error) {
+                 let ind = this.scoList.findIndex(e=> e.uid == val.userid )
+                 console.log('ind',ind);
+
+                  if (ind != -1) {
+                    this.scoList.splice(ind,1,{uid: val.userid ,sco: ''})
+                  }else{
+                    this.scoList.push({uid: val.userid ,sco: ''})
+                  }
+                // this.scoList.push({uid: val.userid ,sco: data.message})
+                this.$message.error( val.name + '评分失败')
+              }
+              this.LoadingProgress = ((this.scoList.length / this.tableWorksArray.length) * 100).toFixed(0)
+
+              return resolve(1)
+            })
+            .catch(error => {
+              this.aiscoLoading = false
+              this.$message.error('评分失败')
+              reject(error)
+              console.log(error);
+            });
+        })
+
+    },
+    // 获取评分
+    async getAiSco(){
+      return new Promise((resolve, reject) => {
+        this.aiscoLoading = true
+        let params = {
+          tid: this.cid,
+        };
+        this.ajax
+          .get(this.$store.state.api + "getTestAiSco", params)
+          .then((res) => {
+            if (res.data[0].length) {
+                this.aiscoId = res.data[0][0].id
+                this.cueWord = JSON.parse(res.data[0][0].cueWord)
+                this.cueWordCopy = JSON.parse(res.data[0][0].cueWord)
+                this.scoList = JSON.parse(res.data[0][0].json)
+            }else{
+              this.cueWord={
+                openCeCon:'', //指令
+                openCeTit:'', //标题
+                fieldList:[]
+              }
+              this.cueWordCopy={
+                openCeCon:'', //指令
+                openCeTit:'', //标题
+                fieldList:[]
+              }
+              this.scoList=[]
+            }
+            this.aiscoLoading = false
+
+              console.log('8888888888',res.data[0]);
+              resolve(1)
+          })
+          .catch((err) => {
+            reject(err)
+            this.aiscoLoading = false
+
+            console.error(err);
+          });
+      })
+
+    },
+    // 上传评分
+    uploadSCo(){
+      this.aiscoLoading = true
+
+      let params = [{
+        tid:this.cid,
+        uid:'6063369f-289a-11ef-8bf4-12e77c4cb76b',
+        json:JSON.stringify(this.scoList),
+        cw: JSON.stringify(this.cueWord)
+      }]
+      console.log('params',params);
+       this.ajax
+        .post(this.$store.state.api + "addtestAiSco", params)
+        .then((res) => {
+          console.log(res);
+           this.$message({
+            message: "评价成功",
+            type: "success"
+          });
+          this.getAiSco()
+        })
+        .catch((err) => {
+          this.aiscoLoading = false
+          this.$message({
+            message: "评价失败",
+            type: "error"
+          });
+          console.error(err);
+        });
+    },
+    // 获取文档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);
+        }
+      });
+    },
+    getLang() {
+      let lang = "";
+      if (this.languageSetting == 0) {
+        lang = "Chinese.";
+      } else if (this.languageSetting == 1) {
+        lang = "Traditional Chinese.";
+      } else if (this.languageSetting == 2) {
+        lang = "English.";
+      }
+      return lang;
+    },
+    // 打开引用字段弹框
+    quoteShow(){
+      this.quoteV = !this.quoteV
+    },
+    // 添加指令字段
+    addfield(val){
+      if (this.cueWord.fieldList.indexOf(val) != -1) {
+        const index = this.cueWord.fieldList.indexOf(val)
+        this.cueWord.fieldList.splice(index, 1)
+      }else{
+        this.cueWord.fieldList.push(val)
+      }
+    },
     openChat() {
       this.aiChatV = !this.aiChatV;
       this.$nextTick(() => {
@@ -2296,6 +2845,28 @@ export default {
           this.role
       );
     },
+    editTest(row){
+      this.$router.push(
+        "/doTest?cid=" +
+          row.courseid +
+          "&userid=" +
+          this.userid +
+          "&userid2=" +
+          row.userid +
+          "&tid=" +
+          row.id +
+          "&oid=" +
+          this.oid +
+          "&org=" +
+          this.org +
+          "&type=3" +
+          "&role=" +
+          this.role +
+          "&back=1"
+      );
+      // doTest?cid=721eadc1-087c-11f0-b508-005056924926&tid=66db0a89-0a11-11f0-9261-005056924926&userid=6c56ec0e-2c74-11ef-bee5-005056b86db5&oid=414f2361-ad04-11ed-b13d-005056b86db5&org=0fec3a8a-ad04-11ed-b13d-005056b86db5&type=3&role=0
+      console.log("编辑",row)
+    },
     checkDataType(type) {
       this.TeachingValue = "";
       if (this.stype != type) {
@@ -2317,8 +2888,10 @@ export default {
       }
     },
 
-    getData() {
+    async getData() {
       this.isLoading = true;
+      await this.getAiSco()
+
       let params = [
         {
           cid: this.cid,
@@ -2431,25 +3004,54 @@ export default {
               JSON.parse(JSON.stringify(JSON.parse(this.works[i].courseJson)))
             );
             console.log(cJson,'===',chapters)
-            if (JSON.stringify(cJson) == JSON.stringify(chapters)) {
+            // if (JSON.stringify(cJson) == JSON.stringify(chapters)) {
               let _json = this.JSONSetting(
                 JSON.parse(JSON.stringify(JSON.parse(this.works[i].courseJson)))
               );
 
-              _json.forEach((item) => {
-                if (item.type == 11) {
-                  let cid = item.json.answer2;
-                  let _title = [];
-                  for (var i = 0; i < cid.length; i++) {
-                    _title.push(courseTitles[cid[i]]);
+              let _json2 = this.JSONSetting(
+                JSON.parse(JSON.stringify(JSON.parse(JSON.stringify(chapters))))
+              );
+
+              // console.log("json2",_json2)
+
+              // _json.forEach((item) => {
+                // console.log('_jsonItem',item)
+                // if(){
+
+                // }
+                // if (item.type == 11) {
+                //   let cid = item.json.answer2;
+                //   let _title = [];
+                //   for (var i = 0; i < cid.length; i++) {
+                //     _title.push(courseTitles[cid[i]]);
+                //   }
+                //   item.json.answer2 = _title.length ? _title.join(",") : "";
+                // }
+                // if (item.type == 6) {
+                //   let courseId = item.json.answer2;
+                //   item.json.answer2 = courseTitles[courseId] || "";
+                // }
+              // });
+              _json2.forEach(item=>{
+                let _index = _json.findIndex(i=>(i.type==item.type && i.ttype==item.ttype && i.json.title==item.json.title))
+                if(_index!=-1){
+                  item.json = _json[_index].json;
+                  if (item.type == 11) {
+                    let cid = item.json.answer2;
+                    let _title = [];
+                    for (var i = 0; i < cid.length; i++) {
+                      _title.push(courseTitles[cid[i]]);
+                    }
+                    item.json.answer2 = _title.length ? _title.join(",") : "";
+                  }
+                  if (item.type == 6) {
+                    let courseId = item.json.answer2;
+                    item.json.answer2 = courseTitles[courseId] || "";
                   }
-                  item.json.answer2 = _title.length ? _title.join(",") : "";
-                }
-                if (item.type == 6) {
-                  let courseId = item.json.answer2;
-                  item.json.answer2 = courseTitles[courseId] || "";
                 }
-              });
+                })
+              if(JSON.stringify(_json2)==JSON.stringify(this.JSONSetting(JSON.parse(JSON.stringify(chapters)))))continue
               // 更新对应的_json对象的answer2
               array.push({
                 courseid: this.works[i].courseid,
@@ -2458,12 +3060,12 @@ export default {
                 userid: this.works[i].userid,
                 name: this.works[i].username ? this.works[i].username : "匿名",
                 time: this.works[i].time,
-                array: _json,
+                array: _json2,
                 cut: 0,
                 uteaName: this.works[i].uteaName,
                 courseJson: JSON.parse(this.works[i].courseJson),
               });
-            }
+            // }
           }
 
           let allCourseIds = [];
@@ -4070,8 +4672,8 @@ ${JSON.stringify(item.array)}
   color: #00000099;
 }
 
-.test_title .left .info .info_box span:nth-child(2) {
-}
+/* .test_title .left .info .info_box span:nth-child(2) {
+} */
 
 .test_title .right {
   display: flex;
@@ -4094,11 +4696,11 @@ ${JSON.stringify(item.array)}
   align-items: center;
 }
 
-.test_title .right .data_box span:nth-child(1) {
+/* .test_title .right .data_box span:nth-child(1) {
 }
 
 .test_title .right .data_box span:nth-child(2) {
-}
+} */
 
 .test_title .right .data_box span:nth-child(2) .big {
   font-size: 22px;
@@ -4127,8 +4729,8 @@ ${JSON.stringify(item.array)}
   background-size: 100% 100%;
 }
 
-.test_title .right .btn_box span:nth-child(2) {
-}
+/* .test_title .right .btn_box span:nth-child(2) {
+} */
 
 .search_nav {
   border-bottom: 1px solid #e7e7e7;
@@ -4893,4 +5495,99 @@ ${JSON.stringify(item.array)}
 .timePickerActive{
   color: #409EFF;
 }
+.openCeBox{
+  width: 320px;
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  font-size: 14px !important;
+  padding: 10px;
+  box-sizing: border-box;
+}
+.TopTit{
+  font-family: PingFang SC;
+  font-weight: 600;
+  font-size: 16px;
+  line-height: 24px;
+  color: #000;
+}
+.Topkong{
+  font-family: PingFang SC;
+  font-weight: 400;
+  font-size: 12px;
+  color: #000;
+  display: flex;
+  align-items: center;
+  gap: 5px;
+  cursor: pointer;
+}
+.BtnOPC{
+    width: 50px;height: 30px;font-size: 14px;display: flex;
+    justify-content: center;
+    align-items: center;
+    background: #E7E7E7;
+}
+.quoteBlock{
+  position: absolute;
+  right: 0;
+  width: 220px;
+  background: #fff;
+  border-radius: 10px;
+  color: #000;
+  z-index: 100001;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); /* 浅灰色阴影 */
+  border-radius: 5px;overflow: hidden;
+}
+.quoteBlock >>> .el-input__inner{
+    border-radius: 0 !important;
+    border: none !important;
+    box-shadow: none !important;
+   resize: none !important;
+   border-bottom: 1px #DCDFE6 solid !important;
+}
+.quoteBlockCon{
+  padding: 10px 10px;box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+  font-size: 14px;
+  height: 200px;
+  overflow: auto;
+}
+
+.quoteBlockCon > div{
+  height: 25px;line-height: 25px;
+  cursor: pointer;
+  padding: 0 5px;
+  box-sizing: border-box;
+  border-radius: 5px;
+}
+.maskCss{
+  /* background: #000; */
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 10000;
+  opacity: .5;
+}
+.SPCE{
+  font-size: 12px;
+  background: #fff;
+  padding: 2px 5px;box-sizing: border-box;
+  border-radius: 3px;
+}
+.selCss{
+  background: #e7e7e7;
+  color:#0061ff;
+}
+.proBar{
+    background: #dae0f0;
+    font-size: 14px;
+    font-weight: normal;
+    color: #6f93ea;
+    padding: 4px;
+    border-radius: 3px;
+}
 </style>

+ 9 - 4
src/components/pages/test/index.vue

@@ -1,7 +1,9 @@
 <template>
-    <div class="pb_content" style="height: auto; width: calc(100% - 40px); margin: 0 auto;background: unset;">
+    <div class="pb_content" :style="{padding: gotype ? '0 90px' :''}" style="height: auto; width: calc(100% - 40px); margin: 0 auto;background: unset;box-sizing: border-box;">
+        <backPage style="padding: 40px 0 0;" v-if="gotype " tit="智能表单"></backPage>
+
         <div style="width:100%;padding:0;box-sizing: border-box;">
-            <div class="pb_head top">
+            <div class="pb_head top" v-if="!gotype">
                 <div style="display: flex;align-items: center;">
                     <span class="sub_head">表单管理</span>
                     <!-- v-show="oid == '4c686762-1d0a-11ed-8c78-005056b86db5'" -->
@@ -430,11 +432,14 @@ import randar2 from "./data/randar2.vue";
 import shareBox from './shareBox/index.vue'
 import examine from './examine/index.vue'
 import aggregate from './aggregate/index'
+import backPage from "../liyuan/components/backPage.vue";
+
 export default {
     name: 'test',
-    components: { EditorBar, CourseProblem, pie1, pie2, randar1, randar2, shareBox, examine, aggregate },
+    components: { EditorBar, CourseProblem, pie1, pie2, randar1, randar2, shareBox, examine, aggregate,backPage },
     data() {
         return {
+            gotype:sessionStorage.getItem('gotype'),
             examineData: [],
             cutNumber: 0,
             itemCount: 1,
@@ -470,7 +475,7 @@ export default {
             now: "",
             courseDetail: {},
             addCourse: {},
-            groupA: "0",
+            groupA: "4",
             classX: "",
             course: [],
             courseName: "",

+ 1 - 1
src/components/pages/testPerson/examine/index.vue

@@ -541,7 +541,7 @@ export default {
     // 查看数据来源
     lookPrize(val) {
       // return;
-      this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.userid}&tType=${this.pType}&examineId=${this.testExamineBaseList[0].id}`;
+      this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/checkToTest?userid=${this.userid}&cid=${val}&oid=${this.oid}&org=${this.org}&type=2&role=0&peopleId=${this.userid}&tType=${this.pType}&examineId=${this.testExamineBaseList[0].id}`;
       // this.ifmUrl = `https://beta.pbl.cocorobo.cn/pbl-teacher-table/dist/#/test?userid=${this.userid}&oid=45facc0a-1211-11ec-80ad-005056b86db5&org=&role=0`;
       this.diaIframe = true;
     },

+ 43 - 1
src/components/pages/testPerson/test/test.vue

@@ -61,7 +61,9 @@
                         v-if="item.array">
                         <div class="test" v-for="(test, index) in item.array" :key="test.id">
                             <div class="time">
-                                <span>提交记录{{item.array.length - index}}</span>
+                                <span v-if="!test.editName && !test.name">提交记录{{item.array.length - index}}</span>
+                                <span v-if="!test.editName && test.name">{{test.name}}</span>
+                                <el-input :ref="`changeName_${test.id}`" v-if="test.editName" v-model="test.name"  @blur="changeNameUpdate(test.courseid,test.id)" @keyup.enter.native="changeNameUpdate(test.courseid,test.id)"></el-input>
                             </div>
                             <!-- <img @click="deleteTest(test.id)" class="delete"
                                 src="../../../../assets/icon/test/delete.png" alt="" /> -->
@@ -75,6 +77,10 @@
                                 <div @click="deleteTest(test.id)" class="delete">
                                     <span>删除</span>
                                 </div>
+
+                                <div @click="changeName(test.courseid,test.id)">
+                                    <span>重命名</span>
+                                </div>
                                 <!-- <div @click="checkTest(test.courseid, test.id)">
                                     <span></span><span>查看</span>
                                 </div>
@@ -671,7 +677,43 @@ export default {
         changeShowType(value){
           this.checkTypeValue = value;
           this.getWorks();
+        },
+        changeName(courseId,testId){
+          let array = this.worksArray.find(i=>i.courseid == courseId);
+          if(array){
+            array = array.array;
+            array.find(i=>i.id==testId).editName = true;
+            this.$forceUpdate();
+            this.$nextTick(()=>{
+              console.log(this.$refs[`changeName_${testId}`])
+              this.$refs[`changeName_${testId}`][0].focus();
+            })
+          }
+        },
+        changeNameUpdate(courseId,testId){
+          let array = this.worksArray.find(i=>i.courseid == courseId);
+          if(array){
+            array = array.array;
+            array.find(i=>i.id==testId).editName = false;
+            this.$forceUpdate();
+            let data = array.find(i=>i.id==testId);
+            let params = [{
+              uid:this.userid,
+              testId:testId,
+              newName:data.name,
+            }]
+
+            this.ajax.post(this.$store.state.api+"update_testCourseWorksNameById",params).then(res=>{
+              if(res.data == 1){
+                this.$message.success("修改成功")
+              }else{
+                this.$message.error("修改失败")
+                array.find(i=>i.id==testId).name = "";
+              }
+            })
+          }
         }
+
     },
     mounted() {
         // this.selectTestType(1);

+ 12 - 4
src/components/pages/testStudent/view/preview.vue

@@ -4,7 +4,7 @@
       <div class="right">
         <div class="courseTop" :style="`justify-content: ${isN==1?'flex-end':'space-between'};`">
           <div class="stepsNav" v-if="isN !=1">
-            <el-breadcrumb separator-class="el-icon-arrow-right">
+            <el-breadcrumb v-if="!gotype" separator-class="el-icon-arrow-right">
               <el-breadcrumb-item :to="{
     path:
       '/testPerson?userid=' +
@@ -15,7 +15,7 @@
       org +
       '&role=' +
       role,
-  }" v-if="type == 3">个人中心</el-breadcrumb-item>
+  }" v-if="type == 3 && back!=1">个人中心</el-breadcrumb-item>
               <el-breadcrumb-item :to="{
     path:
       '/testStudent?userid=' +
@@ -30,7 +30,7 @@
       isN +
       '&tcid=' +
       tcid ,
-  }" v-else>表单中心</el-breadcrumb-item>
+  }" v-else v-show="back!=1">表单中心</el-breadcrumb-item>
               <el-breadcrumb-item>
                 <span style="color: rgb(15, 126, 255)">{{ title }}</span>
               </el-breadcrumb-item>
@@ -65,6 +65,7 @@ export default {
   },
   data() {
     return {
+      gotype:sessionStorage.getItem('gotype'),
       userid: this.$route.query.userid,
       oid: this.$route.query.oid,
       org: this.$route.query.org,
@@ -87,7 +88,8 @@ export default {
       isReset: false,
       isloading: false,
       courseid: '',
-      gcourseid: this.$route.query.courseid
+      gcourseid: this.$route.query.courseid,
+      back:this.$route.query.back
     }
   },
 	computed:{
@@ -106,6 +108,8 @@ export default {
           type: "warning",
         })
         .then(() => {
+          if(this.back==1)return this.$router.back()
+          if (this.gotype) return this.$router.go(-1)
           if (this.type == 3) {
             this.goTo(
               "/testPerson?userid=" +
@@ -541,6 +545,10 @@ export default {
         .post(this.$store.state.api + ((this.tid) ? "addTestWorks2" : "addTestWorks"), params)
         .then((res) => {
           this.$message.success('提交成功')
+          if(this.back==1){
+            return this.$router.back()
+          }
+          if (this.gotype) return this.$router.go(-1)
           if (this.type == 3) {
             this.goTo(
               "/testPerson?userid=" +

+ 40 - 29
src/components/pages/works.vue

@@ -19,7 +19,9 @@
         left: 50%;
         transform: translateX(-50%);
       "
+      :style="{width: gotype ? 'calc(100% - 180px) !important' :'100%' }"
     >
+    <backPage style="padding: 40px 0 0;" v-if="gotype" tit="学生评价"></backPage>
       <div
         class="pb_content_body"
         style="
@@ -28,35 +30,41 @@
           box-sizing: border-box;
           border-radius: 5px;
         "
+        :style="{width: gotype ? '100%' :'94%' }"
       >
-        <div class="pb_head">
+      
+        <div class="pb_head" style="display: flex;justify-content: space-between;align-items: center;" v-if="!gotype">
           <!-- <span>备注:教师可以根据课程、班级条件筛选学生并查看该学生信息</span> -->
-          <span
-            v-if="type == '2'"
-            @click="
-              goTo(
-                '/tcStudent?userid=' + userid + '&oid=' + oid + '&org=' + org
-              )
-            "
-            >学生管理</span
-          >
-          <span
-            v-else
-            @click="
-              goTo(
-                '/course?userid=' +
-                  userid +
-                  '&oid=' +
-                  oid +
-                  '&org=' +
-                  org +
-                  '&role=' +
-                  role
-              )
-            "
-            >课程管理</span
-          >
-          <span class="sub_head">评价管理</span>
+            <div style="display: flex;align-items: center;">
+                <span
+                  v-if="type == '2'"
+                  @click="
+                    goTo(
+                      '/tcStudent?userid=' + userid + '&oid=' + oid + '&org=' + org
+                    )
+                  "
+                  >学生管理</span
+                >
+                <span
+                  v-else
+                  @click="
+                    goTo(
+                      '/course?userid=' +
+                        userid +
+                        '&oid=' +
+                        oid +
+                        '&org=' +
+                        org +
+                        '&role=' +
+                        role
+                    )
+                  "
+                  >课程管理</span
+                >
+                <span class="sub_head">评价管理</span>
+            </div>
+          
+
           <!-- <span
             @click="
               goTo(
@@ -143,7 +151,7 @@
           </div> -->
         </div>
       </div>
-      <div class="pb_content_body">
+      <div class="pb_content_body" :style="{width: gotype ? '100%' :'94%' }">
         <div class="student_table">
           <el-table
             ref="table"
@@ -526,6 +534,7 @@ import StudentWorksDetail from "./components/studentWorksDetail.vue";
 import exportDataDialog from "./components/exportDataDialog.vue";
 import lookReport from './components/lookReport'
 import { myMixin } from "@/mixins/mixin.js"
+import backPage from './liyuan/components/backPage.vue'
 
 
 
@@ -538,10 +547,12 @@ export default {
     studentReport,
     StudentWorksDetail,
     exportDataDialog,
-    lookReport
+    lookReport,
+    backPage
   },
   data() {
     return {
+      gotype:sessionStorage.getItem('gotype'),
       worksDialog:false,
       exportW:0,
       digNum:0,

+ 1215 - 1102
src/router/index.js

@@ -145,1111 +145,1224 @@ import cocoroboffmpeg from '@/components/pages/cocoroboffmpeg'
 import appStore from '@/components/pages/appStore'
 import knowledge from '@/components/pages/knowledge/index'
 import sassPlatform from '@/components/pages/sassPlatform/index'
+import classroomObservationTest from '@/components/pages/classroomObservation/test.vue'
+import CourseCon from '@/components/pages/liyuan/CourseCon'
+import aiOffice from '@/components/pages/liyuan/aiOffice'
+import schoolSafe from '@/components/pages/liyuan/schoolSafe'
+import lyStudentEva from '@/components/pages/liyuan/studentEva'
+import teacherDevelop from '@/components/pages/liyuan/teacherDevelop'
+import userInfoL from '@/components/pages/liyuan/page/userInfoL'
+import examineL from '@/components/pages/liyuan/page/examine'
+import portraitL from '@/components/pages/liyuan/page/portrait'
+import teadTest from '@/components/pages/liyuan/page/teadTest'
+import Listudent from '@/components/pages/liyuan/page/student'
+import safeTest from '@/components/pages/liyuan/page/safeTest'
+
 // 全局修改默认配置,点击空白处不能关闭弹窗
 ElementUI.Dialog.props.closeOnClickModal.default = false
 Vue.use(Router).use(ElementUI)
 
 export default new Router({
-    routes: [{
-            path: '/class',
-            name: 'class',
-            component: classA,
-            meta: {
-                requireAuth: ''
-            }
-        },
-        {
-            path: '/grade',
-            name: 'grade',
-            component: grade,
-            meta: {
-                requireAuth: ''
-            }
-        }, {
-            path: '/teacherOffice',
-            name: 'teacherOffice',
-            component: teacherOffice,
-            meta: {
-                requireAuth: ''
-            }
-        },
-        {
-            path: '/teacherType',
-            name: 'teacherType',
-            component: teacherType,
-            meta: {
-                requireAuth: ''
-            }
-        },
-        {
-            path: '/classGM',
-            name: 'classGM',
-            component: classGM,
-            meta: {
-                requireAuth: ''
-            }
-        },
-        // {
-        //   path: '/',
-        //   redirect: '/course',
-        // },
-        {
-            path: '/course',
-            component: course,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/scourse',
-            component: scourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/studentCourse',
-            component: studentCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/studentCheckCourse',
-            component: studentCheckCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/studentAddCourse',
-            component: studentAddCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/courseProgress',
-            component: courseProgress,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/studioCourse',
-            component: studioCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/studioAddCourse',
-            component: studioAddCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/studioCourseProgress',
-            component: studioCourseProgress,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/courseGM',
-            component: courseGM,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/course/courseDetail',
-            component: courseDetail,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/course/addCourse',
-            component: addCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/newAddCourse',
-            component: newAddCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/aiAddCourse',
-            component: aiAddCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/course/addCourseE',
-            component: addCourseE,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/addCourseEAi',
-            component: addCourseEAi,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/course/addCourseT',
-            component: addCourseT,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/course/addCourseGM',
-            component: addCourseGM,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/data',
-            name: 'data',
-            component: data,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/dataGM',
-            name: 'dataGM',
-            component: dataGM,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        }, {
-            path: '/notice',
-            name: 'notice',
-            component: notice,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/student',
-            name: 'student',
-            component: student,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/studentGM',
-            name: 'studentGM',
-            component: studentGM,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/ask',
-            name: 'ask',
-            component: ask,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/ask/askList',
-            name: 'askList',
-            component: () =>
-                import ('@/components/pages/askList'),
-            meta: {}
-        },
-        {
-            path: '/works',
-            name: 'works',
-            component: works,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/studentWorks',
-            name: 'studentWorks',
-            component: studentWorks,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/studentWorksDetail',
-            name: 'studentWorksDetail',
-            component: studentWorksDetail,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/worksGM',
-            name: 'worksGM',
-            component: worksGM,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/worksDetail',
-            name: 'worksDetail',
-            component: worksDetail,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/library',
-            name: 'library',
-            component: library,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/libraryGM',
-            name: 'libraryGM',
-            component: libraryGM,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/login',
-            name: 'login',
-            component: login,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/note',
-            name: 'note',
-            component: note,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/Grid',
-            name: 'Grid',
-            component: Grid,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/demo',
-            name: 'demo',
-            component: demo,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/classRoom',
-            name: 'classRoom',
-            component: classRoom,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/liveRoom',
-            name: 'liveRoom',
-            component: liveRoom,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/liveRoomKQ',
-            name: 'liveRoomKQ',
-            component: liveRoomKQ,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/addPPt',
-            name: 'addPPt',
-            component: addPPt,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/studyLibrary',
-            name: 'studyLibrary',
-            component: studyLibrary,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/evaluation',
-            name: 'evaluation',
-            component: evaluation,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/GridList',
-            name: 'GridList',
-            component: GridList,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/wordList',
-            name: 'wordList',
-            component: wordList,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/demoPdf',
-            name: 'demoPdf',
-            component: demoPdf,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/demoPdf2',
-            name: 'demoPdf2',
-            component: demoPdf2,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/audioDemo',
-            name: 'audioDemo',
-            component: audioDemo,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/Ttype',
-            name: 'Ttype',
-            component: Ttype,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/TtypeGM',
-            name: 'TtypeGM',
-            component: TtypeGM,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/Ttype2',
-            name: 'Ttype2',
-            component: Ttype2,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/Ttype2S',
-            name: 'Ttype2S',
-            component: Ttype2S,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/Ttype2Studio',
-            name: 'Ttype2Studio',
-            component: Ttype2Studio,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/TtypeOrg',
-            name: 'TtypeOrg',
-            component: TtypeOrg,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/banner',
-            name: 'banner',
-            component: banner,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/CaseDesign',
-            name: 'CaseDesign',
-            component: CaseDesign,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/CaseDesignS',
-            name: 'CaseDesignS',
-            component: CaseDesignS,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/CaseDesignGM',
-            name: 'CaseDesignGM',
-            component: CaseDesignGM,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/eventCenter',
-            name: 'eventCenter',
-            component: eventCenter,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/addRace',
-            name: 'addRace',
-            component: addRace,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        }, {
-            path: '/anliDetail',
-            name: 'anliDetail',
-            component: anliDetail,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/schoolGM',
-            name: 'schoolGM',
-            component: schoolGM,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/teacherGM',
-            name: 'teacherGM',
-            component: teacherGM,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/examineGM',
-            name: 'examineGM',
-            component: examineGM,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/noticeGM',
-            name: 'noticeGM',
-            component: noticeGM,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/tcData',
-            name: 'tcData',
-            component: tcData,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/tcSchool',
-            name: 'tcSchool',
-            component: tcSchool,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/tcStudent',
-            name: 'tcStudent',
-            component: tcStudent,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/tcTeacher',
-            name: 'tcTeacher',
-            component: tcTeacher,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/tcNotice',
-            name: 'tcNotice',
-            component: tcNotice,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/studioEvaluate',
-            name: 'studioEvaluate',
-            component: studioEvaluate,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/studioEvaBasicData',
-            name: 'studioEvaBasicData',
-            component: studioEvaBasicData,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/actLineChat',
-            name: 'actLineChat',
-            component: actLineChat,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/actTypeTable',
-            name: 'actTypeTable',
-            component: actTypeTable,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/worksReport',
-            name: 'worksReport',
-            component: worksReport,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/myReport',
-            name: 'myReport',
-            component: myReport,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/mrBasicData',
-            name: 'mrBasicData',
-            component: mrBasicData,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/mrOverPer',
-            name: 'mrOverPer',
-            component: mrOverPer,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/myCourseReport',
-            name: 'myCourseReport',
-            component: myCourseReport,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/courseEvaScore',
-            name: 'courseEvaScore',
-            component: courseEvaScore,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/mrLearnStatus',
-            name: 'mrLearnStatus',
-            component: mrLearnStatus,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/courseTypeAna',
-            name: 'courseTypeAna',
-            component: courseTypeAna,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/toolTypeAna',
-            name: 'toolTypeAna',
-            component: toolTypeAna,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/mrEva',
-            name: 'mrEva',
-            component: mrEva,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/inviteLogin',
-            name: 'inviteLogin',
-            component: inviteLogin,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/inviteLoginSZ',
-            name: 'inviteLoginSZ',
-            component: inviteLoginSZ,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-				{
-					path: '/inviteLoginST',
-					name: 'inviteLoginST',
-					component: inviteLoginST,
-					meta: {
-							requireAuth: '' // 不需要鉴权
-					}
-			},
-        {
-            path: '/stReport',
-            name: 'stReport',
-            component: stReport,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/classReport',
-            name: 'classReport',
-            component: classReport,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/courseReport',
-            name: 'courseReport',
-            component: courseReport,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/evaReport',
-            name: 'evaReport',
-            component: evaReport,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/learnAna',
-            name: 'learnAna',
-            component: learnAna,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/modelReport',
-            name: 'modelReport',
-            component: modelReport,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/lookModel',
-            name: 'lookModel',
-            component: lookModel,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/teacherSource',
-            name: 'teacherSource',
-            component: teacherSource,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/dataBoard',
-            name: 'dataBoard',
-            component: dataBoard,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/dataBoardNew',
-            name: 'dataBoardNew',
-            component: dataBoardNew,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/dataBoardSies',
-            name: 'dataBoardSies',
-            component: dataBoardSies,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/synergyCourse',
-            component: synergyCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/test',
-            name: 'test',
-            component: test,
-            meta: {
-                keepAlive: true,
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/testDataBoard',
-            name: 'testDataBoard',
-            component: testDataBoard,
-            meta: {
-                keepAlive: false,
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/testSmarter',
-            name: 'testSmarter',
-            component: testSmarter,
-            meta: {
-                keepAlive: true,
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/testStudent',
-            component: testStudent,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/testPerson',
-            component: testPerson,
-            name: 'testPerson',
-            meta: {
-                keepAlive: true,
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/doTest',
-            component: doTest,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/checkTest',
-            component: checkTest,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-				{
-					path:'/choseCheckTest',
-					component:choseCheckTest,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-        {
-            path: '/checkTest2',
-            component: checkTest2,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/checkToTest',
-            component: checkToTest,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/checkToTest2',
-            component: checkToTest2,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/addTest',
-            component: addTest,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/synergyCourse/add',
-            component: addSynergyCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/trainCourse',
-            component: trainCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/addTrainCourse',
-            component: addTrainCourse,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/addTrainCourseE',
-            component: addTrainCourseE,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/trainIndex',
-            component: trainIndex,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/courseIndex',
-            component: courseIndex,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/dataBoardTest',
-            component: dataBoardTest,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/studentEva',
-            component: studentEva,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/kindStudentEva',
-            component: kindStudentEva,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/record',
-            component: record,
-            meta: {
-                requireAuth: '' // 是否需要判断是否登录,这里是需要判断
-            }
-        },
-        {
-            path: '/teacher',
-            name: 'teacher',
-            component: teacher,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/sz/dataBoardCity',
-            name: 'dataBoardCity',
-            component: dataBoardCity,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-        {
-            path: '/sz/dataBoardArea',
-            name: 'dataBoardArea',
-            component: dataBoardArea,
-            meta: {
-                requireAuth: '' // 不需要鉴权
-            }
-        },
-				{//课堂观察
-					path:"/classroomObservation",
-					name:"classroomObservation",
-					component:classroomObservation,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-				{//对比观察
-					path:"/contrastObservation",
-					name:"contrastObservation",
-					component:contrastObservation,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-				{//pblCourse
-					path:"/pblCourse",
-					name:"pblCourse",
-					component:pblCourse,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-                 {//pblCourse
-					path:"/guide",
-					name:"guide",
-					component:guide,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-                 {//pblCourse
-					path:"/testExamine",
-					name:"testExamine",
-					component:testExamine,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-                 {//testPerson
-					path:"/testPersonExamine",
-					name:"testPersonExamine",
-					component:testPersonExamine,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},{
-					path:"/csTest",
-					name:"csTest",
-					component:csTest,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},{
-					path:"/pocAiClassroom",
-					name:"pocAiClassroom",
-					component:pocAiClassroom,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-				{
-					path:"/pocAiChat",
-					name:"pocAiChat",
-					component:pocAiChat,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-				{
-					path:"/pocDoTask",
-					name:"pocDoTask",
-					component:pocDoTask,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-				{
-					path:"/pocClass",
-					name:"pocClass",
-					component:pocClass,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-                {
-					path:"/testAi",
-					name:"testAi",
-					component:testAi,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-				{
-					path:"/cocoroboffmpeg",
-					name:"cocoroboffmpeg",
-					component:cocoroboffmpeg,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-				{
-					path:"/appStore",
-					name:"appStore",
-					component:appStore,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},
-				{
-					path:"/knowledge",
-					name:"knowledge",
-					component:knowledge,
-					meta:{
-						requireAuth:''//不需要鉴权
-					}
-				},{
-          path:"/sassPlatform",
-          name:"sassPlatform",
-          component:sassPlatform,
-          meta:{
-            keepAlive: true,
-            requireAuth:""//不需要鉴权
-          }
-        }
-    ]
+  routes: [{
+    path: '/class',
+    name: 'class',
+    component: classA,
+    meta: {
+      requireAuth: ''
+    }
+  },
+  {
+    path: '/grade',
+    name: 'grade',
+    component: grade,
+    meta: {
+      requireAuth: ''
+    }
+  }, {
+    path: '/teacherOffice',
+    name: 'teacherOffice',
+    component: teacherOffice,
+    meta: {
+      requireAuth: ''
+    }
+  },
+  {
+    path: '/teacherType',
+    name: 'teacherType',
+    component: teacherType,
+    meta: {
+      requireAuth: ''
+    }
+  },
+  {
+    path: '/classGM',
+    name: 'classGM',
+    component: classGM,
+    meta: {
+      requireAuth: ''
+    }
+  },
+  // {
+  //   path: '/',
+  //   redirect: '/course',
+  // },
+  {
+    path: '/course',
+    component: course,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/scourse',
+    component: scourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/studentCourse',
+    component: studentCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/studentCheckCourse',
+    component: studentCheckCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/studentAddCourse',
+    component: studentAddCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/courseProgress',
+    component: courseProgress,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/studioCourse',
+    component: studioCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/studioAddCourse',
+    component: studioAddCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/studioCourseProgress',
+    component: studioCourseProgress,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/courseGM',
+    component: courseGM,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/course/courseDetail',
+    component: courseDetail,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/course/addCourse',
+    component: addCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/newAddCourse',
+    component: newAddCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/aiAddCourse',
+    component: aiAddCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/course/addCourseE',
+    component: addCourseE,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/addCourseEAi',
+    component: addCourseEAi,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/course/addCourseT',
+    component: addCourseT,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/course/addCourseGM',
+    component: addCourseGM,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/data',
+    name: 'data',
+    component: data,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/dataGM',
+    name: 'dataGM',
+    component: dataGM,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  }, {
+    path: '/notice',
+    name: 'notice',
+    component: notice,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/student',
+    name: 'student',
+    component: student,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/studentGM',
+    name: 'studentGM',
+    component: studentGM,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/ask',
+    name: 'ask',
+    component: ask,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/ask/askList',
+    name: 'askList',
+    component: () =>
+      import('@/components/pages/askList'),
+    meta: {}
+  },
+  {
+    path: '/works',
+    name: 'works',
+    component: works,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/studentWorks',
+    name: 'studentWorks',
+    component: studentWorks,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/studentWorksDetail',
+    name: 'studentWorksDetail',
+    component: studentWorksDetail,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/worksGM',
+    name: 'worksGM',
+    component: worksGM,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/worksDetail',
+    name: 'worksDetail',
+    component: worksDetail,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/library',
+    name: 'library',
+    component: library,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/libraryGM',
+    name: 'libraryGM',
+    component: libraryGM,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/login',
+    name: 'login',
+    component: login,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/note',
+    name: 'note',
+    component: note,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/Grid',
+    name: 'Grid',
+    component: Grid,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/demo',
+    name: 'demo',
+    component: demo,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/classRoom',
+    name: 'classRoom',
+    component: classRoom,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/liveRoom',
+    name: 'liveRoom',
+    component: liveRoom,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/liveRoomKQ',
+    name: 'liveRoomKQ',
+    component: liveRoomKQ,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/addPPt',
+    name: 'addPPt',
+    component: addPPt,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/studyLibrary',
+    name: 'studyLibrary',
+    component: studyLibrary,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/evaluation',
+    name: 'evaluation',
+    component: evaluation,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/GridList',
+    name: 'GridList',
+    component: GridList,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/wordList',
+    name: 'wordList',
+    component: wordList,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/demoPdf',
+    name: 'demoPdf',
+    component: demoPdf,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/demoPdf2',
+    name: 'demoPdf2',
+    component: demoPdf2,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/audioDemo',
+    name: 'audioDemo',
+    component: audioDemo,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/Ttype',
+    name: 'Ttype',
+    component: Ttype,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/TtypeGM',
+    name: 'TtypeGM',
+    component: TtypeGM,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/Ttype2',
+    name: 'Ttype2',
+    component: Ttype2,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/Ttype2S',
+    name: 'Ttype2S',
+    component: Ttype2S,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/Ttype2Studio',
+    name: 'Ttype2Studio',
+    component: Ttype2Studio,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/TtypeOrg',
+    name: 'TtypeOrg',
+    component: TtypeOrg,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/banner',
+    name: 'banner',
+    component: banner,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/CaseDesign',
+    name: 'CaseDesign',
+    component: CaseDesign,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/CaseDesignS',
+    name: 'CaseDesignS',
+    component: CaseDesignS,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/CaseDesignGM',
+    name: 'CaseDesignGM',
+    component: CaseDesignGM,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/eventCenter',
+    name: 'eventCenter',
+    component: eventCenter,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/addRace',
+    name: 'addRace',
+    component: addRace,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  }, {
+    path: '/anliDetail',
+    name: 'anliDetail',
+    component: anliDetail,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/schoolGM',
+    name: 'schoolGM',
+    component: schoolGM,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/teacherGM',
+    name: 'teacherGM',
+    component: teacherGM,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/examineGM',
+    name: 'examineGM',
+    component: examineGM,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/noticeGM',
+    name: 'noticeGM',
+    component: noticeGM,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/tcData',
+    name: 'tcData',
+    component: tcData,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/tcSchool',
+    name: 'tcSchool',
+    component: tcSchool,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/tcStudent',
+    name: 'tcStudent',
+    component: tcStudent,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/tcTeacher',
+    name: 'tcTeacher',
+    component: tcTeacher,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/tcNotice',
+    name: 'tcNotice',
+    component: tcNotice,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/studioEvaluate',
+    name: 'studioEvaluate',
+    component: studioEvaluate,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/studioEvaBasicData',
+    name: 'studioEvaBasicData',
+    component: studioEvaBasicData,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/actLineChat',
+    name: 'actLineChat',
+    component: actLineChat,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/actTypeTable',
+    name: 'actTypeTable',
+    component: actTypeTable,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/worksReport',
+    name: 'worksReport',
+    component: worksReport,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/myReport',
+    name: 'myReport',
+    component: myReport,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/mrBasicData',
+    name: 'mrBasicData',
+    component: mrBasicData,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/mrOverPer',
+    name: 'mrOverPer',
+    component: mrOverPer,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/myCourseReport',
+    name: 'myCourseReport',
+    component: myCourseReport,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/courseEvaScore',
+    name: 'courseEvaScore',
+    component: courseEvaScore,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/mrLearnStatus',
+    name: 'mrLearnStatus',
+    component: mrLearnStatus,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/courseTypeAna',
+    name: 'courseTypeAna',
+    component: courseTypeAna,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/toolTypeAna',
+    name: 'toolTypeAna',
+    component: toolTypeAna,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/mrEva',
+    name: 'mrEva',
+    component: mrEva,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/inviteLogin',
+    name: 'inviteLogin',
+    component: inviteLogin,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/inviteLoginSZ',
+    name: 'inviteLoginSZ',
+    component: inviteLoginSZ,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/inviteLoginST',
+    name: 'inviteLoginST',
+    component: inviteLoginST,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/stReport',
+    name: 'stReport',
+    component: stReport,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/classReport',
+    name: 'classReport',
+    component: classReport,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/courseReport',
+    name: 'courseReport',
+    component: courseReport,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/evaReport',
+    name: 'evaReport',
+    component: evaReport,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/learnAna',
+    name: 'learnAna',
+    component: learnAna,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/modelReport',
+    name: 'modelReport',
+    component: modelReport,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/lookModel',
+    name: 'lookModel',
+    component: lookModel,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/teacherSource',
+    name: 'teacherSource',
+    component: teacherSource,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/dataBoard',
+    name: 'dataBoard',
+    component: dataBoard,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/dataBoardNew',
+    name: 'dataBoardNew',
+    component: dataBoardNew,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/dataBoardSies',
+    name: 'dataBoardSies',
+    component: dataBoardSies,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/synergyCourse',
+    component: synergyCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/test',
+    name: 'test',
+    component: test,
+    meta: {
+      keepAlive: true,
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/testDataBoard',
+    name: 'testDataBoard',
+    component: testDataBoard,
+    meta: {
+      keepAlive: false,
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/testSmarter',
+    name: 'testSmarter',
+    component: testSmarter,
+    meta: {
+      keepAlive: true,
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/testStudent',
+    component: testStudent,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/testPerson',
+    component: testPerson,
+    name: 'testPerson',
+    meta: {
+      keepAlive: true,
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/doTest',
+    component: doTest,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/checkTest',
+    component: checkTest,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/choseCheckTest',
+    component: choseCheckTest,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {
+    path: '/checkTest2',
+    component: checkTest2,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/checkToTest',
+    component: checkToTest,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/checkToTest2',
+    component: checkToTest2,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/addTest',
+    component: addTest,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/synergyCourse/add',
+    component: addSynergyCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/trainCourse',
+    component: trainCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/addTrainCourse',
+    component: addTrainCourse,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/addTrainCourseE',
+    component: addTrainCourseE,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/trainIndex',
+    component: trainIndex,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/courseIndex',
+    component: courseIndex,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/dataBoardTest',
+    component: dataBoardTest,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/studentEva',
+    component: studentEva,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/kindStudentEva',
+    component: kindStudentEva,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/record',
+    component: record,
+    meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+    path: '/teacher',
+    name: 'teacher',
+    component: teacher,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/sz/dataBoardCity',
+    name: 'dataBoardCity',
+    component: dataBoardCity,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {
+    path: '/sz/dataBoardArea',
+    name: 'dataBoardArea',
+    component: dataBoardArea,
+    meta: {
+      requireAuth: '' // 不需要鉴权
+    }
+  },
+  {//课堂观察
+    path: "/classroomObservation",
+    name: "classroomObservation",
+    component: classroomObservation,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {//对比观察
+    path: "/contrastObservation",
+    name: "contrastObservation",
+    component: contrastObservation,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {//pblCourse
+    path: "/pblCourse",
+    name: "pblCourse",
+    component: pblCourse,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {//pblCourse
+    path: "/guide",
+    name: "guide",
+    component: guide,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {//pblCourse
+    path: "/testExamine",
+    name: "testExamine",
+    component: testExamine,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {//testPerson
+    path: "/testPersonExamine",
+    name: "testPersonExamine",
+    component: testPersonExamine,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  }, {
+    path: "/csTest",
+    name: "csTest",
+    component: csTest,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  }, {
+    path: "/pocAiClassroom",
+    name: "pocAiClassroom",
+    component: pocAiClassroom,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {
+    path: "/pocAiChat",
+    name: "pocAiChat",
+    component: pocAiChat,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {
+    path: "/pocDoTask",
+    name: "pocDoTask",
+    component: pocDoTask,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {
+    path: "/pocClass",
+    name: "pocClass",
+    component: pocClass,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {
+    path: "/testAi",
+    name: "testAi",
+    component: testAi,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {
+    path: "/cocoroboffmpeg",
+    name: "cocoroboffmpeg",
+    component: cocoroboffmpeg,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {
+    path: "/appStore",
+    name: "appStore",
+    component: appStore,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  },
+  {
+    path: "/knowledge",
+    name: "knowledge",
+    component: knowledge,
+    meta: {
+      requireAuth: ''//不需要鉴权
+    }
+  }, {
+    path: "/sassPlatform",
+    name: "sassPlatform",
+    component: sassPlatform,
+    meta: {
+      keepAlive: true,
+      requireAuth: ""//不需要鉴权
+    }
+  }, {
+    path: "/classroomObservationTest",
+    name: "/classroomObservationTest",
+    component: classroomObservationTest,
+    meta: {
+      keepAlive: true,
+      requireAuth: ""//不需要鉴权
+    }
+  }, {
+
+    path: "/CourseCon",
+    name: "CourseCon",
+    component: CourseCon,
+    meta: {
+      keepAlive: true,
+      requireAuth: ""//不需要鉴权
+    }
+  }, {
+    path: "/aiOffice",
+    name: "aiOffice",
+    component: aiOffice,
+    meta: {
+      keepAlive: true,
+      requireAuth: ""//不需要鉴权
+    }
+  }, {
+    path: "/schoolSafe",
+    name: "schoolSafe",
+    component: schoolSafe,
+    meta: {
+      keepAlive: true,
+      requireAuth: ""//不需要鉴权
+    }
+  }, {
+    path: "/lyStudentEva",
+    name: "lyStudentEva",
+    component: lyStudentEva,
+    meta: {
+      keepAlive: true,
+      requireAuth: ""//不需要鉴权
+    }
+  }, {
+    path: "/teacherDevelop",
+    name: "teacherDevelop",
+    component: teacherDevelop,
+    meta: {
+      keepAlive: true,
+      requireAuth: ""//不需要鉴权
+    }
+  },
+  {
+    path: '/userInfoL',
+    name: 'userInfoL',
+    component: userInfoL,
+    meta: {
+        keepAlive: true,
+        requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+    }
+  },
+  {
+      path: '/examineL',
+      name: 'examineL',
+      component: examineL,
+      meta: {
+          keepAlive: true,
+          requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+      }
+  },
+  {
+      path: '/portraitL',
+      name: 'portraitL',
+      component: portraitL,
+      meta: {
+          keepAlive: true,
+          requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+      }
+  },
+  {
+      path: '/teadTest',
+      name: 'teadTest',
+      component: teadTest,
+      meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+      }
+  },
+  {
+      path: '/Listudent',
+      name: 'Listudent',
+      component: Listudent,
+      meta: {
+      requireAuth: '' // 是否需要判断是否登录,这里是需要判断
+      }
+  },
+  {
+      path: '/safeTest',
+      name: 'safeTest',
+      component: safeTest,
+      meta: {
+          requireAuth: '' // 不需要鉴权
+      }
+  },
+  ]
 })

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä