基于 Node.js + WebSocket 的实时客服系统
| 技术 | 说明 |
|---|---|
Node.js | JavaScript 运行时环境 |
Express | HTTP 服务器框架,处理路由和静态文件 |
WebSocket (ws) | 实时双向通信,消息推送 |
lowdb | 轻量级 JSON 文件数据库 |
bcryptjs | 密码加密存储 |
jsonwebtoken | JWT Token 用户认证 |
| 技术 | 说明 |
|---|---|
原生 HTML/CSS/JS | 无框架依赖,简单轻量 |
WebSocket API | 浏览器原生 WebSocket |
Base64 | 图片编码传输 |
CSS Flexbox | 响应式布局 |
使用 WebSocket 实现浏览器与服务器的实时双向通信:
// 服务器端
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws) => {
ws.on('message', (message) => {
const data = JSON.parse(message);
// 处理消息
});
ws.send(JSON.stringify({ type: 'message', text: 'Hello' }));
});
客服发送消息时,服务器主动推送给目标客户:
// 服务器根据客户手机号查找连接,推送消息
function sendToClient(phone, message) {
const client = clients.get(phone);
if (client && client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify(message));
}
}
图片通过 Base64 编码在网络中传输,无需文件存储:
// 客户端将图片转为 Base64
const reader = new FileReader();
reader.onload = (e) => {
const base64 = e.target.result;
ws.send(JSON.stringify({ type: 'image', image: base64 }));
};
reader.readAsDataURL(file);
客户首次发起对话时,系统自动分配给在线客服:
// 优先分配给当前在线客服
const onlineAgents = agents.filter(a => a.online);
if (onlineAgents.length > 0) {
const agent = onlineAgents[0];
// 绑定客户与客服
}
使用 lowdb 将数据存储为 JSON 文件,简单高效:
const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');
const adapter = new FileSync('data.json');
const db = low(adapter);
// 存储消息
db.get('messages')
.push({ phone, text, role, time: new Date() })
.write();
| 路径 | 页面 | 说明 |
|---|---|---|
/ 或 /chat | 客户端聊天页 | 客户使用的页面 |
/kf | 客服工作台(PC) | 电脑端客服管理页面 |
/kfm | 客服工作台(手机) | 移动端客服页面 |
/admin | 超级管理员后台 | 管理客服账号 |
npm install
npm start
npm install -g pm2
pm2 start server.js --name chat
pm2 save
pm2 startup
使用 Nginx 或 IIS 作为反向代理,可以: