list.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import ColEmpty from '@/components/col-empty'
  2. import Pagination from '@/components/pagination'
  3. import request from '@/helpers/request'
  4. import { state } from '@/state'
  5. import { ElSkeleton, ElSkeletonItem } from 'element-plus'
  6. import { defineComponent } from 'vue'
  7. import Item from '../components/item'
  8. import styles from './index.module.less'
  9. export default defineComponent({
  10. name: 'list',
  11. props: {
  12. auditStatus: {
  13. type: String,
  14. default: ''
  15. }
  16. },
  17. data() {
  18. return {
  19. pageInfo: {
  20. // 分页规则
  21. limit: 9, // 限制显示条数
  22. page: 1, // 当前页
  23. total: 0, // 总条数
  24. page_size: [10, 20, 40, 50] // 选择限制显示条数
  25. },
  26. list: [] as any[],
  27. loading: true,
  28. dataShow: false // 是否有数据
  29. }
  30. },
  31. mounted() {
  32. if (state.user.data?.entryFlag) {
  33. this.getList()
  34. }
  35. },
  36. methods: {
  37. async getList() {
  38. this.loading = true
  39. try {
  40. const { data } = await request.post(
  41. '/api-website/videoLessonGroup/page',
  42. {
  43. data: {
  44. auditStatus: this.auditStatus,
  45. page: this.pageInfo.page,
  46. rows: this.pageInfo.limit,
  47. teacherId: state.user.data?.userId
  48. }
  49. }
  50. )
  51. this.list = data.rows || []
  52. this.pageInfo.total = data.total
  53. if (data.total <= 0) {
  54. this.dataShow = true
  55. }
  56. } catch {}
  57. if (this.dataShow) {
  58. this.loading = false
  59. } else {
  60. setTimeout(() => {
  61. this.loading = false
  62. }, 200)
  63. }
  64. },
  65. onDetail(item: any) {
  66. if (this.auditStatus === 'UNPASS') {
  67. // this.$message.error('该课程正在审核中,请等待审核结果')
  68. this.$router.push({
  69. path: '/userInfo/videoOperation',
  70. query: {
  71. type: 'edit',
  72. groupId: item.id
  73. }
  74. })
  75. return
  76. } else {
  77. // 跳转对应详情 个人中心不跳转到详情
  78. }
  79. }
  80. },
  81. render() {
  82. return (
  83. <>
  84. {state.user.data?.entryFlag ? (
  85. <>
  86. <div class="flex flex-wrap">
  87. <ElSkeleton
  88. loading={this.loading}
  89. animated
  90. class="flex justify-between"
  91. count={3}
  92. v-slots={{
  93. template: () => (
  94. <div class="w-[218px]">
  95. <div class="flex flex-col pt-8 w-[218px] rounded-[10px] overflow-hidden m-auto">
  96. <ElSkeletonItem
  97. variant="image"
  98. style={{ width: '100%', height: '122px' }}
  99. ></ElSkeletonItem>
  100. {/* <div class="mx-2.5 py-3.5 border-b border-b-[#F2F2F2]">
  101. <div class="text-lg leading-none font-semibold whitespace-nowrap overflow-hidden text-ellipsis">
  102. <ElSkeletonItem variant="h3"></ElSkeletonItem>
  103. </div>
  104. <div class="text-sm text-[#999] pt-2.5">
  105. <ElSkeletonItem
  106. variant="p"
  107. style={{ width: '50%' }}
  108. ></ElSkeletonItem>
  109. </div>
  110. </div> */}
  111. <div class="text-base px-2.5 pt-2 text-[#666666] leading-none font-semibold whitespace-nowrap overflow-hidden text-ellipsis">
  112. <ElSkeletonItem variant="h3"></ElSkeletonItem>
  113. </div>
  114. <div class="mx-2.5 pt-1.5 pb-2 flex items-center justify-between">
  115. <ElSkeletonItem
  116. variant="p"
  117. style={{ width: '20%' }}
  118. ></ElSkeletonItem>
  119. <p style={{ width: '60%' }}></p>
  120. <ElSkeletonItem
  121. variant="p"
  122. style={{ width: '20%' }}
  123. ></ElSkeletonItem>
  124. </div>
  125. </div>
  126. </div>
  127. )
  128. }}
  129. >
  130. {this.list.map((item: any) => (
  131. <div
  132. class={['w-1/3 pt-8', styles.items]}
  133. onClick={() => this.onDetail(item)}
  134. >
  135. <Item
  136. item={{
  137. type: 'video',
  138. id: item.id,
  139. backgroundPic: item.lessonCoverUrl,
  140. courseGroupName: item.lessonName,
  141. studentCount: item.countStudent,
  142. avatar: item.avatar,
  143. teacherName: item.username,
  144. coursePrice: item.lessonPrice,
  145. courseNum: item.lessonCount
  146. }}
  147. />
  148. </div>
  149. ))}
  150. </ElSkeleton>
  151. </div>
  152. <Pagination
  153. total={this.pageInfo.total}
  154. v-model:page={this.pageInfo.page}
  155. v-model:limit={this.pageInfo.limit}
  156. pageSizes={this.pageInfo.page_size}
  157. pagination={this.getList}
  158. />
  159. {this.dataShow && <ColEmpty />}
  160. </>
  161. ) : (
  162. <ColEmpty
  163. type="teacherCert"
  164. message="您还未完成达人认证,认证后才可创建视频课哦~"
  165. buttonVisibility
  166. buttonText="去认证"
  167. onDetail={() => {
  168. this.$router.push('/teacherAuth')
  169. }}
  170. />
  171. )}
  172. </>
  173. )
  174. }
  175. })