diff --git a/src/api/im/friend/index.ts b/src/api/im/friend/index.ts new file mode 100644 index 000000000..8b3137381 --- /dev/null +++ b/src/api/im/friend/index.ts @@ -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({ url: '/im/friend/list' }) +} + +// 获得好友详情 +export const getFriend = (friendUserId: number | string) => { + return request.get({ url: '/im/friend/get', params: { friendUserId } }) +} + +// 添加好友(双向建立关系) +export const addFriend = (friendUserId: number | string) => { + return request.post({ url: '/im/friend/add', params: { friendUserId } }) +} + +// 删除好友(双向软删除) +export const deleteFriend = (friendUserId: number | string) => { + return request.delete({ url: '/im/friend/delete', params: { friendUserId } }) +} + +// 更新好友信息(当前仅免打扰) +export const updateFriend = (data: ImFriendUpdateReqVO) => { + return request.put({ url: '/im/friend/update', data }) +} diff --git a/src/api/im/group/index.ts b/src/api/im/group/index.ts new file mode 100644 index 000000000..705a57f09 --- /dev/null +++ b/src/api/im/group/index.ts @@ -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({ url: '/im/group/list' }) +} + +// 获得群详情 +export const getGroup = (id: number | string) => { + return request.get({ url: '/im/group/get', params: { id } }) +} + +// 创建群 +export const createGroup = (data: ImGroupCreateReqVO) => { + return request.post({ url: '/im/group/create', data }) +} + +// 更新群 +export const updateGroup = (data: ImGroupUpdateReqVO) => { + return request.put({ url: '/im/group/update', data }) +} + +// 解散群 +export const dissolveGroup = (id: number | string) => { + return request.delete({ url: '/im/group/dissolve', params: { id } }) +} diff --git a/src/api/im/group/member/index.ts b/src/api/im/group/member/index.ts new file mode 100644 index 000000000..33a112b29 --- /dev/null +++ b/src/api/im/group/member/index.ts @@ -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({ url: '/im/group/invite', data }) +} + +// 退出群 +export const quitGroup = (groupId: number | string) => { + return request.delete({ url: '/im/group/quit', params: { groupId } }) +} + +// 移除群成员 +export const removeGroupMember = (data: ImGroupMemberRemoveReqVO) => { + return request.delete({ url: '/im/group/kicking', data }) +} + +// 获得群成员详情 +export const getGroupMember = (id: number | string) => { + return request.get({ url: '/im/group-member/get', params: { id } }) +} + +// 获得指定群的成员列表(聚合 AdminUser 昵称 / 头像) +export const getGroupMemberList = (groupId: number | string) => { + return request.get({ + url: '/im/group-member/list', + params: { groupId } + }) +} + +// 更新群成员 +export const updateGroupMember = (data: ImGroupMemberUpdateReqVO) => { + return request.put({ url: '/im/group-member/update', data }) +} diff --git a/src/api/im/message/group/index.ts b/src/api/im/message/group/index.ts index 47dd0f007..84caab2ca 100644 --- a/src/api/im/message/group/index.ts +++ b/src/api/im/message/group/index.ts @@ -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({ 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({ url: '/im/message/group/pull', params }) } +// 查询群聊历史消息 +export const getGroupMessageList = (params: ImGroupMessageListReqVO) => { + return request.get({ 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({ + 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({ + url: '/im/message/group/recall', + params: { id } + }) } -// 查询群消息已读用户列表 -export const getGroupReadUsers = (params: { groupId: string; messageId: string }) => { - return request.get({ url: '/im/message/group/read-users', params }) +// 获取群消息已读用户列表 +export const getGroupReadUsers = (params: { + groupId: number | string + messageId: number | string +}) => { + return request.get({ url: '/im/message/group/read-users', params }) } diff --git a/src/api/im/message/private/index.ts b/src/api/im/message/private/index.ts index 3073d3741..bfbdbbcff 100644 --- a/src/api/im/message/private/index.ts +++ b/src/api/im/message/private/index.ts @@ -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({ 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({ url: '/im/message/private/pull', params }) } +// 查询私聊历史消息 +export const getPrivateMessageList = (params: ImPrivateMessageListReqVO) => { + return request.get({ 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({ 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({ + url: '/im/message/private/recall', + params: { id } + }) } diff --git a/src/api/im/user/index.ts b/src/api/im/user/index.ts deleted file mode 100644 index b9a92a0da..000000000 --- a/src/api/im/user/index.ts +++ /dev/null @@ -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({ - url: '/system/user/get-simple', - params: { id } - }) -} - -/** 按昵称模糊搜索用户(加好友) */ -export const getSimpleUserListByNickname = (nickname: string) => { - return request.get({ - url: '/system/user/list-by-nickname', - params: { nickname } - }) -} diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts index 51573eacb..cfbc5b4eb 100644 --- a/src/api/system/user/index.ts +++ b/src/api/system/user/index.ts @@ -17,6 +17,24 @@ export interface UserVO { createTime: Date } +// 获取用户精简信息列表 +export const getSimpleUserList = (): Promise => { + return request.get({ url: '/system/user/simple-list' }) +} + +// 按用户编号查询用户精简信息(点头像弹名片) +export const getSimpleUser = (id: number | string) => { + return request.get({ url: '/system/user/get-simple', params: { id } }) +} + +// 按昵称模糊搜索用户(加好友) +export const getSimpleUserListByNickname = (nickname: string) => { + return request.get({ + 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 => { 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 => { - return request.get({ url: '/system/user/simple-list' }) -} diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts index 4ff74f173..78b4dc98e 100644 --- a/src/router/modules/remaining.ts +++ b/src/router/modules/remaining.ts @@ -751,33 +751,31 @@ const remainingRouter: AppRouteRecordRaw[] = [ // 统一 /im 分组:下分 home(聊天壳)+ manager(Layout 管理壳) 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: '群聊' } }