Bladeren bron

Merge branch 'online' into permission_small

lex-xin 5 jaren geleden
bovenliggende
commit
bb9bbfb9b0
100 gewijzigde bestanden met toevoegingen van 1618 en 482 verwijderingen
  1. 0 0
      dist/index.html
  2. 1 1
      dist/static/css/chunk-154e0afa.a1a0075a.css
  3. 0 0
      dist/static/css/chunk-2089a2c3.579c1001.css
  4. 1 0
      dist/static/css/chunk-249b0540.54382e36.css
  5. 1 1
      dist/static/css/chunk-32055b84.98e680df.css
  6. 1 0
      dist/static/css/chunk-3f6ea1aa.641b676e.css
  7. 1 0
      dist/static/css/chunk-5a11dfa0.a49193ed.css
  8. 0 0
      dist/static/css/chunk-5ac9820a.82c5e788.css
  9. 0 1
      dist/static/css/chunk-65fcc06b.c5202c43.css
  10. 1 1
      dist/static/css/chunk-6ebd057c.a168b7e4.css
  11. 0 0
      dist/static/css/chunk-6ed4f40c.7738c362.css
  12. 0 0
      dist/static/css/chunk-79260167.b249b97c.css
  13. 1 0
      dist/static/css/chunk-7fb8a826.a68cdb57.css
  14. 0 1
      dist/static/css/chunk-9109a926.86030ee9.css
  15. 1 1
      dist/static/css/chunk-9ec07396.93e30e87.css
  16. 0 0
      dist/static/js/app.82af74cf.js
  17. 0 0
      dist/static/js/app.9b77047d.js
  18. 0 0
      dist/static/js/chunk-01894b84.3c7179e8.js
  19. 0 0
      dist/static/js/chunk-01894b84.c6dc2ec9.js
  20. 0 0
      dist/static/js/chunk-07c3ef70.8737ef5a.js
  21. 0 0
      dist/static/js/chunk-07c3ef70.97682104.js
  22. 0 0
      dist/static/js/chunk-09753c97.695808d5.js
  23. 0 0
      dist/static/js/chunk-09753c97.92b6b81c.js
  24. 0 0
      dist/static/js/chunk-154e0afa.22140d96.js
  25. 0 0
      dist/static/js/chunk-2089a2c3.bb8a9f1b.js
  26. 0 0
      dist/static/js/chunk-249b0540.73c24b60.js
  27. 0 0
      dist/static/js/chunk-2d0e95d2.7958ea20.js
  28. 0 0
      dist/static/js/chunk-32055b84.b219ab8d.js
  29. 0 0
      dist/static/js/chunk-3e119562.1ee6490c.js
  30. 0 0
      dist/static/js/chunk-3e119562.7bd0b295.js
  31. 0 0
      dist/static/js/chunk-3e3440eb.14ecba6f.js
  32. 0 0
      dist/static/js/chunk-3e3440eb.bd032c0f.js
  33. 0 0
      dist/static/js/chunk-3f6ea1aa.4254d47f.js
  34. 0 0
      dist/static/js/chunk-40e665d1.36914cda.js
  35. 0 0
      dist/static/js/chunk-419ce36c.80a2ac9c.js
  36. 0 0
      dist/static/js/chunk-419ce36c.92c98680.js
  37. 0 0
      dist/static/js/chunk-43645682.91b10886.js
  38. 0 0
      dist/static/js/chunk-463f4992.9a293563.js
  39. 0 0
      dist/static/js/chunk-47d75f70.6cf8ec1e.js
  40. 0 0
      dist/static/js/chunk-5a11dfa0.535ad7fd.js
  41. 0 0
      dist/static/js/chunk-5ac9820a.ba8e61d8.js
  42. 0 0
      dist/static/js/chunk-5dd9c9c4.e064d479.js
  43. 0 0
      dist/static/js/chunk-5f0549de.a1181f5a.js
  44. 0 0
      dist/static/js/chunk-5f0549de.bede54cd.js
  45. 0 0
      dist/static/js/chunk-60e66284.e3a2736c.js
  46. 0 0
      dist/static/js/chunk-6181ddae.71a49dc2.js
  47. 0 0
      dist/static/js/chunk-64363d89.9a8b52a0.js
  48. 0 0
      dist/static/js/chunk-6562cc02.83abfbbd.js
  49. 0 0
      dist/static/js/chunk-6562cc02.a9479dac.js
  50. 0 0
      dist/static/js/chunk-65fcc06b.acffe16f.js
  51. 0 0
      dist/static/js/chunk-68640c4e.b7a71f0e.js
  52. 0 0
      dist/static/js/chunk-68640c4e.d42d984c.js
  53. 0 0
      dist/static/js/chunk-69b02310.441bcf8e.js
  54. 0 0
      dist/static/js/chunk-69b02310.6cc7a42b.js
  55. 0 0
      dist/static/js/chunk-6ebd057c.5240e9aa.js
  56. 0 0
      dist/static/js/chunk-6ed4f40c.ba2a525f.js
  57. 0 0
      dist/static/js/chunk-70fa4dab.60e12729.js
  58. 0 0
      dist/static/js/chunk-70fa4dab.f1e218c4.js
  59. 0 0
      dist/static/js/chunk-7730eaf5.4dd536fe.js
  60. 0 0
      dist/static/js/chunk-7730eaf5.d67b78c2.js
  61. 0 0
      dist/static/js/chunk-79260167.c327f4b9.js
  62. 0 0
      dist/static/js/chunk-7c4cbc6e.9b75ecb5.js
  63. 0 0
      dist/static/js/chunk-7fb8a826.0c888ab8.js
  64. 0 0
      dist/static/js/chunk-9109a926.8151cb2f.js
  65. 0 0
      dist/static/js/chunk-98ae4e4a.3ea563af.js
  66. 0 0
      dist/static/js/chunk-98ae4e4a.84737bec.js
  67. 0 0
      dist/static/js/chunk-9ec07396.0579deb7.js
  68. 0 0
      dist/static/js/chunk-b1e176fc.8dafaa5e.js
  69. 0 0
      dist/static/js/chunk-bc672cf4.5b8b5033.js
  70. 0 0
      dist/static/js/chunk-bc672cf4.bfbc7498.js
  71. 0 0
      dist/static/js/chunk-d3f0a92e.0178ce99.js
  72. 0 0
      dist/static/js/chunk-d3f0a92e.14e4f317.js
  73. 0 0
      dist/static/js/chunk-de5c2e9a.0f901bf6.js
  74. 0 0
      dist/static/js/chunk-de5c2e9a.6a0195da.js
  75. 0 0
      dist/static/js/chunk-edcf4054.b8d9f2ef.js
  76. 9 0
      src/api/appTenant.js
  77. 10 0
      src/api/studentManager.js
  78. 45 0
      src/api/teacherManager.js
  79. 2 0
      src/router/index.js
  80. 23 1
      src/utils/searchArray.js
  81. 12 0
      src/utils/vueFilter.js
  82. 61 1
      src/views/accompanyManager/accompanyList.vue
  83. 5 5
      src/views/afterSchoolManager/afterSchoolList.vue
  84. 102 24
      src/views/afterSchoolManager/afterWorkList.vue
  85. 117 0
      src/views/app/suggestion.vue
  86. 77 60
      src/views/businessManager/orderManager/incomeOut.vue
  87. 247 0
      src/views/studentManager/components/studentOutList.vue
  88. 108 118
      src/views/studentManager/components/studentRecord.vue
  89. 60 50
      src/views/studentManager/index.vue
  90. 1 1
      src/views/studentManager/studentList.vue
  91. 149 0
      src/views/teacherManager/teacherDetail/components/outCourseList.vue
  92. 12 0
      src/views/teacherManager/teacherDetail/components/teacherInfo.vue
  93. 87 99
      src/views/teacherManager/teacherDetail/components/teacherRecord.vue
  94. 270 0
      src/views/teacherManager/teacherDetail/components/timerList.vue
  95. 15 5
      src/views/teacherManager/teacherDetail/index.vue
  96. 9 1
      src/views/teacherManager/teacherList.vue
  97. 21 17
      src/views/teacherManager/teacherOperation/components/teacherOperation.vue
  98. 86 89
      src/views/teamDetail/componentCourse/studentWork.vue
  99. 23 2
      src/views/timedTask/index.vue
  100. 59 3
      src/views/vipClass/vipList.vue

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


+ 1 - 1
dist/static/css/chunk-5dd9c9c4.688c8c81.css → dist/static/css/chunk-154e0afa.a1a0075a.css

@@ -1 +1 @@
-.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.inputStyle[data-v-29a2e64d]{width:100px;text-align:center}.title[data-v-0eb05fc4]{margin-bottom:20px}.amap-demo[data-v-0eb05fc4]{height:300px}.inputStyle[data-v-63cd9bec]{width:100px;text-align:center}.work[data-v-63cd9bec]{margin-bottom:30px;font-size:16px}.visible[data-v-f06fddf2]{visibility:hidden}.cl-container .topFrom[data-v-f06fddf2]{margin:20px 30px 0}.cl-container .topFrom .classlist[data-v-f06fddf2]{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:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cl-container .topFrom .classlist ul li[data-v-f06fddf2]{list-style:none}.cl-container .searchForm[data-v-f06fddf2]{margin:0 30px}.btnWraps[data-v-f06fddf2]{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:start;-ms-flex-pack:start;justify-content:flex-start}.btnWraps div[data-v-f06fddf2]{margin-right:20px}.inputStyle[data-v-f06fddf2]{width:180px}.red[data-v-f06fddf2]{color:red}.exportBtn[data-v-f06fddf2]{background:#13817a}
+.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.inputStyle[data-v-29a2e64d]{width:100px;text-align:center}.title[data-v-0eb05fc4]{margin-bottom:20px}.amap-demo[data-v-0eb05fc4]{height:300px}.inputStyle[data-v-2976de12]{width:100px;text-align:center}.work[data-v-2976de12]{margin-bottom:30px;font-size:16px}.visible[data-v-f06fddf2]{visibility:hidden}.cl-container .topFrom[data-v-f06fddf2]{margin:20px 30px 0}.cl-container .topFrom .classlist[data-v-f06fddf2]{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:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cl-container .topFrom .classlist ul li[data-v-f06fddf2]{list-style:none}.cl-container .searchForm[data-v-f06fddf2]{margin:0 30px}.btnWraps[data-v-f06fddf2]{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:start;-ms-flex-pack:start;justify-content:flex-start}.btnWraps div[data-v-f06fddf2]{margin-right:20px}.inputStyle[data-v-f06fddf2]{width:180px}.red[data-v-f06fddf2]{color:red}.exportBtn[data-v-f06fddf2]{background:#13817a}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-2089a2c3.579c1001.css


+ 1 - 0
dist/static/css/chunk-249b0540.54382e36.css

@@ -0,0 +1 @@
+.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.newBand[data-v-ff14ea88]{display:inline-block;margin-right:10px}.right-code .title[data-v-ff14ea88]{font-size:18px;text-align:center;padding-bottom:8px}[data-v-ff14ea88] .studentInfo .el-dialog__body{padding-top:0;padding-bottom:0}[data-v-ff14ea88] .studentInfo .multiple.el-select{width:100%!important}

+ 1 - 1
dist/static/css/chunk-43645682.9731df68.css → dist/static/css/chunk-32055b84.98e680df.css

@@ -1 +1 @@
-.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.schoolCell[data-v-13f37de1]{width:400px;color:#333;background-color:#f5f7fa;border-color:#e4e7ed;height:40px;line-height:40px;outline:0;padding:0 15px;border-radius:4px;border:1px solid #dcdfe6;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}[data-v-13f37de1] .el-textarea.is-disabled .el-textarea__inner{color:#333}.schoolCell[data-v-f9a6591e]{width:400px;color:#333;background-color:#f5f7fa;border-color:#e4e7ed;height:40px;line-height:40px;outline:0;padding:0 15px;border-radius:4px;border:1px solid #dcdfe6;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}[data-v-f9a6591e] .el-textarea.is-disabled .el-textarea__inner{color:#333}
+.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.schoolCell[data-v-5d68dcaa]{width:400px;color:#333;background-color:#f5f7fa;border-color:#e4e7ed;height:40px;line-height:40px;outline:0;padding:0 15px;border-radius:4px;border:1px solid #dcdfe6;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}[data-v-5d68dcaa] .el-textarea.is-disabled .el-textarea__inner{color:#333}.schoolCell[data-v-583131ac]{width:400px;color:#333;background-color:#f5f7fa;border-color:#e4e7ed;height:40px;line-height:40px;outline:0;padding:0 15px;border-radius:4px;border:1px solid #dcdfe6;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}[data-v-583131ac] .el-textarea.is-disabled .el-textarea__inner{color:#333}

+ 1 - 0
dist/static/css/chunk-3f6ea1aa.641b676e.css

@@ -0,0 +1 @@
+.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}

+ 1 - 0
dist/static/css/chunk-5a11dfa0.a49193ed.css

@@ -0,0 +1 @@
+.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}[data-v-3a7d76ab] .el-button--primary,[data-v-3a7d76ab] .el-button--primary:active,[data-v-3a7d76ab] .el-button--primary:focus,[data-v-3a7d76ab] .el-button--primary:hover{background:#14928a;border-color:#14928a;color:#fff}[data-v-3a7d76ab] .el-table .cell{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-line-clamp:3;-webkit-box-orient:vertical}[data-v-3a7d76ab] .el-date-editor.el-input{width:100%!important}[data-v-3a7d76ab] .el-select{width:98%!important}[data-v-3a7d76ab] .el-table{display:inline-block}

+ 0 - 0
dist/static/css/chunk-3e4450e0.421e0c86.css → dist/static/css/chunk-5ac9820a.82c5e788.css


+ 0 - 1
dist/static/css/chunk-65fcc06b.c5202c43.css

@@ -1 +0,0 @@
-.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.newBand[data-v-3226c3ec]{display:inline-block;margin-right:10px}.right-code .title[data-v-3226c3ec]{font-size:18px;text-align:center;padding-bottom:8px}[data-v-3226c3ec] .studentInfo .el-dialog__body{padding-top:0;padding-bottom:0}[data-v-3226c3ec] .studentInfo .multiple.el-select{width:100%!important}

+ 1 - 1
dist/static/css/chunk-7c4cbc6e.709e1c7f.css → dist/static/css/chunk-6ebd057c.a168b7e4.css

@@ -1 +1 @@
-.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.schoolCell[data-v-f9a6591e]{width:400px;color:#333;background-color:#f5f7fa;border-color:#e4e7ed;height:40px;line-height:40px;outline:0;padding:0 15px;border-radius:4px;border:1px solid #dcdfe6;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}[data-v-f9a6591e] .el-textarea.is-disabled .el-textarea__inner{color:#333}
+.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.schoolCell[data-v-583131ac]{width:400px;color:#333;background-color:#f5f7fa;border-color:#e4e7ed;height:40px;line-height:40px;outline:0;padding:0 15px;border-radius:4px;border:1px solid #dcdfe6;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}[data-v-583131ac] .el-textarea.is-disabled .el-textarea__inner{color:#333}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-6ed4f40c.7738c362.css


+ 0 - 0
dist/static/css/chunk-dea0328a.b0eb5d96.css → dist/static/css/chunk-79260167.b249b97c.css


+ 1 - 0
dist/static/css/chunk-7fb8a826.a68cdb57.css

@@ -0,0 +1 @@
+.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.tr-cotainer{margin-top:20px}.teacherInfo .infoWrap[data-v-e8f005a4]{margin-top:20px;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:start;-ms-flex-pack:start;justify-content:flex-start}.teacherInfo .infoWrap .left[data-v-e8f005a4]{max-width:1000px;width:100%}.teacherInfo .infoWrap .left h4[data-v-e8f005a4]{margin-bottom:20px}.teacherInfo .infoWrap .right[data-v-e8f005a4]{margin-left:100px}.teacherInfo .infoWrap .right .teacherIcon[data-v-e8f005a4]{width:150px;height:150px;border-radius:50%;overflow:hidden}.teacherInfo .infoWrap .right .teacherIcon img[data-v-e8f005a4]{width:150px;height:150px}[data-v-e8f005a4] .el-form-item{width:100%}[data-v-e8f005a4] .el-date-editor.el-input,[data-v-e8f005a4] .el-select{width:100%!important}[data-v-e8f005a4] .el-form-item__content{font-size:14px!important;margin-right:5%}.wrap[data-v-723fb00b]{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:start;-ms-flex-pack:start;justify-content:flex-start}[data-v-723fb00b] .el-textarea__inner{width:254px}.courseInfo h4{margin-bottom:20px}.courseInfo .tableMargin{margin-top:20px}

+ 0 - 1
dist/static/css/chunk-9109a926.86030ee9.css

@@ -1 +0,0 @@
-.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.tr-cotainer{margin-top:20px}.teacherInfo .infoWrap[data-v-48910c02]{margin-top:20px;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:start;-ms-flex-pack:start;justify-content:flex-start}.teacherInfo .infoWrap .left[data-v-48910c02]{max-width:1000px;width:100%}.teacherInfo .infoWrap .left h4[data-v-48910c02]{margin-bottom:20px}.teacherInfo .infoWrap .right[data-v-48910c02]{margin-left:100px}.teacherInfo .infoWrap .right .teacherIcon[data-v-48910c02]{width:150px;height:150px;border-radius:50%;overflow:hidden}.teacherInfo .infoWrap .right .teacherIcon img[data-v-48910c02]{width:150px;height:150px}[data-v-48910c02] .el-form-item{width:100%}[data-v-48910c02] .el-date-editor.el-input,[data-v-48910c02] .el-select{width:100%!important}[data-v-48910c02] .el-form-item__content{font-size:14px!important;margin-right:5%}.courseInfo h4{margin-bottom:20px}.courseInfo .tableMargin{margin-top:20px}

+ 1 - 1
dist/static/css/chunk-64363d89.5499b2c3.css → dist/static/css/chunk-9ec07396.93e30e87.css

@@ -1 +1 @@
-.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.m-container[data-v-d165bdda]{-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.newBand[data-v-d165bdda]{display:inline-block}
+.pagination-container[data-v-31cb099a]{background:#fff;padding:32px 16px;width:100%;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:center;-ms-flex-pack:center;justify-content:center}.pagination-container.hidden[data-v-31cb099a]{display:none}.m-container[data-v-30ca67fe]{-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff}.newBand[data-v-30ca67fe]{display:inline-block}

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


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-01894b84.3c7179e8.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-01894b84.c6dc2ec9.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-07c3ef70.8737ef5a.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-07c3ef70.97682104.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-09753c97.695808d5.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-09753c97.92b6b81c.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-154e0afa.22140d96.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-2089a2c3.bb8a9f1b.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-249b0540.73c24b60.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-2d0e95d2.7958ea20.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-32055b84.b219ab8d.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3e119562.1ee6490c.js


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3e3440eb.14ecba6f.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3e3440eb.bd032c0f.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3f6ea1aa.4254d47f.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-40e665d1.36914cda.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-419ce36c.80a2ac9c.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-419ce36c.92c98680.js


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-463f4992.9a293563.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-47d75f70.6cf8ec1e.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-5a11dfa0.535ad7fd.js


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


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


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


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-60e66284.e3a2736c.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-6181ddae.71a49dc2.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-64363d89.9a8b52a0.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-6562cc02.83abfbbd.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-6562cc02.a9479dac.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-65fcc06b.acffe16f.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-68640c4e.b7a71f0e.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-68640c4e.d42d984c.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-69b02310.441bcf8e.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-69b02310.6cc7a42b.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-6ebd057c.5240e9aa.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-6ed4f40c.ba2a525f.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-70fa4dab.60e12729.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-70fa4dab.f1e218c4.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7730eaf5.4dd536fe.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7730eaf5.d67b78c2.js


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7c4cbc6e.9b75ecb5.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7fb8a826.0c888ab8.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-9109a926.8151cb2f.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-98ae4e4a.3ea563af.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-98ae4e4a.84737bec.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-9ec07396.0579deb7.js


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


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


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-d3f0a92e.0178ce99.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-d3f0a92e.14e4f317.js


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-de5c2e9a.6a0195da.js


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


+ 9 - 0
src/api/appTenant.js

@@ -92,4 +92,13 @@ export function helpCenterContentDelete(data) {
 }
 
 
+// 意见反馈管理
+export function sysSuggestionList(data) {
+  return request({
+    url: '/api-web/sysSuggestion/queryPage',
+    method: 'get',
+    params: data
+  })
+}
+
   

+ 10 - 0
src/api/studentManager.js

@@ -221,3 +221,13 @@ export function transferCourseBalanceToBalance (data) {
     data: qs.stringify(data)
   })
 }
+
+
+// 学生对外课 findStudentCourseGroupsWithWeb
+export function findStudentCourseGroupsWithWeb (data) {
+  return request({
+    url: api + `/coursesGroupController/findStudentCourseGroupsWithWeb`,
+    method: 'get',
+    params: data
+  })
+}

+ 45 - 0
src/api/teacherManager.js

@@ -196,4 +196,49 @@ export function PracticeGroupSalaryUpdate (data) {
     method: 'post',
      data
   })
+}
+
+// 获取老师时间列表
+export function queryTenantAccountList (data) {
+  return request({
+    url: api + '/sysTenantAccount/queryTenantAccountDetail',
+    method: 'get',
+    params: data
+  })
+}
+
+// 增加老师时间
+export function sysTenantAccountAddMinutes (data) {
+  return request({
+    url: api + '/sysTenantAccount/addMinutes',
+    method: 'post',
+    data:qs.stringify(data)
+  })
+}
+
+// 减少老师时间
+export function sysTenantAccountSubtractMinutes (data) {
+  return request({
+    url: api + '/sysTenantAccount/subtractMinutes',
+    method: 'post',
+    data:qs.stringify(data)
+  })
+}
+
+// 获取可用时间
+export function queryTenantAcGet (data) {
+  return request({
+    url: api + '/sysTenantAccount/get',
+    method: 'get',
+    params: data
+  })
+}
+
+// 老师对外课 findStudentCourseGroupsWithWeb
+export function findTeacherCourseGroupsWithWeb (data) {
+  return request({
+    url: api + `/coursesGroupController/findTeacherCourseGroupsWithWeb`,
+    method: 'get',
+    params: data
+  })
 }

+ 2 - 0
src/router/index.js

@@ -264,6 +264,8 @@ export const asyncRoutes = {
   entryActivities: () => import('@/views/app/entryActivities'),
   // 添加或修改
   entryOperation: () => import('@/views/app/entryOperation'),
+  // 意见反馈
+  suggestion: () => import('@/views/app/suggestion'),
   // 帮助分类
   helpCategory: () => import('@/views/helpCenter/helpCategory'),
   // 帮助内容

+ 23 - 1
src/utils/searchArray.js

@@ -93,6 +93,25 @@ const courseStatus = [
   { value: "UNDERWAY", label: "进行中" },
   { value: "OVER", label: "已结束" },
 ]
+const courseGroupStatus = [
+  { value: "NORMAL", label: "正常" },
+  { value: "LOCK", label: "锁定" },
+  { value: "FINISH", label: "结束" },
+  { value: "CANCEL", label: "取消" },
+]
+const commGroupStatus = [
+  { value: "NORMAL", label: "正常" },
+  { value: "FINISH", label: "结束" },
+  { value: "CANCEL", label: "取消" },
+]
+// 老师时间充值状态
+const teacherTimeStatus = [
+  { value: "RECHARGE", label: "充值" },
+  { value: "CONSUME", label: "建课" },
+  { value: "RETURN", label: "退课" },
+  { value: "MANUAL_ADD", label: "系统充值" },
+  { value: "MANUAL_SUB", label: "系统扣除" },
+]
 
 export {
   courseType,
@@ -104,5 +123,8 @@ export {
   dealStatus,
   musicGroupStatus,
   vipGroupStatus,
-  courseStatus
+  courseStatus,
+  teacherTimeStatus,
+  courseGroupStatus,
+  commGroupStatus
 }

+ 12 - 0
src/utils/vueFilter.js

@@ -412,4 +412,16 @@ Vue.filter('firstOrRenewFilter', value => {
     '1': "首次",
   }
   return template[value]
+})
+
+// 老师时间
+Vue.filter('transTypeFilter', value => {
+  let template = {
+    'RECHARGE': "充值",
+    'CONSUME': "建课",
+    'RETURN': "退课",
+    'MANUAL_ADD': "系统充值",
+    'MANUAL_SUB': "系统扣除",
+  }
+  return template[value]
 })

+ 61 - 1
src/views/accompanyManager/accompanyList.vue

@@ -3,7 +3,7 @@
     <!-- <h2>
       <div class="squrt"></div>网管课列表
     </h2> -->
-
+    <div class="newBand" v-permission="'export/practiceGroup'" @click="onStudentExport" style="width: 120px;">网管课续费提醒</div>
     <div class="m-core">
       <el-form :inline="true" class="searchForm" v-model.trim="searchForm">
         <!-- 状态 指导老师 活动方案-->
@@ -180,6 +180,9 @@ import {
   practiceGroupManage,
   cancelGroup
 } from "@/api/buildTeam";
+import axios from "axios";
+import { getToken } from "@/utils/auth";
+import load from '@/utils/loading'
 export default {
   components: { pagination },
   data() {
@@ -256,6 +259,63 @@ export default {
       };
       this.search();
     },
+    onStudentExport() {
+      // 导出VIP课
+      // let searchForm = this.searchForm;
+      let data = {
+        // teacherId: searchForm.teacherId || null,
+        // activityId: searchForm.activityId || null,
+        // organId: searchForm.orgin || null,
+        // status: searchForm.status || null,
+        // search: searchForm.search || null
+      };
+      let url = "/api-web/export/practiceGroup";
+      const options = {
+        method: "get",
+        headers: {
+          Authorization: getToken()
+        },
+        params: data,
+        url,
+        responseType: "blob"
+      };
+      this.$confirm("网管课续费提醒导出?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          load.startLoading()
+          axios(options).then(res => {
+            let blob = new Blob([res.data], {
+              // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
+              type: "application/vnd.ms-excel;charset=utf-8"
+              //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
+            });
+            
+            let text = (new Response(blob)).text()
+            text.then(res => {
+              // 判断是否报错
+              if(res.indexOf('code') != -1) {
+                let json = JSON.parse(res)
+                this.$message.error(json.msg)
+              } else {
+                let objectUrl = URL.createObjectURL(blob);
+                let link = document.createElement("a");
+                let fname = "网管课续费提醒" + new Date().getTime(); //下载文件的名字
+                link.href = objectUrl;
+                link.setAttribute("download", fname);
+                document.body.appendChild(link);
+                link.click();
+              }
+            })
+            load.endLoading();
+          }).catch(error => {
+            this.$message.error('导出数据失败,请连接管理员');
+            load.endLoading();
+          });
+        }).catch(() => {});
+    },
     getList() {
       let obj = {
         search: this.searchForm.search || null,

+ 5 - 5
src/views/afterSchoolManager/afterSchoolList.vue

@@ -23,10 +23,10 @@
             ></el-option>
           </el-select>
         </el-form-item>
-         <el-form-item prop="organId">
+         <el-form-item prop="organIdList">
           <el-select
             class="multiple"
-            v-model.trim="searchForm.organId"
+            v-model.trim="searchForm.organIdList"
             filterable
             clearable
             placeholder="请选择分部"
@@ -143,7 +143,7 @@ export default {
         search: null,
         timer: [],
         teacherId:null,
-        organId:null
+        organIdList:null
       },
       rules: {
         // 分页规则
@@ -222,7 +222,7 @@ export default {
          obj.rows= this.rules.limit,
       this.searchForm.teacherId?obj.teacherId = this.searchForm.teacherId:null;
       this.searchForm.search?obj.title = this.searchForm.search:null;
-      this.searchForm.organId?obj.organId = this.searchForm.organId:null;
+      this.searchForm.organIdList?obj.organIdList = this.searchForm.organIdList:null;
       queryPageList(obj).then(res => {
         if (res.code == 200) {
           this.tableList = res.data.rows;
@@ -239,7 +239,7 @@ export default {
         search: null,
         timer: [],
         teacherId:null,
-        organId:null
+        organIdList:null
       }
       this.search();
     },

+ 102 - 24
src/views/afterSchoolManager/afterWorkList.vue

@@ -16,7 +16,7 @@
         <el-form-item prop="organId">
           <el-select
             class="multiple"
-            v-model.trim="searchForm.organId"
+            v-model.trim="searchForm.organIdList"
             filterable
             clearable
             placeholder="请选择分部"
@@ -30,7 +30,6 @@
           </el-select>
         </el-form-item>
 
-
         <el-form-item>
           <el-select placeholder="是否提交" v-model="searchForm.status" clearable>
             <el-option label="是" value="1"></el-option>
@@ -49,20 +48,35 @@
             <el-option label="否" value="0"></el-option>
           </el-select>
         </el-form-item>
-                <el-form-item>
+        <br>
+        <el-form-item label="布置时间">
           <el-date-picker
             v-model.trim="searchForm.timer"
             style="width:400px;"
             type="daterange"
             value-format="yyyy-MM-dd"
             range-separator="至"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
+            start-placeholder="布置开始日期"
+            end-placeholder="布置结束日期"
+          ></el-date-picker>
+        </el-form-item>
+        <br>
+          <el-form-item label="截止时间">
+          <el-date-picker
+            v-model.trim="searchForm.expireDate"
+            style="width:400px;"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            range-separator="至"
+            start-placeholder="截止开始日期"
+            end-placeholder="截止结束日期"
           ></el-date-picker>
         </el-form-item>
+        
         <el-form-item>
           <el-button type="danger" @click="search">搜索</el-button>
           <el-button @click="onReSet" type="primary">重置</el-button>
+          <el-button @click="onExport" type="primary" v-permission="'export/extraExercisesReplys'" style=" background: #14928a; border:1px solid #14928a;">导出</el-button>
         </el-form-item>
       </el-form>
       <div class="tableWrap">
@@ -71,7 +85,8 @@
           :header-cell-style="{background:'#EDEEF0',color:'#444'}"
           :data="tableList"
         >
-          <el-table-column align="center" prop="createTime" label="布置时间"></el-table-column>
+          <el-table-column align="center" prop="createTime" label="布置时间" width="150"></el-table-column>
+          <el-table-column align="center" prop="expireDate" label="截止时间" width="150"></el-table-column>
           <el-table-column align="center" prop="title" label="训练标题">
             <template slot-scope="scope">
               <div>
@@ -81,7 +96,8 @@
               </div>
             </template>
           </el-table-column>
-           <el-table-column align="center" prop="organName" label="分部"></el-table-column>
+          <el-table-column align="center" prop="teacherName" label="老师"></el-table-column>
+          <el-table-column align="center" prop="organName" label="分部"></el-table-column>
           <el-table-column align="center" prop="createTime" label="学生姓名">
             <template slot-scope="scope">
               <div>
@@ -184,6 +200,8 @@ import {
   findStudentExtraExerciseDetail
 } from "@/api/afterSchool";
 import { getEmployeeOrgan } from "@/api/buildTeam";
+import axios from "axios";
+import { getToken } from "@/utils/auth";
 export default {
   props: ["id"],
   components: { pagination },
@@ -195,7 +213,8 @@ export default {
         status: null,
         isReplied: null,
         isView: null,
-        organId:null
+        organIdList: null,
+        expireDate:[]
       },
       rules: {
         // 分页规则
@@ -206,7 +225,7 @@ export default {
       },
       teacherList: [],
       tableList: [],
-      organList:[],
+      organList: [],
       visibleForm: {
         expiryDate: "啦啦啦啦",
         teacherName: "",
@@ -225,7 +244,7 @@ export default {
   created() {},
   //生命周期 - 挂载完成(可以访问DOM元素)
   mounted() {
-       getEmployeeOrgan().then(res => {
+    getEmployeeOrgan().then(res => {
       if (res.code == 200) {
         this.organList = res.data;
       }
@@ -259,11 +278,69 @@ export default {
     },
     getList() {
       // assignStartTime  assignEndTime page search teacherId title
-      let obj = {};
+      let obj = this.getDate();
+      extracurricularExercisesReply(obj).then(res => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows;
+          this.rules.total = res.data.total;
+        }
+      });
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    // 导出 
+    onExport(){
+       let url = "/api-web/export/extraExercisesReplys";
+      let obj = this.getDate()
+      const options = {
+        method: "get",
+        headers: {
+          Authorization: getToken()
+        },
+        url,
+        params: obj,
+        responseType: "blob"
+      };
+
+      this.$confirm("您确定导出列表?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          axios(options).then(res => {
+            let blob = new Blob([res.data], {
+              // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
+              type: "application/vnd.ms-excel;charset=utf-8"
+              // word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
+            });
+            let objectUrl = URL.createObjectURL(blob);
+            let link = document.createElement("a");
+             let nowTime = new Date()
+              let ymd = nowTime.getFullYear() + '' + (nowTime.getMonth() + 1) + '' + nowTime.getDate() + '' +
+                nowTime.getHours() +
+                '' + nowTime.getMinutes()
+            let fname =ymd+"课外训练(学员)";
+            link.href = objectUrl;
+            link.setAttribute("download", fname);
+            document.body.appendChild(link);
+            link.click();
+          });
+        })
+        .catch(() => {});
+    },
+    getDate(){
+       let obj = {};
       if (this.searchForm.timer && this.searchForm.timer.length > 0) {
         obj.submitStartTime = this.searchForm.timer[0];
         obj.submitEndTime = this.searchForm.timer[1];
       }
+      if(this.searchForm.expireDate && this.searchForm.expireDate.length>0){
+        obj.expireStartDate = this.searchForm.expireDate[0]
+         obj.expireEndDate = this.searchForm.expireDate[1]
+      }
       obj.page = this.rules.page;
       (obj.rows = this.rules.limit),
         this.searchForm.teacherId
@@ -271,22 +348,15 @@ export default {
           : null;
       this.searchForm.search ? (obj.search = this.searchForm.search) : null;
       this.searchForm.status ? (obj.status = this.searchForm.status) : null;
-      this.searchForm.isReplied ? (obj.isReplied = this.searchForm.isReplied) : null;
+      this.searchForm.isReplied
+        ? (obj.isReplied = this.searchForm.isReplied)
+        : null;
       this.searchForm.isView ? (obj.isView = this.searchForm.isView) : null;
       this.extracurricularExercisesId
         ? (obj.extracurricularExercisesId = this.extracurricularExercisesId)
         : null;
-        this.searchForm.organId?obj.organId = this.searchForm.organId:null;
-      extracurricularExercisesReply(obj).then(res => {
-        if (res.code == 200) {
-          this.tableList = res.data.rows;
-          this.rules.total = res.data.total;
-        }
-      });
-    },
-    search() {
-      this.rules.page = 1;
-      this.getList();
+      this.searchForm.organIdList ? (obj.organIdList = this.searchForm.organIdList) : null;
+      return obj
     },
     onReSet() {
       this.searchForm = {
@@ -295,7 +365,8 @@ export default {
         status: null,
         isReplied: null,
         isView: null,
-        organId:null
+        organId: null,
+        expireDate:[]
       };
       this.extracurricularExercisesId = null;
       this.getList();
@@ -324,6 +395,13 @@ export default {
       this.activeSrc = src;
       this.workVisible = true;
     }
+  },
+  watch:{
+    workVisible(val){
+      if(!val){
+        this.activeSrc = '';
+      }
+    }
   }
 };
 </script>

+ 117 - 0
src/views/app/suggestion.vue

@@ -0,0 +1,117 @@
+<template>
+  <div class='m-container'>
+    <h2><div class="squrt"></div>意见反馈管理</h2>
+    <div class="m-core">
+      <div class="tableWrap">
+        <el-table :data="dataList"
+                  :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+          
+          <el-table-column align="center" label="反馈时间" prop="createTime">
+          </el-table-column>
+          <!-- <el-table-column align="center" prop="name" label="标题"> -->
+          <!-- </el-table-column> -->
+          <el-table-column align="center" label="内容" prop="content">
+              <template slot-scope="scope">
+                <el-popover
+                    placement="top-start"
+                    width="300"
+                    trigger="hover"
+                    :content="scope.row.content">
+                    <span slot="reference">{{ scope.row.content }}</span>
+                </el-popover>
+                  <!-- <div :title="scope.row.content">{{ scope.row.content }}</div> -->
+              </template>
+          </el-table-column>
+          <el-table-column align="center" label="用户" prop="username"></el-table-column>
+          <el-table-column align="center" prop="mobileNo" label="邮箱或手机号">
+          </el-table-column>
+          <el-table-column align="center" label="客户端" prop="clientType"></el-table-column>
+          <!-- <el-table-column align="center"
+                           label="操作">
+            <template slot-scope="scope">
+              <el-button type="text" v-permission="'/entryOperationLook'" @click="onChargeOperation('look', scope.row)">查看</el-button>
+            </template>
+          </el-table-column> -->
+        </el-table>
+        <pagination :total="pageInfo.total"
+                    :page.sync="pageInfo.page"
+                    :limit.sync="pageInfo.limit"
+                    :page-sizes="pageInfo.page_size"
+                    @pagination="getList" />
+      </div>
+
+    </div>
+  </div>
+</template>
+<script>
+import pagination from '@/components/Pagination/index'
+import { sysSuggestionList } from '@/api/appTenant'
+export default {
+  components: { pagination },
+  name: 'chargesList',
+  data () {
+    return {
+      id: null,
+      dataList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    }
+  },
+  activated () {
+    this.getList()
+  },
+  mounted () {
+    this.getList()
+  },
+  methods: {
+    getList () {
+      let params = {
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page
+      }
+      sysSuggestionList(params).then(res => {
+        if (res.code == 200) {
+          this.dataList = res.data.rows
+          this.pageInfo.total = res.data.total
+        }
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+/deep/.el-button--primary {
+  background: #14928a;
+  border-color: #14928a;
+  color: #fff;
+  &:hover,
+  &:active,
+  &:focus {
+    background: #14928a;
+    border-color: #14928a;
+    color: #fff;
+  }
+}
+/deep/.el-table .cell {
+    display: -webkit-box;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    -webkit-line-clamp: 3;
+    -webkit-box-orient: vertical;
+}
+/deep/.el-date-editor.el-input {
+  width: 100% !important;
+}
+/deep/.el-select {
+  width: 98% !important;
+}
+
+/deep/.el-table {
+  display: inline-block;
+}
+</style>

+ 77 - 60
src/views/businessManager/orderManager/incomeOut.vue

@@ -11,6 +11,9 @@
       >报表导出</div>
       <!-- 搜索类型 -->
       <el-form :inline="true" class="searchForm" v-model.trim="searchForm">
+        <el-form-item>
+          <el-input v-model.trim="searchForm.phone" @keyup.enter.native="search" placeholder="手机号"></el-input>
+        </el-form-item>
         <!-- <el-form-item prop="organId">
           <el-select
             class="multiple"
@@ -27,7 +30,7 @@
               :value="item.id"
             ></el-option>
           </el-select>
-        </el-form-item> -->
+        </el-form-item>-->
         <el-form-item>
           <el-date-picker
             v-model.trim="orderDate"
@@ -55,7 +58,7 @@
               :value="item.value"
             ></el-option>
           </el-select>
-        </el-form-item> -->
+        </el-form-item>-->
         <el-form-item>
           <el-select
             v-model.trim="searchForm.status"
@@ -98,7 +101,12 @@
           <el-table-column align="center" prop="actualAmount" label="实付金额"></el-table-column>
           <el-table-column align="center" label="用户姓名">
             <template slot-scope="scope">
-              {{ scope.row.username }}
+              <div v-if="scope.row.user">{{ scope.row.user.username }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center"  label="手机号">
+              <template slot-scope="scope">
+              <div v-if="scope.row.user">{{ scope.row.user.phone }}</div>
             </template>
           </el-table-column>
           <el-table-column align="center" prop="paymentChannel" label="交易方式">
@@ -126,15 +134,15 @@
   </div>
 </template>
 <script>
-import pagination from '@/components/Pagination/index'
-import { tenantPaymentOrder } from '@/api/orderManager'
+import pagination from "@/components/Pagination/index";
+import { tenantPaymentOrder } from "@/api/orderManager";
 // import { getEmployeeOrgan } from '@/api/buildTeam'
-import store from '@/store'
-import { orderStatus, dealStatus } from '@/utils/searchArray'
-import axios from 'axios'
-import qs from 'qs'
-import { getToken } from '@/utils/auth'
-import load from '@/utils/loading'
+import store from "@/store";
+import { orderStatus, dealStatus } from "@/utils/searchArray";
+import axios from "axios";
+import qs from "qs";
+import { getToken } from "@/utils/auth";
+import load from "@/utils/loading";
 export default {
   components: { pagination },
   name: "income",
@@ -148,7 +156,8 @@ export default {
         orderEndDate: null,
         status: "SUCCESS",
         paymentType: null,
-        organId: null
+        organId: null,
+        phone:null
       },
       tableList: [],
       organList: [],
@@ -171,15 +180,17 @@ export default {
     // });
     var now = new Date();
 
-    var startDate =
-      new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()))
-        .toISOString()
-        .slice(0, 10);
-        //  + " 00:00:00"  + " 23:59:59"
-    var endDate =
-      new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()))
-        .toISOString()
-        .slice(0, 10);
+    var startDate = new Date(
+      Date.UTC(now.getFullYear(), now.getMonth(), now.getDate())
+    )
+      .toISOString()
+      .slice(0, 10);
+    //  + " 00:00:00"  + " 23:59:59"
+    var endDate = new Date(
+      Date.UTC(now.getFullYear(), now.getMonth(), now.getDate())
+    )
+      .toISOString()
+      .slice(0, 10);
     this.orderDate = [];
     this.orderDate.push(startDate);
     this.orderDate.push(endDate);
@@ -213,6 +224,9 @@ export default {
         data.orderStartDate = searchForm.orderStartDate;
         data.orderEndDate = searchForm.orderEndDate;
       }
+      if(searchForm.phone){
+        data.phone = searchForm.phone
+      }
       const options = {
         method: "POST",
         headers: {
@@ -228,45 +242,47 @@ export default {
         type: "warning"
       })
         .then(() => {
-          load.startLoading()
-          axios(options).then(res => {
-            let blob = new Blob([res.data], {
-              // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
-              type: "application/vnd.ms-excel;charset=utf-8"
-              //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
-            });
-            let text = (new Response(blob)).text()
-            text.then(res => {
-              // 判断是否报错
-              if(res.indexOf('code') != -1) {
-                let json = JSON.parse(res)
-                this.$message.error(json.msg)
-              } else {
-                let objectUrl = URL.createObjectURL(blob);
-                let link = document.createElement("a");
-                let nowTime = new Date();
-                let ymd =
-                  nowTime.getFullYear() +
-                  "" +
-                  (nowTime.getMonth() + 1) +
-                  "" +
-                  nowTime.getDate() +
-                  "" +
-                  nowTime.getHours() +
-                  "" +
-                  nowTime.getMinutes();
-                let fname = "报表导出" + new Date().getTime(); //下载文件的名字
-                link.href = objectUrl;
-                link.setAttribute("download", fname);
-                document.body.appendChild(link);
-                link.click();
-              }
+          load.startLoading();
+          axios(options)
+            .then(res => {
+              let blob = new Blob([res.data], {
+                // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
+                type: "application/vnd.ms-excel;charset=utf-8"
+                //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
+              });
+              let text = new Response(blob).text();
+              text.then(res => {
+                // 判断是否报错
+                if (res.indexOf("code") != -1) {
+                  let json = JSON.parse(res);
+                  this.$message.error(json.msg);
+                } else {
+                  let objectUrl = URL.createObjectURL(blob);
+                  let link = document.createElement("a");
+                  let nowTime = new Date();
+                  let ymd =
+                    nowTime.getFullYear() +
+                    "" +
+                    (nowTime.getMonth() + 1) +
+                    "" +
+                    nowTime.getDate() +
+                    "" +
+                    nowTime.getHours() +
+                    "" +
+                    nowTime.getMinutes();
+                  let fname = "报表导出" + new Date().getTime(); //下载文件的名字
+                  link.href = objectUrl;
+                  link.setAttribute("download", fname);
+                  document.body.appendChild(link);
+                  link.click();
+                }
+              });
+              load.endLoading();
             })
-            load.endLoading();
-          }).catch(error => {
-            this.$message.error('导出数据失败,请连接管理员');
-            load.endLoading();
-          });
+            .catch(error => {
+              this.$message.error("导出数据失败,请连接管理员");
+              load.endLoading();
+            });
         })
         .catch(() => {});
     },
@@ -316,7 +332,8 @@ export default {
         orderEndDate: null,
         paymentStatus: null,
         paymentType: null,
-        organId: null
+        organId: null,
+        phone:null
       };
       this.getList();
     }

+ 247 - 0
src/views/studentManager/components/studentOutList.vue

@@ -0,0 +1,247 @@
+
+<template>
+  <div class='studentOut'>
+    <!-- 搜索类型 -->
+    <el-form :inline="true"
+             class="searchForm"
+             v-model.trim="searchForm">
+      <el-form-item>
+        <el-input placeholder="课程名称"
+                  @keyup.enter.native='onSearch'
+                  v-model.trim="searchForm.search"></el-input>
+      </el-form-item>
+       <el-form-item label="课程状态">
+        <el-select v-model.trim="searchForm.groupStatus" clearable>
+          <el-option
+            v-for="(item,index) in commGroupStatus"
+            :key="index"
+            :value="item.value"
+            :label="item.label"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="onSearch"
+                   type="danger">搜索</el-button>
+      </el-form-item>
+    </el-form>
+
+    <div class="tableWrap">
+      <el-table :header-cell-style="{background:'#EDEEF0',color:'#444'}"
+                :data='tableList'>
+        <el-table-column label="编号"
+                         align='center'
+                         prop='id'>
+        </el-table-column>
+        <el-table-column label="课程组名称"
+                         align='center'
+                         prop="name">
+        </el-table-column>
+        <el-table-column label="课程组状态"
+                         align='center'>
+          <template slot-scope="scope">
+            {{ scope.row.status | courseGroup }}
+          </template>
+        </el-table-column>
+        <el-table-column label="老师"
+                         align='center'
+                         prop="teacherName">
+        </el-table-column>
+        <el-table-column label="班级人数"
+                         align='center'
+                         prop="studentNum">
+        </el-table-column>
+
+        <el-table-column label="开课时间"
+                         align='center'
+                         prop="firstClassesStartTime">
+        </el-table-column>
+        <el-table-column label="当前课次"
+                         align='center'
+                         prop="currentClassTimes">
+          <template slot-scope="scope">
+            {{ scope.row.currentClassTimes }}/{{ scope.row.totalClassTimes }}
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination :total="pageInfo.total"
+                  :page.sync="pageInfo.page"
+                  :limit.sync="pageInfo.limit"
+                  :page-sizes="pageInfo.page_size"
+                  @pagination="getCourseList" />
+
+      <!-- <el-dialog :title="dialogTitle"
+                 :visible.sync="dialogTableVisible">
+        <el-table :data="gridData">
+          <el-table-column prop="courseDate"
+                           label="时间"
+                           align='center'
+                           width="150"></el-table-column>
+          <el-table-column prop="classGroupName"
+                           label="课程名称"
+                           align='center'
+                           width="200"></el-table-column>
+          <el-table-column label="课程类型"
+                           align='center'>
+            <template slot-scope="scope">
+              {{ scope.row.teachMode == 'ONLINE' ? '线上' : '线下' }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="courseStatus"
+                           align='center'
+                           label="课程状态">
+            <template slot-scope="scope">
+              {{ scope.row.courseStatus |coursesStatus }}
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-dialog> -->
+    </div>
+  </div>
+</template>
+<script>
+import pagination from '@/components/Pagination/index'
+import { commGroupStatus } from "@/utils/searchArray";
+import { findStudentCourseGroupsWithWeb } from '@/api/studentManager'
+export default {
+  name: 'studentvip',
+  components: { pagination },
+  data () {
+    return {
+      searchForm: {
+        studentId: null,
+        search: null,
+        groupStatus:null
+      },
+      checkIndex: null, // 选中的课程
+      dialogTableVisible: false,
+      tableList: [],
+      courseList: [],
+      commGroupStatus:commGroupStatus,
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      dialogTitle: '',
+      gridData: [],
+      userId: ''
+    }
+  },
+  created () {
+    this.userId = this.$route.query.userId || null;
+  },
+  mounted () {
+    this.searchForm.studentId = this.$route.query.userId
+    this.getCourseList()
+  },
+  activated() {
+    this.userId = this.$route.query.userId || null
+    this.searchForm.studentId = this.$route.query.userId
+    this.getCourseList()
+  },
+  methods: {
+    // onCheckCourse(item) {
+    //   this.checkIndex = item.id
+    //   this.getList()
+    // },
+    getCourseList () {
+      let params = this.searchForm
+      params.rows = this.pageInfo.limit
+      params.page = this.pageInfo.page
+      findStudentCourseGroupsWithWeb(params).then(res => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows
+          this.pageInfo.total = res.data.total
+        }
+      })
+    },
+    onSearch () {
+      this.pageInfo.page = 1
+      this.getCourseList()
+    }
+    // getList() {
+    //   findStudentCourses({
+    //     vipGroupId: this.checkIndex,
+    //     rows: this.pageInfo.limit,
+    //     page: this.pageInfo.page
+    //   }).then(res => {
+    //     if(res.code ==200) {
+    //       this.tableList = res.data.rows
+    //       this.pageInfo.total = res.data.total
+    //     }
+    //   })
+    // }
+  }
+}
+</script>
+<style lang="scss">
+.studentOut {
+  .topCard {
+    display: flex;
+    flex-direction: row;
+    justify-content: flex-start;
+    margin-bottom: 30px;
+    .cardItem {
+      margin-right: 15px;
+      width: 300px;
+      height: 130px;
+      padding: 20px 24px;
+      box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.1);
+      box-sizing: border-box;
+      border-radius: 6px;
+      .top {
+        display: flex;
+        flex-direction: row;
+        justify-content: space-between;
+        margin-bottom: 23px;
+        .name {
+          font-size: 14px;
+          color: #323c47;
+          font-weight: 500;
+        }
+        .type {
+          font-size: 14px;
+          color: #aaa;
+        }
+      }
+      .bottom {
+        display: flex;
+        flex-direction: row;
+        justify-content: space-between;
+        text-align: center;
+        p {
+          font-size: 14px;
+          color: #444;
+        }
+        .title {
+          color: #aaa;
+          margin-bottom: 8px;
+        }
+      }
+    }
+    .cardItem.active {
+      background-color: #14928a;
+      .name {
+        font-size: 14px;
+        color: #fff;
+        font-weight: 500;
+      }
+      .type {
+        font-size: 14px;
+        color: #fff;
+      }
+      .bottom {
+        p {
+          color: #fff;
+        }
+        .title {
+          color: #fff;
+        }
+      }
+    }
+  }
+}
+</style>

+ 108 - 118
src/views/studentManager/components/studentRecord.vue

@@ -1,57 +1,58 @@
 <template>
   <div>
     <!-- 搜索类型 -->
-    <el-form :inline="true"
-             class="searchForm"
-             v-model.trim="searchForm">
+    <el-form :inline="true" class="searchForm" v-model.trim="searchForm">
       <el-form-item>
-        <el-select v-model.trim="searchForm.classGroupType"
-                   filterable
-                   clearable
-                   placeholder="课程类型">
-          <el-option v-for="(item, index) in courseArray"
-                     :key="index"
-                     :label="item.label"
-                     :value="item.value"></el-option>
+        <el-select
+          v-model.trim="searchForm.courseScheduleType"
+          filterable
+          clearable
+          placeholder="课程类型"
+        >
+          <el-option
+            v-for="(item, index) in courseArray"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-select v-model.trim="searchForm.attendanceStatus"
-                   filterable
-                   clearable
-                   placeholder="考勤状态">
-          <el-option v-for="(item, index) in att"
-                     :key="index"
-                     :label="item.label"
-                     :value="item.value"></el-option>
+        <el-select
+          v-model.trim="searchForm.attendanceStatus"
+          filterable
+          clearable
+          placeholder="考勤状态"
+        >
+          <el-option
+            v-for="(item, index) in att"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
         </el-select>
       </el-form-item>
-            <el-form-item>
-        <el-select v-model.trim="searchForm.courseStatus"
-                   filterable
-                   clearable
-                   placeholder="课程状态">
-          <el-option v-for="(item, index) in courseStatus"
-                     :key="index"
-                     :label="item.label"
-                     :value="item.value"></el-option>
+      <el-form-item>
+        <el-select v-model.trim="searchForm.courseStatus" filterable clearable placeholder="课程状态">
+          <el-option
+            v-for="(item, index) in courseStatus"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-input placeholder="班级名称"
-                  v-model.trim="searchForm.classGroupName"></el-input>
+        <el-input placeholder="班级名称" v-model.trim="searchForm.classGroupName"></el-input>
       </el-form-item>
       <el-form-item>
-        <el-input placeholder="老师姓名"
-                  v-model.trim="searchForm.teacherName"></el-input>
+        <el-input placeholder="老师姓名" v-model.trim="searchForm.teacherName"></el-input>
       </el-form-item>
       <el-form-item>
-        <el-button @click="search"
-                   type="danger">搜索</el-button>
+        <el-button @click="search" type="danger">搜索</el-button>
       </el-form-item>
       <el-form-item>
-        <el-button @click="onReSet"
-                   type="primary">重置</el-button>
+        <el-button @click="onReSet" type="primary">重置</el-button>
       </el-form-item>
     </el-form>
     <!-- 查询列表 -->
@@ -63,148 +64,137 @@
         {{ item.key }}
         <i class="el-icon-close"></i>
       </div>
-    </div> -->
+    </div>-->
     <!-- 列表 -->
     <div class="tableWrap">
-      <el-table :data='tableList'
-                :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-        <el-table-column align='center'
-                         prop="courseDate"
-                         label="上课时间">
+      <el-table :data="tableList" :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+        <el-table-column align="center" prop="courseScheduleId" label="课程编号"></el-table-column>
+        <el-table-column align="center" prop="courseDate" width="150" label="上课时间"></el-table-column>
+        <el-table-column align="center" prop="courseEndDate" label="下课时间" width="150"></el-table-column>
+        <el-table-column align="center" label="星期几">
+          <template slot-scope="scope">{{ scope.row.courseDate | formatWeek }}</template>
         </el-table-column>
-        <el-table-column align='center'
-                         label="星期几">
-          <template slot-scope="scope">
-            {{ scope.row.courseDate | formatWeek }}
-          </template>
+        <el-table-column align="center" label="课程状态">
+          <template slot-scope="scope">{{ scope.row.courseStatus | coursesStatus }}</template>
         </el-table-column>
-          <el-table-column align='center'
-                         label="课程状态">
-          <template slot-scope="scope">
-            {{ scope.row.courseStatus | coursesStatus }}
-          </template>
+        <el-table-column align="center" label="课程类型">
+          <template slot-scope="scope">{{ scope.row.courseScheduleType | coursesType }}</template>
         </el-table-column>
-        <el-table-column align='center'
-                         label="班级类型">
+        <el-table-column align="center" prop="classGroupName" label="班级名称"></el-table-column>
+        <el-table-column align="center" prop="currentCLassTimes" label="当前课次">
           <template slot-scope="scope">
-            {{ scope.row.classGroupType | classType }}
-          </template>
-        </el-table-column>
-        <el-table-column align='center'
-                         prop="classGroupName"
-                         label="班级名称">
-        </el-table-column>
-        <el-table-column align='center'
-                         prop="currentCLassTimes"
-                         label="当前课次">
-          <template slot-scope="scope">
-            <div>
-              {{ scope.row.currentCLassTimes + '/'+scope.row.totalClassTimes }}
-            </div>
+            <div>{{ scope.row.currentCLassTimes + '/'+scope.row.totalClassTimes }}</div>
           </template>
         </el-table-column>
-        <el-table-column align='center'
-                         prop="teacherName"
-                         label="课程老师">
-        </el-table-column>
-        <el-table-column align='center'
-                         prop="attendanceStatus"
-                         label="考勤状态">
+        <el-table-column align="center" prop="teacherName" label="课程老师"></el-table-column>
+        <el-table-column align="center" prop="attendanceStatus" label="考勤状态">
           <template slot-scope="scope">
+            <!-- 因为未开始的课返回为旷课 产品要求写为未签到 -->
             <div>
-              <p v-if="scope.row.courseStatus != 'NOT_START'">{{ scope.row.attendanceStatus | clockingIn }}</p>
-              <p v-if="scope.row.courseStatus == 'NOT_START'">未签到 </p>
+              <p
+                v-if="scope.row.courseStatus != 'NOT_START'"
+              >{{ scope.row.attendanceStatus | clockingIn }}</p>
+              <p v-if="scope.row.courseStatus == 'NOT_START'">未签到</p>
             </div>
-            
           </template>
         </el-table-column>
       </el-table>
-      <pagination :total="pageInfo.total"
-                  :page.sync="pageInfo.page"
-                  :limit.sync="pageInfo.limit"
-                  :page-sizes="pageInfo.page_size"
-                  @pagination="getList" />
+      <pagination
+        :total="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+      />
     </div>
   </div>
 </template>
 <script>
-import pagination from '@/components/Pagination/index'
-import { findStudentAttendances } from '@/api/studentManager'
-import { courseStatus } from '@/utils/searchArray'
+import pagination from "@/components/Pagination/index";
+import { findStudentAttendances } from "@/api/studentManager";
+import { courseStatus, courseType } from "@/utils/searchArray";
 export default {
-  name: 'studentRecord',
+  name: "studentRecord",
   components: { pagination },
-  data () {
+  data() {
     return {
       searchForm: {
         studentId: null,
-        classGroupType: null,
+        courseScheduleType: null,
         attendanceStatus: null,
         classGroupName: null,
         teacherName: null,
-        courseStatus:null
+        courseStatus: null
       },
       searchLsit: [],
       tableList: [],
       courseArray: [
-        { label: '单技课', value: 'NORMAL' },
-        { label: '合奏课', value: 'MIX' },
-        { label: '基础技能班', value: 'HIGH' },
-        { label: 'VIP课', value: 'VIP' },
-        { label: '试听课', value: 'DEMO' }
+        { label: "单技课", value: "SINGLE" },
+        { label: "合奏课", value: "MIX" },
+        { label: "基础技能课", value: "HIGH" },
+        { label: "vip课", value: "VIP" },
+        { label: "试听课", value: "DEMO" },
+        { label: "综合课", value: "COMPREHENSIVE" },
+        { label: "网管课", value: "PRACTICE" },
+        { label: "启蒙课", value: "ENLIGHTENMENT" },
+        { label: "集训单技课", value: "TRAINING_SINGLE" },
+        { label: "集训合奏课", value: "TRAINING_MIX" },
+        { label: "课堂课", value: "CLASSROOM" },
+        { label: "对外课", value: "COMM" }
       ],
+
       att: [
         { value: "NORMAL", label: "正常" },
         { value: "TRUANT", label: "旷课" },
-        { value: "LEAVE", label: "请假" },
+        { value: "LEAVE", label: "请假" }
       ],
-      courseStatus:courseStatus,
+      courseStatus: courseStatus,
       pageInfo: {
         // 分页规则
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
         page_size: [10, 20, 40, 50] // 选择限制显示条数
-      },
-
-    }
+      }
+    };
   },
-  mounted () {
-    this.searchForm.studentId = this.$route.query.userId
-    this.getList()
+  mounted() {
+    this.searchForm.studentId = this.$route.query.userId;
+    this.getList();
   },
   activated() {
-    this.searchForm.studentId = this.$route.query.userId
-    this.getList()
+    this.searchForm.studentId = this.$route.query.userId;
+    this.getList();
   },
   methods: {
-    search () {
+    search() {
       this.pageInfo.page = 1;
       this.getList();
     },
-    getList () {
-      let params = this.searchForm
-      params.rows = this.pageInfo.limit
-      params.page = this.pageInfo.page
+    getList() {
+      let params = this.searchForm;
+      params.rows = this.pageInfo.limit;
+      params.page = this.pageInfo.page;
       findStudentAttendances(params).then(res => {
         if (res.code == 200) {
-          this.tableList = res.data.rows
-          this.pageInfo.total = res.data.total
+          this.tableList = res.data.rows;
+          this.pageInfo.total = res.data.total;
         }
-      })
+      });
     },
-    onReSet () { // 重置搜索
+    onReSet() {
+      // 重置搜索
       this.searchForm = {
         studentId: this.$route.query.userId,
         classGroupType: null,
         attendanceStatus: null,
         classGroupName: null,
         teacherName: null
-      }
-      this.getList()
-    },
+      };
+      this.getList();
+    }
   }
-}
+};
 </script>
 <style lang="scss">
 </style>

+ 60 - 50
src/views/studentManager/index.vue

@@ -1,55 +1,49 @@
 <template>
   <div class="m-container">
     <h2>
-      <el-page-header @back="onCancel"
-                      content="学员详情"></el-page-header>
+      <el-page-header @back="onCancel" :content="studentName"></el-page-header>
     </h2>
     <div class="m-core">
       <!-- navMenu -->
-      <el-tabs v-model.trim="activeIndex"
-               type="card"
-               @tab-click="handleClick">
-        <el-tab-pane label="基本信息" v-if="permissionList.studentInfo"
-                     name="1">
+      <el-tabs v-model.trim="activeIndex" type="card" @tab-click="handleClick">
+        <el-tab-pane label="基本信息" v-if="permissionList.studentInfo" name="1">
           <studentInfo v-if="activeIndex == 1" />
         </el-tab-pane>
-        <el-tab-pane label="乐团&课程" v-if="permissionList.teamAndcourse"
-                     name="2">
+        <el-tab-pane label="乐团&课程" v-if="permissionList.teamAndcourse" name="2">
           <teamAndcourse v-if="activeIndex == 2" />
         </el-tab-pane>
-        <el-tab-pane label="VIP课" v-if="permissionList.studentVip"
-                     name="3">
+        <el-tab-pane label="VIP课" v-if="permissionList.studentVip" name="3">
           <studentVip v-if="activeIndex == 3" />
         </el-tab-pane>
-        <el-tab-pane label="上课记录" v-if="permissionList.studentRecord"
-                     name="4">
-          <studentRecord v-if="activeIndex == 4" />
+        <el-tab-pane label="对外课程" v-if="permissionList.studentOutList" name="4">
+          <studentOutList v-if="activeIndex == 4" />
         </el-tab-pane>
-        <el-tab-pane label="扣费记录" v-if="permissionList.studentPayList"
-                     name="5">
-          <studentPayList v-if="activeIndex == 5" />
+        <el-tab-pane label="课表详情" v-if="permissionList.studentRecord" name="5">
+          <studentRecord v-if="activeIndex == 5" />
         </el-tab-pane>
-        <el-tab-pane label="学员订单" v-if="permissionList.studentOrder"
-                     name="6">
-          <studentOrder v-if="activeIndex == 6" />
+        <el-tab-pane label="扣费记录" v-if="permissionList.studentPayList" name="6">
+          <studentPayList v-if="activeIndex == 6" />
         </el-tab-pane>
-        <el-tab-pane label="学员提现" v-if="permissionList.studentCashout"
-                     name="7">
-          <studentCashout v-if="activeIndex == 7" />
+        <el-tab-pane label="学员订单" v-if="permissionList.studentOrder" name="7">
+          <studentOrder v-if="activeIndex == 7" />
+        </el-tab-pane>
+        <el-tab-pane label="学员提现" v-if="permissionList.studentCashout" name="8">
+          <studentCashout v-if="activeIndex == 8" />
         </el-tab-pane>
       </el-tabs>
     </div>
   </div>
 </template>
 <script>
-import studentInfo from './components/studentInfo.vue';
-import teamAndcourse from './components/teamAndcourse.vue';
-import studentRecord from './components/studentRecord.vue';
-import studentPayList from './components/studentPayList.vue';
-import studentVip from './components/studentVip.vue';
-import studentOrder from './components/studentOrder.vue';
-import studentCashout from './components/studentCashout.vue';
-import { permission } from '@/utils/directivePage'
+import studentInfo from "./components/studentInfo.vue";
+import teamAndcourse from "./components/teamAndcourse.vue";
+import studentRecord from "./components/studentRecord.vue";
+import studentPayList from "./components/studentPayList.vue";
+import studentVip from "./components/studentVip.vue";
+import studentOutList from "./components/studentOutList.vue";
+import studentOrder from "./components/studentOrder.vue";
+import studentCashout from "./components/studentCashout.vue";
+import { permission } from "@/utils/directivePage";
 export default {
   components: {
     teamAndcourse,
@@ -58,42 +52,58 @@ export default {
     studentInfo,
     studentVip,
     studentOrder,
-    studentCashout
+    studentCashout,
+    studentOutList
   },
-  name: 'studentDetail',
-  data () {
+  name: "studentDetail",
+  data() {
     return {
-      activeIndex: '1',
+      activeIndex: "1",
       // acitveStatus: [true, false, false, false, false, false, false]
       permissionList: {
-        studentInfo: permission('/studentDetail/studentInfo'),
-        teamAndcourse: permission('/studentDetail/teamAndcourse'),
-        studentVip: permission('/studentDetail/studentVip'),
-        studentRecord: permission('/studentDetail/studentRecord'),
-        studentPayList: permission('/studentDetail/studentPayList'),
-        studentOrder: permission('/studentDetail/studentOrder'),
-        studentCashout: permission('/studentDetail/studentCashout'),
-      }
+        studentInfo: permission("/studentDetail/studentInfo"),
+        teamAndcourse: permission("/studentDetail/teamAndcourse"),
+        studentVip: permission("/studentDetail/studentVip"),
+        studentRecord: permission("/studentDetail/studentRecord"),
+        studentPayList: permission("/studentDetail/studentPayList"),
+        studentOrder: permission("/studentDetail/studentOrder"),
+        studentCashout: permission("/studentDetail/studentCashout"),
+        studentOutList: permission("/studentDetail/studentOutList"),
+      },
+      studentName: ""
+    };
+  },
+  mounted() {
+    if (this.$route.query.search) {
+      this.Fsearch = this.$route.query.search;
+    }
+    if (this.$route.query.rules) {
+      this.Frules = this.$route.query.rules;
     }
+    this.studentName = this.$route.query.studentName;
   },
-  mounted () {
+  activated() {
     if (this.$route.query.search) {
       this.Fsearch = this.$route.query.search;
     }
     if (this.$route.query.rules) {
-      this.Frules = this.$route.query.rules
+      this.Frules = this.$route.query.rules;
     }
+    this.studentName = this.$route.query.studentName;
   },
   methods: {
-    onCancel () {
-      this.$router.push({ path: '/business/studentList', query: { rules: this.Frules, search: this.Fsearch } })
+    onCancel() {
+      this.$router.push({
+        path: "/business/studentList",
+        query: { rules: this.Frules, search: this.Fsearch }
+      });
     },
-    handleClick (val) {
-      this.activeIndex = val.name
+    handleClick(val) {
+      this.activeIndex = val.name;
       // this.acitveStatus[val.name - 1] = true
     }
   }
-}
+};
 </script>
 <style lang="scss">
 </style>

+ 1 - 1
src/views/studentManager/studentList.vue

@@ -119,7 +119,7 @@
               <router-link
                 style="color:#409EFF"
                 v-permission="'/studentDetail'"
-                :to="{path:`/business/studentDetail?userId=${scope.row.userId}`,query:{search:JSON.stringify(searchForm),rules:JSON.stringify(pageInfo)}}"
+                :to="{path:`/business/studentDetail?userId=${scope.row.userId}`,query:{search:JSON.stringify(searchForm),rules:JSON.stringify(pageInfo),studentName:scope.row.username}}"
               >查看</router-link>
               <el-button
                 type="text"

+ 149 - 0
src/views/teacherManager/teacherDetail/components/outCourseList.vue

@@ -0,0 +1,149 @@
+<template>
+  <div class="courseInfo">
+    <el-form :inline="true" :model="searchList">
+      <el-form-item>
+        <el-input placeholder="课程组名称" @keyup.enter.native="search" v-model.trim="searchList.search"></el-input>
+      </el-form-item>
+      <el-form-item label="课程状态">
+        <el-select v-model.trim="searchList.status" clearable>
+          <el-option
+            v-for="(item,index) in commGroupStatus"
+            :key="index"
+            :value="item.value"
+            :label="item.label"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="danger" @click="search">搜索</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="tableWrap tableMargin">
+      <el-table :data="teamList" :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+        <el-table-column label="编号" prop="id" align="center"></el-table-column>
+        <el-table-column label="课程组名称" prop="name" align="center"></el-table-column>
+        <el-table-column label="课程组状态" align="center">
+          <template slot-scope="scope">{{ scope.row.status | courseGroup}}</template>
+        </el-table-column>
+        <el-table-column label="班级人数" prop="studentNum" align="center"></el-table-column>
+        <el-table-column label="课程组时间" prop="groupClassesTotalDuration" align="center"></el-table-column>
+        <el-table-column label="消耗时间" prop="groupClassesConsumeDuration" align="center"></el-table-column>
+         <el-table-column label="当前课次"
+                         align='center'
+                         prop="currentClassTimes">
+          <template slot-scope="scope">
+            {{ scope.row.currentClassTimes }}/{{ scope.row.totalClassTimes }}
+          </template>
+        </el-table-column>
+        <el-table-column label="开课时间" align="center">
+          <template slot-scope="scope">{{scope.row.firstClassesStartTime | formatterTime}}</template>
+        </el-table-column>
+        <el-table-column label="结束时间" align="center">
+          <template slot-scope="scope">{{ scope.row.lastClassesEndTime | formatTimer }}</template>
+        </el-table-column>
+        <el-table-column label="申请时间" align="center">
+          <template slot-scope="scope">{{scope.row.createTime | formatterTime}}</template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        :total="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+      />
+    </div>
+  </div>
+</template>
+<script>
+// import { getTeacherVipClass } from '@/api/teacherManager'
+import { findTeacherCourseGroupsWithWeb } from "@/api/teacherManager";
+import pagination from "@/components/Pagination/index";
+import { commGroupStatus } from "@/utils/searchArray";
+import store from "@/store";
+export default {
+  name: "courseInfo1",
+  components: {
+    pagination
+  },
+  data() {
+    return {
+      searchList: {
+        status: "",
+        search: ""
+      },
+      teamList: [],
+      organId: null,
+      commGroupStatus: commGroupStatus,
+      teacherId: this.$route.query.teacherId,
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 1, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    };
+  },
+  activated() {
+    this.getList();
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    getList() {
+      this.teacherId = this.$route.query.teacherId;
+      findTeacherCourseGroupsWithWeb({
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page,
+        teacherId: this.teacherId,
+        groupStatus: this.searchList.status || null,
+        search: this.searchList.search || null
+      }).then(res => {
+        if (res.code == 200) {
+          this.teamList = res.data.rows;
+          this.pageInfo.total = res.data.total;
+        }
+      });
+    },
+    search() {
+      this.pageInfo.page = 1;
+      this.getList();
+    }
+  },
+  filters: {
+    formatterTime(val) {
+      let result;
+      if (val) {
+        result = val.split(" ")[0];
+      } else {
+        result = "";
+      }
+      return result;
+    },
+    formatterStatus(val) {
+      let arr = [
+        "未开始",
+        "报名中",
+        "进行中",
+        "取消",
+        "已结束",
+        "报名结束",
+        "暂停"
+      ];
+      return arr[val];
+    }
+  }
+};
+</script>
+<style lang="scss" scope>
+.courseInfo {
+  h4 {
+    margin-bottom: 20px;
+  }
+  .tableMargin {
+    margin-top: 20px;
+  }
+}
+</style>

+ 12 - 0
src/views/teacherManager/teacherDetail/components/teacherInfo.vue

@@ -6,6 +6,18 @@
         <el-form :model="topForm">
           <el-row>
             <el-col :span="12">
+              <el-form-item label="姓名" :label-width="formLabelWidth">
+                <el-input v-model.trim="topForm.realName"  disabled></el-input>
+              </el-form-item>
+            </el-col>
+             <el-col :span="12">
+              <el-form-item label="姓名(备注)" :label-width="formLabelWidth">
+                <el-input v-model.trim="topForm.memo"  disabled></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
               <el-form-item label="老师编号"
                             :label-width="formLabelWidth">
                 <el-input disabled

+ 87 - 99
src/views/teacherManager/teacherDetail/components/teacherRecord.vue

@@ -1,112 +1,101 @@
 <template>
-  <div class='tr-cotainer'>
+  <div class="tr-cotainer">
     <!-- 搜索标题 -->
-    <el-form :inline="true"
-             class="searchForm"
-             v-model.trim="searchForm">
+    <el-form :inline="true" class="searchForm" v-model.trim="searchForm">
       <el-form-item>
-        <el-date-picker style="width: 400px;"
-                        v-model.trim="courseDate"
-                        type="daterange"
-                        value-format="yyyy-MM-dd"
-                        @change="searchCourseDate"
-                        range-separator="至"
-                        start-placeholder="开始日期"
-                        end-placeholder="结束日期">
-        </el-date-picker>
+        <el-date-picker
+          style="width: 400px;"
+          v-model.trim="courseDate"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          @change="searchCourseDate"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
       </el-form-item>
       <el-form-item>
-        <el-select v-model.trim="searchForm.courseScheduleType"
-                   clearable
-                   filterable
-                   placeholder="课程类型">
-          <el-option v-for="(item, index) in courseType"
-                     :key="index"
-                     :label="item.label"
-                     :value="item.value"></el-option>
+        <el-select
+          v-model.trim="searchForm.courseScheduleType"
+          clearable
+          filterable
+          placeholder="课程类型"
+        >
+          <el-option
+            v-for="(item, index) in courseType"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-input placeholder="课程名称"
-                  @keyup.enter.native='search'
-                  v-model.trim="searchForm.classGroupName"></el-input>
+        <el-input
+          placeholder="课程名称"
+          @keyup.enter.native="search"
+          v-model.trim="searchForm.classGroupName"
+        ></el-input>
       </el-form-item>
       <el-form-item>
-        <el-select v-model.trim="searchForm.signInStatus"
-                   filterable
-                   clearable
-                   placeholder="考勤状态">
-          <el-option v-for="(item, index) in attendance"
-                     :key="index"
-                     :label="item.label"
-                     :value="item.value"></el-option>
+        <el-select v-model.trim="searchForm.signInStatus" filterable clearable placeholder="考勤状态">
+          <el-option
+            v-for="(item, index) in attendance"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button @click="search"
-                   type="danger">搜索</el-button>
-        <el-button @click="onReSet"
-                   type="primary">重置</el-button>
+        <el-button @click="search" type="danger">搜索</el-button>
+        <el-button @click="onReSet" type="primary">重置</el-button>
       </el-form-item>
     </el-form>
     <!-- 列表 -->
     <div class="tableWrap">
       <div class="tableWrap">
-        <el-table :data='tableList'
-                  :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-          <el-table-column align='center'
-                           label="上课时间">
-            <template slot-scope="scope">
-              {{ scope.row.classDate }} {{ scope.row.startClassTime }}
-            </template>
+        <el-table :data="tableList" :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+          <el-table-column align="center" prop="courseScheduleId" label="课程编号"></el-table-column>
+          <el-table-column align="center" label="上课时间" width="150">
+            <template slot-scope="scope">{{ scope.row.classDate }} {{ scope.row.startClassTime }}</template>
           </el-table-column>
-          <el-table-column align='center'
-                           label="课程类型">
-            <template slot-scope="scope">
-              {{ scope.row.type | coursesType }}
-            </template>
+          <el-table-column align="center" label="下课时间"  width="150">
+            <template slot-scope="scope">{{ scope.row.classDate }} {{ scope.row.endClassTime }}</template>
           </el-table-column>
-          <el-table-column align='center'
-                           prop="name"
-                           label="课程名称">
+          <el-table-column align="center" label="课程类型">
+            <template slot-scope="scope">{{ scope.row.type | coursesType }}</template>
           </el-table-column>
-          <el-table-column align='center'
-                           label="签到">
-            <template slot-scope="scope">
-              {{ scope.row.signInStatus | attendanceType }}
-            </template>
+          <el-table-column align="center" prop="name" label="课程名称"></el-table-column>
+          <el-table-column align="center" label="签到">
+            <template slot-scope="scope">{{ scope.row.signInStatus | attendanceType }}</template>
           </el-table-column>
-          <el-table-column align='center'
-                           label="签退">
-            <template slot-scope="scope">
-              {{ scope.row.signOutStatus | attendanceOutType }}
-            </template>
-          </el-table-column>
-          <el-table-column align='center'
-                           prop="remark"
-                           label="备注">
+          <el-table-column align="center" label="签退">
+            <template slot-scope="scope">{{ scope.row.signOutStatus | attendanceOutType }}</template>
           </el-table-column>
+          <el-table-column align="center" prop="remark" label="备注"></el-table-column>
         </el-table>
-        <pagination :total="pageInfo.total"
-                    :page.sync="pageInfo.page"
-                    :limit.sync="pageInfo.limit"
-                    :page-sizes="pageInfo.page_size"
-                    @pagination="getList" />
+        <pagination
+          :total="pageInfo.total"
+          :page.sync="pageInfo.page"
+          :limit.sync="pageInfo.limit"
+          :page-sizes="pageInfo.page_size"
+          @pagination="getList"
+        />
       </div>
     </div>
   </div>
 </template>
 <script>
-import { getTeacherPersonalAttendances } from '@/api/teacherManager'
-import pagination from '@/components/Pagination/index'
-import store from '@/store'
-import { courseType, attendance } from '@/utils/searchArray'
+import { getTeacherPersonalAttendances } from "@/api/teacherManager";
+import pagination from "@/components/Pagination/index";
+import store from "@/store";
+import { courseType, attendance } from "@/utils/searchArray";
 export default {
-  name: 'teacherRecord',
+  name: "teacherRecord",
   components: {
     pagination
   },
-  data () {
+  data() {
     return {
       courseType: courseType, // 课程类型
       attendance: attendance, // 考勤状态
@@ -128,52 +117,51 @@ export default {
         total: 1, // 总条数
         page_size: [10, 20, 40, 50] // 选择限制显示条数
       }
-    }
+    };
   },
-  mounted () {
-    this.getList()
+  mounted() {
+    this.getList();
   },
-  activated () {
-    this.getList()
+  activated() {
+    this.getList();
   },
   methods: {
-    search () {
+    search() {
       this.pageInfo.page = 1;
       this.getList();
     },
-    getList () {
-      let params = this.searchForm
-      params.rows = this.pageInfo.limit
-      params.page = this.pageInfo.page,
-        params.teacherId = this.teacherId
+    getList() {
+      let params = this.searchForm;
+      params.rows = this.pageInfo.limit;
+      (params.page = this.pageInfo.page), (params.teacherId = this.teacherId);
       getTeacherPersonalAttendances(params).then(res => {
         if (res.code == 200) {
-          this.tableList = res.data.rows
-          this.pageInfo.total = res.data.total
+          this.tableList = res.data.rows;
+          this.pageInfo.total = res.data.total;
         }
-      })
+      });
     },
-    searchCourseDate (value) {
+    searchCourseDate(value) {
       if (value) {
-        this.searchForm.courseStartDate = value[0]
-        this.searchForm.courseEndDate = value[1]
+        this.searchForm.courseStartDate = value[0];
+        this.searchForm.courseEndDate = value[1];
       } else {
-        this.searchForm.courseStartDate = null
-        this.searchForm.courseEndDate = null
+        this.searchForm.courseStartDate = null;
+        this.searchForm.courseEndDate = null;
       }
     },
-    onReSet () {
-      this.courseDate = null
+    onReSet() {
+      this.courseDate = null;
       this.searchForm = {
         courseStartDate: null,
         courseEndDate: null,
         classGroupName: null,
         courseScheduleType: null,
         signInStatus: null
-      }
+      };
     }
   }
-}
+};
 </script>
 <style lang="scss" scope>
 .tr-cotainer {

+ 270 - 0
src/views/teacherManager/teacherDetail/components/timerList.vue

@@ -0,0 +1,270 @@
+<!--  -->
+<template>
+  <div class="m-core">
+    <div class="wrap">
+      <div
+        class="newBand"
+        v-permission="'sysTenantAccount/addMinutes'"
+        style="margin-right:20px"
+        @click="addTimer"
+      >系统充值</div>
+      <div class="newBand" v-permission="'sysTenantAccount/subtractMinutes'" @click="subTimer">系统扣除</div>
+    </div>
+    <el-form :inline="true" class="searchForm" v-model.trim="searchForm">
+      <el-form-item>
+        <el-select clearable placeholder="操作类型" v-model="searchForm.transType">
+          <el-option
+            :label="item.label"
+            :value="item.value"
+            v-for="(item,index) in teacherTimeStatus"
+            :key="index"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-date-picker
+          style="width: 400px;"
+          v-model.trim="searchForm.courseDate"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          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>
+    </el-form>
+    <div
+      style="font-size: 14px; color: #F85043; padding-bottom: 10px;"
+    >可用时间:{{ totalTransMinutes }}分钟 &nbsp;&nbsp;&nbsp;&nbsp;</div>
+    <div class="tableWrap">
+      <el-table :data="tableList" :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+        <el-table-column align="center" prop="updateTime" label="操作时间"></el-table-column>
+        <el-table-column align="center" label="操作类型">
+          <template slot-scope="scope">
+            <div>{{scope.row.transType | transTypeFilter}}</div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="operatorId" label="操作人">
+           <template slot-scope="scope">
+            <div>{{scope.row.operatorId?scope.row.operatorId:scope.row.userId}}</div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="transMinutes" label="时间变动/分钟">
+          <template slot-scope="scope">
+            <div>{{scope.row.transMinutes +'分钟'}}</div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="totalAvailableMinutes" label="剩余时间/分钟">
+          <template slot-scope="scope">
+            <div>{{scope.row.totalAvailableMinutes +'分钟'}}</div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="memo" label="备注"></el-table-column>
+      </el-table>
+      <pagination
+        :total="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+      />
+    </div>
+    <el-dialog :title="maskTitle" width="440px" :visible.sync="timerVisible">
+      <el-form :model="timerForm" ref="timerForm">
+        <el-form-item
+          :label="isAdd?'本次充值':'本次扣除'"
+          prop="minutes"
+          :rules="[{ required: true, message: '请输入时间' }]"
+        >
+          <el-row>
+            <el-col :span="28">
+              <el-input
+                type="number"
+                @mousewheel.native.prevent
+                v-model.trim="timerForm.minutes"
+                @keyup.native="handleInput"
+              >
+                <template slot="append">分钟</template>
+              </el-input>
+            </el-col>
+          </el-row>
+        </el-form-item>
+        <el-form-item label="操作备注" prop="memo" :rules="[{ required: true, message: '请输入备注' }]">
+          <el-row>
+            <el-col :span="28">
+              <el-input type="textarea" :rows="3" v-model.trim="timerForm.memo"></el-input>
+            </el-col>
+          </el-row>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="timerVisible = false">取 消</el-button>
+        <el-button type="primary" @click="addTimerSub(isAdd)">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { teacherTimeStatus } from "@/utils/searchArray";
+import pagination from "@/components/Pagination/index";
+import {
+  queryTenantAccountList,
+  sysTenantAccountAddMinutes,
+  sysTenantAccountSubtractMinutes,
+  queryTenantAcGet
+} from "@/api/teacherManager";
+export default {
+  components: { pagination },
+  data() {
+    return {
+      teacherId: null,
+      teacherTimeStatus,
+      searchForm: {
+        courseDate: [],
+        transType: null
+      },
+      maskTitle: "",
+      isAdd: false,
+      totalTransMinutes: 0,
+      tableList: [],
+      timerVisible: false,
+      timerForm: {
+        minutes: null,
+        memo: null
+      },
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 1, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    };
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    this.init();
+  },
+  activated() {
+    this.init();
+  },
+  methods: {
+    init() {
+      this.teacherId = this.$route.query.teacherId;
+
+      this.getList();
+    },
+    search() {
+      this.pageInfo.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      (this.searchForm = {
+        courseDate: [],
+        transType: null
+      }),
+        this.search();
+    },
+    getTime() {
+      queryTenantAcGet({ teacherId: this.teacherId }).then(res => {
+        if (res.code == 200) {
+          if (res.data) {
+            this.totalTransMinutes = res.data.availableMinutes;
+          }
+        }
+      });
+    },
+    getList() {
+      let obj = {};
+      if (this.searchForm.courseDate && this.searchForm.courseDate.length > 0) {
+        obj.startTime = this.searchForm.courseDate[0]+ ' 00:00:00';
+        obj.endTime = this.searchForm.courseDate[1]+ ' 23:59:59';
+      }
+      this.searchForm.transType
+        ? (obj.transType = this.searchForm.transType)
+        : null;
+      obj.userId = this.teacherId;
+      obj.page = this.pageInfo.page;
+      obj.rows = this.pageInfo.limit;
+      queryTenantAccountList(obj).then(res => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows;
+          this.pageInfo.total = res.data.total;
+        }
+      });
+      this.getTime();
+    },
+    addTimer() {
+      this.isAdd = true;
+      this.maskTitle = "充值时间";
+      this.timerVisible = true;
+    },
+    subTimer() {
+      this.isAdd = false;
+      this.maskTitle = "扣除时间";
+      this.timerVisible = true;
+    },
+    addTimerSub(flag) {
+      // true 加时间  false 减时间
+      this.$refs["timerForm"].validate(res => {
+        if (res) {
+          let obj = {
+            teacherId: this.teacherId,
+            minutes: this.timerForm.minutes,
+            memo: this.timerForm.memo
+          };
+          if (flag) {
+            sysTenantAccountAddMinutes(obj).then(res => {
+              if (res.code == 200) {
+                this.$message.success("添加成功");
+                this.timerVisible = false;
+                this.getList();
+              }
+            });
+          } else {
+            sysTenantAccountSubtractMinutes(obj).then(res => {
+              if (res.code == 200) {
+                this.$message.success("扣除成功");
+                this.timerVisible = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    handleInput() {
+      this.timerForm.minutes = this.timerForm.minutes.replace(/[^\.\d]/g, "");
+      this.timerForm.minutes = this.timerForm.minutes.replace(".", "");
+    }
+  },
+  watch: {
+    timerVisible(val) {
+      if (!val) {
+        this.timerForm = {
+          minutes: null,
+          memo: null
+        };
+        this.$refs["timerForm"].resetFields();
+      }
+    }
+  }
+};
+</script>
+<style lang='scss' scoped>
+.wrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+}
+/deep/.el-textarea__inner {
+  width: 254px;
+}
+</style>

+ 15 - 5
src/views/teacherManager/teacherDetail/index.vue

@@ -24,10 +24,10 @@
                      name="2">
           <courseInfo1 v-if="activeName == 2" />
         </el-tab-pane>
-        <el-tab-pane label="试听课"
-                     v-if="permissionList.domeCourse"
+        <el-tab-pane label="对外课程"
+                     v-if="permissionList.outCourseList"
                      name="3">
-          <courseInfo2 v-if="activeName == 3" />
+          <outCourseList v-if="activeName == 3" />
         </el-tab-pane>
         <el-tab-pane label="课表详情"
                      v-if="permissionList.teacherRecord"
@@ -44,6 +44,11 @@
                      name="6">
           <settlement v-if="activeName == 6" />
         </el-tab-pane>
+          <el-tab-pane label="时间记录"
+                     v-if="permissionList.timerList"
+                     name="7">
+          <timerList v-if="activeName == 7" />
+        </el-tab-pane>
       </el-tabs>
     </div>
   </div>
@@ -56,11 +61,13 @@ import courseInfo from '@/views/teacherManager/teacherDetail/components/courseIn
 import courseInfo1 from '@/views/teacherManager/teacherDetail/components/courseInfo1'
 import courseInfo2 from '@/views/teacherManager/teacherDetail/components/courseInfo2'
 import settlement from '@/views/teacherManager/teacherDetail/components/settlement'
+import timerList from '@/views/teacherManager/teacherDetail/components/timerList'
+import outCourseList from '@/views/teacherManager/teacherDetail/components/outCourseList'
 import { permission } from '@/utils/directivePage'
 export default {
   components: {    teacherRecord,
     leaveRecord, teacherInfo,
-    courseInfo, courseInfo1, courseInfo2, settlement  },
+    courseInfo, courseInfo1, courseInfo2, settlement,timerList,outCourseList  },
   name: 'teacherDetail',
   data () {
     return {
@@ -74,7 +81,10 @@ export default {
         domeCourse: permission('/teacherDetail/domeCourse'),
         teacherRecord: permission('/teacherDetail/teacherRecord'),
         leaveRecord: permission('/teacherDetail/leaveRecord'),
-        settlement: permission('/teacherDetail/settlement')
+        settlement: permission('/teacherDetail/settlement'),
+        timerList: permission('/teacherDetail/timerList'),
+        outCourseList: permission('/teacherDetail/outCourseList'),
+        
       },
       Fsearch: null,
       Frules: null

+ 9 - 1
src/views/teacherManager/teacherList.vue

@@ -88,7 +88,15 @@
       <div class="tableWrap">
         <el-table :data="tableList" :header-cell-style="{background:'#EDEEF0',color:'#444'}">
           <el-table-column align="center" prop="id" label="老师编号"></el-table-column>
-          <el-table-column align="center" prop="realName" label="老师名称"></el-table-column>
+          <el-table-column align="center" prop="realName" label="老师名称">
+            <template slot-scope="scope">
+              <div>
+                <p>{{scope.row.realName}}</p>
+                <p v-if="scope.row.memo">{{'('+scope.row.memo+')'}}</p>
+                
+              </div>
+            </template>
+          </el-table-column>
           <el-table-column align="center" prop="organName" label="所属分部"></el-table-column>
           <el-table-column align="center" label="老师状态">
             <template slot-scope="scope">{{ scope.row.lockFlag | teacherStatus }}</template>

+ 21 - 17
src/views/teacherManager/teacherOperation/components/teacherOperation.vue

@@ -14,6 +14,14 @@
               </el-form-item>
             </el-col>
             <el-col :span="12">
+              <el-form-item label="姓名(备注)" :label-width="formLabelWidth">
+                <el-input v-model.trim="topForm.memo"></el-input>
+              </el-form-item>
+            </el-col>
+           
+          </el-row>
+          <el-row>
+             <el-col :span="12">
               <el-form-item label="性别" prop="gender" :label-width="formLabelWidth">
                 <el-select v-model.trim="topForm.gender">
                   <el-option label="男" :value="1"></el-option>
@@ -21,8 +29,6 @@
                 </el-select>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row>
             <el-col :span="12">
               <el-form-item label="出生日期" :label-width="formLabelWidth">
                 <el-date-picker
@@ -33,6 +39,9 @@
                 ></el-date-picker>
               </el-form-item>
             </el-col>
+            
+          </el-row>
+          <el-row>
             <el-col :span="12">
               <el-form-item label="入职日期" prop="entryDate" :label-width="formLabelWidth">
                 <el-date-picker
@@ -43,8 +52,6 @@
                 ></el-date-picker>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row>
             <el-col :span="12">
               <el-form-item label="工作类型" prop="jobNature" :label-width="formLabelWidth">
                 <el-select v-model.trim="topForm.jobNature" placeholder="工作类型" clearable filterable>
@@ -57,7 +64,10 @@
                 </el-select>
               </el-form-item>
             </el-col>
-            <el-col :span="12">
+           
+          </el-row>
+          <el-row>
+             <el-col :span="12">
               <el-form-item label="所属分部" prop="organId" :label-width="formLabelWidth">
                 <el-select
                   v-model.trim="topForm.organId"
@@ -75,8 +85,6 @@
                 </el-select>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row>
             <el-col :span="12">
               <el-form-item label="流动范围" :label-width="formLabelWidth">
                 <el-select
@@ -95,7 +103,10 @@
                 </el-select>
               </el-form-item>
             </el-col>
-            <el-col :span="12">
+         
+          </el-row>
+          <el-row>
+               <el-col :span="12">
               <el-form-item label="人事状态" prop="isProbationPeriod" :label-width="formLabelWidth">
                 <el-select
                   v-model.trim="topForm.isProbationPeriod"
@@ -108,18 +119,12 @@
                 </el-select>
               </el-form-item>
             </el-col>
-          </el-row>
-          <el-row>
             <el-col :span="12" v-if="pageType == 'update'">
               <el-form-item label="教学点" :label-width="formLabelWidth">
                 <el-input disabled v-model.trim="teacherSchools"></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="12">
-              <el-form-item label="备份名字" :label-width="formLabelWidth">
-                <el-input v-model.trim="topForm.memo"></el-input>
-              </el-form-item>
-            </el-col>
+            
           </el-row>
           <el-row>
             <el-col :span="12">
@@ -355,8 +360,7 @@ export default {
       imageIcon: require("@/assets/images/base/warning.png"),
       rules: {
         realName: [
-          { required: true, message: "请输入姓名", trigger: "blur" },
-          { min: 2, max: 10, message: "请输入 2 到 10 个字符", trigger: "blur" }
+          { required: true, message: "请输入姓名", trigger: "blur" }
         ],
         gender: [{ required: true, message: "请选择性别", trigger: "change" }],
         entryDate: [

+ 86 - 89
src/views/teamDetail/componentCourse/studentWork.vue

@@ -3,105 +3,93 @@
     <el-form :inline="true">
       <el-form-item label="应交学生数">
         <!-- <el-input disabled
-                  :value="studentNum"></el-input> -->
-        <div class="inputStyle">{{  studentNum}}</div>
+        :value="studentNum"></el-input>-->
+        <div class="inputStyle">{{ studentNum}}</div>
       </el-form-item>
       <el-form-item label="已交学生数">
         <!-- <el-input disabled
-                  :value="homeworkNum"></el-input> -->
+        :value="homeworkNum"></el-input>-->
         <div class="inputStyle">{{ homeworkNum}}</div>
       </el-form-item>
       <el-form-item label="已回复数">
         <!-- <el-input disabled
-                  :value="repliedNum"></el-input> -->
+        :value="repliedNum"></el-input>-->
         <div class="inputStyle">{{ repliedNum}}</div>
       </el-form-item>
     </el-form>
     <p class="work">老师布置的作业:{{content}}</p>
     <div class="tableWrap">
-      <el-table :data='tableList'
-                :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-        <el-table-column align='center'
-                         prop="username"
-                         label="学生姓名">
-        </el-table-column>
-        <el-table-column align='center'
-                         prop="phone"
-                         label="手机号">
-        </el-table-column>
-        <el-table-column align='center'
-                         prop="subjectName"
-                         label="声部名称">
-        </el-table-column>
-        <el-table-column align='center'
-                         prop="createTime"
-                         label="交作业时间">
-        </el-table-column>
-        <el-table-column align='center'
-                         prop="isView"
-                         label="是否查看">
+      <el-table :data="tableList" :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+        <el-table-column align="center" prop="username" label="学生姓名"></el-table-column>
+        <el-table-column align="center" prop="phone" label="手机号"></el-table-column>
+        <el-table-column align="center" prop="subjectName" label="声部名称"></el-table-column>
+        <el-table-column align="center" prop="createTime" width="200" label="交作业时间"></el-table-column>
+        <el-table-column align="center" prop="isView" label="是否查看">
           <template slot-scope="scope">
-            <div>
-              {{ scope.row.isView ? '是' : '否' }}
-            </div>
+            <div>{{ scope.row.isView ? '是' : '否' }}</div>
           </template>
         </el-table-column>
-        <el-table-column align='center'
-                         prop="isReplied"
-                         label="是否回复">
+        <el-table-column align="center" prop="isReplied" label="是否回复">
           <template slot-scope="scope">
-            <div>
-              {{ scope.row.isReplied ? '是' : '否' }}
-            </div>
+            <div>{{ scope.row.isReplied ? '是' : '否' }}</div>
           </template>
         </el-table-column>
-        <el-table-column align='center'
-                         label="操作">
+        <el-table-column align="center" label="查看作业" width="200px">
           <template slot-scope="scope">
             <div>
               <!--   -->
-              <el-button type="text"
-                         v-if="scope.row.url"
-                         @click="lookWork(scope.row.url)">查看</el-button>
+              <el-button
+                type="text"
+                v-for="(item,index) in scope.row.urlList"
+                :key="index"
+                @click="lookWork(item)"
+              >{{'作业'+(index+1) }}</el-button>
             </div>
           </template>
-
         </el-table-column>
       </el-table>
-      <pagination :total="rules.total"
-                  :page.sync="rules.page"
-                  :limit.sync="rules.limit"
-                  @pagination="getList" />
+      <pagination
+        :total="rules.total"
+        :page.sync="rules.page"
+        :limit.sync="rules.limit"
+        @pagination="getList"
+      />
     </div>
-    <el-dialog title="查看作业"
-               @close="closeWorkVisible"
-               width="680px"
-               append-to-body
-               :visible.sync="workVisible">
+    <el-dialog
+      title="查看作业"
+      @close="closeWorkVisible"
+      width="680px"
+      append-to-body
+      :visible.sync="workVisible"
+    >
       <!-- activeUrl -->
-      <video style="width:640px;"
-             :src='activeUrl'
-             ref="dialogVideo"
-             controls="controls">
-        您的浏览器不支持视频播放
-      </video>
+      <video
+        style="width:640px;"
+        :src="activeUrl"
+        ref="dialogVideo"
+        controls="controls"
+      >您的浏览器不支持视频播放</video>
     </el-dialog>
   </div>
 </template>
 <script>
-import pagination from '@/components/Pagination/index'
-import { findStudentCourseHomeworks, sumStudentAttendance, getCourseScheduleHomework } from '@/api/buildTeam'
+import pagination from "@/components/Pagination/index";
+import {
+  findStudentCourseHomeworks,
+  sumStudentAttendance,
+  getCourseScheduleHomework
+} from "@/api/buildTeam";
 export default {
-  props: ['courseScheduleId'],
+  props: ["courseScheduleId"],
   components: { pagination },
-  data () {
+  data() {
     return {
       tableList: [],
       rules: {
         // 分页规则
         limit: 10, // 限制显示条数
         page: 1, // 当前页
-        total: 0, // 总条数
+        total: 0 // 总条数
       },
       workVisible: false,
       studentNum: null,
@@ -109,53 +97,62 @@ export default {
       repliedNum: null,
       activeUrl: null,
       content: null
-    }
+    };
   },
-  mounted () {
-    this.init()
+  mounted() {
+    this.init();
   },
-  activated () {
-    this.init()
+  activated() {
+    this.init();
   },
   methods: {
-    init () {
-      sumStudentAttendance({ courseScheduleId: this.courseScheduleId }).then(res => {
-        if (res.code == 200) {
-          this.studentNum = res.data.studentNum;
-          this.homeworkNum = res.data.homeworkNum;
-          this.repliedNum = res.data.repliedNum
+    init() {
+      sumStudentAttendance({ courseScheduleId: this.courseScheduleId }).then(
+        res => {
+          if (res.code == 200) {
+            this.studentNum = res.data.studentNum;
+            this.homeworkNum = res.data.homeworkNum;
+            this.repliedNum = res.data.repliedNum;
+          }
         }
-      })
-      //this.courseScheduleId 
-      // 
+      );
+      //this.courseScheduleId
+      //
 
-      getCourseScheduleHomework({ courseScheduleId: this.courseScheduleId }).then(res => {
+      getCourseScheduleHomework({
+        courseScheduleId: this.courseScheduleId
+      }).then(res => {
         if (res.code == 200) {
           if (res.data) {
-            this.content = res.data.content
+            this.content = res.data.content;
           }
-          this.content ? this.content : this.content = '还未布置作业'
+          this.content ? this.content : (this.content = "还未布置作业");
         }
-      })
-      this.getList()
+      });
+      this.getList();
     },
-    getList () {
-      findStudentCourseHomeworks({ search: this.courseScheduleId }).then(res => {
-        if (res.code == 200) {
-          this.rules.total = res.data.total
-          this.tableList = res.data.rows
+    getList() {
+      findStudentCourseHomeworks({ search: this.courseScheduleId }).then(
+        res => {
+          if (res.code == 200) {
+            this.rules.total = res.data.total;
+            this.tableList = res.data.rows.map(item => {
+              item.urlList = item.url ? item.url.split(",") : [];
+              return item;
+            });
+          }
         }
-      })
+      );
     },
-    lookWork (url) {
+    lookWork(url) {
       this.workVisible = true;
       this.activeUrl = url;
     },
-    closeWorkVisible () {
-      this.activeUrl = '';
+    closeWorkVisible() {
+      this.activeUrl = "";
     }
   }
-}
+};
 </script>
 <style lang="scss" scoped>
 .inputStyle {

+ 23 - 2
src/views/timedTask/index.vue

@@ -46,16 +46,32 @@
             </template>
           </el-table-column>
         </el-table>
+        <pagination
+          :total="pageInfo.total"
+          :page.sync="pageInfo.page"
+          :limit.sync="pageInfo.limit"
+          :page-sizes="pageInfo.page_size"
+          @pagination="__init"
+        />
       </div>
     </div>
   </div>
 </template>
 <script>
+import pagination from "@/components/Pagination/index";
 import { taskList, pause, execute, resume } from '@/api/task'
 export default {
+  components: { pagination },
   data () {
     return {
-      tableData: []
+      tableData: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
     }
   },
   mounted () {
@@ -63,10 +79,15 @@ export default {
   },
   methods: {
     __init () {
-      taskList().then(res => {
+
+      taskList({
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page
+      }).then(res => {
         if(res.code == 200) {
           let result = res.data
           this.tableData = result.rows
+          this.pageInfo.total = result.total;
         }
       })
     },

+ 59 - 3
src/views/vipClass/vipList.vue

@@ -4,8 +4,8 @@
       <div class="squrt"></div>VIP课列表
     </h2>
     <div class="newBand" v-permission="'/buildVip'" @click="gotoBuildVip">新建VIP课</div>
-
     <div class="newBand" v-permission="'export/vipGroupList'" @click="onVIPCourseExport">导出VIP课</div>
+    <div class="newBand" v-permission="'export/vipGroup'" @click="onStudentExport" style="width: 120px;">VIP课程续费提醒</div>
     <div class="m-core">
       <!-- 搜索类型 -->
       <el-form :inline="true" class="searchForm" v-model.trim="searchForm">
@@ -372,7 +372,63 @@ export default {
         url,
         responseType: "blob"
       };
-      this.$confirm("您确定导出报表", "提示", {
+      this.$confirm("您确定导出VIP课吗?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+          load.startLoading()
+          axios(options).then(res => {
+            let blob = new Blob([res.data], {
+              // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
+              type: "application/vnd.ms-excel;charset=utf-8"
+              //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
+            });
+            
+            let text = (new Response(blob)).text()
+            text.then(res => {
+              // 判断是否报错
+              if(res.indexOf('code') != -1) {
+                let json = JSON.parse(res)
+                this.$message.error(json.msg)
+              } else {
+                let objectUrl = URL.createObjectURL(blob);
+                let link = document.createElement("a");
+                let fname = "VIP列表" + new Date().getTime(); //下载文件的名字
+                link.href = objectUrl;
+                link.setAttribute("download", fname);
+                document.body.appendChild(link);
+                link.click();
+              }
+            })
+            load.endLoading();
+          }).catch(error => {
+            this.$message.error('导出数据失败,请连接管理员');
+            load.endLoading();
+          });
+        }).catch(() => {});
+    },
+    onStudentExport() {
+      // 导出VIP课
+      // let searchForm = this.searchForm;
+      let data = {
+        // teacherId: searchForm.teacherId || null,
+        // activityId: searchForm.activityId || null,
+        // organId: searchForm.orgin || null,
+        // status: searchForm.status || null,
+        // search: searchForm.search || null
+      };
+      let url = "/api-web/export/vipGroup";
+      const options = {
+        method: "get",
+        headers: {
+          Authorization: getToken()
+        },
+        params: data,
+        url,
+        responseType: "blob"
+      };
+      this.$confirm("VIP课程续费提醒导出?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning"
@@ -395,7 +451,7 @@ export default {
               } else {
                 let objectUrl = URL.createObjectURL(blob);
                 let link = document.createElement("a");
-                let fname = "VIP列表" + new Date().getTime(); //下载文件的名字
+                let fname = "VIP课程续费提醒" + new Date().getTime(); //下载文件的名字
                 link.href = objectUrl;
                 link.setAttribute("download", fname);
                 document.body.appendChild(link);

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