Browse Source

添加项目

lex-xin 5 years ago
parent
commit
38ac0b0bcf
86 changed files with 1778 additions and 2926 deletions
  1. 1 1
      .gitignore
  2. 1 0
      dist/css/Approval.1d1020cd.css
  3. 1 0
      dist/css/Approval~Attendance~IStarted~Leave~PeriodAdjust~PeriodChange~VIPApply.7837a7c8.css
  4. 0 0
      dist/css/Attendance.60a67af1.css
  5. 0 0
      dist/css/BookingSet.7afd5864.css
  6. 0 0
      dist/css/Business.67499751.css
  7. 0 0
      dist/css/CallNames.ab471200.css
  8. 1 0
      dist/css/CcMe.c2d53cae.css
  9. 1 0
      dist/css/IStarted.9b586437.css
  10. 0 0
      dist/css/Leave.8d3e04dc.css
  11. 1 0
      dist/css/PeriodAdjust.44b41ae7.css
  12. 0 0
      dist/css/PeriodAdjust~PeriodChange.bb1672ef.css
  13. 1 0
      dist/css/PeriodChange.d09c7553.css
  14. 0 0
      dist/css/StartedDetail.28e816fb.css
  15. 0 0
      dist/css/TeachingSchool.6a4d1126.css
  16. 1 0
      dist/css/TeachingSet.291b989a.css
  17. 1 0
      dist/css/VIPApply.6080d9bb.css
  18. 1 0
      dist/css/app.b61557eb.css
  19. 0 0
      dist/css/chunk-vendors.9abab955.css
  20. BIN
      dist/favicon.ico
  21. BIN
      dist/img/1.288e9d00.png
  22. BIN
      dist/img/default_head_img.2565015d.png
  23. BIN
      dist/img/icon_nodata.81c87d57.png
  24. 0 0
      dist/index.html
  25. 0 0
      dist/js/Approval.551487db.js
  26. 0 0
      dist/js/Approval.551487db.js.map
  27. 0 0
      dist/js/Approval~Attendance~IStarted~Leave~PeriodAdjust~PeriodChange~VIPApply.6c1a6d43.js
  28. 0 0
      dist/js/Approval~Attendance~IStarted~Leave~PeriodAdjust~PeriodChange~VIPApply.6c1a6d43.js.map
  29. 0 0
      dist/js/Attendance.273c9bd7.js
  30. 0 0
      dist/js/Attendance.273c9bd7.js.map
  31. 0 0
      dist/js/BookingSet.9287a340.js
  32. 0 0
      dist/js/BookingSet.9287a340.js.map
  33. 0 0
      dist/js/Business.17393950.js
  34. 0 0
      dist/js/Business.17393950.js.map
  35. 0 0
      dist/js/CallNames.99565f8e.js
  36. 0 0
      dist/js/CallNames.99565f8e.js.map
  37. 0 0
      dist/js/CcMe.733de730.js
  38. 0 0
      dist/js/CcMe.733de730.js.map
  39. 0 0
      dist/js/IStarted.1a393c93.js
  40. 0 0
      dist/js/IStarted.1a393c93.js.map
  41. 0 0
      dist/js/Leave.0284a25a.js
  42. 0 0
      dist/js/Leave.0284a25a.js.map
  43. 0 0
      dist/js/PeriodAdjust.8ebb2ef4.js
  44. 0 0
      dist/js/PeriodAdjust.8ebb2ef4.js.map
  45. 0 0
      dist/js/PeriodAdjust~PeriodChange.393c26ed.js
  46. 0 0
      dist/js/PeriodAdjust~PeriodChange.393c26ed.js.map
  47. 2 0
      dist/js/PeriodChange.b21f744c.js
  48. 0 0
      dist/js/PeriodChange.b21f744c.js.map
  49. 0 0
      dist/js/StartedDetail.40db3655.js
  50. 0 0
      dist/js/StartedDetail.40db3655.js.map
  51. 0 0
      dist/js/TeachingSchool.e47c2fae.js
  52. 0 0
      dist/js/TeachingSchool.e47c2fae.js.map
  53. 0 0
      dist/js/TeachingSet.b359e610.js
  54. 0 0
      dist/js/TeachingSet.b359e610.js.map
  55. 0 0
      dist/js/VIPApply.15d0c543.js
  56. 0 0
      dist/js/VIPApply.15d0c543.js.map
  57. 0 0
      dist/js/app.c0f9a616.js
  58. 0 0
      dist/js/app.c0f9a616.js.map
  59. 0 0
      dist/js/chunk-vendors.5499d64e.js
  60. 0 0
      dist/js/chunk-vendors.5499d64e.js.map
  61. 0 77
      src/api/student.js
  62. 189 0
      src/api/teacher.js
  63. BIN
      src/assets/images/default_head_img.png
  64. 15 6
      src/common/axios.js
  65. 18 17
      src/common/common.js
  66. 54 0
      src/common/vueFilters.js
  67. 25 10
      src/components/MCalendar.vue
  68. 0 247
      src/components/SmallProtocol.vue
  69. 1 0
      src/main.js
  70. 2 60
      src/router/index.js
  71. 0 303
      src/views/student/Register.vue
  72. 0 862
      src/views/student/RegisterPayment.vue
  73. 0 618
      src/views/student/Renew.vue
  74. 0 144
      src/views/student/Special.vue
  75. 0 89
      src/views/student/SpecialDetail.vue
  76. 0 123
      src/views/student/paymentResult.vue
  77. 0 189
      src/views/student/smallRegister.vue
  78. 111 25
      src/views/teacher/Approval.vue
  79. 5 1
      src/views/teacher/Attendance.vue
  80. 5 8
      src/views/teacher/Business.vue
  81. 72 16
      src/views/teacher/IStarted.vue
  82. 222 55
      src/views/teacher/Leave.vue
  83. 183 39
      src/views/teacher/PeriodAdjust.vue
  84. 47 2
      src/views/teacher/PeriodChange.vue
  85. 805 29
      src/views/teacher/VIPApply.vue
  86. 12 5
      vue.config.js

+ 1 - 1
.gitignore

@@ -1,6 +1,6 @@
 .DS_Store
 node_modules
-/dist
+# /dist
 
 # local env files
 .env.local

+ 1 - 0
dist/css/Approval.1d1020cd.css

@@ -0,0 +1 @@
+.icon[data-v-30afa9a9]{width:2rem;height:2rem;margin:.5rem auto .3rem}.icon_nodata[data-v-30afa9a9]{background:url(../img/icon_nodata.81c87d57.png) no-repeat 50%;background-size:contain}.msg[data-v-30afa9a9]{color:#aaa;font-size:.16rem;text-align:center;line-height:.22rem}.approval[data-v-51185b86]{min-height:100vh}[data-v-51185b86] .van-tab--active{color:#ef5a50}[data-v-51185b86] .van-tabs__line{background-color:#14928a}.app-item[data-v-51185b86]{margin:0 .16rem .1rem;background:#fff;border-radius:.1rem;font-size:.14rem}.app-item[data-v-51185b86]:first-child{margin-top:.1rem}.app-item .hd[data-v-51185b86]{padding:.1rem .15rem .1rem .19rem;border-bottom:1px solid #f5f5f5;color:#777;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.app-item .bd[data-v-51185b86]{padding:.12rem .15rem .2rem .19rem;line-height:.2rem}

+ 1 - 0
dist/css/Approval~Attendance~IStarted~Leave~PeriodAdjust~PeriodChange~VIPApply.7837a7c8.css

@@ -0,0 +1 @@
+.mheader[data-v-61d0e2e4]{height:.44rem;overflow:hidden}.m-nav-header[data-v-61d0e2e4]{position:absolute;left:0;top:0;width:100%;height:.44rem;line-height:.44rem;background-color:#14928a;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#fff}.m-nav-header.fixed[data-v-61d0e2e4]{position:fixed;z-index:99}.m-nav-header .m-nav-bar__title[data-v-61d0e2e4]{max-width:60%;margin:0 auto;color:#fff;font-weight:500;font-size:.16rem}.m-nav-header .m-nav-bar__left[data-v-61d0e2e4],.m-nav-header .m-nav-bar__right[data-v-61d0e2e4]{position:absolute;bottom:0}.m-nav-header .m-nav-bar__left[data-v-61d0e2e4]{left:.12rem}.m-nav-header .m-nav-bar__left .arrow-left[data-v-61d0e2e4]{font-size:.21rem;vertical-align:middle}.m-nav-header .m-nav-bar__right[data-v-61d0e2e4]{right:.12rem}

File diff suppressed because it is too large
+ 0 - 0
dist/css/Attendance.60a67af1.css


File diff suppressed because it is too large
+ 0 - 0
dist/css/BookingSet.7afd5864.css


File diff suppressed because it is too large
+ 0 - 0
dist/css/Business.67499751.css


File diff suppressed because it is too large
+ 0 - 0
dist/css/CallNames.ab471200.css


+ 1 - 0
dist/css/CcMe.c2d53cae.css

@@ -0,0 +1 @@
+.mheader[data-v-61d0e2e4]{height:.44rem;overflow:hidden}.m-nav-header[data-v-61d0e2e4]{position:absolute;left:0;top:0;width:100%;height:.44rem;line-height:.44rem;background-color:#14928a;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#fff}.m-nav-header.fixed[data-v-61d0e2e4]{position:fixed;z-index:99}.m-nav-header .m-nav-bar__title[data-v-61d0e2e4]{max-width:60%;margin:0 auto;color:#fff;font-weight:500;font-size:.16rem}.m-nav-header .m-nav-bar__left[data-v-61d0e2e4],.m-nav-header .m-nav-bar__right[data-v-61d0e2e4]{position:absolute;bottom:0}.m-nav-header .m-nav-bar__left[data-v-61d0e2e4]{left:.12rem}.m-nav-header .m-nav-bar__left .arrow-left[data-v-61d0e2e4]{font-size:.21rem;vertical-align:middle}.m-nav-header .m-nav-bar__right[data-v-61d0e2e4]{right:.12rem}[data-v-63ddf5bb] .van-tab--active{color:#ef5a50}[data-v-63ddf5bb] .van-tabs__line{background-color:#14928a}.app-item[data-v-63ddf5bb]{margin:0 .16rem .1rem;background:#fff;border-radius:.1rem;font-size:.14rem}.app-item[data-v-63ddf5bb]:first-child{margin-top:.1rem}.app-item .hd[data-v-63ddf5bb]{padding:.1rem .15rem .1rem .19rem;border-bottom:1px solid #f5f5f5;color:#777;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.app-item .bd[data-v-63ddf5bb]{padding:.12rem .15rem .2rem .19rem;line-height:.2rem}

+ 1 - 0
dist/css/IStarted.9b586437.css

@@ -0,0 +1 @@
+.squrt{width:.14rem;height:.12rem;margin-left:.1rem}.van-search{padding:.13rem .16rem}/deep/ .van-search__action{color:#777}.icon[data-v-30afa9a9]{width:2rem;height:2rem;margin:.5rem auto .3rem}.icon_nodata[data-v-30afa9a9]{background:url(../img/icon_nodata.81c87d57.png) no-repeat 50%;background-size:contain}.msg[data-v-30afa9a9]{color:#aaa;font-size:.16rem;text-align:center;line-height:.22rem}.istarted[data-v-600fd6ec]{min-height:100vh}.app-item[data-v-600fd6ec]{margin:0 .16rem .1rem;background:#fff;border-radius:.1rem;font-size:.14rem;display:block}.app-item[data-v-600fd6ec]:first-child{margin-top:.1rem}.app-item .hd[data-v-600fd6ec]{padding:.1rem .15rem .1rem .19rem;border-bottom:1px solid #f5f5f5;color:#777;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.app-item .bd[data-v-600fd6ec]{padding:.12rem .15rem .2rem .19rem;line-height:.2rem}

File diff suppressed because it is too large
+ 0 - 0
dist/css/Leave.8d3e04dc.css


+ 1 - 0
dist/css/PeriodAdjust.44b41ae7.css

@@ -0,0 +1 @@
+.periodadjust[data-v-696cd78c]{min-height:100vh;position:relative}.periodadjust .container[data-v-696cd78c]{min-height:calc(100vh - 60px)}.periodadjust .button-group[data-v-696cd78c]{width:100%;position:absolute;bottom:0;left:0}.periodadjust .button-group .van-button[data-v-696cd78c]{font-size:.16rem;width:50%}.periodadjust .button-group .van-button--primary[data-v-696cd78c]{background:#14928a}[data-v-696cd78c] .van-cell__title{font-size:.16rem;color:#444}[data-v-696cd78c] .van-cell-group{margin-top:.05rem}.title-content[data-v-696cd78c]{-webkit-box-flex:1;-ms-flex:1 auto;flex:1 auto;font-weight:700}.title-content .van-cell__label[data-v-696cd78c]{font-weight:400;margin-top:.06rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.title-content .van-icon-location[data-v-696cd78c]{margin-right:.05rem}[data-v-696cd78c] .van-cell__label,[data-v-696cd78c] .van-cell__value{color:#777;font-size:.14rem}[data-v-696cd78c] .van-cell__label span,[data-v-696cd78c] .van-cell__value span{padding-right:.1rem}.input-cell[data-v-696cd78c]{padding:.12rem .16rem .2rem}.input-cell .van-radio[data-v-696cd78c]{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}[data-v-696cd78c] .van-radio__icon .van-icon{border-color:#aaa}[data-v-696cd78c] .van-radio__icon--checked .van-icon{background:#f97215;border-color:#f97215}[data-v-696cd78c] .icon{margin-top:.2rem}

File diff suppressed because it is too large
+ 0 - 0
dist/css/PeriodAdjust~PeriodChange.bb1672ef.css


+ 1 - 0
dist/css/PeriodChange.d09c7553.css

@@ -0,0 +1 @@
+[data-v-39898267] .van-cell__title{font-size:.16rem;color:#444}[data-v-39898267] .van-cell-group{margin-top:.05rem}.title-content[data-v-39898267]{font-weight:700}.title-content .van-cell__label[data-v-39898267]{font-weight:400;margin-top:.06rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.title-content .van-icon-location[data-v-39898267]{margin-right:.05rem}[data-v-39898267] .van-cell__label,[data-v-39898267] .van-cell__value{color:#777}[data-v-39898267] .van-cell__label span,[data-v-39898267] .van-cell__value span{padding-right:.1rem}

File diff suppressed because it is too large
+ 0 - 0
dist/css/StartedDetail.28e816fb.css


File diff suppressed because it is too large
+ 0 - 0
dist/css/TeachingSchool.6a4d1126.css


+ 1 - 0
dist/css/TeachingSet.291b989a.css

@@ -0,0 +1 @@
+.mheader[data-v-61d0e2e4]{height:.44rem;overflow:hidden}.m-nav-header[data-v-61d0e2e4]{position:absolute;left:0;top:0;width:100%;height:.44rem;line-height:.44rem;background-color:#14928a;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#fff}.m-nav-header.fixed[data-v-61d0e2e4]{position:fixed;z-index:99}.m-nav-header .m-nav-bar__title[data-v-61d0e2e4]{max-width:60%;margin:0 auto;color:#fff;font-weight:500;font-size:.16rem}.m-nav-header .m-nav-bar__left[data-v-61d0e2e4],.m-nav-header .m-nav-bar__right[data-v-61d0e2e4]{position:absolute;bottom:0}.m-nav-header .m-nav-bar__left[data-v-61d0e2e4]{left:.12rem}.m-nav-header .m-nav-bar__left .arrow-left[data-v-61d0e2e4]{font-size:.21rem;vertical-align:middle}.m-nav-header .m-nav-bar__right[data-v-61d0e2e4]{right:.12rem}.el-vue-amap-container[data-v-e288070e]{height:60vh}[data-v-e288070e] .van-sticky--fixed{top:.44rem!important}[data-v-e288070e] .van-search{position:fixed;top:.44rem!important;right:0;left:0;z-index:99;padding:.1rem .23rem}[data-v-e288070e] .van-search .van-cell{padding:.12rem}[data-v-e288070e] .van-search .van-field__control{font-size:.16rem}[data-v-e288070e] .van-search .van-search__content{border-radius:.5rem;background:#fff;-webkit-box-shadow:0 4px 8px 0 rgba(0,0,0,.08),0 0 1px 0 rgba(0,0,0,.08);box-shadow:0 4px 8px 0 rgba(0,0,0,.08),0 0 1px 0 rgba(0,0,0,.08)}[data-v-e288070e] .van-search .van-icon-search{font-size:.2rem;font-weight:700;color:#14928a}.button-group[data-v-e288070e]{margin:.3rem .26rem .2rem}.button-group .van-button--primary[data-v-e288070e]{background:#14928a;font-size:.18rem}

+ 1 - 0
dist/css/VIPApply.6080d9bb.css

@@ -0,0 +1 @@
+.vip-title[data-v-54c8f25b]{padding:.06rem 0 .04rem;font-size:.12rem;color:#444;text-align:center}.add-plan[data-v-54c8f25b]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:.2rem 0;font-size:.16rem;color:#777}.add-plan .van-icon[data-v-54c8f25b]{margin-right:.05rem;font-size:.2rem}.title-time[data-v-54c8f25b]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:1;-ms-flex:1 auto;flex:1 auto;color:#4a4a4a}.title-time .online[data-v-54c8f25b]{color:#777}.title-time .week[data-v-54c8f25b]{padding-left:.4rem;padding-right:.15rem}[data-v-54c8f25b] .van-cell__value,[data-v-54c8f25b] .van-field__label{-webkit-box-flex:1;-ms-flex:1 auto;flex:1 auto}[data-v-54c8f25b] .van-field__control:disabled{color:#6a6969}.button-group[data-v-54c8f25b]{margin:.3rem .26rem .2rem}.button-group .van-button--primary[data-v-54c8f25b]{background:#14928a;font-size:.18rem}.van-row[data-v-54c8f25b]{line-height:.4rem;border-top:1px solid #edeef0;text-align:center;font-size:.14rem}.van-row[data-v-54c8f25b]:first-child{border-top:0;background:#edeef0;color:#444;font-size:.15rem}.tableContainer[data-v-54c8f25b]{max-height:2.44rem;overflow:auto}.tableContainer .van-row[data-v-54c8f25b]{color:#444}.tableContainer .van-row[data-v-54c8f25b]:first-child{border-top:0;background:#fff;font-size:.14rem}

+ 1 - 0
dist/css/app.b61557eb.css

@@ -0,0 +1 @@
+.m-shadow{-webkit-box-shadow:0 0 .17rem 0 hsla(0,0%,79.2%,.42);box-shadow:0 0 .17rem 0 hsla(0,0%,79.2%,.42)}.m-shadow-small{-webkit-box-shadow:0 .04rem .06rem 0 rgba(0,0,0,.1);box-shadow:0 .04rem .06rem 0 rgba(0,0,0,.1)}.m-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}[v-cloak]{display:none}[class*=m-hairline]:after{position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #ebedf0;-webkit-transform:scale(.5);transform:scale(.5)}.orangeStatus{color:#f97215!important}.redStatus{color:#f85043!important}.blueStatus{color:#14928a!important}.defaultStatus{color:#777!important}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#f3f4f8;overflow-x:hidden;overflow-y:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slide-left-enter-active,.slide-left-leave-active,.slide-right-enter-active,.slide-right-leave-active{-webkit-will-change:transform;will-change:transform;-webkit-transition:all .5s;transition:all .5s;position:fixed;top:0;left:0;right:0}.slide-right-enter{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-enter,.slide-right-leave-active{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-leave-active{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.fade-enter-active,.fade-leave-active{-webkit-transition:opacity .5s;transition:opacity .5s}.fade-enter,.fade-leave-active{opacity:0}

File diff suppressed because it is too large
+ 0 - 0
dist/css/chunk-vendors.9abab955.css


BIN
dist/favicon.ico


BIN
dist/img/1.288e9d00.png


BIN
dist/img/default_head_img.2565015d.png


BIN
dist/img/icon_nodata.81c87d57.png


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


File diff suppressed because it is too large
+ 0 - 0
dist/js/Approval.551487db.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/Approval.551487db.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/Approval~Attendance~IStarted~Leave~PeriodAdjust~PeriodChange~VIPApply.6c1a6d43.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/Approval~Attendance~IStarted~Leave~PeriodAdjust~PeriodChange~VIPApply.6c1a6d43.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/Attendance.273c9bd7.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/Attendance.273c9bd7.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/BookingSet.9287a340.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/BookingSet.9287a340.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/Business.17393950.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/Business.17393950.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/CallNames.99565f8e.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/CallNames.99565f8e.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/CcMe.733de730.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/CcMe.733de730.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/IStarted.1a393c93.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/IStarted.1a393c93.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/Leave.0284a25a.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/Leave.0284a25a.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/PeriodAdjust.8ebb2ef4.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/PeriodAdjust.8ebb2ef4.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/PeriodAdjust~PeriodChange.393c26ed.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/PeriodAdjust~PeriodChange.393c26ed.js.map


+ 2 - 0
dist/js/PeriodChange.b21f744c.js

@@ -0,0 +1,2 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["PeriodChange"],{2781:function(t,e,a){"use strict";var n=a("6c91"),o=a.n(n);o.a},"6c91":function(t,e,a){},e9f9:function(t,e,a){"use strict";a.r(e);var n=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"periodchange"},[a("m-header"),t.isCalendar?a("m-calendar",{attrs:{dataList:t.getMonthDay},on:{onSelectDay:t.onSelectDay}}):t._e(),t._l(5,function(e){return a("van-cell-group",{key:e},[a("van-cell",{attrs:{icon:"underway-o",center:!0}},[a("template",{slot:"default"},[t._v("未签到")]),a("template",{slot:"title"},[t._v("15:00-15:45")])],2),a("van-cell",{attrs:{"title-class":"title-content",center:!0}},[a("template",{slot:"title"},[t._v("【乐团课】乐理知识(一)")]),a("template",{slot:"label"},[a("van-icon",{attrs:{name:"location"}}),t._v("\n                武汉市武昌区哈吃几口茶")],1)],2)],1)})],2)},o=[],r=(a("ac6a"),a("6e6e")),c=a("47ad"),s=a("d678"),i=a("9afb"),l={name:"periodchange",components:{MHeader:r["a"],MCalendar:c["a"],MEmpty:s["a"]},data:function(){return{getMonthDay:[],isCalendar:!1}},mounted:function(){var t=this.getFormartDate(new Date);this.getCourseDate(t),this.getCourseMonth(t)},methods:{onSelectDay:function(t){this.getCourseDate(this.getFormartDate(t))},getCourseDate:function(t){var e=this;Object(i["h"])({date:t,type:"VIP"}).then(function(t){var a=t.data;200==a.code&&a.data&&(e.dataList=a.data.rows,e.dataShow=a.data.rows.length>0)})},getCourseMonth:function(t){var e=this;Object(i["g"])({month:t,type:"VIP"}).then(function(t){var a=t.data;200==a.code&&(a.data.forEach(function(t){var a=new Date(t);e.getMonthDay.push(a.getDate())}),e.isCalendar=!0)})},getFormartDate:function(t){var e=new Date(t),a=e.getFullYear()+"-"+(e.getMonth()+1)+"-"+e.getDate();return a}}},u=l,d=(a("2781"),a("2877")),h=Object(d["a"])(u,n,o,!1,null,"39898267",null);e["default"]=h.exports}}]);
+//# sourceMappingURL=PeriodChange.b21f744c.js.map

File diff suppressed because it is too large
+ 0 - 0
dist/js/PeriodChange.b21f744c.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/StartedDetail.40db3655.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/StartedDetail.40db3655.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/TeachingSchool.e47c2fae.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/TeachingSchool.e47c2fae.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/TeachingSet.b359e610.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/TeachingSet.b359e610.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/js/VIPApply.15d0c543.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/VIPApply.15d0c543.js.map


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


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


File diff suppressed because it is too large
+ 0 - 0
dist/js/chunk-vendors.5499d64e.js


File diff suppressed because it is too large
+ 0 - 0
dist/js/chunk-vendors.5499d64e.js.map


+ 0 - 77
src/api/student.js

@@ -1,77 +0,0 @@
-const axios = require('@/common/axios').default
-// import qs from 'qs'
-// import axios from '@/common/axios'
-// console.log(axios)
-
-// 获取乐团报名所需信息
-const getMusicGroupRegInfo = (data) => {
-    return axios({
-        url: '/student-server/register/getMusicGroupRegInfo',
-        method: 'get',
-        params: data
-    })
-}
-
-// 获取乐团报名所需信息
-const registerAdd = (data) => {
-    return axios({
-        url: '/student-server/register/add',
-        method: 'post',
-        data: data
-    })
-}
-
-// 获取乐团声部费用信息及乐器和辅件
-const getSubjectGoodsAndInfo = (data) => {
-    return axios({
-        url: '/student-server/musicGroup/getSubjectGoodsAndInfo',
-        method: 'get',
-        params: data
-    })
-}
-
-// 乐团报名支付
-const musicGroupPay = (data) => {
-    return axios({
-        url: '/student-server/musicGroup/pay',
-        method: 'post',
-        data: data
-    })
-}
-
-// 资讯列表分页查询
-const newsList = (data) => {
-    return axios({
-        url: '/api-cms/news/list',
-        method: 'get',
-        params: data
-    })
-}
-
-// 查询资讯详情
-const newsQuery = (data) => {
-    return axios({
-        url: '/api-cms/news/query/' + data.id,
-        method: 'get',
-        params: data
-    })
-}
-
-
-const queryGoodsContract = (data) => {
-    return axios({
-        url: '/contracts/queryGoodsContract',
-        method: 'get',
-        params: data
-    })
-}
-
-export {
-    getMusicGroupRegInfo,
-    registerAdd,
-    getSubjectGoodsAndInfo,
-    musicGroupPay,
-    newsList,
-    newsQuery,
-    queryGoodsContract
-}

+ 189 - 0
src/api/teacher.js

@@ -0,0 +1,189 @@
+const axios = require('@/common/axios').default
+import qs from 'qs'
+// import axios from '@/common/axios'
+// console.log(axios)
+const api = '/teacher-server'
+// const api2 = '/web-server'
+
+// 查询我发起的任务列表
+const queryMyCreatedList = (data) => {
+    return axios({
+        url: api + '/snaker/task/queryMyCreatedList',
+        method: 'get',
+        params: data
+    })
+}
+
+// 查询我待办任务列表
+const queryWaitList = (data) => {
+    return axios({
+        url: api + '/snaker/task/queryWaitList',
+        method: 'get',
+        params: data
+    })
+}
+
+// 查询我已办任务列表
+const queryProcessedList = (data) => {
+    return axios({
+        url: api + '/snaker/task/queryProcessedList',
+        method: 'get',
+        params: data
+    })
+}
+
+// 活动分类
+const findSubSubjects = (data) => {
+    return axios({
+        url: api + '/subject/findSubSubjects',
+        method: 'get',
+        params: data
+    })
+}
+
+// vip课类别
+const vipGroupCategory = (data) => {
+    return axios({
+        url: api + '/vipGroupCategory/queryAll',
+        method: 'get',
+        params: data
+    })
+}
+
+// 根据课程类型获取对应课程活动方案
+const findByVipGroupCategory = (data) => {
+    return axios({
+        url: api + '/vipGroupActivity/findByVipGroupCategory',
+        method: 'get',
+        params: data
+    })
+}
+
+// 获取教师vip课教学点
+const findVipSchoolByTeacher = (data) => {
+    return axios({
+        url: api + '/teacher/findVipSchoolByTeacher',
+        method: 'get',
+        params: data
+    })
+}
+
+// 根据老师编号及课程类型编号获取默认课酬
+const findByTeacherAndCategory = (data) => {
+    return axios({
+        url: api + '/teacherDefaultVipGroupSalary/findByTeacherAndCategory',
+        method: 'get',
+        params: data
+    })
+}
+
+// vip课申请
+const vipGroupApply = (data) => {
+    return axios({
+        url: api + '/teacherVipGroup/vipGroupApply',
+        method: 'post',
+        data: data
+    })
+}
+
+// 查询vip课列表
+const queryVipCourseScheduleList = (data) => {
+    return axios({
+        url: api + '/teacherLeaveRecord/queryVipCourseScheduleList',
+        method: 'get',
+        params: data
+    })
+}
+
+// 分页查询请假类型列表
+const leaveCategoryPage = (data) => {
+    return axios({
+        url: api + '/leaveCategory/queryPage',
+        method: 'post',
+        data: data
+    })
+}
+
+// 请假
+const askForLeave = (data) => {
+    return axios({
+        url: api + '/teacherLeaveRecord/askForLeave',
+        method: 'post',
+        data: qs.stringify(data)
+    })
+}
+
+// 根据日期获取当日排课
+const getCourseSchedulesWithDate = (data) => {
+    return axios({
+        url: api + '/teacherCourseSchedule/getCourseSchedulesWithDate',
+        method: 'get',
+        params: data
+    })
+}
+
+// 根据月份获取该月有课的日期
+const getCourseScheduleDateByMonth = (data) => {
+    return axios({
+        url: api + '/teacherCourseSchedule/getCourseScheduleDateByMonth',
+        method: 'get',
+        params: data
+    })
+}
+
+// 课时调整
+const classStartDateAdjust = (data) => {
+    return axios({
+        url: api + '/teacherCourseSchedule/classStartDateAdjust',
+        method: 'post',
+        data: qs.stringify(data)
+    })
+}
+
+// 课时交换
+const courseSwap = (data) => {
+    return axios({
+        url: api + '/teacherCourseSchedule/courseSwap',
+        method: 'post',
+        data: qs.stringify(data)
+    })
+}
+
+// 历史考勤统计-头信息
+const statisticsInfo = (data) => {
+    return axios({
+        url: api + '/teacherCourseSchedule/statisticsInfo',
+        method: 'post',
+        data: qs.stringify(data)
+    })
+}
+
+// 历史考勤统计-考勤列表
+const statisticsList = (data) => {
+    return axios({
+        url: api + '/teacherCourseSchedule/statisticsList',
+        method: 'post',
+        data: qs.stringify(data)
+    })
+}
+
+export {
+    queryMyCreatedList,
+    queryWaitList,
+    queryProcessedList,
+    findSubSubjects,
+    vipGroupCategory,
+    findByVipGroupCategory,
+    findVipSchoolByTeacher,
+    findByTeacherAndCategory,
+    vipGroupApply,
+    queryVipCourseScheduleList,
+    leaveCategoryPage,
+    askForLeave,
+    getCourseSchedulesWithDate,
+    getCourseScheduleDateByMonth,
+    classStartDateAdjust,
+    courseSwap,
+    statisticsInfo,
+    statisticsList
+}

BIN
src/assets/images/default_head_img.png


+ 15 - 6
src/common/axios.js

@@ -31,9 +31,16 @@ _axios.interceptors.request.use(
   function(config) {
     // Do something before request is sent
     // 判断用户是否登录
-    let userInfo = localStorage.getItem('Authorization')
-    if(userInfo) {
-      config.headers['Authorization'] = userInfo
+    if(browser().android || browser().iPhone) { // app里面
+      let userInfo = localStorage.getItem('Authorization')
+      if(userInfo) {
+        config.headers['Authorization'] = userInfo
+      }
+    } else { // 网页里面
+      let auth = localStorage.getItem('userInfo')
+      if(auth) {
+        config.headers['Authorization'] = auth
+      }
     }
     return config;
   },
@@ -49,9 +56,11 @@ _axios.interceptors.response.use(
     // Do something with response data
     if(response.data.code == 403 || response.data.code == 403) {
       window.localStorage.removeItem('userInfo') // 删除用户信息
-      if(browser().android || browser().ios) {
-        // android ios 注册方法
-        DAYA.postMessage(JSON.stringify({api: 'back'}))
+      // android ios 注册方法
+      if(browser().android) {
+          DAYA.postMessage(JSON.stringify({api: 'back'}))
+      } else if(browser().iPhone) {
+          window.webkit.messageHandlers.DAYA.postMessage(JSON.stringify({api: 'back'}))
       }
     }
     return response;

+ 18 - 17
src/common/common.js

@@ -1,22 +1,23 @@
 const browser = () => {
-    var u = navigator.userAgent
-    //   app = navigator.appVersion;
-    return {
-      trident: u.indexOf('Trident') > -1, //IE内核
-      presto: u.indexOf('Presto') > -1, //opera内核
-      webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
-      gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,//火狐内核
-      mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
-      ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
-      android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, //android终端
-      iPhone: u.indexOf('iPhone') > -1 , //是否为iPhone或者QQHD浏览器
-      iPad: u.indexOf('iPad') > -1, //是否iPad
-      webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
-      weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
-      qq: u.match(/\sQQ/i) == " qq" //是否QQ
-    }
+  var u = navigator.userAgent
+  //   app = navigator.appVersion;
+  return {
+    trident: u.indexOf('Trident') > -1, //IE内核
+    presto: u.indexOf('Presto') > -1, //opera内核
+    webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
+    gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,//火狐内核
+    mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
+    ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
+    // ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
+    android: u.indexOf('DAYAAPPA') > -1 || u.indexOf('Adr') > -1, //android终端
+    iPhone: u.indexOf('DAYAAPPI') > -1 , //是否为iPhone或者QQHD浏览器
+    iPad: u.indexOf('iPad') > -1, //是否iPad
+    webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
+    weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
+    qq: u.match(/\sQQ/i) == " qq" //是否QQ
+  }
 }
 
 export {
-    browser
+  browser
 }

+ 54 - 0
src/common/vueFilters.js

@@ -0,0 +1,54 @@
+import Vue from 'vue'
+
+// 乐团状态
+Vue.filter('bandStatus', value => {
+    let templateStatus = {
+        APPLY: '报名中',
+        PAY: '缴费中',
+        PREPARE: '筹备中',
+        UNDERWAY: '进行中',
+        CANCELED: '取消'
+    }
+    return templateStatus[value]
+})
+
+// 合并数组
+Vue.filter('joinArray', (value, type) => {
+    if(!type) {
+        type = ' '
+    }
+    if(typeof value == 'object' && value != null) {
+        return value.join(type)
+    } else {
+        return value
+    }
+})
+
+// 数据类型
+Vue.filter('dataStatusCN', value => {
+    let templateStatus = {
+        '到课': '',
+        '请假': 'truant',
+        '旷课': 'leave'
+    }
+    return templateStatus[value]
+})
+
+// 考勤类型
+Vue.filter('clockingIn', value => {
+    let templateStatus = {
+        NORMAL: "正常",
+        TRUANT: "旷课",
+        LEAVE: "请假",
+        QUIT_SCHOOL: "休学",
+        DROP_OUT: "退学"
+    }
+    return templateStatus[value]
+})
+
+Vue.filter('formatDate', value => {
+    let d = new Date(value)
+    let hour = d.getHours() >= 10 ? d.getHours() : '0' + d.getHours()
+    let minute = d.getMinutes() >= 10 ? d.getMinutes() : '0' + d.getMinutes()
+    return hour + ':' + minute
+})

+ 25 - 10
src/components/MCalendar.vue

@@ -28,6 +28,7 @@
                         <div :key="index" :class="[calendarType == 'small' ? 'small' : '', 'td']">
                             <span @click.stop="onSelectDay(i)"
                             :class="[i.disabled ? 'disabled' : '',
+                                    i.noCheck? 'noCheck' : '',
                                     i.toDay ? 'today' : '',
                                     i.nowDate == selectElement ? 'active' : '']">{{ i.dayNum }}</span>
                         </div>
@@ -47,7 +48,7 @@ export default {
         dataList: {
             type: Array,
             default() {
-                return [1, 5, 8, 10]
+                return []
             }
         },
         type: {
@@ -157,10 +158,19 @@ export default {
                     tDisabled = 1
                 }
             }
+            let noCheck = true // 是否可以选中
+            if(this.dataList.length > 0) {
+                this.dataList.forEach(item => {
+                    if(item == d) {
+                        noCheck = false
+                    }
+                })
+            }
             return {
                 dayNum: d,
                 monthType: f,
                 disabled: tDisabled, // 是否是当月
+                noCheck: noCheck, // 是否可选
                 toDay: toDay,
                 nowDate: new Date(y, m - 1, d) // 当前日期
             }
@@ -224,11 +234,9 @@ export default {
             // 在本周当天之前的日期
             for (let p = (firstWeek - 1); p > 0; p--, count++) {
                 let tempD = new Date(year, month - 1, day - p)
-
                 let pYear = tempD.getFullYear()
                 let pMonth = tempD.getMonth() + 1
                 let pDay = tempD.getDate()
-                // console.log(`pYear: ${pYear}, pMonth: ${pMonth}, pDay: ${pDay}`)
                 days.push(this.getDayItem(pYear, pMonth, pDay, CURR_FLAG))
             }
             // 当天日期
@@ -237,7 +245,6 @@ export default {
             // 在本周当天之后的日期
             for (let n = 1; n <= (7 - count); n++) {
                 let tempD = new Date(year, month - 1, day + n)
-
                 let nYear = tempD.getFullYear()
                 let nMonth = tempD.getMonth() + 1
                 let nDay = tempD.getDate()
@@ -359,8 +366,8 @@ export default {
             // }
         },
         onSelectDay(item) {
-            // 除了当月其它月份不能点击
-            if(item.monthType == 2) {
+            // 除了当月其它月份不能点击, 可选日期
+            if(item.monthType == 2 && !item.noCheck) {
                 this.selectElement = item.nowDate
                 // 暴露出方法
                 this.$emit('onSelectDay', item.nowDate)
@@ -379,9 +386,14 @@ export default {
         }
     },
     computed: {
-      swiper() {
-        return this.$refs.mySwiper.swiper
-      }
+        swiper() {
+            return this.$refs.mySwiper.swiper
+        }
+    },
+    watch: {
+        dataList(newValue, oldValue) {
+            console.log(true)
+        }
     },
     mounted() {
         // 选择不同的日历类型
@@ -475,7 +487,10 @@ export default {
             border-radius: 50%;
             line-height: .36rem;
             &.disabled { // 如果不是当月则不显示
-                color: transparent;
+                color: transparent !important;
+            }
+            &.noCheck {
+                color: #ccc;
             }
             &.today::before {
                 content: '今';

+ 0 - 247
src/components/SmallProtocol.vue

@@ -1,247 +0,0 @@
-<template>
-    <div class="smallprotocol">
- 
-        <div class="container">
-            <h1>《课程服务协议》</h1>
-            甲方:深圳大雅乐盟网络教育股份有限公司 <br/>
-            <div style="display: flex;">乙方:
-                <div style="flex: 1 auto;">
-                    <div class="iInfo">
-                        <span>家长姓名 {{ dataList.pName }}</span>
-                        <span>电话:{{ dataList.mobile }}</span>
-                    </div>
-                    <!-- <div class="iInfo">
-                        <span>单位: {{ dataList.pCompany }}</span>
-                    </div> -->
-                    <div class="iInfo">
-                        <span>学生姓名:{{ dataList.realName }}</span>
-                        <span>所在班级:{{ dataList.class }}</span>
-                    </div>
-                    <div class="iInfo">
-                        <span>所在声部:{{ proto.subNames }}</span>
-                    </div>
-                </div>
-            </div>  
-            为进一步提升器乐教学质量和服务品质,保证学员学习进度,明确培训各方的权责,经甲、乙双方协商一致,特订立本协议,以便共同遵守。
-
-            <h2>一、课程信息</h2>
-            
-            <div v-if="proto.classType == 1">
-                <div class="iInfo">
-                    <span>授课内容:个别提高课</span>
-                    <span>授课形式:{{ classForm(proto.classForm) }}</span>
-                </div>
-                <div class="iInfo">
-                    <span>课次数量:{{ proto.buyCount }}次</span>
-                    <span>缴费金额:¥{{ proto.buyCount * proto.price }}</span>
-                </div>
-            </div>
-
-            <div v-if="proto.classType == 2">
-                <div class="iInfo">
-                    <span>授课内容:乐团课</span>
-                    <span>缴费金额:¥{{ proto.buyCount * proto.price }}</span>
-                </div>
-                <!-- <div class="iInfo">
-                    <span>课次数量:{{ proto.buyCount }}次</span>
-                    <span>缴费金额:¥{{ proto.buyCount * proto.price }}</span>
-                </div> -->
-            </div>
-
-            <h2>二、行为规范</h2>
-            乙方在选择甲方各类提高课程并签署本协议时视为乙方已经仔细阅读并同意遵守如下事项:
-                <h3>1.报名</h3>
-            1.1无论是否源自指导老师或教务老师的建议,乙方选择参加甲方的课程,包括对授课形式、授课内容的选择,均为乙方自主意愿的表达及独立自主的选择。<br/>
-            1.2乙方应在所选课程开始前完成相应课程缴费,并完成报名手续。
-            <h3>2.上课</h3>
-            2.1乙方应按时到达甲方指定上课地点,作好课前准备;如发生迟到、或因自身原因早退等情况的,为避免影响老师后续课程的正常进行,授课老师除完成原定时间安排的授课外,将不再提供额外延长课时。<br/>
-            2.2乙方(含学员,下同)不得携带任何食品进入教室,所有进食应在课前完成;进入教室后,不得大声喧哗、追逐嬉戏,应当听从授课老师的安排;乙方应爱护公共财产和教学设施,严禁在桌椅上刻、划、涂、写等不文明行为;乙方未经授课老师同意,不得擅自使用教室内的乐器、音响、电视、空调等器材、设施,如造成此类器材、设施损坏的,乙方应照价赔偿。<br/>
-            2.3未经授课老师同意,乙方家长不得进入课堂,以免影响老师和学员上课;为保证训练质量及进度,学员应保证按照指导老师或教务老师所提出的要求在家练习,遇到专业问题应及时向指导老师请教,非专业问题可随时向教务老师反映。<br/>
-            2.4乙方家长应教育及监督学员务必注意个人安全,妥善保管个人财物,对于非甲方原因造成的人身安全事故或财物损失,由责任人自行承担。
-            <h3>3请假、休会及扣费</h3>
-            3.1基于教学进度和质量保证,本课程对于课程的延续性有严格要求,因此乙方应尽量避免请假。<br/>
-            3.2一对一课程有特殊情况需要请假的,应提前24小时以上以书面形式告知对应的授课老师,以便及时调整时间安排;一对多课程,不接受任何个人单独请假,如果集体请假,应提前24小时以上以书面形式告知对应的授课老师,未按本协议约定请假则当次课程视同已经教授,系统将自动结算课时并扣除相应费用。乙方请假后,应尽快预约补课时间完成补课。<br/>
-            3.3一对一课程以及一对二课程,乙方如遇特殊情况时,可向甲方或授课老师】申请办理临时休课。乙方可在6个月内申请复学,超过6个月未申请复课的,甲方有权按自动退会处理。一对二课程申请临时休课的,还需征得同组学员同意后方可申请休课。<br/>
-            3.4每期课程相对应的有效期,乙方应在有效期内完成课程,10次课一期的,自交费之日起4个月内有效;20次课一期的,自交费之日起8个月内有效;40次课一期的,自交费之日起16个月内有效。如果由于指导老师请假等原因造成课程不能如期完成的,课程有效期将顺延;如课程超出有效期限,乙方所缴纳的课程费用将自动扣除逾期未完成的课时后自动清零。<br/>
-
-            <h2>三、退费</h2>
-            1、一对一课程开课后,乙方要求退费的,乙方应在课程有效期内提出申请,甲方扣除报名费及未授课部分对应学费的20%后,将余款(不计息,下同)退还给乙方;如果乙方报名时享受打折优惠的,甲方先按照原价计算当期已上课时学费,再扣除报名费及未授课部分学费的20%后,将余款退还给乙方。<br/>
-            2、一对二课程开课后,乙方要求退费的,乙方应在课程有效期内提出申请,甲方扣除报名费及未授课部分的学费30%后,将余款退还给乙方;如果乙方报名时享受了打折优惠的,甲方先按照原价计算当期已上课时学费,再扣除报名费及未授课部分学费的30%后,将余款退还给乙方。<br/>
-            3、除一对一课程以及一对二课程之外的其他课程,课程开课后,甲方不接受任何原因的退款申请。<br/>
-            4、甲方所有收费,均向乙方开具加盖公司印章的收款凭据,乙方务必妥善保管,乙方按照本协议约定退费时,应向甲方出具该收费凭据原件方可办理。<br/>
-
-            <h2>四、违约责任</h2>
-            1、当事人一方不履行合同义务或者履行合同义务不符合约定的,均构成违约,守约方有权以书面通知的方式要求违约方纠正其违约行为并采取及时、有效的补救措施消除违约后果,并赔偿守约方因违约方之违约行为而遭致的损失。若违约方在收到守约方的上述通知后5日内未纠正其违约行为的,守约方有权在做出书面通知的情况下,单方解除本协议,违约方应赔偿守约方因此遭致的全部损失。<br/>
-            2、乙方应始终维护甲方的知识产权以及品牌形象,本协议期间以及本协议因任何原因失效、被撤销、解除或终止后,均不得直接或间接通过任何公众媒体(包括但不限于传统大众媒体,以及微信、微博、博客、直播平台等社交平台)发表损害甲方(包括但不限于其产品、服务及甲方授课老师)声誉的言论或实施任何类似行为,否则乙方应赔偿甲方因此遭受的全部损失。<br/>
-
-            <h2>五、保密条款</h2>
-            1、双方对本协议的条款、本协议的签订及履行情况以及通过签订和履行本协议而获知的对方及对方关联公司的任何信息均负有保密义务。任何一方不得以任何形式透露给第三方(有关法律法规要求和甲乙双方的法律、会计顾问、授权雇员除外),也不得擅自使用。<br/>
-            2、本保密义务期限不受本协议期限的限制。本协议失效、被撤销、解除或终止等任何情况下,双方均应遵守本保密义务。<br/>
-
-            <h2>六、不可抗力</h2>
-            1、一方遇到不可抗力事件(指甲乙双方无法控制、无法预见或即使预见也无法避免的事件,该事件妨碍、影响或延误任何一方履行本协议的全部或部分义务,该事件包括但不限于自然灾害(如水灾、地震等)、火灾、政府行为、法律或政策变化(含学校合作变化)、战争或其他任何类似事件)时,受影响方应当立即书面通知对方,并告知该不可抗力事件对本协议可能产生的影响,并在该不可抗力事件发生后5日内向对方提供该事件的详细信息及由有关机构出具的解释受影响方因此无法履行本协议项下全部或部分义务的相关证明。<br/>
-            2、由于上述不可抗力事件致使受影响方无法履行或无法按时履行本协议项下全部或部分义务的,双方于彼此间均不承担违约责任,但双方应在相互信任的基础上协商解决,尽力减少不可抗力事件对本协议的影响,并采取合理方式进行调整(包括但不限于另行签订补充协议等),尽量避免损失的扩大。<br/>
-            3、不可抗力事件消失或结束后,除双方另行协商一致外,受到不可抗力影响的一方应当立即采取措施继续履行本协议,如不可抗力事件持续30日以上的,则任何一方有权以书面通知对方的方式单方解除本协议。<br/>
-
-            <h2>七、适用法律及争议解决方式</h2>
-            1、本协议的订立、效力、履行、解释及争议解决均适用中华人民共和国法律。<br/>
-            2、因履行本协议发生的一切争议,甲乙双方应友好协商解决;如双方在发生争议后30日内无法通过协商解决时,任何一方有权向甲方所在地有管辖权的人民法院提起诉讼解决。<br/>
-
-            <h2>八、其他</h2>
-            1、乙方同意,甲方有权在乙方学习和活动期间对其拍摄照片、视频,甲方对所拍摄的照片、视频有永久免费使用权。<br/>
-            2、未经甲方事先书面同意,乙方不得将本课程转让给乙方以外的任何第三方。<br/>
-            3、双方确认并同意,本协议的电子版本与纸质版本具有同等法律效力。双方发生争议时,电子合同打印件可作为证据提交。双方通过网络以在线方式签订本协议的 ,则以乙方点击“确认”或“同意”等相关按钮或以电子签名的方式作为对合同内容的同意、确认以及本协议的签署;如双方签订纸质版本协议的,则本协议壹式贰份,甲方盖公章或合同专用章并且乙方签字作为有效签署方式,并且双方各执壹份,每份具有同等法律效力。<br/>
-            4、本协议自双方按照本协议约定方式签署之日起生效,有效期至双方履行完本协议约定的全部义务时止。<br/>
-            5、本协议未尽事宜或对本协议的任何修改、补充,有双方另行协商后以签订补充协议的方式解决,补充协议与本协议具有同等法律效力;双方没有约定也没有协商一致的,遵照相关法律法规规定执行。<br/>
-            双方因履行本协议而相互发出或者提供的所有通知、文件、资料,均以本协议中所列明的电话、APP推送消息送达,乙方如果变更电话号码的,应当自变更后1日内通知甲方且获得甲方确认,甲方通过电话、APP方式无法联系乙方或者甲方认为必要时,甲方也可以通过特快专递至乙方住址的方式向乙方发出上述任何通知、文件、资料等,并在甲方寄出特快专递后第5日视为送达成功。<br/>
-
-            <div class="signature">
-                <div class="sign">甲方签章 <img class="cachet" src="../assets/images/cachet.png" alt=""> 
-                    <span>{{nowDate}}</span>
-                </div>
-                <div class="sign">乙方签字:{{ dataList.realName }}
-                    <span> {{ nowDate }} </span>
-                </div>
-            </div>
-
-            <div class="btnback" @click="goBack">我同意</div>
-        </div>
-    </div>
-</template>
-
-<script>
-import qs from 'qs'
-export default {
-    name: 'smallprotocol',
-    props: ['proto'],
-    data() {
-        return {
-            params: this.proto,
-            dataList: {},
-            nowDate: '',
-        }
-    },
-    mounted() {
-        let tempDate = new Date()
-        this.nowDate = tempDate.getFullYear() + '年' + (tempDate.getMonth() + 1) + '月' + tempDate.getDate() + '日'
-        this.$axios.post('/user/findMecUser', qs.stringify({userId: this.params.userId})).then(res => {
-            this.dataList = res.data.data
-        })
-    },
-    methods: {
-        goBack() {
-            this.$emit('popupClose', false)
-        },
-        classForm(number) {
-            let resultStr
-            switch(number) {
-                case 1001:
-                    resultStr = '1V1'
-                break;
-                case 2002:
-                    resultStr = '1V2'
-                break;
-                case 3003:
-                    resultStr = '1V3'
-                break;
-                case 4004:
-                    resultStr = '1V4'
-                break;
-                case 5005:
-                    resultStr = '1V5'
-                break;
-                case 6020:
-                    resultStr = '小组课'
-                break;
-                case 21099:
-                    resultStr = '大课'
-                break;
-                case 999999:
-                    resultStr = '团体课'
-                break;
-            }
-            return resultStr
-        }
-    }
-}
-</script>
-
-<style lang="less" scoped>
-    header {
-        height: .40rem;
-        line-height: .40rem;
-        color: #000;
-        font-size: .17rem;
-        background: #fff;
-        box-shadow: 0px 1px 8px 0px rgba(0,0,0,0.07);
-        text-align: center;
-
-        .back {
-            width: .2rem;
-            height: .2rem;
-            position: absolute;
-            left: .12rem;
-            top: .1rem;
-        }
-    }
-    .container {
-        padding: .22rem .2rem .3rem;
-        font-size: .14rem;
-        h1 {
-            font-size: .16rem;
-            text-align: center;
-        }
-
-        h2 {
-            font-size: .16rem;
-            font-weight: bold;
-            padding-top: .15rem;
-        }
-        h3 {
-            font-size: .14rem;
-            font-weight: bold;
-        }
-
-        .signature {
-            display: flex;
-            padding-top: .5rem;
-            .sign {
-                flex: 1;
-                position: relative;
-            }
-            span {
-                display: block;
-                padding-left: .2rem;
-            }
-
-            .cachet {
-                position: absolute;
-                top: -.6rem;
-                left: 0;
-                width: 1.5rem;
-                height: 1.5rem;
-            }
-        }
-    }
-
-    .iInfo {
-        display: flex;
-        span {
-            flex: 1;
-        }
-    }
-
-    .btnback {
-        display: inline-block;
-        font-size: 0.18rem;
-        color: #fff;
-        background: #F1111B;
-        border-radius: 0.04rem;
-        -webkit-box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.19);
-        box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.19);
-        padding: 0.08rem 0;
-        margin-top: .8rem;
-        width: 100%;
-        text-align: center;
-    }
-</style>

+ 1 - 0
src/main.js

@@ -2,6 +2,7 @@ import Vue from 'vue'
 import App from './App.vue'
 import store from './store'
 import router from './router/index'
+import './common/vueFilters'
 import { Button, Icon, Tag, Swipe, SwipeItem, Popup, Picker, 
     DropdownMenu, DropdownItem, Search, PullRefresh, Toast, List,
     Collapse, CollapseItem, Tab, Tabs, Row, Col, Cell, CellGroup,

+ 2 - 60
src/router/index.js

@@ -9,67 +9,9 @@ let defaultRouter = [
     {
         path: '/',
         redirect:  {
-            name: 'registerpayment'
+            name: 'business'
         }
-    },
-    {
-        path: '/special/:type',
-        name: 'special',
-        component: () => import(/* webpackChunkName: "Special" */ '@/views/student/Special.vue'),
-        meta: {
-            descrition: '专项训练',
-            weight: 1 // 页面权重
-        }
-    }, {
-        path: '/specialdetail/:id',
-        name: 'specialDetail',
-        component: () => import(/* webpackChunkName: "SpecialDetail" */ '@/views/student/SpecialDetail.vue'),
-        meta: {
-            descrition: '详情页',
-            weight: 2 // 页面权重
-        }
-    }, {
-        path: '/registerpayment',
-        name: 'registerpayment',
-        component: () => import(/* webpackChunkName: "RegisterPayment" */ '@/views/student/RegisterPayment.vue'),
-        meta: {
-            descrition: '乐团注册',
-            weight: 3 // 页面权重
-        }
-    }, {
-        path: '/renew',
-        name: 'renew',
-        component: () => import(/* webpackChunkName: "Renew" */ '@/views/student/Renew.vue'),
-        meta: {
-            descrition: '续费',
-            weight: 4 // 页面权重
-        }
-    }, {
-        path: '/register',
-        name: 'register',
-        component: () => import(/* webpackChunkName: "Register" */ '@/views/student/Register.vue'),
-        meta: {
-            descrition: '注册',
-            weight: 5 // 页面权重
-        }
-    }, {
-        path: '/paymentresult',
-        name: 'paymentresult',
-        component: () => import(/* webpackChunkName: "paymentResult" */ '@/views/student/paymentResult.vue'),
-        meta: {
-            descrition: '支付',
-            weight: 6 // 页面权重
-        }
-    }, {
-        path: '/smallregister',
-        name: 'smallregister',
-        component: () => import(/* webpackChunkName: "smallRegister" */ '@/views/student/smallRegister.vue'),
-        meta: {
-            descrition: '小班课设置',
-            weight: 7 // 页面权重
-        }
-    }
-]
+    }]
 
 defaultRouter = defaultRouter.concat(TeacherRouter)
 

+ 0 - 303
src/views/student/Register.vue

@@ -1,303 +0,0 @@
-<template>
-    <div class="register">
-        <header>报名</header>
-        <div class="banner">
-            <img src="../../assets/images/register_banner.png" alt="">
-        </div>
-
-        <div class="reg-title">
-            <i class="icon card_icon"></i> 请填写学生信息 <span>(必填)</span>
-        </div>
-        <van-cell-group>
-            <van-field required label="姓名" input-align="right" placeholder="请输入姓名" 
-                v-model="stu.name"></van-field>
-            <van-field required label="性别" disabled v-model="stu.gender" input-align="right"
-                 placeholder="请选择" @click="onChange('gender')" is-link></van-field>
-            <van-field required type="number" label="身份证号" input-align="right"
-                v-model="stu.idCardNo" placeholder="请输入身份证号"></van-field>
-            <van-field required disabled label="乐团" input-align="right" 
-                placeholder="请输入乐团" v-model="stu.band"></van-field>
-            <van-field required label="年级" disabled input-align="right" v-model="stu.currentGrade" 
-                placeholder="请选择" @click="classStatus = true" is-link></van-field>
-            <van-field required label="班级" input-align="right" placeholder="请输入班级" 
-                v-model="stu.currentClass"></van-field>
-        </van-cell-group>
-
-        <div class="reg-title">
-            <i class="icon card_icon"></i> 请填写专业信息 <span>(必填)</span>
-        </div>
-
-        <van-cell-group>
-            <van-field required label="声部" v-model="stu.major" @click="onChange('major')" 
-                disabled is-link input-align="right" placeholder="请选择"></van-field>
-            <van-field required label="乐器购买方式" v-model="stu.kitPurchaseMethod" @click="onChange('kitPurchaseMethod')" 
-                disabled is-link input-align="right" placeholder="请选择"></van-field>
-            <van-field required label="是否服从调配" v-model="stu.isAllowAdjust" disabled
-                placeholder="请选择" @click="onChange('isAllowAdjust')" is-link input-align="right"></van-field>
-        </van-cell-group>
-
-        <div class="reg-title">
-            <i class="icon card_icon"></i> 请填写家长信息 <span>(必填,至少1名联系人)</span>
-        </div>
-
-        <van-cell-group>
-            <van-field required label="家长" input-align="right" placeholder="请输入家长姓名" v-model="stu.parentsName"></van-field>
-            <van-field required label="手机" input-align="right" placeholder="请输入手机号" v-model="stu.parentsPhone"></van-field>
-            <van-field label="单位" input-align="right" placeholder="请输入单位名称" v-model="stu.parentsCompany"></van-field>
-            <van-field input-align="right"
-                v-model="stu.remark" label="备注" type="textarea"
-                placeholder="请输入备注" rows="2" autosize />
-        </van-cell-group>
-
-        <div class="btn-group">
-            <van-button class="btn-submit" @click="onSubmit" size="large">提交</van-button>
-        </div>
-
-        
-       <van-action-sheet
-            v-model="sheetStatus"
-            :actions="sheetActions"
-            cancel-text="取消"
-            @select="onSelect"
-            @cancel="sheetStatus = false"/>
-
-        <van-popup v-model="classStatus"  position="bottom">
-            <van-picker :columns="dataList.currentGrade" 
-                show-toolbar 
-                @cancel="classStatus = false"
-                @confirm="onClassConfirm" />
-        </van-popup>
-    </div>
-</template>
-
-<script>
-import { getMusicGroupRegInfo, registerAdd } from '@/api/student'
-export default {
-    name: 'register',
-    data() {
-        return {
-            sheetStatus: false, // 选项卡状态
-            classStatus: false, // 年级弹窗状态
-            stu: {
-                name: null, // 姓名
-                gender: null, // 性别
-                idCardNo: null, // 身份证号
-                band: '',// 乐团
-                currentGrade: '', // 年级
-                currentClass: null, // 班级
-                major: '', // 专业
-                kitPurchaseMethod: '团购',
-                isAllowAdjust: '是', // 是否服从调配
-                parentsName: null, // 家长
-                parentsPhone: null, // 电话
-                parentsCompany: null, // 单位
-                remark: null, // 备注
-            },
-            stuIndex: {
-                genderNo: null, // 性别编号
-                majorNo: null, // 专业编号
-                subNo: null, // 科目编号
-                kitPurchaseMethod: 'GROUP',
-                isAllowAdjustNo: 'YES', // 是否服从调配编号
-            },
-            selectName: '', // 选择是哪个字段
-            sheetActions: [], // 上拉列表数据展示
-            dataList: { // 上拉列表数据列表
-                gender: [{ name: '男', index: 1 }, {name: '女', index: 0}],
-                currentGrade: ['一年级','二年级','三年级','四年级','五年级','六年级','初一/七年级','初二/八年级','初三/九年级','高一','高二','高三'],
-                isAllowAdjust: [{ name: '是', index: 'YES' }, {name: '否', index: 'NO'}],
-                major: [],
-                kitPurchaseMethod: [{ name: '团购', index: 'GROUP' }, {name: '自备', index: 'OWNED'}]
-            }
-        }
-    },
-    mounted() {
-        let params = this.$route.query
-        // 获取声部列表
-        getMusicGroupRegInfo({ musicGroupId: params.musicGroupId }).then(res => {
-            let result = res.data
-            if(result.code == 200 && result.data) {
-                this.stu.band = result.data.musicGroupName
-                result.data.subjectList.forEach(item => {
-                    let tempSubName = item.name.split('.').reverse()[0]
-                    this.dataList.major.push({
-                        name: tempSubName,
-                        index: item.id,
-                        subNo: item.subId
-                    })
-                })
-            }
-        })
-    },
-    methods: {
-        onSelect(item) { // 选中子选项时赋值
-            this.stu[this.selectName] = item.name
-            this.sheetStatus = false
-            // 根据不同的类型取到对应的编号
-            if(this.selectName == 'gender') {
-                this.stuIndex.genderNo = item.index
-            } else if(this.selectName == 'isAllowAdjust') {
-                this.stuIndex.isAllowAdjustNo = item.index
-            } else if(this.selectName == 'major') {
-                this.stuIndex.majorNo = item.index
-                this.stuIndex.subNo = item.subNo
-            } else if(this.selectName == 'kitPurchaseMethod') {
-                this.stuIndex.kitPurchaseMethod = item.index
-            }
-        },
-        onChange(name) { // 选择上拉弹窗时
-            this.sheetStatus = true
-            this.sheetActions = this.dataList[name]
-            this.selectName = name
-        },
-        onClassConfirm(val) { // 年级赋值
-            this.stu.currentGrade = val
-            this.classStatus = false
-
-        },
-        onSubmit() {
-            // 确定注册
-            let checkResult = this.onCheckForm()
-            if(checkResult) {
-                this.$toast(checkResult)
-                return false
-            }
-            
-            let s = this.stu
-            let params = {
-                currentClass: s.currentClass,
-                currentGrade: s.currentGrade,
-                gender: this.stuIndex.genderNo,
-                idCardNo: s.idCardNo,
-                isAllowAdjust: this.stuIndex.isAllowAdjustNo,
-                kitPurchaseMethod: this.stuIndex.kitPurchaseMethod,
-                musicGroupId: this.$route.query.musicGroupId,
-                name: s.name,
-                parentsName: s.parentsName,
-                parentsPhone: s.parentsPhone,
-                subjectId: this.stuIndex.majorNo,
-                parentsCompany: s.parentsCompany,
-                remark: s.remark
-            }
-            registerAdd(params).then(res => {
-                console.log(res)
-                let result = res.data
-                if(result.code == 200) {
-                    this.$dialog.alert({
-                        title: '提示',
-                        message: '恭喜你,报名成功'
-                    })
-                } else {
-                    this.$dialog.alert({
-                        title: '提示',
-                        message: result.msg
-                    })
-                }
-            })
-        },
-        onCheckForm() {
-            let student = this.stu
-            let errorTextArr = {
-                name: '请输入姓名',
-                gender: '请选择性别', // 性别
-                idCardNo: '请输入身份证号', // 学校
-                currentGrade: '请选择年级', // 年级
-                currentClass: '请输入班级', // 班级
-                major: '请选择声部', // 专业
-                kitPurchaseMethod: '请选择乐器购买方式',
-                isAllowAdjust: '请选择是否服从调配', // 是否服从调配
-                parentsName: '请输入家长姓名', // 家长
-                parentsPhone: '请输入手机号', // 电话
-                // parentsCompany: '请输入单位名称'
-            }
-            let idCardReg = /(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)|(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)/
-            for(let key in student) {
-                if(!student[key] || student[key] == '') {
-                    return errorTextArr[key]
-                } else if(key == 'parentsPhone' && !(/^1(3|4|5|6|7|8|9)\d{9}$/.test(student.parentsPhone))) {
-                    return '电话输入有误'
-                } else if(key == 'idCardNo' && !idCardReg.test(student.idCardNo)) {
-                    return '身份证号输入有误'
-                }
-            }
-            return ''
-        }
-    }
-}
-</script>
-
-<style lang="less" scoped>
-.register {
-    margin-bottom: .3rem;
-}
-
-header {
-    height: .40rem;
-    line-height: .40rem;
-    color: #000;
-    font-size: .17rem;
-    background: #fff;
-    box-shadow: 0px 1px 8px 0px rgba(0,0,0,0.07);
-    text-align: center;
-    margin-bottom: .06rem;
-}
-.banner {
-    font-size: 0;
-    img{
-        width: 100%;
-    }
-}
-
-.reg-title {
-    padding: 0 .12rem;
-    position: relative;
-    height: .4rem;
-    display: flex;
-    align-items: center;
-    color: #666;
-    font-size: .14rem;
-    span {
-        color: #9B9B9B;
-    }
-    .card_icon {
-        display: inline-block;
-        width: .23rem;
-        height: .2rem;
-        margin-right: .1rem;
-        background: url('../../assets/images/Shape.png') no-repeat center;
-        background-size: contain;
-    }
-}
-
-.btn-group {
-    margin: .3rem .3rem 0;
-    .btn-submit {
-        background: #14928A;
-        border-radius: 1rem;
-        color: #fff;
-        font-size: .18rem;
-    }
-}
-
-
-/deep/.van-cell {
-    font-size: .16rem;
-    padding: .13rem .11rem;
-    .van-field__control:disabled {
-    color: #323233 !important;
-}
-}
-
-/deep/.van-field--disabled .van-field__control {
-    color: #444 !important;
-}
-/deep/.van-field__label, /deep/.van-cell__title {
-    padding-left: .08rem;
-    flex: 1 auto;
-}
-// .van-field--disabled {
-    .van-field__controll {
-         color: #323233;
-    }
-// }
-</style>

+ 0 - 862
src/views/student/RegisterPayment.vue

@@ -1,862 +0,0 @@
-<template>
-    <div class="registerpayment">
-        <m-header />
-
-        <div class="noticeInfo">
-            <i class="trumpet_icon"></i>请家长确认您孩子的声部,名额有限请点击购买后五分钟之内完成支付,如支付失败可能被调剂至其他声部或报名失败的情况。
-        </div>
-
-        <div class="section" v-if="courseScheduleInfo">
-            <h2 class="title line_bottom">课程</h2>
-            <div class="options classInfo">
-                <div class="option" v-if="courseScheduleInfo.soundInfo.ischeck">
-                    <div class="0_hd"><i class="check_default check_active"></i></div>
-                    <div class="o_bd">乐团声部训练</div>
-                    <span class="o_ft">
-                        现价:¥{{ courseScheduleInfo.soundInfo.value }}
-                    </span>
-                </div>
-                <div class="option" v-if="courseScheduleInfo.allInfo.ischeck">
-                    <div class="0_hd"><i class="check_default check_active"></i></div>
-                    <div class="o_bd">乐团合奏训练</div>
-                    <span class="o_ft">
-                        现价:¥{{ courseScheduleInfo.allInfo.value }}
-                    </span>
-                </div>
-                <div class="option" v-if="courseScheduleInfo.baseInfo.ischeck">
-                    <div class="0_hd"><i class="check_default check_active"></i></div>
-                    <div class="o_bd">基础技能训练</div>
-                    <span class="o_ft">
-                        现价:¥{{ courseScheduleInfo.baseInfo.value }}
-                    </span>
-                </div>
-                <div class="option" v-if="courseScheduleInfo.holidayInfo.ischeck">
-                    <div class="0_hd"><i class="check_default check_active"></i></div>
-                    <div class="o_bd">假期集中训练</div>
-                    <span class="o_ft">
-                        现价:¥{{ courseScheduleInfo.holidayInfo.value }}
-                    </span>
-                </div>
-            </div>
-            <div class="options sale" v-if="musicGroupSubject">
-                <div class="option">
-                    <div class="o_bd">折扣价</div>
-                    <span class="o_ft">
-                        ¥{{ musicGroupSubject.fee }}
-                    </span>
-                </div>
-            </div>
-            <!-- <div class="options" v-else key="class-list">
-                <div class="option">
-                    <div class="0_hd"><i class="check_default check_active"></i></div>
-                    <div class="o_bd">乐团课</div>
-                    
-                    <span class="o_ft" v-if="result.payMethod == 21 || result.payMethod == 25" key="class-price">
-                        <del>原价:¥23520</del> 现价:免费
-                    </span>
-                    <span class="o_ft" v-else key="class-price">
-                        <del>原价:¥23520</del> 现价:¥{{ result.classAmount }}
-                    </span>
-                </div>
-            </div> -->
-            <div class="coutInfo" v-if="courseScheduleInfo.submit.ischeck">
-                <i class="trumpet_icon"></i>{{ courseScheduleInfo.submit.value }}                    
-            </div>
-        </div>
-
-        <div class="section">
-            <h2 class="title line_bottom">乐器</h2>
-            <div class="options">
-                <div v-for="(con, index) in instrumentResult" :key="index" @click="instrumentF(con)"
-                    :class="[ instrumentResult.length > 1 ? 'oc' : '' ]">
-                    <div class="option">
-                        <div class="o_"><i class="check_default" :class="[ con.checked ? 'check_active' : '' ]"></i></div>
-                        <div class="o_bd">
-                            {{ con.name }}<span v-if="con.price > 0" class="c">—{{ statusToCN(musicGroupSubject.kitGroupPurchaseType) }}</span>
-                        </div>
-                        <span class="o_ft" v-if="con.price > 0">
-                            <del>原价:¥{{ con.goodsList[0].marketPrice }}</del> 现价:¥{{ con.price }}
-                        </span>
-                    </div>
-                    <div class="configuration" v-if="con.price > 0">
-                        <div class="config">
-                            <div class="title"><span>配置参数</span></div>
-                            <div class="content">
-                                <p>{{ con.goodsList[0].brief }}</p>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-
-        <div class="section" v-if="accessOries.length > 0" key="accessOries">
-            <h2 class="title line_bottom">辅件</h2>
-            <div class="options" v-for="(instr, index) in accessOries" :key="index" @click="onAuxiliarie(instr)">
-                <div class="option">
-                    <div class="o_hd"><i class="check_default" :class="[ instr.checked ? 'check_active' : '' ]"></i></div>
-                    <div class="o_bd">{{ instr.name }}</div>
-                    <span class="o_ft">
-                        <del>原价:¥{{ instr.marketPrice }}</del>
-                        {{ instr.price == 0 ? '免费' : '现价:¥' + instr.price }}
-                    </span>
-                </div>
-                <div class="configuration">
-                    <div class="config">
-                        <div class="title"><span>配置</span></div>
-                        <div class="content" v-for="item in instr.goodsList" :key="item.id">
-                            <div class="option">
-                                <div class="o_bd">{{ item.name }}</div>
-                                <span class="o_ft">¥{{ item.marketPrice }}</span>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="section" v-else key="accessOries">
-            <h2 class="title line_bottom">辅件</h2>
-            <div class="options" v-for="(instr, index) in accessGoods" :key="index" @click="onAuxiliarie(instr)">
-                <div class="option">
-                    <div class="o_hd"><i class="check_default" :class="[ instr.checked ? 'check_active' : '' ]"></i></div>
-                    <div class="o_bd">{{ instr.name }}</div>
-                    <span class="o_ft">
-                        <del>原价:¥{{ instr.marketPrice }}</del>
-                        {{ instr.groupPurchasePrice == 0 ? '免费' : '现价:¥' + instr.groupPurchasePrice }}
-                    </span>
-                </div>
-            </div>
-        </div>
-
-        <div class="section" v-if="otherResult.length > 0" key="otherResult">
-            <h2 class="title line_bottom">其它</h2>
-            <div class="options" v-for="(base, index) in otherResult" :key="index">
-                <div class="option">
-                    <div class="o_hd"><i class="check_default check_active"></i></div>
-                    <div class="o_bd">{{ base.name }}</div>
-                    <span class="o_ft">
-                        <del>原价:¥{{ base.marketPrice }}</del>
-                         {{ base.price == 0 ? '免费' : '现价:¥' + base.price }}
-                    </span>
-                </div>
-                <div class="configuration">
-                    <div class="config">
-                        <div class="title"><span>配置</span></div>
-                        <div class="content" v-for="(item, index1) in base.goodsList" :key="index1">
-                            <div class="option">
-                                <div class="o_bd">{{ item.name }}</div>
-                                <span class="o_ft">¥{{ item.marketPrice }}</span>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-
-        <div class="section" v-else key="otherResult">
-            <h2 class="title line_bottom">其它</h2>
-            <div class="options" v-for="base in otherGoods" :key="base.id">
-                <div class="option">
-                    <div class="o_hd"><i class="check_default check_active"></i></div>
-                    <div class="o_bd">{{ base.name }}</div>
-                    <span class="o_ft">
-                        <del>原价:¥{{ base.marketPrice }}</del> 
-                         {{ base.groupPurchasePrice == 0 ? '免费' : '现价:¥' + base.groupPurchasePrice }}
-                    </span>
-                </div>
-            </div>
-        </div>
-
-         <div class="buy">
-             <div class="price">
-                 <p class="oldprice">
-                     <del class="text">原价</del>
-                     <del>¥{{ orderInfo.marketPrice }}</del>
-                 </p>
-                 <p class="now_price">
-                     <span class="text">仅需支付</span>
-                     <span>¥{{ orderInfo.amount }}</span>
-                 </p>
-             </div>
-             <a class="btn-submit" @click="onCheckSubmit">购买</a>
-        </div>
-
-        <van-popup id="protocolPopup" v-model="popupStatus" position="bottom">
-            <protocol :proto="protocolData" @popupClose="onPopupClose"></protocol>
-        </van-popup>
-
-        <van-popup v-model="loadingOrderStatus" :close-on-click-overlay='false' class="loadingOrder">
-            <van-loading size="36px" vertical  color="#14928A">{{ loadingOrderText }}</van-loading>
-        </van-popup>
-    </div>
-</template>
-
-<script>
-import MHeader from '@/components/MHeader'
-import { getSubjectGoodsAndInfo, musicGroupPay }  from '@/api/student'
-export default {
-    name: 'registerpayment',
-    components: { MHeader },
-    data() {
-        return {
-            loadingOrderStatus: false, // 排队中状态
-            loadingOrderText: '加载中...', // 排队文案
-            resultParams: '', // 提交订单参数
-            clickBtnCount: true, // 点击按钮次数判定
-            paymentTimers: null, // 定时器
-            paymentPostCount: 0, // 请求计数
-            popupStatus: false, // 协议弹窗样式
-            protocolData: {}, // 协议参数
-            result: {}, // 返回结果
-            instrument: {}, // 乐器类型
-            baseInfo: {}, // 其它类
-            money: 580,
-            orderInfo: {
-                amount: 0, // 现价总金额
-                goodsGroupIds: null,
-                goodsIds: null
-            }, // 金额列表,金额计算
-            form: {
-                apiContent: '',
-                host: '',
-                merNo: '',
-                notifyUrl: '',
-                sign: '',
-                signType: '',
-                timestamp: '',
-                version: '',
-            },
-            isSingle: 1, // 是否是双乐器,默认是双乐器
-            courseScheduleInfo: null, // 课程信息
-            musicGroupSubject: null, // 基本信息
-            instrumentResult: [], //乐器
-            accessGoods: [], // 辅件
-            accessOries: [], // 辅件(打包)
-            otherResult: [], // 其它(打包)
-            otherGoods: [], // 其它辅件
-        }
-    },
-    mounted() {
-        let params = {
-            musicGroupId: this.$route.query.musicGroupId,
-            subjectId: this.$route.query.subjectId
-        }
-        // 获取数据
-        getSubjectGoodsAndInfo(params).then(res => {
-            let result = res.data
-            if(result.code == 200) {
-                this.courseScheduleInfo = result.data.courseScheduleInfo
-                this.musicGroupSubject = result.data.musicGroupSubjectPlan
-                this.otherGoods = result.data.otherGoods
-                let instrumentInfo = {}
-                result.data.musicGroupSubjectGoodsGroupList.forEach(item => {
-                    let tmarketPrice = 0
-                    item.goodsList.forEach(item => {
-                        tmarketPrice += parseInt(item.marketPrice)
-                    })
-                    item.marketPrice = tmarketPrice
-                    if(item.type == "INSTRUMENT") {
-                        item.checked = true
-                        if(instrumentInfo.id) {
-                            if(instrumentInfo.price < item.price) {
-                                item.checked = true
-                                instrumentInfo = {
-                                    id: item.id,
-                                    price: item.price
-                                }
-                            } else {
-                                item.checked = false
-                            }
-                        } else {
-                            instrumentInfo = {
-                                id: item.id,
-                                price: item.price
-                            }
-                        }
-                        this.instrumentResult.push(item)
-                        let goodsList = item.goodsList[0].goodsList
-                        // 乐器辅件
-                        this.accessGoods = []
-                        goodsList.forEach(i => {
-                            i.checked = true
-                            this.accessGoods.push(i)
-                        })
-                    } else if(item.type == "ACCESSORIES") {
-                        item.checked = true
-                        this.accessOries.push(item)
-                    } else if(item.type == "OTHER") {
-                        this.otherResult.push(item)
-                    }
-                })
-                // 添加自备选项
-                this.instrumentResult.push({
-                    name: '自备',
-                    price: 0,
-                    marketPrice: 0,
-                    checked: false
-                })
-            }
-            // 初始化计算金额
-            this.calcPrice()
-        })
-        
-    },
-    methods: {
-        onAuxiliarie(item) {
-            // 辅件切换状态
-            item.checked = !item.checked
-            // 重新计算金额
-            this.calcPrice()
-        },
-        instrumentF(item) {
-            // 乐器切换状态
-            this.instrumentResult.forEach(item => {
-                item.checked = false
-            })
-            item.checked = true
-            // 重新计算金额
-            this.calcPrice()
-        },
-        onCheckSubmit() {
-            // 判断 1.5 3.0 弹协议 否则直接购买
-            if(this.musicGroupSubject.KitGroupPurchaseType == 'LEASE') {
-                this.protocol()
-            } else {
-                this.buy()
-            }
-        },
-        buy() {
-            // 判断是否点击过
-            if(!this.clickBtnCount) {
-                return false
-            }
-            this.clickBtnCount = false
-
-            // 确认购买
-            let params = this.$route.query
-            let resultParams = this.orderInfo
-            resultParams.registerId = this.$route.query.registerId
-
-            // 保存用户选择信息保存本地
-            // sessionStorage.setItem('homeConfig', JSON.stringify({
-            //     config: configIndex,
-            //     auxiliaries: auxiliarieIndexArr 
-            // }))
-
-            
-            musicGroupPay(resultParams).then(res => {
-                let result = res.data
-                this.clickBtnCount = true
-
-                if(result.code == 403) {
-                    this.loadingOrderStatus = true
-                    this.loadingOrderText = result.msg
-                    this.paymentMethods()
-                } else if(result.code == 201) { // 0元购成功提示
-                    this.$dialog.alert({
-                        title: '提示',
-                        message: '报名成功',
-                        confirmButtonColor: '#269a93'
-                    }).then(() => {
-                        this.$router.push({
-                            path: '/paymentresult',
-                            query: { type: 'success' }
-                        })
-                    })
-                } else if(result.code == 100) { // 订单已经存在继续支付
-                    this.$dialog.confirm({
-                        title: '提示',
-                        message: result.msg,
-                        confirmButtonColor: '#269a93',
-                        cancelButtonText: '已完成支付',
-                        confirmButtonText: '重新下单支付'
-                    }).then(() => {
-                        musicGroupPay(resultParams).then(repay => {
-                            let repayResult = repay.data
-                            if(repayResult.code == 200) {
-                                this.form = repayResult.data
-                                this.onSubmit()
-                            } else {
-                                this.$dialog.alert({
-                                    title: '提示',
-                                    message: repayResult.msg,
-                                    confirmButtonColor: '#269a93'
-                                })
-                            }
-                        })
-                    }).catch(() => {
-                        this.$dialog.close()
-                    })
-                } else {
-                    if(result.data) {
-                        this.form = result.data
-                        this.onSubmit()
-                    } else {
-                        this.$dialog.alert({
-                            title: '提示',
-                            message: result.msg,
-                            confirmButtonColor: '#269a93'
-                        })
-                    }
-                }
-            })
-        },
-        paymentMethods() {
-            let resultParams = this.resultParams
-            if(!resultParams) {
-                return false
-            }
-            let that = this
-            let params = this.$route.query
-            that.paymentTimers = setInterval(() => {
-                that.paymentPostCount++
-                if(that.paymentPostCount >= 30) {
-                    clearInterval(that.paymentTimers)
-                } else {
-                    musicGroupPay(resultParams).then((res) => { 
-                        let result = res.data
-                        if(result.code == 403) {
-                            that.loadingOrderStatus = true
-                            that.loadingOrderText = result.msg
-                        } else if(result.code == 201) {
-                            this.$dialog.alert({
-                                title: '提示',
-                                message: '报名成功',
-                                confirmButtonColor: '#269a93'
-                            }).then(() => {
-                                this.$router.push({
-                                    path: '/paymentresult',
-                                    query: { type: 'success' }
-                                })
-                            })
-                        } else {
-                            clearInterval(that.paymentTimers)
-                            that.loadingOrderStatus = false
-                            that.loadingOrderText = '加载中...'
-                            if(result.data) {
-                                that.form = result.data
-                                this.onSubmit()
-                            } else {
-                                this.$dialog.alert({
-                                    title: '提示',
-                                    message: result.msg,
-                                    confirmButtonColor: '#269a93'
-                                })
-                            }
-                        }
-                    })
-                }
-            }, 1000 * 10)
-            
-        },
-        onSubmit() {
-            // submit 提交
-            let f = this.form
-            document.querySelector('#onSubmit').action = f.host
-            document.querySelector('#apiContent').value = f.apiContent
-            document.querySelector('#merNo').value = f.merNo
-            document.querySelector('#notifyUrl').value = f.notifyUrl
-            document.querySelector('#sign').value = f.sign
-            document.querySelector('#signType').value = f.signType
-            document.querySelector('#timestamp').value = f.timestamp
-            document.querySelector('#version').value = f.version
-            document.querySelector('#onSubmit').submit()
-        },
-        protocol() {
-            // 协议
-            let r = this.result
-            let protocol = {
-                patriarchName: r.patriarchName,
-                patriarchPhone: r.patriarchPhone,
-                stuName: r.stuName,
-                grade: r.grade,
-                subName: r.subName,
-                voicyPart: r.voicyPart,
-                userId: r.userId,
-                classAmount: r.classAmount,
-                payMethod: r.payMethod, // 缴费类型
-                isCopperPipe: r.isCopperPipe // 是否为铜管
-            }
-            let c = this.instrument.config
-            for(let i = 0; i < c.length; i++) {
-                if(c[i].default) {
-                    protocol.name = c[i].name
-                    protocol.referencePrice = c[i].referencePrice
-                    protocol.marketPrice = c[i].marketPrice
-                }
-            }
-            this.protocolData = protocol
-            this.popupStatus = true
-        },
-        calcPrice() {
-            let amount = 0,
-                marketPrice = 0,
-                goodsGroupIds = [], 
-                goodsIds = []
-            // 课程
-            let mgs = this.musicGroupSubject
-            let csi = this.courseScheduleInfo
-            if(mgs) {
-                amount += parseFloat(mgs.fee)
-                if(csi.allInfo.ischeck) {
-                    marketPrice += parseFloat(csi.allInfo.value)
-                } else if(csi.baseInfo.ischeck) {
-                    marketPrice += parseFloat(csi.baseInfo.value)
-                } else if(csi.holidayInfo.ischeck) {
-                    marketPrice += parseFloat(csi.holidayInfo.value)
-                } else if(csi.soundInfo.ischeck) {
-                    marketPrice += parseFloat(csi.soundInfo.value)
-                }
-            }
-            
-            // 乐器
-            let ir = this.instrumentResult
-            if(ir.length > 0) {
-                ir.forEach(item => {
-                    if(item.checked) {
-                        amount += parseFloat(item.price)
-                        marketPrice += parseFloat(item.marketPrice)
-                        item.id ? goodsGroupIds.push(item.id) : null
-                    }
-                })
-            }
-            
-            // 辅件
-            if(this.accessOries.length > 0) {
-                this.accessOries.forEach(item => {
-                    if(item.checked) {
-                        amount += parseFloat(item.price)
-                        marketPrice += parseFloat(item.marketPrice)
-                        goodsGroupIds.push(item.id)
-                    }
-                })
-            } else {
-                this.accessGoods.forEach(item => {
-                    if(item.checked) {
-                        amount += parseFloat(item.groupPurchasePrice)
-                        marketPrice += parseFloat(item.marketPrice)
-                        goodsIds.push(item.id)
-                    }
-                })
-            }
-    
-            // 其它
-            if(this.otherResult.length > 0) {
-                this.otherResult.forEach(item => {
-                    amount += parseFloat(item.price)
-                    marketPrice += parseFloat(item.marketPrice)
-                    goodsGroupIds.push(item.id)
-                })
-            } else {
-                this.otherGoods.forEach(item => {
-                    amount += parseFloat(item.groupPurchasePrice)
-                    marketPrice += parseFloat(item.marketPrice)
-                    goodsIds.push(item.id)
-                })
-            }
-            this.orderInfo = {
-                amount: amount,
-                marketPrice: marketPrice,
-                goodsGroupIds: goodsGroupIds.join(','),
-                goodsIds: goodsIds.join(',')
-            }
-        },
-        statusToCN(status) {
-            let common = {
-                FREE: "免费",
-                GROUP: "团购",
-                LEASE: "租赁"
-            }
-            return common[status]
-        },
-        onPopupClose() {
-            document.querySelector('#protocolPopup').scroll(0, 0)
-            this.popupStatus = false
-            this.buy()
-        }
-    }
-}
-</script>
-
-<style lang="less" scoped>
-.registerpayment {
-    margin-bottom: .7rem;
-}
-header {
-    height: .40rem;
-    line-height: .40rem;
-    color: #000;
-    font-size: .17rem;
-    background: #fff;
-    box-shadow: 0px 1px 8px 0px rgba(0,0,0,0.07);
-    text-align: center;
-    margin-bottom: .06rem;
-}
-
-.noticeInfo {
-    position: relative;
-    margin-top: .07rem;
-    margin-bottom: .1rem;
-    background: #fff;
-    padding: .1rem .22rem .1rem .32rem; 
-    font-size: .12rem;
-    color: #FA101D;
-    .trumpet_icon {
-        width: .14rem;
-        height: .12rem;
-        background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAYCAYAAADpnJ2CAAAAAXNSR0IArs4c6QAAAyZJREFUSA21Vk1IVFEUPufOezNilJXQD2UQRERamWhBaUWOSS3U0SawdgZai2gR0aoQXPSDm3JRCbm0xZBjbkQZS0KDjKywDCIIkoKKEIkm35uZezr32X0jQ+bY2IU359xzzj3fPXe++4PwDy0W8JdKgjYCWOkzzWIM9X5NN42RbqCKoxOHl1nR2FVJ1MRgqGzxhCxg8VDp6TSRTpCKsQL+aitqjwPRKQ3mjCVygFPz2MGKQqvG/zxW56+c7ZsXkIJH1liB8hARdQPButmD59WR8mUCuqy6ynwd686OmpsN++XjLUiYrZ0g5E6SdJmAVri2FMWDnnIz3P8gxex07Rp/owS6jQij3h1lu7G5Oe5UOF1bcc5+MTRFlBiTEH/iflLe+htYKsh0oHwzBcpztd3bHWlHxPtEUMTFHFV2YdceOglStnLiZGV6xEIlwbBF+JQaqpa6Qw246OiUOKOkICnPus4MFYGik7m80Z6MXtCpfKHIGBN6kIm2x66tLBJM7q3amak0DbqEgD84eQNzwiUkE+Wmk1vGjwtmnydTID0eQ5EpLoDZTGvjr4b2absXzGdKlwC73FloZ6aSSTKocjC7kyu3Ku8D2xOAuOk/ANKEAwhivZKqYXt7jFdyAnl7LTrgDMTcv4sOyCddnlOVnKlU6dTYaPKS5hHg5IIO77nnnfTw0h1QPTTgjWv9MrGB97ki5zvh/JmuJzOFgv4cPm9rGO6TUVD6SGezhV2sdF7OEcEB49qRqbRi0MKVLEEBHXxu8i6YabzMpx1NGJ18OIjr2pG5pHqu7r13efY1ncsK+rfxvtzPW2LY29U3Krxd/Xe4c55PiKgO+meJsNeHVIIdPd/dHHFoUToitSnpsDQrHGn1FpbmoMcoEIJPA/0BNvFEJlVgOi0rPPAWwwPfdKy6nphE1c71tL3snrK796EOSpVUX7Xano628cBgqk/157oP1Y1PcTkChDEwzRJfqNfhyrz7EO/2fPaFI8dAiGqe3sc/gc5pI3wtPFCrwVTcvBXOTuY8on7GrqBMvms8wjhodvWl/YhaEKAG//1MvMHXUO5Cn4m/ACXBMJBwQaFpAAAAAElFTkSuQmCC) no-repeat center;
-        background-size: contain;
-        position: absolute;
-        left: .1rem;
-        top: .14rem;
-    }
-}
-
-.section {
-    padding: .16rem .22rem .1rem;
-    background: #fff;
-    margin-bottom: .1rem;
-    .line_bottom {
-        border-bottom: 1px solid #ededed;
-    }
-    > .title {
-        font-size: .2rem;
-        line-height: .28rem;
-        font-weight: bold;
-        padding-bottom: .05rem;
-        &::before {
-            content: ' ';
-            width: .04rem;
-            height: 0.15rem;
-            background: #14928a;
-            display: inline-block;
-            margin-right: .07rem;
-            border-radius: 8px;
-        }
-    }
-    .indate {
-        font-size: .14rem;
-        padding: .06rem 0;
-        display: flex;
-        // justify-content: space-between;
-        justify-content: flex-end;
-        span {
-            color: #FA101D;
-        }
-    }
-
-    .coutInfo {
-        font-size: .12rem;
-        color: #F85043;
-        text-align: left;
-        border-top: 1px solid #ededed;
-        padding: .12rem 0 0 .15rem;
-        margin-top: .1rem;
-        position: relative;
-        .trumpet_icon {
-            width: .14rem;
-            height: .12rem;
-            background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAYCAYAAADpnJ2CAAAAAXNSR0IArs4c6QAAAyZJREFUSA21Vk1IVFEUPufOezNilJXQD2UQRERamWhBaUWOSS3U0SawdgZai2gR0aoQXPSDm3JRCbm0xZBjbkQZS0KDjKywDCIIkoKKEIkm35uZezr32X0jQ+bY2IU359xzzj3fPXe++4PwDy0W8JdKgjYCWOkzzWIM9X5NN42RbqCKoxOHl1nR2FVJ1MRgqGzxhCxg8VDp6TSRTpCKsQL+aitqjwPRKQ3mjCVygFPz2MGKQqvG/zxW56+c7ZsXkIJH1liB8hARdQPButmD59WR8mUCuqy6ynwd686OmpsN++XjLUiYrZ0g5E6SdJmAVri2FMWDnnIz3P8gxex07Rp/owS6jQij3h1lu7G5Oe5UOF1bcc5+MTRFlBiTEH/iflLe+htYKsh0oHwzBcpztd3bHWlHxPtEUMTFHFV2YdceOglStnLiZGV6xEIlwbBF+JQaqpa6Qw246OiUOKOkICnPus4MFYGik7m80Z6MXtCpfKHIGBN6kIm2x66tLBJM7q3amak0DbqEgD84eQNzwiUkE+Wmk1vGjwtmnydTID0eQ5EpLoDZTGvjr4b2absXzGdKlwC73FloZ6aSSTKocjC7kyu3Ku8D2xOAuOk/ANKEAwhivZKqYXt7jFdyAnl7LTrgDMTcv4sOyCddnlOVnKlU6dTYaPKS5hHg5IIO77nnnfTw0h1QPTTgjWv9MrGB97ki5zvh/JmuJzOFgv4cPm9rGO6TUVD6SGezhV2sdF7OEcEB49qRqbRi0MKVLEEBHXxu8i6YabzMpx1NGJ18OIjr2pG5pHqu7r13efY1ncsK+rfxvtzPW2LY29U3Krxd/Xe4c55PiKgO+meJsNeHVIIdPd/dHHFoUToitSnpsDQrHGn1FpbmoMcoEIJPA/0BNvFEJlVgOi0rPPAWwwPfdKy6nphE1c71tL3snrK796EOSpVUX7Xano628cBgqk/157oP1Y1PcTkChDEwzRJfqNfhyrz7EO/2fPaFI8dAiGqe3sc/gc5pI3wtPFCrwVTcvBXOTuY8on7GrqBMvms8wjhodvWl/YhaEKAG//1MvMHXUO5Cn4m/ACXBMJBwQaFpAAAAAElFTkSuQmCC) no-repeat center;
-            background-size: contain;
-            position: absolute;
-            left: 0;
-            top: .14rem;
-        }
-    }
-}
-
-.options {
-    padding-top: .08rem;
-    .oc {
-        &:last-child {
-            border-top: 1px solid #ededed;
-            margin-top: 0.08rem;
-            padding-top: 0.09rem;
-        }
-    }
-    .protocol {
-        padding-left: .2rem;
-        font-size: .1rem;
-        line-height: .14rem;
-    }
-    &.classInfo {
-        .option .o_ft {
-            color: #444444;
-        }
-    }
-    &.sale {
-        margin-top: .05rem;
-        border-top: 1px solid #ededed;
-        .option {
-            .o_bd, .o_ft {
-                font-size: .16rem;
-                color: #F85043;
-                font-weight: bold;
-            }
-        }
-    }
-    .option {
-        line-height: .26rem;
-        font-size: .15rem;
-        display: flex;
-        align-items: center;
-        position: relative;
-        .o_bd {
-            flex: 1;
-            .c {
-                font-size: .12rem;
-            }
-        }
-        .o_ft {
-            font-size: .14rem;
-            color: #FA101D;
-            del {
-                color: #AAAAAA;
-                font-size: .12rem;
-            }
-        }
-        .check_default {
-            position: relative;
-            margin-right: .08rem;
-            display: block;
-            width: .14rem;
-            height: .14rem;
-            border-radius: 50%;
-            border: .01rem solid #D0CFCF;
-            &::before {
-                position: absolute;
-                top: .01rem;
-                left: .01rem;
-                content: ' ';
-                display: inline-block;
-                width: .12rem;
-                height: .12rem;
-                background: #D0CFCF;
-                border-radius: 50%;
-            }
-            &.check_active {
-                border: .01rem solid #F1111B;
-                &::before {
-                    background: #F1111B;
-                    border-radius: 50%;
-                }
-            }
-        }
-    }
-}
-
-.configuration {
-    padding-right: .05rem;
-    padding-bottom: .09rem;
-    .title {
-        background:rgba(246,246,246,1);
-        height: 1px;
-        position: relative;
-        margin: .15rem 0;
-        span {
-            position: absolute;
-            left: .12rem;
-            top: -.09rem;
-            display: inline-block;
-            background-color: #fff;
-            font-size: .12rem;
-            padding: 0 .04rem;
-        }
-    }
-
-    .content {
-        font-size: .12rem;
-        padding-left: .16rem;
-        line-height: .22rem;
-        color: #ACACAC;
-        .o_ft {
-            color: #AAAAAA;
-            font-size: .12rem;
-        }
-    }
-
-    .options {
-        padding-top: 0;
-        padding-left: .16rem;
-        .option {
-            font-size: .14rem;
-            color: #6F6F6F;
-        }
-    }
-}
-
-.buy {
-    position: fixed;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    height: .6rem;
-    display: flex;
-    align-items: center;
-    padding: 0 .2rem;
-    border-top: 1px solid #FFE9E9E9;
-    color: #000000;
-    font-size: .12rem;
-    background: #fff;
-    .price {
-        flex: 1;
-        font-size: .16rem;
-        
-    }
-    font-size: .16rem;
-    span {
-        color: #FA101D;
-    }
-    .text {
-        font-size: .12rem;
-        width: .6rem;
-        display: inline-block;
-        color: #000;
-    }
-    del {
-        color: #B5B5B5;
-        &.text {
-            color: #B5B5B5;
-        }
-    }
-
-    .btn-submit {
-        display: inline-block;
-        font-size: .18rem;
-        color: #fff;
-        background: #F85043;
-        border-radius: 1rem;
-        box-shadow:0px 2px 4px 0px rgba(0,0,0,0.19);
-        padding: .08rem .46rem;
-    }
-}
-.iframe {
-    width: 100%;
-    height: 100%;
-    -webkit-overflow-scrolling: touch;
-    overflow-y: scroll;
-    border-top: none !important;
-    min-height: calc(100vh - .41rem);
-}
-
-.countDownContent {
-    line-height: .4rem;
-    text-align: center;
-    font-size: .14rem;
-    border-bottom: .01rem solid #ccc;
-    .van-count-down {
-        display: inline;
-        color: #f00;
-    }
-}
-.loadingOrder {
-    width: 90%;
-    height: 1.8rem;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    .van-loading__text {
-        color: #444;
-    }
-}
-</style>

+ 0 - 618
src/views/student/Renew.vue

@@ -1,618 +0,0 @@
-<template>
-    <div class="renew">
-        <m-header :backUrl="titleBackUrl" :name="titleName" />
-
-        <div class="section">
-            <h2 class="title">课程</h2>
-            <div class="options">
-                <div v-for="s in classInfo" :key="s.courseId">
-                    <div class="item" v-if="s.classType == 2">
-                        <div class="option" @click="onSelect(s)">
-                            <div class="0_hd"><i class="check_default" :class="[s.status ? 'check_active' : '']"></i></div>
-                            <div class="o_bd">乐团课</div>
-                            <span class="o_ft">价格:¥{{ s.buyCount * s.price }}</span>
-                        </div>
-                        <p class="timer">开课周期:{{ s.startCycel }}</p>
-                        <!-- <input class="inputAmount" type="number" @keyup="calcAmount" v-model="s.inputNumber" pattern="[0-9]" placeholder="输入金额"> -->
-                    </div>
-                </div>
-            </div>
-        </div>
-
-        <div v-for="c in classInfo" :key="c.courseId">
-            <div class="section" v-if="c.classType != 2">
-                <div class="options">
-                    <div class="option" @click="onSelect(c)">
-                        <div class="0_hd"><i class="check_default" :class="[c.status ? 'check_active' : '']"></i></div>
-                        <div class="o_bd">个别提高课</div>
-                        <span class="o_ft">
-                            现价:¥{{ c.smallAmount }}
-                        </span>
-                    </div>
-                </div>
-                <div class="classInfo">
-                    <div class="class" v-if="c.memo">
-                        <p style="color: #FA101D;">{{ c.memo }}</p>
-                    </div>
-                </div>
-                <div class="classInfo" :class="[c.memo? 'classStatus' : '']">
-                    <div class="class">
-                        <p>学习科目:{{ c.subNames }}</p>
-                        <p>指导老师:{{ c.teaNames }}</p>
-                    </div>
-                    <div class="class">
-                        <p>开课周期:{{ c.startCycel }}</p>
-                        <!-- <p>计划开课周期:{{ c.planCycle }}</p> -->
-                        <p>每课时长:{{ c.duration }}分钟</p>
-                    </div>
-                </div>
-                
-                <div class="classTime">
-                    <p class="title">购买次数:</p>
-                    <div class="ct_button_group">
-                        <span @click="fixationTimer(t, c)" v-for="t in classTimer" :key="t.timer" :class="[t.status?'active':'']">{{ t.timer }}次</span>
-                    </div>
-                    <input type="number" placeholder="输入次数" min="1" max="20" @keyup="onInputCheck(c)" v-model="c.inputNumber" class="inputTime" pattern="[0-9]">
-                </div>
-            </div>
-        </div>
-
-        <div class="buy">
-            <div class="price">
-                 <p class="now_price">
-                     <span class="text">仅需支付</span>
-                     <span>¥{{ orderInfo.referencePrice }}</span>
-                 </p>
-             </div>
-             <a class="btn-submit" @click="onCheckSubmit">购买</a>
-        </div>
-
-        <van-popup id="protocolPopup" :overlay="false" v-model="popupStatus" position="bottom">
-            <small-protocol :proto="protocolData" @popupClose="onPopupClose"></small-protocol>
-        </van-popup>
-
-    </div>
-</template>
-
-<script>
-import SmallProtocol from '@/components/SmallProtocol'
-import MHeader from '@/components/MHeader'
-import qs from 'qs'
-export default {
-    name: 'renew',
-    components: { SmallProtocol, MHeader },
-    data() {
-        return {
-            titleName: '续费', // 标题名称
-            titleBackUrl: {}, // 返回连接
-            popupStatus: false, // 协议弹窗样式
-            protocolData: {}, // 协议参数
-            type: true,
-            classInfo: [],
-            memo: null,
-            inputTimes: 0, // 输入次数
-            // mainSubject: [], // 主课程
-            // 金额列表,金额计算
-            orderInfo: {
-                marketPrice: 0, // 原价总金额
-                referencePrice: 0, // 现价总金额
-            }, // 信息列表
-            classTimer: [{
-                status: true,
-                timer: 10
-            },{
-                status: false,
-                timer: 20
-            }]
-        }
-    },
-    mounted() {
-        let userId = this.$route.query.userId
-
-        this.$axios.post('/user/queryUserCourse', qs.stringify({ userId: userId })).then((res) => {
-            let data = res.data.data.courses
-            // let data = res.data.data
-            if(!data) {
-                throw '数据为空'
-            }
-            this.memo = res.data.data.memo // 特殊描述
-            let tempClassForm = {}
-            if(this.memo) {
-                let tempMemo = this.memo.split('&')
-                tempMemo.forEach(me => {
-                    var memoItem = me.split('^')
-                    tempClassForm[memoItem[0]] = memoItem[1]
-                })
-            }
-            /**
-             * 过滤数据
-             * 乐团课同一个乐团只需要显示一个乐团(价格高的)
-             * 如果有多个乐团课则显示多个
-             */
-            let subjectStatus = {} 
-
-            let paymentConfig = sessionStorage.getItem('paymentConfig')
-            if(paymentConfig) {
-                paymentConfig = JSON.parse(paymentConfig)
-                sessionStorage.removeItem('homeConfig') // 用完就不要了
-            }
-            data.forEach(el => {
-                el.status = false // 状态
-                el.inputNumber = null // 输入的内容
-                el.smallAmount = 0 // 小课金额
-                if(tempClassForm[this.classFormToCN(el.classForm)]) {
-                    el.memo = tempClassForm[this.classFormToCN(el.classForm)]
-                } else if(tempClassForm['default']) {
-                    el.memo = tempClassForm['default']
-                } else {
-                    el.memo = ''
-                }
-                // el.memo = this.memo ? tempClassForm[this.classFormToCN(el.classForm)] : ''
-                // 开课周期
-                el.startCycel = this.weekSelect(5) + ' ' + el.planBegin.split(' ')[1]
-
-                // 课程
-                let searchClassId = subjectStatus[el.classId], // 查询Id是否存在
-                    countAmount =  el.buyCount * el.price //  总价
-                if(!searchClassId && el.classType == 2) {
-                    this.classInfo.push(el)
-                    subjectStatus[el.classId] = {
-                        price: countAmount
-                    }
-                } else if(searchClassId && el.classType == 2 && searchClassId.price < countAmount) {
-                    subjectStatus[el.classId] = {
-                        price: countAmount
-                    }
-                }
-
-                // 小课
-                if(el.classType == 1) {
-                    this.classInfo.push(el)
-                }
-
-                // 
-                if(paymentConfig && paymentConfig.config == el.courseId) {
-                    el.status = true
-                }
-                
-            })
-            this.calcAmount() // 计算金额
-        })
-    },
-    methods: {
-        buy() {
-            let timer = 0 // 购买课次数据
-            let params = {
-                userId: this.$route.query.userId
-            }
-            this.classTimer.forEach(ct => {
-                if(ct.status) {
-                    timer = ct.timer
-                }
-            })
-            let cour = {}
-            let configIndex // 课程编号(唯一) 
-            // 拼接参数
-            this.classInfo.forEach(c => {
-                if(c.classType == 2 && c.status) {
-                   cour = {
-                        courseId: c.courseId,
-                        buyCount: c.buyCount,
-                        price: c.price
-                    }
-                }
-                if(c.classType == 1 && c.status) {
-                    cour = {
-                        courseId: c.courseId,
-                        buyCount: parseInt(this.inputTimes),
-                        price: c.price
-                    }
-                    if(timer) {
-                        cour.buyCount = timer
-                    }
-                }
-                if(c.status) {
-                    configIndex = c.courseId
-                }
-            })
-
-            params.courses = JSON.stringify(cour)
-            // 保存用户选择信息保存本地
-            sessionStorage.setItem('paymentConfig', JSON.stringify({
-                config: configIndex
-            }))
-            return false
-            this.$axios.post('/yqpay/renewalsPay', qs.stringify(params)).then(res => {
-                let result = res.data
-                if(result.status) {
-                    document.querySelector('#onSubmit').action = result.data.host
-                    document.querySelector('#apiContent').value = result.data.apiContent
-                    document.querySelector('#merNo').value = result.data.merNo
-                    document.querySelector('#notifyUrl').value = result.data.notifyUrl
-                    document.querySelector('#sign').value = result.data.sign
-                    document.querySelector('#signType').value = result.data.signType
-                    document.querySelector('#timestamp').value = result.data.timestamp
-                    document.querySelector('#version').value = result.data.version
-                    document.querySelector('#onSubmit').submit()
-                } else {
-                    this.$dialog.alert({
-                        title: '提示',
-                        message: result.msg,
-                        confirmButtonColor: '#269a93'
-                    })
-                }
-            })
-        },
-        onSelect(item) { // 选中哪个课程(大课还是小课)
-            
-            this.classInfo.forEach(e => {
-                e.status = false
-            })
-            item.status = true
-            this.calcAmount()
-        },
-        // 固定次数计算
-        fixationTimer(t, item) {
-            item.inputNumber = null
-            this.classTimer.forEach(e => {
-                e.status = false
-            })
-            t.status = true
-            let amount = t.timer * item.price
-            item.smallAmount = amount
-            // 如果当前课程选中则需要重新计算金额
-            if(item.status) {
-                this.orderInfo.referencePrice = amount
-            }
-        },
-        onInputCheck(item) {
-
-            if(item.inputNumber <= 1 ) {
-                item.inputNumber = 1
-            }
-            if(item.inputNumber > 20) {
-                item.inputNumber = 20
-            }
-
-            this.inputTimes = item.inputNumber
-            this.calcAmount(item)
-        },
-        // 计算总金额
-        calcAmount(item) {
-            let timer, c = this.classInfo
-            this.classTimer.forEach(ct => {
-                // 判断是否从 Input 里面输入的
-                if(item && item.inputNumber) {
-                   ct.status = false 
-                }
-                if(ct.status) {
-                    timer = ct.timer
-                }
-            })
-            c.forEach(e => {
-                // 小课现价
-                let amount = timer ? (timer * e.price) : e.inputNumber * e.price
-                e.smallAmount = amount
-
-                if(e.status) {
-                    if(e.classType == 2) {
-                        this.orderInfo.referencePrice = e.price * e.buyCount
-                    } else {
-                        // 判断是否有选中固定次数
-                        this.orderInfo.referencePrice = amount
-                    }
-                }
-            })
-        },
-        weekSelect(num) {
-            // 计算是周几
-            let res = num.toString(2).split('').reverse() // 转换成二进制 并分割成数组 反转
-            let strArr = []
-            parseInt(res[0]) ? strArr.push('周一') : ''
-            parseInt(res[1]) ? strArr.push('周二') : ''
-            parseInt(res[2]) ? strArr.push('周三') : ''
-            parseInt(res[3]) ? strArr.push('周四') : ''
-            parseInt(res[4]) ? strArr.push('周五') : ''
-            parseInt(res[5]) ? strArr.push('周六') : ''
-            parseInt(res[6]) ? strArr.push('周七') : ''
-
-            strArr = strArr.join('和')
-            return strArr
-        },
-        onCheckSubmit() {
-            // 小课需要弹出协议
-            let buyTimer 
-            this.classTimer.forEach(e => {
-                if(e.status) {
-                    buyTimer = e.timer
-                }
-            }) 
-            let item 
-            this.classInfo.forEach(c => {
-                if(c.status) {
-                    item = c
-                }
-            })
-
-            if(!item) {
-                this.$dialog.alert({
-                    title: '提示',
-                    message: '请选择续费课程',
-                    confirmButtonColor: '#269a93'
-                })
-                return false
-            }
-
-            let tempBuyCount 
-            if(item.classType == 2) {
-                tempBuyCount = item.buyCount
-            } else {
-                tempBuyCount = buyTimer ? buyTimer : parseInt(this.inputTimes)
-            }
-            this.protocolData = {
-                userId: this.$route.query.userId,
-                price: item.price,
-                buyCount: tempBuyCount,
-                classForm: item.classForm,
-                className: item.className,
-                subNames: item.subNames,
-                classType: item.classType
-            }
-            this.popupStatus = true
-            this.titleName = '领用协议'
-            this.titleBackUrl.callBack = () => {
-                this.popupStatus = false
-            }
-        },
-        onPopupClose() {
-            // document.querySelector('#protocolPopup').scroll(0, 0)
-            // this.popupStatus = false
-            this.titleName = '续费'
-            this.titleBackUrl.callBack = null
-            // this.buy()
-        },
-        classFormToCN(number) { // 小课课程类型
-            let resultStr
-            switch(number) {
-                case 1001:
-                    resultStr = '1V1'
-                break;
-                case 2002:
-                    resultStr = '1V2'
-                break;
-                case 3003:
-                    resultStr = '1V3'
-                break;
-                case 4004:
-                    resultStr = '1V4'
-                break;
-                case 5005:
-                    resultStr = '1V5'
-                break;
-                case 6020:
-                    resultStr = '小组课'
-                break;
-                case 21099:
-                    resultStr = '大课'
-                break;
-                case 999999:
-                    resultStr = '团体课'
-                break;
-            }
-            return resultStr
-        }
-    }
-}
-</script>
-
-<style lang="less" scoped>
-.renew {
-    margin-bottom: .7rem;
-}
-.classStatus {
-    border-top:0 !important; 
-    margin-top: 0 !important; 
-    padding-top: 0 !important;
-}
-
-header {
-    height: .40rem;
-    line-height: .40rem;
-    color: #000;
-    font-size: .17rem;
-    background: #fff;
-    box-shadow: 0px 1px 8px 0px rgba(0,0,0,0.07);
-    text-align: center;
-    margin-bottom: .06rem;
-}
-/deep/.van-popup {
-    height: calc(100% - .44rem);
-}
-.section {
-    padding: .16rem .22rem .1rem;
-    background: #fff;
-    margin-bottom: .1rem;
-    .line_bottom {
-        border-bottom: 1px solid #ededed;
-    }
-    > .title {
-        font-size: .2rem;
-        line-height: .28rem;
-        font-weight: bold;
-        &::before {
-            content: ' ';
-            width: .04rem;
-            height: 0.15rem;
-            background: #14928a;
-            display: inline-block;
-            margin-right: .07rem;
-            border-radius: 8px;
-        }
-    }
-}
-
-.options {
-    // padding-top: .08rem;
-    .option {
-        line-height: .26rem;
-        font-size: .15rem;
-        display: flex;
-        align-items: center;
-        position: relative;
-        .o_bd {
-            flex: 1;
-            .protocol {
-                font-size: .1rem;
-                line-height: .14rem;
-            }
-        }
-        .o_ft {
-            font-size: .12rem;
-            color: #FA101D;
-            del {
-                color: #AAAAAA;
-                font-size: .11rem;
-            }
-        }
-        .check_default {
-            position: relative;
-            margin-right: .08rem;
-            display: block;
-            width: .14rem;
-            height: .14rem;
-            border-radius: 50%;
-            border: .01rem solid #D0CFCF;
-            &::before {
-                position: absolute;
-                top: .01rem;
-                left: .01rem;
-                content: ' ';
-                display: inline-block;
-                width: .12rem;
-                height: .12rem;
-                background: #D0CFCF;
-                border-radius: 50%;
-            }
-            &.check_active {
-                border: .01rem solid #F1111B;
-                &::before {
-                    background: #F1111B;
-                    border-radius: 50%;
-                }
-            }
-        }
-    }
-}
-.item {
-    position: relative;
-    border-top: 1px solid #ededed;
-    padding: .2rem 0;
-    // &:last-child {
-    //     border-bottom: 0;
-    // }
-    .timer {
-        font-size: .14rem;
-        color: #ACACAC;
-    }
-    .inputAmount {
-        position: absolute;
-        top: .2rem;
-        right: 0;
-        width: 1.08rem;
-        height: .4rem;
-        border-radius: 5px;
-        border: 1px solid rgba(238,238,238,1);
-        padding-left: .08rem;
-    }
-}
-
-.classInfo {
-    color: #ACACAC;
-    font-size: .12rem;
-    display: flex;
-    justify-content: space-between;
-    border-top: 1px solid #ededed;
-    margin-top: .08rem;
-    padding-top: .08rem;
-    line-height: .22rem;
-}
-.classTime {
-    color: #ACACAC;
-    font-size: .12rem;
-    .ct_button_group {
-        padding-top: .08rem;
-        padding-bottom: .15rem;
-        display: flex;
-        justify-content: space-between;
-        span {
-            width: 1.6rem;
-            line-height: .36rem;
-            text-align: center;
-            background:rgba(255,255,255,1);
-            border-radius:5px;
-            font-size: .14rem;
-            color: #444444;
-            border:1px solid rgba(226,224,224,1);
-            &.active {
-                background: #14928A;
-                color: #fff;
-            }
-        }
-    }
-    .inputTime {
-        width: calc(100% - .08rem);
-        height: .4rem;
-        border-radius:5px;
-        border:1px solid rgba(238,238,238,1);
-        padding-left: .08rem;
-        font-size: .14rem;
-        color: #444;
-    }
-}
-
-.buy {
-    position: fixed;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    height: .6rem;
-    display: flex;
-    align-items: center;
-    padding: 0 .2rem;
-    border-top: 1px solid #FFE9E9E9;
-    color: #000000;
-    font-size: .12rem;
-    background: #fff;
-    .price {
-        flex: 1;
-        font-size: .16rem;
-        
-    }
-    font-size: .16rem;
-    span {
-        color: #FA101D;
-    }
-    .text {
-        font-size: .12rem;
-        width: .55rem;
-        display: inline-block;
-        color: #000;
-    }
-    del {
-        color: #B5B5B5;
-        &.text {
-            color: #B5B5B5;
-        }
-    }
-
-    .btn-submit {
-        display: inline-block;
-        font-size: .18rem;
-        color: #fff;
-        background: #F85043;
-        border-radius: 1rem;
-        box-shadow:0px 2px 4px 0px rgba(0,0,0,0.19);
-        padding: .08rem .46rem;
-    }
-}
-</style>

+ 0 - 144
src/views/student/Special.vue

@@ -1,144 +0,0 @@
-<template>
-    <div class="special">
-        <!-- <m-header /> -->
-        <header style="display: none;">报名</header>
-        <m-search @onSearch="onSearch" />
-        <div class="specialList">
-            <van-list v-model="loading"  v-if="show" key="teachcer"
-                :finished="finished"
-                finished-text="我是有底线的"
-                @load="getNewsList()">
-                <a :href="'/specialdetail/' + item.id" v-for="(item, index) in dataList" :key="index" 
-                     class="item-container">
-                    <h2>{{ item.title }}</h2>
-                    <div class="topinfo">
-                        <p>{{ item.updateTime }}</p>
-                        <p></p>
-                    </div>
-                    <div class="specialMsg">
-                        {{ item.content }}
-                    </div>
-                    <div class="imgWrap" v-if="item.coverImage">
-                        <!-- <img :src="item.coverImage" alt=""> -->
-                        <van-image :src="item.coverImage">
-                            <template v-slot:loading>
-                                <van-loading type="spinner" size="20" />
-                            </template>
-                        </van-image>
-                    </div>
-                </a>
-            </van-list>
-            <m-empty v-else key="teachcer" />
-        </div>
-    </div>
-</template>
-<script>
-import MHeader from '@/components/MHeader'
-import MSearch from '@/components/MSearch'
-import MEmpty from '@/components/MEmpty'
-import { newsList } from '@/api/student'
-export default {
-    name: 'special',
-    components: { MHeader, MSearch, MEmpty },
-    data() {
-        return {
-            search: null, // 查询信息
-            show: true, // 判断是否有数据
-            dataList: [], // 老师列表
-            loading: false,
-            finished: false,
-            params: {
-                type: this.$route.params.type,
-                page: 1,
-                rows: 10
-            }
-        }
-    },
-    mounted() {
-        let tempTitle = {
-            1: "精彩活动",
-            2: "热门资讯",
-            3: "活动列表"
-        }
-        document.title = tempTitle[this.params.type]
-    },
-    methods: {
-        onSearch(value) {
-            this.dataList = [] // 重置数据
-            this.show = true
-            this.search = value
-            this.params.page = 1
-            this.finished = false
-        },
-        getNewsList() {
-            let params = this.params
-            if(this.search && this.search != null) {
-                params.search = this.search
-            }
-            newsList(params).then(res => {
-                let result = res.data
-                this.loading = false
-                if(result.code == 200) {
-                    this.dataList.push(...result.data.rows)
-                    if(params.page >= Math.ceil(result.data.total / params.rows)) {
-                        this.finished = true
-                    }
-                    this.params.page++
-                } else {
-                    this.finished = true
-                }
-                if(this.dataList.length <= 0) {
-                    this.show = false
-                }
-            })
-        }
-    },
-}
-</script>
-<style lang="less" scoped>
-.special {
-    background-color: #fff;
-}
-.item-container {
-    display: block;
-    padding: .1rem 0.15rem .15rem;
-    border-bottom: 0.04rem solid rgba(65, 65, 65, 0.05);
-    
-    h2 {
-        font-size: 0.18rem;
-        color: rgba(68, 68, 68, 1);
-        line-height: 0.25rem;
-        font-weight: 600;
-    }
-}
-.topinfo {
-    margin-top: 0.05rem;
-    display: flex;
-    flex-direction: row;
-    justify-content: space-between;
-    font-size: 12px;
-    font-family: PingFang-SC;
-    font-weight: 500;
-    color: rgba(170, 170, 170, 1);
-    line-height: 17px;
-}
-.specialMsg {
-    margin-top: 0.08rem;
-    font-size: 0.14rem;
-    font-weight: 500;
-    color: rgba(119, 119, 119, 1);
-    line-height: 20px;
-}
-.imgWrap {
-    max-height: 1.75rem;
-    margin-top: 0.08rem;
-    border-radius: 0.05rem;
-    overflow: hidden;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    img {
-        width: 100%;
-    }
-}
-</style>

+ 0 - 89
src/views/student/SpecialDetail.vue

@@ -1,89 +0,0 @@
-<template>
-    <div class="specialdetail">
-        <!-- <m-header /> -->
-        <div class="sd-container">
-            <h2>{{ dataInfo.title }}</h2>
-            <div class="titleInfo">
-                <p>大雅乐盟</p>
-                <p>{{ dataInfo.updateTime }}</p>
-            </div>
-            <div class="imgWrap" v-if="dataInfo.coverImage">
-                <!-- <img src="@/assets/images/squrt.png" width="100%" alt /> -->
-                <img :src="dataInfo.coverImage" width="100%" alt />
-            </div>
-            <div class="msgWrap">
-                <p>{{ dataInfo.content }}</p>
-            </div>
-        </div>
-    </div>
-</template>
-<script>
-import MHeader from '@/components/MHeader'
-import { newsQuery } from '@/api/student'
-export default {
-    components: { MHeader },
-    data() {
-      return {
-        dataInfo: {}
-      }
-    },
-    mounted() {
-      this.__init()
-    },
-    methods: {
-      __init() {
-        newsQuery({
-          id: this.$route.params.id
-        }).then(res => {
-          let result = res.data
-          if(result.code == 200) {
-            this.dataInfo = result.data
-            let tempTitle = {
-              1: "精彩活动详情",
-              2: "热门资讯详情",
-              3: "活动列表详情"
-          }
-          document.title = tempTitle[result.data.type]
-          }
-        })
-      }
-    }
-}
-</script>
-<style scoped>
-.specialdetail {
-  background: #fff;
-}
-.sd-container {
-  padding: 0.15rem;
-}
-.sd-container h2 {
-  font-weight: 500;
-  color: rgba(68, 68, 68, 1);
-  line-height: 0.37rem;
-  font-size: 0.26rem;
-  margin-bottom: 0.1rem;
-}
-.titleInfo {
-  height: 0.15rem;
-  line-height: 0.15rem;
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  color: #444;
-  margin-bottom: 0.25rem;
-}
-.imgWrap {
-  /* width: 100;
-  height: 1.45rem; */
-  margin-bottom: 0.15rem;
-}
-.msgWrap p {
-  font-size: .16rem;
-  font-family: PingFangSC;
-  font-weight: 400;
-  color: rgba(68, 68, 68, 1);
-  line-height: .28rem;
-  text-indent: .32rem;
-}
-</style>

+ 0 - 123
src/views/student/paymentResult.vue

@@ -1,123 +0,0 @@
-<template>
-  <div class="paymentresult">
-      <m-header />
-        <div class="payon" v-if="status == 'on'">
-          <img src="@/assets/images/pay_success.png" alt="">
-          <p>支付成功</p>
-          <van-button type="info" @click="onAppBack" round>返回</van-button>
-      </div>
-
-      <div class="payerror" v-if="status == 'error'">
-          <img src="@/assets/images/pay_error.png" alt="">
-          <p>支付失败</p>
-          <van-button type="info" @click="onRepay" round>重新支付</van-button>
-      </div>
-
-      <div class="paysuccess" v-if="status == 'success'">
-          <div class="status">
-              <img src="@/assets/images/pay_success.png" alt="">
-              <p>支付成功</p>
-              <p class="money">¥200.00</p>
-          </div>
-          <div class="orderinfo">
-              <p><span>购买时间:</span>2019-02-10  14:22:22</p>
-              <p><span>订单号:</span>83901898198219</p>
-              <p><span>购买详情:</span></p>
-              <p>乐团声部训练<br/>
-                乐团合奏训练<br/>
-                基础技能训练<br/>
-                假期集中训练<br/>
-                长笛—初级配置<br/>
-                节拍器<br/>
-                谱架<br/>
-                乐器保养<br/>
-                教材<br/>
-                乐谱</p>
-          </div>
-          <van-button type="info" @click="onRepay" round>返回</van-button>
-      </div>
-  </div>
-</template>
-
-<script>
-import MHeader from '@/components/MHeader'
-import { browser }  from '@/common/common'
-export default {
-    name: 'paymentresult',
-    components: { MHeader },
-    data() {
-        return {
-            status: this.$route.query.type
-        }
-    },
-    methods: {
-        onAppBack() {
-            if(browser().android) {
-                DAYA.postMessage(JSON.stringify({api: 'back'}))
-            } else if(browser().ios) {
-
-            }
-            
-        },
-        onRepay() {
-            
-        }
-    }
-}
-</script>
-
-<style lang="less" scoped>
-.payerror, .payon {
-    padding-top: 1rem;
-    img {
-        display: block;
-        margin: 0 auto;
-        width: 1.03rem;
-        height: 1.37rem;
-    }
-    p {
-        padding-top: .12rem;
-        font-size: .18rem;
-        color: #444444;
-        text-align: center;
-        margin-bottom: 1.5rem;
-    }
-}
-.van-button {
-    width: 90%;
-    margin: 0 5% 0;
-    line-height: .48rem;
-    height: .5rem;
-    font-size: .18rem;
-}
-.paysuccess {
-    .status {
-        background-color: #fff;
-        text-align: center;
-        font-size: .16rem;
-        color: #444;
-        padding-bottom: .1rem;
-        margin-bottom: .1rem;
-        img {
-            margin-top: .1rem;
-            width: .58rem;
-            height: .71rem;
-        }
-        .money {
-            font-size: .14rem;
-            color: #F97215;
-        }
-    }
-    .orderinfo {
-        position: relative;
-        margin-bottom: .25rem;
-        padding: .15rem .15rem .48rem;
-        background-color: #fff;
-        font-size: .14rem;
-        color: #777777;
-        span {
-            color: #444444;
-        }
-    }
-}
-</style>

+ 0 - 189
src/views/student/smallRegister.vue

@@ -1,189 +0,0 @@
-<template>
-<div class="smallregister">
-    <div class="header">
-        <div class="left">
-            <h2>当前小班课声部:<span>长笛</span></h2>
-            <p>请选择加入一个小班课,已满员的小班课不能报名,仍然有疑问请联系教务老师</p>
-        </div>
-        <img class="right" src="@/assets/images/icon_pople.png" alt="">
-    </div>
-
-    <div class="class-list">
-        <div class="class-item">
-            <span class="ci-hd"><img src="@/assets/images/icon_half.png" alt=""></span>
-            <div class="ci-bd">
-                <h3>长笛小班</h3>
-                <p>周三  16:00-16:45</p>
-                <p>王老师</p>
-            </div>
-            <div class="ci-ft">报名:10/10</div>
-
-        </div>
-        <div class="class-item checked">
-            <span class="ci-hd"><img src="@/assets/images/icon_half.png" alt=""></span>
-            <div class="ci-bd">
-                <h3>长笛小班</h3>
-                <p>周三  16:00-16:45</p>
-                <p>王老师</p>
-            </div>
-            <div class="ci-ft">报名:10/10</div>
-            <i class="checked"></i>
-        </div>
-        <div class="class-item disabled">
-            <span class="ci-hd"><img src="@/assets/images/icon_half_no.png" alt=""></span>
-            <div class="ci-bd">
-                <h3>长笛小班</h3>
-                <p>周三  16:00-16:45</p>
-                <p>王老师</p>
-            </div>
-            <div class="ci-ft">报名:10/10</div>
-        </div>
-    </div>
-
-    <van-button type="info" @click="onRepay" round>确定</van-button>
-</div>
-</template>
-
-<script>
-import MHeader from '@/components/MHeader'
-import { browser }  from '@/common/common'
-export default {
-    name: 'smallregister',
-    components: { MHeader },
-    data() {
-        return {
-            status: this.$route.query.type
-        }
-    },
-    methods: {
-        onAppBack() {
-            if(browser().android) {
-                DAYA.postMessage(JSON.stringify({api: 'back'}))
-            } else if(browser().ios) {
-
-            }
-            
-        },
-        onRepay() {
-            
-        }
-    }
-}
-</script>
-
-<style lang="less" scoped>
-.header {
-    background: #fff;
-    padding: .15rem .2rem;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    .right {
-        margin-left: .1rem;
-        width: .6rem;
-        height: .6rem;
-        flex: 1 auto;
-    }
-    h2 {
-        font-size: .18rem;
-        color: #444444;
-        span {
-            color: #F97215;
-        }
-    }
-    p {
-        font-size: .14rem;
-        color: #777;
-    }
-}
-.class-list {
-    padding: .1rem .2rem .3rem;
-    
-}
-.class-item {
-    position: relative;
-    border-radius: .08rem;
-    box-shadow:0px 4px 8px 0px rgba(0,0,0,0.08),0px 0px 1px 0px rgba(0,0,0,0.08);
-    background: #fff;
-    padding: .1rem 0;
-    margin-bottom: .1rem;
-    display: flex;
-    align-items: center;
-    border: 1px solid transparent;
-    &.checked {
-        border: 1px solid #F97215;
-    }
-    &.disabled {
-        .ci-bd {
-            color: #aaa;
-            h3 {
-                color: #777;
-            }
-        }
-        .ci-ft {
-            background: #AAAAAA;
-            &::before {
-                background: url('../../assets/images/m_title_no.png') no-repeat center;
-            }
-        }
-    }
-    .ci-hd {
-        margin-left: -1px;
-        width: .31rem;
-        height: .75rem;
-        display: block;
-        img {
-            width: 100%;
-        }
-    }
-    .ci-bd {
-        padding-left: .2rem;
-        line-height: .22rem;
-        font-size: .14rem;
-        color: #777777;
-        h3 {
-            font-size: .16rem;
-            color: #444444;
-        }
-    }
-    .ci-ft {
-        position: absolute;
-        bottom: .14rem;
-        right: -.01rem;
-        background: #F97215;
-        color: #fff;
-        font-size: .12rem;
-        line-height: .28rem;
-        width: .75rem;
-        text-align: center;
-        height: .28rem;
-        &::before {
-            content: ' ';
-            position: absolute;
-            left: -.1rem;
-            height: .28rem;
-            width: .1rem;
-            background: url('../../assets/images/m_title_icon.png') no-repeat center;
-        }
-    }
-    .checked {
-        position: absolute;
-        top: 0;
-        right: -.01rem;
-        width: .2rem;
-        height: .2rem;
-        background: url('../../assets/images/icon_checked.png') no-repeat center;
-        background-size: contain;
-    }
-}
-.smallregister {
-    min-height: 100vh;
-}
-.van-button {
-    width: 90%;
-    margin: 0 5% 0;
-    line-height: .48rem;
-    height: .5rem;
-    font-size: .18rem;
-}
-</style>

+ 111 - 25
src/views/teacher/Approval.vue

@@ -3,34 +3,46 @@
         <m-header />
         <van-tabs :swipeable="true" :animated="true">
             <van-tab title="待处理">
-                <div v-for="i in 6" :key="i" class="app-item">
-                    <div class="hd">
-                        <span class="orangeStatus">待处理</span>
-                        <span>2019-09-01</span>
+                <van-list v-model="dataSection.loading" v-if="dataSection.show" key="data"
+                    :finished="dataSection.finished"
+                    finished-text="我是有底线的"
+                    @load="getClassGroupList">
+                    <div v-for="(item, index) in dataSection.dataList" :key="index" class="app-item">
+                        <div class="hd">
+                            <span class="orangeStatus">待处理</span>
+                            <span>2019-09-01</span>
+                        </div>
+                        <div class="bd">
+                            <p>申请人:黄青筝</p>
+                            <p>审批事项:调休</p>
+                            <p>开始时间:2019-09-01  9:00</p>
+                            <p>结束时间:2019-09-01  18:00</p>
+                            <p>备注:家中急事,调休一天</p>
+                        </div>
                     </div>
-                    <div class="bd">
-                        <p>申请人:黄青筝</p>
-                        <p>审批事项:调休</p>
-                        <p>开始时间:2019-09-01  9:00</p>
-                        <p>结束时间:2019-09-01  18:00</p>
-                        <p>备注:家中急事,调休一天</p>
-                    </div>
-                </div>
+                </van-list>
+                <m-empty v-else key="data" />
             </van-tab>
             <van-tab title="已处理">
-                <div v-for="i in 6" :key="i" class="app-item">
-                    <div class="hd">
-                        <span class="orangeStatus">待处理</span>
-                        <span>2019-09-01</span>
-                    </div>
-                    <div class="bd">
-                        <p>申请人:黄青筝</p>
-                        <p>审批事项:调休</p>
-                        <p>开始时间:2019-09-01  9:00</p>
-                        <p>结束时间:2019-09-01  18:00</p>
-                        <p>备注:家中急事,调休一天</p>
+                <van-list v-model="recordSection.loading"  v-if="recordSection.show" key="records"
+                    :finished="recordSection.finished"
+                    finished-text="我是有底线的"
+                    @load="getStudentAttendanceList">
+                    <div v-for="i in 6" :key="i" class="app-item">
+                        <div class="hd">
+                            <span class="orangeStatus">待处理</span>
+                            <span>2019-09-01</span>
+                        </div>
+                        <div class="bd">
+                            <p>申请人:黄青筝</p>
+                            <p>审批事项:调休</p>
+                            <p>开始时间:2019-09-01  9:00</p>
+                            <p>结束时间:2019-09-01  18:00</p>
+                            <p>备注:家中急事,调休一天</p>
+                        </div>
                     </div>
-                </div>
+                </van-list>
+                <m-empty v-else key="records" />
             </van-tab>
         </van-tabs>
 
@@ -38,13 +50,87 @@
 </template>
 <script>
 import MHeader from '@/components/MHeader'
+import MEmpty from '@/components/MEmpty'
+import { queryWaitList, queryProcessedList } from '@/api/teacher'
 export default {
     name: 'approval',
-    components: { MHeader },
+    components: { MHeader, MEmpty },
+    data() {
+        return {
+            dataSection: {
+                show: true, // 判断是否有数据
+                dataList: [],
+                loading: false,
+                finished: false,
+                params: {
+                    groupId: this.$route.params.groupId,
+                    pageNo: 1,
+                    pageSize: 10
+                }
+            },
+            recordSection: {
+                show: true, // 判断是否有数据
+                recordList: [],
+                loading: false,
+                finished: false,
+                params: {
+                    groupId: this.$route.params.groupId,
+                    pageNo: 1,
+                    pageSize: 10
+                }
+            }
+        }
+    },
+    methods: {
+        getClassGroupList() { 
+            let dataSection = this.dataSection
+            let params = dataSection.params
+            queryWaitList(params).then(res => {
+                let result = res.data
+                dataSection.loading = false
+                if(result.code == 200) {
+                    dataSection.dataList = dataSection.dataList.concat(result.data.result)
+                    if(params.pageNo >= result.data.totalPages) {
+                        dataSection.finished = true
+                    }
+                    dataSection.params.pageNo++
+                } else {
+                    dataSection.finished = true
+                }
+                if(dataSection.dataList.length <= 0) {
+                    dataSection.show = false
+                }
+            })
+        },
+        getStudentAttendanceList() { 
+            let recordSection = this.recordSection
+            let params = recordSection.params
+            queryProcessedList(params).then(res => {
+                let result = res.data
+                recordSection.loading = false
+                if(result.returnCode == 200) {
+                    this.recordTotal = result.total
+                    recordSection.recordList = recordSection.recordList.concat(result.records)
+                    if(params.pageNo >= result.pages) {
+                        recordSection.finished = true
+                    }
+                    recordSection.params.pageNo++
+                } else {
+                    recordSection.finished = true
+                }
+                if(recordSection.recordList.length <= 0) {
+                    recordSection.show = false
+                }
+            })
+        },
+    }
 }
 </script>
 <style lang='less' scoped>
 @import url("../../assets/commonLess/variable.less");
+.approval {
+    min-height: 100vh;
+}
 /deep/.van-tab--active {
     color: #EF5A50;
 }

+ 5 - 1
src/views/teacher/Attendance.vue

@@ -37,7 +37,7 @@
         <div class="stu_info" v-for="value in 5" :key="value">
             <van-cell :center="true" title-class="truant">
                 <template slot="icon">
-                    <img class="logo" src="http://dev.dayaedu.com/img/teacher1.91bf990d.png" alt="">
+                    <img class="logo" src="@/assets/images/default_head_img.png" alt="">
                 </template>
                 <template slot="default">到课(天):21<br/>旷课(天):21<br/>请假(天):21</template>
                 <template slot="title">阿曼湾<van-tag type="danger" size="medium">连续旷课</van-tag></template>
@@ -72,6 +72,7 @@
 </template>
 <script>
 import MHeader from '@/components/MHeader'
+import { statisticsInfo, statisticsList } from '@/api/teacher'
 export default {
     name: 'attendance',
     components: { MHeader },
@@ -87,6 +88,9 @@ export default {
         }
     },
     methods: {
+        __init() {
+            statisticsInfo()
+        },
         onDropDownChange() {
             // dropdown 切换时
             this.showPicker = true

+ 5 - 8
src/views/teacher/Business.vue

@@ -12,7 +12,7 @@
                 <router-link :to="{ path: '/ccme' }" 
                             class="module-link"><i class="icon icon_3"></i>抄送我的</router-link>
             </div>
-        </section>
+        </section> -->
 
         <section class="module m-shadow">
             <h2 class="title">业务申请</h2>
@@ -21,7 +21,7 @@
                             class="module-link"><i class="icon icon_4"></i>我要请假</router-link>
                 <router-link :to="{ path: '/periodadjust' }" 
                             class="module-link"><i class="icon icon_5"></i>课时调整</router-link>
-                <router-link :to="{ path: '/earnings' }" 
+                <router-link :to="{ path: '/VIPApply' }" 
                             class="module-link"><i class="icon icon_6"></i>VIP申请</router-link>
             </div>
         </section>
@@ -31,26 +31,23 @@
             <div class="module-item">
                 <span class="module-link"><i class="icon icon_7"></i>作业列表</span>
             </div>
-        </section> -->
+        </section>
 
-        <div  v-html="dataInfo">        </div>
     </div>
 </template>
 <script>
 import MHeader from '@/components/MHeader'
-import { queryGoodsContract } from '@/api/student'
 export default {
   name: 'business',
   components: { MHeader },
   data() {
       return {
+          userId: this.$route.params.userId,
           dataInfo: null
       }
   },
   mounted () { 
-      queryGoodsContract({ musicGroupId: 1 }).then(res => {
-          this.dataInfo = res.data.data
-      })
+
   },
 }
 </script>

+ 72 - 16
src/views/teacher/IStarted.vue

@@ -1,35 +1,91 @@
 <template>
     <div class="istarted">
         <m-header />
-        <m-search />
+        <m-search @onSearch="onSearch" />
         <div class="section">
-            <router-link :to="{ path: '/starteddetail' }" v-for="i in 6" :key="i" class="app-item">
-                <div class="hd">
-                    <span class="orangeStatus">待处理</span>
-                    <span>2019-09-01</span>
-                </div>
-                <div class="bd">
-                    <p>申请人:黄青筝</p>
-                    <p>审批事项:调休</p>
-                    <p>开始时间:2019-09-01  9:00</p>
-                    <p>结束时间:2019-09-01  18:00</p>
-                    <p>备注:家中急事,调休一天</p>
-                </div>
-            </router-link>
+            <van-list v-model="loading"  v-if="dataShow" key="data"
+                :finished="finished"
+                finished-text="我是有底线的"
+                @load="getBindList">
+                <router-link :to="{ path: '/starteddetail' }" v-for="i in 6" :key="i" class="app-item">
+                    <div class="hd">
+                        <span class="orangeStatus">待处理</span>
+                        <span>2019-09-01</span>
+                    </div>
+                    <div class="bd">
+                        <p>申请人:黄青筝</p>
+                        <p>审批事项:调休</p>
+                        <p>开始时间:2019-09-01  9:00</p>
+                        <p>结束时间:2019-09-01  18:00</p>
+                        <p>备注:家中急事,调休一天</p>
+                    </div>
+                </router-link>
+            </van-list>
+            <m-empty v-else key="data" />
         </div>
     </div>
 </template>
 <script>
 import MHeader from '@/components/MHeader'
 import MSearch from '@/components/MSearch'
+import MEmpty from '@/components/MEmpty'
+import { queryMyCreatedList } from '@/api/teacher'
 export default {
     name: 'istarted',
-    components: { MHeader, MSearch }
+    components: { MHeader, MSearch, MEmpty },
+    data() {
+        return {
+            loading: false,
+            finished: false,
+            params: {
+                name: '',
+                userId: this.$route.params.userId,
+                pageNo: 1,
+                pageSize: 10
+            },
+            dataShow: true, // 是否有数据
+            dataList: []
+        }
+    },
+    methods: {
+        onSearch(value) {
+            this.dataList = [] // 重置数据
+            this.dataShow = true
+            this.params.pageNo = 1
+            this.params.name = value
+            this.finished = false
+        },
+        getBindList() {
+            let params = this.params
+            queryMyCreatedList(params).then(res => {
+                let result = res.data
+                this.loading = false
+                if(result.code == 200) {
+                    console.log(result)
+                    params.pageNo = result.pageNo
+                    console.log(result.pageNo)
+                    this.dataList = this.dataList.concat(result.records)
+                    if(params.pageNo >= result.totalPages) {
+                        this.finished = true
+                    }
+                    this.params.pageNo++
+                } else {
+                    this.finished = true
+                }
+                // 判断是否有数据
+                if(this.dataList.length <= 0) {
+                    this.dataShow = false
+                }
+            })
+        }
+    }
 }
 </script>
 <style lang='less' scoped>
 @import url("../../assets/commonLess/variable.less");
-
+.istarted {
+    min-height: 100vh;
+}
 .app-item {
     margin: 0 .16rem .1rem;
     background: @whiteColor;

+ 222 - 55
src/views/teacher/Leave.vue

@@ -1,64 +1,40 @@
 <template>
     <div class="leave">
-        <m-header />
+        <m-header v-if="headerStatus" />
 
         <van-cell-group class="search">
-            <van-cell title="开始时间" 
-                      :value="searchList.startText" 
-                      readonly 
-                      clickable
+            <van-field label="开始时间" placeholder="选择开始时间" input-align="right"
+                      v-model="searchList.startText" readonly is-link
                       @click="startShow = true" />
-            <van-cell title="结束时间" 
-                      :value="searchList.endText" 
-                      readonly 
-                      clickable
+            <van-field label="结束时间" input-align="right" placeholder="选择结束时间"
+                      v-model="searchList.endText" readonly is-link
                       @click="endShow = true" />
-            <van-cell title="请假类型" 
-                      :value="searchList.dealText" 
-                      readonly 
-                      clickable
+            <van-field label="请假类型" is-link input-align="right" placeholder="选择请假类型"
+                      v-model="searchList.dealText" readonly clickable
                       @click="dealShow = true" />
             
-            <van-field
-                type="textarea"
-                placeholder="请详细说明必须请假的原因"
-                rows="4"
-                autosize />
+            <van-field type="textarea" v-model="searchList.remark" placeholder="请详细说明必须请假的原因"
+                rows="4" autosize />
         </van-cell-group>
 
-        <van-panel title="课时安排">
-            <div class="leaveCell">
-                <div class="leaveCell-l">VIP课</div>
+        <van-panel title="课时安排" v-if="vipList.length > 0">
+            <div class="leaveCell" v-for="(item, index) in vipList" :key="index">
+                <div class="leaveCell-l">{{ item.name }}</div>
                 <div class="leaveCell-r">
                     <div class="left-wrap">
                         <p class="classTime">上课时间</p>
-                        <p>09-03 13:00</p>
+                        <p>{{ item.classDate | getFormatTime(item.startClassTime) }}</p>
                         <div class="line"></div>
                         <img src="@/assets/images/switch-icon.png"
                             alt=""
                             class="icon">
                     </div>
-                    <div class="left-wrap">
-                        <!-- <p class="classTime">已调整为</p>
-                        <p>09-03 13:00 <van-icon name="edit" /></p> -->
-                        <van-button round type="info" size="small">调整</van-button>
-                    </div>
-                </div>
-            </div>
-            <div class="leaveCell">
-                <div class="leaveCell-l">VIP课</div>
-                <div class="leaveCell-r">
-                    <div class="left-wrap">
-                        <p class="classTime">上课时间</p>
-                        <p>09-03 13:00</p>
-                        <div class="line"></div>
-                        <img src="@/assets/images/switch-icon.png"
-                            alt=""
-                            class="icon">
-                    </div>
-                    <div class="left-wrap">
+                    <div class="left-wrap" v-if="item.changeTime">
                         <p class="classTime">已调整为</p>
-                        <p><span>09-03 13:00</span> <van-icon name="edit" /></p>
+                        <p>{{ item.changeTime }} <van-icon @click="onUpdate(item)" name="edit" /></p>
+                    </div>
+                    <div class="left-wrap" v-else>
+                        <van-button @click="onAdd(item)" round type="info" size="small">调整</van-button>
                     </div>
                 </div>
             </div>
@@ -77,7 +53,7 @@
                 :min-date="startDate.minDate"
                 :max-date="startDate.maxDate"
                 @cancel="startShow = false"
-                @confirm="startShow = false"
+                @confirm="onStartConfirm"
                 :formatter="formatter" />
         </van-popup>
         <!-- 结束时间弹窗 -->
@@ -90,52 +66,226 @@
                 :min-date="endDate.minDate"
                 :max-date="endDate.maxDate"
                 @cancel="endShow = false"
-                @confirm="endShow = false"
+                @confirm="onEndConfirm"
                 :formatter="formatter" />
         </van-popup>
         <van-action-sheet
             v-model="dealShow"
-            :actions="[{name: '收入'}, { name: '支出' }]"
+            :actions="leaveCategoryList"
             cancel-text="取消"
             @cancel="dealShow = false"
             @select="onDealSelect"/>
+
+        <!-- 调整时间 -->
+        <van-popup v-model="changeShow" position="bottom">
+            <van-datetime-picker
+                v-model="changeDate.currentDate"
+                type="datetime"
+                :item-height="40"
+                title="结束时间"
+                :min-date="changeDate.minDate"
+                :max-date="changeDate.maxDate"
+                @cancel="changeShow = false"
+                @confirm="onChangeConfirm"
+                :formatter="formatter" />
+        </van-popup>
     </div>
 </template>
 <script>
 import MHeader from '@/components/MHeader'
+import { queryVipCourseScheduleList, leaveCategoryPage, askForLeave } from '@/api/teacher'
+import { browser }  from '@/common/common'
 export default {
     name: 'leave',
     components: { MHeader },
     data() {
         return {
+            headerStatus: false, 
             startShow: false,
             startDate: { // 开始时间
                 minDate: new Date(2018, 1, 1),
-                maxDate: new Date(),
+                maxDate: new Date(2025, 12, 31),
                 currentDate: new Date()
             },
             endShow: false,
             endDate: { // 结束时间
-                minDate: new Date(),
-                maxDate: new Date(2019, 10, 1),
+                minDate: new Date(2018, 1, 1),
+                maxDate: new Date(2025, 12, 31),
                 currentDate: new Date()
             },
             dealShow: false,
             searchList: {
-                startText: '选择开始时间',
-                endText: '选择结束时间',
-                dealText: '选择请假类型'
-            }
+                startText: null,
+                endText: null,
+                dealText: null,
+                remark: null
+            },
+            vipList: [], // 申请调整的vip列表
+            changeShow: false,
+            changeDate: { // 结束时间
+                minDate: new Date(2018, 1, 1),
+                maxDate: new Date(2025, 12, 31),
+                currentDate: new Date()
+            },
+            leaveCategoryList: [],
+            changeItem: null,
+        }
+    },
+    mounted() {
+        document.title = '请假'
+        if(browser().android) {
+            this.headerStatus = true
         }
+        this.__init()
     },
     methods: {
+        __init() {
+            leaveCategoryPage({
+                rows: 9999,
+                page: 1
+            }).then(res => {
+                let result = res.data
+                if(result.code == 200) {
+                    result.data.rows.forEach(item => {
+                        this.leaveCategoryList.push({
+                            name: item.name,
+                            id: item.id
+                        })
+                    })
+                }
+            })
+        },
         onSubmit() {
+            let searchList = this.searchList
+            if(!searchList.startText || !searchList.endText) {
+                this.$toast('请假时间不能为空')
+                return
+            }
 
+            if(!searchList.dealText) {
+                this.$toast('请选择请假类型')
+                return
+            }
+
+            if(!searchList.remark) {
+                this.$toast('请填写请假原因')
+                return
+            }
+            let leaveCategoryId
+            this.leaveCategoryList.forEach(item => {
+                if(item.name == searchList.dealText) {
+                    leaveCategoryId = item.id
+                }
+            })
+
+            let coursesScheduleJson = []
+            let status = false
+            this.vipList.forEach(item => {
+                if(!item.changeAllTime) {
+                    this.$toast('操作无效:您还有VIP未调整')
+                    status = true
+                }
+                let tempI = Object.assign({}, item)
+                tempI.classDate = this.getFormatDate(item.changeAllTime) + ':00'
+                tempI.startClassTime = this.getFormatDate(item.changeAllTime) + ':00'
+                coursesScheduleJson.push({
+                    befor: item,
+                    after: tempI
+                })
+            })
+            if(status) return
+            askForLeave({
+                coursesScheduleJson: JSON.stringify(coursesScheduleJson),
+                startTime: searchList.startText,
+                endTime: searchList.endText,
+                leaveCategoryId: leaveCategoryId,
+                leaveCategoryName: searchList.dealText
+            }).then(res => {
+                let result = res.data
+                if(result.code == 200) {
+                    this.$toast('申请成功')
+                    if(browser().iPhone) {
+                        window.webkit.messageHandlers.DAYA.postMessage(JSON.stringify({api: 'back'}))
+                    } else {
+                        this.$router.push('/business')
+                    }
+                } else {
+                    this.$toast(result.msg)
+                }
+            })
+        },
+        onAdd(item) { // 调整
+            this.changeShow = true
+            this.changeItem = item
+        },
+        onUpdate(item) {
+            this.changeDate.currentDate = item.changeAllTime
+            this.changeShow = true
+            this.changeItem = item
         },
-        onDealSelect() {
+        onChangeConfirm(val) {
+            let tempDate = new Date(val)
+            let month = (tempDate.getMonth() + 1) >= 10 ? (tempDate.getMonth() + 1) : '0' + (tempDate.getMonth() + 1)
+            let day = tempDate.getDate() >= 10 ? tempDate.getDate() : '0' + tempDate.getDate()
+            let hours = tempDate.getHours() >= 10 ? tempDate.getHours() : '0' + tempDate.getHours()
+            let min = tempDate.getMinutes() >= 10 ? tempDate.getMinutes() : '0' + tempDate.getMinutes()
+            this.changeItem.changeTime = month + '-' + day + ' ' + hours + ':' + min
+            this.changeItem.changeAllTime = val
+            this.changeShow = false
+        },
+        onStartConfirm(val) { // 开始时间
+            let searchList = this.searchList
+            searchList.startText = this.getFormatDate(val)
+            this.startShow = false
+            if(val >= this.endDate.currentDate) {
+                searchList.endText = null
+                this.endDate.currentDate = new Date()
+            } else {
+                if(searchList.startText && searchList.endText) {
+                    this.queryVipCourseScheduleList()
+                }
+            }
+            
+        },
+        onEndConfirm(val) { // 结束时间
+            let searchList = this.searchList
+            searchList.endText = this.getFormatDate(val)
+            this.endShow = false
+            if(val <= this.startDate.currentDate) {
+                searchList.startText = null
+                this.startDate.currentDate = new Date()
+            } else {
+                if(searchList.startText && searchList.endText) {
+                    this.queryVipCourseScheduleList()
+                }
+            }
+        },
+        queryVipCourseScheduleList() { // 获取需要调整的VIP课
+            queryVipCourseScheduleList({
+                endTime: this.searchList.endText,
+                startTime: this.searchList.startText
+            }).then(res => {
+                let result = res.data
+                this.vipList = []
+                if(result.code == 200 && result.data.length > 0) {
+                    this.vipList = result.data
+                }
+            })
+        },
+        onDealSelect(val) {
             // 交易收支
+            this.searchList.dealText = val.name
             this.dealShow = false
         },
+        getFormatDate(data) {
+            let tempDate = new Date(data)
+            let month = (tempDate.getMonth() + 1) >= 10 ? (tempDate.getMonth() + 1) : '0' + (tempDate.getMonth() + 1)
+            let day = tempDate.getDate() >= 10 ? tempDate.getDate() : '0' + tempDate.getDate()
+            let tDate =  tempDate.getFullYear() + '-' + month + '-' + day
+            let hours = tempDate.getHours() >= 10 ? tempDate.getHours() : '0' + tempDate.getHours()
+            let min = tempDate.getMinutes() >= 10 ? tempDate.getMinutes() : '0' + tempDate.getMinutes()
+            return tDate + ' ' + hours + ':' + min
+        },
         formatter(type, value) { // 格式化时间
             if (type === 'year') {
                 return `${value}年`;
@@ -148,13 +298,28 @@ export default {
             } else if(type === 'minute') {
                 return `${value}分`
             }
-            return value;
+            return value
+        }
+    },
+    filters: {
+        getFormatTime(tempA, tempB) {
+            tempA = new Date(tempA.replace(/-/g, "/")),
+            tempB = new Date(tempB.replace(/-/g, "/"))
+            let month = Number(tempA.getMonth() + 1) >= 10 ? Number(tempA.getMonth() + 1) : '0' + Number(tempA.getMonth() + 1)
+            let day = Number(tempA.getDate()) >= 10 ? tempA.getDate() : '0' + tempA.getDate()
+            let hours = Number(tempB.getHours()) >= 10 ? tempB.getHours() : '0' + tempB.getHours()
+            let min = Number(tempB.getMinutes()) >= 10 ? tempB.getMinutes() : '0' + tempB.getMinutes()
+            return month + '-' + day + ' ' + hours + ':' + min
         }
     }
 }
 </script>
 <style lang='less' scoped>
 @import url('../../assets/commonLess/variable.less');
+.leave {
+    min-height: 100vh;
+    overflow: hidden;
+}
 .search .van-cell {
     padding: .13rem .16rem;
     font-size: .14rem;
@@ -185,11 +350,13 @@ export default {
     align-items: center;
     padding: 0.15rem;
     border-bottom: 1px solid #f3f4f8;
+    font-size: .14rem;
     &:last-child {
         border-bottom: 0;
     }
     .leaveCell-l {
-        flex-basis: .7rem;
+        flex-basis: .8rem;
+        padding-right: .08rem
     }
     .leaveCell-r {
         display: flex;

+ 183 - 39
src/views/teacher/PeriodAdjust.vue

@@ -1,59 +1,207 @@
 <template>
     <div class="periodadjust">
-        <m-header />
-        <m-calendar />
-        <van-checkbox-group v-for="(i, index) in 3" :key="i" @change="onCheckBoxChange" v-model="checkBoxSelect">
-            <van-cell-group @click="onCheckBox(index)">
-                <van-cell icon="underway-o" :center="true">
-                    <template slot="default"><span>到课:30/32</span><span>请假:2</span></template>
-                    <template slot="title">15:00-15:45</template>
-                </van-cell>
-                <van-cell class="input-cell" title-class="title-content" :center="true">
-                    <template slot="default">
-                        <van-checkbox ref="checkboxes" :name="i"></van-checkbox>
-                    </template>
-                    <template slot="title">【乐团课】乐理知识(一)</template>
-                    <template slot="label">主讲老师:黄老师</template>
-                </van-cell>
-            </van-cell-group>
-        </van-checkbox-group>
+        <div class="container">
+            <m-header />
+            <m-calendar v-if="isCalendar" :dataList="getMonthDay" @onSelectDay="onSelectDay" />
+            <van-radio-group v-if="dataShow" key="data" v-model="radioSelect">
+                <van-cell-group v-for="(item, index) in dataList" :key="index">
+                    <van-cell icon="underway-o" :center="true" @click="onCheckRadio(item.id)">
+                        <template slot="default"><span>到课:{{item.studentNum}}/{{item.totalStudentNum}}</span><span>请假:{{item.leaveStudentNum}}</span></template>
+                        <template slot="title">{{item.startClassTime | formatDate}}-{{item.endClassTime | formatDate}}</template>
+                    </van-cell>
+                    <van-cell class="input-cell" title-class="title-content" :center="true" @click="onCheckRadio(item.id)">
+                        <template slot="default">
+                            <van-radio ref="radioes" :disabled="radioDisabled" :name="item.id"></van-radio>
+                        </template>
+                        <template slot="title">{{ item.name }}</template>
+                        <template slot="label">主讲老师:{{ item.teacherName }}</template>
+                    </van-cell>
+                </van-cell-group>
+            </van-radio-group>
+            <m-empty v-else key="data" />
 
-        <div class="button-group">
-            <van-button type="primary" @click="onSubmit" round size="large">{{ submitText }}</van-button>
+            <div class="button-group" v-if="dataShow">
+                <van-button type="default" @click="onDateChange" size="large">课时调整</van-button>
+                <van-button type="primary" @click="onSubmit" size="large">课时交换</van-button>
+            </div>
+            <van-popup v-model="dataForm.status" position="bottom">
+                <van-datetime-picker v-model="dataForm.currentDate" type="datetime" :min-date="dataForm.minDate" 
+                    :max-date="dataForm.maxDate" :formatter="formatter" @cancel="dataForm.status = false" 
+                    @confirm="onCurrentConfirm" />
+            </van-popup>
         </div>
     </div>
 </template>
 <script>
 import MHeader from '@/components/MHeader'
 import MCalendar from '@/components/MCalendar'
+import MEmpty from '@/components/MEmpty'
+import { browser }  from '@/common/common'
+import { getCourseSchedulesWithDate, 
+    getCourseScheduleDateByMonth,
+    classStartDateAdjust,
+    courseSwap } from '@/api/teacher'
 export default {
     name: 'periodadjust',
-    components: { MHeader, MCalendar },
+    components: { MHeader, MCalendar, MEmpty },
     data() {
         return {
-            checkBoxSelect: [],
-            submitText: '确认选择',
+            dataForm: { // 时间下拉框
+                status: false,
+                minDate: new Date(2018, 0, 1),
+                maxDate: new Date(2025, 10, 1),
+                currentDate: new Date()
+            },
+            radioSelect: null,
+            dataList: [],
+            dataShow: true, // 是否有数据
+            getMonthDay: [], // 当月有课的日期
+            isCalendar: false,
+            radioDisabled: true, // 今天或今天之前的数据禁用
         }
     },
+    mounted() {
+        let toDay = this.getFormartDate(new Date())
+        this.getCourseDate(toDay)
+        this.getCourseMonth(toDay)
+    },
     methods: {
+        onSelectDay(value) {
+            if(new Date(this.getFormartDate(new Date()) >= new Date(this.getFormartDate(value)))) {
+                this.radioDisabled = true
+            } else {
+                this.radioDisabled = false
+                this.getCourseDate(this.getFormartDate(value))
+            }
+        },
+        onCheckRadio(id) { // 单选按钮选中
+            if(this.radioDisabled) return
+            this.radioSelect = id
+        },
+        getCourseMonth(month) {
+            getCourseScheduleDateByMonth({ month: month, type: 'VIP' }).then(res => {
+                let result = res.data
+                if(result.code == 200) {
+                    result.data.forEach(item => {
+                        let tempDate = new Date(item)
+                        this.getMonthDay.push(tempDate.getDate())
+                    })
+                    this.isCalendar = true
+                }
+            })
+        },
+        getCourseDate(date) {
+            getCourseSchedulesWithDate({ date: date, type: 'VIP' }).then(res => {
+                let result = res.data
+                if(result.code == 200 && result.data) {
+                    this.dataList = result.data.rows
+                    this.dataShow = result.data.rows.length > 0 ? true : false
+                }
+            })
+        },
         onSubmit() {
+            if(!this.radioSelect) {
+                this.$toast('请选择需要交换的课程')
+                return
+            }
             // 确认选择
             this.$router.push({
-                path: '/periodchange'
+                path: '/PeriodChange'
             })
         },
-        onCheckBox(index) { // 点击父元素时checkbox选中
-            this.$refs.checkboxes[index].toggle()
+        getFormartDate(date) {
+            let checkDate = new Date(date)
+            let checkDay = checkDate.getFullYear() + '-' + (checkDate.getMonth() + 1) + '-' + checkDate.getDate()
+            return checkDay
+        },
+        onDateChange() {
+            if(!this.radioSelect) {
+                this.$toast('请选择需要调整的课程')
+                return
+            }
+            this.dataForm.status = true
+        },
+        onCurrentConfirm(value) { // 课时调整
+            let selectDate = []
+            this.dataList.forEach(item => {
+                if(item.id == this.radioSelect) {
+                    selectDate = item
+                }
+            })
+
+            let startStr = '2019/10/10 ' + this.getDateInfo(selectDate.startClassTime),
+                endStr = '2019/10/10 ' + this.getDateInfo(selectDate.endClassTime)
+            let startDate = new Date(startStr),
+                endDate = new Date(endStr)
+            let m = parseInt(Math.abs(endDate.getTime() - startDate.getTime()) / 1000 / 60)
+            let currentStartDate = new Date(value),
+                currentEndDate = new Date(value)
+            currentEndDate.setMinutes(currentStartDate.getMinutes() + m)
+            classStartDateAdjust({
+                actualTeacherId: selectDate.actualTeacherId,
+                id: this.radioSelect,
+                classDate: this.getFormartDate(currentStartDate),
+                startClassTimeStr: this.getDateInfo(currentStartDate),
+                endClassTimeStr: this.getDateInfo(currentEndDate)
+            }).then(res => {
+                let result = res.data
+                if(result.code == 200) {
+                    this.$toast('调整成功')
+                    if(browser().iPhone) {
+                        window.webkit.messageHandlers.DAYA.postMessage(JSON.stringify({api: 'back'}))
+                    } else {
+                        this.$router.push('/business')
+                    }
+                } else {
+                    this.$toast(result.msg)
+                }
+            })
+        },
+        getDateInfo(value) {
+            let d = new Date(value)
+            let hour = d.getHours() >= 10 ? d.getHours() : '0' + d.getHours()
+            let minute = d.getMinutes() >= 10 ? d.getMinutes() : '0' + d.getMinutes()
+            return hour + ':' + minute + ':00'
+        },
+        formatter(type, value) {
+            if (type === 'year') {
+                return `${value}年`;
+            } else if (type === 'month') {
+                return `${value}月`
+            } else if (type === 'day') {
+                return `${value}日`
+            } else if (type === 'hour') {
+                return `${value}时`
+            } else if (type === 'minute') {
+                return `${value}分`
+            }
+            return value;
         },
-        onCheckBoxChange() {
-            // console.log(this.checkBoxSelect)
-            this.submitText = this.checkBoxSelect.length >= 2 ? '合并课程' : '确认选择'
-        }
     }
 }
 </script>
 <style lang='less' scoped>
 @import url("../../assets/commonLess/variable.less");
+.periodadjust {
+    min-height: 100vh;
+    position: relative;
+    .container {
+        min-height: calc(100vh - 60px);
+    }
+    .button-group {
+        width: 100%;
+        position: absolute;
+        bottom: 0;
+        left: 0;
+        .van-button {
+            font-size: .16rem;
+            width: 50%;
+        }
+        .van-button--primary {
+            background: @mColor;
+        }
+    }
+}
 /deep/.van-cell__title {
     font-size: .16rem;
     color: @mFontColor;
@@ -82,25 +230,21 @@ export default {
         padding-right: .1rem;
     }
 }
+
 .input-cell {
     padding: .12rem .16rem .2rem;
-    .van-checkbox {
+    .van-radio {
         justify-content: flex-end;
     }
 }
-/deep/.van-checkbox__icon .van-icon {
+/deep/.van-radio__icon .van-icon {
     border-color: @sFontColor;
 }
-/deep/.van-checkbox__icon--checked .van-icon {
+/deep/.van-radio__icon--checked .van-icon {
     background: @orangeColor;
     border-color: @orangeColor;
 }
-.button-group {
-    margin: .3rem .26rem .2rem;
-    .van-button--primary {
-        background: @mColor;
-        font-size: .18rem;
-    }
+/deep/.icon {
+    margin-top: .2rem;
 }
-
 </style>

+ 47 - 2
src/views/teacher/PeriodChange.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="periodchange">
         <m-header />
-        <m-calendar />
+        <m-calendar v-if="isCalendar" :dataList="getMonthDay" @onSelectDay="onSelectDay" />
 
         <van-cell-group v-for="i in 5" :key="i">
             <van-cell icon="underway-o" :center="true">
@@ -20,9 +20,54 @@
 <script>
 import MHeader from '@/components/MHeader'
 import MCalendar from '@/components/MCalendar'
+import MEmpty from '@/components/MEmpty'
+import { getCourseSchedulesWithDate, 
+    getCourseScheduleDateByMonth } from '@/api/teacher'
 export default {
     name: 'periodchange',
-    components: { MHeader, MCalendar }
+    components: { MHeader, MCalendar, MEmpty },
+    data() {
+        return {
+            getMonthDay: [], // 当月有课的日期
+            isCalendar: false,
+        }
+    },
+    mounted() {
+        let toDay = this.getFormartDate(new Date())
+        this.getCourseDate(toDay)
+        this.getCourseMonth(toDay)
+    },
+    methods: {
+        onSelectDay(value) {
+            this.getCourseDate(this.getFormartDate(value))
+        },
+        getCourseDate(date) {
+            getCourseSchedulesWithDate({ date: date, type: 'VIP' }).then(res => {
+                let result = res.data
+                if(result.code == 200 && result.data) {
+                    this.dataList = result.data.rows
+                    this.dataShow = result.data.rows.length > 0 ? true : false
+                }
+            })
+        },
+        getCourseMonth(month) {
+            getCourseScheduleDateByMonth({ month: month, type: 'VIP' }).then(res => {
+                let result = res.data
+                if(result.code == 200) {
+                    result.data.forEach(item => {
+                        let tempDate = new Date(item)
+                        this.getMonthDay.push(tempDate.getDate())
+                    })
+                    this.isCalendar = true
+                }
+            })
+        },
+        getFormartDate(date) {
+            let checkDate = new Date(date)
+            let checkDay = checkDate.getFullYear() + '-' + (checkDate.getMonth() + 1) + '-' + checkDate.getDate()
+            return checkDay
+        },
+    }
 }
 </script>
 <style lang='less' scoped>

+ 805 - 29
src/views/teacher/VIPApply.vue

@@ -1,68 +1,812 @@
 <template>
     <div class="vipapply">
-        <m-header />
+        <m-header v-if="statusList.headerStatus" />
         <div class="vip-title">课程信息</div>
         <van-cell-group>
-            <van-field label="课程班名称" input-align="right" size="large" placeholder="请输入班级名称" />
-            <van-field label="科目名称" input-align="right" size="large" placeholder="请选择乐器" />
-            <van-field label="每班人数" input-align="right" size="large" placeholder="每班预计招收人数" />
-            <van-cell title="每课时长" is-link size="large" value="请选择" />
-            <van-cell title="线下课地址" is-link size="large" value="请选择" />
+            <van-field v-model="form.name" label="课程班名称" input-align="right" size="large" 
+                placeholder="请输入班级名称" />
+            <van-field v-model="formName.subjectListName" @click="onGetSheetList('subjectList')" 
+                label="科目名称" :readonly="true" input-align="right" is-link size="large" placeholder="请选择" />
+            <van-field v-model="formName.vipGroupCategoryName" @click="onGetSheetList('vipGroupCategory')" 
+                label="课程形式" :readonly="true" input-align="right" is-link size="large" placeholder="请选择" />
+            <van-field v-model="formName.vipGroupActivityName" @click="onGetSheetList('vipGroupActivity')" 
+                label="活动方案" :readonly="true" input-align="right" is-link size="large" placeholder="请选择" />
+            <van-field v-model="formName.teacherSchoolName" @click="onGetSheetList('teacherSchool')" 
+                label="线下课地址" :readonly="true" input-align="right" is-link size="large" placeholder="请选择" />
         </van-cell-group>
         <div class="vip-title">课时组成</div>
         <van-cell-group>
-            <van-cell title="活动文案" is-link size="large" value="请选择" />
-            <van-field label="课时总数" type="number" input-align="right" size="large" placeholder="请输入课时总数" />
-            <van-field label="线上课" input-align="right" size="large" placeholder="请输入次数" />
-            <van-field label="线下课" input-align="right" size="large" placeholder="请输入次数" />
+            <van-field v-model="form.studentNum" label="每班人数" disabled input-align="right" size="large" 
+                placeholder="每班预计招收人数" />
+            <van-field v-model="form.singleClassMinutes" label="每课时长" disabled input-align="right" 
+                size="large" placeholder="请输入每课时长" />
+            <!-- 判断是否选择活动方案 -->
+            <van-field v-if="formName.vipGroupActivityName || statusList.hasOnline" v-model="form.onlineClassesNums" @keyup="onClassKeyUp" label="线上课" input-align="right" 
+                size="large" placeholder="请输入次数" type="number" />
+            <van-field v-if="formName.vipGroupActivityName || statusList.hasOffline" v-model="form.offlineClassesNums" @keyup="onClassKeyUp" label="线下课" input-align="right" 
+                size="large" placeholder="请输入次数" type="number" />
         </van-cell-group>
-        <div class="vip-title">时间按排</div>
+        <div class="vip-title">时间排</div>
         <van-cell-group>
-            <van-cell title="报名开始时间" is-link size="large" />
-            <van-cell title="报名截止时间" is-link size="large" />
-            <van-cell title="课程结束时间" is-link size="large" />
+            <van-field v-model="form.registrationStartTime" label="报名开始时间" 
+                disabled input-align="right" is-link size="large" placeholder="请选择" />
+            <van-field v-model="form.coursesExpireDate" label="报名截止时间" 
+                disabled input-align="right" is-link size="large" placeholder="请选择" />
         </van-cell-group>
-        <div class="vip-title">课时排</div>
+        <div class="vip-title">课时排</div>
         <van-cell-group>
-            <van-cell title="预计开课时间" is-link size="large" />
+            <van-field v-model="form.totalClassTime" label="课时总数" disabled input-align="right" size="large" 
+                placeholder="请输入次数" />
+            <van-field v-if="statusList.teachOnOrOff" v-model="formName.giveTeachModeName" @click="onGiveMode" label="赠课类型" 
+                :readonly="true" input-align="right" is-link size="large" placeholder="请选择" />
+            <van-field @click="dataForm.status = true" v-model="form.courseStart" label="排课开始时间" :readonly="true" input-align="right" 
+                is-link size="large" placeholder="请选择" />
 
-            <van-cell title-class="title-time">
+            <van-cell title-class="title-time" v-for="(item, index) in scheduleList" :key="index">
                 <template slot="title">
-                    <span class="online">线上</span>
-                    <span class="week">周三</span>
-                    <span class="timer">17:00-17.45</span>
+                    <span class="online">{{ item.type }}</span>
+                    <span class="week">{{ item.weekStr }}</span>
+                    <span class="timer">{{ item.startTime + '-' + item.endTime }}</span>
                 </template>
                 <template slot="default">
-                    <van-button type="warning" round size="small" plain >删除</van-button>
+                    <van-button type="warning" @click="onScheduleRemove(item)" round size="small" plain >删除</van-button>
                 </template>
             </van-cell>
-            <div class="add-plan">
+            <div class="add-plan van-cell" @click="onCourseShedule">
                 <van-icon name="add-o" />课时安排
             </div>
+            <van-field label="排课列表" v-if="scheduleList.length > 0" 
+                disabled input-align="right" @click="onShowTimeTable" is-link size="large" />
         </van-cell-group>
         <div class="vip-title">课酬设置</div>
         <van-cell-group>
-            <van-field label="课酬标准" type="number" input-align="right" size="large" placeholder="金额(每课时)" />
-            <van-field label="课程收费" input-align="right" size="large" placeholder="金额(每课时)" />
-            <van-cell title="允许续费" is-link size="large" value="请选择" />
+            <van-field v-model="form.onlineClassesUnitPrice" label="线上课单价" type="number" input-align="right" 
+                size="large" @keyUp="getCalcClass" :disabled="loadData.vipGroupActivitySelect.salaryReadonlyFlag == 0" placeholder="金额(每课时)" 
+                v-if="statusList.hasOnline" />
+            <van-field v-model="form.offlineClassesUnitPrice" label="线下课单价" type="number" input-align="right" 
+                size="large" @keyUp="getCalcClass" :disabled="loadData.vipGroupActivitySelect.salaryReadonlyFlag == 0" placeholder="金额(每课时)"
+                v-if="statusList.hasOffline" />
+            <van-field v-model="form.onlineTeacherSalary" label="线上课课酬" input-align="right" size="large" 
+                :disabled="loadData.vipGroupActivitySelect.salaryReadonlyFlag == 0" placeholder="金额(每课时)"
+                v-if="statusList.hasOnline" type="number" /> 
+                <!--  || other.onlineSalary !='TEACHER_DEFAULT' -->
+            <van-field v-model="form.offlineTeacherSalary" label="线下课课酬" input-align="right" size="large" 
+                 :disabled="loadData.vipGroupActivitySelect.salaryReadonlyFlag == 0" placeholder="金额(每课时)"
+                 v-if="statusList.hasOffline" type="number" />
+                 <!--  || other.offlineSalary !='TEACHER_DEFAULT' -->
+            <van-field v-model="form.totalCount" disabled label="课程总价" input-align="right" size="large" 
+                placeholder="金额(每课时)" />
         </van-cell-group>
 
         <div class="button-group">
-            <van-button type="primary" round size="large">确认</van-button>
+            <van-button type="primary" @click="onSubmit" round size="large">确认</van-button>
         </div>
+        
+        <!-- 赠课类型 -->
+        <van-action-sheet v-model="statusList.giveTeachModeStatus" :actions="loadData.giveTeachMode" cancel-text="取消"  @cancel="statusList.giveTeachModeStatus = false" @select="onModeSelect" />
+        <!-- 课程信息所用 :close-on-click-overlay="false"  -->
+        <van-popup v-model="sheetForm.sheetStatus" position="bottom">
+            <van-picker :loading="sheetForm.loading" :default-index="sheetForm.index" :columns="sheetForm.columns" 
+                show-toolbar @cancel="sheetForm.sheetStatus = false" @confirm="onSheetConfirm" />
+        </van-popup>
+        <!-- 课时安排 -->
+        <van-popup v-model="dataForm.status" position="bottom">
+            <van-datetime-picker v-model="dataForm.currentDate" type="date" :min-date="dataForm.minDate" 
+                :max-date="dataForm.maxDate" :formatter="formatter" @cancel="dataForm.status = false" 
+                @confirm="onCurrentConfirm" />
+        </van-popup>
+        <!-- 课时安排 -->
+        <van-popup v-model="courseForm.teachingStatus" position="bottom">
+            <van-picker :columns="courseForm.columns" show-toolbar @cancel="courseForm.teachingStatus = false" 
+                @confirm="onTeachinConfirm" />
+        </van-popup>
+        <!-- 课表展示 -->
+        <van-popup v-model="statusList.classTime" position="bottom">
+            <van-row>
+                <van-col span="12">上课类型</van-col>
+                <van-col span="12">上课时间</van-col>
+            </van-row>
+            <div class="tableContainer">
+                <van-row v-for="(item, index) in timeTable" :key="index">
+                    <van-col span="12">
+                        {{ item.teachMode == 'ONLINE' ? '线上' : '线下' }}
+                    </van-col>
+                    <van-col span="12">
+                        {{ item.classDate }} {{ item.startClassTimeStr }}
+                    </van-col>
+                </van-row>
+            </div>
+        </van-popup>
     </div>
 </template>
 <script>
+
 import MHeader from '@/components/MHeader'
+import { browser }  from '@/common/common'
+import { findSubSubjects, 
+    vipGroupCategory, 
+    findByVipGroupCategory, 
+    findVipSchoolByTeacher,
+    findByTeacherAndCategory,
+    vipGroupApply } from '@/api/teacher'
+let minutes = []  // 分钟数
+for(let i = 0; i < 60; i++) {
+    let mi = i < 10 ? '0' + i : i
+    minutes.push(mi + '分')
+}
 export default {
     name: 'vipapply',
-    components: { MHeader }
+    components: { MHeader },
+    data() {
+        return {
+            dataForm: { // 时间下拉框
+                status: false,
+                minDate: new Date(),
+                maxDate: new Date(2025, 10, 1),
+                currentDate: new Date()
+            },
+            statusList: { // 散状态集合
+                giveTeachModeStatus: false, // 赠课弹窗状态
+                teachOnOrOff: false, // 是否显示赠课
+                hasOnline: false, // 是否显示线上
+                hasOffline: false, // 是否显示线下
+                classTime: false, // 课表展示
+                headerStatus: false, // 头部是否展示
+            },
+            loadData: { // 下拉加载数据
+                subjectList: [], // 声部列表
+                subjectListSelect: [], // 选中的声部JSON
+                vipGroupCategory: [], // 课程形式
+                vipGroupCategorySelect: [], // 选中的课程形式JSON
+                vipGroupActivity: [], // 活动文案
+                vipGroupActivitySelect: [], // 选中的活动文案JSON
+                teacherSchool: [], // 线下课地址
+                teacherSchoolSelect: [], // 选中的线下课地址JSON
+                giveTeachMode: [{ name: '线上课', value: 'ONLINE' }, { name: '线下课', value: 'OFFLINE' }], // 赠课
+                giveTeachModeSelect: [], // 选中的赠课JSON
+                teacherCategory: [], // 老师课酬信息
+            },
+            sheetForm: { // 上拉弹窗
+                currentType: null, // 当前选择的类型
+                sheetStatus: false,
+                loading: true, // 加载数据
+                index: 0, // 选中的索引值
+                columns: []
+            },
+            courseForm: { // 排课弹窗
+                teachingStatus: false, // 课时安排状态
+                columns: [{ // 课程选项
+                    values: ['线上', '线下'],
+                    className: 'type'
+                }, {
+                    values: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
+                    className: 'week'
+                }, {
+                    values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
+                    className: 'hours',
+                    defaultIndex: 7
+                }, {
+                    values: minutes,
+                    className: 'minutes'
+                }]
+            },
+            form: {
+                name: null,
+                subjectIdList: null,
+                vipGroupCategoryId: null,
+                vipGroupActivityId: null,
+                teacherSchoolId: null,
+                studentNum: null,
+                singleClassMinutes: null,
+                onlineClassesNums: null,
+                offlineClassesNums: null,
+                registrationStartTime: null,
+                coursesExpireDate: null,
+                totalClassTime: null,
+                courseStart: null,
+                giveTeachMode: null,
+                onlineClassesUnitPrice: null,
+                offlineClassesUnitPrice: null,
+                onlineTeacherSalary: null,
+                offlineTeacherSalary: null,
+                totalCount: null,
+            },
+            formName: {
+                subjectListName: null, // 声部名称
+                subjectListIndex: 0, // 声部名称
+                vipGroupCategoryName: null, // 课程形式
+                vipGroupCategoryIndex: 0, // 课程形式
+                vipGroupActivityName: null, // 活动文案
+                vipGroupActivityIndex: 0, // 活动文案
+                teacherSchoolName: null, // 线下课地址
+                teacherSchoolIndex: 0, // 线下课地址
+                giveTeachModeName: null, // 赠课类型
+            },
+            other: {
+                onlineSalary: null, // 线上课课酬结算方式
+                offlineSalary: null, // 线下课课酬结算方式
+                giveNum: 0, // 赠送课时
+            },
+            scheduleList: [], // 课时安排
+            timeTable: [], // 生成的课表
+        }
+    },
+    mounted() {
+        document.title = 'VIP课程班申请'
+        if(browser().android) {
+            this.headerStatus = true
+        }
+    },
+    methods: {
+        onGetSheetList(name) { // 获取科目列表
+            let sheetForm = this.sheetForm
+            sheetForm.columns = []
+            if(!this.form.vipGroupCategoryId && name == 'vipGroupActivity') { // 判断是否选择了课程形式
+                this.$toast('请选择课程形式')
+                return
+            }
+            sheetForm.sheetStatus = true
+            sheetForm.loading = true
+            sheetForm.currentType = name
+            sheetForm.index = 0
+            let arr = this.loadData[name]
+            if(arr.length > 0) {
+                sheetForm.columns = arr
+                sheetForm.index = this.formName[name + 'Index']
+                sheetForm.loading = false
+            } else {
+                this.onLoadingData(name)
+            }
+            
+        },
+        onLoadingData() { // 加载数据
+            let sheetForm = this.sheetForm
+            if(sheetForm.currentType == 'subjectList') { // 声部列表
+                findSubSubjects().then(res => {
+                    let result = res.data
+                    if(result.code == 200 && result.data.length > 0) {
+                        let tempArr = []
+                        result.data.forEach(item => {
+                            item.value = item.id
+                            item.text = item.name
+                            tempArr.push(item)
+                        })
+                        this.loadData.subjectList = tempArr
+                        sheetForm.columns = tempArr
+                        sheetForm.loading = false
+                    } else {
+                        this.$toast('暂无科目列表')
+                        sheetForm.loading = false
+                    }
+                })
+            } else if(sheetForm.currentType == 'vipGroupCategory') { // 课程形式
+                vipGroupCategory().then(res => {
+                    let result = res.data
+                    if(result.code == 200 && result.data.length > 0) {
+                        let tempArr = []
+                        result.data.forEach(item => {
+                            item.value = item.id
+                            item.text = item.name
+                            tempArr.push(item)
+                        })
+                        this.loadData.vipGroupCategory = tempArr
+                        sheetForm.columns = tempArr
+                        sheetForm.loading = false
+                    } else {
+                        this.$toast('暂无课程形式')
+                        sheetForm.loading = false
+                    }
+                })
+            } else if(sheetForm.currentType == 'vipGroupActivity') { // 活动文案
+                findByVipGroupCategory({ categoryId: this.form.vipGroupCategoryId }).then(res => {
+                    let result = res.data
+                    if(result.code == 200 && result.data.length > 0) {
+                        let tempArr = []
+                        result.data.forEach(item => {
+                            item.value = item.id
+                            item.text = item.name
+                            item.startTime = item.startTime ? item.startTime.split(' ')[0] : null, // 报名开始时间
+                            item.endTime = item.endTime ? item.endTime.split(' ')[0] : null // 报名结束时间
+                            tempArr.push(item)
+                        })
+                        this.loadData.vipGroupActivity = tempArr
+                        sheetForm.columns = tempArr
+                        sheetForm.loading = false
+                    } else {
+                        this.$toast('暂无活动文案')
+                        sheetForm.loading = false
+                    }
+                })
+            } else if(sheetForm.currentType == 'teacherSchool') { // 教师教学点
+                findVipSchoolByTeacher().then(res => {
+                    let result = res.data
+                    if(result.code == 200 && result.data.length > 0) {
+                        let tempArr = []
+                        result.data.forEach(item => {
+                            item.value = item.id
+                            item.text = item.name
+                            tempArr.push(item)
+                        })
+                        this.loadData.teacherSchool = tempArr
+                        sheetForm.columns = tempArr
+                        sheetForm.loading = false
+                    } else {
+                        this.$toast('暂无教学点')
+                        sheetForm.loading = false
+                    }
+                })
+            }
+        },
+        findTeacherCategory(id) { // 获取教师课酬
+            findByTeacherAndCategory({ categoryId: id }).then(res => {
+                let result = res.data
+                if(result.code == 200) {
+                    this.loadData.teacherCategory = result.data
+                }
+            })
+        },
+        onSheetConfirm(value, index) { // 上拉弹窗
+            let sheetForm = this.sheetForm,
+                form = this.form,
+                formName = this.formName,
+                loadData = this.loadData
+            if(sheetForm.currentType == 'subjectList') { // 科目名称赋值
+                form.subjectIdList = value.value
+                formName.subjectListName = value.text
+                formName.subjectListIndex = index
+                loadData.subjectListSelect = value
+            } else if(sheetForm.currentType == 'vipGroupCategory') { // 课程形式赋值
+                if(loadData.vipGroupCategorySelect.id != value.id) {
+                    // 获取教师课酬
+                    this.findTeacherCategory(value.id)
+                }
+                form.vipGroupCategoryId = value.value
+                formName.vipGroupCategoryName = value.text
+                formName.vipGroupCategoryIndex = index
+                loadData.vipGroupCategorySelect = value
+                form.studentNum = value.studentNum // 每班人数
+                form.singleClassMinutes = value.singleClassMinutes // 每课时长
+                form.onlineClassesUnitPrice = value.onlineClassesUnitPrice
+                form.offlineClassesUnitPrice = value.offlineClassesUnitPrice
+
+                // 重置活动文案
+                form.vipGroupActivityId = null
+                formName.vipGroupActivityName = null
+                formName.vipGroupActivityIndex = 0
+                loadData.vipGroupActivity = []
+                loadData.vipGroupActivitySelect = []
+            } else if(sheetForm.currentType == 'vipGroupActivity') { // 活动方案赋值
+                form.vipGroupActivityId = value.value
+                formName.vipGroupActivityName = value.text
+                formName.vipGroupActivityIndex = index
+                loadData.vipGroupActivitySelect = value
+
+                this.onCalcClassTimes(value) // 计算时间等.........
+                this.getCalcClass() // 课酬计算
+                this.setTimeTable() // 重新排课
+
+                // 时间安排
+                form.registrationStartTime = value.startTime
+                form.coursesExpireDate = value.endTime
+            } else if(sheetForm.currentType == 'teacherSchool') { // 线下课地址
+                form.teacherSchoolId = value.value
+                formName.teacherSchoolName = value.text
+                formName.teacherSchoolIndex = index
+            } 
+
+            sheetForm.sheetStatus = false
+        },
+        onClassKeyUp() { // 线上课&线下课修改时
+            let vas = this.loadData.vipGroupActivitySelect
+            this.onCalcClassTimes(vas)
+            this.getCalcClass()
+        },
+        onCalcClassTimes(vas) { // 计算课时总数
+            let form = this.form,
+                other = this.other,
+                statusList = this.statusList
+            let totalCount = Number(form.onlineClassesNums) + Number(form.offlineClassesNums)
+
+            // ...
+            if(vas.salarySettlementJson) {
+                let obj = JSON.parse(vas.salarySettlementJson)
+                if (obj && obj.onlineSalarySettlement) {
+                    // 有线上课
+                    statusList.hasOnline = true
+                } else {
+                    statusList.hasOnline = false
+                }
+                if (obj && obj.offlineSalarySettlement) {
+                    // 有线下课
+                    statusList.hasOffline = true
+                } else {
+                    statusList.hasOffline = false
+                }
+            }
+
+            if(vas.type == "GIVE_CLASS") { // 买赠活动
+                this.statusList.teachOnOrOff = true // 显示赠课
+                if(totalCount >= Number(vas.attribute1)) {
+                    form.totalClassTime = totalCount + '+' + vas.attribute2
+                    other.giveNum = vas.attribute2
+                } else {
+                    form.totalClassTime = totalCount
+                    other.giveNum = 0
+                }
+            } else { // 折扣活动
+                form.totalClassTime = totalCount
+                other.giveNum = 0
+                this.statusList.teachOnOrOff = false // 隐藏赠课
+            }
+        },
+        onModeSelect(value) { // 赠课确认
+            this.form.giveTeachMode = value.value
+            this.formName.giveTeachModeName = value.name
+            this.statusList.giveTeachModeStatus = false
+        },
+        onCurrentConfirm(value) { // 排课开始时间
+            let selectDate = new Date(value)
+            this.form.courseStart = selectDate.getFullYear() + '-' + (selectDate.getMonth() + 1) + '-' + selectDate.getDate()
+            this.dataForm.status = false
+        },
+        onCourseShedule() { // 课时安排
+            if(!this.form.singleClassMinutes) {
+                this.$toast('请选择课程形式')
+                return
+            }
+            if(this.other.giveNum > 0 && !this.form.giveTeachMode) {
+                this.$toast('请选择赠课类型')
+                return
+            }
+            if(!this.form.courseStart) {
+                this.$toast('请选择排课开始时间')
+                return
+            }
+            this.courseForm.teachingStatus = true
+        },
+        onScheduleRemove(item) { // 删除课程安排
+            let index = this.scheduleList.indexOf(item)
+            if(index !== -1) {
+                this.scheduleList.splice(index, 1)
+            }
+        },
+        onTeachinConfirm(value) { // 添加课程
+            let scheduleList = this.scheduleList
+            let startTime = (value[2] >= 10 ? value[2] : '0' + value[2]) + ':' + value[3].split('分')[0]
+            let endTime = this.MinutesTest(value[2], value[3], this.form.singleClassMinutes)
+
+            let isAdd = true
+            scheduleList.forEach(item => {
+                let isStartTime = this.timeIsrange(startTime, endTime, item.startTime);
+                let isEndTime = this.timeIsrange(startTime, endTime, item.endTime);
+                if(value[1] == item.weekStr) {
+                    if(isStartTime || isEndTime) {
+                        isAdd = false
+                    } else {
+                        isAdd = true
+                    }
+                } else if(value[1] != item.weekStr) {
+                    isAdd = true
+                }
+            })
+
+            if(isAdd) { // 判断时间范围是否有重复
+                scheduleList.push({
+                    type: value[0], // 线上还是线下
+                    weekStr: value[1],
+                    weekIndex: this.getWeek(value[1]),
+                    startTime: startTime,
+                    endTime: endTime,
+                    id: Date.now()
+                })
+                this.courseForm.teachingStatus = false
+
+                this.setTimeTable()
+            } else {
+                this.$toast('该时间段已排课请重选时间')
+                return
+            }
+        },
+        onShowTimeTable() { // 显示排课列表
+            this.statusList.classTime = true
+            this.setTimeTable()
+        },
+        setTimeTable () {
+            // 重置排课列表
+            this.timeTable = []
+
+            let form = this.form,
+                scheduleList = this.scheduleList
+            // if(!form.courseStart) {
+            //     this.$toast('请选择排课开始时间')
+            //     return
+            // }
+
+            // 拿到线上课数与线下课数 以及
+            let online = parseInt(form.onlineClassesNums)
+            let offline = parseInt(form.offlineClassesNums)
+            let giveNum = parseInt(this.other.giveNum)
+            
+            let giveClassType = form.giveTeachMode
+            if (giveClassType == 'ONLINE') {
+                // 线上
+                online += giveNum
+            } else if (giveClassType == 'OFFLINE') {
+                offline += giveNum
+            }
+            // 判断是否有课程安排
+            if (scheduleList.length <= 0) {
+                return
+            }
+            let totalCount = Number(online) + Number(offline)
+            let dateOperation  = new Date(form.courseStart)
+            let tempI = 0
+            while(totalCount && totalCount > 0) {
+                for(let i = 0; i < scheduleList.length; i++) {
+                    if (online == 0 && offline == 0) break
+                    let num = scheduleList[i].weekIndex - dateOperation.getDay()
+                    if(num < 0) { // 如果为负数则为下周
+                        num = num + 7
+                    } 
+                    let dataStr = this.getThinkDate(dateOperation, num)
+                    let tempArr = {
+                        'classDate': dataStr,
+                        'startClassTimeStr': scheduleList[i].startTime,
+                        "endClassTimeStr": scheduleList[i].endTime
+                    }
+                    if(scheduleList[i].type == '线上' && online > 0) {
+                        tempArr.teachMode = 'ONLINE'
+                        this.timeTable.push(tempArr)
+                        online--
+                    } else if(scheduleList[i].type == '线下' && offline > 0) {
+                        tempArr.teachMode = 'OFFLINE'
+                        this.timeTable.push(tempArr)
+                        offline--
+                    } else {
+                        if(online > 0) {
+                            tempArr.teachMode = 'ONLINE'
+                            this.timeTable.push(tempArr)
+                            online--
+                        } else if(offline > 0) {
+                            tempArr.teachMode = 'OFFLINE'
+                            this.timeTable.push(tempArr)
+                            offline--
+                        }
+                    }
+                    totalCount--
+                }
+                // 加一周
+                dateOperation.setDate(dateOperation.getDate() + 7)
+            }
+        },
+        onGiveMode() { // 赠送课改变时
+            this.statusList.giveTeachModeStatus = true
+            this.getCalcClass()
+        },
+        getCalcClass() { // 计算课酬
+            let loadData = this.loadData
+            let form = this.form
+            let vas = loadData.vipGroupActivitySelect, // 活动
+                vcs = loadData.vipGroupCategorySelect, // 课程形式
+                tc = loadData.teacherCategory, // 老师基本信息
+                oncn = form.onlineClassesNums ? form.onlineClassesNums : 0, // 线上课次数
+                offcn = form.offlineClassesNums ? form.offlineClassesNums : 0, // 线下课次数
+                giveTeachMode = form.giveTeachMode // 线下或线下
+            // 优惠活动
+            // ...
+            if(vas.salarySettlementJson) {
+                let obj = JSON.parse(vas.salarySettlementJson)
+                if (obj && obj.onlineSalarySettlement) {
+                    let onss = obj.onlineSalarySettlement
+                    // 有线上课
+                    if(onss.salarySettlementType == 'TEACHER_DEFAULT') {
+                        let b = (vcs.singleClassMinutes / 30).toFixed(2) // 每30Min计算一些课酬
+                        form.onlineTeacherSalary = b * tc.onlineClassesSalary // 线上课酬
+                    } else if(onss.salarySettlementType == 'RATIO_DISCOUNT') {
+                        // 老师课酬的折扣 如果有则不打折
+                        form.onlineTeacherSalary = vcs.onlineClassesUnitPrice * (onss.settlementValue ? onss.settlementValue : 10) / 10
+                    } else if(onss.salarySettlementType == 'FIXED_SALARY') {
+                        form.onlineTeacherSalary = onss.settlementValue
+                    }
+                }
+                if (obj && obj.offlineSalarySettlement) {
+                    let offss = obj.offlineSalarySettlement
+                    // 有线下课
+                    if(offss.salarySettlementType == 'TEACHER_DEFAULT') {
+                        let b = (vcs.singleClassMinutes / 30).toFixed(2) // 每30Min计算一些课酬
+                        form.offlineTeacherSalary = b * tc.offlineClassesSalary // 线上课酬
+                    } else if(offss.salarySettlementType == 'RATIO_DISCOUNT') {
+                        // 老师课酬的折扣
+                        form.offlineTeacherSalary = vcs.offlineClassesUnitPrice * (offss.settlementValue ? offss.settlementValue : 100) / 100
+                    } else if(offss.salarySettlementType == 'FIXED_SALARY') {
+                        form.offlineTeacherSalary = offss.settlementValue
+                    }
+                }
+            }
+
+            if(vas.type == 'GIVE_CLASS' || vas.type == 'BASE_ACTIVITY') { 
+                form.totalCount = (oncn * form.onlineClassesUnitPrice) + (offcn * form.offlineClassesUnitPrice) 
+            } else if(vas.type == 'DISCOUNT') {
+                form.totalCount = ((oncn * form.onlineClassesUnitPrice) + (offcn * form.offlineClassesUnitPrice)) * Number(vas.attribute1) / 100
+            }
+        },
+        getThinkDate (date, num) {
+            let Stamp = date
+            Stamp.setDate(date.getDate() + num) // 获取当前月数的第几天
+            var year = Stamp.getFullYear(); //获取完整的年份(4位,1970-????)
+            var month = Stamp.getMonth() + 1; //获取当前月份(0-11,0代表1月)
+            var mvar = '';
+            if (month < 10) {
+                mvar = '0' + month;
+            } else {
+                mvar = month + '';
+            }
+            var day = Stamp.getDate();
+            var dvar = '';
+            if (day < 10) {
+                dvar = '0' + day;
+            } else {
+                dvar = day + '';
+            }
+            return year + "-" + mvar + '-' + dvar;
+        },
+        // 分钟小时相加减
+        MinutesTest (houer, mins, interval) {
+            let min = mins.split('分')[0]
+            let sdate1 = new Date(1900, 1, 1, houer, min)
+            sdate1.setMinutes(sdate1.getMinutes() + parseInt(interval))
+            let H = sdate1.getHours()
+            let M = sdate1.getMinutes()
+            if (H < 10) H = '0' + H
+            if (M < 10) M = '0' + M
+            return H + ':' + M
+        },
+        // 判断时间是否在时间段内
+        timeIsrange (beginTime, endTime, nowTime) {
+            var strb = beginTime.split(":");
+            if (strb.length != 2) {
+                return false;
+            }
+            var stre = endTime.split(":");
+            if (stre.length != 2) {
+                return false;
+            }
+            var strn = nowTime.split(":");
+            if (stre.length != 2) {
+                return false;
+            }
+            var b = new Date();
+            var e = new Date();
+            var n = new Date();
+            b.setHours(strb[0]);
+            b.setMinutes(strb[1]);
+            e.setHours(stre[0]);
+            e.setMinutes(stre[1]);
+            n.setHours(strn[0]);
+            n.setMinutes(strn[1]);
+
+            if (n.getTime() - b.getTime() >= 0 && n.getTime() - e.getTime() <= 0) {
+                // 在时间范围内
+                return true
+            } else {
+                // 不在时间范围内
+                return false
+            }
+        },
+        getWeek(str) { // 获取周几索引值
+            let template = {
+                '周一': 1,
+                '周二': 2,
+                '周三': 3,
+                '周四': 4,
+                '周五': 5,
+                '周六': 6,
+                '周日': 0
+            }
+            return template[str]
+        },
+        formatter(type, value) {
+            if (type === 'year') {
+                return `${value}年`;
+            } else if (type === 'month') {
+                return `${value}月`
+            } else if (type === 'day') {
+                return `${value}日`
+            }
+            return value;
+        },
+        onSubmit() {
+            let form = this.form
+            if(!(form.name)) {
+                this.$toast('请输入课程班名称')
+                return false
+            }
+            if(!form.subjectIdList) {
+                this.$toast('请选择科目')
+                return false
+            }
+            if(!form.vipGroupCategoryId) {
+                this.$toast('请选择课程形式')
+                return false
+            }
+            if(!form.vipGroupActivityId) {
+                this.$toast('请选择活动方案')
+                return false
+            }
+            if(!form.teacherSchoolId) {
+                this.$toast('请选择线下课地址')
+                return false
+            }
+            if(!form.onlineClassesNums && form.onlineClassesNums <= 0) {
+                this.$toast('上课次数有误')
+                return false
+            }
+            if(!form.offlineClassesNums && form.offlineClassesNums <= 0) {
+                this.$toast('请输入线下课次数')
+                return false
+            }
+
+            let vipGroupActivitySelect = this.loadData.vipGroupActivitySelect
+            if(vipGroupActivitySelect.type == 'GIVE_CLASS' && !form.giveTeachMode) {
+                this.$toast('请选择赠课类型')
+                return false
+            }
+            if(this.scheduleList.length <= 0) {
+                this.$toast('课时安排不能为空')
+                return false
+            }
+            if(!form.onlineClassesUnitPrice) {
+                this.$toast('请输入线上课单价')
+                return false
+            }
+            if(!form.offlineClassesUnitPrice) {
+                this.$toast('请输入线下课单价')
+                return false
+            }
+            if(!form.onlineTeacherSalary) {
+                this.$toast('请输入线上课课酬')
+                return false
+            }
+            if(!form.offlineTeacherSalary) {
+                this.$toast('请输入线下课课酬')
+                return false
+            }
+            if(form.giveTeachMode == 'ONLINE') {
+                form.onlineClassesNum = Number(form.onlineClassesNums) + Number(this.other.giveNum)
+                form.offlineClassesNum = Number(form.offlineClassesNums)
+            } else {
+                form.onlineClassesNum = Number(form.onlineClassesNums)
+                form.offlineClassesNum = Number(form.offlineClassesNums) + Number(this.other.giveNum)
+            }
+            form.totalClassTimes = Number(form.onlineClassesNums) + Number(form.offlineClassesNums) + Number(this.other.giveNum)
+            form.paymentExpireDate = form.courseStart
+
+            let params = {
+                courseSchedules: this.timeTable,
+                vipGroupApplyBaseInfo: form
+            }
+            vipGroupApply(params).then(res => {
+                let result =res.data
+                if(result.code == 200) {
+                    this.$toast('申请成功')
+                    // this.$router.push('/business')
+                    if(browser().iPhone) {
+                        window.webkit.messageHandlers.DAYA.postMessage(JSON.stringify({api: 'back'}))
+                    } else {
+                        this.$router.push('/business')
+                    }
+                } else {
+                    this.$toast(result.msg)
+                }
+            })
+        }
+    }
 }
 </script>
 <style lang='less' scoped>
 @import url("../../assets/commonLess/variable.less");
 .vip-title {
-    padding: .04rem 0;
+    padding: .06rem 0 .04rem;
     font-size: .12rem;
     color: @mFontColor;
     text-align: center;
@@ -72,7 +816,7 @@ export default {
     display: flex;
     align-items: center;
     justify-content: center;
-    padding: .3rem 0;
+    padding: .2rem 0;
     font-size: .16rem;
     color: @tFontColor;
     .van-icon {
@@ -95,6 +839,13 @@ export default {
     }
 }
 
+/deep/.van-field__label, /deep/.van-cell__value {
+    flex: 1 auto;
+}
+/deep/.van-field__control:disabled {
+    color: #6a6969;
+}
+
 .button-group {
     margin: .3rem .26rem .2rem;
     .van-button--primary {
@@ -102,4 +853,29 @@ export default {
         font-size: .18rem;
     }
 }
+
+.van-row {
+    line-height: .4rem;
+    border-top: 1px solid #edeef0;
+    text-align: center;
+    font-size: .14rem;
+    &:first-child {
+        border-top: 0;
+        background: #edeef0;
+        color: #444;
+        font-size: .15rem;
+    }
+}
+.tableContainer {
+    max-height: 2.44rem;
+    overflow: auto;
+    .van-row {
+        color: #444;
+        &:first-child {
+            border-top: 0;
+            background: #fff;
+            font-size: .14rem;
+        }
+    }
+}
 </style>

+ 12 - 5
vue.config.js

@@ -1,5 +1,5 @@
 // let targetUrl = 'http://47.99.212.176:8000'
-let targetUrl = 'http://192.168.3.8:9001'
+let targetUrl = 'http://192.168.3.48:8000'
 module.exports = {
     // 调整内部的 webpack 配置。
     // 查阅 https://github.com/vuejs/vue-doc-zh-cn/vue-cli/webpack.md
@@ -9,12 +9,12 @@ module.exports = {
     devServer: {
         open: process.platform === 'darwin',
         host: '0.0.0.0',
-        port: 9001,
+        port: 9999,
         https: false,
         hotOnly: false,
         // 查阅 https://github.com/vuejs/vue-doc-zh-cn/vue-cli/cli-service.md#配置代理
         proxy: {
-          '/contracts': {
+            '/contracts': {
                 target: targetUrl,
                 changeOrigin: true,
                 ws: true,
@@ -35,11 +35,18 @@ module.exports = {
                 '^/api-cms': '/api-cms',
                 xfwd: true
             },
-            '/order': {
+            '/teacher-server': {
                 target: targetUrl,
                 changeOrigin: true,
                 ws: true,
-                '^/order': '/order',
+                '^/teacher-server': '/teacher-server',
+                xfwd: true
+            },
+            '/web-server': {
+                target: targetUrl,
+                changeOrigin: true,
+                ws: true,
+                '^/web-server': '/web-server',
                 xfwd: true
             }
         }, // string | Object

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