Browse Source

Merge branch '11/24SAAS' into iteration-20240711-subject

lex 9 months ago
parent
commit
02c89e1bec
97 changed files with 2312 additions and 73 deletions
  1. 0 0
      dist/index.html
  2. 0 0
      dist/static/css/chunk-0dd890b5.f5b482c1.css
  3. 1 0
      dist/static/css/chunk-0de7df23.18ff5e4d.css
  4. 0 0
      dist/static/css/chunk-189436de.83345a3d.css
  5. 0 0
      dist/static/css/chunk-206a8564.3141d7fa.css
  6. 0 1
      dist/static/css/chunk-26befd7b.6163df6a.css
  7. 0 0
      dist/static/css/chunk-288e8936.3062899b.css
  8. 1 0
      dist/static/css/chunk-2c3130c8.3a7015f4.css
  9. 1 1
      dist/static/css/chunk-3191c0e2.bc04cc75.css
  10. 0 0
      dist/static/css/chunk-3a1d38e6.19f2fd4d.css
  11. 0 0
      dist/static/css/chunk-415b7e48.16eeb9b5.css
  12. 1 0
      dist/static/css/chunk-453b272d.9ca91f2a.css
  13. 0 1
      dist/static/css/chunk-4b1751a1.4ebd7443.css
  14. 1 0
      dist/static/css/chunk-5b6ec6f0.c7e0d968.css
  15. 0 1
      dist/static/css/chunk-675dbadc.5db5ce3a.css
  16. 0 0
      dist/static/css/chunk-68b60c32.e9e1f1b7.css
  17. 0 0
      dist/static/css/chunk-69b22a4e.5b69c593.css
  18. 0 0
      dist/static/css/chunk-6ba86ddc.6141ca34.css
  19. 0 0
      dist/static/css/chunk-7ad3c82a.ed8115e6.css
  20. 1 0
      dist/static/css/chunk-7dc09161.a2d24022.css
  21. 1 0
      dist/static/css/chunk-96ad0c8a.b09752f0.css
  22. 0 0
      dist/static/css/chunk-9867e89e.5d73b399.css
  23. 0 0
      dist/static/css/chunk-a265025c.db7edbc4.css
  24. 0 0
      dist/static/css/chunk-cdefb862.a430ef68.css
  25. 0 0
      dist/static/css/chunk-ea1e8280.8b6a7fab.css
  26. 0 0
      dist/static/js/app.7b179cce.js
  27. 0 0
      dist/static/js/app.b84012cd.js
  28. 0 0
      dist/static/js/chunk-00b38303.20b1b0b1.js
  29. 0 2
      dist/static/js/chunk-02e1cb85.3305774e.js
  30. 0 0
      dist/static/js/chunk-035ef027.fbe5e639.js
  31. 0 0
      dist/static/js/chunk-0bef66ae.bc00d0e0.js
  32. 0 0
      dist/static/js/chunk-0dd890b5.72d642ca.js
  33. 0 0
      dist/static/js/chunk-0de7df23.60371564.js
  34. 0 0
      dist/static/js/chunk-1274dfe7.f8711bef.js
  35. 0 0
      dist/static/js/chunk-189436de.f70c2b69.js
  36. 0 0
      dist/static/js/chunk-1b6723f2.422aaede.js
  37. 0 0
      dist/static/js/chunk-1f456443.09291389.js
  38. 0 0
      dist/static/js/chunk-1f775d94.f9b308ea.js
  39. 4 0
      dist/static/js/chunk-206a8564.6f8105f3.js
  40. 0 0
      dist/static/js/chunk-25207db6.2b00c2b3.js
  41. 0 0
      dist/static/js/chunk-288e8936.c243ec1a.js
  42. 0 0
      dist/static/js/chunk-2c3130c8.b25b3473.js
  43. 0 0
      dist/static/js/chunk-3191c0e2.a165b145.js
  44. 0 0
      dist/static/js/chunk-3838a7f1.897d2674.js
  45. 0 0
      dist/static/js/chunk-3934119b.267583b3.js
  46. 0 0
      dist/static/js/chunk-3a1d38e6.2dbd78cd.js
  47. 0 0
      dist/static/js/chunk-3aedde54.7af4b308.js
  48. 0 0
      dist/static/js/chunk-3ffb9a50.23fac9f0.js
  49. 0 0
      dist/static/js/chunk-415b7e48.27475c11.js
  50. 0 0
      dist/static/js/chunk-453b272d.9f9cfb43.js
  51. 0 0
      dist/static/js/chunk-5b6ec6f0.171b2346.js
  52. 0 0
      dist/static/js/chunk-5ea75314.fbccebd8.js
  53. 0 0
      dist/static/js/chunk-675dbadc.8b761155.js
  54. 0 0
      dist/static/js/chunk-68b60c32.fdd731c6.js
  55. 0 0
      dist/static/js/chunk-69b22a4e.81d1867c.js
  56. 0 0
      dist/static/js/chunk-6ba86ddc.1e01c537.js
  57. 0 0
      dist/static/js/chunk-7756b2a0.8b85dcd7.js
  58. 0 0
      dist/static/js/chunk-77be0649.81e5bc2b.js
  59. 0 0
      dist/static/js/chunk-7ad3c82a.3e3e99eb.js
  60. 0 0
      dist/static/js/chunk-7dc09161.3198cf84.js
  61. 0 0
      dist/static/js/chunk-96ad0c8a.a2fd1562.js
  62. 0 0
      dist/static/js/chunk-9867e89e.7f432626.js
  63. 0 0
      dist/static/js/chunk-99725c32.316c7768.js
  64. 0 0
      dist/static/js/chunk-a265025c.a84e3377.js
  65. 0 0
      dist/static/js/chunk-aba618b0.9a8405d8.js
  66. 0 0
      dist/static/js/chunk-ac98ddf8.c5413861.js
  67. 0 0
      dist/static/js/chunk-b5ac7e72.ce1f96c9.js
  68. 0 0
      dist/static/js/chunk-c00eb302.54ebb322.js
  69. 0 0
      dist/static/js/chunk-c3e0d3e0.e38c0894.js
  70. 0 0
      dist/static/js/chunk-cdefb862.8b36e64c.js
  71. 0 0
      dist/static/js/chunk-d0e5f6ec.e6f27aa8.js
  72. 0 0
      dist/static/js/chunk-e87dbc4a.15fbd48a.js
  73. 0 0
      dist/static/js/chunk-e8e64ab8.81c1efef.js
  74. 1 1
      dist/static/js/chunk-ea1e8280.267994d4.js
  75. 0 0
      dist/static/js/chunk-eca890e4.47c16289.js
  76. 0 0
      dist/static/js/chunk-f6a06b08.2ee8f232.js
  77. 3 1
      src/constant/index.js
  78. 5 0
      src/router/index.js
  79. 13 0
      src/store/modules/permission.js
  80. 1 1
      src/views/accompaniment/index.vue
  81. 49 11
      src/views/afterSchoolManager/components/examinationDetail.vue
  82. 55 14
      src/views/afterSchoolManager/components/studentWroks.vue
  83. 16 8
      src/views/afterSchoolManager/components/textConment.vue
  84. 31 2
      src/views/attendanceManager/attendanceList/components/studentWroks.vue
  85. 27 1
      src/views/attendanceManager/attendanceList/components/textConment.vue
  86. 0 1
      src/views/businessManager/shopManager/shopList.vue
  87. 20 0
      src/views/categroyManager/generalSettings/overallManager.vue
  88. 15 0
      src/views/main/api.js
  89. 91 0
      src/views/main/coursewareDate/allDate.vue
  90. 550 0
      src/views/main/coursewareDate/exerciseDuration.vue
  91. 397 0
      src/views/main/coursewareDate/exerciseDurationDetail.vue
  92. 38 0
      src/views/main/coursewareDate/index.vue
  93. 67 0
      src/views/main/coursewareDate/modals/headers.vue
  94. 358 0
      src/views/main/coursewareDate/organDateDetail.vue
  95. 539 0
      src/views/main/coursewareDate/organMemberList.vue
  96. 0 1
      src/views/resetTeaming/modals/review-detail.vue
  97. 25 26
      src/views/teamDetail/componentCourse/studentWork.vue

File diff suppressed because it is too large
+ 0 - 0
dist/index.html


+ 0 - 0
dist/static/css/chunk-c00eb302.f5b482c1.css → dist/static/css/chunk-0dd890b5.f5b482c1.css


+ 1 - 0
dist/static/css/chunk-0de7df23.18ff5e4d.css

@@ -0,0 +1 @@
+.btns[data-v-c2f97868]{text-align:right}.files[data-v-c2f97868]{background-color:#f8f8f8;padding:20px 0;padding-right:20px;margin-bottom:20px;border-radius:5px;position:relative}.files .file-remove[data-v-c2f97868]{position:absolute;right:20px;bottom:10px}.gradual-item[data-v-c2f97868]{background-color:#f8f8f8;margin-bottom:10px;padding:10px;border-radius:6px}.dialog-footer[data-v-41013e52]{text-align:right}.numberInput[data-v-41013e52]{width:100%}[data-v-41013e52] .el-input-number .el-input__inner{text-align:left!important}.dialog-footer[data-v-51b9abf0]{text-align:right}[data-v-51b9abf0] .el-input-number .el-input__inner{text-align:left!important}.myCascader .el-radio[data-v-9419ce76]{width:100%;height:100%;z-index:10;position:absolute;top:10px;right:10px}.myCascader .el-radio__input[data-v-9419ce76]{visibility:hidden}.myCascader .el-cascader-node__postfix[data-v-9419ce76]{top:10px}[data-v-9419ce76] .el-dropdown{margin-right:10px;color:#14928a}.remark[data-v-9419ce76]{display:inline;overflow:hidden;white-space:pre}.lookForm[data-v-9419ce76] .el-dialog__body{padding:0}.iframe_back[data-v-9419ce76]{width:195px;height:45px;position:absolute;bottom:50px;background:transparent;left:50%;z-index:99;margin-left:-100px}.iframe_help[data-v-9419ce76]{position:absolute;background:transparent;width:50px;height:120px;top:50%;right:0;margin-top:-35px}.iframe_header_back[data-v-9419ce76]{background:transparent;width:225px;height:50px;position:absolute;top:65px;left:20px}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-189436de.83345a3d.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-206a8564.3141d7fa.css


+ 0 - 1
dist/static/css/chunk-26befd7b.6163df6a.css

@@ -1 +0,0 @@
-.alert[data-v-ee3000dc]{margin:10px 0}.description-tr[data-v-ee3000dc]:last-child{border-bottom:none!important}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-288e8936.3062899b.css


+ 1 - 0
dist/static/css/chunk-2c3130c8.3a7015f4.css

@@ -0,0 +1 @@
+.alert[data-v-3761903c]{margin:10px 0}.description-tr[data-v-3761903c]:last-child{border-bottom:none!important}

+ 1 - 1
dist/static/css/chunk-1847a60f.a3d5990b.css → dist/static/css/chunk-3191c0e2.bc04cc75.css

@@ -1 +1 @@
-.dialog-footer[data-v-082969ba]{padding-top:20px;width:100%;text-align:center}.alert[data-v-71c3855f]{margin-bottom:16px}.shopImage[data-v-71c3855f]{width:60px;height:60px}.shopDesc[data-v-71c3855f]{max-height:70px;overflow:hidden}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-71c3855f]{max-width:95px}.hiddenStart[data-v-71c3855f] .el-form-item__label:before{content:""!important;position:absolute;color:transparent;margin-right:4px}.dialog-footer[data-v-71c3855f]{display:block;text-align:right}.number-input[data-v-71c3855f] .el-input__inner{text-align:left}.tableItem[data-v-71c3855f]{margin-bottom:0!important}.alert[data-v-4135000c]{margin-bottom:16px}.shopImage[data-v-4135000c]{width:60px;height:60px}.shopDesc[data-v-4135000c]{max-height:70px;overflow:hidden}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-4135000c]{max-width:95px}.hiddenStart[data-v-4135000c] .el-form-item__label:before{content:""!important;position:absolute;color:transparent;margin-right:4px}.dialog-footer[data-v-4135000c]{display:block;text-align:right}.number-input[data-v-4135000c] .el-input__inner{text-align:left}.tableItem[data-v-4135000c]{margin-bottom:0!important}.shopImage[data-v-edb2be48]{width:60px;height:60px}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-edb2be48]{max-width:95px}
+.dialog-footer[data-v-082969ba]{padding-top:20px;width:100%;text-align:center}.alert[data-v-71c3855f]{margin-bottom:16px}.shopImage[data-v-71c3855f]{width:60px;height:60px}.shopDesc[data-v-71c3855f]{max-height:70px;overflow:hidden}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-71c3855f]{max-width:95px}.hiddenStart[data-v-71c3855f] .el-form-item__label:before{content:""!important;position:absolute;color:transparent;margin-right:4px}.dialog-footer[data-v-71c3855f]{display:block;text-align:right}.number-input[data-v-71c3855f] .el-input__inner{text-align:left}.tableItem[data-v-71c3855f]{margin-bottom:0!important}.alert[data-v-4135000c]{margin-bottom:16px}.shopImage[data-v-4135000c]{width:60px;height:60px}.shopDesc[data-v-4135000c]{max-height:70px;overflow:hidden}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-4135000c]{max-width:95px}.hiddenStart[data-v-4135000c] .el-form-item__label:before{content:""!important;position:absolute;color:transparent;margin-right:4px}.dialog-footer[data-v-4135000c]{display:block;text-align:right}.number-input[data-v-4135000c] .el-input__inner{text-align:left}.tableItem[data-v-4135000c]{margin-bottom:0!important}.shopImage[data-v-1a488702]{width:60px;height:60px}.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light[data-v-1a488702]{max-width:95px}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-3a1d38e6.19f2fd4d.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-415b7e48.16eeb9b5.css


+ 1 - 0
dist/static/css/chunk-453b272d.9ca91f2a.css

@@ -0,0 +1 @@
+.el-divider--horizontal[data-v-50085d5e]{margin-top:0!important}.titleWrap[data-v-50085d5e]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:55px}[data-v-5c21f126] .el-card__body,[data-v-71d5d052] .el-card__body{padding-top:0!important}.titleCell[data-v-71d5d052]{display:inline-block}.tableWrap[data-v-71d5d052]{margin-top:20px}.btnList[data-v-71d5d052]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}[data-v-20ea8b4e] .el-date-editor.el-input,[data-v-20ea8b4e] .el-select{width:100%!important}[data-v-20ea8b4e] .el-table .cell{display:-webkit-box;overflow:hidden;max-height:45px;text-overflow:ellipsis;-webkit-line-clamp:3;-webkit-box-orient:vertical}[data-v-20ea8b4e] .el-dialog__body{padding:10px 20px}.newBand[data-v-20ea8b4e]{display:inline-block}[data-v-20ea8b4e] .el-tabs__active-bar,[data-v-20ea8b4e].el-tabs__nav-wrap:after,[data-v-20ea8b4e] .el-tabs__nav-wrap:after{background-color:transparent!important}.marginBottom20[data-v-60429400]{margin-bottom:20px}

+ 0 - 1
dist/static/css/chunk-4b1751a1.4ebd7443.css

@@ -1 +0,0 @@
-[data-v-39f50f49] .el-input-group{width:180px;margin:0 5px}.el-row[data-v-39f50f49],p[data-v-39f50f49]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:14px;color:#000;margin-bottom:20px;padding:0 24px}.subtitle[data-v-39f50f49]{font-size:18px;margin-bottom:20px;position:relative;font-weight:600;margin-left:22px;padding-left:14px}.subtitle[data-v-39f50f49]:after{position:absolute;width:3px;height:16px;background:var(--color-primary);border-radius:2px;left:0;top:2px;content:""}.chiose[data-v-39f50f49] .el-input-group__append{padding:0}.chiose .append[data-v-39f50f49]{margin:0;width:70px!important}.chiose .append[data-v-39f50f49] .el-input__inner{height:34px;line-height:34px}.saveBtn[data-v-39f50f49]{margin-left:24px;margin-top:40px}[data-v-39f50f49] .el-form-item__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}[data-v-39f50f49] .el-form-item{margin-bottom:0}.marginLR5[data-v-39f50f49]{margin:0 5px}[data-v-39f50f49] .el-divider{margin-left:24px}

+ 1 - 0
dist/static/css/chunk-5b6ec6f0.c7e0d968.css

@@ -0,0 +1 @@
+[data-v-4937032b] .el-input-group{width:180px;margin:0 5px}.el-row[data-v-4937032b],p[data-v-4937032b]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:14px;color:#000;margin-bottom:20px;padding:0 24px}.subtitle[data-v-4937032b]{font-size:18px;margin-bottom:20px;position:relative;font-weight:600;margin-left:22px;padding-left:14px}.subtitle[data-v-4937032b]:after{position:absolute;width:3px;height:16px;background:var(--color-primary);border-radius:2px;left:0;top:2px;content:""}.chiose[data-v-4937032b] .el-input-group__append{padding:0}.chiose .append[data-v-4937032b]{margin:0;width:70px!important}.chiose .append[data-v-4937032b] .el-input__inner{height:34px;line-height:34px}.saveBtn[data-v-4937032b]{margin-left:24px;margin-top:40px}[data-v-4937032b] .el-form-item__content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}[data-v-4937032b] .el-form-item{margin-bottom:0}.marginLR5[data-v-4937032b]{margin:0 5px}[data-v-4937032b] .el-divider{margin-left:24px}

+ 0 - 1
dist/static/css/chunk-675dbadc.5db5ce3a.css

@@ -1 +0,0 @@
-.btns[data-v-c2f97868]{text-align:right}.files[data-v-c2f97868]{background-color:#f8f8f8;padding:20px 0;padding-right:20px;margin-bottom:20px;border-radius:5px;position:relative}.files .file-remove[data-v-c2f97868]{position:absolute;right:20px;bottom:10px}.gradual-item[data-v-c2f97868]{background-color:#f8f8f8;margin-bottom:10px;padding:10px;border-radius:6px}.myCascader .el-radio{width:100%;height:100%;z-index:10;position:absolute;top:10px;right:10px}.myCascader .el-radio__input{visibility:hidden}.myCascader .el-cascader-node__postfix{top:10px}[data-v-56d96c1e] .el-dropdown{margin-right:10px;color:#14928a}.remark[data-v-56d96c1e]{display:inline;overflow:hidden;white-space:pre}.lookForm[data-v-56d96c1e] .el-dialog__body{padding:0}.iframe_back[data-v-56d96c1e]{width:195px;height:45px;position:absolute;bottom:50px;background:transparent;left:50%;z-index:99;margin-left:-100px}.iframe_help[data-v-56d96c1e]{position:absolute;background:transparent;width:50px;height:120px;top:50%;right:0;margin-top:-35px}.iframe_header_back[data-v-56d96c1e]{background:transparent;width:225px;height:50px;position:absolute;top:65px;left:20px}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-68b60c32.e9e1f1b7.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-69b22a4e.5b69c593.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-6ba86ddc.6141ca34.css


+ 0 - 0
dist/static/css/chunk-7e4efc97.ed8115e6.css → dist/static/css/chunk-7ad3c82a.ed8115e6.css


+ 1 - 0
dist/static/css/chunk-7dc09161.a2d24022.css

@@ -0,0 +1 @@
+[data-v-4cc25e93] .el-date-editor.el-input,[data-v-4cc25e93] .el-select{width:100%!important}[data-v-4cc25e93] .el-table .cell{display:-webkit-box;overflow:hidden;max-height:45px;text-overflow:ellipsis;-webkit-line-clamp:3;-webkit-box-orient:vertical}[data-v-4cc25e93] .el-dialog__body{padding:10px 20px}.newBand[data-v-4cc25e93]{display:inline-block}[data-v-4cc25e93] .el-tabs__active-bar,[data-v-4cc25e93].el-tabs__nav-wrap:after,[data-v-4cc25e93] .el-tabs__nav-wrap:after{background-color:transparent!important}

+ 1 - 0
dist/static/css/chunk-96ad0c8a.b09752f0.css

@@ -0,0 +1 @@
+.dialog-footer[data-v-72dce35c]{padding-top:12px;text-align:right}[data-v-72dce35c] .el-form-item{margin-bottom:13px}.dialog-footer[data-v-0ae7d707],.dialog-footer[data-v-fc924a20]{text-align:right}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-9867e89e.5d73b399.css


+ 0 - 0
dist/static/css/chunk-c3e0d3e0.db7edbc4.css → dist/static/css/chunk-a265025c.db7edbc4.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-cdefb862.a430ef68.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-ea1e8280.8b6a7fab.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.7b179cce.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.b84012cd.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-00b38303.20b1b0b1.js


File diff suppressed because it is too large
+ 0 - 2
dist/static/js/chunk-02e1cb85.3305774e.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-035ef027.fbe5e639.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-0bef66ae.bc00d0e0.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-0dd890b5.72d642ca.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-0de7df23.60371564.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-1274dfe7.f8711bef.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-189436de.f70c2b69.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-1b6723f2.422aaede.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-1f456443.09291389.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-1f775d94.f9b308ea.js


File diff suppressed because it is too large
+ 4 - 0
dist/static/js/chunk-206a8564.6f8105f3.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-25207db6.2b00c2b3.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-288e8936.c243ec1a.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-2c3130c8.b25b3473.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3191c0e2.a165b145.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3838a7f1.897d2674.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3934119b.267583b3.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3a1d38e6.2dbd78cd.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3aedde54.7af4b308.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3ffb9a50.23fac9f0.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-415b7e48.27475c11.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-453b272d.9f9cfb43.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-5b6ec6f0.171b2346.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-5ea75314.fbccebd8.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-675dbadc.8b761155.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-68b60c32.fdd731c6.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-69b22a4e.81d1867c.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-6ba86ddc.1e01c537.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7756b2a0.8b85dcd7.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-77be0649.81e5bc2b.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7ad3c82a.3e3e99eb.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7dc09161.3198cf84.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-96ad0c8a.a2fd1562.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-9867e89e.7f432626.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-99725c32.316c7768.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-a265025c.a84e3377.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-aba618b0.9a8405d8.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-ac98ddf8.c5413861.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-b5ac7e72.ce1f96c9.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-c00eb302.54ebb322.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-c3e0d3e0.e38c0894.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-cdefb862.8b36e64c.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-d0e5f6ec.e6f27aa8.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-e87dbc4a.15fbd48a.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-e8e64ab8.81c1efef.js


File diff suppressed because it is too large
+ 1 - 1
dist/static/js/chunk-ea1e8280.267994d4.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-eca890e4.47c16289.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-f6a06b08.2ee8f232.js


+ 3 - 1
src/constant/index.js

@@ -325,7 +325,9 @@ export const downListType = {
   33: "平衡关系-缴费项目课时明细",
   34: "平衡关系-学员情况总表",
   35: "平衡关系(分表)-乐团在读学员",
-  36: "平衡关系(分表)-乐团退团学员"
+  36: "平衡关系(分表)-乐团退团学员",
+  37: "云课堂统计导出",
+  38: "云课堂统计详情导出"
 };
 
 export const withdrawalStatus = {

+ 5 - 0
src/router/index.js

@@ -511,6 +511,8 @@ export const asyncRoutes = {
   indexErrDataRecord: () => import("@/views/indexErrDataRecord"),
   // 团练宝数据
   cloudDate: () => import("@/views/main/cloudDate/index.vue"),
+  // 云课堂观看统计
+  coursewareDate: () => import("@/views/main/coursewareDate/index.vue"),
   dictionaryManager: () => import("@/views/dictionaryManager"),
   // 会员排课列表
   memberClassList: () =>
@@ -642,6 +644,9 @@ export const asyncRoutes = {
   // 训练详情
   exerciseDurationDetail: () =>
     import("@/views/main/cloudDate/exerciseDurationDetail.vue"),
+  // 训练详情
+  coursewareDurationDetail: () =>
+    import("@/views/main/coursewareDate/exerciseDurationDetail.vue"),
   // 新课表列表
   newCourseList: () => import("@/views/newCourseList"),
   newOrderList: () => import("@/views/newCourseList/orderList"),

+ 13 - 0
src/store/modules/permission.js

@@ -311,6 +311,19 @@ function setDetailRoute(accessedRoutes) {
             belongTopMenu: "/main",
             activeMenu: "/workbench"
           }
+        },
+        {
+          name: "coursewareDurationDetail",
+          path: "/coursewareDurationDetail",
+          component: () =>
+            import("@/views/main/coursewareDate/exerciseDurationDetail.vue"),
+          hidden: true,
+          meta: {
+            noCache: "1",
+            title: "观看时长详情",
+            belongTopMenu: "/main",
+            activeMenu: "/workbench"
+          }
         }
         // /hasfreeCourse  排课时长消耗异常
       ]);

+ 1 - 1
src/views/accompaniment/index.vue

@@ -165,7 +165,7 @@
               >预览</el-button
             >
             <el-button
-              v-permission="'musicSheetApplicationExtend/status'"
+              v-permission="'sysMusicScore/state'"
               type="text"
               @click="changeStatus(scope.row)"
               >{{ scope.row.showFlag ? "停用" : "启用" }}</el-button

+ 49 - 11
src/views/afterSchoolManager/components/examinationDetail.vue

@@ -24,6 +24,36 @@
       >
         <el-table-column type="expand">
           <template slot-scope="props">
+            <!-- <el-table
+              style="width: 100%;padding-left: 48px"
+              :show-header="false"
+              :data="props.row.detailDtos"
+            >
+              <el-table-column
+                label="名称"
+                prop="musicScoreName"
+              ></el-table-column>
+              <el-table-column label="类型" prop="type"
+                ><template slot-scope="scope">{{
+                  scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频"
+                }}</template>
+              </el-table-column>
+              <el-table-column label="速度" prop="trainingSpeed">
+                <template slot-scope="scope">
+                  <span v-if="scope.row.homeworkType === 'MUSIC_SCORE'">
+                    {{ scope.row.trainingSpeed }}速度
+                  </span>
+                  <span v-else>--</span>
+                </template>
+              </el-table-column>
+              <el-table-column prop="times" label="次数/总计">
+                <template slot-scope="scope"
+                  >{{ scope.row.trainingTimes }}/{{
+                    scope.row.times
+                  }}次</template
+                >
+              </el-table-column>
+            </el-table> -->
             <el-row
               :gutter="20"
               v-for="(item, index) in props.row.detailDtos"
@@ -39,17 +69,22 @@
               >
               <el-col :span="6"
                 ><div class="rowlast">
-                  <span :class="item.trainingScore >= item.standardScore ? '' : 'red'">{{
-                    item.trainingScore
-                  }}</span>
+                  <span
+                    :class="
+                      item.trainingScore >= item.standardScore ? '' : 'red'
+                    "
+                    >{{ item.trainingScore }}</span
+                  >
                   / {{ item.standardScore }} 分
                 </div></el-col
               >
             </el-row>
           </template>
         </el-table-column>
-        <el-table-column prop="username" align="left" label="学生姓名"> </el-table-column>
-        <el-table-column prop="phone" align="left" label="手机号"> </el-table-column>
+        <el-table-column prop="username" align="left" label="学生姓名">
+        </el-table-column>
+        <el-table-column prop="phone" align="left" label="手机号">
+        </el-table-column>
         <el-table-column prop="subjectName" align="left" label="声部名称">
         </el-table-column>
         <el-table-column prop="trainingTime" align="left" label="完成时间">
@@ -67,14 +102,17 @@
   </div>
 </template>
 <script>
-import { getLessonExaminationStudent, getExaminationSubjectPublic } from "../api";
+import {
+  getLessonExaminationStudent,
+  getExaminationSubjectPublic
+} from "../api";
 export default {
   props: ["courseScheduleId", "type"],
   data() {
     return {
       subjectId: [],
       list: [],
-      subjectList: [],
+      subjectList: []
     };
   },
   mounted() {
@@ -90,7 +128,7 @@ export default {
       try {
         const res = await getLessonExaminationStudent({
           lessonExaminationId: this.courseScheduleId,
-          subjectId: this.subjectId,
+          subjectId: this.subjectId
         });
         this.list = res.data;
       } catch (e) {
@@ -100,7 +138,7 @@ export default {
     async getPublicSubject() {
       try {
         const res = await getExaminationSubjectPublic({
-          lessonExaminationId: this.courseScheduleId,
+          lessonExaminationId: this.courseScheduleId
         });
         this.subjectList = res.data;
       } catch (e) {
@@ -112,8 +150,8 @@ export default {
         this.subjectId.shift();
       }
       this.getStudentList();
-    },
-  },
+    }
+  }
 };
 </script>
 

+ 55 - 14
src/views/afterSchoolManager/components/studentWroks.vue

@@ -24,32 +24,73 @@
       >
         <el-table-column type="expand">
           <template slot-scope="props">
-            <el-row
+            <el-table
+              style="width: 100%;padding-left: 48px"
+              :show-header="false"
+              :data="props.row.studentLessonTrainingDetail"
+            >
+              <el-table-column
+                label="名称"
+                prop="musicScoreName"
+              ></el-table-column>
+              <el-table-column label="类型" prop="type"
+                ><template slot-scope="scope">{{
+                  scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频"
+                }}</template>
+              </el-table-column>
+              <el-table-column label="速度" prop="trainingSpeed">
+                <template slot-scope="scope">
+                  <span v-if="scope.row.homeworkType === 'MUSIC_SCORE'">
+                    {{ scope.row.trainingSpeed }}速度
+                  </span>
+                  <span v-else>--</span>
+                </template>
+              </el-table-column>
+              <el-table-column prop="times" label="次数/总计">
+                <template slot-scope="scope"
+                  >{{ scope.row.trainingTimes }}/{{
+                    scope.row.times
+                  }}次</template
+                >
+              </el-table-column>
+            </el-table>
+            <!-- <el-row
               :gutter="20"
               v-for="(item, index) in props.row.studentLessonTrainingDetail"
               :key="index"
             >
-              <el-col :span="12"
+              <el-col :span="6"
                 ><div class="rowFirst">{{ item.musicScoreName }}</div></el-col
               >
               <el-col :span="6"
+                ><div class="rowFirst">{{ scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频" }}</div></el-col
+              >
+              <el-col :span="6"
                 ><div class="rowSecond">
-                  <span>{{ item.trainingSpeed }}</span> 速度
+
+                  <span v-if="item.homeworkType === 'MUSIC_SCORE'">
+              <span>{{ item.trainingSpeed }}</span> 速度
+            </span>
+            <span v-else>--</span>
+
                 </div></el-col
               >
               <el-col :span="6"
                 ><div class="rowlast">
-                  <span :class="item.trainingTimes >= item.times ? '' : 'red'">{{
-                    item.trainingTimes
-                  }}</span>
+                  <span
+                    :class="item.trainingTimes >= item.times ? '' : 'red'"
+                    >{{ item.trainingTimes }}</span
+                  >
                   / {{ item.times }} 次
                 </div></el-col
               >
-            </el-row>
+            </el-row> -->
           </template>
         </el-table-column>
-        <el-table-column prop="userName" align="left" label="学生姓名"> </el-table-column>
-        <el-table-column prop="phone" align="left" label="手机号"> </el-table-column>
+        <el-table-column prop="userName" align="left" label="学生姓名">
+        </el-table-column>
+        <el-table-column prop="phone" align="left" label="手机号">
+        </el-table-column>
         <el-table-column prop="subjectName" align="left" label="声部名称">
         </el-table-column>
         <el-table-column prop="submitTime" align="left" label="完成时间">
@@ -74,7 +115,7 @@ export default {
     return {
       subjectId: [],
       list: [],
-      subjectList: [],
+      subjectList: []
     };
   },
   mounted() {
@@ -92,7 +133,7 @@ export default {
         const res = await getHomeworkStudent({
           courseScheduleId: this.courseScheduleId,
           type: this.type,
-          subjectId: this.subjectId[0] ? this.subjectId[0] : "",
+          subjectId: this.subjectId[0] ? this.subjectId[0] : ""
         });
         this.list = res.data;
       } catch (e) {
@@ -103,7 +144,7 @@ export default {
       try {
         const res = await getHomeworkSubjectPublic({
           courseScheduleId: this.courseScheduleId,
-          type: this.type,
+          type: this.type
         });
         this.subjectList = res.data;
       } catch (e) {
@@ -116,8 +157,8 @@ export default {
         this.subjectId.shift();
       }
       this.getStudentList();
-    },
-  },
+    }
+  }
 };
 </script>
 

+ 16 - 8
src/views/afterSchoolManager/components/textConment.vue

@@ -23,19 +23,27 @@
 
       <el-table
         :data="item.trainingDetailList"
-        :show-header="false"
+        :show-header="true"
         style="width: 100%;margin-bottom: 12px;"
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
       >
-        <el-table-column prop="musicScoreName"></el-table-column>
-        <el-table-column prop="trainingSpeed">
-          <template slot-scope="scope"
-            >{{ scope.row.trainingSpeed }}速度</template
-          >
+        <el-table-column label="名称" prop="musicScoreName"></el-table-column>
+        <el-table-column label="类型" prop="type"
+          ><template slot-scope="scope">{{
+            scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频"
+          }}</template>
+        </el-table-column>
+        <el-table-column label="速度" prop="trainingSpeed">
+          <template slot-scope="scope">
+            <span v-if="scope.row.homeworkType === 'MUSIC_SCORE'">
+              {{ scope.row.trainingSpeed }}速度
+            </span>
+            <span v-else>--</span>
+          </template>
         </el-table-column>
-        <el-table-column prop="times">
+        <el-table-column prop="times" label="次数/总计">
           <template slot-scope="scope"
-            >{{ scope.row.times }}次</template
+            >{{ scope.row.trainingTimes }}/{{ scope.row.times }}次</template
           >
         </el-table-column>
       </el-table>

+ 31 - 2
src/views/attendanceManager/attendanceList/components/studentWroks.vue

@@ -22,7 +22,36 @@
     >
       <el-table-column type="expand">
         <template slot-scope="props">
-          <el-row
+          <el-table
+            style="width: 100%;padding-left: 48px"
+            :show-header="false"
+            :data="props.row.studentLessonTrainingDetail"
+            :border="false"
+          >
+            <el-table-column
+              label="名称"
+              prop="musicScoreName"
+            ></el-table-column>
+            <el-table-column label="类型" prop="type"
+              ><template slot-scope="scope">{{
+                scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频"
+              }}</template>
+            </el-table-column>
+            <el-table-column label="速度" prop="trainingSpeed">
+              <template slot-scope="scope">
+                <span v-if="scope.row.homeworkType === 'MUSIC_SCORE'">
+                  {{ scope.row.trainingSpeed }}速度
+                </span>
+                <span v-else>--</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="times" label="次数/总计">
+              <template slot-scope="scope"
+                >{{ scope.row.trainingTimes }}/{{ scope.row.times }}次</template
+              >
+            </el-table-column>
+          </el-table>
+          <!-- <el-row
             :gutter="20"
             v-for="(item, index) in props.row.studentLessonTrainingDetail"
             :key="index"
@@ -43,7 +72,7 @@
                 / {{ item.times }} 次
               </div></el-col
             >
-          </el-row>
+          </el-row> -->
         </template>
       </el-table-column>
       <el-table-column prop="userName" align="left" label="学生姓名">

+ 27 - 1
src/views/attendanceManager/attendanceList/components/textConment.vue

@@ -23,6 +23,32 @@
 
       <el-table
         :data="item.trainingDetailList"
+        :show-header="true"
+        style="width: 100%;margin-bottom: 12px;"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      >
+        <el-table-column label="名称" prop="musicScoreName"></el-table-column>
+        <el-table-column label="类型" prop="type"
+          ><template slot-scope="scope">{{
+            scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频"
+          }}</template>
+        </el-table-column>
+        <el-table-column label="速度" prop="trainingSpeed">
+          <template slot-scope="scope">
+            <span v-if="scope.row.homeworkType === 'MUSIC_SCORE'">
+              {{ scope.row.trainingSpeed }}速度
+            </span>
+            <span v-else>--</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="times" label="次数/总计">
+          <template slot-scope="scope"
+            >{{ scope.row.trainingTimes }}/{{ scope.row.times }}次</template
+          >
+        </el-table-column>
+      </el-table>
+      <!-- <el-table
+        :data="item.trainingDetailList"
         :show-header="false"
         style="width: 100%;margin-bottom: 12px;"
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
@@ -38,7 +64,7 @@
             >{{ scope.row.times }}次</template
           >
         </el-table-column>
-      </el-table>
+      </el-table> -->
     </div>
   </div>
 </template>

+ 0 - 1
src/views/businessManager/shopManager/shopList.vue

@@ -519,7 +519,6 @@
         @close="singleShopStatus = false"
         @confirm="getList"
       />
-
     </el-dialog>
   </div>
 </template>

+ 20 - 0
src/views/categroyManager/generalSettings/overallManager.vue

@@ -381,6 +381,26 @@
             </el-select>
           </el-form-item>
         </el-row>
+        <el-row>
+          <el-form-item
+            prop="279"
+            :rules="[
+              {
+                required: false,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确条数'
+              }
+            ]"
+          >
+            作业练习组内最多添加:
+            <el-input
+              style="width: 180px;margin: 0 5px;"
+              v-model="form['279']"
+              placeholder="请输入条数"
+            ></el-input>
+            条练习
+          </el-form-item>
+        </el-row>
       </el-form>
       <!-- 列表 -->
       <!-- <el-row>

+ 15 - 0
src/views/main/api.js

@@ -247,3 +247,18 @@ export const multiDataSourceHomeStatsSummerIncome = data =>
     method: "post",
     data
   });
+
+// 列表
+export const api_studentCoursewarePlayRecordList = data =>
+  request2({
+    url: "/api-web/studentCoursewarePlayRecord/statList",
+    method: "post",
+    data
+  });
+// 详情
+export const api_studentCoursewarePlayRecordDetail = data =>
+  request2({
+    url: "/api-web/studentCoursewarePlayRecord/statDetailPage",
+    method: "post",
+    data
+  });

+ 91 - 0
src/views/main/coursewareDate/allDate.vue

@@ -0,0 +1,91 @@
+<template>
+  <div>
+    <el-card>
+      <headers title="数据总览" :hidenOrgan="true" />
+      <div
+        class="wall"
+        style="height: 68px"
+        v-if="JSON.stringify(items) == '{}'"
+      >
+        暂无数据
+      </div>
+      <!--
+          -->
+      <statistic :col="6" class="statistic" :cols="0">
+        <statistic-item v-for="(item, key) in items" :key="key"  @click="active = key" :class="{ active: active === key }">
+          <span>
+            {{ item.title + "(人)" }}
+            <el-tooltip
+              v-if="item.desc"
+              :content="item.desc"
+              :open-delay="0.3"
+              placement="top"
+            >
+              <i
+                style="margin-left: 5px; cursor: pointer"
+                class="el-icon-warning-outline"
+              />
+            </el-tooltip>
+          </span>
+          <span> <count-to :endVal="item.percent || 0" /> </span>
+        </statistic-item>
+      </statistic>
+    </el-card>
+  </div>
+</template>
+<script>
+import headers from "./modals/headers.vue";
+import countTo from "vue-count-to";
+import { descs, titles } from "../constant";
+import { getCloudStudyStudentOverView } from "../api";
+export default {
+  props: ["data"],
+  components: {
+    headers,
+    countTo
+  },
+  data() {
+    return {
+      dataList:{},
+      active:''
+    };
+  },
+  async mounted() {
+    try {
+      const res = await getCloudStudyStudentOverView();
+      this.dataList = res.data;
+    } catch (e) {
+      console.log(e);
+    }
+    // 获取数据
+  },
+  computed: {
+    items() {
+      let obj = {};
+      //        "eVipStudentNum",
+      let arr = [
+        "totalStudentNum",
+        "waitActivateVipStudentNum",
+        "effectiveVipStudentNum",
+        "vipStudentNum",
+        "cloudStudyLivelyStudentNum",
+        // "newCloudStudyStudentNum",
+        // "cloudStudyTodayUseStudentNum",
+        "cloudStudyUseStudentNum",
+      ];
+      arr.forEach((str) => {
+        if (this.dataList[str]+'') {
+          obj[str] ={title:titles[str],percent:this.dataList[str],desc:descs[str]};
+        }
+      });
+      return obj;
+    },
+  },
+  methods: {},
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-card__body {
+  padding-top: 0 !important;
+}
+</style>

+ 550 - 0
src/views/main/coursewareDate/exerciseDuration.vue

@@ -0,0 +1,550 @@
+<template>
+  <div class="m-container">
+    <!-- 搜索标题 -->
+    <saveform
+      :inline="true"
+      ref="searchForm"
+      class="searchForm"
+      saveKey="exerciseDuration"
+      :model.sync="searchForm"
+    >
+      <el-form-item prop="dates">
+        <!-- @change="changeWeek" -->
+        <el-date-picker
+          :clearable="false"
+          v-model="searchForm.dates"
+          value-format="yyyy-MM-dd"
+          :picker-options="{ firstDayOfWeek: 1 }"
+          type="daterange"
+          style="width: 405px"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        >
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button @click="search" type="danger">搜索</el-button>
+        <el-button @click="onReSet" type="primary">重置</el-button>
+      </el-form-item>
+    </saveform>
+    <!-- 分组添加柱状图  -->
+    <ve-histogram
+      style="width: 100%"
+      height="350px"
+      :data="chartData"
+      :data-empty="dataEmpty"
+      :extend="chartExtend"
+      :legend="legend"
+      :data-zoom="dataZoom"
+    ></ve-histogram>
+
+    <el-button
+      type="primary"
+      @click="exportQuestion"
+      style="margin: 16px 0"
+      v-permission="'studentCoursewarePlayRecord/exportStatList'"
+      >导出</el-button
+    >
+    <div class="tableWrap">
+      <el-table
+        :data="tableList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        @sort-change="onSortChange"
+      >
+        <el-table-column width="120px" align="center" prop="id" label="排名">
+          <template slot-scope="scope">
+            <div>
+              {{ scope.$index + 1 }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="organizationName"
+          label="分部名称"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="memberNum"
+          sortable="custom"
+          label="会员人数"
+          width="100px"
+        >
+          <template slot-scope="scope">
+            <div>{{ scope.row.memberNum }}人</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="noPlayNum"
+          sortable="custom"
+          label="无练习人数"
+          width="120px"
+        >
+          <template slot-scope="scope">
+            <div>{{ scope.row.noPlayNum }}人</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="playTimeLess10"
+          sortable="custom"
+          label="0-10分钟"
+          width="120px"
+        >
+          <template slot-scope="scope">
+            <div>{{ scope.row.playTimeLess10 }}人</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="playTimeLess60"
+          sortable="custom"
+          label="10-60分钟"
+          width="120px"
+        >
+          <template slot-scope="scope">
+            <div>{{ scope.row.playTimeLess60 }}人</div>
+          </template></el-table-column
+        >
+
+        <el-table-column
+          align="center"
+          prop="playTimeLess120"
+          sortable="custom"
+          label="60-120分钟"
+          width="120px"
+        >
+          <template slot-scope="scope">
+            <div>{{ scope.row.playTimeLess120 }}人</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="playTimeLess240"
+          sortable="custom"
+          label="120-240分钟"
+          width="130px"
+        >
+          <template slot-scope="scope">
+            <div>{{ scope.row.playTimeLess240 }}人</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="playTimeRather240"
+          sortable="custom"
+          label=">240分钟"
+          width="120px"
+        >
+          <template slot-scope="scope">
+            <div>{{ scope.row.playTimeRather240 }}人</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="avgPlayTime"
+          sortable="custom"
+          label="平均时长"
+          width="100px"
+        >
+          <template slot-scope="scope">
+            <div>{{ scope.row.avgPlayTime || 0 }}分钟</div>
+          </template>
+        </el-table-column>
+
+        <el-table-column align="center" label="操作" fixed="right">
+          <template slot-scope="scope">
+            <el-button
+              v-permission="'/coursewareDurationDetail'"
+              @click="onDetail(scope.row)"
+              type="text"
+              >详情</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+<script>
+import { Export } from "@/utils/downLoadFile";
+import saveform from "@/components/save-form";
+import dayjs from "dayjs";
+import histogram from "v-charts/lib/histogram.common";
+import { getNowDateAndMonday, getNowDateAndSunday } from "@/utils/utils";
+import { api_studentCoursewarePlayRecordList } from "../api";
+import { getTimeFormat } from "@/utils";
+let nowTime = dayjs()
+  .subtract(1, "day")
+  .format("YYYY-MM-DD");
+// export const getTimeFormat = (times, keys = []) => {
+//   if (times && times.length) {
+//     return {
+//       [keys[0] || "start"]: dayjs(times[0]).format("YYYY-MM-DD"),
+//       [keys[1] || "start"]: dayjs(times[1]).format("YYYY-MM-DD")
+//     };
+//   }
+//   return {};
+// };
+export const getCurrentMonth = () => {
+  return [
+    dayjs()
+      .startOf("month")
+      .format("YYYY-MM-DD"),
+    dayjs()
+      .endOf("month")
+      .format("YYYY-MM-DD")
+  ];
+};
+export default {
+  components: { saveform, "ve-histogram": histogram },
+  name: "helpCategory",
+  data() {
+    return {
+      searchForm: {
+        dates: getCurrentMonth(),
+        sort: null,
+        asc: null
+      },
+      tableList: []
+    };
+  },
+  async mounted() {
+    this.getList();
+  },
+  methods: {
+    onSortChange(val) {
+      const template = {
+        memberNum: 1,
+        noPlayNum: 2,
+        playTimeLess10: 3,
+        playTimeLess60: 4,
+        playTimeLess120: 5,
+        playTimeLess240: 6,
+        playTimeRather240: 7,
+        avgPlayTime: 8
+      };
+      this.searchForm.sort = template[val.prop];
+      if (val.order === "ascending") {
+        this.searchForm.asc = true;
+      } else if (val.order === "descending") {
+        this.searchForm.asc = false;
+      } else {
+        this.searchForm.asc = null;
+        this.searchForm.sort = null;
+      }
+      this.getList();
+    },
+    exportQuestion() {
+      const { dates } = this.searchForm;
+      Export(
+        this,
+        {
+          url: "/api-web/studentCoursewarePlayRecord/exportStatList",
+          fileName: "云课堂观看统计.xls",
+          method: "post",
+          params: {
+            ...getTimeFormat(dates, ["startTime", "endTime"])
+            // exportEnum: "VIDEO_PLAY_STAT",
+            // queryInfo: {
+            //   ...getTimeFormat(dates, ["startTime", "endTime"])
+            // }
+          }
+        },
+        "您确定导出云课堂观看统计?"
+      );
+    },
+    onDetail(row) {
+      this.$router.push({
+        path: "/coursewareDurationDetail",
+        query: {
+          organId: row.organizationId,
+          dates: JSON.stringify(this.searchForm.dates)
+        }
+      });
+    },
+    search() {
+      this.$refs.searchForm.validate(valid => {
+        this.pageInfo = {
+          ...this.pageInfo,
+          page: 1
+        };
+        this.getList();
+      });
+    },
+    onReSet() {
+      this.pageInfo = {
+        ...this.pageInfo,
+        page: 1
+      };
+      this.$refs.searchForm.resetFields();
+      this.getList();
+    },
+    getDefaultTime() {
+      const dayjs = this.$helpers.dayjs;
+      let nowDate = dayjs(new Date()).format("YYYY-MM-DD");
+      let lastWeek = dayjs(nowDate)
+        .subtract(1, "week")
+        .format("YYYY-MM-DD");
+
+      console.log(lastWeek, nowDate, "121212");
+      this.searchForm.dates = [
+        getNowDateAndMonday(lastWeek),
+        getNowDateAndSunday(nowDate)
+      ];
+
+      console.log(this.searchForm.dates, "this.searchForm.dates");
+    },
+    changeWeek(val) {
+      if (val) {
+        // this.searchForm.dates = [
+        //   getNowDateAndMonday(val[0]),
+        //   getNowDateAndSunday(val[1])
+        // ];
+      } else {
+        this.getDefaultTime();
+      }
+    },
+    async getList() {
+      try {
+        const { dates, sort, asc } = this.searchForm;
+        let params = {
+          sort,
+          asc,
+          ...getTimeFormat(dates, ["startTime", "endTime"])
+        };
+        const res = await api_studentCoursewarePlayRecordList({
+          page: 1,
+          rows: 10,
+          ...params
+        });
+        this.tableList = [];
+        this.tableList = res.data;
+      } catch {}
+    }
+  },
+  computed: {
+    // items() {
+    //   let obj = {};
+    //   let arr = [
+    //     "normalNum",
+    //     "train1",
+    //     "train2",
+    //     "train3",
+    //     "train4",
+    //     "buyRate",
+    //     "avgTrainTime"
+    //   ];
+    //   arr.forEach(str => {
+    //     if (this.dataList[str] + "") {
+    //       obj[str] = {
+    //         title: titles[str],
+    //         percent: this.dataList[str],
+    //         desc: descs[str]
+    //       };
+    //     }
+    //   });
+
+    //   return obj;
+    // },
+    // scaleItems() {
+    //   let obj = {};
+    //   let arr = ["trainRate", "trainStandRate"];
+    //   arr.forEach(str => {
+    //     if (this.dataList[str] + "") {
+    //       obj[str] = {
+    //         title: titles[str],
+    //         percent: this.dataList[str],
+    //         desc: descs[str]
+    //       };
+    //     }
+    //   });
+
+    //   return obj;
+    // },
+    legend() {
+      return {
+        left: "10px"
+      };
+    },
+    chartData() {
+      const temp = {
+        noPlayNum: "无练习人数",
+        playTimeLess10: "0-10分钟",
+        playTimeLess60: "10-60分钟",
+        playTimeLess120: "60-120分钟",
+        playTimeLess240: "120-240分钟",
+        playTimeRather240: ">240分钟",
+        avgPlayTime: "平均时长"
+      };
+      const values = this.tableList;
+
+      const months = {};
+      for (const key in temp) {
+        for (const item of values) {
+          if (!months[item.organizationName]) {
+            months[item.organizationName] = {
+              分部: item.organizationName
+            };
+          }
+          months[item.organizationName][temp[key]] = item[key] || 0;
+        }
+      }
+      console.log(months, "months");
+      return {
+        columns: [
+          "分部",
+          "无练习人数",
+          "0-10分钟",
+          "10~60分钟",
+          "60-120分钟",
+          "120-240分钟",
+          ">240分钟",
+          "平均时长"
+        ],
+        rows: Object.values(months)
+      };
+    },
+    chartExtend() {
+      return {
+        yAxis: {
+          //纵轴标尺固定
+          minInterval: 1,
+          type: "value",
+          scale: true,
+          min: 0,
+          axisLabel: {
+            formatter: "{value}"
+          }
+        },
+        series: {
+          type: "bar",
+          smooth: false
+        },
+        tooltip: {
+          axisPointer: {
+            type: "shadow",
+            shadowStyle: {
+              color: "rgba(150,150,150,0.2)"
+            }
+          },
+          formatter: item => {
+            // let arr = [
+            //   { name: "会员人数", dot: "元" },
+            //   { name: "<60分钟", dot: "%" },
+            //   { name: "60-120分钟", dot: "元" },
+            //   { name: "120-240分钟", dot: "元" },
+            //   { name: ">240分钟", dot: "元" },
+            //   { name: "平均时长", dot: "元" }
+            // ];
+            // console.log(item, "-121212--------------");
+            return [
+              item[0].axisValueLabel,
+              ...item.map(d => {
+                return `<br/>${d.marker}${d.seriesName}: ${d.value}${
+                  d.seriesName == "平均时长" ? "分钟" : "人"
+                }`;
+              })
+            ].join("");
+          }
+        }
+      };
+    },
+    scalChartExtend() {
+      return {
+        yAxis: {
+          //纵轴标尺固定
+          minInterval: 1,
+          type: "value",
+          scale: true,
+          min: 0,
+          axisLabel: {
+            formatter: "{value}%"
+          }
+        },
+        series: {
+          type: "bar",
+          smooth: false
+        },
+        tooltip: {
+          axisPointer: {
+            type: "shadow",
+            shadowStyle: {
+              color: "rgba(150,150,150,0.2)"
+            }
+          },
+          formatter: item => {
+            return [
+              item[0].axisValueLabel,
+              ...item.map(d => {
+                return `<br/>${d.marker}${d.seriesName}: ${d.value}%`;
+              })
+            ].join("");
+          }
+        }
+      };
+    },
+    dataZoom() {
+      return [
+        {
+          show: true,
+          type: "slider",
+          start: 0,
+          end: 30,
+          filterMode: "empty",
+          zoomLock: true,
+          handleSize: 0
+        }
+      ];
+    },
+    dataEmpty() {
+      return !this.chartData.rows.length;
+    },
+    exporyun() {
+      return {
+        organId: this.organId
+      };
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-date-editor.el-input {
+  width: 100% !important;
+}
+::v-deep .el-select {
+  width: 100% !important;
+}
+::v-deep .el-table .cell {
+  display: -webkit-box;
+  overflow: hidden;
+  max-height: 45px;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 3;
+  -webkit-box-orient: vertical;
+}
+::v-deep .el-dialog__body {
+  padding: 10px 20px;
+}
+.newBand {
+  display: inline-block;
+}
+
+::v-deep .el-tabs__active-bar {
+  background-color: transparent !important;
+}
+::v-deep.el-tabs__nav-wrap {
+  &:after {
+    background-color: transparent !important;
+  }
+}
+/*去掉切换时el-tab-pane底部的蓝色下划线*/
+::v-deep .el-tabs__nav-wrap::after {
+  background-color: transparent !important;
+}
+
+/*去掉tabs底部的下划线*/
+</style>

+ 397 - 0
src/views/main/coursewareDate/exerciseDurationDetail.vue

@@ -0,0 +1,397 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <el-page-header @back="onCancel" content="观看时长详情"></el-page-header>
+    </h2>
+
+    <div class="m-core">
+      <!-- 搜索标题 -->
+      <saveform
+        :inline="true"
+        ref="searchForm"
+        class="searchForm"
+        :model.sync="searchForm"
+      >
+        <el-form-item prop="organId">
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.organId"
+            filterable
+            clearable
+            placeholder="请选择分部"
+          >
+            <el-option
+              v-for="(item, index) in selects.branchs"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="dates">
+          <el-date-picker
+            :clearable="false"
+            v-model="searchForm.dates"
+            value-format="yyyy-MM-dd"
+            :picker-options="{
+              firstDayOfWeek: 1,
+              disabledDate(time) {
+                return time.getTime() >= nowIndex;
+              }
+            }"
+            type="daterange"
+            style="width: 405px"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+
+        <el-form-item>
+          <el-button @click="search" type="danger">搜索</el-button>
+          <el-button @click="onReSet" type="primary">重置</el-button>
+        </el-form-item>
+      </saveform>
+      <!-- 分组添加柱状图  -->
+      <el-button
+        type="primary"
+        @click="exportQuestion"
+        style="margin: 0 0 16px"
+        v-permission="'studentCoursewarePlayRecord/exportStatDetailPage'"
+        >导出</el-button
+      >
+      <div class="tableWrap">
+        <el-table
+          :data="tableList"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          @sort-change="onSortChange"
+        >
+          <!-- <el-table-column width="120px" align="center" prop="id" label="排名">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.$index + 1 }}
+              </div>
+            </template>
+          </el-table-column> -->
+          <el-table-column
+            align="center"
+            prop="teacherName"
+            label="声部老师"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="memberNum"
+            sortable="custom"
+            label="会员人数"
+          >
+            <template slot-scope="scope">
+              <div>{{ scope.row.memberNum }}人</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="noPlayNum"
+            sortable="custom"
+            label="无练习人数"
+          >
+            <template slot-scope="scope">
+              <div>{{ scope.row.noPlayNum }}人</div>
+            </template></el-table-column
+          >
+
+          <el-table-column
+            align="center"
+            prop="playTimeLess10"
+            sortable="custom"
+            label="0-10分钟"
+          >
+            <template slot-scope="scope">
+              <div>{{ scope.row.playTimeLess10 }}人</div>
+            </template>
+          </el-table-column>
+
+          <el-table-column
+            align="center"
+            prop="playTimeLess60"
+            sortable="custom"
+            label="10-60分钟"
+          >
+            <template slot-scope="scope">
+              <div>{{ scope.row.playTimeLess60 }}人</div>
+            </template></el-table-column
+          >
+
+          <el-table-column
+            align="center"
+            prop="playTimeLess120"
+            sortable="custom"
+            label="60-120分钟"
+          >
+            <template slot-scope="scope">
+              <div>{{ scope.row.playTimeLess120 }}人</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="playTimeLess240"
+            sortable="custom"
+            label="120-240分钟"
+          >
+            <template slot-scope="scope">
+              <div>{{ scope.row.playTimeLess240 }}人</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="playTimeRather240"
+            sortable="custom"
+            label=">240分钟"
+          >
+            <template slot-scope="scope">
+              <div>{{ scope.row.playTimeRather240 }}人</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="avgPlayTime"
+            sortable="custom"
+            label="平均时长"
+          >
+            <template slot-scope="scope">
+              <div>{{ scope.row.avgPlayTime }}分钟</div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          sync
+          :total.sync="pageInfo.total"
+          :page.sync="pageInfo.page"
+          :limit.sync="pageInfo.limit"
+          :page-sizes="pageInfo.page_size"
+          @pagination="getList"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import { Export } from "@/utils/downLoadFile";
+import pagination from "@/components/Pagination/index";
+import saveform from "@/components/save-form";
+import dayjs from "dayjs";
+import histogram from "v-charts/lib/histogram.common";
+import { getNowDateAndMonday, getNowDateAndSunday } from "@/utils/utils";
+import { api_studentCoursewarePlayRecordDetail } from "../api";
+import { getTimeFormat } from "@/utils";
+let nowTime = new Date();
+nowTime =
+  nowTime.getFullYear() +
+  "-" +
+  (nowTime.getMonth() + 1) +
+  "-" +
+  nowTime.getDate();
+// export const getTimes = (times, keys = []) => {
+//   if (times && times.length) {
+//     return {
+//       [keys[0] || "start"]: dayjs(times[0]).format("YYYY-MM-DD"),
+//       [keys[1] || "start"]: dayjs(times[1]).format("YYYY-MM-DD")
+//     };
+//   }
+//   return {};
+// };
+
+export const getCurrentMonth = () => {
+  return [
+    dayjs()
+      .startOf("month")
+      .format("YYYY-MM-DD"),
+    dayjs()
+      .endOf("month")
+      .format("YYYY-MM-DD")
+  ];
+};
+export default {
+  components: { saveform, "ve-histogram": histogram, pagination },
+  name: "helpCategory",
+  data() {
+    return {
+      nowIndex: dayjs(dayjs().format("YYYY-MM-DD")).valueOf(),
+      searchForm: {
+        dates: getCurrentMonth(),
+        organId: "",
+        sort: null,
+        asc: null
+      },
+      tableList: [],
+      activeName: "first",
+      // specialList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    };
+  },
+  async mounted() {
+    const query = this.$route.query;
+    this.searchForm.organId = query.organId ? Number(query.organId) : "";
+    this.searchForm.dates = query.dates
+      ? JSON.parse(query.dates)
+      : getCurrentMonth();
+    await this.$store.dispatch("setBranchs");
+    // const arr = [36, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 54, 56];
+    // this.specialList = this.selects.branchs.filter(item => {
+    //   return arr.indexOf(item.id) == -1;
+    // });
+    // this.searchForm.dates.push(getNowDateAndMonday(nowTime));
+    // this.searchForm.dates.push(getNowDateAndSunday(nowTime));
+    this.getList();
+  },
+  methods: {
+    onSortChange(val) {
+      const template = {
+        memberNum: 1,
+        noPlayNum: 2,
+        playTimeLess10: 3,
+        playTimeLess60: 4,
+        playTimeLess120: 5,
+        playTimeLess240: 6,
+        playTimeRather240: 7,
+        avgPlayTime: 8
+      };
+      this.searchForm.sort = template[val.prop];
+      if (val.order === "ascending") {
+        this.searchForm.asc = true;
+      } else if (val.order === "descending") {
+        this.searchForm.asc = false;
+      } else {
+        this.searchForm.asc = null;
+        this.searchForm.sort = null;
+      }
+      this.getList();
+    },
+    exportQuestion() {
+      const { dates, organId, asc, sort } = this.searchForm;
+      Export(
+        this,
+        {
+          url: "/api-web/studentCoursewarePlayRecord/exportStatDetailPage",
+          fileName: "观看时长详情.xls",
+          method: "post",
+          params: {
+            ...getTimeFormat(dates, ["startTime", "endTime"]),
+            organizationId: organId,
+            asc,
+            sort
+          }
+        },
+        "您确定导出观看时长详情?"
+      );
+    },
+    search() {
+      this.$refs.searchForm.validate(valid => {
+        this.pageInfo = {
+          ...this.pageInfo,
+          page: 1
+        };
+        this.getList();
+      });
+    },
+    onCancel() {
+      this.$store.dispatch("delVisitedViews", this.$route);
+      this.$router.push({
+        path: "/coursewareDate"
+      });
+    },
+    onReSet() {
+      this.pageInfo = {
+        ...this.pageInfo,
+        page: 1
+      };
+      this.$refs.searchForm.resetFields();
+      this.getList();
+    },
+    getDefaultTime() {
+      const dayjs = this.$helpers.dayjs;
+      let nowDate = dayjs(new Date()).format("YYYY-MM-DD");
+      let lastWeek = dayjs(nowDate)
+        .subtract(1, "week")
+        .format("YYYY-MM-DD");
+      this.searchForm.dates = [
+        getNowDateAndMonday(lastWeek),
+        getNowDateAndSunday(nowDate)
+      ];
+    },
+    changeWeek(val) {
+      if (val) {
+        // this.searchForm.dates = [
+        //   getNowDateAndMonday(val[0]),
+        //   getNowDateAndSunday(val[1])
+        // ];
+      } else {
+        this.getDefaultTime();
+      }
+    },
+    async getList() {
+      // api_studentCoursewarePlayRecordDetail
+      try {
+        const { dates, organId, sort, asc } = this.searchForm;
+        let params = {
+          sort,
+          asc,
+          ...getTimeFormat(dates, ["startTime", "endTime"]),
+          organizationId: organId
+        };
+        const res = await api_studentCoursewarePlayRecordDetail({
+          page: this.pageInfo.page,
+          rows: this.pageInfo.limit,
+          ...params
+        });
+        this.tableList = [];
+        this.tableList = res.data.rows || [];
+        this.pageInfo.total = res.data.total;
+      } catch {}
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-date-editor.el-input {
+  width: 100% !important;
+}
+::v-deep .el-select {
+  width: 100% !important;
+}
+::v-deep .el-table .cell {
+  display: -webkit-box;
+  overflow: hidden;
+  max-height: 45px;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 3;
+  -webkit-box-orient: vertical;
+}
+::v-deep .el-dialog__body {
+  padding: 10px 20px;
+}
+.newBand {
+  display: inline-block;
+}
+
+::v-deep .el-tabs__active-bar {
+  background-color: transparent !important;
+}
+::v-deep.el-tabs__nav-wrap {
+  &:after {
+    background-color: transparent !important;
+  }
+}
+/*去掉切换时el-tab-pane底部的蓝色下划线*/
+::v-deep .el-tabs__nav-wrap::after {
+  background-color: transparent !important;
+}
+
+/*去掉tabs底部的下划线*/
+</style>

+ 38 - 0
src/views/main/coursewareDate/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      观看时间统计
+    </h2>
+    <div class="m-core">
+      <exerciseDuration />
+    </div>
+  </div>
+</template>
+<script>
+import { permission } from "@/utils/directivePage";
+// exerciseDuration
+import allDate from "./allDate.vue";
+import organMemberList from "./organMemberList.vue";
+import exerciseDuration from "./exerciseDuration.vue";
+export default {
+  components: {
+    allDate,
+    organMemberList,
+    exerciseDuration
+  },
+  data() {
+    return {
+      activeKey: ""
+    };
+  },
+  methods: {
+    permission
+  }
+};
+</script>
+<style lang="scss" scoped>
+.marginBottom20 {
+  margin-bottom: 20px;
+}
+</style>

+ 67 - 0
src/views/main/coursewareDate/modals/headers.vue

@@ -0,0 +1,67 @@
+<template>
+  <div>
+    <div class="titleWrap">
+      <div class="box">
+        <span class="shape"></span>
+        <span>{{ title }}</span>
+      </div>
+      <div class="right">
+        <el-select
+          v-if="!hidenOrgan"
+
+          class="multiple"
+          v-model.trim="organId"
+          filterable
+          clearable
+          placeholder="请选择分部"
+          @change="changeOrgan"
+        >
+          <el-option
+            v-for="(item, index) in special?specialList:selects.branchs"
+            :key="index"
+            :label="item.name"
+            :value="item.id"
+          ></el-option>
+        </el-select>
+      </div>
+    </div>
+    <el-divider></el-divider>
+  </div>
+</template>
+<script>
+export default {
+  props: ["title", "hidenOrgan",'special'],
+  data() {
+    return {
+      organId: "",
+      specialList: [],
+    };
+  },
+  async mounted() {
+    await this.$store.dispatch("setBranchs");
+      const arr = [36,39,41,42,43,44,45,46,47,48,49,50,52,54,56]
+    this.specialList = this.selects.branchs.filter((item) => {
+      return arr.indexOf(item.id) == -1;
+    });
+  },
+  methods: {
+    changeOrgan(val) {
+      this.organId = val;
+      this.$emit("changeOrgan", val);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-divider--horizontal {
+  margin-top: 0 !important;
+}
+.titleWrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  align-items: center;
+  height: 55px;
+}
+</style>

+ 358 - 0
src/views/main/coursewareDate/organDateDetail.vue

@@ -0,0 +1,358 @@
+<!--  -->
+<template>
+  <div class="m-container">
+    <el-page-header
+      @back="goback"
+      style="padding-bottom: 30px"
+      content="分部云练习数据详情"
+    >
+    </el-page-header>
+
+    <div class="m-core">
+      <save-form
+        :inline="true"
+        :model="searchForm"
+        @submit="search"
+        @reset="onReSet"
+        ref="saveForm"
+      >
+        <el-form-item prop="organId">
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.organId"
+            filterable
+            placeholder="请选择分部"
+            @change="search"
+          >
+            <el-option
+              v-for="(item, index) in specialList"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <!-- <el-button native-type="submit" type="primary">搜索</el-button>
+          <el-button native-type="reset" type="danger">重置</el-button> -->
+          <el-button
+            type="primary"
+            @click="organDateExport"
+            v-permission="'export/organTeacherMemberStudentData'"
+            >导出</el-button
+          >
+        </el-form-item>
+      </save-form>
+      <a class="msg" v-if="noTeacherStudentNum > 0" @click="gotoStudentList"
+        >查看当前分部没有关联指导老师的学生</a
+      >
+      <div class="tableWrap">
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+        >
+          <el-table-column
+            align="center"
+            prop="teacherName"
+            label="老师姓名"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="totalStudentNum"
+            label="学员总数"
+          >
+            <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>学员总数</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">
+                    指导老师关联的乐团在读学员+有剩余VIP课或网管课学员去重之和
+                  </div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      top: 2px;
+                      position: relative;
+                    "
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template>
+          </el-table-column>
+
+          <el-table-column
+            align="center"
+            prop="cloudStudyUseStudentNum"
+            label="使用人数"
+          >
+            <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>使用人数</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">
+                    指导老师关联的截止目前使用云练习的总人数
+                  </div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      top: 2px;
+                      position: relative;
+                    "
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="cloudStudyUseStudentDuty"
+            label="使用人数比"
+          >
+            <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>使用比例</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">使用人数 / 学员总数</div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      top: 2px;
+                      position: relative;
+                    "
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template>
+            <template slot-scope="scope">
+              <div>{{ scope.row.cloudStudyUseStudentDuty }}%</div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="vipStudentNum"
+            label="付费会员数"
+          >
+            <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>付费会员数</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">
+                    指导老师关联的生效中、待生效付费会员总数
+                  </div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      top: 2px;
+                      position: relative;
+                    "
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template>
+          </el-table-column>
+          <!-- <el-table-column
+            align="center"
+            prop="eVipStudentNum"
+            label="试用会员"
+
+          ></el-table-column> -->
+          <el-table-column
+            align="center"
+            prop="vipStudentDuty"
+            label="付费会员占比"
+          >
+            <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>付费会员占比</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">付费会员数 / 学员总数</div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      top: 2px;
+                      position: relative;
+                    "
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template>
+            <template slot-scope="scope">
+              <div>{{ scope.row.vipStudentDuty }}%</div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="studentId" label="操作">
+            <template slot-scope="scope">
+              <div>
+                <el-button type="text" @click="gotoDetail(scope.row)"
+                  >详情</el-button
+                >
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          sync
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        />
+      </div>
+      <el-dialog
+        title="分部数据"
+        :visible.sync="studentVisible"
+        width="1100px"
+        v-if="studentVisible"
+      >
+        <organStudentDetail />
+        <!-- <span slot="footer" class="dialog-footer">
+          <el-button @click="studentVisible = false">取 消</el-button>
+          <el-button type="primary" @click="submitPlan">确 定</el-button>
+        </span> -->
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from "axios";
+import { getToken } from "@/utils/auth";
+import pagination from "@/components/Pagination/index";
+import load from "@/utils/loading";
+import { Export } from "@/utils/downLoadFile";
+import { queryMemberStudentData } from "../api";
+import qs from "qs";
+export default {
+  name: "organDateDetail",
+  components: { pagination },
+  data() {
+    return {
+      searchForm: {
+        organId: null
+      },
+
+      tableList: [],
+      organList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      studentVisible: false,
+      noTeacherStudentNum: 0,
+      specialList: []
+    };
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  async mounted() {
+    // 获取分部
+    await this.$store.dispatch("setBranchs");
+    const arr = [
+      36,
+      39,
+      41,
+      42,
+      43,
+      44,
+      45,
+      46,
+      47,
+      48,
+      49,
+      50,
+      52,
+      54,
+      55,
+      56
+    ];
+    this.specialList = this.selects.branchs.filter(item => {
+      return arr.indexOf(item.id) == -1;
+    });
+    if (this.$route.params?.organId) {
+      this.searchForm.organId = this.$route.params.organId;
+    }
+
+    this.init();
+  },
+  methods: {
+    init() {
+      this.getList();
+    },
+    async getList() {
+      try {
+        const res = await queryMemberStudentData({
+          organId: this.searchForm.organId,
+          page: this.rules.page,
+          rows: this.rules.limit
+        });
+        this.tableList = res.data.rows;
+        this.rules.total = res.data.total;
+        this.noTeacherStudentNum = res.data.statInfo.noTeacherStudentNum;
+        this.$refs.saveForm.save();
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {},
+    gotoDetail(row) {
+      this.$router.push({
+        name: "studentList",
+        params: { teacherId: row.teacherId }
+      });
+      // this.studentVisible = true;
+    },
+    gotoStudentList() {
+      this.$router.push({
+        name: "studentList",
+        params: { hasTeacher: "0", organId: this.searchForm.organId }
+      });
+    },
+    goback() {
+      this.$store.dispatch("delVisitedViews", this.$route);
+      this.$router.push({ path: "/workbench?tabrouter=cloudDate" });
+    },
+    organDateExport() {
+      let params = { ...this.searchForm };
+      Export(
+        this,
+        {
+          url: "/api-web/export/organTeacherMemberStudentData",
+          fileName: "分部云练习数据详情.xls",
+          method: "post",
+          params: qs.stringify(params)
+        },
+        "您确定导出分部云练习数据详情列表?"
+      );
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.msg {
+  color: red;
+  margin-bottom: 20px;
+  display: block;
+  text-decoration-line: underline;
+  font-size: 14px;
+}
+</style>

+ 539 - 0
src/views/main/coursewareDate/organMemberList.vue

@@ -0,0 +1,539 @@
+<template>
+  <div>
+    <el-card style="margin-bottom: 20px">
+      <!-- <headers title="数据总览" @changeOrgan="changeOrgan" :special="true" /> -->
+      <div
+        class="wall"
+        style="height: 68px"
+        v-if="JSON.stringify(items) == '{}'"
+      >
+        暂无数据
+      </div>
+      <!--
+          -->
+      <statistic :col="4" class="statistic" :cols="0">
+        <statistic-item
+          v-for="(item, key) in items"
+          :key="key"
+          @click="active = key"
+          :class="{ active: active === key }"
+        >
+          <span
+            v-if="
+              key == 'againBuyRate' ||
+                key == 'buyRate' ||
+                key == 'vipStudentRate'
+            "
+          >
+            {{ item.title + "(%)" }}
+            <el-tooltip
+              v-if="item.desc"
+              :content="item.desc"
+              :open-delay="0.3"
+              placement="top"
+            >
+              <i
+                style="margin-left: 5px; cursor: pointer"
+                class="el-icon-warning-outline"
+              />
+            </el-tooltip>
+          </span>
+          <span v-else>
+            {{ item.title + "(人)" }}
+            <el-tooltip
+              v-if="item.desc"
+              :content="item.desc"
+              :open-delay="0.3"
+              placement="top"
+            >
+              <i
+                style="margin-left: 5px; cursor: pointer"
+                class="el-icon-warning-outline"
+              />
+            </el-tooltip>
+          </span>
+
+          <span
+            v-if="
+              key == 'againBuyRate' ||
+                key == 'buyRate' ||
+                key == 'vipStudentRate'
+            "
+          >
+            <count-to :endVal="item.percent || 0" :decimals="2" />
+          </span>
+          <span v-else> <count-to :endVal="item.percent || 0" /> </span>
+        </statistic-item>
+        <!-- <statistic-item class="empty"></statistic-item>
+        <statistic-item class="empty"></statistic-item> -->
+      </statistic>
+
+      <ve-histogram
+        style="width: 100%"
+        height="350px"
+        :data="chartData"
+        :data-empty="dataEmpty"
+        :extend="chartExtend"
+        :legend="legend"
+        :data-zoom="dataZoom"
+      ></ve-histogram>
+    </el-card>
+
+    <el-card>
+      <!-- <headers title="分部数据" :hidenOrgan="true" /> -->
+      <el-button
+        type="primary"
+        @click="exportQuestion"
+        style="margin-top: 16px;"
+        v-permission="'export/now/cloudDate'"
+        >导出</el-button
+      >
+      <div class="tableWrap">
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+          @sort-change="sortChang"
+          :default-sort="{
+            prop: 'cloudStudyUseStudentDuty',
+            order: 'descending'
+          }"
+          sortable="custom"
+        >
+          <el-table-column
+            align="center"
+            prop="organId"
+            label="分部编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="organName"
+            label="分部名称"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="totalStudentNum"
+            label="在读人数"
+          >
+            <!-- <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>学员总数</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">
+                    乐团在读学员+有剩余VIP课或网管课学员去重之和
+                  </div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      top: 2px;
+                      position: relative;
+                    "
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template> -->
+          </el-table-column>
+          <!-- <el-table-column
+            align="center"
+            prop="effectiveStudentNum"
+            label="有效学员数"
+          >
+          </el-table-column> -->
+          <el-table-column
+            align="center"
+            prop="vipStudentNum"
+            label="生效待激活总人数"
+          >
+          </el-table-column>
+
+          <!-- <el-table-column
+            align="center"
+            prop="vipStudentRate"
+            label="会员占比"
+          >
+            <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>会员人数占比</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">
+                    会员总人数/有效学员数
+                  </div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style=" font-size: 18px;color: #f56c6c;top: 2px;position: relative;"
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template>
+            <template slot-scope="scope">
+              <div>
+                {{ numeral(scope.row.vipStudentRate || 0).format("0.00") }}%
+              </div>
+            </template>
+          </el-table-column> -->
+
+          <el-table-column
+            align="center"
+            prop="effectiveVipStudentNum"
+            label="生效会员"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="waitActivateVipStudentNum"
+            label="待激活会员"
+          ></el-table-column>
+
+          <el-table-column align="center" prop="buyRate" label="覆盖率">
+            <template slot-scope="scope">
+              {{ numeral(scope.row.buyRate || 0).format("0.00") }}%
+            </template>
+          </el-table-column>
+
+          <el-table-column align="center" prop="againBuyRate" label="复购率">
+            <template slot-scope="scope">
+              {{ numeral(scope.row.againBuyRate || 0).format("0.00") }}%
+            </template>
+          </el-table-column>
+
+          <el-table-column
+            align="center"
+            prop="activeStudentNum"
+            label="活跃会员"
+          >
+            <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>近一月活跃人数</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">
+                    过去四周内有三周及以上每周训练时长超过60分钟为活跃学员
+                  </div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      top: 2px;
+                      position: relative;
+                    "
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template>
+          </el-table-column>
+
+          <el-table-column
+            align="center"
+            prop="cloudStudyTodayUseStudentNum"
+            label="今日使用人数"
+          ></el-table-column>
+        </el-table>
+        <!-- <pagination
+          :autoScroll="false"
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        /> -->
+      </div>
+    </el-card>
+  </div>
+</template>
+<script>
+// import ExportChiose from "@/components/Export-chiose";
+import pagination from "@/components/Pagination/index";
+import { getOrganMemberList } from "../api";
+import "echarts/lib/component/dataZoom";
+import histogram from "v-charts/lib/histogram.common";
+import { Export } from "@/utils/downLoadFile";
+import headers from "./modals/headers.vue";
+import countTo from "vue-count-to";
+import { descs, titles } from "../constant";
+import { getCloudStudyStudentOverView } from "../api";
+import numeral from "numeral";
+import qs from "qs";
+export default {
+  props: ["data"],
+  components: {
+    headers,
+    pagination,
+    "ve-histogram": histogram,
+    countTo
+  },
+  data() {
+    return {
+      tableList: [],
+      organId: "",
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      searchList: {
+        cloudStudyUseStudentDuty: "DESC"
+      },
+      tenantId: "",
+      dataList: {},
+      active: ""
+    };
+  },
+  mounted() {
+    this.tenantId = this.$helpers.tenantId;
+    this.getList();
+  },
+  methods: {
+    exportQuestion() {
+      Export(
+        this,
+        {
+          url: "/api-web/export/now",
+          fileName: "云练习数据汇总.xls",
+          method: "post",
+          params: { exportEnum: "CLOUD_STUDY_STUDENT_OVER_VIEW" }
+        },
+        "您确定导出云练习数据汇总?"
+      );
+    },
+    async getList() {
+      /**
+       * try {
+      const res = await getCloudStudyStudentOverView();
+      this.dataList = res.data;
+    } catch (e) {
+      console.log(e);
+    }
+       */
+      try {
+        const arr = [
+          36,
+          39,
+          41,
+          42,
+          43,
+          44,
+          45,
+          46,
+          47,
+          48,
+          49,
+          50,
+          52,
+          54,
+          56
+        ];
+        const res = await getCloudStudyStudentOverView({
+          page: 1,
+          rows: 10,
+          ...this.searchList,
+          organIds: this.organId
+        });
+        this.tableList = [];
+        //  res.data.forEach(ele => {
+        //    if(arr.indexOf (ele.organId) == -1){
+        //      this.tableList.push(ele)
+        //    }
+        //  });
+        this.tableList = res.data.list;
+        console.log(this.tableList, "tableList");
+        // this.rules.total = res.data.list?.total;
+        this.dataList = res.data?.overView || {};
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    sortChang(val) {
+      const dates = {
+        ascending: "ASC",
+        descending: "DESC"
+      };
+      this.searchList = {};
+      if (val.prop && val.order) {
+        this.searchList[val.prop] = dates[val.order];
+      }
+      this.rules.page = 1;
+      this.getList();
+    },
+    gotoDetail(row) {
+      // 跳转到分部数据详情 row.organId
+      this.$router.push({
+        name: "organDateDetail",
+        params: { organId: row.organId }
+      });
+    },
+    changeOrgan(val) {
+      this.organId = val;
+      this.rules.page = 1;
+      this.getList();
+    },
+    // organDateExport() {
+    //   let params = { ...this.searchList, organIds: this.organId };
+    //   Export(
+    //     this,
+    //     {
+    //       url: "/api-web/export/organStudentOverView",
+    //       fileName: "分部云练习数据.xls",
+    //       method: "post",
+    //       params: qs.stringify(params)
+    //     },
+    //     "您确定导出分部云练习数据列表?"
+    //   );
+    // },
+
+    gotoAll() {
+      this.$router.push({
+        name: "organRankDetail"
+      });
+    },
+    numeral(val) {
+      return numeral(val);
+    }
+  },
+  computed: {
+    items() {
+      let obj = {};
+      //        "eVipStudentNum",
+      let arr = [
+        "totalStudentNum",
+        "vipStudentNum",
+        // "vipStudentRate",
+        "effectiveVipStudentNum",
+        "waitActivateVipStudentNum",
+        "buyRate",
+        "againBuyRate",
+        // "effectiveStudentNum",
+        "cloudStudyLivelyStudentNum",
+        // "newCloudStudyStudentNum",
+        // "cloudStudyUseStudentNum",
+        "cloudStudyTodayUseStudentNum"
+      ];
+      arr.forEach(str => {
+        if (this.dataList[str] + "") {
+          obj[str] = {
+            title: titles[str],
+            percent: this.dataList[str],
+            desc: descs[str]
+          };
+        }
+      });
+
+      return obj;
+    },
+    legend() {
+      return {
+        left: "10px"
+      };
+    },
+    chartData() {
+      const temp = {
+        totalStudentNum: "在读人数",
+        vipStudentNum: "会员人数",
+        effectiveVipStudentNum: "生效会员",
+        waitActivateVipStudentNum: "待激活",
+        activeStudentNum: "近一月活跃人数",
+        cloudStudyTodayUseStudentNum: "今日使用人数"
+      };
+      const values = Object.values(this.tableList);
+
+      const months = {};
+      for (const key in temp) {
+        for (const item of values) {
+          if (!months[item.organId]) {
+            months[item.organId] = {
+              分部: item.organName
+            };
+          }
+          months[item.organId][temp[key]] = item[key] || 0;
+        }
+      }
+      console.log(months, "months");
+      return {
+        columns: [
+          "分部",
+          "在读人数",
+          "会员人数",
+          "生效会员",
+          "待激活",
+          "近一月活跃人数",
+          "今日使用人数"
+        ],
+        rows: Object.values(months)
+      };
+    },
+    chartExtend() {
+      return {
+        yAxis: {
+          //纵轴标尺固定
+          minInterval: 1,
+          type: "value",
+          scale: true,
+          min: 0,
+          axisLabel: {
+            formatter: "{value}人"
+          }
+        },
+        series: {
+          type: "bar",
+          smooth: false
+        },
+        tooltip: {
+          axisPointer: {
+            type: "shadow",
+            shadowStyle: {
+              color: "rgba(150,150,150,0.2)"
+            }
+          },
+          formatter: item => {
+            return [
+              item[0].axisValueLabel,
+              ...item.map(d => {
+                return `<br/>${d.marker}${d.seriesName}: ${d.value}人`;
+              })
+            ].join("");
+          }
+        }
+      };
+    },
+    dataZoom() {
+      return [
+        {
+          show: true,
+          type: "slider",
+          start: 0,
+          end: 30,
+          filterMode: "empty",
+          zoomLock: true,
+          handleSize: 0
+        }
+      ];
+    },
+    dataEmpty() {
+      return !this.chartData.rows.length;
+    },
+    exporyun() {
+      return {
+        organId: this.organId
+      };
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-card__body {
+  padding-top: 0 !important;
+}
+.titleCell {
+  display: inline-block;
+}
+.tableWrap {
+  margin-top: 20px;
+}
+.btnList {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+}
+</style>

+ 0 - 1
src/views/resetTeaming/modals/review-detail.vue

@@ -437,7 +437,6 @@
       <el-table-column prop="refundAmount" label="回款金额"> </el-table-column>
       <el-table-column prop="refundDate" label="回款状态">
         <template slot-scope="scope">
-
           <div
             v-if="
               calender.status == 'NO' ||

+ 25 - 26
src/views/teamDetail/componentCourse/studentWork.vue

@@ -125,7 +125,6 @@
             :delete-instance-on-destroy="false"
             :cleanup-styles-on-destroy="false"
           >
-
             <swiper-slide
               class="swiper-no-swiping"
               v-for="(item, index) in activeRow.urlList"
@@ -144,13 +143,13 @@
             </swiper-slide>
             <div class="swiper-pagination" slot="pagination"></div>
             <div
-            v-if="activeRow.urlList.length>1"
+              v-if="activeRow.urlList.length > 1"
               class="swiper-button-prev swiper-button-white"
               @click="prev"
               slot="button-prev"
             ></div>
             <div
-              v-if="activeRow.urlList.length>1"
+              v-if="activeRow.urlList.length > 1"
               class="swiper-button-next swiper-button-white"
               @click="next"
               slot="button-next"
@@ -217,7 +216,7 @@ import pagination from "@/components/Pagination/index";
 import {
   findStudentCourseHomeworks,
   sumStudentAttendance,
-  getCourseScheduleHomework,
+  getCourseScheduleHomework
 } from "@/api/buildTeam";
 import { findStudentHomeworkComments } from "@/api/operateManager";
 import messageBox from "./message-box";
@@ -227,10 +226,10 @@ export default {
     pagination,
     Swiper,
     SwiperSlide,
-    messageBox,
+    messageBox
   },
   directives: {
-    swiper: directive,
+    swiper: directive
   },
   data() {
     return {
@@ -239,7 +238,7 @@ export default {
         // 分页规则
         limit: 10, // 限制显示条数
         page: 1, // 当前页
-        total: 0, // 总条数
+        total: 0 // 总条数
       },
       workVisible: false,
       repliedVisible: false,
@@ -262,26 +261,26 @@ export default {
         pagination: ".swiper-pagination",
         navigation: {
           nextEl: ".swiper-button-next",
-          prevEl: ".swiper-button-prev",
+          prevEl: ".swiper-button-prev"
         },
         on: {
-          slideChange: (val) => {
+          slideChange: val => {
             // console.log("掉用slideChange");
             this.activeIndex = val.realIndex;
-          },
-        },
+          }
+        }
 
         // Some Swiper option/callback...
       },
       comUrl: "",
       comVisible: false,
-      activeCommit: [],
+      activeCommit: []
     };
   },
   computed: {
     swiper() {
       return this.$refs.mySwiper.$swiper;
-    },
+    }
   },
   mounted() {
     this.init();
@@ -292,7 +291,7 @@ export default {
   methods: {
     init() {
       sumStudentAttendance({ courseScheduleId: this.courseScheduleId }).then(
-        (res) => {
+        res => {
           if (res.code == 200) {
             this.studentNum = res.data.studentNum;
             this.homeworkStudentNum = res.data.homeworkStudentNum;
@@ -305,8 +304,8 @@ export default {
       //
 
       getCourseScheduleHomework({
-        courseScheduleId: this.courseScheduleId,
-      }).then((res) => {
+        courseScheduleId: this.courseScheduleId
+      }).then(res => {
         if (res.code == 200) {
           if (res.data) {
             this.content = res.data.content;
@@ -322,14 +321,14 @@ export default {
       findStudentCourseHomeworks({
         search: this.courseScheduleId,
         rows: this.rules.limit,
-        page: this.rules.page,
-      }).then((res) => {
+        page: this.rules.page
+      }).then(res => {
         if (res.code == 200) {
           this.rules.total = res.data.total;
-          this.tableList = res.data.rows.map((item) => {
+          this.tableList = res.data.rows.map(item => {
             item.urlList = [];
             if (item.url) {
-              item.url.split(",").forEach((url) => {
+              item.url.split(",").forEach(url => {
                 if (url) {
                   item.urlList.push(url);
                 }
@@ -344,8 +343,8 @@ export default {
       this.activeRow = row;
       findStudentHomeworkComments({
         studentCourseHomeworkId: row.studentCourseHomeworkId,
-        rows: 9999,
-      }).then((res) => {
+        rows: 9999
+      }).then(res => {
         if (res.code == 200) {
           this.activeCommit = res.data.rows;
           this.workVisible = true;
@@ -361,7 +360,7 @@ export default {
     prev(val) {
       this.$nextTick(() => {
         // this.swiper.slidePrev();
-          this.$refs.mySwiper.$swiper.slidePrev();
+        this.$refs.mySwiper.$swiper.slidePrev();
       });
     },
     next(val) {
@@ -378,15 +377,15 @@ export default {
     openAideo(src) {
       this.comUrl = src;
       this.comVisible = true;
-    },
+    }
   },
   watch: {
     courseScheduleId(val) {
       if (val) {
         this.init();
       }
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

Some files were not shown because too many files changed in this diff