index.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { Cell, CellGroup, Grid, GridItem, Image, List, Tag } from 'vant'
  2. import { defineComponent, onMounted, reactive } from 'vue'
  3. import styles from './index.module.less'
  4. import iconTeacher from '@common/images/icon_teacher.png'
  5. import iconMessage from '@common/images/icon-muit-message.png'
  6. import { postMessage } from '@/helpers/native-message'
  7. import request from '@/helpers/request'
  8. import { state } from '@/state'
  9. import { openDefaultWebView } from '../../../state'
  10. export default defineComponent({
  11. name: 'my-orchestra',
  12. props: {
  13. orchestraId: {
  14. type: String,
  15. default: ''
  16. }
  17. },
  18. setup(props) {
  19. console.log('🚀 ~ props', props)
  20. const onMessage = async (item: any) => {
  21. console.log(item)
  22. postMessage({
  23. api: 'joinChatGroup',
  24. content: {
  25. type: 'multi', // single 单人 multi 多人
  26. id: item.imGroupId
  27. }
  28. })
  29. }
  30. const openClassDetail = (item: any) => {
  31. openDefaultWebView(`/classDetail?classId=${item.id}`)
  32. }
  33. const data = reactive({
  34. pages: {
  35. page: 1,
  36. rows: 20
  37. },
  38. classList: [] as any[],
  39. loading: false,
  40. finished: false
  41. })
  42. const modelData = reactive({
  43. orchestra: {} as any,
  44. orchestraStatus: false
  45. })
  46. const getClassList = async () => {
  47. data.loading = true
  48. try {
  49. const res: any = await request.post(`${state.platformApi}/classGroup/page`, {
  50. data: {
  51. ...data.pages,
  52. orchestraId: props.orchestraId
  53. }
  54. })
  55. console.log(data)
  56. data.pages.page += 1
  57. if (Array.isArray(res?.data?.rows)) {
  58. const list = res.data.rows.map((n: any) => {
  59. return {
  60. ...n,
  61. courseNum: Number(n.courseScheduleNum) - Number(n.completeCourseScheduleNum)
  62. }
  63. })
  64. data.classList = ([] as any[]).concat(data.classList, list)
  65. data.finished = res.data.rows.length == 0 ? true : false
  66. }
  67. } catch {}
  68. data.loading = false
  69. }
  70. onMounted(() => {
  71. getClassList()
  72. })
  73. return () => (
  74. <div class={styles.myClass}>
  75. <List
  76. v-model:loading={data.loading}
  77. finishedText="没有更多数据"
  78. finished={data.finished}
  79. onLoad={getClassList}
  80. immediateCheck={false}
  81. >
  82. {Array.isArray(data.classList) &&
  83. data.classList.map((item: any) => (
  84. <div class={styles.itemDiv} onClick={() => openClassDetail(item)}>
  85. <Cell center label={item.orchestraName}>
  86. {{
  87. icon: () => (
  88. <Image
  89. src={item.teacherAvatar || iconTeacher}
  90. class={styles.iconImg}
  91. fit="cover"
  92. />
  93. ),
  94. title: () => (
  95. <div class={styles.content}>
  96. <div class={['van-ellipsis', styles.teacherName]}>{item.teacherName}</div>
  97. <div class={styles.tag}>
  98. {item.name}
  99. </div>
  100. </div>
  101. ),
  102. value: () => (
  103. <Image
  104. class={styles.messageImg}
  105. src={iconMessage}
  106. onClick={(e: Event) => {
  107. e.stopPropagation()
  108. onMessage(item)
  109. }}
  110. />
  111. )
  112. }}
  113. </Cell>
  114. <Grid border={false} columnNum={3} class={styles.grid}>
  115. <GridItem>
  116. <p class={styles.title}>{item.preStudentNum || 0}</p>
  117. <p class={styles.name}>学生人数</p>
  118. </GridItem>
  119. <GridItem>
  120. <p class={[styles.title]}>{item.courseNum || 0}</p>
  121. <p class={styles.name}>剩余课时</p>
  122. </GridItem>
  123. <GridItem>
  124. <p class={styles.title}>{item.courseScheduleNum || 0}</p>
  125. <p class={styles.name}>总课时</p>
  126. </GridItem>
  127. </Grid>
  128. </div>
  129. ))}
  130. </List>
  131. </div>
  132. )
  133. }
  134. })