feat(im):群禁言功能(阶段三管理后台 UI)

1. group API 新增 mutedAll 字段 + 3 个禁言接口(muteAll、muteMember、cancelMuteMember)
2. group member API 新增 muteEndTime 字段
3. 管理后台群列表新增「全群禁言」列(已禁言/未禁言标签)
4. 群详情抽屉新增「全群禁言」状态行 + 成员表新增「禁言状态」列(禁言中 + 到期时间)
im
YunaiV 2026-05-05 16:58:51 +08:00
parent 4d006f8e73
commit 7b4c7028a0
5 changed files with 39 additions and 1 deletions

View File

@ -9,6 +9,7 @@ export interface ImGroupRespVO {
avatar?: string // 群头像
notice?: string // 群公告
banned?: boolean // 是否封禁
mutedAll?: boolean // 是否全群禁言
bannedTime?: string // 封禁时间
status: number // 群状态0=正常1=已解散)
dissolvedTime?: string // 解散时间
@ -97,3 +98,18 @@ export const pinGroupMessage = (data: ImGroupMessagePinReqVO) => {
export const unpinGroupMessage = (data: ImGroupMessagePinReqVO) => {
return request.put<boolean>({ url: '/im/group/unpin-message', data })
}
// 全群禁言 / 取消(仅群主 / 管理员可调)
export const muteAll = (data: { groupId: number; mutedAll: boolean }) => {
return request.put<boolean>({ url: '/im/group/mute-all', data })
}
// 禁言成员
export const muteMember = (data: { groupId: number; userId: number; mutedSeconds: number }) => {
return request.put<boolean>({ url: '/im/group/mute-member', data })
}
// 取消成员禁言
export const cancelMuteMember = (data: { groupId: number; userId: number }) => {
return request.put<boolean>({ url: '/im/group/cancel-mute-member', data })
}

View File

@ -12,6 +12,7 @@ export interface ImGroupMemberRespVO {
role?: number // 成员角色,参见 ImGroupMemberRole 枚举
joinTime?: string // 入群时间
quitTime?: string // 退群时间
muteEndTime?: string // 禁言到期时间
createTime?: string // 创建时间
// 聚合字段(自 AdminUser
nickname?: string // 用户昵称

View File

@ -10,6 +10,7 @@ export interface ImManagerGroupVO {
memberCount?: number
status: number
banned: boolean
mutedAll?: boolean // 是否全群禁言
bannedReason?: string
bannedTime?: Date
dissolvedTime?: Date
@ -27,6 +28,7 @@ export interface ImManagerGroupMemberVO {
role?: number // 成员角色,参见 ImGroupMemberRole 枚举
joinTime?: Date
quitTime?: Date
muteEndTime?: Date // 禁言到期时间
}
// 获得群分页

View File

@ -16,10 +16,14 @@
<el-descriptions-item label="群状态">
<dict-tag :type="DICT_TYPE.IM_GROUP_STATUS" :value="detail.status" />
</el-descriptions-item>
<el-descriptions-item label="封禁状态" :span="2">
<el-descriptions-item label="封禁状态">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="detail.banned" />
<span v-if="detail.banned" class="ml-5px text-gray-400">{{ detail.bannedReason }}</span>
</el-descriptions-item>
<el-descriptions-item label="全群禁言">
<el-tag v-if="detail.mutedAll" type="danger"></el-tag>
<el-tag v-else type="info">未禁言</el-tag>
</el-descriptions-item>
<el-descriptions-item label="群公告" :span="2">{{ detail.notice || '-' }}</el-descriptions-item>
<el-descriptions-item label="创建时间" :span="2">
{{ formatDate(detail.createTime) }}
@ -86,6 +90,15 @@
align="center"
:formatter="dateFormatter"
/>
<el-table-column label="禁言状态" width="170" align="center">
<template #default="{ row }">
<template v-if="row.muteEndTime && new Date(row.muteEndTime) > new Date()">
<el-tag type="danger">禁言中</el-tag>
<div class="text-xs text-gray-400 mt-2px">{{ formatDate(row.muteEndTime) }}</div>
</template>
<span v-else class="text-gray-400">-</span>
</template>
</el-table-column>
</el-table>
</el-drawer>
</template>

View File

@ -111,6 +111,12 @@
<dict-tag v-else :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="row.banned" />
</template>
</el-table-column>
<el-table-column label="全群禁言" align="center" prop="mutedAll" width="100">
<template #default="{ row }">
<el-tag v-if="row.mutedAll" type="danger"></el-tag>
<el-tag v-else type="info">未禁言</el-tag>
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"