即时通讯系统

收藏

项目介绍

干饭人聊天系统 说明

基于 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 服务端负责所有长连接逻辑,核心能力:

能力 实现
连接绑定 loginuserId ↔ 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