index.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import ColEmpty from '@/components/col-empty'
  2. import Pagination from '@/components/pagination'
  3. import request from '@/helpers/request'
  4. import { ElImage, ElSkeleton, ElSkeletonItem, ElTag } from 'element-plus'
  5. import { defineComponent } from 'vue'
  6. import iconVip from '../images/icon_vip.png'
  7. import iconVipDefault from '../images/icon_vip_default.png'
  8. export default defineComponent({
  9. name: 'MyFans',
  10. data() {
  11. return {
  12. pageInfo: {
  13. // 分页规则
  14. limit: 12, // 限制显示条数
  15. page: 1, // 当前页
  16. total: 0, // 总条数
  17. page_size: [12, 24, 48, 60] // 选择限制显示条数
  18. },
  19. list: [] as any[],
  20. loading: false,
  21. dataShow: false // 是否有数据
  22. }
  23. },
  24. mounted() {
  25. this.getList()
  26. },
  27. methods: {
  28. async getList() {
  29. this.loading = true
  30. try {
  31. const { data } = await request.post(
  32. '/api-website/teacher/queryMyFans',
  33. {
  34. requestType: 'json',
  35. data: {
  36. page: this.pageInfo.page,
  37. rows: this.pageInfo.limit
  38. }
  39. }
  40. )
  41. this.list = data.rows || []
  42. this.pageInfo.total = data.total
  43. if (data.total <= 0) {
  44. this.dataShow = true
  45. }
  46. } catch {}
  47. if (this.dataShow) {
  48. this.loading = false
  49. } else {
  50. setTimeout(() => {
  51. this.loading = false
  52. }, 200)
  53. }
  54. }
  55. },
  56. render() {
  57. return (
  58. <div class="h-full rounded-md overflow-hidden">
  59. <div class="text-2xl font-semibold text-black leading-none px-6 py-5 ">
  60. 我的粉丝
  61. </div>
  62. <div class={!this.dataShow && 'pt-4'}>
  63. <ElSkeleton
  64. loading={this.loading}
  65. animated
  66. class=" w-full m-auto px-[14px] flex"
  67. count={4}
  68. v-slots={{
  69. template: () => (
  70. <div class="w-[158px] rounded-[10px] pt-10 pb-7 mb-4 m-auto flex items-center justify-center flex-col user-shadow relative">
  71. <ElSkeletonItem
  72. variant="circle"
  73. style={{ width: '48px', height: '48px' }}
  74. ></ElSkeletonItem>
  75. <ElSkeletonItem
  76. variant="h3"
  77. style={{
  78. width: '50%',
  79. marginTop: '8px',
  80. marginBottom: '20px'
  81. }}
  82. ></ElSkeletonItem>
  83. <ElSkeletonItem
  84. variant="p"
  85. style={{ width: '60%', marginTop: '6px' }}
  86. ></ElSkeletonItem>
  87. </div>
  88. )
  89. }}
  90. >
  91. <div class="flex flex-wrap px-3">
  92. {this.list.map((item: any) => (
  93. <div class="basis-1/4 ">
  94. <div class="w-[158px] rounded-[10px] pt-10 pb-7 mb-4 m-auto flex items-center justify-center flex-col user-shadow relative">
  95. <div class="bg-[#FFE7CF] absolute left-2.5 top-2.5 text-[#AB5400] text-xs py-0.5 px-2 rounded-[10px]">
  96. 学生
  97. </div>
  98. <div class="flex flex-col items-center">
  99. <ElImage
  100. src={item.avatar}
  101. class="w-12 h-12 rounded-full border-2 border-[#2DC7AA]"
  102. />
  103. <ElImage
  104. src={item.isVip > 0 ? iconVip : iconVipDefault}
  105. class="h-7 -mt-4"
  106. />
  107. </div>
  108. <p class="text-base text-[#333] font-semibold leading-tight pb-5 pt-2 text-center">
  109. {item.userName}
  110. </p>
  111. <p class="h-6">
  112. {item.subjectName && (
  113. <ElTag
  114. effect="dark"
  115. // size="small"
  116. color="#E0FEF9"
  117. round
  118. style={{
  119. borderColor: '#E0FEF9',
  120. color: '#1B967E',
  121. margin: '0 4px'
  122. }}
  123. >
  124. {item.subjectName}
  125. </ElTag>
  126. )}
  127. </p>
  128. </div>
  129. </div>
  130. ))}
  131. </div>
  132. </ElSkeleton>
  133. </div>
  134. {this.dataShow && <ColEmpty />}
  135. <Pagination
  136. total={this.pageInfo.total}
  137. v-model:page={this.pageInfo.page}
  138. v-model:limit={this.pageInfo.limit}
  139. pageSizes={this.pageInfo.page_size}
  140. pagination={this.getList}
  141. />
  142. </div>
  143. )
  144. }
  145. })