8 changed files with 771 additions and 6 deletions
@ -0,0 +1,97 @@ |
|||||
|
<template> |
||||
|
<view class="page friend-add"> |
||||
|
<view class="search-bar"> |
||||
|
<uni-search-bar v-model="searchText" :focus="true" @confirm="onSearch()" @cancel="onCancel()" |
||||
|
placeholder="用户名/昵称"></uni-search-bar> |
||||
|
</view> |
||||
|
<view class="user-items"> |
||||
|
<scroll-view class="scroll-bar" scroll-with-animation="true" scroll-y="true"> |
||||
|
<view v-for="(user) in users" :key="user.id" v-show="user.id != $store.state.userStore.userInfo.id"> |
||||
|
<uni-list-chat :avatar="user.headImage" :title="user.userName" :note="'昵称:'+user.nickName" |
||||
|
:clickable="true" @click="onShowUserInfo(user)"> |
||||
|
<view class="chat-custom-right"> |
||||
|
<button type="primary" v-show="!isFriend(user.id)" size="mini" |
||||
|
@click.stop="onAddFriend(user)">加为好友</button> |
||||
|
<button type="default" v-show="isFriend(user.id)" size="mini" disabled>已添加</button> |
||||
|
</view> |
||||
|
</uni-list-chat> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
searchText: "", |
||||
|
users: [] |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
onCancel() { |
||||
|
uni.navigateBack(); |
||||
|
}, |
||||
|
onSearch() { |
||||
|
console.log("onSearch") |
||||
|
this.$http({ |
||||
|
url: "/user/findByName?name=" + this.searchText, |
||||
|
method: "GET" |
||||
|
}).then((data) => { |
||||
|
this.users = data; |
||||
|
}) |
||||
|
}, |
||||
|
onAddFriend(user) { |
||||
|
this.$http({ |
||||
|
url: "/friend/add?friendId=" + user.id, |
||||
|
method: "POST" |
||||
|
}).then((data) => { |
||||
|
let friend = { |
||||
|
id: user.id, |
||||
|
nickName: user.nickName, |
||||
|
headImage: user.headImage, |
||||
|
online: user.online |
||||
|
} |
||||
|
this.$store.commit("addFriend", friend); |
||||
|
uni.showToast({ |
||||
|
title: "添加成功,对方已成为您的好友", |
||||
|
icon: "none" |
||||
|
}) |
||||
|
}) |
||||
|
}, |
||||
|
onShowUserInfo(user) { |
||||
|
uni.navigateTo({ |
||||
|
url: "/pages/common/user-info?id=" + user.id |
||||
|
}) |
||||
|
}, |
||||
|
isFriend(userId) { |
||||
|
let friends = this.$store.state.friendStore.friends; |
||||
|
let friend = friends.find((f) => f.id == userId); |
||||
|
return friend != undefined; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped lang="scss"> |
||||
|
.friend-add { |
||||
|
position: relative; |
||||
|
border: #dddddd solid 1px; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
|
||||
|
.search-bar { |
||||
|
background: white; |
||||
|
} |
||||
|
.user-items{ |
||||
|
position: relative; |
||||
|
flex: 1; |
||||
|
overflow: hidden; |
||||
|
.scroll-bar { |
||||
|
height: 100%; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,146 @@ |
|||||
|
<template> |
||||
|
<view class="page group-edit"> |
||||
|
<uni-forms ref="form" :modelValue="group" :rules="rules" validate-trigger="bind" label-position="top" |
||||
|
label-width="100%"> |
||||
|
<uni-forms-item label="群聊头像:" name="headImage"> |
||||
|
<image-upload :disabled="!isOwner" :onSuccess="onUnloadImageSuccess"> |
||||
|
<image :src="group.headImage" class="head-image"></image> |
||||
|
</image-upload> |
||||
|
</uni-forms-item> |
||||
|
<uni-forms-item label="群聊名称:" name="name" :required="true"> |
||||
|
<uni-easyinput type="text" v-model="group.name" :disabled="!isOwner" placeholder="请输入群聊名称" /> |
||||
|
</uni-forms-item> |
||||
|
<uni-forms-item label="群聊备注:" name="remark"> |
||||
|
<uni-easyinput v-model="group.remark" type="text" placeholder="请输入群聊备注" /> |
||||
|
</uni-forms-item> |
||||
|
<uni-forms-item label="我在本群的昵称:" name="email"> |
||||
|
<uni-easyinput v-model="group.aliasName" type="text" placeholder="请输入群聊昵称" /> |
||||
|
</uni-forms-item> |
||||
|
<uni-forms-item label="群公告:" name="notice"> |
||||
|
<uni-easyinput type="textarea" v-model="group.notice" :disabled="!isOwner" placeholder="请输入群公告" /> |
||||
|
</uni-forms-item> |
||||
|
</uni-forms> |
||||
|
<button type="primary" @click="submit()">提交</button> |
||||
|
|
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
group: {}, |
||||
|
rules: { |
||||
|
name: { |
||||
|
rules: [{ |
||||
|
required: true, |
||||
|
errorMessage: '请输入群聊名称', |
||||
|
}] |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
submit() { |
||||
|
if (this.group.id) { |
||||
|
this.modifyGroup(); |
||||
|
} else { |
||||
|
this.createNewGroup(); |
||||
|
} |
||||
|
}, |
||||
|
onUnloadImageSuccess(file, res) { |
||||
|
console.log(res) |
||||
|
this.group.headImage = res.data.originUrl; |
||||
|
this.group.headImageThumb = res.data.thumbUrl; |
||||
|
}, |
||||
|
modifyGroup() { |
||||
|
this.$http({ |
||||
|
url: "/group/modify", |
||||
|
method: "PUT", |
||||
|
data: this.group |
||||
|
}).then((group) => { |
||||
|
this.$store.commit("updateGroup", group); |
||||
|
uni.showToast({ |
||||
|
title: "修改群聊信息成功", |
||||
|
icon: 'none' |
||||
|
}); |
||||
|
setTimeout(()=>{ |
||||
|
uni.navigateBack(); |
||||
|
},1000); |
||||
|
|
||||
|
}) |
||||
|
}, |
||||
|
createNewGroup() { |
||||
|
this.$http({ |
||||
|
url: "/group/create", |
||||
|
method: 'POST', |
||||
|
data: this.group |
||||
|
}).then((group) => { |
||||
|
this.$store.commit("addGroup", group); |
||||
|
uni.showToast({ |
||||
|
title: `群聊创建成功,快邀请小伙伴进群吧`, |
||||
|
icon: 'none', |
||||
|
duration: 2000 |
||||
|
}); |
||||
|
setTimeout(()=>{ |
||||
|
uni.navigateTo({ |
||||
|
url: "/pages/group/group-info?id="+group.id |
||||
|
}); |
||||
|
},2000) |
||||
|
|
||||
|
}) |
||||
|
}, |
||||
|
loadGroupInfo(id) { |
||||
|
this.$http({ |
||||
|
url: `/group/find/${id}`, |
||||
|
method: 'GET' |
||||
|
}).then((group) => { |
||||
|
this.group = group; |
||||
|
// 更新聊天页面的群聊信息 |
||||
|
this.$store.commit("updateChatFromGroup", group); |
||||
|
// 更新聊天列表的群聊信息 |
||||
|
this.$store.commit("updateGroup", group); |
||||
|
|
||||
|
}); |
||||
|
}, |
||||
|
initNewGroup() { |
||||
|
let userInfo = this.$store.state.userStore.userInfo; |
||||
|
this.group = { |
||||
|
name: `${userInfo.userName}创建的群聊`, |
||||
|
headImage: userInfo.headImage, |
||||
|
headImageThumb: userInfo.headImageThumb, |
||||
|
aliasName: userInfo.nickName, |
||||
|
ownerId: this.$store.state.userStore.userInfo.id |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
isOwner() { |
||||
|
return this.$store.state.userStore.userInfo.id == this.group.ownerId |
||||
|
} |
||||
|
}, |
||||
|
onLoad(options) { |
||||
|
if (options.id) { |
||||
|
// 修改群聊 |
||||
|
this.loadGroupInfo(options.id); |
||||
|
} else { |
||||
|
// 创建群聊 |
||||
|
this.initNewGroup(); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.group-edit { |
||||
|
padding: 20rpx; |
||||
|
|
||||
|
.head-image { |
||||
|
width: 200rpx; |
||||
|
height: 200rpx; |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,283 @@ |
|||||
|
<template> |
||||
|
<view class="page group-info"> |
||||
|
<view class="group-members"> |
||||
|
<view class="member-items"> |
||||
|
<view v-for="(member,idx) in groupMembers" :key="idx"> |
||||
|
<view class="member-item" v-if="idx<9" @click="onShowUserInfo(member.userId)"> |
||||
|
<view class="avatar"> |
||||
|
<image class="head-image" :src="member.headImage" mode="aspectFill"> </image> |
||||
|
</view> |
||||
|
<view class="text"> |
||||
|
<text>{{member.aliasName}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="invite-btn" @click="onInviteMember()"> |
||||
|
<view class="iconfont icon-add-circle"></view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="member-more" @click="onShowMoreMmeber()">查看更多群成员 ></view> |
||||
|
</view> |
||||
|
<view class="group-detail"> |
||||
|
<uni-section title="群聊名称:" titleFontSize="30rpx"> |
||||
|
<template v-slot:right> |
||||
|
<text>{{group.name}}</text> |
||||
|
</template> |
||||
|
</uni-section> |
||||
|
<uni-section title="群主:" titleFontSize="30rpx"> |
||||
|
<template v-slot:right> |
||||
|
<text>{{ownerName}}</text> |
||||
|
</template> |
||||
|
</uni-section> |
||||
|
|
||||
|
<uni-section title="群聊备注:" titleFontSize="30rpx"> |
||||
|
<template v-slot:right> |
||||
|
<text> {{group.remark}}</text> |
||||
|
</template> |
||||
|
</uni-section> |
||||
|
<uni-section title="我在本群的昵称:" titleFontSize="30rpx"> |
||||
|
<template v-slot:right> |
||||
|
<text> {{group.aliasName}}</text> |
||||
|
</template> |
||||
|
</uni-section> |
||||
|
<uni-section title="群公告:" titleFontSize="30rpx"> |
||||
|
<uni-notice-bar :text="group.notice" /> |
||||
|
</uni-section> |
||||
|
<view class="group-edit" @click="onEditGroup()">修改群聊资料 > </view> |
||||
|
</view> |
||||
|
<view class="btn-group"> |
||||
|
<button class="btn" type="primary" @click="onSendMessage()">发消息</button> |
||||
|
<button class="btn" v-show="!isOwner" type="warn" @click="onQuitGroup()">退出群聊</button> |
||||
|
<button class="btn" v-show="isOwner" type="warn" @click="onDissolveGroup()">解散群聊</button> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
group: {}, |
||||
|
groupMembers: [] |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
onFocusSearch() {}, |
||||
|
onInviteMember(){ |
||||
|
uni.navigateTo({ |
||||
|
url: `/pages/group/group-invite?id=${this.group.id}` |
||||
|
}) |
||||
|
}, |
||||
|
onShowUserInfo(userId) { |
||||
|
uni.navigateTo({ |
||||
|
url: "/pages/common/user-info?id=" + userId |
||||
|
}) |
||||
|
}, |
||||
|
onShowMoreMmeber(){ |
||||
|
uni.navigateTo({ |
||||
|
url: `/pages/group/group-member?id=${this.group.id}` |
||||
|
}) |
||||
|
}, |
||||
|
onEditGroup() { |
||||
|
uni.navigateTo({ |
||||
|
url: `/pages/group/group-edit?id=${this.group.id}` |
||||
|
}) |
||||
|
}, |
||||
|
onSendMessage() { |
||||
|
let chat = { |
||||
|
type: 'GROUP', |
||||
|
targetId: this.group.id, |
||||
|
showName: this.group.remark, |
||||
|
headImage: this.group.headImage, |
||||
|
}; |
||||
|
this.$store.commit("openChat", chat); |
||||
|
uni.navigateTo({ |
||||
|
url: "/pages/chat/chat-box?chatIdx=0" |
||||
|
}) |
||||
|
}, |
||||
|
onQuitGroup() { |
||||
|
uni.showModal({ |
||||
|
title: '确认退出?', |
||||
|
content: `退出群聊后将不再接受群里的消息,确认退出吗?`, |
||||
|
success: () => { |
||||
|
this.$http({ |
||||
|
url: `/group/quit/${this.group.id}`, |
||||
|
method: 'DELETE' |
||||
|
}).then(() => { |
||||
|
this.$store.commit("removeGroup", this.group.id); |
||||
|
this.$store.commit("removeGroupChat", this.group.id); |
||||
|
uni.showModal({ |
||||
|
title: `退出成功`, |
||||
|
content: `您已退出群聊'${this.group.name}'`, |
||||
|
showCancel: false, |
||||
|
success:()=>{ |
||||
|
uni.navigateBack(); |
||||
|
} |
||||
|
}) |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
onDissolveGroup() { |
||||
|
uni.showModal({ |
||||
|
title: '确认解散?', |
||||
|
content: `确认要解散群聊'${this.group.name}'吗?`, |
||||
|
success:()=>{ |
||||
|
this.$http({ |
||||
|
url: `/group/delete/${this.group.id}`, |
||||
|
method: 'delete' |
||||
|
}).then(() => { |
||||
|
this.$store.commit("removeGroup", this.group.id); |
||||
|
this.$store.commit("removeGroupChat", this.group.id); |
||||
|
uni.showModal({ |
||||
|
title: `解散成功`, |
||||
|
content: `群聊'${this.group.name}'已解散`, |
||||
|
showCancel: false, |
||||
|
success:()=>{ |
||||
|
uni.navigateBack(); |
||||
|
} |
||||
|
}) |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
}, |
||||
|
loadGroupInfo(id) { |
||||
|
this.$http({ |
||||
|
url: `/group/find/${id}`, |
||||
|
method: 'GET' |
||||
|
}).then((group) => { |
||||
|
this.group = group; |
||||
|
// 更新聊天页面的群聊信息 |
||||
|
this.$store.commit("updateChatFromGroup", group); |
||||
|
// 更新聊天列表的群聊信息 |
||||
|
this.$store.commit("updateGroup", group); |
||||
|
|
||||
|
}); |
||||
|
}, |
||||
|
loadGroupMembers(id) { |
||||
|
this.$http({ |
||||
|
url: `/group/members/${id}`, |
||||
|
method: "GET" |
||||
|
}).then((members) => { |
||||
|
this.groupMembers = members.filter(m => !m.quit); |
||||
|
}) |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
ownerName() { |
||||
|
let member = this.groupMembers.find((m) => m.userId == this.group.ownerId); |
||||
|
return member && member.aliasName; |
||||
|
}, |
||||
|
isOwner() { |
||||
|
return this.group.ownerId == this.$store.state.userStore.userInfo.id; |
||||
|
}, |
||||
|
}, |
||||
|
onLoad(options) { |
||||
|
// 查询群聊信息 |
||||
|
this.loadGroupInfo(options.id); |
||||
|
// 查询群聊成员 |
||||
|
this.loadGroupMembers(options.id) |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.group-info { |
||||
|
.group-members { |
||||
|
padding: 30rpx; |
||||
|
background: white; |
||||
|
|
||||
|
.member-items { |
||||
|
display: flex; |
||||
|
flex-wrap: wrap; |
||||
|
|
||||
|
.member-item { |
||||
|
width: 120rpx; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
margin: 8rpx 2rpx; |
||||
|
position: relative; |
||||
|
|
||||
|
align-items: center; |
||||
|
padding-right: 5px; |
||||
|
background-color: #fafafa; |
||||
|
white-space: nowrap; |
||||
|
|
||||
|
.avatar { |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
width: 100rpx; |
||||
|
height: 100rpx; |
||||
|
|
||||
|
.head-image { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
border-radius: 10%; |
||||
|
border: #d8d8d8 solid 1px; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.text { |
||||
|
width: 100%; |
||||
|
flex: 1; |
||||
|
overflow: hidden; |
||||
|
text-align: center; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.invite-btn { |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
width: 100rpx; |
||||
|
height: 100rpx; |
||||
|
margin: 10rpx; |
||||
|
border: #686868 dashed 2px; |
||||
|
border-radius: 10%; |
||||
|
|
||||
|
.iconfont { |
||||
|
font-size: 70rpx; |
||||
|
color: #888888; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.member-more { |
||||
|
padding: 20rpx; |
||||
|
text-align: center; |
||||
|
font-size: 30rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.group-detail { |
||||
|
margin-top: 30rpx; |
||||
|
padding: 30rpx; |
||||
|
background: white; |
||||
|
|
||||
|
|
||||
|
.group-edit { |
||||
|
padding: 20rpx; |
||||
|
text-align: center; |
||||
|
font-size: 30rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.btn-group { |
||||
|
margin-top: 30rpx; |
||||
|
padding: 30rpx; |
||||
|
background: white; |
||||
|
|
||||
|
|
||||
|
.btn { |
||||
|
margin: 10rpx; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,130 @@ |
|||||
|
<template> |
||||
|
<view class="page group-invite"> |
||||
|
<view class="search-bar"> |
||||
|
<uni-search-bar v-model="searchText" cancelButton="none" placeholder="输入好友昵称搜索"></uni-search-bar> |
||||
|
</view> |
||||
|
<view class="friend-items"> |
||||
|
<scroll-view class="scroll-bar" scroll-with-animation="true" scroll-y="true"> |
||||
|
<view v-for="friend in friendItems" |
||||
|
v-show="!searchText || friend.nickName.startsWith(searchText)" :key="friend.id"> |
||||
|
<uni-list-chat :avatar="friend.headImage" :title="friend.nickName" |
||||
|
:clickable="true" @click="onShowUserInfo(friend.id)"> |
||||
|
<view class="chat-custom-right"> |
||||
|
<radio :checked="friend.checked" :disabled="friend.disabled" @click.stop="onSwitchChecked(friend)"/> |
||||
|
</view> |
||||
|
</uni-list-chat> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
<view> |
||||
|
<button type="primary" :disabled="inviteSize==0" @click="onInviteFriends()">邀请({{inviteSize}}) </button> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
groupId: null, |
||||
|
searchText: "", |
||||
|
groupMembers: [], |
||||
|
friendItems:[] |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
onInviteFriends(){ |
||||
|
let inviteVo = { |
||||
|
groupId: this.groupId, |
||||
|
friendIds: [] |
||||
|
} |
||||
|
this.friendItems.forEach((f) => { |
||||
|
if (f.checked && !f.disabled) { |
||||
|
inviteVo.friendIds.push(f.id); |
||||
|
} |
||||
|
}) |
||||
|
if (inviteVo.friendIds.length > 0) { |
||||
|
this.$http({ |
||||
|
url: "/group/invite", |
||||
|
method: 'POST', |
||||
|
data: inviteVo |
||||
|
}).then(() => { |
||||
|
uni.showToast({ |
||||
|
title: "邀请成功", |
||||
|
icon: 'none' |
||||
|
}) |
||||
|
setTimeout(()=>{ |
||||
|
uni.navigateBack(); |
||||
|
},1000); |
||||
|
|
||||
|
}) |
||||
|
} |
||||
|
}, |
||||
|
onShowUserInfo(userId){ |
||||
|
uni.navigateTo({ |
||||
|
url: "/pages/common/user-info?id=" + userId |
||||
|
}) |
||||
|
}, |
||||
|
onSwitchChecked(friend){ |
||||
|
if(!friend.disabled){ |
||||
|
console.log(friend.disabled) |
||||
|
friend.checked = !friend.checked; |
||||
|
} |
||||
|
}, |
||||
|
initFriendItems(){ |
||||
|
this.friendItems = []; |
||||
|
let friends = this.$store.state.friendStore.friends; |
||||
|
friends.forEach((f=>{ |
||||
|
let item = { |
||||
|
id: f.id, |
||||
|
headImage:f.headImage, |
||||
|
nickName: f.nickName, |
||||
|
} |
||||
|
item.disabled = this.isGroupMember(f.id); |
||||
|
item.checked = item.disabled; |
||||
|
this.friendItems.push(item); |
||||
|
})) |
||||
|
}, |
||||
|
loadGroupMembers(id) { |
||||
|
this.$http({ |
||||
|
url: `/group/members/${id}`, |
||||
|
method: "GET" |
||||
|
}).then((members) => { |
||||
|
this.groupMembers = members.filter(m => !m.quit); |
||||
|
this.initFriendItems(); |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
isGroupMember(id){ |
||||
|
return this.groupMembers.some(m => m.userId==id); |
||||
|
} |
||||
|
}, |
||||
|
computed:{ |
||||
|
inviteSize(){ |
||||
|
return this.friendItems.filter(f => !f.disabled && f.checked).length; |
||||
|
} |
||||
|
}, |
||||
|
onLoad(options) { |
||||
|
this.groupId = options.id; |
||||
|
this.loadGroupMembers(options.id); |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.group-invite{ |
||||
|
position: relative; |
||||
|
border: #dddddd solid 1px; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
|
||||
|
.friend-items{ |
||||
|
position: relative; |
||||
|
flex: 1; |
||||
|
overflow: hidden; |
||||
|
.scroll-bar { |
||||
|
height: 100%; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,105 @@ |
|||||
|
<template> |
||||
|
<view class="page group-member"> |
||||
|
<view class="search-bar"> |
||||
|
<uni-search-bar v-model="searchText" cancelButton="none" placeholder="输入成员昵称搜索"></uni-search-bar> |
||||
|
</view> |
||||
|
<view class="member-items"> |
||||
|
<scroll-view class="scroll-bar" scroll-with-animation="true" scroll-y="true"> |
||||
|
<view v-for="(member,idx) in groupMembers" |
||||
|
v-show="!searchText || member.aliasName.startsWith(searchText)" :key="idx"> |
||||
|
<uni-list-chat :avatar="member.headImage" :title="member.aliasName" :clickable="true" |
||||
|
@click="onShowUserInfo(member.userId)"> |
||||
|
<view class="chat-custom-right"> |
||||
|
<button type="warn" v-show="isOwner && !isSelf(member.userId)" size="mini" |
||||
|
@click.stop="onKickOut(member,idx)">移出群聊</button> |
||||
|
</view> |
||||
|
</uni-list-chat> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
searchText: "", |
||||
|
group: {}, |
||||
|
groupMembers: [] |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
onShowUserInfo(userId) { |
||||
|
uni.navigateTo({ |
||||
|
url: "/pages/common/user-info?id=" + userId |
||||
|
}) |
||||
|
}, |
||||
|
onKickOut(member, idx) { |
||||
|
uni.showModal({ |
||||
|
title: '确认移出?', |
||||
|
content: `确定将成员'${member.aliasName}'移出群聊吗?`, |
||||
|
success: () => { |
||||
|
this.$http({ |
||||
|
url: `/group/kick/${this.group.id}?userId=${member.userId}`, |
||||
|
method: 'DELETE' |
||||
|
}).then(() => { |
||||
|
uni.showToast({ |
||||
|
title: `已将${member.aliasName}移出群聊`, |
||||
|
icon: 'none' |
||||
|
}) |
||||
|
this.groupMembers.splice(idx, 1); |
||||
|
|
||||
|
}); |
||||
|
} |
||||
|
}) |
||||
|
}, |
||||
|
loadGroupInfo(id) { |
||||
|
this.$http({ |
||||
|
url: `/group/find/${id}`, |
||||
|
method: 'GET' |
||||
|
}).then((group) => { |
||||
|
this.group = group; |
||||
|
}); |
||||
|
}, |
||||
|
loadGroupMembers(id) { |
||||
|
this.$http({ |
||||
|
url: `/group/members/${id}`, |
||||
|
method: "GET" |
||||
|
}).then((members) => { |
||||
|
this.groupMembers = members.filter(m => !m.quit); |
||||
|
}) |
||||
|
}, |
||||
|
isSelf(userId) { |
||||
|
return this.$store.state.userStore.userInfo.id == userId |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
isOwner() { |
||||
|
return this.$store.state.userStore.userInfo.id == this.group.ownerId; |
||||
|
} |
||||
|
}, |
||||
|
onLoad(options) { |
||||
|
this.loadGroupInfo(options.id); |
||||
|
this.loadGroupMembers(options.id); |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped lang="scss"> |
||||
|
.group-invite{ |
||||
|
position: relative; |
||||
|
border: #dddddd solid 1px; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
|
||||
|
.member-items{ |
||||
|
position: relative; |
||||
|
flex: 1; |
||||
|
overflow: hidden; |
||||
|
.scroll-bar { |
||||
|
height: 100%; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue