ChatPlus是一个功能完备的聊天应用,提供安全的通信体验和丰富的功能。支持端到端加密、好友管理、群组聊天、消息撤回与编辑、多设备同步以及插件扩展等特性。本 README 包含服务端环境配置、目录结构说明、API 文档链接以及插件系统指南。
- 安全通信:支持消息和文件加密,保护用户隐私
- 用户管理:注册、登录、个人资料管理
- 好友关系:添加好友、接受/拒绝好友请求、好友列表
- 聊天室:创建、加入、退出聊天室
- 消息功能:发送文本、图片、文件和语音消息,支持消息撤回与编辑
- 群组管理:添加/移除群成员、设置群公告
- 多设备同步:支持多设备登录和消息同步
- 文件传输:安全地上传和下载文件,支持文件加密
- 用户状态:设置和查看用户在线状态和自定义状态消息
- 插件系统:支持插件扩展,可自定义功能和集成第三方服务
在项目根目录下创建或修改 .env 文件,配置以下环境变量:
# 服务器配置
PORT=3000 # 服务器端口
# 数据库配置
# SQLite 不需要额外配置,使用默认即可
# 安全配置
ENCRYPTION_KEY=your_encryption_key_here # 用于消息和文件加密的AES-256-CBC密钥,必须是64字符的十六进制字符串
# 注意:此密钥不再有默认值,请务必在.env文件中设置
JWT_SECRET=your-secret-key-here # 替换为安全的随机字符串,用于JWT认证,建议使用64字符的十六进制字符串
JWT_EXPIRES_IN=24h # JWT 令牌过期时间
# 文件配置
UPLOAD_DIR=./uploads # 文件上传目录可以使用以下命令生成安全的随机密钥:
# 生成JWT_SECRET和ENCRYPTION_KEY
node -e "const crypto = require('crypto'); console.log('JWT_SECRET=' + crypto.randomBytes(32).toString('hex')); console.log('ENCRYPTION_KEY=' + crypto.randomBytes(32).toString('hex'));"项目使用Sequelize ORM进行数据库操作。首次运行前需要初始化数据库:
# 运行数据库迁移
npm run db:migrate- ENCRYPTION_KEY 是用于AES-256-CBC加密的密钥,必须是32字符长。请使用安全的随机字符串,不要硬编码在代码中。
- JWT_SECRET 用于用户认证,请使用强密码。可以使用以下命令生成:
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))" - 生产环境中,请确保
.env文件不会被提交到版本控制系统中。 - 定期轮换加密密钥以增强安全性。
- 建议使用HTTPS协议部署应用,以保护传输中的数据。
注意:JWT_SECRET 是用于签署 JWT 令牌的重要密钥,应该替换为一个安全的随机字符串。可以使用以下命令生成:
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
├── .gitignore
├── .sequelizerc
├── .env # 环境变量配置文件
├── LICENSE
├── PLUGIN_SYSTEM_DESIGN.md
├── README.md
├── api-documentation.md # API 文档
├── check-syntax.js # 语法检查工具
├── config/ # 配置文件
│ ├── config.json # 配置文件
│ ├── index.js # 配置管理器
│ └── strings.json # 字符串常量
├── console.js
├── db-migrate.js # 数据库迁移工具
├── db.js # 数据库连接配置
├── index.js # 服务器入口文件
├── logger.js # 日志配置
├── logs/ # 日志文件目录
├── middleware/ # 中间件
│ ├── auth.js # 认证中间件
│ └── errorHandler.js # 错误处理中间件
├── migrations/ # 数据库迁移文件
├── models/ # 数据模型
│ ├── Device.js # 设备模型
│ ├── File.js # 文件模型
│ ├── FriendRequest.js # 好友请求模型
│ ├── Message.js # 消息模型
│ ├── MessageReadStatus.js # 消息已读状态模型
│ ├── Room.js # 房间模型
│ ├── RoomMember.js # 房间成员模型
│ ├── User.js # 用户模型
│ └── UserPublicKey.js # 用户公钥模型
├── modules/ # 功能模块
│ ├── deviceSync.js # 多设备同步模块
│ ├── groupChat.js # 群组管理模块
│ ├── messageEditAndRecall.js # 消息撤回与编辑模块
│ ├── messageReadStatus.js # 消息已读状态模块
│ ├── offlineMessage.js # 离线消息处理模块
│ └── userStatus.js # 用户状态管理模块
├── package.json # 项目依赖
├── plugins/ # 插件目录
│ ├── example-permission/ # 权限示例插件
│ │ ├── config.json
│ │ ├── index.js
│ │ └── package.json
│ └── hello-world/ # 示例插件
│ ├── config.json
│ ├── index.js
│ └── package.json
├── routes/ # 路由
│ ├── health.js # 健康检查路由
│ ├── index.js # 路由入口
│ └── plugins.js # 插件路由
└── utils/ # 工具函数
├── apiDocGenerator.js # API文档生成器
├── crypto.js # 加密工具
├── eventBus.js # 事件总线
├── performanceMonitor.js # 性能监控
└── pluginManager.js # 插件管理器
index.js: 服务器入口文件,负责启动 Express 服务、路由注册、中间件配置和插件系统初始化db.js: 数据库连接配置,初始化 Sequelize 实例并导出logger.js: 日志配置,使用 Winston 实现日志记录功能utils/pluginManager.js: 插件管理器,负责插件的加载、初始化、激活、停用和卸载utils/eventBus.js: 事件总线,实现插件间通信和系统事件处理config/index.js: 配置管理器,负责配置加载和管理
ChatPlus 插件系统允许开发者扩展应用功能,集成第三方服务,实现高度定制化。插件系统基于事件驱动架构,提供简单易用的 API 和完整的生命周期管理。
详细的插件系统设计和开发指南,请参考 插件系统设计文档。
Mixin注入功能的使用指南,请参考 Mixin系统使用指南。
- 模块化: 将功能封装为独立插件,便于开发和维护
- 可扩展: 轻松添加新功能,无需修改核心代码
- 灵活性: 插件可动态加载、激活和卸载
- 松耦合: 通过事件总线实现插件间通信
- 运行时修改: 支持Mixin注入,在运行时动态修改对象行为
- 钩子系统: 提供钩子机制,可在特定时机执行自定义代码
项目提供了 hello-world 和 example-permission 两个示例插件,位于 plugins/ 目录下,展示了插件的基本结构和用法。
- 克隆仓库:
git clone https://github.com/yourusername/chatplus.git - 安装依赖:
cd chatplus && npm install - 配置环境变量: 复制
.env.example为.env并修改配置 - 初始化数据库:
npm run migrate - 启动服务器:
npm start或npm run dev(开发模式)
- Fork 仓库
- 创建特性分支:
git checkout -b feature/your-feature - 提交修改:
git commit -am 'Add some feature' - 推送分支:
git push origin feature/your-feature - 创建拉取请求
API 文档详细描述了所有可用的 API 端点、请求参数和响应格式,包括认证、用户管理、消息处理、文件传输、群组管理和多设备同步等功能。
完整的 API 文档,请参考 API 文档。
- 认证 API: 注册、登录、获取用户信息
- 用户 API: 获取/更新用户信息、状态管理
- 好友 API: 好友请求、好友列表管理
- 消息 API: 发送/接收消息、消息撤回与编辑、已读状态
- 文件 API: 文件上传/下载、文件信息获取
- 群组 API: 群组创建、成员管理、信息更新
- 多设备同步 API: 设备注册、消息同步
- 安装依赖:
npm install- 配置环境变量:
创建 .env 文件并配置必要的环境变量:
# 编辑 .env 文件,设置 ENCRYPTION_KEY、JWT_SECRET 等- 初始化数据库:
npm run migrate- 启动开发服务器:
npm run dev服务器将在 http://localhost:3000 启动,支持热重载。
- 安装依赖(生产模式):
npm install --production- 配置环境变量:
创建 .env 文件并配置必要的环境变量,确保设置适当的安全级别。
- 构建项目:
npm run build- 启动生产服务器:
npm start- 构建 Docker 镜像:
docker build -t chatplus-server .- 运行 Docker 容器:
docker run -d -p 3000:3000 --env-file .env chatplus-server运行单元测试:
npm test运行集成测试:
npm run test-integration- 使用 HTTPS 保护传输中的数据
- 定期轮换加密密钥和 JWT 密钥
- 实施适当的访问控制和输入验证
- 保持依赖包更新,以防止已知漏洞
- 监控日志中的异常活动
- 对敏感数据进行加密存储
- 实施速率限制以防止暴力攻击
- Fork 仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本项目采用 Apache License 2.0 许可证 - 详情见 LICENSE 文件