Files

405 lines
12 KiB
Markdown
Raw Permalink Normal View History

2025-12-03 11:01:22 +08:00
# IM系统后端服务
## 项目简介
IM系统后端服务是一个基于Go语言开发的即时通讯系统后端提供用户认证、好友管理、实时聊天、音视频通话、文件上传等完整的IM功能。
## 技术栈
### 核心框架
- **Go 1.24.1** - 编程语言
- **Gin v1.11.0** - HTTP Web框架
- **GORM v1.31.1** - ORM数据库操作框架
- **MySQL** - 关系型数据库
- **Redis v8.11.5** - 缓存和消息队列
### 实时通信
- **Gorilla WebSocket v1.5.3** - WebSocket通信
- **Pion TURN/STUN v2.1.6** - WebRTC中继服务器
### 认证与安全
- **JWT v5.3.0** - JSON Web Token认证
- **bcrypt** - 密码加密
### 工具库
- **Viper v1.21.0** - 配置管理
- **Ants v2.11.3** - 协程池管理
- **golang.org/x/crypto** - 加密工具
## 开发环境要求
- Go 1.24.1 或更高版本
- MySQL 5.7+ 或 MySQL 8.0+
- Redis 6.0+
- Git
## 从拉取到本地开发的步骤
### 1. 克隆项目
```bash
git clone <repository-url>
cd nl-im-service
```
### 2. 安装Go依赖
```bash
go mod download
```
### 3. 配置数据库
#### 3.1 创建MySQL数据库
```sql
CREATE DATABASE nl_im_plus CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
#### 3.2 导入默认用户数据(可选)
```bash
mysql -u root -p nl_im_plus < 添加默认用户信息.sql
```
默认用户信息:
- 用户ID: 10001-10020
- 默认密码: `12345678`
- 邮箱格式: user001@example.com - user020@example.com
- 手机号格式: 13800138001 - 13800138020
### 4. 配置Redis
确保Redis服务已启动默认配置
- 地址: localhost:6379
- 密码: 无(或根据实际情况配置)
### 5. 配置文件设置
编辑 `configs/config.yaml` 文件,配置以下内容:
```yaml
# 数据库配置
database:
dsn: "root:password@tcp(localhost:3306)/nl_im_plus?charset=utf8mb4&parseTime=True&loc=Local"
# Redis配置
redis:
addr: "localhost:6379"
password: "" # 如果有密码则填写
db: 0
# JWT配置
jwt:
secret: "your-jwt-secret-key" # 生产环境请使用强随机密钥
# 应用配置
app:
port: "12080" # 服务端口
node_id: "node-01" # 节点ID集群模式下必须唯一
# 雪花ID配置可选
snowflake:
datacenter_id: 1 # 数据中心ID (0-31)
machine_id: 1 # 机器ID (0-31)
# TURN服务器配置WebRTC
turn:
enabled: true
public_ip: "your-public-ip" # 公网IP
listen_port: 3478
shared_secret: "your-shared-secret"
```
### 6. 创建上传目录
```bash
mkdir -p uploads/images
mkdir -p uploads/videos
```
### 7. 启动服务
```bash
# 方式1: 直接运行
go run cmd/server/main.go
# 方式2: 编译后运行
go build -o server.exe cmd/server/main.go
./server.exe
```
### 8. 验证服务
访问健康检查接口:
```bash
curl http://localhost:12080/api/health
```
## 目录结构
```
nl-im-service/
├── cmd/ # 应用程序入口
│ └── server/
│ ├── main.go # 主程序入口初始化所有服务并启动HTTP服务器
│ ├── build.bat # Windows构建脚本
│ └── dist/ # 编译后的可执行文件目录
├── configs/ # 配置文件目录
│ └── config.yaml # 应用配置文件数据库、Redis、JWT等配置
├── internal/ # 内部代码目录(不对外暴露)
│ ├── api/ # API处理器层HTTP请求处理
│ │ ├── auth_handler.go # 认证相关API登录、注册、验证码
│ │ ├── user_handler.go # 用户管理API用户信息、用户列表
│ │ ├── contact_handler.go # 联系人管理API好友、分组、好友申请
│ │ ├── room_handler.go # 房间管理API创建房间、获取房间信息
│ │ ├── handler.go # 消息和系统API发送消息、历史消息、健康检查
│ │ └── attachment_handler.go # 附件管理API上传、下载、删除附件
│ │
│ ├── service/ # 业务服务层(核心业务逻辑)
│ │ ├── auth_service.go # 认证服务(登录、注册、验证码生成和验证)
│ │ ├── user_service.go # 用户服务用户CRUD操作
│ │ ├── contact_service.go # 联系人服务(好友管理、分组管理、好友申请处理)
│ │ ├── room_service.go # 房间服务房间创建、房间ID生成
│ │ ├── chat_service.go # 聊天服务消息处理、WebSocket分发、Redis集群消息
│ │ ├── attachment_service.go # 附件服务(文件上传、存储、验证)
│ │ └── login_log_service.go # 登录日志服务(记录登录历史)
│ │
│ ├── model/ # 数据模型层数据库实体和DTO
│ │ ├── types.go # 数据模型定义User、ChatMessage、Contact等
│ │ └── response.go # 响应模型定义统一API响应格式
│ │
│ ├── middleware/ # 中间件层(请求处理中间件)
│ │ ├── auth.go # JWT认证中间件Token验证、用户信息注入
│ │ ├── response.go # 响应时间中间件(记录请求开始时间)
│ │ └── request_log.go # 请求日志中间件记录所有API请求信息
│ │
│ ├── utils/ # 工具函数层(通用工具)
│ │ ├── jwt.go # JWT工具Token生成、解析、验证
│ │ ├── password.go # 密码工具(密码加密、验证)
│ │ ├── response.go # 响应工具(统一响应格式、错误处理)
│ │ ├── snowflake.go # 雪花ID生成器全局唯一ID生成
│ │ └── ip_location.go # IP归属地查询工具查询IP地理位置
│ │
│ ├── manager/ # 连接管理器
│ │ └── client_manager.go # WebSocket客户端管理器连接注册、注销、消息广播
│ │
│ ├── turnserver/ # TURN服务器
│ │ └── server.go # TURN/STUN服务器WebRTC中继服务
│ │
│ └── ws/ # WebSocket工作池
│ └── worker.go # WebSocket消息处理工作池异步处理WebSocket消息
├── uploads/ # 文件上传目录
│ ├── images/ # 图片存储目录
│ └── videos/ # 视频存储目录
├── go.mod # Go模块定义文件
├── go.sum # Go依赖校验文件
├── IM_API_Collection.postman_collection.json # Postman API测试集合
├── 添加默认用户信息.sql # 默认用户数据SQL脚本
└── README.md # 项目说明文档(本文件)
```
## 核心功能模块
### 1. 用户认证模块
- 用户注册(邮箱/手机号 + 密码)
- 用户登录(账号 + 密码)
- JWT Token生成和验证
- 邮箱/短信验证码发送和验证
- 登录日志记录
### 2. 用户管理模块
- 用户信息查询和更新
- 用户列表查询(分页)
- 用户创建和删除(管理员功能)
### 3. 联系人管理模块
- 好友搜索
- 添加好友(发送好友申请)
- 好友申请处理(接受/拒绝)
- 好友列表查询
- 好友信息更新(备注、分组、置顶、免打扰)
- 联系人分组管理(创建、更新、删除)
### 4. 房间管理模块
- 创建聊天房间P2P/群聊)
- 获取房间信息
- 房间ID生成P2P使用用户ID组合群聊使用雪花ID
### 5. 消息管理模块
- 发送消息(文本、图片、音频、视频、文件等)
- 获取历史消息(分页)
- WebSocket实时消息推送
- 消息持久化存储
### 6. 附件管理模块
- 文件上传图片最大10MB视频最大500MB
- 文件信息查询
- 文件列表查询(分页)
- 文件删除
### 7. WebRTC音视频通话
- TURN/STUN服务器配置
- ICE服务器信息获取
- 音视频通话信令处理
### 8. 日志系统
- 接口请求日志记录所有API请求
- 登录日志(记录所有登录尝试)
- IP归属地查询
## API接口文档
### 统一响应格式
所有API接口统一返回以下格式
```json
{
"code": 0, // 业务状态码0=成功非0=失败
"message": "获取成功", // 响应消息
"result": {}, // 响应数据
"type": "success", // 响应类型:"success"或"error"
"interface_info": {
"result_time": "22 ms", // 响应时间
"ecs": "localhost" // 服务器标识
}
}
```
**重要说明:**
- 所有接口统一返回HTTP 200状态码
- 错误通过响应体中的`code`字段标识
- 业务状态码0=成功400=参数错误401=未认证404=资源不存在500=服务器错误
### 请求方式
- 只支持 **GET****POST** 两种请求方式
- 更新操作使用 `POST /api/xxx/update/:id`
- 删除操作使用 `POST /api/xxx/delete/:id`
### Postman测试集合
项目根目录提供了 `IM_API_Collection.postman_collection.json` 文件可以直接导入到Postman中使用。
包含的接口:
- 认证模块(登录、注册、验证码)
- 用户管理
- 联系人管理
- 房间管理
- 消息管理
- 附件管理
- 系统接口
## 数据库表结构
### 核心表
- `users` - 用户基本信息表
- `user_contacts` - 用户联系人表(好友关系)
- `contact_groups` - 联系人分组表
- `chat_rooms` - 聊天房间表
- `chat_messages` - 聊天消息表
- `friend_requests` - 好友申请表
- `verification_codes` - 验证码表
- `attachments` - 附件表
### 日志表
- `api_request_logs` - 接口请求日志表
- `login_logs` - 登录日志表
## 配置说明
### 数据库配置
- 支持MySQL 5.7+和MySQL 8.0+
- 字符集utf8mb4
- 时区Local
### Redis配置
- 用于缓存用户在线状态
- 用于集群消息广播
- 用于存储用户路由信息
### JWT配置
- Token过期时间7天可在代码中修改
- 签名算法HS256
### 雪花ID配置
- 数据中心ID0-31
- 机器ID0-31
- 用于生成全局唯一的群聊房间ID
### TURN服务器配置
- 用于WebRTC音视频通话的中继服务
- 需要配置公网IP
- 默认端口3478
## 开发注意事项
### 1. 代码规范
- 所有代码都有详细的中文注释
- 遵循Go语言代码规范
- 使用统一的错误处理方式
### 2. 数据库操作
- 使用GORM进行数据库操作
- 所有表都有中文注释
- 支持自动数据库迁移
### 3. 日志记录
- 本地IP的请求不会记录到日志
- 接口请求日志异步写入,不影响性能
- 登录日志记录所有登录尝试(成功和失败)
### 4. 文件上传
- 图片限制10MB
- 视频限制500MB
- 文件存储在 `uploads` 目录
### 5. 列表返回
- 所有列表接口在数据为空时返回空数组 `[]`,而不是 `null`
## 常见问题
### Q1: 数据库连接失败
**A:** 检查 `configs/config.yaml` 中的数据库配置,确保数据库服务已启动,用户名密码正确。
### Q2: Redis连接失败
**A:** 检查Redis服务是否启动配置中的地址和密码是否正确。
### Q3: 端口被占用
**A:** 修改 `configs/config.yaml` 中的 `app.port` 配置,或关闭占用端口的程序。
### Q4: Token验证失败
**A:** 检查JWT配置中的secret是否正确Token是否过期。
### Q5: 文件上传失败
**A:** 检查 `uploads` 目录是否存在且有写入权限,文件大小是否超过限制。
## 项目特性
- ✅ 统一的API响应格式
- ✅ JWT身份认证
- ✅ WebSocket实时通信
- ✅ WebRTC音视频通话支持
- ✅ 完整的日志系统(请求日志、登录日志)
- ✅ IP归属地查询
- ✅ 雪花ID全局唯一ID生成
- ✅ 文件上传和管理
- ✅ 好友管理和分组
- ✅ 消息持久化存储
- ✅ 分页查询支持
- ✅ CORS跨域支持
## 许可证
[根据实际情况填写]
## 联系方式
[根据实际情况填写]