# bzGhost **Repository Path**: fuzw98/yiqun ## Basic Information - **Project Name**: bzGhost - **Description**: 支持chatGpt客服聊天 支持所有端的聊天软件,高仿微信,用到的技术栈 electron uniapp nvue uni netty java 支持文字红包 聊天 ,支持群组建群等功能。有管理端 安卓端 苹果端 window端 mac端 linux端等。跨平台即时通讯软件,个人玩的转。 支持分布式部署 单机支持百万 通过集群理论能实现PB数据通信 - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: 2023 - **Homepage**: http://yuyaogc.com/ - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 95 - **Created**: 2023-09-19 - **Last Updated**: 2023-09-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [![输开源协议](https://img.shields.io/badge/License-Apache--2.0-brightgreen.svg "Apache")](https://www.apache.org/licenses/LICENSE-2.0) [![maven最新版本](https://maven-badges.herokuapp.com/maven-central/org.j-im/jim-core/badge.svg "maven最新版本")](https://maven-badges.herokuapp.com/maven-central/org.j-im/jim-core) # 测试 ## ![](/assets/logo.png)bzGhost简介 支持所有端的聊天软件,高仿微信,支持文字红包 聊天 ,支持群组建群等功能。全端支持。 bzGhost 打造跨终端跨平台即时通讯,个人也能玩的转的聊天软件。 chatGpt聊天功能,AI客服。 ## 官方网站 [http://yuyaogc.com/](http://yuyaogc.com/) ![](/assets/banner.jpg) ## 版权信息 软件遵循[MIT](https://baike.baidu.com/item/MIT/10772952)开源协议,意味着您无需支付任何费用,也无需授权,即可将 软件应用到您的产品中。 注意:这并不意味着您可以将软件应用到非法的领域,比如涉及赌博、色情、暴力、宗教等方面。 如因此产生纠纷等法律问题, 作者不承担任何责任。切勿以身试法!!! 网络不是法外之地 ## 功能 1.群组(创建群组,拉人,踢人,禁言,群红包,)
2.私聊 (转账,图片,文字,语音,视频,文件,表情)
3.红包(抢红包,运气红包,口冷红包)
4.通讯录
5.朋友圈 (点赞,评论)
6.商城 (商品列表,商品购买,商品下单)
7.订单 (商品订单,已经支付,完成订单等)
8.客服 支持chatGpt聊天 ## 产品展示 ![](/assets/w100.png) ![](/assets/img.png) ![](/assets/img_1.png) ### 1.5 账号说明 \*\*注意: 管理员账号:admin / 123456 测试账号:18767176707 / 123456 ## 参考文献 * [https://gitee.com/lele-666/V-IM.git](https://gitee.com/lele-666/V-IM.git) * [http://doc.ruoyi.vip/ruoyi/](http://doc.ruoyi.vip/ruoyi/) * [https://gitee.com/xiaowang0482/wechat.git](https://gitee.com/xiaowang0482/wechat.git) ## 联系方式 * 如有问题联系作者 微信 18767176707 * 讨论加群:qq群 [^1]1025293030 # 技术选型 | 技术 | 说明 | 官网 | | :--- | :--- | :--- | | Electron | Electron基于Chromium和Node.js | [https://www.electronjs.org/](https://www.electronjs.org/) | | uni-app | 使用Vue.js开发手机端应用的框架 | [https://uniapp.dcloud.io/](https://uniapp.dcloud.io/) | | Netty | 网络应用程序框架 | [https://netty.io/](https://netty.io/) | | Spring Boot | 核心框架 | [https://spring.io/projects/spring-boot/](https://spring.io/projects/spring-boot/) | | MyBatis | 持久层 | [https://mybatis.org/mybatis-3/zh/index.html](https://mybatis.org/mybatis-3/zh/index.html) | | Redis | 缓存 | [https://redis.io/](https://redis.io/) | | Maven | 项目构建 | [https://maven.apache.org/](https://maven.apache.org/) | | Mysql | 数据库 | [https://www.mysql.com/](https://www.mysql.com/) | | Uview | 兼容uni-app | [https://www.uviewui.com/](https://www.uviewui.com/) | | iView | Vue高质量组件库 | [http://v1.iviewui.com/](http://v1.iviewui.com/) | | Ignite | 以内存为中心的分布式数据库 | [https://ignite.apache.org/](https://ignite.apache.org/) | | Zookeeper | 中心节点 | [https://zookeeper.apache.org/](https://zookeeper.apache.org/) | | tkmybatis | TKMybatis 是基于 Mybatis 框架开发的一个工具 | | # 下载 --- 会将各个版本的演示在此展示,目前演示的版本有安卓,电脑,后台管理,其他版本演示将会陆续添加 ## 演示地址 | 链接 | 语言 | 版本 | 开源 | | :--- | :--- | :--- | :--- | | [后台管理](http://42.193.146.14:8089) | Element | 1.0.0 | 有偿 | | [安卓端](http://42.193.146.14:8089/__UNI__0E0525C__20220321202044.apk) | Uniapp | 1.0.0 | 100% | | [电脑端](http://42.193.146.14:8089/bzGhost3.0.0.exe) | Electron | 1.0.0 | 100% | | API | Java | 1.0.0 | 有偿 | ## 账号说明 --- \*\*注意: 管理员账号:admin /123456 测试账号:test/123456 ## 开源部分 [https://gitee.com/Huiyun-Co/yiqun.git](https://gitee.com/Huiyun-Co/yiqun.git) [http://42.193.146.14:9998/swagger-ui.html\#/](http://42.193.146.14:9998/swagger-ui.html#/) # bzGhost IM介绍 bzGhost IM 是专门为Web前端开发者打造的IM产品,致力于打造一款天生支持H5、Uniapp和各种小程序,集成简单、高性价比,功能全面、安全可靠的IM。 ## 应用场景 bzGhost IM可以帮助Web前端开发者快速实现私聊、群聊、在线客服等各种场景的IM功能 | 场景分类 | 场景 | | :--- | :--- | | 平台互动 | 站内私信 医患沟通 在线招聘 游戏互动 家校交流 线上课堂 | | 政企办公 | 政府办公交流 企业工作沟通 | | 社交沟通 | 兴趣社群 婚恋交友 校园交友 私密交友 | | 在线客服 | 电商沟通 用户咨询 技术支持 | ## 功能特性[​](https://docs.goeasy.io/2.x/im#功能特性) {#功能特性} ### 支持各种消息类型[​](https://docs.goeasy.io/2.x/im#支持各种消息类型) {#支持各种消息类型} 支持发送文字、表情、图片、语音、和视频消息,也支持开发者根据业务需求实现类似于医生处方、电商订单以及红包等自定义类型消息的发送。 ### 会话列表[​](https://docs.goeasy.io/2.x/im#会话列表) {#会话列表} 实时显示最近沟通过的私聊或者群聊会话信息,包括每个会话的未读消息数、最后一条消息的时间和内容,支持会话置顶或会话删除。 ### 消息云端存储[​](https://docs.goeasy.io/2.x/im#消息云端存储) {#消息云端存储} 在任何设备上均可同步拉取云端消息历史记录,支持消息撤回、删除操作。也可以通过Webhook调用开发者设置的回调地址,将消息同步至指定服务器。 ### 通知提醒和离线补发[​](https://docs.goeasy.io/2.x/im#通知提醒和离线补发) {#通知提醒和离线补发} 如果用户不在线或网络不稳定,当用户重新上线,系统将自动补发离线期间的消息。 对于微信小程序、Uniapp开发的App,当应用在后台运行或进程被杀掉时,支持通过微信公众号模板消息或手机通知栏推送提醒用户,BzGhost已集成所有主流手机厂商通道:苹果iOS(APNs)、华为、小米、OPPO、VIVO、魅族和Google FCM。 ### 消息已读未读[​](https://docs.goeasy.io/2.x/im#消息已读未读) {#消息已读未读} 支持消息发送方查看消息的已读状态,了解接收方是否已阅读该条消息。 ### 多设备消息同步[​](https://docs.goeasy.io/2.x/im#多设备消息同步) {#多设备消息同步} 支持同一用户的消息在多个不同设备(app、小程序和网页)之间保持实时同步,支持一个用户最多8个设备同时在线。 ## BzGhost IM优势[​](https://docs.goeasy.io/2.x/im#goeasy-im优势) {#goeasy-im优势} | 优势 | 描述 | | :--- | :--- | | 集成简单 | 傻瓜式API, 最快半天集成! | | 高性价比 | 一次性付费,终身买断。 | | 一对一技术支持 | 技术人员在线提供1对1技术支持\(周一至周五\), 紧急事务7 X 24小时电话技术支持 | | 性能卓越 | 海量用户同时在线, 每秒千万级消息实时必达! | | 安全私密 | 独创bzGhost OTP技术结合HTTPS,确保您的数据私密传输 | | 健壮可靠 | 跨区多活灾备,自动水平扩展,99.95%高可用承诺,完美应对爆发式活动支持 | ## webPacketCode ### 数据包解码文件 --- 报文格式:magic4字节 + 版本1字节 + 序列化算法1字节 + 指令1字节 + 数据长度4字节 + 数据内容总字节长度 = 11 + 数据内容长度 * **编码encode** ```js let dataView = new DataView(buffer) dataView.setInt32(0, 0x12345678) dataView.setInt8(4, packet.version) dataView.setInt8(5, 1) // 写死1表示json序列化 dataView.setInt8(6, packet.command) dataView.setInt32(7, bytes.length) for (let i = 11; i < bytes.length + 11; i++) { dataView.setUint8(i, bytes[i - 11]) } ``` * **解码decode** ```js let dataView = new DataView(buffer) let lenght = dataView.getInt32(7) let bytes = [] for (let i = 11; i < lenght + 11; i++) { bytes[i - 11] = dataView.getUint8(i) } ``` ## ## webIm ### 通讯文件 --- * 分离了API 与webSocket 。 * 群通道,用户通道。 * 重试次数,心跳检测,断网重连。 * 字节传输,支持自定义加密解密等功能。 ### 用户绑定 --- * **方法名** login * **参数说明** | 属性名 | 备注 | 类型 | 可选值 | | :--- | :--- | :--- | :--- | | userId | 用户唯一标识 | String | 5f6d9d98 | | groupIds | 群组ids | Array | \["",""\] | | command | 指令集 | Number | 1 | | version | 版本号 | Number | 1 | * **示例代码** ```js import webim from '@/util/socket/webim.js'; // 全局初始化 webim.initSocket(); webim.login(userId, groupIds ,command, version, res=>{ //输出res }); ``` * **请求入参** ```js let packet = { version:1, command: 1, userId:"5f6d9d98", groupIds:["dasdasdsa"] } ``` * **响应参数** ```js let packet = { version : 1, command: 2, errorMsg:"", success: true } ``` ### 发送消息 --- * **方法名** sendMessage * **参数说明** | 属性名 | 备注 | 类型 | 可选值 | | :--- | :--- | :--- | :--- | | isItMe | 发送人 | Boolen | false/true | | contentType | 消息类型\(文字/图片/语音/视频/红包\) | Number | 0/1/2/3/4/5 | | content | 消息内容 | String | 测试 | | createTime | 创建时间 | Date | 2021-11-2 | | hasBeenSentId | 消息id | String | 1447565 | | fromUserId | 发送人id | String | 220e805b8521444e9f27d78e45633b44 | | fromUserName | 发送人账户 | String | test | | fromUserHeadImg | 发送人图像 | String | defalut.jpg | | userId | 当前用户id | String | 5f6d9d98 | | toUserId | 接收人id | String | 5f6d9d98 | | toUserName | 接收人账户 | String | admin | | toUserHeadImg | 接收人图像 | String | defalut.jpg | | chatType | 聊天类型\(群/私\) | Number | 1/0 | | version | 版本 | Number | 1 | | command | 指令集 | Number | 3 | * **请求入参** ```js let packet = { isItMe: true, contentType: 0, content: "测试", createTime: Date.now(), hasBeenSentId: Date.now(), fromUserId: "5f6d9d98", fromUserName: "admin", fromUserHeadImg: '/static/image/huge.jpg', userId: "5f6d9d98", toUserId: "220e805b8521444e9f27d78e45633b44", toUserName: "test", toUserHeadImg:'/static/image/huge.jpg', chatType: 0, version : 1, command: 3, }; ``` * **响应参数** ```js let packet = { isItMe: true, contentType: 0, content: "测试", createTime: Date.now(), hasBeenSentId: Date.now(), fromUserId: "5f6d9d98", fromUserName: "admin", fromUserHeadImg: '/static/image/huge.jpg', userId: "5f6d9d98", toUserId: "220e805b8521444e9f27d78e45633b44", toUserName: "test", toUserHeadImg:'/static/image/huge.jpg', chatType: 0, version : 1, command: 4, }; ``` ### 指令集参照表 | 指令集 | 备注 | | :--- | :--- | | 1 | 用户绑定请求 | | 2 | 用户绑定响应 | | 3 | 发送消息请求 | | 4 | 发送消息响应 | ## webSocket ### 长连接封装 --- 封装uni方法 * 心跳包 * 断线重连 * 断线重试 * 网络检测 * 自定义报文 ### initWebSocket\(options\) --- 初始化创建一个[websocket](https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket)连接 **options参数说明** | 参数名 | 类型 | 说明 | | :--- | :--- | :--- | | url | String | 服务器地址ws://协议 | | success | Function | 接口调用成功回调函数 | | fail | Function | 接口调用失败回调函数 | **示例代码** ```js WEBIM.options = { url: 'ws://127.0.0.1', success(res) { resolve(res); }, fail(e) { reject(e); } } WEBIM.server.initWebSocket(WEBIM.options); ``` ### sendWebSocketMsg\(options\) --- 通过 WebSocket 连接发送数据,需要先 initWebSocket,并在 \_onSocketOpened回调之后才能发送 **options参数说明** | 属性 | 类型 | 说明 | | :--- | :--- | :--- | | data | ArrayBuffer | 服务器发送消息 [encode编码](http://bzghost.com/packetcodecjs.html) | | success | Function | 成功回调函数 | | fail | Function | 失败回调函数 | **示例代码** ```js WEBIM.server.sendWebSocketMsg({ data: arrayBuffer, success(res) {}, fail(err) { // 进行重连 WEBIM.server._isLogin = false; if (WEBIM.server._isReconnection) { console.log('网络中断,尝试重连') WEBIM.options = { url: WEBIM.serverUrl, success(res) {}, fail(err) {} } WEBIM.server._reConnect(WEBIM.options) } console.log('【websocket】发送失败,尝试手动重连') } }); ``` ### onReceivedMsg\(callBack\) --- 监听WebSocket接受到服务器的消息事件。 **CALLBACK 返回参数** | 属性 | 类型 | 说明 | | :--- | :--- | :--- | | callBack | ArrayBuffer | 服务器返回消息数据 [decode解码](http://bzghost.com/packetcodecjs.html) | **示例代码** ```js WEBIM.server.onReceivedMsg(event => { let packet = packetCode.decode(event.data); let command = packet.command; // 转发事件 eventDispatcher.dispatchEvent(command, toJSON(packet)) eventDispatcher.removeListener(command, toJSON(packet)) if(command === -10){ store.commit('setNewsPush', packet); } }); ``` # Nginx配置文件 ```js worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; charset utf-8; location / { root /home/xxxxx//dist; try_files $uri $uri/ /index.html; index index.html index.htm; } location /prod-api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:9998/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } ```