项目介绍
干饭人聊天系统 说明
基于 ThinkPHP 6 的即时通讯(IM)系统,融合「今天吃什么」轻量工具,支持 PC 、H5 双端同步。
音视频通话与实时消息采用 WebRTC + Workerman WebSocket 信令服务 实现。
一、项目概述
| 项 | 内容 |
|---|---|
| 项目名称 | RainChat |
| 定位 | 私域 IM 社交 + 轻量生活工具(今天吃什么) |
| 后端框架 | ThinkPHP 6(PHP>= 7.4.3) |
| 实时通信 | Workerman 4.1.17(WebSocket,端口 8282) |
| 音视频 | WebRTC(信令经 WS 中转,STUN/TURN 可在后台配置) |
| 前端 | 原生 JS + jQuery(PC / H5 / Admin 三套静态资源) |
| 数据库 | MySQL,utf8mb4 |
系统采用 自动路由(关闭 URL 转换),控制器方法即 API 端点,页面与接口混合在同一个控制器中(页面用 View::fetch,接口用 json_success/json_error 返回 JSON)。
二、关键链路说明
- 持久连接:用户在页面加载时建立 WebSocket 连接并向服务端
login绑定userId,之后的消息、通知、通话信令全部走 WS 长连接。 - 在线状态:WS 进程将在线用户写入
runtime/ws_online.json,HTTP 应用层读取该文件 + Cache 双来源合并,作为「在线」实时数据。 - 落库策略:实时消息由 WS 校验后投递,同时 HTTP 侧
Chat::save负责将消息持久化到rc_chat_logs(WS 不可用时也能保存)。
三、目录结构
rainchat/
├── app/
│ ├── controller/ # 控制器(页面 + API 混合)
│ │ ├── Base.php # 基础控制器:登录校验、共享视图变量、usertype
│ │ ├── Index.php # PC 入口:首页/登录/注册/chi/myfood/chat/公开设置
│ │ ├── H5.php # H5 入口:移动端页面
│ │ ├── User.php # 用户注册/登录/资料/改密
│ │ ├── Friend.php # 好友增删改查、请求处理
│ │ ├── Group.php # 群组创建/搜索/加入/退出/解散/管理
│ │ ├── Chat.php # 消息历史/会话/未读/上传/落库
│ │ ├── Call.php # 音视频通话记录
│ │ └── Admin.php # 后台:统计/用户/消息/通话/设置/清缓存
│ ├── model/ # 模型
│ │ ├── User / Friend / Group / GroupMember /
│ │ ├── ChatLog / CallLog / Settings / Food
│ └── view/ # 模板(注意:在 rainchat/view 而非 app/view)
│ ├── pc/ login/register/chi/myfood/chat
│ ├── h5/ login/register/chi/myfood/chat
│ └── admin/ login/dashboard/users/messages/calls/settings/clearcache
├── extend/WebSocket/
│ └── Server.php # 核心 WS 服务(基于 Workerman)
├── public/static/
│ ├── pc/ h5/ admin/ chi/ # 三端静态资源
├── config/database.php # 数据库连接(127.0.0.1 / rainchat / root / root)
├── database/rainchat.sql # 建表 SQL + 默认管理员 + 默认设置
├── start_ws.php # WS 服务启动入口
└── restart_ws.bat # 一键重启 WS(Windows 管理员运行)
四、权限体系
1. 双账号体系(主号 / 小号)
注册时会自动创建两个账号(同一用户名):
- 小号:密码:
123456,默认只能使用干饭人「今天吃什么」)。 主号:密码:
自定义,可使用完整 IM 聊天(需邀请注册,否则没有IM权限)。shareid:每个用户注册后(主号)随机生成,用于邀请推广。带?shareid=注册会建立邀请关系,并使邀请者能使用IM权限。
五、核心功能模块
模块 1:用户与鉴权(User 控制器)
注册:默认开启(后台可关),自动建主号+小号。
登录:相同账号,不同密码,进入不同的账号体系。
模块 2:好友管理(Friend 控制器)
好友列表:已接受好友 + 待确认请求(pending)。
邀请注册:不带邀请码的普通注册,不会开通IM权限。
实时性:添加成功后前端通过 wsSend({type:'friend_request'}) 推送,对方无需刷新即可收到。
添加好友,同意请求,拒绝请求,删除好友 WS 推送 自动同步端到端状态。
模块 3:群组管理(Group 控制器)
退群:群主不可退(须解散)。
解散群:仅群主,删除成员 + 群消息 + 群。
入群密码:仅群主,设置/取消
模块 4:消息系统(Chat 控制器 + WebSocket)
标记已读、未读
消息落库:私聊校验好友关系、群聊 校验成员关系后入库
消息类型:支持 文字、图片、文档、音频、视频、压缩包, 支持 发送(最大60秒)语音消息
文件上传: upload 图片/语音/视频/文档白名单,大小限制(默认 10MB)
记录删除:历史消息 会自动删除(后台设置秒数),删除记录同时会清理关联附件(图片、文件、语音等)
消息类型:text / image / file / voice(1-60s)/ video。
模块 5:实时通信(extend/WebSocket/Server.php,Workerman)
WS 服务端负责所有长连接逻辑,核心能力:
| 能力 | 实现 |
|---|---|
| 连接绑定 | login 将 userId ↔ clientId 映射,支持多端同时在线 |
| 心跳 | 55s 定时检测,120s 无心跳清理僵尸连接 |
| 私聊投递 | chat_message → 校验好友关系 → forwardToUser |
| 群聊广播 | group_message → 校验群成员 → 广播给在线成员 |
| 在线状态 | presence 广播上线/下线;写入 runtime/ws_online.json |
| 通话信令 | call_invite/accept/reject/cancel/end + webrtc_offer/answer/ice 中转 |
| 好友通知 | friend_request/accept/reject/remove 实时转发 |
| 输入状态 | typing 提示 |
| 群缓存刷新 | group_refresh 主动失效群成员缓存(加入/退出/踢人/解散后) |
好友 / 群成员缓存:WS 进程内 30s 好友缓存、15s 群成员缓存,均在 accept/remove/join/quit 等操作时主动失效,避免脏读。
PDO 连接:WS 内独立维护一条 MySQL 连接用于群成员与好友校验,已实现「连接失败自动重置重连」「仅在查询成功时缓存」。
模块 6:音视频通话(Call 控制器 + WebRTC)
| 功能 | 方法 | 说明 | |
|---|---|---|---|
| 记录通话 | log |
保存 caller/callee/type(audio\ | video)/status/duration |
| 通话记录 | logs |
分页查询,格式化时长与状态,标记主叫/被叫 |
- 信令(offer/answer/ICE)全部经 WS 中转,媒体流 P2P 直连(可配 TURN 兜底)。
- STUN/TURN 服务器地址在后台「系统设置」配置,前端通过
Base共享到视图。
模块 7:干饭人(今天吃什么)
记录餐饮:分时间段,抽取随机菜单入库。
我的记录:查询餐饮记录
这是(小号)默认功能,非邀约的主号,也会默认只有该功能,没有IM权限。
模块 8:管理后台(Admin 控制器)
仪表盘:用户/活跃/在线/消息/通话/好友总数 + 今日量 + 近 7 天消息趋势。
用户管理:列表/搜索/封禁启用/删除。
消息管理、通话管理
系统设置:站点名/WS地址/STUN·TURN/注册开关/上传大小/版本号/消息清理时间。
缓存清理:模板缓存 / 数据缓存(含 runtime/cache 递归清理)
七、部署与运行
1. 环境
- LNPM ,php>=7.4
2. Nginx伪静态
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}
3. 启动 WebSocket 服务(单独启动)
HTTP 接口随 Web 服务器(nginx)自动生效,但 WS 是独立常驻进程,修改 Server.php 后必须重启才生效。
REM 步骤1:找到占用 8282 的进程
netstat -ano | findstr :8282 | findstr LISTENING
REM 步骤2:终止旧进程(可能需要管理员权限)
taskkill /F /PID <pid>
REM 步骤3:启动新进程
php start_ws.php start
已提供
restart_ws.bat一键脚本:右键「以管理员身份运行」即可(Windows 不支持 Workerman 的stop/restart/-d守护模式,需手动 kill + start)。
更新时间:2026-08-19 15:38:19