live.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import ColResult from '@/components/col-result'
  2. import { Cell, CellGroup, List, Image, Icon } from 'vant'
  3. import { defineComponent } from 'vue'
  4. import styles from './live.module.less'
  5. import iconTimer from '@common/images/icon_timer2.png'
  6. import iconTeacher from '@common/images/icon_teacher.png'
  7. import iconSuccess from '@common/images/icon_success.png'
  8. import request from '@/helpers/request'
  9. import dayjs from 'dayjs'
  10. export default defineComponent({
  11. name: 'live',
  12. data() {
  13. return {
  14. list: [],
  15. dataShow: true, // 判断是否有数据
  16. loading: false,
  17. finished: false,
  18. params: {
  19. groupStatus: 'APPLY',
  20. page: 1,
  21. rows: 20
  22. }
  23. }
  24. },
  25. mounted() {
  26. this.getList()
  27. },
  28. methods: {
  29. formatTime(time: string) {
  30. let timeStr = dayjs(time || new Date())
  31. const weekStr = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
  32. // console.log(timeStr.day())
  33. return timeStr.format('YYYY-MM-DD') + `(${weekStr[timeStr.day()]})`
  34. },
  35. async getList() {
  36. try {
  37. let params = this.params
  38. const res = await request.post(
  39. '/api-student/courseGroup/queryPageCourseGroup',
  40. {
  41. data: {
  42. ...params
  43. }
  44. }
  45. )
  46. const result = res.data || {}
  47. // 处理重复请求数据
  48. if (this.list.length > 0 && result.pageNo === 1) {
  49. return
  50. }
  51. this.list = this.list.concat(result.rows || [])
  52. this.finished = result.pageNo >= result.totalPage
  53. this.params.page = result.pageNo + 1
  54. this.dataShow = this.list.length > 0
  55. } catch {}
  56. },
  57. onDetail(item: any) {
  58. this.$router.push({
  59. path: '/liveDetail',
  60. query: {
  61. groupId: item.courseGroupId
  62. }
  63. })
  64. }
  65. },
  66. render() {
  67. return (
  68. <>
  69. {this.dataShow ? (
  70. <List
  71. class={styles.liveList}
  72. v-model:loading={this.loading}
  73. immediateCheck={false}
  74. finished={this.finished}
  75. finishedText="没有更多了"
  76. >
  77. {this.list.map((item: any) => (
  78. <CellGroup
  79. class={styles.liveGroup}
  80. border={false}
  81. onClick={() => this.onDetail(item)}
  82. >
  83. <Cell
  84. v-slots={{
  85. icon: () => (
  86. <div style={{ position: 'relative' }}>
  87. <Image
  88. class={styles.liCover}
  89. src={item.backgroundPic}
  90. fit="cover"
  91. />
  92. <span class={styles.subjectName}>
  93. {item?.subjectName}
  94. </span>
  95. </div>
  96. ),
  97. title: () => (
  98. <div class={styles.liContent}>
  99. <div class={[styles.liTitle, 'van-ellipsis']}>
  100. {item.courseGroupName}
  101. </div>
  102. <div class={styles.liUserInfo}>
  103. <div class={[styles.userInfo, 'van-hairline--right']}>
  104. <Image
  105. class={styles.avatar}
  106. fit="cover"
  107. src={item.avatar || iconTeacher}
  108. />
  109. <p>
  110. 老师:
  111. {item.teacherName || `游客${item.teacherId}`}
  112. </p>
  113. </div>
  114. {item.existBuy === 1 ? (
  115. <span class={styles.buyNum}>
  116. <Icon name={iconSuccess} size="15" />
  117. 已购买
  118. </span>
  119. ) : (
  120. <span class={styles.num}>
  121. {item.studentCount}人已购买
  122. </span>
  123. )}
  124. </div>
  125. </div>
  126. )
  127. }}
  128. />
  129. <Cell
  130. titleStyle={{ color: '#666666', fontSize: '13px' }}
  131. v-slots={{
  132. title: () => (
  133. <span
  134. style={{
  135. display: 'flex',
  136. alignItems: 'center',
  137. fontSize: '13px'
  138. }}
  139. >
  140. <Icon
  141. name={iconTimer}
  142. size="16"
  143. style={{ marginRight: '5px' }}
  144. />
  145. {this.formatTime(item.salesStartDate)}
  146. </span>
  147. ),
  148. default: () => (
  149. <div class={styles.price}>
  150. <span>
  151. ¥
  152. {(this as any).$filters.moneyFormat(item.coursePrice)}
  153. </span>
  154. /{item.courseNum}课时
  155. </div>
  156. )
  157. }}
  158. />
  159. </CellGroup>
  160. ))}
  161. </List>
  162. ) : (
  163. <ColResult btnStatus={false} classImgSize="SMALL" tips="暂无直播课" />
  164. )}
  165. </>
  166. )
  167. {
  168. /* <List
  169. v-model:loading={this.loading}
  170. finished={this.finished}
  171. finishedText="没有更多了"
  172. onLoad={this.getList}
  173. >
  174. {this.buyUserList.map(item => (
  175. <UserList class="mb12" users={item} />
  176. ))}
  177. </List> */
  178. }
  179. }
  180. })