list.tsx 5.5 KB

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