一个基于 Tauri 和 Vue 3 构建的跨平台即时通讯客户端应用程序。
IM Client (Lucky) 是一个功能丰富的即时通讯客户端,支持一对一聊天、群聊、文件传输、音视频通话、屏幕录制、屏幕截取、扫码登录等核心功能。该项目使用现代化的前端技术栈构建,通过 Tauri 框架打包为跨平台桌面应用。
### 后端与跨平台 - 框架:Tauri 2.5(Rust + WebView,轻量桌面应用) - 语言:Rust(安全、高性能后端逻辑) - 数据库:SQLite(本地持久化,高效查询)🗄️ - 网络:WebSocket & HTTP(实时通信 + 文件传输) - 序列化:Protobuf(高效数据序列化协议)
### 扩展技术 - 音视频:WebRTC(P2P 通话,低延迟) - 推送:WebSocket(即时消息通知) - 截图/录屏:Screenshots (Rust) + FFmpeg(专业音视频处理工具) - 分词:Jieba(中文文本处理)






消息转发:支持转发消息给其他联系人或群组
联系人信息:展示联系人详细信息,支持备注设置
录制功能:支持通话录制(需用户授权)
文件管理:支持查看和管理已接收文件
im-client/
├── proto/ # Protocol Buffer 定义
├── public/ # 静态资源
├── src/ # 前端源码
│ ├── api/ # API 接口封装
│ │ └── index.ts # 统一API入口,封装所有后端接口调用
│ ├── assets/ # 静态资源 (图片、样式、语言包等)
│ │ ├── i18n/ # 国际化语言包
│ │ │ ├── en-US.json # 英文语言包
│ │ │ └── zh-CN.json # 中文语言包
│ │ ├── iconfont/ # 字体图标
│ │ ├── json/ # JSON数据文件
│ │ └── style/ # 全局样式文件
│ │ ├── fonts/ # 字体文件
│ │ └── scss/ # SCSS样式文件
│ ├── components/ # 公共组件
│ │ ├── Bubble/ # 消息气泡组件(不同类型消息的展示)
│ │ ├── ChatDetail/ # 聊天详情组件
│ │ ├── Sticker/ # 表情选择器组件
│ │ ├── FileUpload/ # 文件上传组件
│ │ ├── Message/ # 消息容器组件
│ │ ├── Setting/ # 设置相关组件
│ │ └── ... # 其他公共组件
│ ├── constants/ # 常量定义
│ │ ├── MessageCode.ts # 消息状态码定义
│ │ └── index.ts # 其他常量导出
│ ├── database/ # 数据库相关 (ORM、实体、映射器)
│ │ ├── entity/ # 数据实体定义
│ │ ├── mapper/ # 数据访问映射器
│ │ └── orm/ # 自定义ORM框架
│ ├── directive/ # Vue 指令
│ │ ├── dompurify/ # DOM安全净化指令
│ │ ├── lazy/ # 图片懒加载指令
│ │ └── ... # 其他自定义指令
│ ├── docs/ # 项目文档
│ │ └── RNNoise集成指南.md # 噪音抑制集成文档
│ ├── hooks/ # Vue Composition API Hooks
│ │ ├── useWebRTC.ts # WebRTC相关Hook
│ │ ├── useWebSocketWorker.ts # WebSocket通信Hook
│ │ ├── useChatInput.ts # 聊天输入处理Hook
│ │ └── ... # 其他功能Hooks
│ ├── i18n/ # 国际化配置
│ │ └── index.ts # 国际化实例配置
│ ├── layout/ # 布局组件
│ │ ├── header/ # 头部布局
│ │ ├── main/ # 主体布局
│ │ ├── side/ # 侧边栏布局
│ │ └── index.vue # 根布局组件
│ ├── models/ # 数据模型
│ │ └── index.ts # 所有数据模型定义
│ ├── plugins/ # Vue 插件
│ │ ├── modules/ # 各个插件模块
│ │ └── index.ts # 插件注册入口
│ ├── proto/ # 生成的 Protocol Buffer 代码
│ ├── router/ # 路由配置
│ │ └── index.ts # 路由定义和配置
│ ├── store/ # 状态管理 (Pinia)
│ │ ├── modules/ # 各模块状态
│ │ ├── plugins/ # 状态管理插件
│ │ └── index.ts # 状态管理入口
│ ├── types/ # TypeScript 类型定义
│ ├── utils/ # 工具函数
│ │ ├── Http.ts # HTTP请求工具
│ │ ├── Storage.ts # 本地存储工具
│ │ ├── WebRTC2.ts # WebRTC工具
│ │ └── ... # 其他工具函数
│ ├── views/ # 页面视图
│ │ ├── message/ # 消息页面
│ │ ├── contact/ # 联系人页面
│ │ ├── call/ # 音视频通话页面
│ │ ├── setting/ # 设置页面
│ │ └── ... # 其他页面
│ ├── windows/ # 窗口管理
│ │ ├── main.ts # 主窗口管理
│ │ ├── login.ts # 登录窗口管理
│ │ └── ... # 其他窗口管理
│ ├── worker/ # Web Workers
│ │ ├── Websocket.worker.ts # WebSocket Worker
│ │ └── ... # 其他 Worker
│ ├── App.vue # 根组件
│ ├── core.ts # 核心初始化逻辑
│ └── main.ts # 入口文件
├── src-tauri/ # Tauri 后端源码
│ ├── capabilities/ # 权限配置
│ ├── resources/ # 资源文件
│ │ └── sql/ # 数据库SQL脚本
│ ├── src/ # Rust 源码
│ │ ├── commands.rs # Tauri命令处理
│ │ ├── lib.rs # 库入口
│ │ ├── main.rs # 主程序入口
│ │ └── ... # 其他Rust模块
│ ├── Cargo.toml # Rust 依赖配置
│ └── tauri.conf.json # Tauri 配置
├── index.html # HTML 模板
├── package.json # Node.js 项目配置
├── vite.config.ts # Vite 配置
└── README.md # 项目说明文档
使用 nvm (Node Version Manager) 管理多个 Node.js 版本
Rust >= 1.70.0
使用 rustup 管理 Rust 版本
pnpm >= 8.0.0
相比 npm 和 yarn 有更好的性能
Protocol Buffer Compiler (protoc)
bash
git clone <repository-url>
cd im-client
```bash # 安装项目依赖 pnpm install
# 如果遇到依赖问题,可以尝试清除缓存后重新安装 pnpm store prune pnpm install ```
```bash # 全局安装 Tauri CLI 工具 pnpm add -g @tauri-apps/cli
# 或者使用 npx 运行(推荐) npx tauri --version ```
```bash # 使用官方脚本安装 Rust curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 安装完成后,重启终端或运行以下命令加载环境变量 source $HOME/.cargo/env
# 验证安装 rustc --version cargo --version ```
```bash # Windows (Chocolatey) choco install protoc
# macOS (Homebrew) brew install protobuf
# Ubuntu/Debian sudo apt install protobuf-compiler
# 验证安装 protoc --version ```
# 启动开发服务器(仅前端)
pnpm dev
# 启动 Tauri 开发模式(前后端同时启动)
pnpm tauri dev
# 启动开发服务器并指定环境
pnpm dev --mode development
# 启动带调试工具的开发服务器
pnpm dev --debug
# 启动 Tauri 开发模式并启用调试
pnpm tauri dev --debug
项目支持多种环境配置:
.env: 默认环境配置.env.development: 开发环境配置.env.production: 生产环境配置环境变量包括:
VITE_API_SERVER: 后端API服务器地址VITE_API_SERVER_WS: WebSocket服务器地址VITE_APP_NAME: 应用名称# 构建前端资源(开发模式)
pnpm build
# 构建前端资源(生产模式)
pnpm build --mode production
# 构建 Tauri 应用(生产版本)
pnpm tauri build
# 构建调试版本(用于测试)
pnpm tauri:build:debug
# 构建指定平台的应用
pnpm tauri build --target x86_64-pc-windows-msvc
# 生成 TypeScript 的 Protocol Buffer 代码
pnpm gen:proto:ts-protos
构建完成后,产物位于以下目录:
dist/: 前端构建产物src-tauri/target/release/: Tauri 应用构建产物.msi 或 .exe 文件.app 或 .dmg 文件.AppImage 或 .deb 文件聊天系统是 IM 客户端的核心模块,负责处理所有与消息相关的功能。
src/components/Bubble/ - 各类消息气泡组件text.vue: 文本消息气泡image.vue: 图片消息气泡file.vue: 文件消息气泡audio.vue: 音频消息气泡video.vue: 视频消息气泡system.vue: 系统消息气泡src/components/Message/ - 消息容器组件src/views/message/ - 消息主界面ChatView/: 聊天列表视图ContentView/: 聊天内容视图联系人系统管理用户的好友关系和群组信息。
src/views/contact/ - 联系人主界面ContactView/: 联系人列表视图ContentView/: 联系人详情视图src/components/SelectContact/ - 联系人选择器src/components/UserPopover/ - 用户信息弹窗音视频通话模块基于 WebRTC 技术实现,提供高质量的实时通信功能。
src/views/call/ - 通话界面single.vue: 单人通话界面group.vue: 群组通话界面accept.vue: 通话邀请接受界面src/hooks/useWebRTC.ts - WebRTC 相关 Hooksrc/hooks/useNoiseSuppression.ts - 音视频噪音抑制文件传输模块支持各种类型文件的安全传输和管理。
src/components/Bubble/file.vue - 文件消息气泡src/components/FileUpload/ - 文件上传组件src/hooks/useFileTransfer.ts - 文件传输 Hooksrc/views/preview/file.vue - 文件预览界面数据库系统使用 SQLite 实现本地数据存储,支持高效的数据访问和查询。
src/database/entity/Chats.ts - 聊天会话src/database/entity/Friends.ts - 好友关系src/database/entity/SingleMessage.ts - 单聊消息src/database/entity/GroupMessage.ts - 群聊消息src/database/entity/Groups.ts - 群组信息系统设置模块允许用户自定义应用行为和界面。
src/views/setting/ - 设置主界面src/components/Setting/ - 各类设置组件General.vue: 通用设置Notification.vue: 通知设置Shortcut.vue: 快捷键设置StorageManageDialog.vue: 存储管理Theme.vue: 主题设置Profile.vue: 个人信息IM Client 使用 SQLite 作为本地数据库,存储用户数据和消息历史。
存储聊天会话信息,包括单聊和群聊会话。
存储好友信息及相关元数据。
存储单聊消息的详细信息。
存储群聊消息的详细信息。
支持搜索结果排序
事务处理
支持批量操作的原子性
性能优化
IM Client 使用 WebSocket 实现实时消息推送和通信,使用谷歌Protobuf序列化协议
```typescript const MessageType = { ERROR: { code: -1, description: "信息异常" }, LOGIN_OVER: { code: 900, description: "登录过期" }, REFRESHTOKEN: { code: 999, description: "刷新token" }, LOGIN: { code: 1000, description: "登陆" }, HEART_BEAT: { code: 1001, description: "心跳" }, FORCE_LOGOUT: { code: 1002, description: "强制下线" }, SINGLE_MESSAGE: { code: 1003, description: "私聊消息" }, GROUP_MESSAGE: { code: 1004, description: "群发消息" }, VIDEO_MESSAGE: { code: 1005, description: "视频消息" }, AUDIO_MESSAGE: { code: 1006, description: "音频通话" }, CREATE_GROUP: { code: 1500, description: "创建群聊" }, GROUP_INVITE: { code: 1501, description: "群聊邀请" }, ROBOT: { code: 2000, descript
$ claude mcp add Lucky-client \
-- python -m otcore.mcp_server <graph>