group-member.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <template>
  2. <view class="page group-member">
  3. <nav-bar back>群成员</nav-bar>
  4. <view class="nav-bar">
  5. <view class="nav-search">
  6. <uni-search-bar v-model="searchText" radius="100" cancelButton="none"
  7. placeholder="输入昵称搜索"></uni-search-bar>
  8. </view>
  9. </view>
  10. <view class="member-items">
  11. <virtual-scroller class="scroll-bar" :items="showMembers">
  12. <template v-slot="{ item }">
  13. <view class="member-item" @click="onShowUserInfo(item.userId)">
  14. <head-image :name="item.showNickName" :online="item.online" :url="item.headImage"></head-image>
  15. <view class="member-name">{{ item.showNickName }}
  16. <uni-tag v-if="item.userId == group.ownerId" text="群主" size="small" circle type="error">
  17. </uni-tag>
  18. <uni-tag v-if="item.userId == userStore.userInfo.id" text="我" size="small" circle></uni-tag>
  19. </view>
  20. <view class="member-kick">
  21. <button type="warn" plain v-show="isOwner && !isSelf(item.userId)" size="mini"
  22. @click.stop="onKickOut(item)">移出群聊</button>
  23. </view>
  24. </view>
  25. </template>
  26. </virtual-scroller>
  27. </view>
  28. </view>
  29. </template>
  30. <script>
  31. export default {
  32. data() {
  33. return {
  34. isModify: false,
  35. searchText: "",
  36. group: {},
  37. members: []
  38. }
  39. },
  40. methods: {
  41. onShowUserInfo(userId) {
  42. uni.navigateTo({
  43. url: "/pages/common/user-info?id=" + userId
  44. })
  45. },
  46. onKickOut(member) {
  47. uni.showModal({
  48. title: '确认移出?',
  49. content: `确定将成员'${member.showNickName}'移出群聊吗?`,
  50. success: (res) => {
  51. if (res.cancel)
  52. return;
  53. this.$http({
  54. url: `/group/kick/${this.group.id}?userId=${member.userId}`,
  55. method: 'DELETE'
  56. }).then(() => {
  57. uni.showToast({
  58. title: `已将${member.showNickName}移出群聊`,
  59. icon: 'none'
  60. })
  61. member.quit = true;
  62. this.isModify = true;
  63. });
  64. }
  65. })
  66. },
  67. loadGroupInfo(id) {
  68. this.$http({
  69. url: `/group/find/${id}`,
  70. method: 'GET'
  71. }).then((group) => {
  72. this.group = group;
  73. });
  74. },
  75. loadGroupMembers(id) {
  76. this.$http({
  77. url: `/group/members/${id}`,
  78. method: "GET"
  79. }).then((members) => {
  80. this.members = members;
  81. })
  82. },
  83. isSelf(userId) {
  84. return this.userStore.userInfo.id == userId
  85. }
  86. },
  87. computed: {
  88. isOwner() {
  89. return this.userStore.userInfo.id == this.group.ownerId;
  90. },
  91. showMembers() {
  92. return this.members.filter(m => !m.quit && m.showNickName.includes(this.searchText))
  93. }
  94. },
  95. onLoad(options) {
  96. this.loadGroupInfo(options.id);
  97. this.loadGroupMembers(options.id);
  98. },
  99. onUnload() {
  100. if (this.isModify) {
  101. // 刷新页面
  102. let pages = getCurrentPages();
  103. let prevPage = pages[pages.length - 2];
  104. prevPage.$vm.loadGroupMembers();
  105. }
  106. }
  107. }
  108. </script>
  109. <style scoped lang="scss">
  110. .group-member {
  111. position: relative;
  112. display: flex;
  113. flex-direction: column;
  114. .member-items {
  115. position: relative;
  116. flex: 1;
  117. overflow: hidden;
  118. .member-item {
  119. height: 120rpx;
  120. display: flex;
  121. margin-bottom: 1rpx;
  122. position: relative;
  123. padding: 0 30rpx;
  124. align-items: center;
  125. background-color: white;
  126. white-space: nowrap;
  127. .member-name {
  128. display: flex;
  129. align-items: center;
  130. flex: 1;
  131. padding-left: 20rpx;
  132. font-size: $im-font-size;
  133. line-height: $im-font-size * 2;
  134. white-space: nowrap;
  135. overflow: hidden;
  136. .uni-tag {
  137. margin-left: 5rpx;
  138. width: 40rpx;
  139. border: 0;
  140. height: 30rpx;
  141. line-height: 30rpx;
  142. font-size: 20rpx;
  143. text-align: center;
  144. }
  145. }
  146. }
  147. .scroll-bar {
  148. height: 100%;
  149. }
  150. }
  151. }
  152. </style>