user-add.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <template>
  2. <div class="w-full h-[100vh]">
  3. <ChatHeaderBar title="添加用户" />
  4. <ChatSearch v-model:searchString="showName" @search="search" placeholder="请输入关键词" />
  5. <van-pull-refresh v-model="refreshing" @refresh="onRefresh">
  6. <ChatEmpty
  7. v-if="!list?.length && !loading"
  8. image="search"
  9. title="请输入关键词,没有找到关结果"
  10. top="100"
  11. />
  12. <van-list
  13. v-else-if="list.length"
  14. v-model:loading="loading"
  15. error-text="获取失败"
  16. finished-text="-- 没有更多了 --"
  17. :finished="finished"
  18. :immediate-check="false"
  19. @load="getLoadList"
  20. >
  21. <template v-for="(item, index) in list" :key="item?.userId">
  22. <van-cell center disabled>
  23. <template #icon>
  24. <div class="w-40 h-40 ml-13 mr-12 rounded-full overflow-hidden">
  25. <img class="w-full h-full shrink-0 object-cover" :src="item?.headImageUrl" alt="" />
  26. </div>
  27. </template>
  28. <template #title>
  29. <h1 class="text-xl line-clamp-1 text-black-3">{{ item?.tourUserVo?.showName }}</h1>
  30. <p class="line-clamp-1 text-black-3 text-sm">粉丝 {{ transNum(item?.fansCount) }}</p>
  31. </template>
  32. <template #value>
  33. <van-button
  34. v-if="item.fansStatus == '0'"
  35. style="width: 60px"
  36. size="mini"
  37. type="primary"
  38. color="#FF9300"
  39. round
  40. plain
  41. @click="handleFollow(item, index)"
  42. >
  43. 关注
  44. </van-button>
  45. <van-button
  46. style="width: 60px"
  47. v-if="item.fansStatus == '1'"
  48. size="mini"
  49. type="primary"
  50. color="#999999"
  51. round
  52. plain
  53. @click="handleFollow(item, index)"
  54. >
  55. 已关注
  56. </van-button>
  57. <van-button
  58. style="width: 72px"
  59. v-if="item.fansStatus == '2'"
  60. size="mini"
  61. type="primary"
  62. color="#999999"
  63. round
  64. plain
  65. @click="handleFollow(item, index)"
  66. >
  67. 互相关注
  68. </van-button>
  69. <template v-if="item.fansStatus == '4'"></template>
  70. <van-button
  71. style="width: 60px"
  72. v-if="item.fansStatus == '4'"
  73. size="mini"
  74. type="primary"
  75. color="#FF9300"
  76. round
  77. plain
  78. @click="handleFollow(item, index)"
  79. >
  80. 回关
  81. </van-button>
  82. </template>
  83. </van-cell>
  84. </template>
  85. </van-list>
  86. </van-pull-refresh>
  87. </div>
  88. </template>
  89. <script setup>
  90. definePageMeta({
  91. layout: false
  92. })
  93. onMounted(() => {})
  94. const refreshing = ref(false)
  95. const loading = ref(false)
  96. const finished = ref(false)
  97. const showName = ref('')
  98. const queryParams = reactive({
  99. pageNum: 1,
  100. pageSize: 10,
  101. showName: ''
  102. })
  103. const list = ref([])
  104. useSeoMeta({
  105. title: '我的消息'
  106. })
  107. const search = () => {
  108. list.value = []
  109. queryParams.pageNum = 1
  110. queryParams.showName = showName.value
  111. getList()
  112. }
  113. // 关注
  114. const handleFollow = async (item, i) => {
  115. try {
  116. const { data } = await request('/website/tourism/fans/saveConcern', {
  117. method: 'post',
  118. body: {
  119. attentionId: item.tourUserVo.userId
  120. }
  121. })
  122. list.value[i].fansStatus = data.fansStatus
  123. showSuccessToast('操作成功')
  124. } catch (e) {
  125. } finally {
  126. }
  127. }
  128. // 刷新
  129. const onRefresh = () => {
  130. queryParams.pageNum = 1
  131. list.value = []
  132. getList()
  133. }
  134. // 触底加载
  135. const getLoadList = () => {
  136. queryParams.pageNum++
  137. finished.value = true
  138. getList()
  139. }
  140. // 获取数据
  141. const getList = async () => {
  142. try {
  143. let url = `/website/tourism/fans/getUserListByNickname`
  144. loading.value = true
  145. let {
  146. data: { dataList, totalCount }
  147. } = await request(url, {
  148. query: {
  149. ...queryParams
  150. }
  151. })
  152. if (Array.isArray(dataList) && dataList?.length) {
  153. list.value = list.value.concat(dataList)
  154. } else {
  155. list.value = []
  156. }
  157. loading.value = false
  158. refreshing.value = false
  159. if (list.value.length >= totalCount) {
  160. finished.value = true
  161. } else {
  162. finished.value = false
  163. }
  164. } catch (err) {
  165. } finally {
  166. refreshing.value = false
  167. loading.value = false
  168. }
  169. }
  170. function transNum(num) {
  171. if (isNaN(num)) return 0
  172. if (num < 10000) return num
  173. return (num / 10000).toFixed(1) + 'w'
  174. }
  175. </script>
  176. <style lang="scss" scoped></style>