<template>
|
<el-container class="container">
|
<el-header class="header">
|
<span>群信息</span>
|
<el-tooltip content="发送消息" placement="top">
|
<i class="icon-send el-icon-chat-line-square" @click="sendGroup" />
|
</el-tooltip>
|
<i class="el-icon-close" @click="$emit('close')" />
|
</el-header>
|
|
<el-main class="main lum-scrollbar">
|
<div class="list-item flex">
|
<p>
|
<span>群名称:</span>
|
<span class="group-setting-title">{{ detail.groupName }}</span>
|
</p>
|
<span
|
v-show="detail.is_manager"
|
class="more"
|
@click="isShowManager = true"
|
>管理
|
</span>
|
</div>
|
|
<div class="list-item">
|
<span>群主:</span>
|
<span class="group-boss-name">{{ detail.groupOwner }}</span>
|
</div>
|
|
<div class="list-item">
|
<span>我的群昵称:</span>
|
<span v-if="!isEditRemark" class="edit-visit-card">
|
<span>
|
{{ detail.visitCard }}
|
<span v-show="!detail.visitCard" style="font-size: 12px">
|
添加群名片
|
</span>
|
</span>
|
<i
|
class="el-icon-edit-outline edit-remark-icon"
|
@click="
|
isEditRemark = true
|
editRemarkText = detail.visitCard
|
"
|
/>
|
</span>
|
<span v-else>
|
<input
|
v-model.trim="editRemarkText"
|
class="edit-input"
|
type="text"
|
v-focus
|
@keyup.enter="editRemark"
|
/>
|
<span class="input-submit" @click="editRemark">确认</span>
|
</span>
|
</div>
|
|
<div class="list-item flex">
|
<span>消息免打扰:</span>
|
<el-switch
|
v-model="detail.is_disturb"
|
inactive-color="#e0d6d6"
|
:disabled="disturbDisabled"
|
@change="editDisturb"
|
/>
|
</div>
|
|
<!-- 预留 -->
|
<div class="list-item flex">
|
<span>全员禁言:</span>
|
<el-switch v-model="detail.no_message" inactive-color="#e0d6d6" />
|
</div>
|
|
<div class="list-item">
|
<span>群成员:</span>
|
<span>{{ members.length }} 人</span>
|
</div>
|
|
<div class="list-item-tips">群主已开启“新成员入群可查看所有聊天记录”</div>
|
|
<div class="list-item">群简介</div>
|
|
<div class="list-item-tips">
|
{{ detail.profile ? detail.profile : '暂无群简介' }}
|
</div>
|
|
<div class="list-item flex">
|
<span>群公告</span>
|
<span
|
v-show="detail.group_notice"
|
class="more"
|
@click="isShowGroupNotice = true"
|
>更多
|
</span>
|
</div>
|
|
<div class="list-item-tips group-notice">
|
<span v-if="detail.group_notice.title">
|
<b>#{{ detail.group_notice.title }}#</b><br />
|
{{ detail.group_notice.content }}
|
</span>
|
<span v-else>暂无群公告</span>
|
</div>
|
|
<div class="list-item">
|
<p class="group-invite" @click="addGroupMembers">
|
<i class="el-icon-plus" />
|
<span> 邀请好友</span>
|
</p>
|
</div>
|
|
<div class="list-item">
|
<div class="member-box">
|
<div class="view-box">
|
<i class="iconfont icon-sousuo i-sousuo" />
|
<input type="text" placeholder="搜索群成员" v-model="keywords" />
|
</div>
|
|
<el-row class="row-header">
|
<el-col :span="11">昵称</el-col>
|
<el-col :span="8">名片</el-col>
|
<el-col :span="5">性别</el-col>
|
</el-row>
|
|
<template v-if="searchs.length == 0">
|
<el-row class="row-items">
|
<el-col :span="24">
|
<p style="text-align:center;">无数据</p>
|
</el-col>
|
</el-row>
|
</template>
|
<template v-else>
|
<el-row
|
v-for="member in searchs"
|
:key="member.user_id"
|
class="row-items"
|
@click.native="openUserDetail(member.user_id)"
|
>
|
<el-col :span="11">
|
<img
|
width="20px"
|
:src="member.avatar"
|
:onerror="$store.state.detaultAvatar"
|
/>
|
<span class="nickname">{{ member.nickname }}</span>
|
</el-col>
|
<el-col :span="8">
|
<span>{{ member.user_card ? member.user_card : '-' }}</span>
|
</el-col>
|
<el-col :span="5">
|
<span v-if="member.gender == 1">男</span>
|
<span v-else-if="member.gender == 2">女</span>
|
<span v-else>未知</span>
|
</el-col>
|
</el-row>
|
</template>
|
</div>
|
</div>
|
</el-main>
|
|
<el-footer class="footer">
|
<button v-if="detail.is_manager" @click="dismiss">解散群聊</button>
|
<button v-else @click="isShowSignout = true">退出该群聊</button>
|
</el-footer>
|
|
<!-- 退群提示层 -->
|
<div class="signout-box no-select" v-show="isShowSignout">
|
<p v-show="signoutStatus == 0">您确认退出当前群聊吗?</p>
|
<p v-show="signoutStatus == 0">退群后群聊信息将不能查看</p>
|
<p v-show="signoutStatus == 0" class="signout-btn">
|
<button @click="signout">确认</button>
|
<button @click="isShowSignout = false">取消</button>
|
</p>
|
|
<p v-show="signoutStatus == 1" class="signout-btn mt38">
|
<span style="color: #ccc">
|
<i class="el-icon-loading" />
|
正在退出群聊...
|
</span>
|
</p>
|
|
<p v-show="signoutStatus == 2" class="signout-btn mt38">
|
<span style="color: #cccccc">退出群聊失败,请3(s)后再试...</span>
|
</p>
|
|
<p v-show="signoutStatus == 3" class="signout-btn mt38">
|
<span style="color: #339e19">
|
<i class="iconfont icon-success_no_circle" /> 已成功退出群聊...
|
</span>
|
</p>
|
</div>
|
|
<!-- 邀请好友组件 -->
|
<transition name="el-fade-in-linear">
|
<GroupLaunch
|
v-if="inviteFriendBox"
|
:group-id="groupId"
|
@close="inviteFriendBox = false"
|
@invite-success="inviteSuccess"
|
/>
|
</transition>
|
|
<!-- 群管理组件 -->
|
<transition name="el-fade-in-linear">
|
<GroupManage
|
v-if="isShowManager"
|
:group-id="groupId"
|
@close="isShowManager = false"
|
/>
|
</transition>
|
|
<!-- 群公告组件 -->
|
<transition name="el-fade-in-linear">
|
<GroupNotice
|
v-if="isShowGroupNotice"
|
:group-id="groupId"
|
@close="isShowGroupNotice = false"
|
/>
|
</transition>
|
</el-container>
|
</template>
|
<script>
|
import { ServeSetNotDisturb } from '@/api/chat'
|
import {
|
ServeGroupDetail,
|
ServeUpdateGroupCard,
|
ServeSecedeGroup,
|
ServeGetGroupMembers,
|
} from '@/api/group'
|
|
//创建群聊组件
|
import GroupLaunch from '@/components/group/GroupLaunch'
|
import GroupManage from '@/components/group/GroupManage'
|
import GroupNotice from '@/components/group/GroupNotice'
|
|
export default {
|
name: 'GroupPanel',
|
components: {
|
GroupLaunch,
|
GroupManage,
|
GroupNotice,
|
},
|
props: {
|
groupId: {
|
type: [String, Number],
|
default: null,
|
},
|
},
|
data() {
|
return {
|
detail: {
|
groupAvatar: '',
|
groupId: 0,
|
groupName: '',
|
groupOwner: '',
|
profile: '',
|
is_disturb: 0,
|
no_message: false,
|
visitCard: '',
|
is_manager: false,
|
group_notice: [],
|
},
|
|
keywords: '',
|
members: [],
|
|
isEditRemark: false,
|
editRemarkText: '',
|
|
inviteFriendBox: false,
|
isShowSignout: false,
|
|
signoutStatus: 0,
|
|
disturbDisabled: false,
|
|
// 是否显示群管理窗口
|
isShowManager: false,
|
|
// 是否显示群公告窗口
|
isShowGroupNotice: false,
|
}
|
},
|
watch: {
|
groupId: function(value) {
|
if (value > 0) {
|
this.loadGroupDetail()
|
this.loadMembers()
|
}
|
},
|
},
|
computed: {
|
searchs() {
|
return this.keywords == ''
|
? this.members
|
: this.members.filter(item => {
|
return (
|
item.nickname.match(this.keywords) != null ||
|
item.user_card.match(this.keywords) != null
|
)
|
})
|
},
|
},
|
created() {
|
if (parseInt(this.groupId) > 0) {
|
this.loadGroupDetail()
|
this.loadMembers()
|
}
|
},
|
methods: {
|
// 加载群组成员列表
|
loadMembers() {
|
ServeGetGroupMembers({
|
group_id: this.groupId,
|
}).then(res => {
|
if (res.code == 200) {
|
this.members = res.data
|
this.$emit('group-info', {
|
group_id: this.members.groupId,
|
members_num: this.members.length,
|
})
|
}
|
})
|
},
|
|
// 加载群信息
|
loadGroupDetail() {
|
this.isEditRemark = false
|
ServeGroupDetail({
|
group_id: this.groupId,
|
}).then(res => {
|
if (res.code == 200) {
|
let result = res.data
|
this.detail.groupAvatar = result.avatar
|
this.detail.groupId = result.group_id
|
this.detail.userId = res.data.user_id
|
this.detail.groupName = result.group_name
|
this.detail.groupOwner = result.manager_nickname
|
this.detail.profile = result.profile
|
this.detail.is_disturb = result.is_disturb == 1
|
this.detail.visitCard = result.visit_card
|
this.detail.is_manager = result.is_manager
|
|
if (result.notice) {
|
this.detail.group_notice = result.notice
|
}
|
}
|
})
|
},
|
|
// 设置群免打扰状态
|
editDisturb(value) {
|
this.disturbDisabled = true
|
ServeSetNotDisturb({
|
talk_type: 2,
|
receiver_id: parseInt(this.groupId),
|
is_disturb: value ? 1 : 0,
|
})
|
.then(res => {
|
if (res.code == 200) {
|
this.$emit('disturb-change', {
|
group_id: this.groupId,
|
status: value ? 1 : 0,
|
})
|
} else {
|
this.detail.is_disturb = value ? 0 : 1
|
}
|
})
|
.catch(() => {
|
this.detail.is_disturb = value ? 0 : 1
|
})
|
.finally(() => {
|
this.disturbDisabled = false
|
})
|
},
|
|
// 设置用户群名片
|
editRemark() {
|
if (this.editRemarkText == '') {
|
this.isEditRemark = false
|
return
|
}
|
|
if (this.detail.visitCard == this.editRemarkText) {
|
this.isEditRemark = false
|
return
|
}
|
|
ServeUpdateGroupCard({
|
group_id: parseInt(this.groupId),
|
visit_card: this.editRemarkText,
|
}).then(res => {
|
if (res.code == 200) {
|
this.isEditRemark = false
|
this.detail.visitCard = this.editRemarkText
|
}
|
})
|
},
|
|
// 查看用户信息
|
openUserDetail(user_id) {
|
this.$user(user_id)
|
},
|
|
// 邀请好友加入群聊
|
addGroupMembers() {
|
sessionStorage.setItem('invite_group_id', this.detail.groupId)
|
this.inviteFriendBox = true
|
},
|
|
// 邀请好友成功之后的回调事件
|
inviteSuccess() {
|
this.inviteFriendBox = false
|
this.loadMembers()
|
|
this.$notify({
|
title: '邀请成功',
|
message: `好友已成功加入群组...`,
|
type: 'success',
|
})
|
},
|
|
// 发送群聊
|
sendGroup() {
|
this.$emit('send-group', this.detail.groupId)
|
},
|
|
// 退出群操操作
|
signout() {
|
this.signoutStatus = 1
|
ServeSecedeGroup({
|
group_id: this.detail.groupId,
|
})
|
.then(res => {
|
if (res.code == 200) {
|
this.signoutStatus = 3
|
setTimeout(() => {
|
this.signoutStatus = 0
|
this.isShowSignout = false
|
this.$emit('quit-group')
|
}, 1500)
|
} else {
|
this.signoutStatus = 2
|
setTimeout(() => {
|
this.signoutStatus = 0
|
}, 3000)
|
}
|
})
|
.catch(() => {
|
this.signoutStatus = 2
|
setTimeout(() => {
|
this.signoutStatus = 0
|
}, 3000)
|
})
|
},
|
|
// 解散群组
|
dismiss() {
|
this.$confirm(`你确定要解散当前群组吗?此操作是不可恢复的!`, '提示', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning',
|
center: true,
|
dangerouslyUseHTMLString: true,
|
}).then(() => {})
|
},
|
},
|
}
|
</script>
|
<style lang="less" scoped>
|
.container {
|
height: 100%;
|
|
.header {
|
height: 60px;
|
line-height: 60px;
|
padding: 0;
|
text-align: center;
|
box-shadow: -1px 0px 5px 0px #cccccc45;
|
position: relative;
|
|
span {
|
font-size: 16px;
|
font-weight: 400;
|
}
|
|
.icon-send {
|
position: absolute;
|
left: 15px;
|
top: 22px;
|
font-size: 18px;
|
cursor: pointer;
|
}
|
|
.el-icon-close {
|
position: absolute;
|
right: 15px;
|
top: 22px;
|
font-size: 18px;
|
cursor: pointer;
|
}
|
}
|
|
.main {
|
padding: 0;
|
}
|
}
|
|
.list-item {
|
position: relative;
|
padding: 16px 16px 0;
|
min-height: 18px;
|
font-size: 14px;
|
|
&.flex {
|
display: flex;
|
justify-content: space-between;
|
}
|
|
.edit-visit-card {
|
position: initial;
|
color: #a29f9f;
|
}
|
|
.edit-remark-icon {
|
margin-left: 5px;
|
color: rgb(169, 184, 187);
|
position: absolute;
|
top: 20px;
|
cursor: pointer;
|
}
|
|
.edit-input {
|
width: 46%;
|
height: 25px;
|
line-height: 25px;
|
border: 1px solid #92cbff;
|
padding-left: 5px;
|
border-radius: 3px;
|
}
|
|
.input-submit {
|
width: 55px;
|
text-align: center;
|
height: 25px;
|
line-height: 25px;
|
background-color: #008cee;
|
border-radius: 2px;
|
display: inline-block;
|
color: #fff !important;
|
font-size: 12px;
|
margin-left: 10px;
|
cursor: pointer;
|
}
|
|
.group-setting-title {
|
max-width: 250px;
|
display: inline-block;
|
overflow: hidden;
|
white-space: nowrap;
|
text-overflow: ellipsis;
|
vertical-align: bottom;
|
}
|
|
.group-boss-name {
|
display: inline-block;
|
overflow: hidden;
|
text-overflow: ellipsis;
|
white-space: nowrap;
|
word-wrap: normal;
|
max-width: 180px;
|
position: relative;
|
top: 4px;
|
}
|
|
.group-invite {
|
height: 30px;
|
line-height: 30px;
|
text-align: center;
|
color: #877272;
|
cursor: pointer;
|
border-radius: 2px;
|
border: 1px dashed #d9bbbb;
|
font-size: 13px;
|
transition: all 0.5s ease-in-out;
|
&:hover {
|
color: #ff5722;
|
border-color: #ff5722;
|
transform: scale(1.01);
|
}
|
}
|
|
.more {
|
color: #409eff;
|
cursor: pointer;
|
font-size: 12px;
|
}
|
}
|
|
.list-item-tips {
|
font-size: 12px;
|
color: #b1b1b1;
|
margin-top: 5px;
|
padding-left: 16px;
|
padding-right: 16px;
|
font-weight: 300;
|
overflow: hidden;
|
word-break: break-word;
|
}
|
|
.group-notice {
|
line-height: 22px;
|
}
|
|
.member-box {
|
min-height: 180px;
|
padding: 10px;
|
margin-bottom: 20px;
|
border: 1px solid #ecebeb;
|
border-radius: 3px;
|
|
.view-box {
|
width: 100%;
|
height: 30px;
|
margin-top: 20px;
|
margin-bottom: 15px;
|
position: relative;
|
|
input {
|
width: calc(100% - 40px);
|
height: 30px;
|
line-height: 28px;
|
border-radius: 3px;
|
border: 1px solid #f1e9e9;
|
color: #b3b0b0;
|
font-size: 13px;
|
padding: 0 10px 0 30px;
|
|
&::-webkit-input-placeholder {
|
color: #ccc9c9;
|
font-size: 13px;
|
}
|
}
|
|
.i-sousuo {
|
color: rgb(179, 176, 176);
|
position: absolute;
|
left: 10px;
|
top: 9px;
|
}
|
|
span {
|
position: relative;
|
|
i {
|
font-size: 24px;
|
top: -3px;
|
left: 10px;
|
position: absolute;
|
color: #ccc;
|
}
|
}
|
}
|
|
.row-header {
|
width: 100%;
|
height: 30px;
|
margin-bottom: 10px;
|
border-bottom: 1px solid #e0dddd;
|
|
div {
|
height: 30px;
|
line-height: 30px;
|
|
&:nth-child(2) {
|
text-align: center;
|
}
|
|
&:nth-child(3) {
|
text-align: right;
|
}
|
}
|
}
|
|
.row-items {
|
width: 100%;
|
height: 30px;
|
margin-bottom: 3px;
|
font-size: 12px;
|
cursor: pointer;
|
|
&:hover {
|
background: #f6f6f6;
|
}
|
|
div {
|
height: 30px;
|
line-height: 30px;
|
|
&:nth-child(2) {
|
text-align: center;
|
}
|
|
&:nth-child(3) {
|
text-align: right;
|
}
|
}
|
|
img {
|
display: inline-block;
|
border-radius: 50%;
|
position: relative;
|
top: 4px;
|
}
|
|
.nickname {
|
margin-left: 5px;
|
&:hover {
|
color: #3685d6;
|
}
|
}
|
}
|
}
|
|
.signout-box {
|
width: 100%;
|
height: 100px;
|
background: #ffffff;
|
position: absolute;
|
z-index: 2;
|
bottom: 0;
|
box-shadow: -1px -3px 11px 0px #cccccc82;
|
-webkit-animation: showFooter 0.35s ease-in-out;
|
-moz-animation: showFooter 0.35s ease-in-out;
|
animation: showFooter 0.35s ease-in-out;
|
|
p {
|
&:first-child {
|
text-align: center;
|
height: 35px;
|
line-height: 35px;
|
}
|
|
&:nth-child(2) {
|
text-align: center;
|
font-size: 12px;
|
color: #cccccc;
|
}
|
}
|
|
.mt38 {
|
margin-top: 38px;
|
}
|
}
|
|
.signout-btn {
|
text-align: center;
|
margin-top: 10px;
|
|
button {
|
height: 30px;
|
width: 90px;
|
line-height: 30px;
|
background: #007fbb;
|
border-radius: 3px;
|
cursor: pointer;
|
font-size: 14px;
|
|
&:first-child {
|
background: #ff3333;
|
color: white;
|
}
|
|
&:last-child {
|
background: #f1eded;
|
}
|
}
|
}
|
|
.container .footer {
|
height: 60px;
|
padding: 0;
|
line-height: 60px;
|
text-align: center;
|
background-color: #f8f8f8;
|
|
button {
|
width: 180px;
|
height: 35px;
|
line-height: 35px;
|
background: #ed3c3b;
|
border-radius: 3px;
|
color: white;
|
cursor: pointer;
|
font-size: 12px;
|
margin: auto auto;
|
|
&:active {
|
background: #f5b8b8;
|
}
|
}
|
}
|
|
@keyframes showFooter {
|
0% {
|
transform: translateY(75px);
|
}
|
|
to {
|
transform: translateY(0);
|
}
|
}
|
|
@-webkit-keyframes showFooter {
|
0% {
|
-webkit-transform: translateY(75px);
|
}
|
|
to {
|
-webkit-transform: translateY(0);
|
}
|
}
|
</style>
|