index.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <template>
  2. <div class="visitList">
  3. <van-sticky>
  4. <m-header v-if="headerStatus" :isFixed="false" />
  5. <van-tabs v-model="active" @change="tabChange" title-active-color="#000000" title-inactive-color="#808080" color="#01C1B5" class="van-hairline--bottom">
  6. <van-tab title="全部学员" name="all">
  7. <train-model ref="trainModel1" @onLoad="onLoad" :active="active" :defaultTime="0" />
  8. </van-tab>
  9. <van-tab title="待回访学员" name="visited">
  10. <train-model ref="trainModel2" @onLoad="onLoad" :active="active" :defaultTime="-1" />
  11. </van-tab>
  12. </van-tabs>
  13. </van-sticky>
  14. <van-list
  15. v-model="loading"
  16. v-if="dataShow"
  17. :finished="finished"
  18. finished-text="- 没有更多了 -"
  19. :immediate-check="false"
  20. @load="getList"
  21. >
  22. <van-cell-group class="data-content" :border="false" v-for="(item, index) in list" :key="index" @click="onHref(item)">
  23. <van-cell style="padding: 16px 12px;" :center="true">
  24. <template #title>
  25. <div class="teacher_info">
  26. <img class="logo" v-if="item.avatar" :src="item.avatar" alt="" />
  27. <img class="logo" v-else src="../../assets/images/icon_student.png" alt="" />
  28. <p style="color: #1a1a1a; font-size: .14rem;">{{ item.username }}</p>
  29. </div>
  30. </template>
  31. <p style="font-size: 14px; color: #333;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">{{ item.musicGroupName }}</p>
  32. </van-cell>
  33. <van-cell is-link :clickable="false" center style="padding: 12px 12px 16px">
  34. <template #title>
  35. <van-grid :border="false" column-num="4" :clickable="true">
  36. <van-grid-item text="训练时长">
  37. <template #icon>{{ item.totalPlayTime }}分钟</template>
  38. </van-grid-item>
  39. <van-grid-item text="训练次数">
  40. <template #icon><span style="color: #01C1B5">{{ item.trainNum }}次</span></template>
  41. </van-grid-item>
  42. <van-grid-item text="训练天数">
  43. <template #icon><span style="color: #FF802C">{{ item.trainDay }}天</span></template>
  44. </van-grid-item>
  45. <van-grid-item text="评测次数">
  46. <template #icon><span style="color: #F79C00">{{ item.recordNum }}次</span></template>
  47. </van-grid-item>
  48. </van-grid>
  49. </template>
  50. </van-cell>
  51. </van-cell-group>
  52. </van-list>
  53. <m-empty v-else msg="暂无训练统计" />
  54. </div>
  55. </template>
  56. <script>
  57. import MHeader from "@/components/MHeader";
  58. import MEmpty from '@/components/MEmpty';
  59. import dayjs from "dayjs";
  60. import { browser } from "@/common/common";
  61. import { countStudentTrain } from './api.js'
  62. import trainModel from './trainModel.vue'
  63. export default {
  64. components: { MHeader, MEmpty, trainModel },
  65. data() {
  66. const activeType = sessionStorage.getItem('trainTab')
  67. sessionStorage.removeItem('trainTab')
  68. return {
  69. headerStatus: true,
  70. active: activeType || 'all',
  71. list: [],
  72. loading: false,
  73. finished: false,
  74. params: {
  75. page: 1,
  76. rows: 20,
  77. },
  78. dataShow: true,
  79. // 类型为回访学员时
  80. formatEndTime: null,
  81. formatStartTime: null,
  82. };
  83. },
  84. mounted() {
  85. let params = this.$route.query;
  86. if (params.Authorization) {
  87. localStorage.setItem("Authorization", decodeURI(params.Authorization));
  88. localStorage.setItem("userInfo", decodeURI(params.Authorization));
  89. }
  90. if (browser().android || browser().iPhone) {
  91. this.headerStatus = false;
  92. }
  93. document.title = '训练统计'
  94. // this.getList()
  95. },
  96. methods: {
  97. onLoad(value) {
  98. this.params = Object.assign(this.params, value)
  99. this.onResetList()
  100. },
  101. tabChange() {
  102. if(this.$refs.trainModel1) {
  103. this.$refs.trainModel1.changeDropDownItemStatus()
  104. }
  105. if(this.$refs.trainModel2) {
  106. this.$refs.trainModel2.changeDropDownItemStatus()
  107. }
  108. if(this.active == 'visited' && this.$refs.trainModel2) {
  109. this.$refs.trainModel2.onAllFilter()
  110. } else if(this.active == 'all' && this.$refs.trainModel1) {
  111. this.$refs.trainModel1.onAllFilter()
  112. }
  113. },
  114. search(val) {
  115. this.params.search = val
  116. this.onResetList()
  117. },
  118. onResetList() {
  119. this.list = [];
  120. this.params.page = 1;
  121. this.dataShow = true;
  122. this.loading = true;
  123. this.finished = false;
  124. this.getList()
  125. },
  126. onHref(item) {
  127. sessionStorage.setItem('trainTab', this.active)
  128. this.$router.push({
  129. path: '/trainDetail',
  130. query: {
  131. userId: item.userId,
  132. username: item.username,
  133. phone: item.phone,
  134. musicGroupName: item.musicGroupName,
  135. avatar: item.avatar,
  136. visitFlag: item.visitFlag
  137. }
  138. })
  139. },
  140. async getList() {
  141. let params = this.params;
  142. let visitFlag = this.active != 'all' ? 1 : null
  143. try {
  144. let res = await countStudentTrain({...params, visitFlag})
  145. let result = res.data;
  146. this.loading = false;
  147. params.page = result.pageNo;
  148. this.list = this.list.concat(result.rows);
  149. if (params.page >= result.totalPage) {
  150. this.finished = true;
  151. }
  152. this.params.page++;
  153. // 判断是否有数据
  154. if (this.list.length <= 0) {
  155. this.dataShow = false;
  156. }
  157. } catch {
  158. //
  159. this.finished = true;
  160. this.dataShow = false;
  161. }
  162. }
  163. },
  164. };
  165. </script>
  166. <style lang="less" scoped>
  167. @import url("../../assets/commonLess/variable.less");
  168. .visitList {
  169. min-height: 100vh;
  170. // .visitTime {
  171. // .van-cell__right-icon{
  172. // // line-height: .36rem;
  173. // }
  174. // }
  175. /deep/.van-dropdown-menu__bar {
  176. box-shadow: none;
  177. }
  178. }
  179. /deep/.van-tab {
  180. font-size: .16rem;
  181. }
  182. /deep/.search .van-search {
  183. margin: 10px 0 ;
  184. }
  185. .data-content {
  186. margin: .1rem .15rem 0;
  187. border-radius: .1rem;
  188. overflow: hidden;
  189. .logo {
  190. width: 0.40rem;
  191. height: 0.4rem;
  192. // margin-right: 0.12rem;
  193. border-radius: 100%;
  194. }
  195. &:first-child {
  196. margin-top: 0;
  197. }
  198. .van-row-item {
  199. display: flex;
  200. align-items: center;
  201. }
  202. /deep/.van-grid-item__content {
  203. padding: .03rem
  204. }
  205. /deep/.van-grid-item__content {
  206. background-color: transparent;
  207. }
  208. /deep/.van-grid-item__icon-wrapper {
  209. font-size: .15rem;
  210. font-weight: 500;
  211. color: #000;
  212. }
  213. /deep/.van-grid-item__text {
  214. padding-top: .03rem;
  215. font-size: .12rem;
  216. color: #808080;
  217. }
  218. .teacher_info {
  219. display: flex;
  220. align-items: center;
  221. img {
  222. margin-right: .1rem;
  223. width: .4rem;
  224. height: .4rem;
  225. border-radius: 50%;
  226. }
  227. }
  228. }
  229. .btnWrap {
  230. display: flex;
  231. flex-direction: row;
  232. .cancelBtn {
  233. height: 48px;
  234. line-height: 48px;
  235. background: #eeeff3;
  236. color: @mColor;
  237. text-align: center;
  238. width: 100%;
  239. }
  240. .okBtn {
  241. width: 100%;
  242. height: 48px;
  243. line-height: 48px;
  244. background: @mColor;
  245. color: #fff;
  246. text-align: center;
  247. }
  248. }
  249. </style>