index.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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. musicGroupName: item.musicGroupName,
  134. avatar: item.avatar,
  135. visitFlag: item.visitFlag
  136. }
  137. })
  138. },
  139. async getList() {
  140. let params = this.params;
  141. let visitFlag = this.active != 'all' ? 1 : null
  142. try {
  143. let res = await countStudentTrain({...params, visitFlag})
  144. let result = res.data;
  145. this.loading = false;
  146. params.page = result.pageNo;
  147. this.list = this.list.concat(result.rows);
  148. if (params.page >= result.totalPage) {
  149. this.finished = true;
  150. }
  151. this.params.page++;
  152. // 判断是否有数据
  153. if (this.list.length <= 0) {
  154. this.dataShow = false;
  155. }
  156. } catch {
  157. //
  158. this.finished = true;
  159. this.dataShow = false;
  160. }
  161. }
  162. },
  163. };
  164. </script>
  165. <style lang="less" scoped>
  166. @import url("../../assets/commonLess/variable.less");
  167. .visitList {
  168. min-height: 100vh;
  169. // .visitTime {
  170. // .van-cell__right-icon{
  171. // // line-height: .36rem;
  172. // }
  173. // }
  174. /deep/.van-dropdown-menu__bar {
  175. box-shadow: none;
  176. }
  177. }
  178. /deep/.van-tab {
  179. font-size: .16rem;
  180. }
  181. /deep/.search .van-search {
  182. margin: 10px 0 ;
  183. }
  184. .data-content {
  185. margin: .1rem .15rem 0;
  186. border-radius: .1rem;
  187. overflow: hidden;
  188. .logo {
  189. width: 0.40rem;
  190. height: 0.4rem;
  191. // margin-right: 0.12rem;
  192. border-radius: 100%;
  193. }
  194. &:first-child {
  195. margin-top: 0;
  196. }
  197. .van-row-item {
  198. display: flex;
  199. align-items: center;
  200. }
  201. /deep/.van-grid-item__content {
  202. padding: .03rem
  203. }
  204. /deep/.van-grid-item__content {
  205. background-color: transparent;
  206. }
  207. /deep/.van-grid-item__icon-wrapper {
  208. font-size: .15rem;
  209. font-weight: 500;
  210. color: #000;
  211. }
  212. /deep/.van-grid-item__text {
  213. padding-top: .03rem;
  214. font-size: .12rem;
  215. color: #808080;
  216. }
  217. .teacher_info {
  218. display: flex;
  219. align-items: center;
  220. img {
  221. margin-right: .1rem;
  222. width: .4rem;
  223. height: .4rem;
  224. border-radius: 50%;
  225. }
  226. }
  227. }
  228. .btnWrap {
  229. display: flex;
  230. flex-direction: row;
  231. .cancelBtn {
  232. height: 48px;
  233. line-height: 48px;
  234. background: #eeeff3;
  235. color: @mColor;
  236. text-align: center;
  237. width: 100%;
  238. }
  239. .okBtn {
  240. width: 100%;
  241. height: 48px;
  242. line-height: 48px;
  243. background: @mColor;
  244. color: #fff;
  245. text-align: center;
  246. }
  247. }
  248. </style>