瀏覽代碼

Merge branch 'master' into tmp_meeting_needs

lex-xin 3 年之前
父節點
當前提交
fa5ac238bf
共有 76 個文件被更改,包括 710 次插入275 次删除
  1. 0 0
      dist/app.19baf2bbb0e859c0f1d1.js
  2. 0 0
      dist/app.e946acf860b0f158fd50.js
  3. 0 0
      dist/css/HelpCenter.e140748e.css
  4. 0 0
      dist/css/UserProtocol.ed7e4971.css
  5. 0 0
      dist/css/VIPApply.47d9cd96.css
  6. 0 0
      dist/css/VIPApply~applyActive.ec9482b5.css
  7. 0 0
      dist/css/addVisit.8daffbf5.css
  8. 1 1
      dist/css/app.3f251e63.css
  9. 0 0
      dist/css/chunk-vendors.34456e44.css
  10. 0 0
      dist/css/trainDetail.2af1ef6b.css
  11. 0 0
      dist/css/trainDetail.a21a9333.css
  12. 0 0
      dist/css/trainStatistics.75584179.css
  13. 0 0
      dist/css/trainStatistics.f259b4fa.css
  14. 0 0
      dist/index.html
  15. 0 0
      dist/js/Account.86438565.js
  16. 0 0
      dist/js/Account~AppLogin~AppRegister~AppSetInfo~AppealDetail~AppealRecord~AppealResult~Approval~ArrangeWork~~d3ab455b.25d8511b.js
  17. 0 0
      dist/js/Account~AppLogin~AppRegister~AppSetInfo~ClassDetail~CourseApply~CourseDetail~ExchangeRecord~HelpCent~99ca2482.0c4b379b.js
  18. 0 0
      dist/js/AppSetInfo.d84d870c.js
  19. 0 0
      dist/js/AppealDetail.48169017.js
  20. 0 0
      dist/js/AppealRecord.b66a494f.js
  21. 0 0
      dist/js/AppealResult.80541896.js
  22. 0 0
      dist/js/Approval.c18623c9.js
  23. 0 0
      dist/js/ArrangeWork.dff40f19.js
  24. 0 0
      dist/js/Attendance.4517cd5c.js
  25. 0 0
      dist/js/CallNames.bb6bfee7.js
  26. 0 0
      dist/js/ClassDetail.6d0f3564.js
  27. 0 0
      dist/js/CourseApply.a63e9c99.js
  28. 0 0
      dist/js/CourseDetail.b6e0c126.js
  29. 0 0
      dist/js/CourseEvaluation.9986a646.js
  30. 0 0
      dist/js/ExchangeRecord.c481545a.js
  31. 0 0
      dist/js/HelpCenter.0c077db0.js
  32. 0 0
      dist/js/HelpCenter.36c9c27d.js
  33. 0 0
      dist/js/IStarted.0c8bb73b.js
  34. 0 0
      dist/js/Leave.1affcdcd.js
  35. 0 0
      dist/js/ManageEvaluation.6b6fc5bf.js
  36. 0 0
      dist/js/MonthAppeal.0a47d2cc.js
  37. 0 0
      dist/js/PaymentResult.e39a00ac.js
  38. 0 0
      dist/js/PeriodAdjust.09d48378.js
  39. 0 0
      dist/js/PeriodAdjust~PeriodChange.15c0a4a0.js
  40. 0 0
      dist/js/PeriodChange.ff638705.js
  41. 0 0
      dist/js/PeriodExchange.a4e9e297.js
  42. 0 0
      dist/js/PeriodRecord.2fe91e32.js
  43. 0 0
      dist/js/Remuneration.53defb15.js
  44. 0 0
      dist/js/TeachingSchool.846c62f1.js
  45. 0 0
      dist/js/TeachingSet.b4baaf4a.js
  46. 0 0
      dist/js/UserProtocol.44d7747e.js
  47. 0 0
      dist/js/UserProtocol.a37231f2.js
  48. 0 0
      dist/js/VIPApply.8c9f9a3c.js
  49. 0 0
      dist/js/VIPApply.ba3035de.js
  50. 0 0
      dist/js/VIPApply~applyActive.eba03621.js
  51. 0 0
      dist/js/addVisit.221d5d81.js
  52. 0 0
      dist/js/addVisit.6e4628f0.js
  53. 0 0
      dist/js/chunk-vendors.5bf9f9dd.js
  54. 0 0
      dist/js/order.31123ced.js
  55. 0 0
      dist/js/privacy.b10e6964.js
  56. 0 0
      dist/js/special.13255512.js
  57. 0 0
      dist/js/specialDetail.fb1ae923.js
  58. 0 0
      dist/js/trainDetail.158578ec.js
  59. 0 0
      dist/js/trainDetail.41823e8c.js
  60. 0 0
      dist/js/trainStatistics.26a1905f.js
  61. 0 0
      dist/js/trainStatistics.948c2039.js
  62. 0 0
      dist/js/visitList.943ef9a8.js
  63. 4 4
      src/assets/commonLess/common.less
  64. 50 0
      src/common/common.js
  65. 6 1
      src/components/MSearch.vue
  66. 20 1
      src/components/Search.vue
  67. 2 2
      src/main.js
  68. 10 0
      src/router/appRouter.js
  69. 158 92
      src/views/app/HelpCenter.vue
  70. 80 0
      src/views/app/HelpCenterDetail.vue
  71. 0 4
      src/views/applyActive/components/vipCourse.vue
  72. 0 4
      src/views/teacher/VIP00Apply.vue
  73. 63 149
      src/views/trainStatistics/index.vue
  74. 21 14
      src/views/trainStatistics/trainDetail.vue
  75. 288 0
      src/views/trainStatistics/trainModel.vue
  76. 7 3
      src/views/visitManager/addVisit.vue

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


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


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


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


文件差異過大導致無法顯示
+ 0 - 0
dist/css/VIPApply.47d9cd96.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/VIPApply~applyActive.ec9482b5.css


文件差異過大導致無法顯示
+ 0 - 0
dist/css/addVisit.8daffbf5.css


+ 1 - 1
dist/css/app.5ff3dea6.css → dist/css/app.3f251e63.css

@@ -1 +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:#01c1b5!important}.defaultStatus{color:#777!important}.van-field__control{color:grey!important;font-size:.14rem}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:silver!important;font-size:.16rem}input:-moz-placeholder,input::-moz-placeholder,textarea:-moz-placeholder,textarea::-moz-placeholder{color:silver!important;font-size:.16rem}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:silver!important;font-size:.16rem}.van-cell__right-icon{color:silver!important}/deep/ .van-radio__icon .van-icon{border-color:transparent;border:1px solid #d3d3d3}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#f3f4f8;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#app,body{-webkit-text-size-adjust:none!important}
+.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:#01c1b5!important}.defaultStatus{color:#777!important}.van-field__control{color:grey!important;font-size:.14rem}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:silver!important;font-size:.14rem}input:-moz-placeholder,input::-moz-placeholder,textarea:-moz-placeholder,textarea::-moz-placeholder{color:silver!important;font-size:.14rem}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:silver!important;font-size:.14rem}.van-cell__right-icon{color:silver!important}/deep/ .van-radio__icon .van-icon{border-color:transparent;border:1px solid #d3d3d3}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#f3f4f8;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#app,body{-webkit-text-size-adjust:none!important}

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


文件差異過大導致無法顯示
+ 0 - 0
dist/css/trainDetail.2af1ef6b.css


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


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


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


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


+ 0 - 0
dist/js/Account.23072756.js → dist/js/Account.86438565.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Account~AppLogin~AppRegister~AppSetInfo~AppealDetail~AppealRecord~AppealResult~Approval~ArrangeWork~~d3ab455b.25d8511b.js


+ 0 - 0
dist/js/Account~AppLogin~AppRegister~AppSetInfo~ClassDetail~CourseApply~CourseDetail~ExchangeRecord~HelpCent~99ca2482.7d027cf0.js → dist/js/Account~AppLogin~AppRegister~AppSetInfo~ClassDetail~CourseApply~CourseDetail~ExchangeRecord~HelpCent~99ca2482.0c4b379b.js


+ 0 - 0
dist/js/AppSetInfo.281389a0.js → dist/js/AppSetInfo.d84d870c.js


+ 0 - 0
dist/js/AppealDetail.a389e558.js → dist/js/AppealDetail.48169017.js


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


+ 0 - 0
dist/js/AppealResult.1b0bb49a.js → dist/js/AppealResult.80541896.js


+ 0 - 0
dist/js/Approval.ed369026.js → dist/js/Approval.c18623c9.js


+ 0 - 0
dist/js/ArrangeWork.31163c6c.js → dist/js/ArrangeWork.dff40f19.js


+ 0 - 0
dist/js/Attendance.05b0f15f.js → dist/js/Attendance.4517cd5c.js


+ 0 - 0
dist/js/CallNames.2428a806.js → dist/js/CallNames.bb6bfee7.js


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


+ 0 - 0
dist/js/CourseApply.0a0937a1.js → dist/js/CourseApply.a63e9c99.js


+ 0 - 0
dist/js/CourseDetail.f4cbd896.js → dist/js/CourseDetail.b6e0c126.js


+ 0 - 0
dist/js/CourseEvaluation.93968944.js → dist/js/CourseEvaluation.9986a646.js


+ 0 - 0
dist/js/ExchangeRecord.b0d08c6d.js → dist/js/ExchangeRecord.c481545a.js


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


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


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


+ 0 - 0
dist/js/Leave.b5ea8b77.js → dist/js/Leave.1affcdcd.js


+ 0 - 0
dist/js/ManageEvaluation.c150c441.js → dist/js/ManageEvaluation.6b6fc5bf.js


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


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


+ 0 - 0
dist/js/PeriodAdjust.cfd2b156.js → dist/js/PeriodAdjust.09d48378.js


+ 0 - 0
dist/js/PeriodAdjust~PeriodChange.1fe84295.js → dist/js/PeriodAdjust~PeriodChange.15c0a4a0.js


+ 0 - 0
dist/js/PeriodChange.00315415.js → dist/js/PeriodChange.ff638705.js


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


+ 0 - 0
dist/js/PeriodRecord.f04f81f1.js → dist/js/PeriodRecord.2fe91e32.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/Remuneration.53defb15.js


+ 0 - 0
dist/js/TeachingSchool.589b87be.js → dist/js/TeachingSchool.846c62f1.js


+ 0 - 0
dist/js/TeachingSet.1a633c5c.js → dist/js/TeachingSet.b4baaf4a.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/UserProtocol.44d7747e.js


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


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


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


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


文件差異過大導致無法顯示
+ 0 - 0
dist/js/addVisit.221d5d81.js


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


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


+ 0 - 0
dist/js/order.b33832ad.js → dist/js/order.31123ced.js


+ 0 - 0
dist/js/privacy.7dbd8b2d.js → dist/js/privacy.b10e6964.js


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


+ 0 - 0
dist/js/specialDetail.7880463d.js → dist/js/specialDetail.fb1ae923.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/trainDetail.158578ec.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/trainDetail.41823e8c.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/trainStatistics.26a1905f.js


文件差異過大導致無法顯示
+ 0 - 0
dist/js/trainStatistics.948c2039.js


+ 0 - 0
dist/js/visitList.565b0ef9.js → dist/js/visitList.943ef9a8.js


+ 4 - 4
src/assets/commonLess/common.less

@@ -60,25 +60,25 @@
 input::-webkit-input-placeholder,
 input::-webkit-input-placeholder,
 textarea::-webkit-input-placeholder {
 textarea::-webkit-input-placeholder {
   color: #C0C0C0 !important;
   color: #C0C0C0 !important;
-  font-size: .16rem;
+  font-size: .14rem;
 }
 }
 
 
 input:-moz-placeholder,
 input:-moz-placeholder,
 textarea:-moz-placeholder {
 textarea:-moz-placeholder {
   color: #C0C0C0 !important;
   color: #C0C0C0 !important;
-  font-size: .16rem;
+  font-size: .14rem;
 }
 }
 
 
 input::-moz-placeholder,
 input::-moz-placeholder,
 textarea::-moz-placeholder {
 textarea::-moz-placeholder {
   color: #C0C0C0 !important;
   color: #C0C0C0 !important;
-  font-size: .16rem;
+  font-size: .14rem;
 }
 }
 
 
 input:-ms-input-placeholder,
 input:-ms-input-placeholder,
 textarea:-ms-input-placeholder {
 textarea:-ms-input-placeholder {
   color: #C0C0C0 !important;
   color: #C0C0C0 !important;
-  font-size: .16rem;
+  font-size: .14rem;
 }
 }
 
 
 .van-cell__right-icon {
 .van-cell__right-icon {

+ 50 - 0
src/common/common.js

@@ -3,6 +3,56 @@ export const getRandomKey = () => {
 	return key
 	return key
 }
 }
 
 
+export function getNowDateAndMonday(time) {
+  let timestamp = new Date(time.replace(/-/g, "/")).getTime();
+  let serverDate = new Date(time);
+  if (serverDate.getDay() == 0) {
+      timestamp -= 7 * 24 * 60 * 60 * 1000;
+  }
+  let mondayTime = timestamp - (serverDate.getDay() - 1) * 24 * 60 * 60 * 1000;
+
+  let mondayData = new Date(mondayTime);
+  //年
+  let mondayY = mondayData.getFullYear();
+  //月
+  let mondayM =
+      mondayData.getMonth() + 1 < 10
+      ? "0" + (mondayData.getMonth() + 1)
+      : mondayData.getMonth() + 1;
+  //日
+  let mondayD =
+      mondayData.getDate() < 10
+      ? "0" + mondayData.getDate()
+      : mondayData.getDate();
+
+  let str = mondayY + "-" + mondayM + "-" + mondayD;
+  return str;
+}
+export function getNowDateAndSunday(time) {
+  let timestamp = new Date(time.replace(/-/g, "/")).getTime();
+  let serverDate = new Date(time);
+
+  let num = 7 - serverDate.getDay();
+  if (num == 7) {
+      num = 0;
+  }
+  let sundayTiem = timestamp + num * 24 * 60 * 60 * 1000;
+  let SundayData = new Date(sundayTiem);
+  //年
+  let tomorrowY = SundayData.getFullYear(); //月
+  let tomorrowM =
+      SundayData.getMonth() + 1 < 10
+      ? "0" + (SundayData.getMonth() + 1)
+      : SundayData.getMonth() + 1;
+  //日
+  let tomorrowD =
+      SundayData.getDate() < 10
+      ? "0" + SundayData.getDate()
+      : SundayData.getDate();
+  let str = tomorrowY + "-" + tomorrowM + "-" + tomorrowD;
+  return str;
+}
+
 const browser = () => {
 const browser = () => {
   var u = navigator.userAgent
   var u = navigator.userAgent
   //   app = navigator.appVersion;
   //   app = navigator.appVersion;

+ 6 - 1
src/components/MSearch.vue

@@ -10,12 +10,17 @@
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
+
 export default {
 export default {
+    props:['background'],
     data() {
     data() {
         return {
         return {
-        searchValue: ""
+        searchValue: "",
+        color:'#fff'
         };
         };
     },
     },
+    mounted(){
+    },
     methods: {
     methods: {
         onSearch() {
         onSearch() {
             this.$emit("onSearch", this.searchValue);
             this.$emit("onSearch", this.searchValue);

+ 20 - 1
src/components/Search.vue

@@ -37,6 +37,7 @@ export default {
     display: flex;
     display: flex;
     align-items: center;
     align-items: center;
     padding: 0 12px;
     padding: 0 12px;
+
     /deep/.van-search {
     /deep/.van-search {
         flex: 1;
         flex: 1;
         background-color: #fff !important;
         background-color: #fff !important;
@@ -60,7 +61,7 @@ export default {
     /deep/.van-search__action {
     /deep/.van-search__action {
         color: @tFontColor;
         color: @tFontColor;
         background-color: #f5f5f5;
         background-color: #f5f5f5;
-
+        padding: 0 5px;
     }
     }
     /deep/.van-search__content {
     /deep/.van-search__content {
         background-color: #f5f5f5;
         background-color: #f5f5f5;
@@ -77,5 +78,23 @@ export default {
         border-radius: 15px;
         border-radius: 15px;
     }
     }
 }
 }
+input::-webkit-input-placeholder {
+  color: #777 !important;
+  font-size: .14rem;
+}
+
+input:-moz-placeholder {
+  color: #777 !important;
+  font-size: .14rem;
+}
+
+input::-moz-placeholder {
+  color: #777 !important;
+  font-size: .14rem;
+}
 
 
+input:-ms-input-placeholder {
+  color: #777 !important;
+  font-size: .14rem;
+}
 </style>
 </style>

+ 2 - 2
src/main.js

@@ -10,7 +10,7 @@ import { Button, Icon, Tag, Swipe, SwipeItem, Popup, Picker,
     Circle, Field, DatetimePicker, Image, Loading,
     Circle, Field, DatetimePicker, Image, Loading,
     ActionSheet, RadioGroup, Radio, Checkbox, CheckboxGroup,
     ActionSheet, RadioGroup, Radio, Checkbox, CheckboxGroup,
     CountDown, Panel, Dialog, Sticky, Rate, Switch, ImagePreview, NoticeBar, NavBar, Divider,
     CountDown, Panel, Dialog, Sticky, Rate, Switch, ImagePreview, NoticeBar, NavBar, Divider,
-    Grid, GridItem,} from 'vant'
+    Grid, GridItem, Calendar} from 'vant'
 Vue.use(Button).use(Icon).use(Tag).use(Swipe).use(SwipeItem)
 Vue.use(Button).use(Icon).use(Tag).use(Swipe).use(SwipeItem)
    .use(Popup).use(Picker).use(DropdownMenu).use(DropdownItem).use(Search)
    .use(Popup).use(Picker).use(DropdownMenu).use(DropdownItem).use(Search)
    .use(PullRefresh).use(Toast).use(List).use(Collapse).use(CollapseItem)
    .use(PullRefresh).use(Toast).use(List).use(Collapse).use(CollapseItem)
@@ -18,7 +18,7 @@ Vue.use(Button).use(Icon).use(Tag).use(Swipe).use(SwipeItem)
    .use(Circle).use(Field).use(DatetimePicker).use(Image).use(Loading)
    .use(Circle).use(Field).use(DatetimePicker).use(Image).use(Loading)
    .use(ActionSheet).use(RadioGroup).use(Radio).use(Checkbox).use(CheckboxGroup)
    .use(ActionSheet).use(RadioGroup).use(Radio).use(Checkbox).use(CheckboxGroup)
    .use(CountDown).use(Panel).use(Dialog).use(Sticky).use(Rate).use(Switch).use(ImagePreview).use(NoticeBar)
    .use(CountDown).use(Panel).use(Dialog).use(Sticky).use(Rate).use(Switch).use(ImagePreview).use(NoticeBar)
-   .use(NavBar).use(Divider).use(Grid).use(GridItem)
+   .use(NavBar).use(Divider).use(Grid).use(GridItem).use(Calendar)
 
 
 Vue.config.productionTip = false
 Vue.config.productionTip = false
 
 

+ 10 - 0
src/router/appRouter.js

@@ -111,5 +111,15 @@ let teacherRouter = [{
     descrition: "用户协议",
     descrition: "用户协议",
     weight: 2 // 页面权重
     weight: 2 // 页面权重
   }
   }
+},
+{
+  path: "/HelpCenterDetail",
+  name: 'HelpCenterDetail',
+  component: () =>
+    import( /* webpackChunkName:'UserProtocol'*/ "@/views/app/HelpCenterDetail.vue"),
+  meta: {
+    descrition: "帮助详情",
+    weight: 2 // 页面权重
+  }
 }];
 }];
 export default teacherRouter;
 export default teacherRouter;

+ 158 - 92
src/views/app/HelpCenter.vue

@@ -1,110 +1,176 @@
 <template>
 <template>
-    <div class="help">
-        <m-header v-if="headerStatus" />
-        <van-collapse v-if="dataStatus" v-model="activeNames" accordion>
-            <van-collapse-item v-for="(item, index) in dataList" :key="index" title-class="van-ellipsis" :title="item.title" :name="index"><div v-html="item.content"></div></van-collapse-item>
-        </van-collapse>
-        <m-empty class="empty" v-else key="data" />
+  <div class="help">
+    <m-header v-if="headerStatus" />
+    <m-search
+      @onSearch="onSearch"
+      placeholder="搜索"
+      background="#F3F0F8"
+      class="search"
+    />
+    <!-- <van-collapse  v-model="activeNames" accordion>
+      <van-collapse-item
+        v-for="(item, index) in dataList"
+        :key="index"
+        title-class="van-ellipsis"
+        :title="item.title"
+        :name="index"
+        ><div class="quillWrap" v-html="item.content"></div
+      ></van-collapse-item>
+    </van-collapse> -->
+    <div v-if="dataStatus">
+      <van-cell
+        v-for="(item, index) in dataList"
+        :key="index"
+        :title="item.title"
+        is-link
+        @click="gotoDetali(item)"
+      />
     </div>
     </div>
+    <m-empty class="empty" v-else key="data" />
+    <van-image-preview
+      v-model="show"
+      :images="images"
+      :showIndex="false"
+    ></van-image-preview>
+  </div>
 </template>
 </template>
 <script>
 <script>
 /* eslint-disable */
 /* eslint-disable */
-import MHeader from '@/components/MHeader'
-import MEmpty from '@/components/MEmpty'
-import { browser, calcMinute }  from '@/common/common'
-import { helpCenterCatalogList, helpCenterContentList } from '@/api/app'
+import MHeader from "@/components/MHeader";
+import MEmpty from "@/components/MEmpty";
+import { browser, calcMinute } from "@/common/common";
+import { helpCenterCatalogList, helpCenterContentList } from "@/api/app";
+import MSearch from "@/components/MSearch";
 export default {
 export default {
-    name: 'courseApply',
-    components: { MHeader, MEmpty },
-    data() {
-        return {
-            headerStatus: true,
-            activeNames: [0],
-            dataStatus: true,
-            dataList: []
-        }
-    },
-    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
-        }
+  name: "courseApply",
+  components: { MHeader, MEmpty, MSearch },
+  data() {
+    return {
+      headerStatus: true,
+      activeNames: [0],
+      dataStatus: true,
+      dataList: [],
+      show: false,
+      images: [],
+      params: { title: null },
+    };
+  },
+  mounted() {
+    let params = this.$route.query;
+    if (params.Authorization) {
+      localStorage.setItem("Authorization", decodeURI(params.Authorization));
+      localStorage.setItem("userInfo", decodeURI(params.Authorization));
+    }
 
 
-        this.__init()
-    },
-    methods: {
-        async __init() {
-            let loadingStatus = true
-            this.$toast.loading({
-                duration: 0,
-                message: '加载中...',
-                forbidClick: true,
-                loadingType: 'spinner'
-            })
-            let catalogResult = []
-            await helpCenterCatalogList().then(res => {
-                let result = res.data
-                if(result.code == 200) {
-                    catalogResult = result.data
-                } else {
-                    this.$toast(result.msg)
-                    loadingStatus = false
-                }
-            })
-            if(catalogResult.length > 0) {
-                await helpCenterContentList({
-                    catalogIds: catalogResult[0].id,
-                    page: 1,
-                    rows: 100
-                }).then(res => {
-                    let result = res.data
-                    loadingStatus = false
-                    if(result.code == 200) {
-                        this.dataList = result.data.rows ? result.data.rows : []
-                        if(this.dataList.length > 0) {
-                            this.dataStatus = true
-                        } else {
-                            this.dataStatus = false
-                        }
-                    } else {
-                        this.$toast(result.msg)
-                    }
-                })
+    document.title = "帮助中心";
+    if (browser().android || browser().iPhone) {
+      this.headerStatus = false;
+    }
+
+    this.__init();
+    window.showImg = (e) => {
+      if (e.src) {
+        this.images = [e.src];
+        this.show = true;
+      }
+    };
+    // document.querySelectorAll(".quillWrap").addEventListerner('click',this.showImg)
+  },
+  methods: {
+    async __init() {
+      let loadingStatus = true;
+      this.$toast.loading({
+        duration: 0,
+        message: "加载中...",
+        forbidClick: true,
+        loadingType: "spinner",
+      });
+      let catalogResult = [];
+      await helpCenterCatalogList().then((res) => {
+        let result = res.data;
+        if (result.code == 200) {
+          catalogResult = result.data;
+        } else {
+          this.$toast(result.msg);
+          loadingStatus = false;
+        }
+      });
+      if (catalogResult.length > 0) {
+        await helpCenterContentList({
+          catalogIds: catalogResult[0].id,
+          title: this.params.title,
+          page: 1,
+          rows: 100,
+        }).then((res) => {
+          let result = res.data;
+          loadingStatus = false;
+          if (result.code == 200) {
+            this.dataList = result.data.rows ? result.data.rows : [];
+            this.dataList = this.dataList.map((item) => {
+              item.content = item.content.replace(
+                /<img/gi,
+                '<img onClick="showImg(this)" style="width: 100% !important;"'
+              );
+              return item;
+            });
+            if (this.dataList.length > 0) {
+              this.dataStatus = true;
             } else {
             } else {
-                loadingStatus = false
-            }
-            
-            if(!loadingStatus) {
-                this.$toast.clear()
+              this.dataStatus = false;
             }
             }
-        }
+          } else {
+            this.$toast(result.msg);
+          }
+        });
+      } else {
+        loadingStatus = false;
+      }
+
+      if (!loadingStatus) {
+        this.$toast.clear();
+      }
     },
     },
-    destroyed() {
-        this.$toast.clear()
-    }
-}
+    onSearch(val) {
+      this.params.title = val;
+      this.params.page = 1;
+      this.dataList = [];
+      this.dataShow = true;
+      this.loading = true;
+      this.finished = false;
+      this.__init();
+    },
+    gotoDetali(item) {
+        this.$router.push({path:'/HelpCenterDetail', query:{item:JSON.stringify(item)} })
+    },
+  },
+  destroyed() {
+    this.$toast.clear();
+  },
+};
 </script>
 </script>
 <style lang='less' scoped>
 <style lang='less' scoped>
 @import url("../../assets/commonLess/variable.less");
 @import url("../../assets/commonLess/variable.less");
 .help {
 .help {
-    min-height: 100vh;
+  min-height: 100vh;
 }
 }
 /deep/.van-collapse {
 /deep/.van-collapse {
-    margin: .15rem 0;
-    /deep/.van-cell {
-        color: #1A1A1A;
-        font-size: .17rem;
-        padding: .15rem .16rem;
-    }
-    /deep/.van-collapse-item__content {
-        font-size: .14rem;
-        color: #808080;
-    }
+  margin: 0.15rem 0;
+  /deep/.van-cell {
+    color: #1a1a1a;
+    font-size: 0.17rem;
+    padding: 0.15rem 0.16rem;
+  }
+  /deep/.van-collapse-item__content {
+    font-size: 0.14rem;
+    color: #808080;
+  }
+}
+/deep/.quillWrap {
+  img {
+    width: 100%;
+  }
+}
+.search {
+  border-top: 1px solid #f7f8fa;
 }
 }
 </style>
 </style>

+ 80 - 0
src/views/app/HelpCenterDetail.vue

@@ -0,0 +1,80 @@
+<template>
+  <div class="KeepRepaireDetail">
+    <m-header background="white" v-if="headerStatus"> </m-header>
+    <h4 v-if="item && item.title">{{ item.title }}</h4>
+    <div class="concat" v-if="item && item.content" v-html="item.content"></div>
+    <van-image-preview
+      v-model="show"
+      :images="images"
+      :showIndex="false"
+    ></van-image-preview>
+  </div>
+</template>
+<script>
+import MHeader from "@/components/MHeader";
+import { browser } from "@/common/common";
+export default {
+  components: { MHeader },
+  data() {
+    return {
+      headerStatus: true,
+      item: null,
+      backUrl: {
+        callBack: () => {
+          if (browser().android) {
+            // eslint-disable-next-line
+            DAYA.postMessage(JSON.stringify({ api: "back" }));
+          } else if (browser().iPhone) {
+            window.webkit.messageHandlers.DAYA.postMessage(
+              JSON.stringify({ api: "back" })
+            );
+          }
+        },
+      },
+      images: [],
+      show: false,
+    };
+  },
+
+  mounted() {
+    document.title = "帮助中心";
+    if (browser().android || browser().iPhone) {
+      this.headerStatus = true;
+    }
+    let params = this.$route.query;
+    if (params.Authorization) {
+      localStorage.setItem("Authorization", decodeURI(params.Authorization));
+      localStorage.setItem("userInfo", decodeURI(params.Authorization));
+    }
+    this.item = JSON.parse(this.$route.query.item);
+    console.log(this.item);
+    window.showImg = (e) => {
+      if (e.src) {
+        this.images = [e.src];
+        this.show = true;
+      }
+    };
+  },
+};
+</script>
+<style lang="less">
+.KeepRepaireDetail {
+  background-color: #fff;
+  padding: 0.1rem;
+  h4 {
+    font-size: 0.18rem;
+    margin-bottom: 0.1rem;
+    font-weight: 500;
+  }
+  .concat {
+    font-size: 0.14rem;
+    color: #808080;
+    p {
+      margin-bottom: 0.1rem;
+    }
+    img {
+      vertical-align: middle;
+    }
+  }
+}
+</style>

+ 0 - 4
src/views/applyActive/components/vipCourse.vue

@@ -1454,8 +1454,6 @@ export default {
           }
           }
           return false;
           return false;
         }
         }
-      } else {
-        return false;
       }
       }
 
 
       if (statusList.hasOffline) {
       if (statusList.hasOffline) {
@@ -1475,8 +1473,6 @@ export default {
           }
           }
           return false;
           return false;
         }
         }
-      } else {
-        return false;
       }
       }
       return true;
       return true;
     },
     },

+ 0 - 4
src/views/teacher/VIP00Apply.vue

@@ -1781,8 +1781,6 @@ export default {
           }
           }
           return false;
           return false;
         }
         }
-      } else {
-        return false;
       }
       }
 
 
       if (statusList.hasOffline) {
       if (statusList.hasOffline) {
@@ -1802,8 +1800,6 @@ export default {
           }
           }
           return false;
           return false;
         }
         }
-      } else {
-        return false;
       }
       }
       return true;
       return true;
     },
     },

+ 63 - 149
src/views/trainStatistics/index.vue

@@ -2,20 +2,14 @@
     <div class="visitList">
     <div class="visitList">
         <van-sticky>
         <van-sticky>
             <m-header v-if="headerStatus" :isFixed="false" />
             <m-header v-if="headerStatus" :isFixed="false" />
-            <search @onSearch="search" placeholder="学生姓名或手机号">
-                <template #left>
-                    <van-dropdown-menu style="padding-right: .1rem" :close-on-click-outside="false" active-color="#01C1B5">
-                        <van-dropdown-item title="训练时间" ref="item" class="visitTime">
-                            <van-cell title="开始时间" is-link @click="onChangeDate('showStart')" :value="formatStartTime"></van-cell>
-                            <van-cell title="结束时间" is-link @click="onChangeDate('showEnd')" :value="formatEndTime"></van-cell>
-                            <div class="btnWrap">
-                                <div class="cancelBtn" @click="cancelBtn">重置</div>
-                                <div class="okBtn" @click="okBtn">确定</div>
-                            </div>
-                        </van-dropdown-item>
-                    </van-dropdown-menu>
-                </template>
-            </search>
+            <van-tabs v-model="active" @change="tabChange" title-active-color="#000000" title-inactive-color="#808080" color="#01C1B5" class="van-hairline--bottom">
+                <van-tab title="全部学员" name="all">
+                    <train-model ref="trainModel1" @onLoad="onLoad" :active="active" :defaultTime="0" />
+                </van-tab>
+                <van-tab title="待回访学员" name="visited">
+                    <train-model ref="trainModel2" @onLoad="onLoad" :active="active" :defaultTime="-1" />
+                </van-tab>
+            </van-tabs>
         </van-sticky>
         </van-sticky>
 
 
         <van-list
         <van-list
@@ -24,10 +18,9 @@
             :finished="finished"
             :finished="finished"
             finished-text="- 没有更多了 -"
             finished-text="- 没有更多了 -"
             :immediate-check="false"
             :immediate-check="false"
-            style="padding-top: .12rem;"
             @load="getList"
             @load="getList"
         >
         >
-            <van-cell-group class="data-content" v-for="(item, index) in list" :key="index" @click="onHref(item)">
+            <van-cell-group class="data-content" :border="false" v-for="(item, index) in list" :key="index" @click="onHref(item)">
                 <van-cell style="padding: 16px 12px;" :center="true">
                 <van-cell style="padding: 16px 12px;" :center="true">
                     <template #title>
                     <template #title>
                         <div class="teacher_info">
                         <div class="teacher_info">
@@ -36,7 +29,7 @@
                             <p style="color: #1a1a1a; font-size: .14rem;">{{ item.username }}</p>
                             <p style="color: #1a1a1a; font-size: .14rem;">{{ item.username }}</p>
                         </div>
                         </div>
                     </template>
                     </template>
-                    <p style="font-size: 14px; color: #808080;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">{{ item.musicGroupName }}</p>
+                    <p style="font-size: 14px; color: #333;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">{{ item.musicGroupName }}</p>
                 </van-cell>
                 </van-cell>
                 <van-cell is-link :clickable="false" center style="padding: 12px 12px 16px">
                 <van-cell is-link :clickable="false" center style="padding: 12px 12px 16px">
                     <template #title>
                     <template #title>
@@ -45,13 +38,13 @@
                                 <template #icon>{{ item.totalPlayTime }}分钟</template>
                                 <template #icon>{{ item.totalPlayTime }}分钟</template>
                             </van-grid-item>
                             </van-grid-item>
                             <van-grid-item text="训练次数">
                             <van-grid-item text="训练次数">
-                                <template #icon><span style="color: #01C1B5">{{ item.trainDay }}次</span></template>
+                                <template #icon><span style="color: #01C1B5">{{ item.trainNum }}次</span></template>
                             </van-grid-item>
                             </van-grid-item>
                             <van-grid-item text="训练天数">
                             <van-grid-item text="训练天数">
-                                <template #icon><span style="color: #01C1B5">{{ item.trainDay }}天</span></template>
+                                <template #icon><span style="color: #FF802C">{{ item.trainDay }}天</span></template>
                             </van-grid-item>
                             </van-grid-item>
                             <van-grid-item text="评测次数">
                             <van-grid-item text="评测次数">
-                                <template #icon><span style="color: #FF802C">{{ item.recordNum }}次</span></template>
+                                <template #icon><span style="color: #F79C00">{{ item.recordNum }}次</span></template>
                             </van-grid-item>
                             </van-grid-item>
                         </van-grid>
                         </van-grid>
                     </template>
                     </template>
@@ -60,55 +53,34 @@
         </van-list>
         </van-list>
         <m-empty v-else msg="暂无训练统计" />
         <m-empty v-else msg="暂无训练统计" />
 
 
-        <van-popup v-model="dataForm.status" position="bottom" :style="{ height: '40%' }">
-            <van-datetime-picker
-                v-model="dataForm.currentDate"
-                :min-date="dataForm.minDate"
-                :max-date="dataForm.maxDate"
-                :formatter="formatter"
-                @cancel="dataForm.status = false"
-                type="date"
-                @confirm="chioseDate"
-            />
-        </van-popup>
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
 import MHeader from "@/components/MHeader";
 import MHeader from "@/components/MHeader";
 import MEmpty from '@/components/MEmpty';
 import MEmpty from '@/components/MEmpty';
-import Search from '@/components/Search';
 import dayjs from "dayjs";
 import dayjs from "dayjs";
 import { browser } from "@/common/common";
 import { browser } from "@/common/common";
 import { countStudentTrain } from './api.js'
 import { countStudentTrain } from './api.js'
+import trainModel from './trainModel.vue'
 export default {
 export default {
-    components: { MHeader, MEmpty, Search },
+    components: { MHeader, MEmpty, trainModel },
     data() {
     data() {
+        const activeType = sessionStorage.getItem('trainTab')
+        sessionStorage.removeItem('trainTab')
         return {
         return {
             headerStatus: true,
             headerStatus: true,
-            dataForm: {
-                // 时间下拉框
-                type: null,
-                status: false,
-                minDate: new Date(2000, 0, 1),
-                maxDate: new Date(2025, 10, 1),
-                currentDate: new Date(),
-            },
-            purposeStatus: true,
-            startDate: null,
-            endDate: null,
-            showStart: false,
-            showEnd: false,
-            formatEndTime: null,
-            formatStartTime: null,
+            active: activeType || 'all',
             list: [],
             list: [],
             loading: false,
             loading: false,
             finished: false,
             finished: false,
             params: {
             params: {
-                search: null,
                 page: 1,
                 page: 1,
                 rows: 20,
                 rows: 20,
             },
             },
             dataShow: true,
             dataShow: true,
+            // 类型为回访学员时
+            formatEndTime: null,
+            formatStartTime: null,
         };
         };
     },
     },
     mounted() {
     mounted() {
@@ -121,9 +93,27 @@ export default {
             this.headerStatus = false;
             this.headerStatus = false;
         }
         }
         document.title = '训练统计'
         document.title = '训练统计'
-        this.getList()
+
+        // this.getList()
     },
     },
     methods: {
     methods: {
+        onLoad(value) {
+            this.params = Object.assign(this.params, value)
+            this.onResetList()
+        },
+        tabChange() {
+            if(this.$refs.trainModel1) {
+                this.$refs.trainModel1.changeDropDownItemStatus()
+            }
+            if(this.$refs.trainModel2) {
+                this.$refs.trainModel2.changeDropDownItemStatus()
+            }
+            if(this.active == 'visited' && this.$refs.trainModel2) {
+                this.$refs.trainModel2.onAllFilter()
+            } else if(this.active == 'all' && this.$refs.trainModel1) {
+                this.$refs.trainModel1.onAllFilter()
+            }
+        },
         search(val) {
         search(val) {
             this.params.search = val
             this.params.search = val
             this.onResetList()
             this.onResetList()
@@ -137,6 +127,7 @@ export default {
             this.getList()
             this.getList()
         },
         },
         onHref(item) {
         onHref(item) {
+            sessionStorage.setItem('trainTab', this.active)
             this.$router.push({
             this.$router.push({
                 path: '/trainDetail',
                 path: '/trainDetail',
                 query: {
                 query: {
@@ -144,64 +135,16 @@ export default {
                     username: item.username,
                     username: item.username,
                     phone: item.phone,
                     phone: item.phone,
                     musicGroupName: item.musicGroupName,
                     musicGroupName: item.musicGroupName,
-                    avatar: item.avatar
+                    avatar: item.avatar,
+                    visitFlag: item.visitFlag
                 }
                 }
             })
             })
         },
         },
-        cancelBtn() {
-            this.formatStartTime = null;
-            this.formatEndTime = null;
-            this.onResetList()
-            this.$refs.item.toggle();
-        },
-        okBtn() {
-            // if(this.formatStartTime && this.formatEndTime) {
-            //     }
-            this.onResetList()
-            this.$refs.item.toggle();
-        },
-        onChangeDate(type) {
-            let dataForm = this.dataForm
-            if(type == 'showEnd') {
-                if(this.formatStartTime) {
-                dataForm.minDate = new Date(dayjs(this.formatStartTime))
-                }
-                setTimeout(() => {
-                    dataForm.currentDate = this.formatEndTime ? new Date(dayjs(this.formatEndTime)) : new Date()
-                }, 500)
-            } else if(type == 'showStart') {
-                dataForm.minDate = new Date(2000, 0, 1)
-                setTimeout(() => {
-                    dataForm.currentDate = this.formatStartTime ? new Date(dayjs(this.formatStartTime)) : new Date()
-                }, 500)
-            }
-            dataForm.status = true
-            dataForm.type = type
-        },
-        chioseDate(value) {
-            let dataForm = this.dataForm
-            if(dataForm.type == 'showStart') {
-                this.formatStartTime = dayjs(value).format('YYYY-MM-DD')
-                if(this.formatEndTime && dayjs(value).unix() > dayjs(this.formatEndTime).unix()) {
-                this.formatEndTime = null
-                }
-            } else if(dataForm.type == 'showEnd') {
-                this.formatEndTime = dayjs(value).format('YYYY-MM-DD')
-            }
-            dataForm.status = false
-        },
-        // onTypeChange() {
-        //   this.onResetList()
-        // },
-        onPurposeChange() {
-            this.onResetList()
-        },
         async getList() {
         async getList() {
             let params = this.params;
             let params = this.params;
-            params.startTime = this.formatStartTime || null
-            params.endTime = this.formatEndTime || null
+            let visitFlag = this.active != 'all' ? 1 : null
             try {
             try {
-                let res = await countStudentTrain(params)
+                let res = await countStudentTrain({...params, visitFlag})
                 let result = res.data;
                 let result = res.data;
                 this.loading = false;
                 this.loading = false;
                 params.page = result.pageNo;
                 params.page = result.pageNo;
@@ -219,17 +162,7 @@ export default {
                 this.finished = true;
                 this.finished = true;
                 this.dataShow = false;
                 this.dataShow = false;
             }
             }
-        },
-        formatter(type, val) {
-        if (type === "year") {
-            return `${val}年`;
-        } else if (type === "month") {
-            return `${val}月`;
-        } else if (type == "day") {
-            return `${val}日`;
         }
         }
-        return val;
-        },
     },
     },
 };
 };
 </script>
 </script>
@@ -238,17 +171,25 @@ export default {
 
 
 .visitList {
 .visitList {
     min-height: 100vh;
     min-height: 100vh;
-    .visitTime {
-        .van-cell__right-icon{
-        // line-height: .36rem;
-        }
-    }
+    // .visitTime {
+    //     .van-cell__right-icon{
+    //     // line-height: .36rem;
+    //     }
+    // }
     /deep/.van-dropdown-menu__bar {
     /deep/.van-dropdown-menu__bar {
         box-shadow: none;
         box-shadow: none;
     }
     }
 }
 }
+
+/deep/.van-tab {
+    font-size: .16rem;
+}
+/deep/.search .van-search {
+    margin: 10px 0 ;
+}
+
 .data-content {
 .data-content {
-    margin: .15rem .15rem 0;
+    margin: .1rem .15rem 0;
     border-radius: .1rem;
     border-radius: .1rem;
     overflow: hidden;
     overflow: hidden;
     .logo {
     .logo {
@@ -272,10 +213,12 @@ export default {
     }
     }
     /deep/.van-grid-item__icon-wrapper {
     /deep/.van-grid-item__icon-wrapper {
         font-size: .15rem;
         font-size: .15rem;
+        font-weight: 500;
         color: #000;
         color: #000;
     }
     }
     /deep/.van-grid-item__text {
     /deep/.van-grid-item__text {
-        font-size: .14rem;
+        padding-top: .03rem;
+        font-size: .12rem;
         color: #808080;
         color: #808080;
     }
     }
     .teacher_info {
     .teacher_info {
@@ -289,25 +232,6 @@ export default {
         }
         }
     }
     }
 }
 }
-// .cellGroup {
-//   display: flex;
-//   align-items: center;
-//   line-height: .61rem;
-//   .logo {
-//     width: 0.35rem;
-//     height: 0.35rem;
-//     // margin-right: 0.12rem;
-//     border-radius: 100%;
-//   }
-//   .type {
-//       line-height: 1.2;
-//   }
-// }
-// /deep/.van-cell__title {
-//   font-size: 0.14rem;
-//   color: @mFontColor;
-//   flex: 1 auto;
-// }
 .btnWrap {
 .btnWrap {
   display: flex;
   display: flex;
   flex-direction: row;
   flex-direction: row;
@@ -328,15 +252,5 @@ export default {
     text-align: center;
     text-align: center;
   }
   }
 }
 }
-// .van-cell{
-//     color: #1A1A1A;
-//     line-height: .36rem!important;
-//     font-size: .16rem;
-// }
-// /deep/.van-col--9 {
-//     display: flex;
-// }
-// /deep/.van-col--5 {
-//     text-align: center;
-// }
+
 </style>
 </style>

+ 21 - 14
src/views/trainStatistics/trainDetail.vue

@@ -20,7 +20,7 @@
         </van-cell>
         </van-cell>
     </div>
     </div>
 
 
-    <van-row class="dataSearch" type="flex">
+    <van-row class="dataSearch" type="flex" v-if="!visitFlag">
         <van-col span="9" offset="1">
         <van-col span="9" offset="1">
             <van-cell @click="onChangeDate('showStart')" is-link>
             <van-cell @click="onChangeDate('showStart')" is-link>
                 <template #right-icon>
                 <template #right-icon>
@@ -55,14 +55,14 @@
             @confirm="chioseDate"
             @confirm="chioseDate"
         />
         />
     </van-popup>
     </van-popup>
-    <div class="specialList">
+    <div class="specialList" :class="{'bottomHeight': visitFlag}">
         <van-list v-model="loading"  v-if="show" key="trainDetail"
         <van-list v-model="loading"  v-if="show" key="trainDetail"
             :finished="finished"
             :finished="finished"
             finished-text="- 没有更多内容 -"
             finished-text="- 没有更多内容 -"
             :immediate-check="false"
             :immediate-check="false"
             @load="getList()">
             @load="getList()">
-            <van-cell-group class="data-content" v-for="(item, index) in dataList" :key="index" @click="showDetail(item)">
-                <van-cell style="padding: 16px 12px; 12px" :center="true">
+            <van-cell-group class="data-content" :border="false" v-for="(item, index) in dataList" :key="index" @click="showDetail(item)">
+                <van-cell style="padding: 16px 12px; 12px" :center="true" title-style="flex-basis: 45%;">
                     <template #title>
                     <template #title>
                         <span style="font-size: .17rem; color:#333333; font-weight: 500; padding-right: .05rem;padding-bottom: .05rem;">{{ item.sysMusicScoreName }}</span>
                         <span style="font-size: .17rem; color:#333333; font-weight: 500; padding-right: .05rem;padding-bottom: .05rem;">{{ item.sysMusicScoreName }}</span>
                         <p style="font-size: 14px; color: #808080;">{{ item.createTime }}</p>
                         <p style="font-size: 14px; color: #808080;">{{ item.createTime }}</p>
@@ -83,10 +83,10 @@
                                 <template #icon><span style="color: #01C1B5">{{ item.intonation }}分</span></template>
                                 <template #icon><span style="color: #01C1B5">{{ item.intonation }}分</span></template>
                             </van-grid-item>
                             </van-grid-item>
                             <van-grid-item text="节奏" class="van-hairline--right">
                             <van-grid-item text="节奏" class="van-hairline--right">
-                                <template #icon><span style="color: #01C1B5">{{ item.cadence }}分</span></template>
+                                <template #icon><span style="color: #FF802C">{{ item.cadence }}分</span></template>
                             </van-grid-item>
                             </van-grid-item>
                             <van-grid-item text="完成度">
                             <van-grid-item text="完成度">
-                                <template #icon><span style="color: #FF802C">{{ item.integrity }}分</span></template>
+                                <template #icon><span style="color: #F79C00">{{ item.integrity }}分</span></template>
                             </van-grid-item>
                             </van-grid-item>
                         </van-grid>
                         </van-grid>
                     </template>
                     </template>
@@ -95,7 +95,8 @@
         </van-list>
         </van-list>
         <m-empty v-else key="trainDetail" msg="暂无训练详情" />
         <m-empty v-else key="trainDetail" msg="暂无训练详情" />
 
 
-        <div class="button-group">
+        <!-- 是否需要回访 -->
+        <div class="button-group" v-if="visitFlag">
             <van-button type="primary" size="large" round @click="addVisited">添加回访</van-button>
             <van-button type="primary" size="large" round @click="addVisited">添加回访</van-button>
             <div class="placeholder-btn"></div>
             <div class="placeholder-btn"></div>
         </div>
         </div>
@@ -120,6 +121,7 @@ export default {
             avatar: query.avatar,
             avatar: query.avatar,
             username: query.username,
             username: query.username,
             musicGroupName: query.musicGroupName,
             musicGroupName: query.musicGroupName,
+            visitFlag: Number(query.visitFlag) || 0,
             searchList: {
             searchList: {
                 startTime: null,
                 startTime: null,
                 endTime: null,
                 endTime: null,
@@ -161,7 +163,7 @@ export default {
         showDetail(item) {
         showDetail(item) {
             if(item.notesDataIndex > 0){
             if(item.notesDataIndex > 0){
                 postMessage({
                 postMessage({
-                    api: "openAccompanyWebView",
+                    api: "openWebView",
                     content: {
                     content: {
                         url: location.origin + `/accompany/#/report/${item.id}`,
                         url: location.origin + `/accompany/#/report/${item.id}`,
                         orientation: 0,
                         orientation: 0,
@@ -308,10 +310,12 @@ export default {
     }
     }
     /deep/.van-grid-item__icon-wrapper {
     /deep/.van-grid-item__icon-wrapper {
         font-size: .15rem;
         font-size: .15rem;
+        font-weight: 500;
         color: #000;
         color: #000;
     }
     }
     /deep/.van-grid-item__text {
     /deep/.van-grid-item__text {
-        font-size: .14rem;
+        padding-top: .03rem;
+        font-size: .12rem;
         color: #808080;
         color: #808080;
     }
     }
     .teacher_info {
     .teacher_info {
@@ -327,18 +331,21 @@ export default {
 }
 }
 .specialList {
 .specialList {
     padding-top: .1rem;
     padding-top: .1rem;
-    padding-bottom: 65px;
     // padding-bottom: calc(env(safe-area-inset-bottom) / 2);
     // padding-bottom: calc(env(safe-area-inset-bottom) / 2);
+    &.bottomHeight {
+        padding-bottom: 65px;
+    }
 }
 }
 .dataSearch {
 .dataSearch {
-    padding: .12rem;
+    padding: .12rem .12rem .05rem;
     background-color: #F5F5F5;
     background-color: #F5F5F5;
     /deep/.van-cell {
     /deep/.van-cell {
         background: #fff;
         background: #fff;
-        padding: .05rem .16rem;
+        padding: .0rem .16rem;
         border-radius: 1rem;
         border-radius: 1rem;
         overflow: hidden;
         overflow: hidden;
-        height: .34rem;
+        height: .27rem;
+        line-height: .27rem;
     }
     }
     /deep/.van-cell__value--alone {
     /deep/.van-cell__value--alone {
         text-align: center;
         text-align: center;
@@ -352,7 +359,7 @@ export default {
         background: #01C1B5;
         background: #01C1B5;
         font-size: 14px;
         font-size: 14px;
         color: #fff;
         color: #fff;
-        padding: 4px 9px;
+        padding: 3px 9px;
         border-radius: 15px;
         border-radius: 15px;
     }
     }
 }
 }

+ 288 - 0
src/views/trainStatistics/trainModel.vue

@@ -0,0 +1,288 @@
+<template>
+    <div class="trainModel">
+        <div class="visit-tips" v-show="activeType == 'visited'">
+            <span>上周训练时长不足80分钟或训练次数小于4次的学员<br />
+            需在每周三24:00前完成回访</span>
+        </div>
+        <search @onSearch="onSearch" placeholder="学生姓名或手机号">
+            <template #left>
+                <van-dropdown-menu style="padding-right: .1rem" :close-on-click-outside="false" active-color="#01C1B5">
+                    <van-dropdown-item title="筛选" ref="item" class="visitTime">
+                        <van-cell title="日期" is-link @click="showCalendar = true" title-style="font-size: .14rem;" :value="calendarValue" value-class="calendarColor"></van-cell>
+                    </van-dropdown-item>
+                </van-dropdown-menu>
+            </template>
+        </search>
+        <van-row class="searchArray">
+            <van-col span="6" class="title-style" @click="onSort(0)">
+                训练时长
+                <div>
+                    <i class="box box-up" :class="{'active': searchArray[0] == 'ASC'}" style="margin-bottom: .03rem;"></i>
+                    <i class="box box-down" :class="{'active': searchArray[0] == 'DESC'}"></i>
+                </div>
+            </van-col>
+            <van-col span="6" class="title-style" @click="onSort(1)">
+                训练次数
+                <div>
+                    <i class="box box-up" :class="{'active': searchArray[1] == 'ASC'}" style="margin-bottom: .03rem;"></i>
+                    <i class="box box-down" :class="{'active': searchArray[1] == 'DESC'}"></i>
+                </div>
+            </van-col>
+            <van-col span="6" class="title-style" @click="onSort(2)">
+                训练天数
+                <div>
+                    <i class="box box-up" :class="{'active': searchArray[2] == 'ASC'}" style="margin-bottom: .03rem;"></i>
+                    <i class="box box-down" :class="{'active': searchArray[2] == 'DESC'}"></i>
+                </div>
+            </van-col>
+            <van-col span="6" class="title-style" @click="onSort(3)">
+                评测次数
+                <div>
+                    <i class="box box-up" :class="{'active': searchArray[3] == 'ASC'}" style="margin-bottom: .03rem;"></i>
+                    <i class="box box-down" :class="{'active': searchArray[3] == 'DESC'}"></i>
+                </div>
+            </van-col>
+        </van-row>
+        <van-calendar
+            v-model="showCalendar"
+            :minDate="minDate"
+            :default-date="defaultDate"
+            :first-day-of-week="1"
+            :formatter="formatterDay"
+            color="#01C1B5"
+            type="range"
+            get-container="body"
+            @select="selectDate"
+            @confirm="onConfirm"
+            @close="onClose"
+        />
+    </div>
+</template>
+
+<script>
+import Search from '@/components/Search';
+import dayjs from "dayjs";
+import { getNowDateAndMonday, getNowDateAndSunday } from '@/common/common'
+export default {
+    props: {
+        active: {
+            type: String,
+            default: 'all'
+        },
+        defaultTime: {
+            type: Number,
+            default: 0
+        }
+    },
+    components: { Search },
+    data() {
+        return {
+            showCalendar: false,
+            minDate: new Date(2000, 0, 1),
+            defaultDate:[],
+            // 类型为全部时
+            startDay: null,
+            endDay: null,
+            search: null,
+            searchArray: [null, null, null, null],
+            searchType: {
+                // ASC DESC
+                totalPlayTime: null,
+                trainNum: null,
+                trainDay: null,
+                recordNum: null,
+            },
+
+        }
+    },
+    async mounted() {
+        let defaultTime = this.defaultTime
+        let day = defaultTime * 7
+        let startTime = new Date(), endTime = new Date()
+        if(day > 0) {
+            startTime = getNowDateAndMonday(dayjs().add(day, 'day').format("YYYY-MM-DD"))
+            endTime = getNowDateAndSunday(dayjs().add(day, 'day').format("YYYY-MM-DD"))
+        } else {
+            startTime = getNowDateAndMonday(dayjs().subtract(Math.abs(day), 'day').format("YYYY-MM-DD"))
+            endTime = getNowDateAndSunday(dayjs().subtract(Math.abs(day), 'day').format("YYYY-MM-DD"))
+        }
+        this.defaultDate = [new Date(startTime), new Date(endTime)]
+        this.startDay = startTime
+        this.endDay = endTime
+
+        this.onSort()
+    },
+    computed: {
+        calendarValue() {
+            return `${dayjs(this.startDay).format("YYYY/MM/DD")} - ${dayjs(this.endDay).format("YYYY/MM/DD")}`;
+        },
+        activeType() {
+            return this.active
+        }
+    },
+    methods: {
+        onSort(type) {
+            let searchArray = this.searchArray
+            searchArray.forEach((item, index) => {
+                if(index != type) {
+                    searchArray[index] = null
+                }
+            });
+            if(searchArray[type] == 'ASC') {
+                searchArray[type] = 'DESC'
+            } else if(searchArray[type] == 'DESC') {
+                searchArray[type] = null
+            } else {
+                searchArray[type] = 'ASC'
+            }
+            this.$forceUpdate()
+            // console.log(searchArray)
+            this.onAllFilter()
+        },
+        onSearch(val) {
+            this.search = val
+            this.onAllFilter()
+        },
+        onAllFilter() {
+            const searchArray = this.searchArray
+            let currentIndex = null
+            let currentType = null
+            searchArray.forEach((item, index) => {
+                if(item) {
+                    currentIndex = index
+                    currentType = item
+                }
+            })
+            const searchType = ['totalPlayTime', 'trainNum', 'trainDay', 'recordNum']
+            let params = {
+                search: this.search,
+                startTime: this.startDay,
+                endTime: this.endDay,
+                page: 1,
+                sort: searchType[currentIndex],
+                order: currentType
+            }
+            this.$listeners.onLoad(params)
+        },
+        changeDropDownItemStatus() {
+            this.$refs.item.toggle(false)
+        },
+        selectDate(date) {
+            let [start, end] = date;
+            if (start) {
+                const num = dayjs(start).get("day");
+                if (num === 0) {
+                    start = dayjs(start).subtract(6, "day");
+                } else {
+                    start = dayjs(start).subtract(num - 1, "day");
+                }
+            }
+            if (start) {
+                const num = 7 - dayjs(start).get("day");
+                if (num < 7) {
+                    end = dayjs(start).add(num, "day");
+                }
+            }
+            this.defaultDate = [new Date(start.valueOf()),new Date(end.valueOf())]
+        },
+        onConfirm(date) {
+            let [start, end] = date;
+            this.showCalendar = false;
+            if (start) {
+                const num = dayjs(start).get("day");
+                if (num === 0) {
+                start = dayjs(start).subtract(6, "day");
+                } else {
+                start = dayjs(start).subtract(num - 1, "day");
+                }
+            }
+            if (end) {
+                const num = 7 - dayjs(end).get("day");
+                if (num < 7) {
+                end = dayjs(end).add(num, "day");
+                }
+            }
+            this.startDay = dayjs(start).format("YYYY-MM-DD");
+            this.endDay = dayjs(end).format("YYYY-MM-DD");
+            //
+            this.changeDropDownItemStatus()
+            this.onAllFilter()
+        },
+        onClose() {
+            // 关闭弹窗时初始化默认日期
+            this.defaultDate = [new Date(this.startDay), new Date(this.endDay)]
+        },
+        formatterDay(day) {
+            const month = day.date.getMonth() + 1;
+            const date = day.date.getDate();
+            let nowDate = new Date()
+            if(month == nowDate.getMonth() + 1 && date == nowDate.getDate()){
+                day.text = '今天'
+            }
+            return day
+        }
+    }
+}
+</script>
+
+<style lang="less" scoped>
+/deep/.van-dropdown-menu__title::after {
+    border-color: transparent transparent #01C1B5 #01C1B5;
+}
+.calendarColor {
+    color: #333;
+    font-size: .14rem;
+}
+.visit-tips {
+    background-color: #fff;
+    // padding: 10px 10px 0;
+    padding: 10px 12px 0;
+    text-align: center;
+    span {
+        display: block;
+        padding: 6px 12px;
+        background-color: #FFF6DE;
+        font-size: 12px;
+        color: #FF802C;
+        text-align: left;
+    }
+}
+.searchArray {
+    font-size: .14rem;
+    padding-top: .15rem;
+    padding-bottom: .12rem;
+    color: #1A1A1A;
+    background-color: #f5f5f5;
+}
+.title-style {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+.box {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    margin-left: .02rem;
+}
+.box-up {
+    width: 0;
+    height: 0;
+    border-left: 4px solid transparent;
+    border-right: 4px solid transparent;
+    border-bottom: 5px solid #ccc;
+    &.active {
+        border-bottom-color: #01C1B5;
+    }
+}
+.box-down {
+    width: 0;
+    height: 0;
+    border-left: 4px solid transparent;
+    border-right: 4px solid transparent;
+    border-top: 5px solid #ccc;
+    &.active {
+        border-top-color: #01C1B5;
+    }
+}
+</style>

+ 7 - 3
src/views/visitManager/addVisit.vue

@@ -217,6 +217,7 @@ export default {
       userId: query.userId, // 如果有userId的时候说明是从评测详情进来的
       userId: query.userId, // 如果有userId的时候说明是从评测详情进来的
       studentId: query.studentId, // 这个参数是从原生传过来的,单独做了处理
       studentId: query.studentId, // 这个参数是从原生传过来的,单独做了处理
       inside: query.inside || 0,
       inside: query.inside || 0,
+      visitFlag: Number(query.visitFlag) || 0,
       dataForm: {
       dataForm: {
         // 时间下拉框
         // 时间下拉框
         status: false,
         status: false,
@@ -358,11 +359,13 @@ export default {
           if(this.inside) {
           if(this.inside) {
             this.onAppBack()
             this.onAppBack()
           } else if(this.userId) {
           } else if(this.userId) {
-            const query = this.$route.query
+            let { visitFlag ,...query } = this.$route.query
+            visitFlag = 0
             this.$router.replace({
             this.$router.replace({
               path: '/trainDetail',
               path: '/trainDetail',
               query: {
               query: {
-                ...query
+                ...query,
+                visitFlag
               }
               }
             });
             });
           } else {
           } else {
@@ -444,7 +447,8 @@ export default {
       this.dataForm.status = false;
       this.dataForm.status = false;
     },
     },
     onEnListShow() {
     onEnListShow() {
-      if (this.id) {
+      // 从云教练统计来的,不许改时间,默认当前时间
+      if (this.id || this.visitFlag) {
         return;
         return;
       }
       }
       this.dataForm.status = true;
       this.dataForm.status = true;

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