- 实现完整的聊天界面UI组件,支持文本、图片、视频、音频、文件等多种消息类型 - 集成IM消息收发功能,实现消息气泡显示和用户头像占位符 - 添加媒体文件选择和拍摄功能,支持相册图片、视频及相机拍照录像 - 实现语音录制和播放功能,包含按住说话交互和权限处理 - 添加群组提及功能,支持@用户和提及候选列表显示 - 实现消息回复和引用功能,支持消息长按回复操作 - 添加本地消息搜索功能,支持搜索当前会话的历史消息 - 实现文件上传下载功能,集成FileSDK进行文件传输管理 - 添加应用更新检查功能,集成UpdateSDK支持版本更新 - 实现消息状态显示,包括发送、送达、已读等状态标识 - 添加群组已读人数统计,显示消息在群聊中的阅读情况 - 实现草稿保存和恢复功能,支持断点续聊体验 - 添加连接状态横幅,实时显示IM服务连接状态 - 实现滚动加载更多历史消息,优化大量消息的性能表现 - 添加多媒体文件下载保存功能,支持保存到应用专属目录 |
||
|---|---|---|
| docs | ||
| src | ||
| .gitignore | ||
| .npmrc | ||
| node_modules | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| vite.config.ts | ||
XuqmGroup Vue3 SDK 文档
TypeScript · Vue 3.5 · Vite 6 · 发布至 Nexus npm
安装
npm install @xuqm/vue3-sdk
# 或
yarn add @xuqm/vue3-sdk
Vue 3.5+ 作为 peerDependency,不会重复打包。
目录结构
XuqmGroup-Vue3SDK/src/
├── core/
│ ├── http.ts # fetch HTTP 客户端
│ └── sdk.ts # init / setToken / getConfig
├── im/
│ ├── ImClient.ts # WebSocket IM 客户端
│ └── useIm.ts # Vue Composable 封装
├── types/
│ └── index.ts # 全部 TypeScript 类型定义
└── index.ts # 统一导出
快速开始
1. 初始化(main.ts)
import { init } from '@xuqm/vue3-sdk'
init({
appKey: 'ak_your_app_key',
appSecret: 'as_your_app_secret',
apiBaseUrl: 'https://api.xuqm.com',
imBaseUrl: 'wss://im.xuqm.com',
debug: import.meta.env.DEV,
})
2. 设置 Token
import { setToken } from '@xuqm/vue3-sdk'
// 登录后
setToken('eyJ...')
// 登出
setToken(null)
HTTP 客户端
import { http } from '@xuqm/vue3-sdk'
// 自动附加 Bearer Token,统一解析 ApiResponse
const user = await http.get<UserInfo>('/api/user/profile')
const result = await http.post<LoginResp>('/api/auth/login', { account, password })
IM 模块
useIm Composable(推荐)
<script setup lang="ts">
import { useIm } from '@xuqm/vue3-sdk'
const { connect, send, revoke, disconnect, messages, connected, error } = useIm()
// 在 onMounted 后连接
onMounted(() => connect())
// onUnmounted 自动调用 disconnect()
function handleSend(text: string) {
send({
toId: 'user_002',
chatType: 'SINGLE',
msgType: 'TEXT',
content: text,
})
}
</script>
<template>
<div>
<span>{{ connected ? '已连接' : '未连接' }}</span>
<div v-for="msg in messages" :key="msg.id">
<b>{{ msg.fromId }}</b>: {{ msg.content }}
</div>
</div>
</template>
ImClient(底层,手动管理)
import { ImClient } from '@xuqm/vue3-sdk'
const im = new ImClient()
im.on('connected', () => console.log('connected'))
im.on('message', (msg) => console.log(msg))
im.on('revoke', ({ msgId }) => console.log('revoked', msgId))
im.on('disconnected', (code, reason) => console.log(code, reason))
im.on('error', (e) => console.error(e))
im.connect()
// 发送
im.send({ toId: 'user_002', chatType: 'SINGLE', msgType: 'TEXT', content: 'Hi!' })
// 撤回
im.revoke('msg-uuid')
// 断开
im.disconnect()
消息类型
type MsgType =
| 'TEXT' | 'IMAGE' | 'VIDEO' | 'AUDIO' | 'FILE'
| 'CUSTOM' | 'LOCATION' | 'NOTIFY' | 'RICH_TEXT'
| 'CALL_AUDIO' | 'CALL_VIDEO' | 'FORWARD'
type ChatType = 'SINGLE' | 'GROUP'
ImMessage 结构
interface ImMessage {
id: string
fromId: string
toId: string
chatType: ChatType
msgType: MsgType
content: string
extra?: string
revoked: boolean
createdAt: string
}
自动重连
断线后指数退避重连:3s → 6s → 12s → 最大 30s。disconnect() 后停止,useIm() 在 onUnmounted 中自动调用。
完整类型导出
import type {
SDKConfig,
ImMessage,
SendMessageParams,
ImEventMap,
MsgType,
ChatType,
ApiResponse,
} from '@xuqm/vue3-sdk'
构建
# 类型检查
npm run type-check
# 构建(输出 dist/index.es.js + dist/index.cjs.js + dist/index.d.ts)
npm run build
发版
# 确认 .npmrc 指向 https://nexus.xuqinmin.com/repository/npm-hosted/
npm login --registry=https://nexus.xuqinmin.com/repository/npm-hosted/
npm run build
npm publish