group-member.vue 3.6 KB

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