index.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import { defineComponent, onMounted, reactive } from 'vue';
  2. import styles from './index.module.less';
  3. import MSticky from '@/components/m-sticky';
  4. import MHeader from '@/components/m-header';
  5. import { Cell, CellGroup, Grid, GridItem, List } from 'vant';
  6. import MFullRefresh from '@/components/m-full-refresh';
  7. import v3 from './images/v3.png';
  8. import icon_student from '@common/images/icon-student-default.png';
  9. import request from '@/helpers/request';
  10. import TrainModel from './train-model';
  11. import MEmpty from '@/components/m-empty';
  12. import { useRouter } from 'vue-router';
  13. import SkeletionIndexModal from './skeletion-index.modal';
  14. export default defineComponent({
  15. name: 'train-statistics',
  16. setup() {
  17. const trainParams = sessionStorage.getItem('trainParams');
  18. sessionStorage.removeItem('trainParams');
  19. let params = null;
  20. if (trainParams) {
  21. const tempResult = JSON.parse(trainParams);
  22. params = {
  23. ...tempResult,
  24. page: 1,
  25. rows: 20
  26. };
  27. }
  28. const router = useRouter();
  29. const forms = reactive({
  30. isClick: false,
  31. listState: {
  32. dataShow: true, // 判断是否有数据
  33. loading: true,
  34. finished: false,
  35. refreshing: false
  36. },
  37. params: params
  38. ? params
  39. : {
  40. page: 1,
  41. rows: 20
  42. },
  43. list: []
  44. });
  45. const getList = async () => {
  46. try {
  47. if (forms.isClick) return;
  48. forms.isClick = true;
  49. const { data } = await request.get(
  50. '/api-web/schoolCloudStudy/countStudentTrain',
  51. {
  52. params: {
  53. ...forms.params
  54. }
  55. }
  56. );
  57. const result = data || {};
  58. // 判断是否有数据
  59. if (forms.listState.refreshing) {
  60. forms.list = result.rows || [];
  61. } else {
  62. forms.list = forms.list.concat(result.rows || []);
  63. }
  64. forms.listState.finished = result.pageNo >= result.totalPage;
  65. forms.params.page = result.pageNo + 1;
  66. } catch {
  67. forms.listState.finished = true;
  68. } finally {
  69. setTimeout(() => {
  70. forms.listState.dataShow = forms.list.length > 0;
  71. forms.listState.refreshing = false;
  72. forms.listState.loading = false;
  73. forms.isClick = false;
  74. }, 500);
  75. }
  76. };
  77. const onRefresh = () => {
  78. forms.params.page = 1;
  79. getList();
  80. };
  81. const onLoad = (value: any) => {
  82. forms.params = Object.assign(forms.params, value);
  83. onResetList();
  84. };
  85. const onHref = (item: any) => {
  86. sessionStorage.setItem('trainParams', JSON.stringify(forms.params));
  87. router.push({
  88. path: '/train-detail',
  89. query: {
  90. userId: item.userId,
  91. username: item.username,
  92. phone: item.phone,
  93. musicGroupName: item.musicGroupName,
  94. avatar: item.avatar,
  95. visitFlag: item.visitFlag
  96. }
  97. });
  98. };
  99. const onResetList = () => {
  100. forms.list = [];
  101. forms.params.page = 1;
  102. forms.listState.dataShow = true;
  103. forms.listState.loading = true;
  104. forms.listState.finished = false;
  105. forms.listState.refreshing = true;
  106. onRefresh();
  107. };
  108. onMounted(() => {
  109. // getList()
  110. });
  111. return () => (
  112. <div class={styles.visitList}>
  113. <MSticky position="top">
  114. <MHeader />
  115. <TrainModel onLoad={onLoad} selectValues={forms.params} />
  116. </MSticky>
  117. <SkeletionIndexModal v-model:show={forms.listState.loading}>
  118. <MFullRefresh
  119. v-model:modelValue={forms.listState.refreshing}
  120. onRefresh={() => onRefresh()}
  121. style={{
  122. minHeight: `calc(100vh - var(--header-height))`
  123. }}>
  124. <List
  125. finished={forms.listState.finished}
  126. finishedText=" "
  127. style={{ overflow: 'hidden', marginBottom: '18px' }}
  128. onLoad={getList}
  129. immediateCheck={false}>
  130. {forms.listState.dataShow ? (
  131. forms.list.map((item: any) => (
  132. <CellGroup
  133. class={styles['data-content']}
  134. border={false}
  135. onClick={() => onHref(item)}>
  136. <Cell center>
  137. {{
  138. title: () => (
  139. <div class={styles.teacher_info}>
  140. {item.memberFlag && (
  141. <img src={v3} class={styles.memberLogo} />
  142. )}
  143. <img
  144. class={styles.logo}
  145. src={item.avatar || icon_student}
  146. alt=""
  147. />
  148. <p class={styles.userName}>{item.username}</p>
  149. </div>
  150. ),
  151. default: () => (
  152. <p class={styles.orchestraName}>
  153. {item.musicGroupName}
  154. </p>
  155. )
  156. }}
  157. </Cell>
  158. <Cell isLink clickable={false} center>
  159. {{
  160. title: () => (
  161. <Grid border={false} columnNum={4} clickable>
  162. <GridItem text="训练次数">
  163. {{
  164. icon: () => (
  165. <span>{item.totalPlayTime}分钟</span>
  166. )
  167. }}
  168. </GridItem>
  169. <GridItem text="训练时长">
  170. {{
  171. icon: () => (
  172. <span style="color: #01c1b5">
  173. {item.trainNum}次
  174. </span>
  175. )
  176. }}
  177. </GridItem>
  178. <GridItem text="训练天数">
  179. {{
  180. icon: () => (
  181. <span style="color: #ff802c">
  182. {item.trainDay}天
  183. </span>
  184. )
  185. }}
  186. </GridItem>
  187. <GridItem text="评测次数">
  188. {{
  189. icon: () => (
  190. <span style="color: #f79c00">
  191. {item.recordNum}次
  192. </span>
  193. )
  194. }}
  195. </GridItem>
  196. </Grid>
  197. )
  198. }}
  199. </Cell>
  200. </CellGroup>
  201. ))
  202. ) : (
  203. <MEmpty
  204. style={{
  205. minHeight: `calc(100vh - var(--header-height))`
  206. }}
  207. description="暂无数据"
  208. />
  209. )}
  210. </List>
  211. </MFullRefresh>
  212. </SkeletionIndexModal>
  213. </div>
  214. );
  215. }
  216. });