# tangdou-im **Repository Path**: weedlu/tangdou-im ## Basic Information - **Project Name**: tangdou-im - **Description**: 仿照WX开发的页面端即时通讯软件,私聊、群聊、好友,发信息、文件、图片、音频、视屏一个都不少 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-08 - **Last Updated**: 2026-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 糖豆IM 糖豆IM 是一个类似微信效果的即时通讯系统,不依赖任何第三方收费组件。 - 支持私聊、群聊、离线消息、语音 / 图片 / 文件、已读未读、群 @ 等功能 - 支持音视频通话,基于原生 WebRTC 实现,不依赖收费第三方 SDK - 后端采用 Spring Boot + Netty + mybatis-plus - 网页端、移动端用 Vue3 + Element Plus + Websocket - 服务器支持集群化部署,具备良好的横向扩展能力 ## 项目结构 | 模块 | 功能 | |------|------| | im-platform | 业务平台服务,负责处理来自用户的业务请求(HTTP) | | im-server | 消息推送服务,不依赖业务,负责将消息推送给用户(WS) | | im-agent | 聊天机器人服务,负责与 im-platform 通信,处理业务逻辑(HTTP) | | im-client | 消息推送 SDK,其他服务可集成此 SDK 与 im-server 通信 | | im-common | 公共包,后端服务均依赖此包 | | im-web | Web 页面 | | im-h5 | H5 页面 | ## 消息推送方案 当消息的发送者和接收者连的不是同一个 server 时,消息无法直接推送,因此设计了支持跨节点推送的方案: - 利用 Redis 的 List 实现消息推送,其中 key 为 `im:message:private:${serverId}`,每个 key 可视为一个 queue,每个 im-server 根据自身 id 只消费属于自己的 queue - Redis 记录了每个用户的 WS 连接所在的 im-server;用户发送消息时,im-platform 根据其所连接的 im-server id,决定将消息推向哪个 queue ## 本地启动 ### 1. 安装运行环境 - Node:v22.2.2 - JDK:21 - Maven:3.9.6 - MySQL:8.0(账号密码均为 `root` / `root`),创建名为 `im_platform` 的数据库,并执行 `db/im_platfrom.sql` 脚本 - Redis:6.2 - MinIO:RELEASE.2024-xx,使用默认账号、密码、端口 ### 2. 启动后端服务 ```bash mvn clean package java -jar ./im-platform/target/im-platform.jar java -jar ./im-server/target/im-server.jar ``` ### 3. 启动前端 Web ```bash cd im-web npm install npm run dev ``` 访问 http://localhost:8080 ### 4. 启动 H5 ```bash cd im-h5 npm install npm run dev ``` 访问 http://localhost:5173 ### 5. 启动聊天机器人服务 ```bash cd im-agent # 删除旧venv # Remove-Item -Recurse -Force venv # 安装虚拟环境 # python -m venv venv # 激活虚拟环境 # On Windows: venv\Scripts\activate # On Linux: source venv/bin/activate # PowerShell 默认**执行策略阻止运行本地脚本**,`Activate.ps1` 是虚拟环境激活脚本,被策略拦截。 # Set-ExecutionPolicy RemoteSigned -Scope CurrentUser venv\Scripts\activate # 在虚拟环境中安装依赖 # pip install -r requirements.txt uvicorn app.main:app --reload --host 0.0.0.0 --port 8100 ``` 访问 http://localhost:8100