瀏覽代碼

Merge branch 'online' into LaoMo

Xiao_Mo 5 年之前
父節點
當前提交
eccccbd864
共有 100 個文件被更改,包括 757 次插入34 次删除
  1. 0 0
      dist/css/Account.74361b52.css
  2. 1 0
      dist/css/AppLogin.e92f1d3a.css
  3. 0 0
      dist/css/Approval.56c0da3c.css
  4. 0 0
      dist/css/CallNames.278d4c0c.css
  5. 0 0
      dist/css/ClassDetail.43886efb.css
  6. 0 0
      dist/css/CourseApply.c6afa00d.css
  7. 0 0
      dist/css/CourseDetail.acc109bb.css
  8. 0 0
      dist/css/CourseEvaluation.415f10ba.css
  9. 1 0
      dist/css/CourseEvaluation.65b5c304.css
  10. 1 0
      dist/css/ExchangeRecord.16e31609.css
  11. 1 0
      dist/css/HelpCenter.4d12ea02.css
  12. 1 0
      dist/css/HelpCenter~PeriodExchange.7837a7c8.css
  13. 0 0
      dist/css/IStarted.2ceb2ecc.css
  14. 0 0
      dist/css/ManageEvaluation.5875c229.css
  15. 0 0
      dist/css/ManageEvaluation.5db3b127.css
  16. 0 0
      dist/css/PaymentResult.bc59b6bd.css
  17. 0 0
      dist/css/PeriodAdjust~PeriodChange.99ea5fe1.css
  18. 1 0
      dist/css/PeriodExchange.0ce9b63c.css
  19. 1 0
      dist/css/PeriodRecord.03334985.css
  20. 0 0
      dist/css/chunk-vendors.557c2ea8.css
  21. 0 0
      dist/css/chunk-vendors.ac1f005b.css
  22. 0 0
      dist/css/privacy.dd743bbc.css
  23. 二進制
      dist/img/icon_student.2f375f47.png
  24. 二進制
      dist/img/icon_teacher.de517191.png
  25. 二進制
      dist/img/logo.334a5ce4.png
  26. 二進制
      dist/img/pay_error.109ccf27.png
  27. 二進制
      dist/img/pay_ing.2848bdf2.png
  28. 二進制
      dist/img/pay_success.181846c1.png
  29. 0 0
      dist/index.html
  30. 0 0
      dist/js/Account.333355cf.js
  31. 0 0
      dist/js/Account~AppLogin~Approval~Attendance~CallNames~ClassDetail~CourseApply~CourseDetail~CourseEvaluation~fd18cf5c.d5b67f4b.js
  32. 0 0
      dist/js/AppLogin.6612f6d1.js
  33. 0 0
      dist/js/Approval.16d29ca4.js
  34. 0 0
      dist/js/Approval.1abb9367.js
  35. 0 0
      dist/js/Approval~Attendance~CallNames~CourseEvaluation~IStarted~Leave~ManageEvaluation~PeriodAdjust~PeriodCh~b1c022c0.a1a68ee8.js
  36. 0 0
      dist/js/Attendance.b98a87cb.js
  37. 0 0
      dist/js/Attendance.bbc16334.js
  38. 0 0
      dist/js/BookingSet.95c4a04a.js
  39. 0 0
      dist/js/Business.c334822b.js
  40. 0 0
      dist/js/CallNames.08e534b0.js
  41. 0 0
      dist/js/CallNames.8ac7cf34.js
  42. 0 0
      dist/js/CcMe.72448ea3.js
  43. 0 0
      dist/js/ClassDetail.374fd244.js
  44. 0 0
      dist/js/CourseApply.5b78cfcc.js
  45. 0 0
      dist/js/CourseDetail.1ce3df83.js
  46. 0 0
      dist/js/CourseEvaluation.0972d195.js
  47. 0 0
      dist/js/CourseEvaluation.3dab05bd.js
  48. 0 0
      dist/js/ExchangeRecord.d308fafe.js
  49. 0 0
      dist/js/HelpCenter.081faabf.js
  50. 0 0
      dist/js/HelpCenter~PeriodExchange.9f4dd30c.js
  51. 0 0
      dist/js/IStarted.0f5aa4b4.js
  52. 0 0
      dist/js/IStarted.b82a855f.js
  53. 0 0
      dist/js/Leave.961711b4.js
  54. 0 0
      dist/js/Leave.efaaada7.js
  55. 0 0
      dist/js/ManageEvaluation.39107e03.js
  56. 0 0
      dist/js/ManageEvaluation.a8f24c68.js
  57. 0 0
      dist/js/PaymentResult.daa0e2c9.js
  58. 0 0
      dist/js/PeriodAdjust.22c8f9c1.js
  59. 0 0
      dist/js/PeriodAdjust~PeriodChange.bea2567c.js
  60. 0 0
      dist/js/PeriodAdjust~PeriodChange.ffa7b870.js
  61. 0 0
      dist/js/PeriodChange.240a1f27.js
  62. 0 0
      dist/js/PeriodExchange.05d5e083.js
  63. 0 0
      dist/js/PeriodRecord.6c62a479.js
  64. 0 0
      dist/js/StartedDetail.fb2bf2e8.js
  65. 0 0
      dist/js/TeachingSchool.6578e107.js
  66. 0 0
      dist/js/TeachingSchool.69a9a9b2.js
  67. 0 0
      dist/js/TeachingSet.4aae3fe6.js
  68. 0 0
      dist/js/TeachingSet.bddcdbcd.js
  69. 0 0
      dist/js/VIPApply.c0849c13.js
  70. 0 0
      dist/js/app.96a64c51.js
  71. 0 0
      dist/js/app.b34a91f0.js
  72. 0 0
      dist/js/chunk-vendors.65079539.js
  73. 0 0
      dist/js/chunk-vendors.c7948c18.js
  74. 0 0
      dist/js/order.9680c74c.js
  75. 0 0
      dist/js/order.df6f1029.js
  76. 0 0
      dist/js/privacy.02d76eb6.js
  77. 0 0
      dist/js/privacy.54be2a02.js
  78. 18 26
      package-lock.json
  79. 2 1
      package.json
  80. 166 0
      src/api/app.js
  81. 二進制
      src/assets/images/app/icon_b.png
  82. 二進制
      src/assets/images/app/icon_change.png
  83. 二進制
      src/assets/images/app/icon_lock.png
  84. 二進制
      src/assets/images/app/icon_record.png
  85. 二進制
      src/assets/images/app/icon_step.png
  86. 二進制
      src/assets/images/app/icon_student.png
  87. 二進制
      src/assets/images/app/icon_teacher.png
  88. 二進制
      src/assets/images/app/icon_times.png
  89. 二進制
      src/assets/images/app/icon_use.png
  90. 二進制
      src/assets/images/app/plus-square-o.png
  91. 二進制
      src/assets/images/icon_teacher.png
  92. 二進制
      src/assets/images/logo.png
  93. 二進制
      src/assets/images/pay_ing.png
  94. 49 3
      src/common/common.js
  95. 35 2
      src/common/vueFilters.js
  96. 2 2
      src/main.js
  97. 90 0
      src/router/appRouter.js
  98. 2 0
      src/router/index.js
  99. 180 0
      src/views/app/Account.vue
  100. 206 0
      src/views/app/AppLogin.vue

文件差異過大導致無法顯示
+ 0 - 0
dist/css/Account.74361b52.css


+ 1 - 0
dist/css/AppLogin.e92f1d3a.css

@@ -0,0 +1 @@
+.login[data-v-44c2b6d8]{min-height:100vh;background:-webkit-gradient(linear,left top,left bottom,from(#15938b),to(#6dbeba));background:linear-gradient(180deg,#15938b,#6dbeba)}.container[data-v-44c2b6d8]{padding:0 .48rem}.logo[data-v-44c2b6d8]{padding-top:1rem;padding-bottom:.9rem;width:1.6rem;margin:0 auto}.logo img[data-v-44c2b6d8]{width:inherit}.input-group[data-v-44c2b6d8]{position:relative;height:.44rem;border-radius:.5rem;border:.02rem solid #fff;margin-bottom:.2rem;padding-left:.3rem;padding-right:.3rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group .input[data-v-44c2b6d8]{-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:.14rem;color:#fff;background:transparent;border:none}.input-group .input[data-v-44c2b6d8]::-webkit-input-placeholder{color:#fff}.input-group .input[data-v-44c2b6d8]::-moz-placeholder{color:#fff}.input-group .input[data-v-44c2b6d8]:-ms-input-placeholder{color:#fff}.input-group .input[data-v-44c2b6d8]::-ms-input-placeholder{color:#fff}.input-group .input[data-v-44c2b6d8]::placeholder{color:#fff}.input-group .code-text[data-v-44c2b6d8]{position:absolute;right:0;-webkit-box-flex:1;-ms-flex:1;flex:1;display:block;width:.94rem;text-align:center;border-left:.02rem solid #fff}.input-group .code-text[data-v-44c2b6d8],[data-v-44c2b6d8] .van-count-down{font-size:.14rem;color:#fff;line-height:.3rem;height:.3rem}[data-v-44c2b6d8] .van-button--large{height:.44rem;line-height:.42rem;color:#14928a;border:0}[data-v-44c2b6d8] .van-button:active:before{opacity:.05}[data-v-44c2b6d8] .van-button--disabled{opacity:1;color:rgba(0,0,0,.25)}.login-change[data-v-44c2b6d8]{padding-top:.08rem;font-size:.14rem;color:#fff;float:right}

+ 0 - 0
dist/css/Approval.61a71453.css → dist/css/Approval.56c0da3c.css


+ 0 - 0
dist/css/CallNames.f9091a04.css → dist/css/CallNames.278d4c0c.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/ClassDetail.43886efb.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/CourseApply.c6afa00d.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/CourseDetail.acc109bb.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/CourseEvaluation.415f10ba.css


+ 1 - 0
dist/css/CourseEvaluation.65b5c304.css

@@ -0,0 +1 @@
+[data-v-00fbc00b] .van-cell-group{margin-top:.15rem}[data-v-00fbc00b] .van-cell-group /deep/ .van-cell{padding:.14rem .16rem}.title-item[data-v-00fbc00b]{display:-webkit-box;display:-ms-flexbox;display:flex;padding:.05rem 0}.title-item .text[data-v-00fbc00b]{margin-right:.15rem;font-size:.17rem;color:#1a1a1a}.title-item[data-v-00fbc00b] .van-rate{line-height:0}[data-v-00fbc00b] .van-cell__title{font-size:.17rem;color:#1a1a1a;-webkit-box-flex:1;-ms-flex:auto 1;flex:auto 1}[data-v-00fbc00b] .van-cell__value,[data-v-00fbc00b] .van-field__control{font-size:.17rem;color:#666;width:70%;-webkit-box-flex:1;-ms-flex:auto;flex:auto}.textarea[data-v-00fbc00b]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.textarea[data-v-00fbc00b] .van-cell__value{margin-top:.1rem;width:100%}.twoConnect[data-v-00fbc00b]{width:55%}[data-v-00fbc00b] .van-radio-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}[data-v-00fbc00b] .van-radio-group /deep/ .van-radio{margin-left:.18rem}[data-v-00fbc00b] .van-radio__icon .van-icon{border-color:#aaa}[data-v-00fbc00b] .van-radio__icon--checked .van-icon{border-color:#14928a;background:#14928a}.button-group[data-v-00fbc00b]{margin:.3rem .26rem .2rem}.button-group .van-button--primary[data-v-00fbc00b]{background:#14928a;border:1px solid #14928a;font-size:.18rem}

+ 1 - 0
dist/css/ExchangeRecord.16e31609.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}.icon[data-v-67669af7]{width:2rem;height:2rem;margin:.5rem auto .05rem}.icon_nodata[data-v-67669af7]{background:url(../img/icon_nodata.81c87d57.png) no-repeat 50%;background-size:contain}.msg[data-v-67669af7]{color:#aaa;font-size:.16rem;text-align:center;line-height:.22rem}.periodExchange[data-v-bbd1916c]{min-height:100vh}.periodExchange .exchangeText[data-v-bbd1916c]{font-size:.17rem;color:#1a1a1a;line-height:.24rem}.periodExchange .exchangeText.enum[data-v-bbd1916c]{color:#2fb371}.periodExchange .info[data-v-bbd1916c]{font-size:.14rem;color:grey}.periodExchange[data-v-bbd1916c] .van-cell{padding:.14rem .16rem}

+ 1 - 0
dist/css/HelpCenter.4d12ea02.css

@@ -0,0 +1 @@
+.icon[data-v-67669af7]{width:2rem;height:2rem;margin:.5rem auto .05rem}.icon_nodata[data-v-67669af7]{background:url(../img/icon_nodata.81c87d57.png) no-repeat 50%;background-size:contain}.msg[data-v-67669af7]{color:#aaa;font-size:.16rem;text-align:center;line-height:.22rem}.help[data-v-9e6f0328]{min-height:100vh}[data-v-9e6f0328] .van-collapse{margin:.15rem 0}[data-v-9e6f0328] .van-collapse /deep/ .van-cell{color:#1a1a1a;font-size:.17rem;padding:.15rem .16rem}[data-v-9e6f0328] .van-collapse /deep/ .van-collapse-item__content{font-size:.14rem;color:grey}

+ 1 - 0
dist/css/HelpCenter~PeriodExchange.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}

+ 0 - 0
dist/css/IStarted.6d22f131.css → dist/css/IStarted.2ceb2ecc.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/ManageEvaluation.5875c229.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/ManageEvaluation.5db3b127.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/PaymentResult.bc59b6bd.css


+ 0 - 0
dist/css/PeriodAdjust~PeriodChange.bec5c878.css → dist/css/PeriodAdjust~PeriodChange.99ea5fe1.css


+ 1 - 0
dist/css/PeriodExchange.0ce9b63c.css

@@ -0,0 +1 @@
+.periodExchange[data-v-744c3b4c]{min-height:100vh;position:relative}.periodExchange .logo[data-v-744c3b4c]{width:.5rem;height:.5rem;border-radius:50%;overflow:hidden;margin-right:.13rem}.periodExchange[data-v-744c3b4c] .van-cell{padding:.26rem .16rem .88rem}.periodExchange .exchangeText[data-v-744c3b4c]{font-size:.18rem;color:#1a1a1a}.periodExchange .info[data-v-744c3b4c]{font-size:.16rem;color:grey}.activeList[data-v-744c3b4c]{padding:0 .16rem;margin-top:-.6rem;position:relative;z-index:99}.activeList .active[data-v-744c3b4c]{position:relative;margin-bottom:.15rem;line-height:0}.activeList img[data-v-744c3b4c]{width:100%}.activeList .icon_question[data-v-744c3b4c]{position:absolute;bottom:.1rem;right:.1rem;color:#fff;font-size:.18rem}.popupContent[data-v-744c3b4c]{padding:.4rem .16rem .1rem}.pay_btn[data-v-744c3b4c]{background:#14928a;line-height:.45rem;color:#fff;font-size:.18rem;border-radius:.5rem;text-align:center;position:absolute;width:90%;margin-left:5%;bottom:.2rem}

+ 1 - 0
dist/css/PeriodRecord.03334985.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}.icon[data-v-67669af7]{width:2rem;height:2rem;margin:.5rem auto .05rem}.icon_nodata[data-v-67669af7]{background:url(../img/icon_nodata.81c87d57.png) no-repeat 50%;background-size:contain}.msg[data-v-67669af7]{color:#aaa;font-size:.16rem;text-align:center;line-height:.22rem}.periodExchange[data-v-387cde18]{min-height:100vh}.periodExchange .exchangeText[data-v-387cde18]{font-size:.17rem;color:#1a1a1a;line-height:.24rem}.periodExchange .exchangeText.enum[data-v-387cde18]{color:#ff5050}.periodExchange .info[data-v-387cde18]{font-size:.14rem;color:grey}

文件差異過大導致無法顯示
+ 0 - 0
dist/css/chunk-vendors.557c2ea8.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/chunk-vendors.ac1f005b.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/privacy.dd743bbc.css


二進制
dist/img/icon_student.2f375f47.png


二進制
dist/img/icon_teacher.de517191.png


二進制
dist/img/logo.334a5ce4.png


二進制
dist/img/pay_error.109ccf27.png


二進制
dist/img/pay_ing.2848bdf2.png


二進制
dist/img/pay_success.181846c1.png


文件差異過大導致無法顯示
+ 0 - 0
dist/index.html


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Account.333355cf.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Account~AppLogin~Approval~Attendance~CallNames~ClassDetail~CourseApply~CourseDetail~CourseEvaluation~fd18cf5c.d5b67f4b.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/AppLogin.6612f6d1.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Approval.16d29ca4.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Approval.1abb9367.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Approval~Attendance~CallNames~CourseEvaluation~IStarted~Leave~ManageEvaluation~PeriodAdjust~PeriodCh~b1c022c0.a1a68ee8.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Attendance.b98a87cb.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Attendance.bbc16334.js


+ 0 - 0
dist/js/BookingSet.c83ca91c.js → dist/js/BookingSet.95c4a04a.js


+ 0 - 0
dist/js/Business.69587e80.js → dist/js/Business.c334822b.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/CallNames.08e534b0.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/CallNames.8ac7cf34.js


+ 0 - 0
dist/js/CcMe.5e42fbf0.js → dist/js/CcMe.72448ea3.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/ClassDetail.374fd244.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/CourseApply.5b78cfcc.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/CourseDetail.1ce3df83.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/CourseEvaluation.0972d195.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/CourseEvaluation.3dab05bd.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/ExchangeRecord.d308fafe.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/HelpCenter.081faabf.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/HelpCenter~PeriodExchange.9f4dd30c.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/IStarted.0f5aa4b4.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/IStarted.b82a855f.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Leave.961711b4.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Leave.efaaada7.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/ManageEvaluation.39107e03.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/ManageEvaluation.a8f24c68.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/PaymentResult.daa0e2c9.js


+ 0 - 0
dist/js/PeriodAdjust.8c8e5986.js → dist/js/PeriodAdjust.22c8f9c1.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/PeriodAdjust~PeriodChange.bea2567c.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/PeriodAdjust~PeriodChange.ffa7b870.js


+ 0 - 0
dist/js/PeriodChange.ac11ab26.js → dist/js/PeriodChange.240a1f27.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/PeriodExchange.05d5e083.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/PeriodRecord.6c62a479.js


+ 0 - 0
dist/js/StartedDetail.b6118063.js → dist/js/StartedDetail.fb2bf2e8.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/TeachingSchool.6578e107.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/TeachingSchool.69a9a9b2.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/TeachingSet.4aae3fe6.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/TeachingSet.bddcdbcd.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/VIPApply.c0849c13.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/app.96a64c51.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/app.b34a91f0.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/chunk-vendors.65079539.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/chunk-vendors.c7948c18.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/order.9680c74c.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/order.df6f1029.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/privacy.02d76eb6.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/privacy.54be2a02.js


+ 18 - 26
package-lock.json

@@ -988,9 +988,9 @@
       "dev": true
     },
     "@vant/icons": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npm.taobao.org/@vant/icons/download/@vant/icons-1.1.13.tgz",
-      "integrity": "sha1-6ncpj08rGczHYQBQaKLHQ2CY5NQ="
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@vant/icons/-/icons-1.2.1.tgz",
+      "integrity": "sha512-5ivsKQR4ySbdBW5UPoQDVqO6rdc1um3rvq/0VL+ZSA7Y3MdBQ3E4/NL0hoAY5/sZZeYfIDKEP21gpjUzdeEDQQ=="
     },
     "@vue/babel-helper-vue-jsx-merge-props": {
       "version": "1.0.0",
@@ -2503,13 +2503,6 @@
         "caniuse-lite": "^1.0.30001030",
         "electron-to-chromium": "^1.3.363",
         "node-releases": "^1.1.50"
-      },
-      "dependencies": {
-        "caniuse-lite": {
-          "version": "1.0.30001032",
-          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001032.tgz",
-          "integrity": "sha512-8joOm7BwcpEN4BfVHtfh0hBXSAPVYk+eUIcNntGtMkUWy/6AKRCDZINCLe3kB1vHhT2vBxBF85Hh9VlPXi/qjA=="
-        }
       }
     },
     "buffer": {
@@ -2693,10 +2686,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30000989",
-      "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000989.tgz",
-      "integrity": "sha1-uRk+KTzPfkQmxSRRNLjypWwKxLk=",
-      "dev": true
+      "version": "1.0.30001035",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz",
+      "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ=="
     },
     "case-sensitive-paths-webpack-plugin": {
       "version": "2.2.0",
@@ -4050,9 +4042,9 @@
       "dev": true
     },
     "electron-to-chromium": {
-      "version": "1.3.372",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.372.tgz",
-      "integrity": "sha512-77a4jYC52OdisHM+Tne7dgWEvQT1FoNu/jYl279pP88ZtG4ZRIPyhQwAKxj6C2rzsyC1OwsOds9JlZtNncSz6g=="
+      "version": "1.3.376",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.376.tgz",
+      "integrity": "sha512-cv/PYVz5szeMz192ngilmezyPNFkUjuynuL2vNdiqIrio440nfTDdc0JJU0TS2KHLSVCs9gBbt4CFqM+HcBnjw=="
     },
     "elliptic": {
       "version": "6.5.0",
@@ -7670,9 +7662,9 @@
       }
     },
     "node-releases": {
-      "version": "1.1.50",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.50.tgz",
-      "integrity": "sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==",
+      "version": "1.1.52",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz",
+      "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==",
       "requires": {
         "semver": "^6.3.0"
       },
@@ -11065,12 +11057,12 @@
       }
     },
     "vant": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npm.taobao.org/vant/download/vant-2.1.4.tgz",
-      "integrity": "sha1-qT51iPVhdQkbefLr2k4tinfkdvc=",
+      "version": "2.5.4",
+      "resolved": "https://registry.npmjs.org/vant/-/vant-2.5.4.tgz",
+      "integrity": "sha512-eIeXrzsEP5cNbMkskFwxu3i6kkzS2pR7/fF0pFoTXhl/oYRdkXUt46RnRQtazz/BNHVBf2j3dVnwLTIBPRGstQ==",
       "requires": {
         "@babel/runtime": "7.x",
-        "@vant/icons": "1.1.13",
+        "@vant/icons": "1.2.1",
         "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
         "vue-lazyload": "1.2.3"
       }
@@ -11183,8 +11175,8 @@
     },
     "vue-lazyload": {
       "version": "1.2.3",
-      "resolved": "https://registry.npm.taobao.org/vue-lazyload/download/vue-lazyload-1.2.3.tgz",
-      "integrity": "sha1-kB+ewVx+bKeHgaK65KNDaGve2yw="
+      "resolved": "https://registry.npmjs.org/vue-lazyload/-/vue-lazyload-1.2.3.tgz",
+      "integrity": "sha512-DC0ZwxanbRhx79tlA3zY5OYJkH8FYp3WBAnAJbrcuoS8eye1P73rcgAZhyxFSPUluJUTelMB+i/+VkNU/qVm7g=="
     },
     "vue-loader": {
       "version": "15.7.1",

+ 2 - 1
package.json

@@ -11,10 +11,11 @@
     "babel-polyfill": "^6.26.0",
     "browserslist": "^4.9.1",
     "caniuse": "^0.1.3",
+    "caniuse-lite": "^1.0.30001035",
     "core-js": "^2.6.5",
     "install": "^0.13.0",
     "qs": "^6.8.0",
-    "vant": "^2.1.4",
+    "vant": "^2.5.4",
     "vconsole": "^3.3.4",
     "vue": "^2.6.10",
     "vue-amap": "^0.5.10",

+ 166 - 0
src/api/app.js

@@ -0,0 +1,166 @@
+const axios = require('@/common/axios').default
+import qs from 'qs'
+// import axios from '@/common/axios'
+const api = '/api-teacher'
+
+// 发送登录短信验证码
+const sendSms = (data) => {
+  return axios({
+      url: '/api-student/code/sendSms',
+      method: 'post',
+      data: qs.stringify(data)
+  })
+}
+
+// 短信验证码的方式登录
+const smsLogin = (data) => {
+  return axios({
+      url: '/api-auth/smsLogin',
+      method: 'post',
+      data: qs.stringify(data)
+  })
+}
+
+// 获取课程组详情
+const getGroupDetail = (data) => {
+  return axios({
+      url: '/api-student/courseGroup/getGroupDetail',
+      method: 'get',
+      params: data
+  })
+}
+
+// 购买课程组
+const buyCourseGroup = (data) => {
+  return axios({
+      url: '/api-student/courseGroup/buyCourseGroup',
+      method: 'post',
+      data: qs.stringify(data)
+  })
+}
+
+// 创建课程
+const createCourseGroup = (data) => {
+  return axios({
+    url: api + '/courseGroup/createCourseGroup',
+    method: 'post',
+    data: data
+  })
+}
+
+const sysTenantAccountGet = (data) => {
+  return axios({
+    url: api + '/sysTenantAccount/get',
+    method: 'get',
+    params: data
+  })
+}
+
+const queryTenantAccountDetail = (data) => {
+  return axios({
+    url: api + '/sysTenantAccount/queryTenantAccountDetail',
+    method: 'get',
+    params: data
+  })
+}
+
+// 课时使用记录列表
+const teacherCourseMinutes = (data) => {
+  return axios({
+    url: api + '/teacherCourseSchedule/teacherCourseMinutes',
+    method: 'get',
+    params: data
+  })
+}
+
+// 分页查询活动列表
+const tenantEntryActivitesList = (data) => {
+  return axios({
+    url: api + '/tenantEntryActivities/queryPage',
+    method: 'get',
+    params: data
+  })
+}
+
+// 分页查询活动列表
+const createOrder = (data) => {
+  return axios({
+    url: api + '/tenantPaymentOrder/createOrder',
+    method: 'post',
+    data: qs.stringify(data)
+  })
+}
+
+// 分页查询活动列表
+const queryByOrderNo = (data) => {
+  return axios({
+    url: api + '/tenantPaymentOrder/queryByOrderNo',
+    method: 'get',
+    params: data
+  })
+}
+
+// 帮助中心分类
+const helpCenterCatalogList = (data) => {
+  return axios({
+    url: '/api-cms/helpCenterCatalog/list',
+    method: 'get',
+    params: data
+  })
+}
+
+// 帮助中心
+const helpCenterContentList = (data) => {
+  return axios({
+    url: '/api-cms/helpCenterContent/list',
+    method: 'get',
+    params: data
+  })
+}
+
+// 获取用户基本信息
+const queryUserInfo = (data) => {
+  return axios({
+    url: '/api-auth/queryUserInfo',
+    method: 'get',
+    params: data
+  })
+}
+
+// 获取老师评价和学生评价
+const getStuAndTeaReview = (data) => {
+  return axios({
+    url: api + '/courseReview/getStuAndTeaReview',
+    method: 'get',
+    params: data
+  })
+}
+
+// 批量添加评价
+const batchAdd = (data) => {
+  return axios({
+    url: api + '/courseReview/batchAdd',
+    method: 'post',
+    data: data
+  })
+}
+
+
+export {
+  sendSms,
+  smsLogin,
+  getGroupDetail,
+  buyCourseGroup,
+  createCourseGroup,
+  sysTenantAccountGet,
+  queryTenantAccountDetail,
+  helpCenterCatalogList,
+  helpCenterContentList,
+  teacherCourseMinutes,
+  tenantEntryActivitesList,
+  queryUserInfo,
+  createOrder,
+  queryByOrderNo,
+  getStuAndTeaReview,
+  batchAdd
+}

二進制
src/assets/images/app/icon_b.png


二進制
src/assets/images/app/icon_change.png


二進制
src/assets/images/app/icon_lock.png


二進制
src/assets/images/app/icon_record.png


二進制
src/assets/images/app/icon_step.png


二進制
src/assets/images/app/icon_student.png


二進制
src/assets/images/app/icon_teacher.png


二進制
src/assets/images/app/icon_times.png


二進制
src/assets/images/app/icon_use.png


二進制
src/assets/images/app/plus-square-o.png


二進制
src/assets/images/icon_teacher.png


二進制
src/assets/images/logo.png


二進制
src/assets/images/pay_ing.png


+ 49 - 3
src/common/common.js

@@ -5,12 +5,12 @@ const browser = () => {
     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,//火狐内核
+    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浏览器
+    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新增)
@@ -18,6 +18,52 @@ const browser = () => {
   }
 }
 
+const calcMinute = (minute) => {
+  if(minute <= 0) {
+    return '0分钟'
+  }
+  let minutes = minute % 60 // 算出分钟
+  let hours = 0 // 小时
+  if(minute >= 60) {
+    hours = (minute - minutes) / 60
+  }
+  let text = ''
+  if(hours) {
+    text = hours + '小时'
+  }
+  if(minutes) {
+    text += minutes + '分钟'
+  }
+  return text
+}
+
+/**
+ * 小于10的数变成 (0x)
+ * @param {数值} num 
+ */
+const getSTD = (num) => {
+  return Number(num) >= 10 ? num : '0' + num
+}
+
+/**
+ * 获取格式化的年月日
+ * @param {日期} time 
+ * @param {不是IOS里使用(多用于接口参数)} noIos 
+ */
+const getYMD = (time, noIos) => {
+  let tempDate = time || new Date()
+  if(typeof(tempDate) == 'string') {
+      tempDate = new Date(time.replace(/-/ig, '/'))
+  }
+  let t = noIos ? '-' : '/'
+  let month = getSTD(tempDate.getMonth() + 1)
+  let day = getSTD(tempDate.getDate())
+  return tempDate.getFullYear() + t + month + t + day
+}
+
 export {
-  browser
+  browser,
+  calcMinute,
+  getSTD,
+  getYMD
 }

+ 35 - 2
src/common/vueFilters.js

@@ -14,10 +14,10 @@ Vue.filter('bandStatus', value => {
 
 // 合并数组
 Vue.filter('joinArray', (value, type) => {
-    if(!type) {
+    if (!type) {
         type = ' '
     }
-    if(typeof value == 'object' && value != null) {
+    if (typeof value == 'object' && value != null) {
         return value.join(type)
     } else {
         return value
@@ -55,6 +55,39 @@ Vue.filter('teachModeStatus', value => {
     return templateStatus[value]
 })
 
+// 消耗类型
+Vue.filter('periodRecordStatus', value => {
+    let templateStatus = {
+        NOT_START: "未开始",
+        APPLYING: "报名中",
+        NORMAL: "正常",
+        LOCK: "锁定",
+        FINISH: "结束",
+        CANCEL: "取消"
+    }
+    return templateStatus[value]
+})
+
+// 计算分钟数
+Vue.filter('calcMinute', (minute) => {
+    if (minute <= 0) {
+        return '0分钟'
+    }
+    let minutes = minute % 60 // 算出分钟
+    let hours = 0 // 小时
+    if (minute >= 60) {
+        hours = (minute - minutes) / 60
+    }
+    let text = ''
+    if (hours) {
+        text = hours + '小时'
+    }
+    if (minutes) {
+        text += minutes + '分钟'
+    }
+    return text
+})
+
 Vue.filter('formatDate', value => {
     let d = new Date(value.replace(/-/ig, '/'))
     let hour = d.getHours() >= 10 ? d.getHours() : '0' + d.getHours()

+ 2 - 2
src/main.js

@@ -9,14 +9,14 @@ import { Button, Icon, Tag, Swipe, SwipeItem, Popup, Picker,
     Collapse, CollapseItem, Tab, Tabs, Row, Col, Cell, CellGroup,
     Circle, Field, DatetimePicker, Image, Loading,
     ActionSheet, RadioGroup, Radio, Checkbox, CheckboxGroup,
-    CountDown, Panel, Dialog, Sticky, Rate} from 'vant'
+    CountDown, Panel, Dialog, Sticky, Rate, Switch} from 'vant'
 Vue.use(Button).use(Icon).use(Tag).use(Swipe).use(SwipeItem)
    .use(Popup).use(Picker).use(DropdownMenu).use(DropdownItem).use(Search)
    .use(PullRefresh).use(Toast).use(List).use(Collapse).use(CollapseItem)
    .use(Tab).use(Tabs).use(Row).use(Col).use(Cell).use(CellGroup)
    .use(Circle).use(Field).use(DatetimePicker).use(Image).use(Loading)
    .use(ActionSheet).use(RadioGroup).use(Radio).use(Checkbox).use(CheckboxGroup)
-   .use(CountDown).use(Panel).use(Dialog).use(Sticky).use(Rate)
+   .use(CountDown).use(Panel).use(Dialog).use(Sticky).use(Rate).use(Switch)
 Vue.config.productionTip = false
 
 // import Vconsole from 'vconsole'

+ 90 - 0
src/router/appRouter.js

@@ -0,0 +1,90 @@
+let teacherRouter = [{
+  path: '/appLogin',
+  name: 'appLogin',
+  component: () => import(/* webpackChunkName:'AppLogin'*/'@/views/app/AppLogin.vue'),
+  meta: {
+      descrition: '登录',
+      weight: 3 // 页面权重
+  }
+}, {
+  path: '/classDetail',
+  name: 'classDetail',
+  component: () => import(/* webpackChunkName:'ClassDetail'*/'@/views/app/ClassDetail.vue'),
+  meta: {
+      descrition: 'VIP课堂详情',
+      weight: 3 // 页面权重
+  }
+}, {
+  path: "/courseApply",
+  name: "courseApply",
+  component: () =>
+    import( /* webpackChunkName:'CourseApply'*/ "@/views/app/CourseApply.vue"),
+  meta: {
+    descrition: "课程创建",
+    weight: 1 // 页面权重
+  }
+}, {
+  path: "/account",
+  name: "account",
+  component: () =>
+    import( /* webpackChunkName:'Account'*/ "@/views/app/Account.vue"),
+  meta: {
+    descrition: "我的账户",
+    weight: 1 // 页面权重
+  }
+}, {
+  path: "/periodRecord",
+  name: "periodRecord",
+  component: () =>
+    import( /* webpackChunkName:'PeriodRecord'*/ "@/views/app/PeriodRecord.vue"),
+  meta: {
+    descrition: "课时使用记录",
+    weight: 2 // 页面权重
+  }
+}, {
+  path: "/exchangeRecord",
+  name: "exchangeRecord",
+  component: () =>
+    import( /* webpackChunkName:'ExchangeRecord'*/ "@/views/app/ExchangeRecord.vue"),
+  meta: {
+    descrition: "兑换记录",
+    weight: 2 // 页面权重
+  }
+}, {
+  path: "/periodExchange",
+  name: "periodExchange",
+  component: () =>
+    import( /* webpackChunkName:'PeriodExchange'*/ "@/views/app/PeriodExchange.vue"),
+  meta: {
+    descrition: "课时兑换",
+    weight: 2 // 页面权重
+  }
+}, {
+  path: "/helpCenter",
+  name: "helpCenter",
+  component: () =>
+    import( /* webpackChunkName:'HelpCenter'*/ "@/views/app/HelpCenter.vue"),
+  meta: {
+    descrition: "帮助中心",
+    weight: 2 // 页面权重
+  }
+}, {
+  path: "/courseDetail",
+  name: "courseDetail",
+  component: () =>
+    import( /* webpackChunkName:'CourseDetail'*/ "@/views/app/CourseDetail.vue"),
+  meta: {
+    descrition: "课程评价",
+    weight: 2 // 页面权重
+  }
+}, {
+  path: "/paymentResult",
+  name: 'paymentResult',
+  component: () =>
+    import( /* webpackChunkName:'PaymentResult'*/ "@/views/app/PaymentResult.vue"),
+  meta: {
+    descrition: "支付结果",
+    weight: 2 // 页面权重
+  }
+}];
+export default teacherRouter;

+ 2 - 0
src/router/index.js

@@ -1,6 +1,7 @@
 import Vue from 'vue'
 import Router from 'vue-router'
 import TeacherRouter from './teacherRouter'
+import AppRouter from './appRouter'
 import AuditionRouter from './auditionRouter'
 
 
@@ -32,6 +33,7 @@ let defaultRouter = [
 ]
 
 defaultRouter = defaultRouter.concat(TeacherRouter)
+                             .concat(AppRouter)
                              .concat(AuditionRouter)
 
 const router = new Router({

+ 180 - 0
src/views/app/Account.vue

@@ -0,0 +1,180 @@
+<template>
+    <div class="account">
+        <m-header v-if="headerStatus" />
+
+        <!-- <div class="accountHeader">
+            <div class="bgColor"></div>
+            <van-row class="content" type="flex" justify="center" align="center">
+                <van-col span="24">
+                    剩余时间<span>{{ availableMinutes }}</span>
+                </van-col>
+                <van-col span="12">
+                    <i class="icon icon_lock"></i>冻结时间<span class="lock">{{ frozenMinutes }}</span>
+                </van-col>
+            </van-row>
+        </div> -->
+        <van-cell-group style="margin-bottom: .15rem;">
+            <van-cell title="剩余时间" >
+                <i class="icon icon_times" slot="icon"></i>
+                <div slot="default" class="available">
+                    {{ availableMinutes | calcMinute }}
+                </div>
+            </van-cell>
+        </van-cell-group>
+        <van-cell-group>
+            <van-cell title="课时兑换" is-link to="periodExchange" >
+                <i class="icon icon_change" slot="icon"></i>
+            </van-cell>
+            <van-cell title="兑换记录" is-link to="exchangeRecord" >
+                <i class="icon icon_record" slot="icon"></i>
+            </van-cell>
+
+            <van-cell title="课时使用记录" is-link to="periodRecord" >
+                <i class="icon icon_use" slot="icon"></i>
+            </van-cell>
+        </van-cell-group>
+
+    </div>
+</template>
+<script>
+/* eslint-disable */
+import MHeader from '@/components/MHeader'
+import { browser, calcMinute }  from '@/common/common'
+import { sysTenantAccountGet } from '@/api/app'
+export default {
+    name: 'courseApply',
+    components: { MHeader },
+    data() {
+        return {
+            headerStatus: true,
+            availableMinutes: 0,
+            frozenMinutes: 0
+        }
+    },
+    mounted() {
+        let params = this.$route.query
+        if(params.Authorization) {
+            localStorage.setItem('Authorization', decodeURI(params.Authorization))
+            localStorage.setItem('userInfo', decodeURI(params.Authorization))
+        }
+        
+        document.title = '我的账户'
+        if(browser().android || browser().iPhone) {
+            this.headerStatus = false
+        }
+
+        this.__init()
+    },
+    methods: {
+        __init() {
+            this.$toast.loading({
+                duration: 0,
+                message: '加载中...',
+                forbidClick: true,
+                loadingType: 'spinner'
+            })
+            sysTenantAccountGet().then(res => {
+                let result = res.data
+                this.$toast.clear()
+                if(result.code == 200) {
+                    let tempResult = result.data
+                    if(tempResult) {
+                        this.availableMinutes = (tempResult.availableMinutes ? tempResult.availableMinutes : 0)
+                    }
+                } else {
+                    this.$toast(result.msg)
+                }
+            })
+        }
+    }
+}
+</script>
+<style lang='less' scoped>
+@import url("../../assets/commonLess/variable.less");
+.account {
+    min-height: 100vh;
+}
+
+// .accountHeader {
+//     background: #fff;
+//     padding-bottom: .2rem;
+//     .bgColor {
+//         margin-top: -1px;   
+//         height: .9rem;
+//         background: #14928A;
+//     }
+//     .content {
+//         height:74px;
+//         background: rgba(255,255,255,1);
+//         box-shadow: 0px 0px 16px 0px rgba(0,0,0,0.19);
+//         border-radius: .08rem;
+//         margin: -.5rem .16rem 0;
+//         text-align: center;
+//         .van-col {
+//             color: #1A1A1A;
+//             display: flex;
+//             align-items: center;
+//             // justify-content: center;
+//             padding-left: .2rem;
+//             // &:first-child {
+//             //     border-right: 1px solid #CCCCCC;
+//             // }
+//             span {
+//                 padding-left: .1rem;
+//                 color: #FF0909;
+//                 &.lock {
+//                     color: #999999;
+//                 }
+//             }
+//         }
+        
+//     }
+// }
+.icon {
+    display: inline-block;
+    width: 0.2rem;
+    height: 0.22rem;
+    margin-right: .05rem;
+    margin-top: -0.02rem;
+}
+.icon_times {
+    background: url('../../assets/images/app/icon_times.png') no-repeat center center;
+    background-size: contain;
+}
+.icon_lock {
+    background: url('../../assets/images/app/icon_lock.png') no-repeat center center;
+    background-size: contain;
+}
+.icon_change {
+    background: url('../../assets/images/app/icon_change.png') no-repeat center center;
+    background-size: contain;
+}
+.icon_record {
+    background: url('../../assets/images/app/icon_record.png') no-repeat center center;
+    background-size: contain;
+}
+.icon_use {
+    background: url('../../assets/images/app/icon_use.png') no-repeat center center;
+    background-size: contain;
+}
+/deep/.van-cell-group {
+    &::after {
+        border-width: 0;;
+    }
+    /deep/.van-cell {
+        padding: .16rem;
+        align-items: center;
+        .available {
+            color: #FF0909;
+            font-size: .17rem;
+        }
+    }
+}
+
+/deep/.van-cell__title {
+    flex: 1 auto;
+    font-size: .16rem;
+    color: #1A1A1A;
+}
+
+</style>

+ 206 - 0
src/views/app/AppLogin.vue

@@ -0,0 +1,206 @@
+<template>
+    <div class="login">
+        <div class="logo">
+            <img src="../../assets/images/logo.png" alt="">
+        </div>
+
+        <div class="container">
+            <div class="input-group">
+                <input type="number" @blur="codeBlur" placeholder="请输入手机号报名或查询进度" class="input" v-model="phoneNumber" pattern="[0-9]">
+            </div>
+            <div class="input-group">
+                <input type="text" @blur="codeBlur" placeholder="请输入验证码" class="input" v-model="code" >
+                <span class="code-text" v-show="countDownStatus" @click="onSendCode">{{ codeText }}</span>
+                <span class="code-text" v-show="!countDownStatus">
+                    <van-count-down 
+                        ref="countdown"
+                        :auto-start="false"
+                        :time="countDownTime" 
+                        @finish="onFinished"
+                        format="ss秒" />
+                </span>
+            </div>
+
+            <van-button round size="large" @click="onCodeLogin" :disabled="codeDisable">登录</van-button>
+        </div>
+    </div>
+</template>
+<script>
+import {sendSms, smsLogin } from '@/api/app'
+export default {
+    name: 'login',
+    data() {
+        return {
+            groupId: this.$route.query.groupId,
+            codeDisable: true, // 验证码登录按钮状态
+            countDownStatus: true, // 到计时状态
+            phoneNumber: null,
+            code: null,
+            codeText: '获取验证码',
+            countDownTime: 1000 * 120 // 倒计时时间
+        }
+    },
+    mounted() {
+        // 登录时删除无用的token
+        localStorage.removeItem('userInfo')
+        localStorage.removeItem('Authorization')
+    },
+    watch: {
+        phoneNumber(newValue) {
+            this.onKeyUp(newValue, this.code)
+        },
+        code(newValue) {
+            this.onKeyUp(this.phoneNumber, newValue)
+        }
+    },
+    methods: {
+        codeBlur() {
+            setTimeout(() => {
+                const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0;
+                window.scrollTo(0, Math.max(scrollHeight - 1, 0));
+            }, 100);
+        },
+        onKeyUp(phoneNumber, code) {
+            if(!phoneNumber || !code) {
+                this.codeDisable = true
+            } else {
+                this.codeDisable = false
+            }
+        },
+        onSendCode() { // 发送验证码
+            if(!this.checkPhone(this.phoneNumber)) {
+                return
+            }
+            sendSms({
+                mobile: this.phoneNumber
+            }).then(res => {
+                let result = res.data
+                if(result.code == 200) {
+                    this.countDownStatus = false
+                    this.$refs.countdown.start() // 倒计时开始
+                } else {
+                    this.$toast(result.msg)
+                }
+            })
+        },
+        onCodeLogin() { // 短信登录
+            smsLogin({
+                clientId: 'student',
+                clientSecret: 'student',
+                phone: this.phoneNumber,
+                smsCode: this.code,
+                channel: 'H5',
+                isLessee: 'true'
+            }).then(sms => {
+                let s = sms.data
+                // 保存用户信息
+                if(s.code == 200) {
+                    let auth = s.data.authentication
+                    localStorage.setItem('userInfo', auth.token_type + ' ' + auth.access_token)
+                    
+                    this.$router.push({
+                        path: '/classDetail',
+                        query: {
+                            groupId: this.groupId
+                        }
+                    })
+                } else {
+                    this.$toast(s.msg)
+                }
+            })
+        },
+        onFinished() { // 倒计时结束
+            this.countDownStatus = true
+            this.$refs.countdown.reset()
+        },
+        checkPhone(phoneNumber) {
+            let result = true
+            if(!(/^1(3|4|5|6|7|8|9)\d{9}$/.test(phoneNumber))){ 
+                this.$toast('手机号输入有误')
+                result = false
+            }
+            return result
+        }
+    }
+}
+</script>
+<style lang='less' scoped>
+@import url("../../assets/commonLess/variable.less");
+
+.login {
+    min-height: 100vh;
+    background: linear-gradient(to bottom, #15938B, #6dbeba);
+}
+.container {
+    padding: 0 .48rem;
+}
+.logo {
+    padding-top: 1rem;
+    padding-bottom: .9rem;
+    width: 1.6rem;
+    margin: 0 auto;
+    img {
+        width: inherit;
+    }
+}
+.input-group {
+    position: relative;
+    height: .44rem;
+    border-radius: .5rem;
+    border: .02rem solid @whiteColor;
+    margin-bottom: .2rem;
+    padding-left: .3rem;
+    padding-right: .3rem;
+    display: flex;
+    align-items: center;
+    .input {
+        flex: 1;
+        font-size: .14rem;
+        color: @whiteColor;
+        
+        background: transparent;
+        border: none;
+        &::placeholder {
+            color: @whiteColor;
+        }
+    }
+    .code-text {
+        position: absolute;
+        right: 0;
+        flex: 1;
+        display: block;
+        width: .94rem;
+        text-align: center;
+        border-left: .02rem solid @whiteColor;
+        font-size: .14rem;
+        color: @whiteColor;
+        line-height: .3rem;
+        height: .3rem;
+    }
+}
+/deep/.van-count-down {
+    font-size: .14rem;
+    color: @whiteColor;
+    line-height: .3rem;
+    height: .3rem;
+}
+/deep/.van-button--large {
+    height: .44rem;
+    line-height: .42rem;
+    color: @mColor;
+    border: 0;
+}
+/deep/.van-button:active::before {
+    opacity: 0.05;
+}
+/deep/.van-button--disabled {
+    opacity: 1;
+    color: rgba(0, 0, 0, 0.25);
+}
+.login-change {
+    padding-top: .08rem;
+    font-size: .14rem;
+    color: @whiteColor;
+    float: right;
+}
+</style>

部分文件因文件數量過多而無法顯示