practice.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { Cell, Icon, Image, Popup } from 'vant';
  2. import { PropType, defineComponent, onMounted, reactive } from 'vue';
  3. import styles from './component.module.less';
  4. import iconStudent from '@/common/images/icon-student-default.png';
  5. import iconMember from '../images/icon-member.png';
  6. import DetailModal from '../detail-modal';
  7. import request from '@/helpers/request';
  8. import SkeletonComponentModal from './skeleton-component-modal';
  9. export default defineComponent({
  10. name: 'practice-list',
  11. props: {
  12. courseId: {
  13. type: String as PropType<any>,
  14. default: null
  15. }
  16. },
  17. setup(props) {
  18. // schoolStudentHomework/findCourseStudentsPublic/v2
  19. const forms = reactive({
  20. showPopup: false,
  21. list: [] as any[],
  22. dataShow: true,
  23. detail: {} as any,
  24. loading: true
  25. });
  26. const getList = async () => {
  27. try {
  28. const { data } = await request.post(
  29. '/api-web/schoolStudentHomework/findCourseStudentsPublic/v2',
  30. {
  31. data: {
  32. courseScheduleId: props.courseId,
  33. type: 'HOMEWORK'
  34. }
  35. }
  36. );
  37. forms.list = data || [];
  38. } catch {
  39. //
  40. } finally {
  41. forms.dataShow = forms.list.length ? true : false;
  42. forms.loading = false;
  43. }
  44. };
  45. const onDetail = async (item: any) => {
  46. try {
  47. forms.detail = {
  48. avatar: item.avatar,
  49. memberFlag: item.vipFlag,
  50. username: item.userName,
  51. subjectName: item.subjectName,
  52. finishFlag: item.finishFlag,
  53. list: item.studentLessonTrainingDetail || []
  54. };
  55. forms.showPopup = true;
  56. } catch {
  57. //
  58. }
  59. };
  60. onMounted(() => {
  61. getList();
  62. });
  63. return () => (
  64. <div class={styles['practice-list']}>
  65. <SkeletonComponentModal v-model:loading={forms.loading}>
  66. {forms.list.map((item: any) => (
  67. <Cell center isLink onClick={() => onDetail(item)}>
  68. {{
  69. icon: () => (
  70. <div class={styles.iconGroup}>
  71. <Image
  72. src={item.avatar || iconStudent}
  73. class={styles.iconStudent}
  74. fit="contain"
  75. />
  76. <Icon name={iconMember} class={styles.iconMember} />
  77. </div>
  78. ),
  79. title: () => (
  80. <div class={styles.userInfo}>
  81. <p class={styles.name}>{item.userName}</p>
  82. <span>{item.subjectName}</span>
  83. </div>
  84. ),
  85. value: () => (
  86. <div
  87. class={[
  88. styles.after,
  89. item.finishFlag ? styles.success : styles.error
  90. ]}>
  91. {item.finishFlag ? '完成' : '未完成'}
  92. </div>
  93. )
  94. }}
  95. </Cell>
  96. ))}
  97. </SkeletonComponentModal>
  98. <Popup
  99. v-model:show={forms.showPopup}
  100. position="bottom"
  101. round
  102. closeable
  103. class={styles.popup}>
  104. <DetailModal detail={forms.detail} />
  105. </Popup>
  106. </div>
  107. );
  108. }
  109. });