From 24813f00f5cc95f6e527e49b633c16f7b54c03d7 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 17 Jun 2026 22:14:05 -0700 Subject: [PATCH] =?UTF-8?q?feat(im)=EF=BC=9Aantd=20=E7=9A=84=20im=20?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E8=BF=9B=E4=B8=80=E6=AD=A5=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/package.json | 3 - .../src/api/im/channel/material/index.ts | 35 +-- .../src/api/im/conversation/read/index.ts | 36 +-- apps/web-antd/src/api/im/face/pack/index.ts | 39 +-- .../src/api/im/face/useritem/index.ts | 55 +++-- apps/web-antd/src/api/im/friend/index.ts | 111 +++++---- .../src/api/im/friend/request/index.ts | 136 ++++++----- apps/web-antd/src/api/im/group/index.ts | 225 +++++++++--------- .../web-antd/src/api/im/group/member/index.ts | 120 +++++----- .../src/api/im/group/request/index.ts | 124 ++++++---- .../src/api/im/manager/channel/index.ts | 69 +++--- .../api/im/manager/channel/material/index.ts | 84 ++++--- .../api/im/manager/channel/message/index.ts | 66 ++--- .../src/api/im/manager/face/item/index.ts | 80 ++++--- .../src/api/im/manager/face/pack/index.ts | 69 +++--- .../src/api/im/manager/face/useritem/index.ts | 43 ++-- .../src/api/im/manager/friend/index.ts | 47 ++-- .../api/im/manager/friend/request/index.ts | 43 ++-- .../src/api/im/manager/group/index.ts | 121 ++++++---- .../src/api/im/manager/group/request/index.ts | 49 ++-- .../src/api/im/manager/message/group/index.ts | 56 +++-- .../api/im/manager/message/private/index.ts | 51 ++-- apps/web-antd/src/api/im/manager/rtc/index.ts | 81 ++++--- .../src/api/im/manager/sensitiveword/index.ts | 74 +++--- .../src/api/im/manager/statistics/index.ts | 126 ++++++---- .../src/api/im/message/channel/index.ts | 44 ++-- .../src/api/im/message/group/index.ts | 132 +++++----- .../src/api/im/message/private/index.ts | 122 ++++++---- apps/web-antd/src/api/im/rtc/index.ts | 150 +++++++----- apps/web-antd/src/api/system/user/index.ts | 21 ++ .../src/views/im/home/components/ToolBar.vue | 12 +- .../components/friend/FriendAddDialog.vue | 149 ++++++------ .../components/group/GroupAdminSetDialog.vue | 8 +- .../im/home/components/group/GroupAvatar.vue | 8 +- .../components/group/GroupCreateDialog.vue | 4 +- .../home/components/group/GroupInfoCard.vue | 23 +- .../components/group/GroupMemberAddDialog.vue | 4 +- .../group/GroupMemberRemoveDialog.vue | 5 +- .../group/GroupMuteMemberDialog.vue | 7 +- .../group/GroupOwnerTransferDialog.vue | 9 +- .../group/GroupRequestListDialog.vue | 36 +-- .../picker/ConversationPickerPanel.vue | 17 +- .../components/picker/FriendPickerPanel.vue | 6 +- .../picker/GroupMemberPickerPanel.vue | 6 +- .../home/components/rtc/RtcCallContainer.vue | 10 +- .../home/components/rtc/RtcCallIncoming.vue | 2 +- .../rtc/RtcCallMemberPickerDialog.vue | 15 +- .../im/home/components/rtc/RtcCallRunning.vue | 3 +- .../components/rtc/RtcGroupCallBanner.vue | 4 +- .../components/user/RecommendCardDialog.vue | 10 +- .../im/home/components/user/UserInfo.vue | 54 +++-- .../im/home/composables/useMediaUploader.ts | 20 +- .../im/home/composables/useMessagePuller.ts | 42 ++-- .../pages/contact/FriendRequestDetail.vue | 33 ++- .../home/pages/contact/FriendRequestList.vue | 3 +- .../src/views/im/home/pages/contact/index.vue | 8 +- .../conversation/ConversationGroupSide.vue | 52 ++-- .../conversation/ConversationItem.vue | 8 +- .../conversation/ConversationPrivateSide.vue | 13 +- .../components/input/FacePicker.vue | 37 ++- .../components/input/MentionPicker.vue | 2 +- .../components/input/MessageInput.vue | 64 +++-- .../input/MessageMultiSelectBar.vue | 10 +- .../components/input/VoiceRecorder.vue | 5 +- .../components/message/GroupPinnedMessage.vue | 4 +- .../message/GroupRequestPending.vue | 3 +- .../components/message/MaterialBubble.vue | 4 +- .../components/message/MessageBubble.vue | 36 ++- .../components/message/MessageHistory.vue | 17 +- .../components/message/MessageItem.vue | 32 ++- .../components/message/MessagePanel.vue | 15 +- .../components/message/ReplyPreview.vue | 3 +- .../message/forward/MessageForwardDialog.vue | 10 +- .../forward/MessageMergeDetailDialog.vue | 3 +- .../im/home/pages/conversation/index.vue | 11 +- .../src/views/im/home/store/channelStore.ts | 10 +- .../views/im/home/store/conversationStore.ts | 6 +- .../src/views/im/home/store/faceStore.ts | 22 +- .../src/views/im/home/store/friendStore.ts | 37 +-- .../views/im/home/store/groupRequestStore.ts | 29 +-- .../src/views/im/home/store/groupStore.ts | 32 +-- .../src/views/im/home/store/rtcStore.ts | 18 +- .../src/views/im/home/store/websocketStore.ts | 12 +- .../web-antd/src/views/im/home/types/index.ts | 20 +- .../views/im/manager/channel/list/index.vue | 8 +- .../im/manager/channel/list/modules/form.vue | 8 +- .../im/manager/channel/material/index.vue | 8 +- .../manager/channel/material/modules/form.vue | 8 +- .../im/manager/channel/message/index.vue | 6 +- .../im/manager/components/ChannelSelect.vue | 4 +- .../im/manager/components/GroupSelect.vue | 8 +- .../im/manager/components/MaterialSelect.vue | 4 +- .../src/views/im/manager/face/pack/index.vue | 12 +- .../im/manager/face/pack/modules/form.vue | 8 +- .../manager/face/pack/modules/item-drawer.vue | 16 +- .../manager/face/pack/modules/item-form.vue | 14 +- .../views/im/manager/face/userItem/index.vue | 6 +- .../src/views/im/manager/friend/index.vue | 6 +- .../views/im/manager/friend/request/index.vue | 4 +- .../src/views/im/manager/group/index.vue | 14 +- .../im/manager/group/modules/ban-form.vue | 4 +- .../views/im/manager/group/modules/detail.vue | 8 +- .../views/im/manager/group/request/index.vue | 4 +- .../manager/message/MessageContentPreview.vue | 22 +- .../src/views/im/manager/message/data.ts | 23 +- .../views/im/manager/message/group/index.vue | 6 +- .../manager/message/group/modules/detail.vue | 12 +- .../im/manager/message/private/index.vue | 6 +- .../message/private/modules/detail.vue | 19 +- .../src/views/im/manager/rtc/index.vue | 6 +- .../views/im/manager/rtc/modules/detail.vue | 8 +- .../views/im/manager/sensitiveword/index.vue | 10 +- .../im/manager/sensitiveword/modules/form.vue | 8 +- .../components/DistributionChart.vue | 5 +- .../statistics/components/OverviewCards.vue | 4 +- .../src/views/im/manager/statistics/index.vue | 4 +- apps/web-antd/src/views/im/utils/db.ts | 2 +- .../src/views/im/utils/message-feedback.ts | 102 -------- .../src/views/im/utils/system-user.ts | 30 --- apps/web-antd/src/views/im/utils/upload.ts | 24 -- apps/web-antd/src/views/im/utils/url.ts | 26 -- packages/@core/base/shared/src/utils/url.ts | 25 ++ packages/constants/src/dict-enum.ts | 7 +- pnpm-lock.yaml | 5 - 124 files changed, 2047 insertions(+), 1882 deletions(-) delete mode 100644 apps/web-antd/src/views/im/utils/message-feedback.ts delete mode 100644 apps/web-antd/src/views/im/utils/system-user.ts delete mode 100644 apps/web-antd/src/views/im/utils/upload.ts delete mode 100644 apps/web-antd/src/views/im/utils/url.ts diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index e7ad0fe5d..3a4fb40a8 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -70,8 +70,5 @@ "vue3-print-nb": "catalog:", "vue3-signature": "catalog:", "vuedraggable": "catalog:" - }, - "devDependencies": { - "vite": "catalog:" } } diff --git a/apps/web-antd/src/api/im/channel/material/index.ts b/apps/web-antd/src/api/im/channel/material/index.ts index c4f47a302..9f0338fd9 100644 --- a/apps/web-antd/src/api/im/channel/material/index.ts +++ b/apps/web-antd/src/api/im/channel/material/index.ts @@ -1,19 +1,24 @@ -// TODO @AI:api 的风格,要和 vben 保持一致; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// 用户端能看到的频道素材详情 -export interface ImChannelMaterialRespVO { - id: number - channelId: number - type: number - title: string - coverUrl?: string - summary?: string - content?: string - url?: string +export namespace ImChannelMaterialApi { + /** 用户端能看到的频道素材详情 */ + export interface Material { + id: number; + channelId: number; + type: number; + title: string; + coverUrl?: string; + summary?: string; + content?: string; + url?: string; + } } -// 获取频道素材详情;用于客户端点击图文卡片渲染详情页 -export const getChannelMaterial = (id: number) => { - return requestClient.get('/im/channel/material/get', { params: { id } }) + +/** 获取频道素材详情;用于客户端点击图文卡片渲染详情页 */ +export function getChannelMaterial(id: number) { + return requestClient.get( + '/im/channel/material/get', + { params: { id } }, + ); } diff --git a/apps/web-antd/src/api/im/conversation/read/index.ts b/apps/web-antd/src/api/im/conversation/read/index.ts index 455743d66..cc2d3a805 100644 --- a/apps/web-antd/src/api/im/conversation/read/index.ts +++ b/apps/web-antd/src/api/im/conversation/read/index.ts @@ -1,19 +1,25 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// IM 会话读位置 Response VO -export interface ImConversationReadRespVO { - id: number // 读位置编号(增量拉取游标用) - conversationType: number // 会话类型,参见 ImConversationType - targetId: number // 会话目标编号 - messageId: number // 最大已读消息编号 - updateTime?: number // 最近更新时间(毫秒时间戳,增量拉取游标用) +export namespace ImConversationReadApi { + /** IM 会话读位置 Response VO */ + export interface ConversationReadRespVO { + id: number; // 读位置编号(增量拉取游标用) + conversationType: number; // 会话类型,参见 ImConversationType + targetId: number; // 会话目标编号 + messageId: number; // 最大已读消息编号 + updateTime?: number; // 最近更新时间(毫秒时间戳,增量拉取游标用) + } } -// 增量拉取当前用户的会话读位置(重连 / 离线补偿) -export const pullMyConversationReadList = (params: { - lastId?: number - lastUpdateTime?: number - limit: number -}) => { - return requestClient.get('/im/conversation-read/pull', { params }) + +/** 增量拉取当前用户的会话读位置(重连 / 离线补偿) */ +export function pullMyConversationReadList(params: { + lastId?: number; + lastUpdateTime?: number; + limit: number; +}) { + return requestClient.get( + '/im/conversation-read/pull', + { params }, + ); } diff --git a/apps/web-antd/src/api/im/face/pack/index.ts b/apps/web-antd/src/api/im/face/pack/index.ts index 216883efa..58ad78103 100644 --- a/apps/web-antd/src/api/im/face/pack/index.ts +++ b/apps/web-antd/src/api/im/face/pack/index.ts @@ -1,23 +1,26 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// 用户端表情包项(精简版) -export interface ImFacePackUserItemVO { - id: number - url: string - name?: string - width: number - height: number +export namespace ImFacePackApi { + /** 用户端表情包项(精简版) */ + export interface FacePackUserItem { + id: number; + url: string; + name?: string; + width: number; + height: number; + } + + /** 用户端表情包 + 嵌套 items */ + export interface FacePackUser { + id: number; + name: string; + icon?: string; + items: FacePackUserItem[]; + } } -// 用户端表情包 + 嵌套 items -export interface ImFacePackUserVO { - id: number - name: string - icon?: string - items: ImFacePackUserItemVO[] -} -// 拉取所有启用的系统表情包(含表情列表) -export const getFacePackList = () => { - return requestClient.get('/im/face-pack/list') +/** 拉取所有启用的系统表情包(含表情列表) */ +export function getFacePackList() { + return requestClient.get('/im/face-pack/list'); } diff --git a/apps/web-antd/src/api/im/face/useritem/index.ts b/apps/web-antd/src/api/im/face/useritem/index.ts index 166605960..07bcf1c6a 100644 --- a/apps/web-antd/src/api/im/face/useritem/index.ts +++ b/apps/web-antd/src/api/im/face/useritem/index.ts @@ -1,33 +1,38 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// 个人表情 -export interface ImFaceUserItemVO { - id: number - url: string - name?: string - width: number - height: number +export namespace ImFaceUserItemApi { + /** 个人表情 */ + export interface FaceUserItem { + id: number; + url: string; + name?: string; + width: number; + height: number; + } + + /** 添加个人表情请求 */ + export interface FaceUserItemSaveReqVO { + url: string; + name?: string; + width: number; + height: number; + } } -// 添加个人表情请求 -export interface ImFaceUserItemSaveReqVO { - url: string - name?: string - width: number - height: number + +/** 获取我的个人表情列表 */ +export function getFaceUserItemList() { + return requestClient.get('/im/face-user-item/list'); } -// 获取我的个人表情列表 -export const getFaceUserItemList = () => { - return requestClient.get('/im/face-user-item/list') +/** 添加个人表情 */ +export function createFaceUserItem(data: ImFaceUserItemApi.FaceUserItemSaveReqVO) { + return requestClient.post('/im/face-user-item/create', data); } -// 添加个人表情 -export const createFaceUserItem = (data: ImFaceUserItemSaveReqVO) => { - return requestClient.post('/im/face-user-item/create', data) -} - -// 删除个人表情 -export const deleteFaceUserItem = (id: number) => { - return requestClient.delete('/im/face-user-item/delete', { params: { id } }) +/** 删除个人表情 */ +export function deleteFaceUserItem(id: number) { + return requestClient.delete('/im/face-user-item/delete', { + params: { id }, + }); } diff --git a/apps/web-antd/src/api/im/friend/index.ts b/apps/web-antd/src/api/im/friend/index.ts index d97fef9fe..481915878 100644 --- a/apps/web-antd/src/api/im/friend/index.ts +++ b/apps/web-antd/src/api/im/friend/index.ts @@ -1,65 +1,78 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// IM 好友 Response VO -export interface ImFriendRespVO { - id: number // 关系记录编号 - friendUserId: number // 好友的用户编号 - silent?: boolean // 是否免打扰 - displayName?: string // 好友展示备注(仅自己可见) - displayNamePinyin?: string // 备注的拼音(小写无空格,前端按首字母分桶 / 拼音搜索) - addSource?: number // 添加来源;参见 ImFriendAddSourceEnum - pinned?: boolean // 是否置顶联系人 - blocked?: boolean // 是否拉黑 - status?: number // 好友状态(0=正常,1=已删除) - addTime?: string // 添加好友时间 - deleteTime?: string // 删除好友时间 - updateTime?: number // 最近更新时间(毫秒时间戳,增量拉取游标用) - // 聚合字段(自 AdminUser) - nickname?: string // 好友昵称 - nicknamePinyin?: string // 昵称的拼音(小写无空格,前端按首字母分桶 / 拼音搜索) - avatar?: string // 好友头像 +export namespace ImFriendApi { + /** IM 好友 Response VO */ + export interface FriendRespVO { + id: number; // 关系记录编号 + friendUserId: number; // 好友的用户编号 + silent?: boolean; // 是否免打扰 + displayName?: string; // 好友展示备注(仅自己可见) + displayNamePinyin?: string; // 备注的拼音(小写无空格,前端按首字母分桶 / 拼音搜索) + addSource?: number; // 添加来源;参见 ImFriendAddSourceEnum + pinned?: boolean; // 是否置顶联系人 + blocked?: boolean; // 是否拉黑 + status?: number; // 好友状态(0=正常,1=已删除) + addTime?: string; // 添加好友时间 + deleteTime?: string; // 删除好友时间 + updateTime?: number; // 最近更新时间(毫秒时间戳,增量拉取游标用) + nickname?: string; // 好友昵称 + nicknamePinyin?: string; // 昵称的拼音(小写无空格,前端按首字母分桶 / 拼音搜索) + avatar?: string; // 好友头像 + } + + /** IM 好友更新 Request VO */ + export interface FriendUpdateReqVO { + friendUserId: number; // 好友的用户编号 + silent?: boolean; // 是否免打扰 + displayName?: string; // 好友展示备注 + pinned?: boolean; // 是否置顶联系人 + } } -// IM 好友更新 Request VO -export interface ImFriendUpdateReqVO { - friendUserId: number // 好友的用户编号 - silent?: boolean // 是否免打扰 - displayName?: string // 好友展示备注 - pinned?: boolean // 是否置顶联系人 + +/** 获得当前登录用户的好友列表 */ +export function getMyFriendList() { + return requestClient.get('/im/friend/list'); } -// 获得当前登录用户的好友列表 -export const getMyFriendList = () => { - return requestClient.get('/im/friend/list') +/** 增量拉取当前用户的好友关系(重连 / 离线补偿) */ +export function pullMyFriendList(params: { + lastId?: number; + lastUpdateTime?: number; + limit: number; +}) { + return requestClient.get('/im/friend/pull', { params }); } -// 增量拉取当前用户的好友关系(重连 / 离线补偿) -export const pullMyFriendList = (params: { lastId?: number; lastUpdateTime?: number; limit: number }) => { - return requestClient.get('/im/friend/pull', { params }) +/** 获得好友详情 */ +export function getFriend(friendUserId: number | string) { + return requestClient.get('/im/friend/get', { + params: { friendUserId }, + }); } -// 获得好友详情 -export const getFriend = (friendUserId: number | string) => { - return requestClient.get('/im/friend/get', { params: { friendUserId } }) +/** 删除好友(单向软删除) */ +export function deleteFriend(friendUserId: number | string, clear: boolean) { + return requestClient.delete('/im/friend/delete', { + params: { friendUserId, clear }, + }); } -// 删除好友(单向软删除) -export const deleteFriend = (friendUserId: number | string, clear: boolean) => { - return requestClient.delete('/im/friend/delete', { params: { friendUserId, clear } }) +/** 更新好友信息(备注 / 免打扰 / 联系人置顶) */ +export function updateFriend(data: ImFriendApi.FriendUpdateReqVO) { + return requestClient.put('/im/friend/update', data); } -// 更新好友信息(备注 / 免打扰 / 联系人置顶) -export const updateFriend = (data: ImFriendUpdateReqVO) => { - return requestClient.put('/im/friend/update', data) +/** 拉黑好友(必须先是好友;单边屏蔽对方私聊消息) */ +export function blockFriend(friendUserId: number | string) { + return requestClient.put('/im/friend/block', undefined, { + params: { friendUserId }, + }); } -// 拉黑好友(必须先是好友;单边屏蔽对方私聊消息) -export const blockFriend = (friendUserId: number | string) => { - return requestClient.put('/im/friend/block', undefined, { params: { friendUserId } }) +/** 移出黑名单 */ +export function unblockFriend(friendUserId: number | string) { + return requestClient.put('/im/friend/unblock', undefined, { + params: { friendUserId }, + }); } - -// 移出黑名单 -export const unblockFriend = (friendUserId: number | string) => { - return requestClient.put('/im/friend/unblock', undefined, { params: { friendUserId } }) -} - diff --git a/apps/web-antd/src/api/im/friend/request/index.ts b/apps/web-antd/src/api/im/friend/request/index.ts index 1fa82786f..00c98f098 100644 --- a/apps/web-antd/src/api/im/friend/request/index.ts +++ b/apps/web-antd/src/api/im/friend/request/index.ts @@ -1,66 +1,84 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// IM 好友申请 Response VO -export interface ImFriendRequestRespVO { - id: number // 申请编号 - fromUserId: number // 发起方用户编号 - toUserId: number // 接收方用户编号 - handleResult: number // 处理结果;0=未处理;1=同意;2=拒绝 - applyContent?: string // 申请理由 - handleContent?: string // 处理理由(接收方拒绝时可选填) - addSource?: number // 添加来源;参见 ImFriendAddSourceEnum - handleTime?: string // 处理时间 - createTime: string // 申请创建时间 - updateTime?: number // 最近更新时间(毫秒时间戳,增量拉取游标用) - // 聚合字段(自 AdminUser) - fromNickname?: string // 发起方昵称 - fromAvatar?: string // 发起方头像 - toNickname?: string // 接收方昵称 - toAvatar?: string // 接收方头像 -} - -// IM 好友申请发起 Request VO -export interface ImFriendRequestApplyReqVO { - toUserId: number // 接收方用户编号 - applyContent?: string // 申请理由 - displayName?: string // 对接收方的备注(仅自己可见) - addSource?: number // 添加来源 -} - -// 发起好友申请 -export const applyFriendRequest = (data: ImFriendRequestApplyReqVO) => { - return requestClient.post('/im/friend-request/apply', data) -} - -// 同意好友申请 -export const agreeFriendRequest = (id: number | string) => { - return requestClient.put('/im/friend-request/agree', undefined, { params: { id } }) -} - -// 拒绝好友申请 -export const refuseFriendRequest = (id: number | string, handleContent?: string) => { - return requestClient.put('/im/friend-request/refuse', undefined, { params: { id, handleContent } }) -} - -// 查询「我相关」的好友申请列表(游标分页:传 maxId 加载更多) -export const getMyFriendRequestList = (limit: number, maxId?: number) => { - const params: Record = { limit } - if (maxId != null) { - params.maxId = maxId +export namespace ImFriendRequestApi { + /** IM 好友申请 Response VO */ + export interface FriendRequestRespVO { + id: number; // 申请编号 + fromUserId: number; // 发起方用户编号 + toUserId: number; // 接收方用户编号 + handleResult: number; // 处理结果;0=未处理;1=同意;2=拒绝 + applyContent?: string; // 申请理由 + handleContent?: string; // 处理理由(接收方拒绝时可选填) + addSource?: number; // 添加来源;参见 ImFriendAddSourceEnum + handleTime?: string; // 处理时间 + createTime: string; // 申请创建时间 + updateTime?: number; // 最近更新时间(毫秒时间戳,增量拉取游标用) + fromNickname?: string; // 发起方昵称 + fromAvatar?: string; // 发起方头像 + toNickname?: string; // 接收方昵称 + toAvatar?: string; // 接收方头像 + } + + /** IM 好友申请发起 Request VO */ + export interface FriendRequestApplyReqVO { + toUserId: number; // 接收方用户编号 + applyContent?: string; // 申请理由 + displayName?: string; // 对接收方的备注(仅自己可见) + addSource?: number; // 添加来源 } - return requestClient.get('/im/friend-request/list', { params }) } -// 增量拉取「我相关」的好友申请变更(重连 / 离线补偿) -export const pullMyFriendRequestList = (params: { - lastId?: number - lastUpdateTime?: number - limit: number -}) => { - return requestClient.get('/im/friend-request/pull', { params }) + +/** 发起好友申请 */ +export function applyFriendRequest(data: ImFriendRequestApi.FriendRequestApplyReqVO) { + return requestClient.post('/im/friend-request/apply', data); } -// 按 id 单查「我相关」的申请记录(带越权过滤;WebSocket 通知到达后用) -export const getMyFriendRequest = (id: number) => { - return requestClient.get('/im/friend-request/get', { params: { id } }) +/** 同意好友申请 */ +export function agreeFriendRequest(id: number | string) { + return requestClient.put('/im/friend-request/agree', undefined, { + params: { id }, + }); +} + +/** 拒绝好友申请 */ +export function refuseFriendRequest( + id: number | string, + handleContent?: string, +) { + return requestClient.put('/im/friend-request/refuse', undefined, { + params: { id, handleContent }, + }); +} + +/** 查询「我相关」的好友申请列表(游标分页:传 maxId 加载更多) */ +export function getMyFriendRequestList(limit: number, maxId?: number) { + const params: Record = { limit }; + if (maxId != null) { + params.maxId = maxId; + } + return requestClient.get( + '/im/friend-request/list', + { params }, + ); +} + +/** 增量拉取「我相关」的好友申请变更(重连 / 离线补偿) */ +export function pullMyFriendRequestList(params: { + lastId?: number; + lastUpdateTime?: number; + limit: number; +}) { + return requestClient.get( + '/im/friend-request/pull', + { params }, + ); +} + +/** 按 id 单查「我相关」的申请记录(带越权过滤;WebSocket 通知到达后用) */ +export function getMyFriendRequest(id: number) { + return requestClient.get( + '/im/friend-request/get', + { params: { id } }, + ); } diff --git a/apps/web-antd/src/api/im/group/index.ts b/apps/web-antd/src/api/im/group/index.ts index 8fe535a31..ed726ba21 100644 --- a/apps/web-antd/src/api/im/group/index.ts +++ b/apps/web-antd/src/api/im/group/index.ts @@ -1,139 +1,144 @@ -import type { ImGroupMessageRespVO } from '#/api/im/message/group' +import type { ImGroupMessageApi } from '#/api/im/message/group'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// 群 Response VO -export interface ImGroupRespVO { - id: number // 编号 - name: string // 群名称 - ownerUserId: number // 群主用户编号 - avatar?: string // 群头像 - notice?: string // 群公告 - banned?: boolean // 是否封禁 - mutedAll?: boolean // 是否全群禁言 - joinApproval?: boolean // 进群是否需群主 / 管理员审批 - bannedTime?: string // 封禁时间 - status: number // 群状态(0=正常,1=已解散) - dissolvedTime?: string // 解散时间 - createTime?: string // 创建时间 - pinnedMessages?: ImGroupMessageRespVO[] // 群置顶消息列表(后端关联回填,仅当登录用户是群成员时非空) - joinStatus?: number // 当前登录用户在该群的成员状态(参见 CommonStatusEnum:0 在群 / 1 已退群);历史退群群仍返回,供展示离线消息的群名 / 头像 +export namespace ImGroupApi { + /** 群 Response VO */ + export interface GroupRespVO { + id: number; // 编号 + name: string; // 群名称 + ownerUserId: number; // 群主用户编号 + avatar?: string; // 群头像 + notice?: string; // 群公告 + banned?: boolean; // 是否封禁 + mutedAll?: boolean; // 是否全群禁言 + joinApproval?: boolean; // 进群是否需群主 / 管理员审批 + bannedTime?: string; // 封禁时间 + status: number; // 群状态(0=正常,1=已解散) + dissolvedTime?: string; // 解散时间 + createTime?: string; // 创建时间 + pinnedMessages?: ImGroupMessageApi.GroupMessageRespVO[]; // 群置顶消息列表(后端关联回填,仅当登录用户是群成员时非空) + joinStatus?: number; // 当前登录用户在该群的成员状态(参见 CommonStatusEnum:0 在群 / 1 已退群);历史退群群仍返回,供展示离线消息的群名 / 头像 + } + + /** 群消息置顶 / 取消置顶 Request VO */ + export interface GroupMessagePinReqVO { + id: number; // 群编号 + messageId: number; // 消息编号 + } + + /** 群创建 Request VO */ + export interface GroupCreateReqVO { + name: string; // 群名称 + memberUserIds?: number[]; // 初始成员用户编号列表(建群同时邀请的好友,不含创建者自己) + joinApproval?: boolean; // 进群是否需审批;不传默认 false 自由进群 + } + + /** 群更新 Request VO */ + export interface GroupUpdateReqVO { + id: number; // 群编号 + name?: string; // 群名称 + avatar?: string; // 群头像 + notice?: string; // 群公告 + joinApproval?: boolean; // 进群是否需审批 + } + + /** 添加 / 撤销群管理员 Request VO */ + export interface GroupAdminReqVO { + id: number; // 群编号 + userIds: number[]; // 目标用户编号列表 + } + + /** 群主转让 Request VO */ + export interface GroupTransferOwnerReqVO { + id: number; // 群编号 + newOwnerUserId: number; // 新群主用户编号 + } + + /** 全群禁言 / 取消 Request VO */ + export interface GroupMuteAllReqVO { + id: number; // 群编号 + mutedAll: boolean; // 是否全群禁言 + } + + /** 成员禁言 Request VO */ + export interface GroupMuteMemberReqVO { + id: number; // 群编号 + userId: number; // 被禁言的用户编号 + mutedSeconds: number; // 禁言时长(秒),0 表示永久禁言 + } + + /** 取消成员禁言 Request VO */ + export interface GroupCancelMuteMemberReqVO { + id: number; // 群编号 + userId: number; // 被取消禁言的用户编号 + } } -// 群消息置顶 / 取消置顶 Request VO -export interface ImGroupMessagePinReqVO { - id: number // 群编号 - messageId: number // 消息编号 + +/** 获得当前登录用户的群列表 */ +export function getMyGroupList() { + return requestClient.get('/im/group/list'); } -// 群创建 Request VO -export interface ImGroupCreateReqVO { - name: string // 群名称 - memberUserIds?: number[] // 初始成员用户编号列表(建群同时邀请的好友,不含创建者自己) - joinApproval?: boolean // 进群是否需审批;不传默认 false 自由进群 +/** 获得群详情 */ +export function getGroup(id: number | string) { + return requestClient.get('/im/group/get', { params: { id } }); } -// 群更新 Request VO -export interface ImGroupUpdateReqVO { - id: number // 群编号 - name?: string // 群名称 - avatar?: string // 群头像 - notice?: string // 群公告 - joinApproval?: boolean // 进群是否需审批 +/** 创建群 */ +export function createGroup(data: ImGroupApi.GroupCreateReqVO) { + return requestClient.post('/im/group/create', data); } -// 添加 / 撤销群管理员 Request VO -export interface ImGroupAdminReqVO { - id: number // 群编号 - userIds: number[] // 目标用户编号列表 +/** 更新群 */ +export function updateGroup(data: ImGroupApi.GroupUpdateReqVO) { + return requestClient.put('/im/group/update', data); } -// 群主转让 Request VO -export interface ImGroupTransferOwnerReqVO { - id: number // 群编号 - newOwnerUserId: number // 新群主用户编号 +/** 解散群 */ +export function dissolveGroup(id: number | string) { + return requestClient.delete('/im/group/dissolve', { + params: { id }, + }); } -// 全群禁言 / 取消 Request VO -export interface ImGroupMuteAllReqVO { - id: number // 群编号 - mutedAll: boolean // 是否全群禁言 +/** 添加群管理员(仅群主可调) */ +export function addGroupAdmin(data: ImGroupApi.GroupAdminReqVO) { + return requestClient.put('/im/group/add-admin', data); } -// 成员禁言 Request VO -export interface ImGroupMuteMemberReqVO { - id: number // 群编号 - userId: number // 被禁言的用户编号 - mutedSeconds: number // 禁言时长(秒),0 表示永久禁言 +/** 撤销群管理员(仅群主可调) */ +export function removeGroupAdmin(data: ImGroupApi.GroupAdminReqVO) { + return requestClient.put('/im/group/remove-admin', data); } -// 取消成员禁言 Request VO -export interface ImGroupCancelMuteMemberReqVO { - id: number // 群编号 - userId: number // 被取消禁言的用户编号 +/** 转让群主(仅老群主可调;旧群主转让后降为普通成员) */ +export function transferGroupOwner(data: ImGroupApi.GroupTransferOwnerReqVO) { + return requestClient.put('/im/group/transfer-owner', data); } -// 获得当前登录用户的群列表 -export const getMyGroupList = () => { - return requestClient.get('/im/group/list') +/** 置顶群消息(仅群主 / 管理员可调) */ +export function pinGroupMessage(data: ImGroupApi.GroupMessagePinReqVO) { + return requestClient.put('/im/group/pin-message', data); } -// 获得群详情 -export const getGroup = (id: number | string) => { - return requestClient.get('/im/group/get', { params: { id } }) +/** 取消置顶群消息(仅群主 / 管理员可调) */ +export function unpinGroupMessage(data: ImGroupApi.GroupMessagePinReqVO) { + return requestClient.put('/im/group/unpin-message', data); } -// 创建群 -export const createGroup = (data: ImGroupCreateReqVO) => { - return requestClient.post('/im/group/create', data) +/** 全群禁言 / 取消(仅群主 / 管理员可调) */ +export function muteAll(data: ImGroupApi.GroupMuteAllReqVO) { + return requestClient.put('/im/group/mute-all', data); } -// 更新群 -export const updateGroup = (data: ImGroupUpdateReqVO) => { - return requestClient.put('/im/group/update', data) +/** 禁言成员 */ +export function muteMember(data: ImGroupApi.GroupMuteMemberReqVO) { + return requestClient.put('/im/group/mute-member', data); } -// 解散群 -export const dissolveGroup = (id: number | string) => { - return requestClient.delete('/im/group/dissolve', { params: { id } }) -} - -// 添加群管理员(仅群主可调) -export const addGroupAdmin = (data: ImGroupAdminReqVO) => { - return requestClient.put('/im/group/add-admin', data) -} - -// 撤销群管理员(仅群主可调) -export const removeGroupAdmin = (data: ImGroupAdminReqVO) => { - return requestClient.put('/im/group/remove-admin', data) -} - -// 转让群主(仅老群主可调;旧群主转让后降为普通成员) -export const transferGroupOwner = (data: ImGroupTransferOwnerReqVO) => { - return requestClient.put('/im/group/transfer-owner', data) -} - -// 置顶群消息(仅群主 / 管理员可调) -export const pinGroupMessage = (data: ImGroupMessagePinReqVO) => { - return requestClient.put('/im/group/pin-message', data) -} - -// 取消置顶群消息(仅群主 / 管理员可调) -export const unpinGroupMessage = (data: ImGroupMessagePinReqVO) => { - return requestClient.put('/im/group/unpin-message', data) -} - -// 全群禁言 / 取消(仅群主 / 管理员可调) -export const muteAll = (data: ImGroupMuteAllReqVO) => { - return requestClient.put('/im/group/mute-all', data) -} - -// 禁言成员 -export const muteMember = (data: ImGroupMuteMemberReqVO) => { - return requestClient.put('/im/group/mute-member', data) -} - -// 取消成员禁言 -export const cancelMuteMember = (data: ImGroupCancelMuteMemberReqVO) => { - return requestClient.put('/im/group/cancel-mute-member', data) +/** 取消成员禁言 */ +export function cancelMuteMember(data: ImGroupApi.GroupCancelMuteMemberReqVO) { + return requestClient.put('/im/group/cancel-mute-member', data); } diff --git a/apps/web-antd/src/api/im/group/member/index.ts b/apps/web-antd/src/api/im/group/member/index.ts index 563cad959..bd27a150f 100644 --- a/apps/web-antd/src/api/im/group/member/index.ts +++ b/apps/web-antd/src/api/im/group/member/index.ts @@ -1,70 +1,78 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// 群成员 Response VO -export interface ImGroupMemberRespVO { - id: number // 编号 - groupId: number // 群编号 - userId: number // 用户编号 - displayUserName?: string // 组内显示名(群主设置的备注) - groupRemark?: string // 群备注(当前用户对群的备注) - silent?: boolean // 是否免打扰 - status?: number // 成员状态(0=在群,1=退群) - role?: number // 成员角色,参见 ImGroupMemberRole 枚举 - joinTime?: string // 入群时间 - quitTime?: string // 退群时间 - muteEndTime?: string // 禁言到期时间 - createTime?: string // 创建时间 - // 聚合字段(自 AdminUser) - nickname?: string // 用户昵称 - avatar?: string // 用户头像 +export namespace ImGroupMemberApi { + /** 群成员 Response VO */ + export interface GroupMemberRespVO { + id: number; // 编号 + groupId: number; // 群编号 + userId: number; // 用户编号 + displayUserName?: string; // 组内显示名(群主设置的备注) + groupRemark?: string; // 群备注(当前用户对群的备注) + silent?: boolean; // 是否免打扰 + status?: number; // 成员状态(0=在群,1=退群) + role?: number; // 成员角色,参见 ImGroupMemberRole 枚举 + joinTime?: string; // 入群时间 + quitTime?: string; // 退群时间 + muteEndTime?: string; // 禁言到期时间 + createTime?: string; // 创建时间 + nickname?: string; // 用户昵称 + avatar?: string; // 用户头像 + } + + /** 群成员邀请 Request VO */ + export interface GroupMemberInviteReqVO { + groupId: number; // 群编号 + memberUserIds: number[]; // 被邀请的用户编号列表 + } + + /** 群成员移除 Request VO */ + export interface GroupMemberRemoveReqVO { + groupId: number; // 群编号 + memberUserIds: number[]; // 被移除的用户编号列表 + } + + /** 群成员更新 Request VO */ + export interface GroupMemberUpdateReqVO { + groupId: number; // 群编号 + displayUserName?: string; // 群内昵称 + groupRemark?: string; // 群备注 + silent?: boolean; // 是否免打扰 + } } -// 群成员邀请 Request VO -export interface ImGroupMemberInviteReqVO { - groupId: number // 群编号 - memberUserIds: number[] // 被邀请的用户编号列表 + +/** 邀请用户加入群 */ +export function inviteGroupMember(data: ImGroupMemberApi.GroupMemberInviteReqVO) { + return requestClient.post('/im/group/invite', data); } -// 群成员移除 Request VO -export interface ImGroupMemberRemoveReqVO { - groupId: number // 群编号 - memberUserIds: number[] // 被移除的用户编号列表 +/** 退出群 */ +export function quitGroup(groupId: number | string) { + return requestClient.delete('/im/group/quit', { + params: { groupId }, + }); } -// 群成员更新 Request VO -export interface ImGroupMemberUpdateReqVO { - groupId: number // 群编号 - displayUserName?: string // 群内昵称 - groupRemark?: string // 群备注 - silent?: boolean // 是否免打扰 +/** 移除群成员 */ +export function removeGroupMember(data: ImGroupMemberApi.GroupMemberRemoveReqVO) { + return requestClient.delete('/im/group/kicking', { data }); } -// 邀请用户加入群 -export const inviteGroupMember = (data: ImGroupMemberInviteReqVO) => { - return requestClient.post('/im/group/invite', data) +/** 获得群成员详情 */ +export function getGroupMember(groupId: number, userId: number) { + return requestClient.get('/im/group-member/get', { + params: { groupId, userId }, + }); } -// 退出群 -export const quitGroup = (groupId: number | string) => { - return requestClient.delete('/im/group/quit', { params: { groupId } }) +/** 获得指定群的成员列表(聚合 AdminUser 昵称 / 头像) */ +export function getGroupMemberList(groupId: number | string) { + return requestClient.get('/im/group-member/list', { + params: { groupId }, + }); } -// 移除群成员 -export const removeGroupMember = (data: ImGroupMemberRemoveReqVO) => { - return requestClient.delete('/im/group/kicking', { data }) -} - -// 获得群成员详情 -export const getGroupMember = (groupId: number, userId: number) => { - return requestClient.get('/im/group-member/get', { params: { groupId, userId } }) -} - -// 获得指定群的成员列表(聚合 AdminUser 昵称 / 头像) -export const getGroupMemberList = (groupId: number | string) => { - return requestClient.get('/im/group-member/list', { params: { groupId } }) -} - -// 更新群成员 -export const updateGroupMember = (data: ImGroupMemberUpdateReqVO) => { - return requestClient.put('/im/group-member/update', data) +/** 更新群成员 */ +export function updateGroupMember(data: ImGroupMemberApi.GroupMemberUpdateReqVO) { + return requestClient.put('/im/group-member/update', data); } diff --git a/apps/web-antd/src/api/im/group/request/index.ts b/apps/web-antd/src/api/im/group/request/index.ts index 91f4adfa7..09eaf24af 100644 --- a/apps/web-antd/src/api/im/group/request/index.ts +++ b/apps/web-antd/src/api/im/group/request/index.ts @@ -1,66 +1,90 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// IM 加群申请 Response VO -export interface ImGroupRequestRespVO { - id: number // 申请编号 - groupId: number // 群编号 - userId: number // 申请人 / 被邀请人用户编号 - inviterUserId?: number // 邀请人;NULL 表示用户主动申请 - handleResult: number // 处理结果;0=未处理;1=同意;2=拒绝 - applyContent?: string // 申请理由 - handleContent?: string // 处理理由(拒绝时可选填) - handleUserId?: number // 处理人用户编号 - addSource?: number // 加入来源;参见 ImGroupAddSourceEnum - handleTime?: string // 处理时间 - createTime: string // 申请创建时间 - updateTime?: number // 最近更新时间(毫秒时间戳,增量拉取游标用) - // 聚合字段 - userNickname?: string // 申请人 / 被邀请人昵称 - userAvatar?: string // 申请人 / 被邀请人头像 - inviterNickname?: string // 邀请人昵称 - inviterAvatar?: string // 邀请人头像 - groupName?: string // 群名称 - groupAvatar?: string // 群头像 +export namespace ImGroupRequestApi { + /** IM 加群申请 Response VO */ + export interface GroupRequestRespVO { + id: number; // 申请编号 + groupId: number; // 群编号 + userId: number; // 申请人 / 被邀请人用户编号 + inviterUserId?: number; // 邀请人;NULL 表示用户主动申请 + handleResult: number; // 处理结果;0=未处理;1=同意;2=拒绝 + applyContent?: string; // 申请理由 + handleContent?: string; // 处理理由(拒绝时可选填) + handleUserId?: number; // 处理人用户编号 + addSource?: number; // 加入来源;参见 ImGroupAddSourceEnum + handleTime?: string; // 处理时间 + createTime: string; // 申请创建时间 + updateTime?: number; // 最近更新时间(毫秒时间戳,增量拉取游标用) + userNickname?: string; // 申请人 / 被邀请人昵称 + userAvatar?: string; // 申请人 / 被邀请人头像 + inviterNickname?: string; // 邀请人昵称 + inviterAvatar?: string; // 邀请人头像 + groupName?: string; // 群名称 + groupAvatar?: string; // 群头像 + } + + /** IM 加群申请发起 Request VO */ + export interface GroupRequestApplyReqVO { + groupId: number; // 群编号 + applyContent?: string; // 申请理由 + addSource?: number; // 加入来源 + } } -// IM 加群申请发起 Request VO -export interface ImGroupRequestApplyReqVO { - groupId: number // 群编号 - applyContent?: string // 申请理由 - addSource?: number // 加入来源 + +/** 申请加群 */ +export function applyJoinGroup(data: ImGroupRequestApi.GroupRequestApplyReqVO) { + return requestClient.post('/im/group-request/apply', data); } -// 申请加群 -export const applyJoinGroup = (data: ImGroupRequestApplyReqVO) => { - return requestClient.post('/im/group-request/apply', data) +/** 同意加群申请(群主或管理员) */ +export function agreeGroupRequest(id: number | string) { + return requestClient.put('/im/group-request/agree', undefined, { + params: { id }, + }); } -// 同意加群申请(群主或管理员) -export const agreeGroupRequest = (id: number | string) => { - return requestClient.put('/im/group-request/agree', undefined, { params: { id } }) +/** 拒绝加群申请(群主或管理员) */ +export function refuseGroupRequest( + id: number | string, + handleContent?: string, +) { + return requestClient.put('/im/group-request/refuse', undefined, { + params: { id, handleContent }, + }); } -// 拒绝加群申请(群主或管理员) -export const refuseGroupRequest = (id: number | string, handleContent?: string) => { - return requestClient.put('/im/group-request/refuse', undefined, { params: { id, handleContent } }) +/** 查询「我管理的所有群」下的未处理加群申请列表(不分页);前端 store 据此派生横幅红点 + Drawer 列表 */ +export function getUnhandledRequestList() { + return requestClient.get( + '/im/group-request/unhandled-list', + ); } -// 查询「我管理的所有群」下的未处理加群申请列表(不分页);前端 store 据此派生横幅红点 + Drawer 列表 -export const getUnhandledRequestList = () => { - return requestClient.get('/im/group-request/unhandled-list') +/** 查询指定群下的全部加群申请(含已处理);仅群主 / 管理员可查 */ +export function getGroupRequestListByGroupId(groupId: number) { + return requestClient.get( + '/im/group-request/list-by-group', + { params: { groupId } }, + ); } -// 查询指定群下的全部加群申请(含已处理);仅群主 / 管理员可查 -export const getGroupRequestListByGroupId = (groupId: number) => { - return requestClient.get('/im/group-request/list-by-group', { params: { groupId } }) +/** 按 id 单查申请记录(带越权过滤;WebSocket 通知到达后用) */ +export function getMyGroupRequest(id: number) { + return requestClient.get( + '/im/group-request/get', + { params: { id } }, + ); } -// 按 id 单查申请记录(带越权过滤;WebSocket 通知到达后用) -export const getMyGroupRequest = (id: number) => { - return requestClient.get('/im/group-request/get', { params: { id } }) -} - -// 增量拉取我管理的所有群下加群申请变更(重连 / 离线补偿) -export const pullMyGroupRequestList = (params: { lastId?: number; lastUpdateTime?: number; limit: number }) => { - return requestClient.get('/im/group-request/pull', { params }) +/** 增量拉取我管理的所有群下加群申请变更(重连 / 离线补偿) */ +export function pullMyGroupRequestList(params: { + lastId?: number; + lastUpdateTime?: number; + limit: number; +}) { + return requestClient.get( + '/im/group-request/pull', + { params }, + ); } diff --git a/apps/web-antd/src/api/im/manager/channel/index.ts b/apps/web-antd/src/api/im/manager/channel/index.ts index c362a7e3c..a3bab1ab0 100644 --- a/apps/web-antd/src/api/im/manager/channel/index.ts +++ b/apps/web-antd/src/api/im/manager/channel/index.ts @@ -1,43 +1,56 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerChannelVO { - id: number - code: string - name: string - avatar?: string - sort: number - status: number - createTime?: Date +export namespace ImManagerChannelApi { + /** 频道 */ + export interface Channel { + id: number; + code: string; + name: string; + avatar?: string; + sort: number; + status: number; + createTime?: Date; + } } -// 获得频道分页 -export const getManagerChannelPage = (params: PageParam) => { - return requestClient.get('/im/manager/channel/page', { params }) + +/** 获得频道分页 */ +export function getManagerChannelPage(params: PageParam) { + return requestClient.get>( + '/im/manager/channel/page', + { params }, + ); } -// 获得频道详情 -export const getManagerChannel = (id: number) => { - return requestClient.get('/im/manager/channel/get', { params: { id } }) +/** 获得频道详情 */ +export function getManagerChannel(id: number) { + return requestClient.get('/im/manager/channel/get', { + params: { id }, + }); } -// 新增频道 -export const createManagerChannel = (data: ImManagerChannelVO) => { - return requestClient.post('/im/manager/channel/create', data) +/** 新增频道 */ +export function createManagerChannel(data: ImManagerChannelApi.Channel) { + return requestClient.post('/im/manager/channel/create', data); } -// 修改频道 -export const updateManagerChannel = (data: ImManagerChannelVO) => { - return requestClient.put('/im/manager/channel/update', data) +/** 修改频道 */ +export function updateManagerChannel(data: ImManagerChannelApi.Channel) { + return requestClient.put('/im/manager/channel/update', data); } -// 删除频道 -export const deleteManagerChannel = (id: number) => { - return requestClient.delete('/im/manager/channel/delete', { params: { id } }) +/** 删除频道 */ +export function deleteManagerChannel(id: number) { + return requestClient.delete('/im/manager/channel/delete', { + params: { id }, + }); } -// 获得启用的频道精简列表(表单选择用) -export const getSimpleChannelList = () => { - return requestClient.get('/im/manager/channel/simple-list') +/** 获得启用的频道精简列表(表单选择用) */ +export function getSimpleChannelList() { + return requestClient.get( + '/im/manager/channel/simple-list', + ); } diff --git a/apps/web-antd/src/api/im/manager/channel/material/index.ts b/apps/web-antd/src/api/im/manager/channel/material/index.ts index b910d43ea..a03995ca1 100644 --- a/apps/web-antd/src/api/im/manager/channel/material/index.ts +++ b/apps/web-antd/src/api/im/manager/channel/material/index.ts @@ -1,46 +1,68 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerChannelMaterialVO { - id: number - channelId: number - channelName?: string - type: number - title: string - coverUrl?: string - summary?: string - content?: string - url?: string - createTime?: Date +export namespace ImManagerChannelMaterialApi { + /** 频道素材 */ + export interface Material { + id: number; + channelId: number; + channelName?: string; + type: number; + title: string; + coverUrl?: string; + summary?: string; + content?: string; + url?: string; + createTime?: Date; + } } -// 获得素材分页 -export const getManagerChannelMaterialPage = (params: PageParam) => { - return requestClient.get('/im/manager/channel-material/page', { params }) + +/** 获得素材分页 */ +export function getManagerChannelMaterialPage(params: PageParam) { + return requestClient.get>( + '/im/manager/channel-material/page', + { params }, + ); } -// 获得指定频道下的素材精简列表 -export const getSimpleManagerChannelMaterialList = (channelId: number) => { - return requestClient.get('/im/manager/channel-material/simple-list', { params: { channelId } }) +/** 获得指定频道下的素材精简列表 */ +export function getSimpleManagerChannelMaterialList(channelId: number) { + return requestClient.get( + '/im/manager/channel-material/simple-list', + { params: { channelId } }, + ); } -// 获得素材详情 -export const getManagerChannelMaterial = (id: number) => { - return requestClient.get('/im/manager/channel-material/get', { params: { id } }) +/** 获得素材详情 */ +export function getManagerChannelMaterial(id: number) { + return requestClient.get( + '/im/manager/channel-material/get', + { params: { id } }, + ); } -// 新增素材 -export const createManagerChannelMaterial = (data: ImManagerChannelMaterialVO) => { - return requestClient.post('/im/manager/channel-material/create', data) +/** 新增素材 */ +export function createManagerChannelMaterial( + data: ImManagerChannelMaterialApi.Material, +) { + return requestClient.post('/im/manager/channel-material/create', data); } -// 修改素材 -export const updateManagerChannelMaterial = (data: ImManagerChannelMaterialVO) => { - return requestClient.put('/im/manager/channel-material/update', data) +/** 修改素材 */ +export function updateManagerChannelMaterial( + data: ImManagerChannelMaterialApi.Material, +) { + return requestClient.put( + '/im/manager/channel-material/update', + data, + ); } -// 删除素材 -export const deleteManagerChannelMaterial = (id: number) => { - return requestClient.delete('/im/manager/channel-material/delete', { params: { id } }) +/** 删除素材 */ +export function deleteManagerChannelMaterial(id: number) { + return requestClient.delete('/im/manager/channel-material/delete', { + params: { id }, + }); } diff --git a/apps/web-antd/src/api/im/manager/channel/message/index.ts b/apps/web-antd/src/api/im/manager/channel/message/index.ts index 56ceec4e9..ff31c8bc1 100644 --- a/apps/web-antd/src/api/im/manager/channel/message/index.ts +++ b/apps/web-antd/src/api/im/manager/channel/message/index.ts @@ -1,36 +1,48 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerChannelMessageVO { - id: number - channelId: number - channelName?: string - materialId: number - materialTitle?: string - materialCoverUrl?: string - type: number - content?: string - receiverUserIds?: number[] - sendTime?: Date +export namespace ImManagerChannelMessageApi { + /** 频道消息 */ + export interface ChannelMessage { + id: number; + channelId: number; + channelName?: string; + materialId: number; + materialTitle?: string; + materialCoverUrl?: string; + type: number; + content?: string; + receiverUserIds?: number[]; + sendTime?: Date; + } + + /** 频道消息发送请求 */ + export interface ChannelMessageSendReqVO { + materialId: number; + receiverUserIds?: number[]; + } } -export interface ImManagerChannelMessageSendReqVO { - materialId: number - receiverUserIds?: number[] + +/** 立即推送频道消息 */ +export function sendManagerChannelMessage( + data: ImManagerChannelMessageApi.ChannelMessageSendReqVO, +) { + return requestClient.post('/im/manager/channel-message/send', data); } -// 立即推送频道消息 -export const sendManagerChannelMessage = (data: ImManagerChannelMessageSendReqVO) => { - return requestClient.post('/im/manager/channel-message/send', data) +/** 删除频道消息 */ +export function deleteManagerChannelMessage(id: number) { + return requestClient.delete('/im/manager/channel-message/delete', { + params: { id }, + }); } -// 删除频道消息 -export const deleteManagerChannelMessage = (id: number) => { - return requestClient.delete('/im/manager/channel-message/delete', { params: { id } }) -} - -// 获得频道消息分页 -export const getManagerChannelMessagePage = (params: PageParam) => { - return requestClient.get('/im/manager/channel-message/page', { params }) +/** 获得频道消息分页 */ +export function getManagerChannelMessagePage(params: PageParam) { + return requestClient.get>( + '/im/manager/channel-message/page', + { params }, + ); } diff --git a/apps/web-antd/src/api/im/manager/face/item/index.ts b/apps/web-antd/src/api/im/manager/face/item/index.ts index b55b98c1b..c85eaa180 100644 --- a/apps/web-antd/src/api/im/manager/face/item/index.ts +++ b/apps/web-antd/src/api/im/manager/face/item/index.ts @@ -1,47 +1,63 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerFacePackItemVO { - id: number - packId: number - url: string - name?: string - width: number - height: number - sort: number - status: number - createTime?: Date +export namespace ImManagerFacePackItemApi { + /** 表情项 */ + export interface FacePackItem { + id: number; + packId: number; + url: string; + name?: string; + width: number; + height: number; + sort: number; + status: number; + createTime?: Date; + } } -// 获得表情分页 -export const getManagerFacePackItemPage = (params: PageParam) => { - return requestClient.get('/im/manager/face-pack-item/page', { params }) + +/** 获得表情分页 */ +export function getManagerFacePackItemPage(params: PageParam) { + return requestClient.get>( + '/im/manager/face-pack-item/page', + { params }, + ); } -// 获得表情详情 -export const getManagerFacePackItem = (id: number) => { - return requestClient.get('/im/manager/face-pack-item/get', { params: { id } }) +/** 获得表情详情 */ +export function getManagerFacePackItem(id: number) { + return requestClient.get( + '/im/manager/face-pack-item/get', + { params: { id } }, + ); } -// 新增表情 -export const createManagerFacePackItem = (data: ImManagerFacePackItemVO) => { - return requestClient.post('/im/manager/face-pack-item/create', data) +/** 新增表情 */ +export function createManagerFacePackItem(data: ImManagerFacePackItemApi.FacePackItem) { + return requestClient.post('/im/manager/face-pack-item/create', data); } -// 修改表情 -export const updateManagerFacePackItem = (data: ImManagerFacePackItemVO) => { - return requestClient.put('/im/manager/face-pack-item/update', data) +/** 修改表情 */ +export function updateManagerFacePackItem(data: ImManagerFacePackItemApi.FacePackItem) { + return requestClient.put( + '/im/manager/face-pack-item/update', + data, + ); } -// 删除表情 -export const deleteManagerFacePackItem = (id: number) => { - return requestClient.delete('/im/manager/face-pack-item/delete', { params: { id } }) +/** 删除表情 */ +export function deleteManagerFacePackItem(id: number) { + return requestClient.delete('/im/manager/face-pack-item/delete', { + params: { id }, + }); } -// 批量删除表情 -export const deleteManagerFacePackItemList = (ids: number[]) => { - return requestClient.delete('/im/manager/face-pack-item/delete-list', { - params: { ids: ids.join(',') } - }) +/** 批量删除表情 */ +export function deleteManagerFacePackItemList(ids: number[]) { + return requestClient.delete( + '/im/manager/face-pack-item/delete-list', + { params: { ids: ids.join(',') } }, + ); } diff --git a/apps/web-antd/src/api/im/manager/face/pack/index.ts b/apps/web-antd/src/api/im/manager/face/pack/index.ts index 235cf8f2c..40f6257dd 100644 --- a/apps/web-antd/src/api/im/manager/face/pack/index.ts +++ b/apps/web-antd/src/api/im/manager/face/pack/index.ts @@ -1,44 +1,55 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerFacePackVO { - id: number - name: string - icon?: string - sort: number - status: number - createTime?: Date +export namespace ImManagerFacePackApi { + /** 表情包 */ + export interface FacePack { + id: number; + name: string; + icon?: string; + sort: number; + status: number; + createTime?: Date; + } } -// 获得表情包分页 -export const getManagerFacePackPage = (params: PageParam) => { - return requestClient.get('/im/manager/face-pack/page', { params }) + +/** 获得表情包分页 */ +export function getManagerFacePackPage(params: PageParam) { + return requestClient.get>( + '/im/manager/face-pack/page', + { params }, + ); } -// 获得表情包详情 -export const getManagerFacePack = (id: number) => { - return requestClient.get('/im/manager/face-pack/get', { params: { id } }) +/** 获得表情包详情 */ +export function getManagerFacePack(id: number) { + return requestClient.get('/im/manager/face-pack/get', { + params: { id }, + }); } -// 新增表情包 -export const createManagerFacePack = (data: ImManagerFacePackVO) => { - return requestClient.post('/im/manager/face-pack/create', data) +/** 新增表情包 */ +export function createManagerFacePack(data: ImManagerFacePackApi.FacePack) { + return requestClient.post('/im/manager/face-pack/create', data); } -// 修改表情包 -export const updateManagerFacePack = (data: ImManagerFacePackVO) => { - return requestClient.put('/im/manager/face-pack/update', data) +/** 修改表情包 */ +export function updateManagerFacePack(data: ImManagerFacePackApi.FacePack) { + return requestClient.put('/im/manager/face-pack/update', data); } -// 删除表情包 -export const deleteManagerFacePack = (id: number) => { - return requestClient.delete('/im/manager/face-pack/delete', { params: { id } }) +/** 删除表情包 */ +export function deleteManagerFacePack(id: number) { + return requestClient.delete('/im/manager/face-pack/delete', { + params: { id }, + }); } -// 批量删除表情包 -export const deleteManagerFacePackList = (ids: number[]) => { - return requestClient.delete('/im/manager/face-pack/delete-list', { - params: { ids: ids.join(',') } - }) +/** 批量删除表情包 */ +export function deleteManagerFacePackList(ids: number[]) { + return requestClient.delete('/im/manager/face-pack/delete-list', { + params: { ids: ids.join(',') }, + }); } diff --git a/apps/web-antd/src/api/im/manager/face/useritem/index.ts b/apps/web-antd/src/api/im/manager/face/useritem/index.ts index 6dfa59793..3cff74d87 100644 --- a/apps/web-antd/src/api/im/manager/face/useritem/index.ts +++ b/apps/web-antd/src/api/im/manager/face/useritem/index.ts @@ -1,24 +1,33 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerFaceUserItemVO { - id: number - userId: number - userNickname?: string - url: string - name?: string - width?: number - height?: number - createTime?: Date +export namespace ImManagerFaceUserItemApi { + /** 用户表情 */ + export interface FaceUserItem { + id: number; + userId: number; + userNickname?: string; + url: string; + name?: string; + width?: number; + height?: number; + createTime?: Date; + } } -// 获得用户表情分页 -export const getManagerFaceUserItemPage = (params: PageParam) => { - return requestClient.get('/im/manager/face-user-item/page', { params }) + +/** 获得用户表情分页 */ +export function getManagerFaceUserItemPage(params: PageParam) { + return requestClient.get>( + '/im/manager/face-user-item/page', + { params }, + ); } -// 删除用户表情 -export const deleteManagerFaceUserItem = (id: number) => { - return requestClient.delete('/im/manager/face-user-item/delete', { params: { id } }) +/** 删除用户表情 */ +export function deleteManagerFaceUserItem(id: number) { + return requestClient.delete('/im/manager/face-user-item/delete', { + params: { id }, + }); } diff --git a/apps/web-antd/src/api/im/manager/friend/index.ts b/apps/web-antd/src/api/im/manager/friend/index.ts index d07586414..36393c011 100644 --- a/apps/web-antd/src/api/im/manager/friend/index.ts +++ b/apps/web-antd/src/api/im/manager/friend/index.ts @@ -1,25 +1,32 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerFriendVO { - id: number - userId: number - userNickname?: string - friendUserId: number - friendNickname?: string - displayName?: string - addSource?: number - silent: boolean - pinned: boolean - blocked: boolean - status: number - addTime?: Date - deleteTime?: Date - createTime: Date +export namespace ImManagerFriendApi { + /** 好友关系 */ + export interface Friend { + id: number; + userId: number; + userNickname?: string; + friendUserId: number; + friendNickname?: string; + displayName?: string; + addSource?: number; + silent: boolean; + pinned: boolean; + blocked: boolean; + status: number; + addTime?: Date; + deleteTime?: Date; + createTime: Date; + } } -// 获得好友关系分页 -export const getManagerFriendPage = (params: PageParam) => { - return requestClient.get('/im/manager/friend/page', { params }) + +/** 获得好友关系分页 */ +export function getManagerFriendPage(params: PageParam) { + return requestClient.get>( + '/im/manager/friend/page', + { params }, + ); } diff --git a/apps/web-antd/src/api/im/manager/friend/request/index.ts b/apps/web-antd/src/api/im/manager/friend/request/index.ts index be2888801..5cc8b4996 100644 --- a/apps/web-antd/src/api/im/manager/friend/request/index.ts +++ b/apps/web-antd/src/api/im/manager/friend/request/index.ts @@ -1,23 +1,30 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerFriendRequestVO { - id: number - fromUserId: number - fromNickname?: string - toUserId: number - toNickname?: string - applyContent?: string - displayName?: string - addSource?: number - handleResult: number - handleContent?: string - handleTime?: Date - createTime: Date +export namespace ImManagerFriendRequestApi { + /** 好友申请 */ + export interface FriendRequest { + id: number; + fromUserId: number; + fromNickname?: string; + toUserId: number; + toNickname?: string; + applyContent?: string; + displayName?: string; + addSource?: number; + handleResult: number; + handleContent?: string; + handleTime?: Date; + createTime: Date; + } } -// 获得好友申请分页 -export const getManagerFriendRequestPage = (params: PageParam) => { - return requestClient.get('/im/manager/friend-request/page', { params }) + +/** 获得好友申请分页 */ +export function getManagerFriendRequestPage(params: PageParam) { + return requestClient.get>( + '/im/manager/friend-request/page', + { params }, + ); } diff --git a/apps/web-antd/src/api/im/manager/group/index.ts b/apps/web-antd/src/api/im/manager/group/index.ts index a0ad66010..7d51ade22 100644 --- a/apps/web-antd/src/api/im/manager/group/index.ts +++ b/apps/web-antd/src/api/im/manager/group/index.ts @@ -1,64 +1,87 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerGroupVO { - id: number - name: string - avatar?: string - notice?: string - ownerUserId: number - ownerNickname?: string - memberCount?: number - status: number - banned: boolean - mutedAll?: boolean - bannedReason?: string - bannedTime?: Date - dissolvedTime?: Date - createTime: Date +export namespace ImManagerGroupApi { + /** 群 */ + export interface Group { + id: number; + name: string; + avatar?: string; + notice?: string; + ownerUserId: number; + ownerNickname?: string; + memberCount?: number; + status: number; + banned: boolean; + mutedAll?: boolean; // 是否全群禁言 + bannedReason?: string; + bannedTime?: Date; + dissolvedTime?: Date; + createTime: Date; + } + + /** 群成员 */ + export interface GroupMember { + userId: number; + nickname?: string; + avatar?: string; + displayUserName?: string; + groupRemark?: string; + silent?: boolean; + status: number; + role?: number; // 成员角色,参见 ImGroupMemberRole 枚举 + joinTime?: Date; + quitTime?: Date; + muteEndTime?: Date; // 禁言到期时间 + } + + /** 群封禁请求 */ + export interface GroupBanReqVO { + id: number; + reason: string; + } } -export interface ImManagerGroupMemberVO { - userId: number - nickname?: string - avatar?: string - displayUserName?: string - groupRemark?: string - silent?: boolean - status: number - role?: number - joinTime?: Date - quitTime?: Date - muteEndTime?: Date + +/** 获得群分页 */ +export function getManagerGroupPage(params: PageParam) { + return requestClient.get>( + '/im/manager/group/page', + { params }, + ); } -// 获得群分页 -export const getManagerGroupPage = (params: PageParam) => { - return requestClient.get('/im/manager/group/page', { params }) +/** 获得群详情 */ +export function getManagerGroup(id: number) { + return requestClient.get('/im/manager/group/get', { + params: { id }, + }); } -// 获得群详情 -export const getManagerGroup = (id: number) => { - return requestClient.get('/im/manager/group/get', { params: { id } }) +/** 封禁群 */ +export function banManagerGroup(data: ImManagerGroupApi.GroupBanReqVO) { + return requestClient.put('/im/manager/group/ban', data); } -// 封禁群 -export const banManagerGroup = (data: { id: number; reason: string }) => { - return requestClient.put('/im/manager/group/ban', data) +/** 解封群 */ +export function unbanManagerGroup(id: number) { + return requestClient.put('/im/manager/group/unban', undefined, { + params: { id }, + }); } -// 解封群 -export const unbanManagerGroup = (id: number) => { - return requestClient.put('/im/manager/group/unban', undefined, { params: { id } }) +/** 解散群 */ +export function dissolveManagerGroup(id: number) { + return requestClient.delete('/im/manager/group/dissolve', { + params: { id }, + }); } -// 解散群 -export const dissolveManagerGroup = (id: number) => { - return requestClient.delete('/im/manager/group/dissolve', { params: { id } }) -} - -// 获得群成员列表 -export const getManagerGroupMemberList = (groupId: number) => { - return requestClient.get('/im/manager/group/member/list', { params: { groupId } }) +/** 获得群成员列表(含已退群成员,由前端按需过滤) */ +export function getManagerGroupMemberList(groupId: number) { + return requestClient.get( + '/im/manager/group/member/list', + { params: { groupId } }, + ); } diff --git a/apps/web-antd/src/api/im/manager/group/request/index.ts b/apps/web-antd/src/api/im/manager/group/request/index.ts index a13bb2c71..8a6de7e20 100644 --- a/apps/web-antd/src/api/im/manager/group/request/index.ts +++ b/apps/web-antd/src/api/im/manager/group/request/index.ts @@ -1,26 +1,33 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerGroupRequestVO { - id: number - groupId: number - groupName?: string - userId: number - userNickname?: string - inviterUserId?: number - inviterNickname?: string - applyContent?: string - addSource?: number - handleResult: number - handleUserId?: number - handleNickname?: string - handleContent?: string - handleTime?: Date - createTime: Date +export namespace ImManagerGroupRequestApi { + /** 加群申请 */ + export interface GroupRequest { + id: number; + groupId: number; + groupName?: string; + userId: number; + userNickname?: string; + inviterUserId?: number; + inviterNickname?: string; + applyContent?: string; + addSource?: number; + handleResult: number; + handleUserId?: number; + handleNickname?: string; + handleContent?: string; + handleTime?: Date; + createTime: Date; + } } -// 获得加群申请分页 -export const getManagerGroupRequestPage = (params: PageParam) => { - return requestClient.get('/im/manager/group-request/page', { params }) + +/** 获得加群申请分页 */ +export function getManagerGroupRequestPage(params: PageParam) { + return requestClient.get>( + '/im/manager/group-request/page', + { params }, + ); } diff --git a/apps/web-antd/src/api/im/manager/message/group/index.ts b/apps/web-antd/src/api/im/manager/message/group/index.ts index 4e8d487a4..3385ae046 100644 --- a/apps/web-antd/src/api/im/manager/message/group/index.ts +++ b/apps/web-antd/src/api/im/manager/message/group/index.ts @@ -1,30 +1,40 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerGroupMessageVO { - id: number - clientMessageId?: string - groupId: number - groupName?: string - senderId: number - senderNickname?: string - type: number - content: string - status: number - atUserIds?: number[] - atUserNicknames?: (null | string)[] - receiptStatus: number - sendTime: Date - createTime: Date +export namespace ImManagerGroupMessageApi { + /** 群聊消息 */ + export interface GroupMessage { + id: number; + clientMessageId?: string; + groupId: number; + groupName?: string; + senderId: number; + senderNickname?: string; + type: number; + content: string; + status: number; + atUserIds?: number[]; + atUserNicknames?: (null | string)[]; + receiptStatus: number; + sendTime: Date; + createTime: Date; + } } -// 获得群聊消息分页 -export const getManagerGroupMessagePage = (params: PageParam) => { - return requestClient.get('/im/manager/message/group/page', { params }) + +/** 获得群聊消息分页 */ +export function getManagerGroupMessagePage(params: PageParam) { + return requestClient.get>( + '/im/manager/message/group/page', + { params }, + ); } -// 获得群聊消息详情 -export const getManagerGroupMessage = (id: number) => { - return requestClient.get('/im/manager/message/group/get', { params: { id } }) +/** 获得群聊消息详情 */ +export function getManagerGroupMessage(id: number) { + return requestClient.get( + '/im/manager/message/group/get', + { params: { id } }, + ); } diff --git a/apps/web-antd/src/api/im/manager/message/private/index.ts b/apps/web-antd/src/api/im/manager/message/private/index.ts index cace0a51f..48b319233 100644 --- a/apps/web-antd/src/api/im/manager/message/private/index.ts +++ b/apps/web-antd/src/api/im/manager/message/private/index.ts @@ -1,28 +1,37 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerPrivateMessageVO { - id: number - clientMessageId?: string - senderId: number - senderNickname?: string - receiverId: number - receiverNickname?: string - type: number - content: string - status: number - receiptStatus: number - sendTime: Date - createTime: Date +export namespace ImManagerPrivateMessageApi { + /** 私聊消息 */ + export interface PrivateMessage { + id: number; + clientMessageId?: string; + senderId: number; + senderNickname?: string; + receiverId: number; + receiverNickname?: string; + type: number; + content: string; + status: number; + sendTime: Date; + createTime: Date; + } } -// 获得私聊消息分页 -export const getManagerPrivateMessagePage = (params: PageParam) => { - return requestClient.get('/im/manager/message/private/page', { params }) + +/** 获得私聊消息分页 */ +export function getManagerPrivateMessagePage(params: PageParam) { + return requestClient.get>( + '/im/manager/message/private/page', + { params }, + ); } -// 获得私聊消息详情 -export const getManagerPrivateMessage = (id: number) => { - return requestClient.get('/im/manager/message/private/get', { params: { id } }) +/** 获得私聊消息详情 */ +export function getManagerPrivateMessage(id: number) { + return requestClient.get( + '/im/manager/message/private/get', + { params: { id } }, + ); } diff --git a/apps/web-antd/src/api/im/manager/rtc/index.ts b/apps/web-antd/src/api/im/manager/rtc/index.ts index a551c428f..76b9d3c73 100644 --- a/apps/web-antd/src/api/im/manager/rtc/index.ts +++ b/apps/web-antd/src/api/im/manager/rtc/index.ts @@ -1,42 +1,53 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerRtcCallVO { - id: number - room: string - conversationType: number - mediaType: number - inviterUserId: number - inviterNickname?: string - groupId?: number - groupName?: string - status: number - endReason?: number - startTime: Date - acceptTime?: Date - endTime?: Date - createTime: Date +export namespace ImManagerRtcApi { + /** RTC 通话 */ + export interface RtcCall { + id: number; + room: string; + conversationType: number; + mediaType: number; + inviterUserId: number; + inviterNickname?: string; + groupId?: number; + groupName?: string; + status: number; + endReason?: number; + startTime: Date; + acceptTime?: Date; + endTime?: Date; + createTime: Date; + } + + /** RTC 通话参与者 */ + export interface RtcParticipant { + id: number; + callId: number; + userId: number; + userNickname?: string; + role: number; + status: number; + inviteTime: Date; + acceptTime?: Date; + leaveTime?: Date; + } } -export interface ImManagerRtcParticipantVO { - id: number - callId: number - userId: number - userNickname?: string - role: number - status: number - inviteTime: Date - acceptTime?: Date - leaveTime?: Date + +/** 获得通话记录分页 */ +export function getManagerRtcCallPage(params: PageParam) { + return requestClient.get>( + '/im/manager/rtc/page', + { params }, + ); } -// 获得通话记录分页 -export const getManagerRtcCallPage = (params: PageParam) => { - return requestClient.get('/im/manager/rtc/page', { params }) -} - -// 获得通话参与者列表 -export const getManagerRtcCallParticipantList = (id: number) => { - return requestClient.get('/im/manager/rtc/participant-list', { params: { id } }) +/** 获得通话参与者列表 */ +export function getManagerRtcCallParticipantList(id: number) { + return requestClient.get( + '/im/manager/rtc/participant-list', + { params: { id } }, + ); } diff --git a/apps/web-antd/src/api/im/manager/sensitiveword/index.ts b/apps/web-antd/src/api/im/manager/sensitiveword/index.ts index 706ae10f5..5f84b8df5 100644 --- a/apps/web-antd/src/api/im/manager/sensitiveword/index.ts +++ b/apps/web-antd/src/api/im/manager/sensitiveword/index.ts @@ -1,44 +1,60 @@ -import type { PageParam } from '@vben/request' +import type { PageParam, PageResult } from '@vben/request'; -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImManagerSensitiveWordVO { - id: number - word: string - status: number - creator?: string - creatorName?: string - createTime?: Date +export namespace ImManagerSensitiveWordApi { + /** 敏感词 */ + export interface SensitiveWord { + id: number; + word: string; + status: number; + creator?: string; + creatorName?: string; + createTime?: Date; + } } -// 获得敏感词分页 -export const getManagerSensitiveWordPage = (params: PageParam) => { - return requestClient.get('/im/manager/sensitive-word/page', { params }) + +/** 获得敏感词分页 */ +export function getManagerSensitiveWordPage(params: PageParam) { + return requestClient.get>( + '/im/manager/sensitive-word/page', + { params }, + ); } -// 获得敏感词详情 -export const getManagerSensitiveWord = (id: number) => { - return requestClient.get('/im/manager/sensitive-word/get', { params: { id } }) +/** 获得敏感词详情 */ +export function getManagerSensitiveWord(id: number) { + return requestClient.get( + '/im/manager/sensitive-word/get', + { params: { id } }, + ); } -// 新增敏感词 -export const createManagerSensitiveWord = (data: ImManagerSensitiveWordVO) => { - return requestClient.post('/im/manager/sensitive-word/create', data) +/** 新增敏感词 */ +export function createManagerSensitiveWord(data: ImManagerSensitiveWordApi.SensitiveWord) { + return requestClient.post('/im/manager/sensitive-word/create', data); } -// 修改敏感词 -export const updateManagerSensitiveWord = (data: ImManagerSensitiveWordVO) => { - return requestClient.put('/im/manager/sensitive-word/update', data) +/** 修改敏感词 */ +export function updateManagerSensitiveWord(data: ImManagerSensitiveWordApi.SensitiveWord) { + return requestClient.put( + '/im/manager/sensitive-word/update', + data, + ); } -// 删除敏感词 -export const deleteManagerSensitiveWord = (id: number) => { - return requestClient.delete('/im/manager/sensitive-word/delete', { params: { id } }) +/** 删除敏感词 */ +export function deleteManagerSensitiveWord(id: number) { + return requestClient.delete('/im/manager/sensitive-word/delete', { + params: { id }, + }); } -// 批量删除敏感词 -export const deleteManagerSensitiveWordList = (ids: number[]) => { - return requestClient.delete('/im/manager/sensitive-word/delete-list', { - params: { ids: ids.join(',') } - }) +/** 批量删除敏感词 */ +export function deleteManagerSensitiveWordList(ids: number[]) { + return requestClient.delete( + '/im/manager/sensitive-word/delete-list', + { params: { ids: ids.join(',') } }, + ); } diff --git a/apps/web-antd/src/api/im/manager/statistics/index.ts b/apps/web-antd/src/api/im/manager/statistics/index.ts index a1982e0b7..fb4a04053 100644 --- a/apps/web-antd/src/api/im/manager/statistics/index.ts +++ b/apps/web-antd/src/api/im/manager/statistics/index.ts @@ -1,66 +1,88 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImStatisticsOverviewVO { - totalUser: number - newUserToday: number - totalGroup: number - newGroupToday: number - activeUserDaily: number - activeUserWeekly: number - activeUserMonthly: number - privateMessageToday: number - groupMessageToday: number - privateMessageYesterday: number - groupMessageYesterday: number +export namespace ImManagerStatisticsApi { + /** 统计概览 */ + export interface Overview { + totalUser: number; + newUserToday: number; + totalGroup: number; + newGroupToday: number; + activeUserDaily: number; + activeUserWeekly: number; + activeUserMonthly: number; + privateMessageToday: number; + groupMessageToday: number; + privateMessageYesterday: number; + groupMessageYesterday: number; + } + + /** 趋势数据 */ + export interface Trend { + dates: string[]; + series: Record; + } + + /** 消息类型分布 */ + export interface MessageType { + type: number; // 参见 ImContentTypeEnum 枚举类,由前端按 DICT_TYPE.IM_CONTENT_TYPE 翻译 + value: number; + } + + /** 群规模分布 */ + export interface GroupSize { + range: string; + count: number; + } + + /** 消息发送排行 */ + export interface TopSender { + userId: number; + nickname: string; + messageCount: number; + } } -export interface ImStatisticsTrendVO { - dates: string[] - series: Record + +/** 获得 KPI 概览 */ +export function getStatisticsOverview() { + return requestClient.get( + '/im/manager/statistics/overview', + ); } -export interface ImStatisticsMessageTypeVO { - type: number - value: number +/** 获得消息趋势(私聊 + 群聊双线) */ +export function getMessageTrend(days: number) { + return requestClient.get( + '/im/manager/statistics/message-trend', + { params: { days } }, + ); } -export interface ImStatisticsGroupSizeVO { - range: string - count: number +/** 获得用户趋势(新增注册 + 日活双线) */ +export function getUserTrend(days: number) { + return requestClient.get( + '/im/manager/statistics/user-trend', + { params: { days } }, + ); } -export interface ImStatisticsTopSenderVO { - userId: number - nickname: string - messageCount: number +/** 获得内容类型分布(最近 30 天) */ +export function getMessageTypeDistribution() { + return requestClient.get( + '/im/manager/statistics/message-type-distribution', + ); } -// 获得 KPI 概览 -export const getStatisticsOverview = (): Promise => { - return requestClient.get('/im/manager/statistics/overview') +/** 获得群规模分布 */ +export function getGroupSizeDistribution() { + return requestClient.get( + '/im/manager/statistics/group-size-distribution', + ); } -// 获得消息趋势 -export const getMessageTrend = (days: number): Promise => { - return requestClient.get('/im/manager/statistics/message-trend', { params: { days } }) -} - -// 获得用户趋势 -export const getUserTrend = (days: number): Promise => { - return requestClient.get('/im/manager/statistics/user-trend', { params: { days } }) -} - -// 获得内容类型分布 -export const getMessageTypeDistribution = (): Promise => { - return requestClient.get('/im/manager/statistics/message-type-distribution') -} - -// 获得群规模分布 -export const getGroupSizeDistribution = (): Promise => { - return requestClient.get('/im/manager/statistics/group-size-distribution') -} - -// 获得消息 TOP 发送者 -export const getTopSenders = (): Promise => { - return requestClient.get('/im/manager/statistics/top-senders') +/** 获得消息 TOP 发送者(最近 30 天) */ +export function getTopSenders() { + return requestClient.get( + '/im/manager/statistics/top-senders', + ); } diff --git a/apps/web-antd/src/api/im/message/channel/index.ts b/apps/web-antd/src/api/im/message/channel/index.ts index ff184be23..c727d29c3 100644 --- a/apps/web-antd/src/api/im/message/channel/index.ts +++ b/apps/web-antd/src/api/im/message/channel/index.ts @@ -1,22 +1,34 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -export interface ImChannelMessageRespVO { - id: number - clientMessageId?: string - channelId: number - materialId: number - type: number - content: string - receiptStatus?: number - sendTime: string +export namespace ImChannelMessageApi { + /** 频道消息 */ + export interface ChannelMessageRespVO { + id: number; + clientMessageId?: string; + channelId: number; + materialId: number; + type: number; + content: string; + receiptStatus?: number; + sendTime: string; + } } -// 拉取当前用户应收的频道消息(离线增量);按 minId 游标分页 -export const pullChannelMessages = (params: { minId: number; size?: number }, signal?: AbortSignal) => { - return requestClient.get('/im/channel/message/pull', { params, signal }) + +/** 拉取当前用户应收的频道消息(离线增量);按 minId 游标分页 */ +export function pullChannelMessages( + params: { minId: number; size?: number }, + signal?: AbortSignal, +) { + return requestClient.get( + '/im/channel/message/pull', + { params, signal }, + ); } -// 上报频道消息已读位置;切到频道会话或拉到新消息后调 -export const readChannelMessages = (channelId: number, messageId: number) => { - return requestClient.put('/im/channel/message/read', undefined, { params: { channelId, messageId } }) +/** 上报频道消息已读位置;切到频道会话或拉到新消息后调 */ +export function readChannelMessages(channelId: number, messageId: number) { + return requestClient.put('/im/channel/message/read', undefined, { + params: { channelId, messageId }, + }); } diff --git a/apps/web-antd/src/api/im/message/group/index.ts b/apps/web-antd/src/api/im/message/group/index.ts index 814462ad3..3ea832f46 100644 --- a/apps/web-antd/src/api/im/message/group/index.ts +++ b/apps/web-antd/src/api/im/message/group/index.ts @@ -1,70 +1,92 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// 群聊消息 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 // 已读人数(回执消息、且发送人为当前用户时有值) +export namespace ImGroupMessageApi { + /** 群聊消息 Response VO */ + export interface GroupMessageRespVO { + 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 GroupMessageSendReqVO { + clientMessageId: string; // 客户端消息编号 + groupId: number; // 群编号 + type: number; // 内容类型 + content: string; // 消息内容(JSON 格式) + atUserIds?: number[]; // @ 目标用户编号列表 + receipt?: boolean; // 是否需要回执 + } + + /** 群聊历史消息列表 Request VO */ + export interface GroupMessageListReqVO { + groupId: number | string; // 群编号 + maxId?: number | string; // 起始消息编号(不含),为空则从最新消息开始 + limit: number; // 拉取数量(1 ~ 200) + } } -// 群聊消息发送 Request VO -export interface ImGroupMessageSendReqVO { - clientMessageId: string // 客户端消息编号 - groupId: number // 群编号 - type: number // 内容类型 - content: string // 消息内容(JSON 格式) - atUserIds?: number[] // @ 目标用户编号列表 - receipt?: boolean // 是否需要回执 + +/** 发送群聊消息 */ +export function sendGroupMessage(data: ImGroupMessageApi.GroupMessageSendReqVO) { + return requestClient.post( + '/im/message/group/send', + data, + ); } -// 群聊历史消息列表 Request VO -export interface ImGroupMessageListReqVO { - groupId: number | string // 群编号 - maxId?: number | string // 起始消息编号(不含),为空则从最新消息开始 - limit: number // 拉取数量(1 ~ 200) -} - -// 发送群聊消息 -export const sendGroupMessage = (data: ImGroupMessageSendReqVO) => { - return requestClient.post('/im/message/group/send', data) -} - -// 拉取群聊消息(增量) -export const pullGroupMessages = ( +/** 拉取群聊消息(增量) */ +export function pullGroupMessages( params: { minId: number | string; size: number }, - signal?: AbortSignal -) => { - return requestClient.get('/im/message/group/pull', { params, signal }) + signal?: AbortSignal, +) { + return requestClient.get( + '/im/message/group/pull', + { params, signal }, + ); } -// 查询群聊历史消息 -export const getGroupMessageList = (params: ImGroupMessageListReqVO) => { - return requestClient.get('/im/message/group/list', { params }) +/** 查询群聊历史消息 */ +export function getGroupMessageList(params: ImGroupMessageApi.GroupMessageListReqVO) { + return requestClient.get( + '/im/message/group/list', + { params }, + ); } -// 标记群聊消息已读 -export const readGroupMessages = (groupId: number | string, messageId: number | string) => { - return requestClient.put('/im/message/group/read', undefined, { params: { groupId, messageId } }) +/** 标记群聊消息已读 */ +export function readGroupMessages( + groupId: number | string, + messageId: number | string, +) { + return requestClient.put('/im/message/group/read', undefined, { + params: { groupId, messageId }, + }); } -// 撤回群聊消息 -export const recallGroupMessage = (id: number | string) => { - return requestClient.delete('/im/message/group/recall', { params: { id } }) +/** 撤回群聊消息 */ +export function recallGroupMessage(id: number | string) { + return requestClient.delete( + '/im/message/group/recall', + { params: { id } }, + ); } -// 获取群消息已读用户列表 -export const getGroupReadUsers = (params: { - groupId: number | string - messageId: number | string -}) => { - return requestClient.get('/im/message/group/get-read-user-ids', { params }) +/** 获取群消息已读用户列表 */ +export function getGroupReadUsers(params: { + groupId: number | string; + messageId: number | string; +}) { + return requestClient.get('/im/message/group/get-read-user-ids', { + params, + }); } diff --git a/apps/web-antd/src/api/im/message/private/index.ts b/apps/web-antd/src/api/im/message/private/index.ts index 42a010261..9240c99ae 100644 --- a/apps/web-antd/src/api/im/message/private/index.ts +++ b/apps/web-antd/src/api/im/message/private/index.ts @@ -1,63 +1,89 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// 私聊消息 Response VO -export interface ImPrivateMessageRespVO { - id: number // 消息编号 - clientMessageId: string // 客户端消息编号 - senderId: number // 发送人编号 - receiverId: number // 接收人编号 - type: number // 内容类型 - content: string // 消息内容(JSON 格式) - status: number // 消息状态(正常 / 已撤回) - receiptStatus?: number // 回执状态(不需要 / 待完成 / 已完成),对齐 ImMessageReceiptStatus - sendTime: string // 发送时间 +export namespace ImPrivateMessageApi { + /** 私聊消息 Response VO */ + export interface PrivateMessageRespVO { + id: number; // 消息编号 + clientMessageId: string; // 客户端消息编号 + senderId: number; // 发送人编号 + receiverId: number; // 接收人编号 + type: number; // 内容类型 + content: string; // 消息内容(JSON 格式) + status: number; // 消息状态(正常 / 已撤回) + receiptStatus?: number; // 回执状态(不需要 / 待完成 / 已完成),对齐 ImMessageReceiptStatus + sendTime: string; // 发送时间 + } + + /** 私聊消息发送 Request VO */ + export interface PrivateMessageSendReqVO { + clientMessageId: string; // 客户端消息编号 + receiverId: number; // 接收人编号 + type: number; // 内容类型 + content: string; // 消息内容(JSON 格式) + receipt?: boolean; // 是否需要回执;不传后端默认 true(普通私聊用户消息) + } + + /** 私聊历史消息列表 Request VO */ + export interface PrivateMessageListReqVO { + receiverId: number | string; // 接收人编号(对方) + maxId?: number | string; // 起始消息编号(不含),为空则从最新消息开始 + limit: number; // 拉取数量(1 ~ 200) + } } -// 私聊消息发送 Request VO -export interface ImPrivateMessageSendReqVO { - clientMessageId: string // 客户端消息编号 - receiverId: number // 接收人编号 - type: number // 内容类型 - content: string // 消息内容(JSON 格式) - receipt?: boolean // 是否需要回执;不传后端默认 true(普通私聊用户消息) + +/** 发送私聊消息 */ +export function sendPrivateMessage(data: ImPrivateMessageApi.PrivateMessageSendReqVO) { + return requestClient.post( + '/im/message/private/send', + data, + ); } -// 私聊历史消息列表 Request VO -export interface ImPrivateMessageListReqVO { - receiverId: number | string // 接收人编号(对方) - maxId?: number | string // 起始消息编号(不含),为空则从最新消息开始 - limit: number // 拉取数量(1 ~ 200) -} - -// 发送私聊消息 -export const sendPrivateMessage = (data: ImPrivateMessageSendReqVO) => { - return requestClient.post('/im/message/private/send', data) -} - -// 拉取私聊消息(增量) -export const pullPrivateMessages = ( +/** 拉取私聊消息(增量) */ +export function pullPrivateMessages( params: { minId: number | string; size: number }, - signal?: AbortSignal -) => { - return requestClient.get('/im/message/private/pull', { params, signal }) + signal?: AbortSignal, +) { + return requestClient.get( + '/im/message/private/pull', + { params, signal }, + ); } -// 查询私聊历史消息 -export const getPrivateMessageList = (params: ImPrivateMessageListReqVO) => { - return requestClient.get('/im/message/private/list', { params }) +/** 查询私聊历史消息 */ +export function getPrivateMessageList(params: ImPrivateMessageApi.PrivateMessageListReqVO) { + return requestClient.get( + '/im/message/private/list', + { params }, + ); } -// 标记私聊消息已读 -export const readPrivateMessages = (receiverId: number | string, messageId: number | string) => { - return requestClient.put('/im/message/private/read', undefined, { params: { receiverId, messageId } }) +/** 标记私聊消息已读 */ +export function readPrivateMessages( + receiverId: number | string, + messageId: number | string, +) { + return requestClient.put('/im/message/private/read', undefined, { + params: { receiverId, messageId }, + }); } -// 查询对方已读到我发的最大消息 id(多端 / 离线后用于补齐已读状态) -export const getPrivateMaxReadMessageId = (peerId: number | string, signal?: AbortSignal) => { - return requestClient.get('/im/message/private/max-read-message-id', { params: { peerId }, signal }) +/** 查询对方已读到我发的最大消息 id(多端 / 离线后用于补齐已读状态) */ +export function getPrivateMaxReadMessageId( + peerId: number | string, + signal?: AbortSignal, +) { + return requestClient.get( + '/im/message/private/max-read-message-id', + { params: { peerId }, signal }, + ); } -// 撤回私聊消息 -export const recallPrivateMessage = (id: number | string) => { - return requestClient.delete('/im/message/private/recall', { params: { id } }) +/** 撤回私聊消息 */ +export function recallPrivateMessage(id: number | string) { + return requestClient.delete( + '/im/message/private/recall', + { params: { id } }, + ); } diff --git a/apps/web-antd/src/api/im/rtc/index.ts b/apps/web-antd/src/api/im/rtc/index.ts index 5415a196f..801df2afb 100644 --- a/apps/web-antd/src/api/im/rtc/index.ts +++ b/apps/web-antd/src/api/im/rtc/index.ts @@ -1,85 +1,105 @@ -import { requestClient } from '#/api/request' +import { requestClient } from '#/api/request'; -// 创建新通话请求 VO -export interface ImRtcCallCreateReqVO { - conversationType: number - mediaType: number - groupId?: number - inviteeIds: number[] // 被邀请的用户编号集合;私聊必传 1 个对端,群聊必传至少 1 人 +export namespace ImRtcApi { + /** 创建新通话请求 VO */ + export interface RtcCallCreateReqVO { + conversationType: number; + mediaType: number; + groupId?: number; + inviteeIds: number[]; // 被邀请的用户编号集合;私聊必传 1 个对端,群聊必传至少 1 人 + } + + /** 通话中追加邀请请求 VO;仅群通话可用 */ + export interface RtcCallInviteReqVO { + room: string; + inviteeIds: number[]; + } + + /** 通话会话 VO;create / join / accept / refreshToken 共用 */ + export interface RtcCallRespVO { + room: string; // 业务通话编号(同时作为 LiveKit 房间名) + livekitUrl: string; + token?: string; // ENDED 状态时为 null(无需 connect LiveKit) + conversationType: number; + mediaType: number; + status: number; + endReason?: number; // 结束原因;仅 status=ENDED 时有值 + inviterId: number; + groupId?: number; + inviteeIds?: number[]; + joinedUserIds?: number[]; + } + + /** 群活跃通话查询响应;不含 token */ + export interface RtcGroupCallRespVO { + room: string; + groupId: number; + mediaType: number; + inviterId: number; + joinedUserIds?: number[]; + inviteeIds?: number[]; + } } -// 通话中追加邀请请求 VO;仅群通话可用 -export interface ImRtcCallInviteReqVO { - room: string - inviteeIds: number[] + +/** 创建新通话;私聊或群聊根据 conversationType 区分 */ +export function createCall(data: ImRtcApi.RtcCallCreateReqVO) { + return requestClient.post('/im/rtc/create', data); } -// 通话会话 VO;create / join / accept / refreshToken 共用 -export interface ImRtcCallRespVO { - room: string // 业务通话编号(同时作为 LiveKit 房间名) - livekitUrl: string - token?: string // ENDED 状态时为 null(无需 connect LiveKit) - conversationType: number - mediaType: number - status: number - endReason?: number // 结束原因;仅 status=ENDED 时有值 - inviterId: number - groupId?: number - inviteeIds?: number[] - joinedUserIds?: number[] +/** 通话中追加邀请;仅群通话可用 */ +export function inviteCall(data: ImRtcApi.RtcCallInviteReqVO) { + return requestClient.post('/im/rtc/invite', data); } -// 群活跃通话查询响应;不含 token -export interface ImRtcGroupCallRespVO { - room: string - groupId: number - mediaType: number - inviterId: number - joinedUserIds?: number[] - inviteeIds?: number[] +/** 加入已有群通话;用于胶囊条「加入」按钮 */ +export function joinCall(room: string) { + return requestClient.post('/im/rtc/join', undefined, { + params: { room }, + }); } -// 创建新通话;私聊或群聊根据 conversationType 区分 -export const createCall = (data: ImRtcCallCreateReqVO) => { - return requestClient.post('/im/rtc/create', data) +/** 接听通话 */ +export function acceptCall(room: string) { + return requestClient.post('/im/rtc/accept', undefined, { + params: { room }, + }); } -// 通话中追加邀请;仅群通话可用 -export const inviteCall = (data: ImRtcCallInviteReqVO) => { - return requestClient.post('/im/rtc/invite', data) +/** 拒绝通话 */ +export function rejectCall(room: string) { + return requestClient.post('/im/rtc/reject', undefined, { + params: { room }, + }); } -// 加入已有群通话;用于胶囊条「加入」按钮 -export const joinCall = (room: string) => { - return requestClient.post('/im/rtc/join', undefined, { params: { room } }) +/** 取消邀请;主叫接通前调用 */ +export function cancelCall(room: string) { + return requestClient.post('/im/rtc/cancel', undefined, { + params: { room }, + }); } -// 接听通话 -export const acceptCall = (room: string) => { - return requestClient.post('/im/rtc/accept', undefined, { params: { room } }) +/** 离开通话;接通后调用 */ +export function leaveCall(room: string) { + return requestClient.post('/im/rtc/leave', undefined, { + params: { room }, + }); } -// 拒绝通话 -export const rejectCall = (room: string) => { - return requestClient.post('/im/rtc/reject', undefined, { params: { room } }) +/** 振铃超时检查;RUNNING 端 timer 兜底,触发后端立即扫描该 room 的超时 INVITING(接口静默) */ +export function noAnswerCallCheck(room: string) { + return requestClient.post( + '/im/rtc/no-answer-call-check', + undefined, + { params: { room } }, + ); } -// 取消邀请;主叫接通前调用 -export const cancelCall = (room: string) => { - return requestClient.post('/im/rtc/cancel', undefined, { params: { room } }) -} - -// 离开通话;接通后调用 -export const leaveCall = (room: string) => { - return requestClient.post('/im/rtc/leave', undefined, { params: { room } }) -} - -// 振铃超时检查;RUNNING 端 timer 兜底,触发后端立即扫描该 room 的超时 INVITING(接口静默) -export const noAnswerCallCheck = (room: string) => { - return requestClient.post('/im/rtc/no-answer-call-check', undefined, { params: { room } }) -} - -// 查询当前进行中的通话;目前仅群聊场景(胶囊条),返回 null 表示无活跃通话 -export const getActiveCall = (groupId: number) => { - return requestClient.get('/im/rtc/get-active-call', { params: { groupId } }) +/** 查询当前进行中的通话;目前仅群聊场景(胶囊条),返回 null 表示无活跃通话 */ +export function getActiveCall(groupId: number) { + return requestClient.get( + '/im/rtc/get-active-call', + { params: { groupId } }, + ); } diff --git a/apps/web-antd/src/api/system/user/index.ts b/apps/web-antd/src/api/system/user/index.ts index c9f23a403..caa0204a9 100644 --- a/apps/web-antd/src/api/system/user/index.ts +++ b/apps/web-antd/src/api/system/user/index.ts @@ -9,16 +9,23 @@ export namespace SystemUserApi { username: string; nickname: string; deptId: number; + deptName?: string; postIds: string[]; email: string; mobile: string; sex: number; avatar: string; loginIp: string; + loginDate?: Date; status: number; remark: string; createTime?: Date; } + + /** 用户精简信息 */ + export interface UserSimple extends User { + id: number; + } } /** 查询用户管理列表 */ @@ -86,3 +93,17 @@ export function updateUserStatus(id: number, status: number) { export function getSimpleUserList() { return requestClient.get('/system/user/simple-list'); } + +/** 按用户编号查询用户精简信息 */ +export function getSimpleUser(id: number | string) { + return requestClient.get('/system/user/get-simple', { + params: { id }, + }); +} + +/** 按昵称模糊搜索用户 */ +export function getSimpleUserListByNickname(nickname: string) { + return requestClient.get('/system/user/list-by-nickname', { + params: { nickname }, + }); +} diff --git a/apps/web-antd/src/views/im/home/components/ToolBar.vue b/apps/web-antd/src/views/im/home/components/ToolBar.vue index ed5aae366..828496f42 100644 --- a/apps/web-antd/src/views/im/home/components/ToolBar.vue +++ b/apps/web-antd/src/views/im/home/components/ToolBar.vue @@ -21,18 +21,20 @@ const conversationStore = useConversationStore() const friendStore = useFriendStore() const uiStore = useImUiStore() -const totalUnread = computed(() => conversationStore.getTotalUnreadCount) // 消息 Tab 的红点:所有非免打扰会话的未读总和 -const unhandledRequestCount = computed(() => friendStore.getUnhandledRequestCount) // 通讯录 Tab 的红点:未处理好友申请数(接收方=我) +/** 消息 Tab 的红点:所有非免打扰会话的未读总和 */ +const totalUnread = computed(() => conversationStore.getTotalUnreadCount) +/** 通讯录 Tab 的红点:未处理好友申请数(接收方=我) */ +const unhandledRequestCount = computed(() => friendStore.getUnhandledRequestCount) const tabs = [ { name: 'ImHomeConversation', icon: 'ep:chat-round' }, { name: 'ImHomeContact', icon: 'mingcute:contacts-line' } ] // 两个主 Tab;用路由 name 而非 path,避免前缀 / 嵌套调整后失效 -/** 当前路由是否命中 Tab:直接比对 route.name */ +// 当前路由是否命中 Tab:直接比对 route.name const isActive = (name: string) => route.name === name -/** 切换 Tab:当前已选中时,消息 Tab 触发"滚动到下一个未读"(对齐微信 PC),其它 Tab 无动作 */ +// 切换 Tab:当前已选中时,消息 Tab 触发"滚动到下一个未读"(对齐微信 PC),其它 Tab 无动作 const goTab = (name: string) => { if (route.name === name) { if (name === 'ImHomeConversation') { @@ -43,7 +45,7 @@ const goTab = (name: string) => { router.push({ name }) } -/** 跳转个人中心(路由 name=Profile) */ +// 跳转个人中心(路由 name=Profile) const goProfile = () => router.push({ name: 'Profile' }) diff --git a/apps/web-antd/src/views/im/home/components/friend/FriendAddDialog.vue b/apps/web-antd/src/views/im/home/components/friend/FriendAddDialog.vue index b50ae2ebb..e83172b6a 100644 --- a/apps/web-antd/src/views/im/home/components/friend/FriendAddDialog.vue +++ b/apps/web-antd/src/views/im/home/components/friend/FriendAddDialog.vue @@ -1,14 +1,15 @@ diff --git a/apps/web-antd/src/views/im/manager/channel/list/modules/form.vue b/apps/web-antd/src/views/im/manager/channel/list/modules/form.vue index 00070731d..4639e45b7 100644 --- a/apps/web-antd/src/views/im/manager/channel/list/modules/form.vue +++ b/apps/web-antd/src/views/im/manager/channel/list/modules/form.vue @@ -1,5 +1,5 @@ diff --git a/apps/web-antd/src/views/im/manager/channel/material/modules/form.vue b/apps/web-antd/src/views/im/manager/channel/material/modules/form.vue index 69d7c5ade..af0eadf3f 100644 --- a/apps/web-antd/src/views/im/manager/channel/material/modules/form.vue +++ b/apps/web-antd/src/views/im/manager/channel/material/modules/form.vue @@ -1,5 +1,5 @@ diff --git a/apps/web-antd/src/views/im/manager/components/ChannelSelect.vue b/apps/web-antd/src/views/im/manager/components/ChannelSelect.vue index 92a50bcdf..6195d1c63 100644 --- a/apps/web-antd/src/views/im/manager/components/ChannelSelect.vue +++ b/apps/web-antd/src/views/im/manager/components/ChannelSelect.vue @@ -1,5 +1,5 @@