♻️ refactor(im): 重命名 IM 模块中的多个类和文件以简化结构

im
YunaiV 2026-04-23 20:38:27 +08:00
parent 6d6515c06d
commit 6664afb851
8 changed files with 271 additions and 96 deletions

View File

@ -0,0 +1,45 @@
import request from '@/config/axios'
// IM 好友 Response VO
export interface ImFriendRespVO {
id: number // 关系记录编号
friendUserId: number // 好友的用户编号
muted?: boolean // 是否免打扰
status?: number // 好友状态0=正常1=已删除)
addTime?: string // 添加好友时间
deleteTime?: string // 删除好友时间
// 聚合字段(自 AdminUser
nickname?: string // 好友昵称
avatar?: string // 好友头像
}
// IM 好友更新 Request VO
export interface ImFriendUpdateReqVO {
friendUserId: number // 好友的用户编号
muted: boolean // 是否免打扰
}
// 获得当前登录用户的好友列表
export const getMyFriendList = () => {
return request.get<ImFriendRespVO[]>({ url: '/im/friend/list' })
}
// 获得好友详情
export const getFriend = (friendUserId: number | string) => {
return request.get<ImFriendRespVO>({ url: '/im/friend/get', params: { friendUserId } })
}
// 添加好友(双向建立关系)
export const addFriend = (friendUserId: number | string) => {
return request.post<boolean>({ url: '/im/friend/add', params: { friendUserId } })
}
// 删除好友(双向软删除)
export const deleteFriend = (friendUserId: number | string) => {
return request.delete<boolean>({ url: '/im/friend/delete', params: { friendUserId } })
}
// 更新好友信息(当前仅免打扰)
export const updateFriend = (data: ImFriendUpdateReqVO) => {
return request.put<boolean>({ url: '/im/friend/update', data })
}

53
src/api/im/group/index.ts Normal file
View File

@ -0,0 +1,53 @@
import request from '@/config/axios'
// 群 Response VO
export interface ImGroupRespVO {
id: number // 编号
name: string // 群名称
ownerUserId: number // 群主用户编号
avatar?: string // 群头像
notice?: string // 群公告
banned?: boolean // 是否封禁
bannedTime?: string // 封禁时间
status: number // 群状态0=正常1=已解散)
dissolvedTime?: string // 解散时间
createTime?: string // 创建时间
}
// 群创建 Request VO
export interface ImGroupCreateReqVO {
name: string // 群名称
}
// 群更新 Request VO
export interface ImGroupUpdateReqVO {
id: number // 群编号
name?: string // 群名称
avatar?: string // 群头像
notice?: string // 群公告
}
// 获得当前登录用户的群列表
export const getMyGroupList = () => {
return request.get<ImGroupRespVO[]>({ url: '/im/group/list' })
}
// 获得群详情
export const getGroup = (id: number | string) => {
return request.get<ImGroupRespVO>({ url: '/im/group/get', params: { id } })
}
// 创建群
export const createGroup = (data: ImGroupCreateReqVO) => {
return request.post<ImGroupRespVO>({ url: '/im/group/create', data })
}
// 更新群
export const updateGroup = (data: ImGroupUpdateReqVO) => {
return request.put<ImGroupRespVO>({ url: '/im/group/update', data })
}
// 解散群
export const dissolveGroup = (id: number | string) => {
return request.delete<boolean>({ url: '/im/group/dissolve', params: { id } })
}

View File

@ -0,0 +1,71 @@
import request from '@/config/axios'
// 群成员 Response VO
export interface ImGroupMemberRespVO {
id: number // 编号
groupId: number // 群编号
userId: number // 用户编号
displayUserName?: string // 组内显示名(群主设置的备注)
displayGroupName?: string // 群显示备注(当前用户对群的备注)
muted?: boolean // 是否免打扰
status?: number // 成员状态0=在群1=退群)
joinTime?: string // 入群时间
quitTime?: string // 退群时间
createTime?: string // 创建时间
// 聚合字段(自 AdminUser
nickname?: string // 用户昵称
avatar?: string // 用户头像
}
// 群成员邀请 Request VO
export interface ImGroupMemberInviteReqVO {
groupId: number // 群编号
memberUserIds: number[] // 被邀请的用户编号列表
}
// 群成员移除 Request VO
export interface ImGroupMemberRemoveReqVO {
groupId: number // 群编号
memberUserIds: number[] // 被移除的用户编号列表
}
// 群成员更新 Request VO
export interface ImGroupMemberUpdateReqVO {
groupId: number // 群编号
displayUserName?: string // 群内昵称
displayGroupName?: string // 群名备注
muted?: boolean // 是否免打扰
}
// 邀请用户加入群
export const inviteGroupMember = (data: ImGroupMemberInviteReqVO) => {
return request.post<boolean>({ url: '/im/group/invite', data })
}
// 退出群
export const quitGroup = (groupId: number | string) => {
return request.delete<boolean>({ url: '/im/group/quit', params: { groupId } })
}
// 移除群成员
export const removeGroupMember = (data: ImGroupMemberRemoveReqVO) => {
return request.delete<boolean>({ url: '/im/group/kicking', data })
}
// 获得群成员详情
export const getGroupMember = (id: number | string) => {
return request.get<ImGroupMemberRespVO>({ url: '/im/group-member/get', params: { id } })
}
// 获得指定群的成员列表(聚合 AdminUser 昵称 / 头像)
export const getGroupMemberList = (groupId: number | string) => {
return request.get<ImGroupMemberRespVO[]>({
url: '/im/group-member/list',
params: { groupId }
})
}
// 更新群成员
export const updateGroupMember = (data: ImGroupMemberUpdateReqVO) => {
return request.put<boolean>({ url: '/im/group-member/update', data })
}

View File

@ -1,30 +1,36 @@
import request from '@/config/axios'
// 群聊消息 Response VO
export interface ImGroupMessageRespVO {
id: number // 消息编号
clientMessageId: string // 客户端消息编号
senderId: number // 发送人编号
groupId: number // 群编号
type: number // 消息类型
content: string // 消息内容JSON 格式)
status: number // 消息状态
sendTime: string // 发送时间
atUserIds?: number[] // @ 目标用户编号列表
receiverUserIds?: number[] // 定向接收用户编号列表
receiptStatus?: number // 回执状态
readCount?: number // 已读人数(回执消息、且发送人为当前用户时有值)
}
// 群聊消息发送 Request VO
export interface ImGroupMessageSendReqVO {
clientMessageId: string // 客户端消息编号
groupId: number // 群编号
type: number // 消息类型
content: string // 消息内容
atUserIds?: number[] // @ 用户编号列表
receiverUserIds?: number[] // 定向接收用户编号列表
needReceipt?: boolean // 是否需要回执
content: string // 消息内容JSON 格式)
atUserIds?: number[] // @ 目标用户编号列表
receipt?: boolean // 是否需要回执
}
// 群聊消息 Response VO
export interface ImGroupMessageRespVO {
id: string // 消息编号
clientMessageId: string // 客户端消息编号
senderId: string // 发送人编号
groupId: string // 群编号
type: number // 消息类型
content: string // 消息内容
status: number // 消息状态
sendTime: string // 发送时间
atUserIds?: number[] // @ 用户编号列表
receiverUserIds?: number[] // 定向接收用户编号列表
receiptStatus?: number // 回执状态
readCount?: number // 已读人数
// 群聊历史消息列表 Request VO
export interface ImGroupMessageListReqVO {
groupId: number | string // 群编号
maxId?: number | string // 起始消息编号(不含),为空则从最新消息开始
limit: number // 拉取数量1 ~ 200
}
// 发送群聊消息
@ -32,22 +38,36 @@ export const sendGroupMessage = (data: ImGroupMessageSendReqVO) => {
return request.post<ImGroupMessageRespVO>({ url: '/im/message/group/send', data })
}
// 增量拉取群聊消息
export const pullGroupMessages = (params: { minId: string; size: number }) => {
// 拉取群聊消息(增量)
export const pullGroupMessages = (params: { minId: number | string; size: number }) => {
return request.get<ImGroupMessageRespVO[]>({ url: '/im/message/group/pull', params })
}
// 查询群聊历史消息
export const getGroupMessageList = (params: ImGroupMessageListReqVO) => {
return request.get<ImGroupMessageRespVO[]>({ url: '/im/message/group/list', params })
}
// 标记群聊消息已读
export const readGroupMessages = (groupId: string) => {
return request.put({ url: '/im/message/group/read', params: { groupId } })
export const readGroupMessages = (groupId: number | string, messageId: number | string) => {
return request.put<boolean>({
url: '/im/message/group/read',
params: { groupId, messageId }
})
}
// 撤回群聊消息
export const recallGroupMessage = (id: string) => {
return request.delete({ url: '/im/message/group/recall', params: { id } })
export const recallGroupMessage = (id: number | string) => {
return request.delete<ImGroupMessageRespVO>({
url: '/im/message/group/recall',
params: { id }
})
}
// 查询群消息已读用户列表
export const getGroupReadUsers = (params: { groupId: string; messageId: string }) => {
return request.get<string[]>({ url: '/im/message/group/read-users', params })
// 获取群消息已读用户列表
export const getGroupReadUsers = (params: {
groupId: number | string
messageId: number | string
}) => {
return request.get<number[]>({ url: '/im/message/group/read-users', params })
}

View File

@ -1,13 +1,5 @@
import request from '@/config/axios'
// 私聊消息发送 Request VO
export interface ImPrivateMessageSendReqVO {
clientMessageId: string // 客户端消息编号
receiverId: number // 接收人编号
type: number // 消息类型
content: string // 消息内容
}
// 私聊消息 Response VO
export interface ImPrivateMessageRespVO {
id: number // 消息编号
@ -15,27 +7,50 @@ export interface ImPrivateMessageRespVO {
senderId: number // 发送人编号
receiverId: number // 接收人编号
type: number // 消息类型
content: string // 消息内容
content: string // 消息内容JSON 格式)
status: number // 消息状态
sendTime: string // 发送时间
}
// 私聊消息发送 Request VO
export interface ImPrivateMessageSendReqVO {
clientMessageId: string // 客户端消息编号
receiverId: number // 接收人编号
type: number // 消息类型
content: string // 消息内容JSON 格式)
}
// 私聊历史消息列表 Request VO
export interface ImPrivateMessageListReqVO {
receiverId: number | string // 接收人编号(对方)
maxId?: number | string // 起始消息编号(不含),为空则从最新消息开始
limit: number // 拉取数量1 ~ 200
}
// 发送私聊消息
export const sendPrivateMessage = (data: ImPrivateMessageSendReqVO) => {
return request.post<ImPrivateMessageRespVO>({ url: '/im/message/private/send', data })
}
// 增量拉取私聊消息
export const pullPrivateMessages = (params: { minId: string; size: number }) => {
// 拉取私聊消息(增量)
export const pullPrivateMessages = (params: { minId: number | string; size: number }) => {
return request.get<ImPrivateMessageRespVO[]>({ url: '/im/message/private/pull', params })
}
// 查询私聊历史消息
export const getPrivateMessageList = (params: ImPrivateMessageListReqVO) => {
return request.get<ImPrivateMessageRespVO[]>({ url: '/im/message/private/list', params })
}
// 标记私聊消息已读
export const readPrivateMessages = (friendId: string) => {
return request.put({ url: '/im/message/private/read', params: { friendId } })
export const readPrivateMessages = (receiverId: number | string) => {
return request.put<boolean>({ url: '/im/message/private/read', params: { receiverId } })
}
// 撤回私聊消息
export const recallPrivateMessage = (id: string) => {
return request.delete({ url: '/im/message/private/recall', params: { id } })
export const recallPrivateMessage = (id: number | string) => {
return request.delete<ImPrivateMessageRespVO>({
url: '/im/message/private/recall',
params: { id }
})
}

View File

@ -1,39 +0,0 @@
import request from '@/config/axios'
/**
* IM API
*
* system
* - `GET /system/user/get-simple`
* - `GET /system/user/list-by-nickname`
* 使 `/system/user/profile/get`
*/
/** IM 用户精简信息(对齐后端 UserSimpleRespVO */
export interface ImUserSimpleRespVO {
id: number
nickname: string
avatar?: string
/** 0=未知 1=男 2=女 */
sex?: number
deptId?: number
deptName?: string
/** 是否在线(后端暂不支持,前端占位;后续由 WebSocket session 计算) */
online?: boolean
}
/** 按用户编号查询用户精简信息(点头像弹名片) */
export const getSimpleUser = (id: number | string) => {
return request.get<ImUserSimpleRespVO>({
url: '/system/user/get-simple',
params: { id }
})
}
/** 按昵称模糊搜索用户(加好友) */
export const getSimpleUserListByNickname = (nickname: string) => {
return request.get<ImUserSimpleRespVO[]>({
url: '/system/user/list-by-nickname',
params: { nickname }
})
}

View File

@ -17,6 +17,24 @@ export interface UserVO {
createTime: Date
}
// 获取用户精简信息列表
export const getSimpleUserList = (): Promise<UserVO[]> => {
return request.get({ url: '/system/user/simple-list' })
}
// 按用户编号查询用户精简信息(点头像弹名片)
export const getSimpleUser = (id: number | string) => {
return request.get<UserVO>({ url: '/system/user/get-simple', params: { id } })
}
// 按昵称模糊搜索用户(加好友)
export const getSimpleUserListByNickname = (nickname: string) => {
return request.get<UserVO[]>({
url: '/system/user/list-by-nickname',
params: { nickname }
})
}
// 查询用户管理列表
export const getUserPage = (params: PageParam) => {
return request.get({ url: '/system/user/page', params })
@ -36,7 +54,6 @@ export const getDeptUser = (id: number): Promise<UserVO[]> => {
return request.get({ url: '/system/user/simple-list?id=' + id })
}
// 查询用户详情
export const getUser = (id: number) => {
return request.get({ url: '/system/user/get?id=' + id })
@ -89,8 +106,3 @@ export const updateUserStatus = (id: number, status: number) => {
}
return request.put({ url: '/system/user/update-status', data: data })
}
// 获取用户精简信息列表
export const getSimpleUserList = (): Promise<UserVO[]> => {
return request.get({ url: '/system/user/simple-list' })
}

View File

@ -751,33 +751,31 @@ const remainingRouter: AppRouteRecordRaw[] = [
// 统一 /im 分组:下分 home聊天壳+ managerLayout 管理壳)
path: '/im',
name: 'Im',
redirect: '/im/home/message',
redirect: '/im/home/chat',
meta: { hidden: false, title: 'IM 即时通讯' },
children: [
{
// 聊天壳:全屏沉浸式应用,带 ToolBar + keep-alive
// hidden:true 不在 yudao 侧边栏菜单显示;三个子 Tab 通过内部 ToolBar 切换
path: 'home',
component: () => import('@/views/im/home/Index.vue'),
name: 'ImHome',
redirect: '/im/home/message',
redirect: '/im/home/chat',
meta: { hidden: true, title: '聊天' },
children: [
{
path: 'message',
component: () => import('@/views/im/home/pages/MessagePage.vue'),
name: 'ImHomeMessage',
path: 'chat',
component: () => import('@/views/im/home/pages/chat/MessagePage.vue'),
name: 'ImHomeChat',
meta: { hidden: true, title: '消息' }
},
{
path: 'friend',
component: () => import('@/views/im/home/pages/FriendPage.vue'),
component: () => import('@/views/im/home/pages/friend/FriendPage.vue'),
name: 'ImHomeFriend',
meta: { hidden: true, title: '好友' }
},
{
path: 'group',
component: () => import('@/views/im/home/pages/GroupPage.vue'),
component: () => import('@/views/im/home/pages/group/GroupPage.vue'),
name: 'ImHomeGroup',
meta: { hidden: true, title: '群聊' }
}