{"id":19001710,"url":"https://github.com/ledccn/ledc-push","last_synced_at":"2025-09-06T01:40:54.431Z","repository":{"id":213923587,"uuid":"735265927","full_name":"ledccn/ledc-push","owner":"ledccn","description":"webman插件ledc/push","archived":false,"fork":false,"pushed_at":"2025-08-06T23:51:44.000Z","size":89,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-07T00:43:58.508Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ledccn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-12-24T09:26:40.000Z","updated_at":"2025-08-06T23:51:06.000Z","dependencies_parsed_at":"2025-04-16T23:05:31.296Z","dependency_job_id":"fd867e9b-5021-414f-859a-8982ca582d9e","html_url":"https://github.com/ledccn/ledc-push","commit_stats":null,"previous_names":["ledccn/ledc-push"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/ledccn/ledc-push","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ledccn%2Fledc-push","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ledccn%2Fledc-push/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ledccn%2Fledc-push/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ledccn%2Fledc-push/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ledccn","download_url":"https://codeload.github.com/ledccn/ledc-push/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ledccn%2Fledc-push/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273847129,"owners_count":25178634,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-05T02:00:09.113Z","response_time":402,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T18:12:24.195Z","updated_at":"2025-09-06T01:40:54.406Z","avatar_url":"https://github.com/ledccn.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# push\nwebman push plugin  https://www.workerman.net/plugin/2\n\n原版地址：https://github.com/webman-php/push\n\n## 安装\n```shell\ncomposer require ledc/push\n```\n\n\n## 简介\n\n一个免费的推送服务端插件，客户端基于订阅模式，兼容 [pusher](https://pusher.com/)，拥有众多客户端如JS、安卓(java)、IOS(swift)、IOS(Obj-C)、uniapp、.NET、 Unity、Flutter、AngularJS等。后端推送SDK支持PHP、Node、Ruby、Asp、Java、Python、Go、Swift等。客户端自带心跳和断线自动重连，使用起来非常简单稳定。适用于消息推送、聊天等诸多即时通讯场景。\n\n插件中自带一个网页js客户端push.js以及uniapp客户端`uniapp-push.js`，其它语言客户端在 https://pusher.com/docs/channels/channels_libraries/libraries/ 下载\n\n## js 文件说明\n\n---\n\n```sh\n  push-uniapp.js #适用于uniapp项目内使用\n  push-vue.js #适用于vue项目内使用\n  push.js #适用于直接引入js常规项目内使用、\n  push-miniprogram.js #适用于微信小程序项目内使用\n```\n\n### push-vue.js 使用说明\n\n---\n\n1、将文件 push-vue.js 复制到项目目录下，如：src/utils/push-vue.js\n\n2、在 vue 页面内引入\n\n```js\n\n\u003cscript lang=\"ts\" setup\u003e\nimport {  onMounted } from 'vue'\nimport { Push } from '../utils/push-vue'\n\nonMounted(() =\u003e {\n  console.log('组件已经挂载')\n\n  //实例化webman-push\n\n  // 建立连接\n  var connection = new Push({\n    url: 'ws://127.0.0.1:3131', // websocket地址\n    app_key: '\u003capp_key，在config/plugin/webman/push/app.php里获取\u003e',\n    auth: 'https://你的域名.com/plugin/webman/push/auth' // 订阅鉴权(仅限于私有频道)\n  });\n\n  // 假设用户uid为1\n  var uid = 1;\n  // 浏览器监听user-1频道的消息，也就是用户uid为1的用户消息\n  var user_channel = connection.subscribe('user-' + uid);\n\n  // 当user-1频道有message事件的消息时\n  user_channel.on('message', function (data) {\n    // data里是消息内容\n    console.log(data);\n  });\n  // 当user-1频道有friendApply事件时消息时\n  user_channel.on('friendApply', function (data) {\n    // data里是好友申请相关信息\n    console.log(data);\n  });\n\n  // 假设群组id为2\n  var group_id = 2;\n  // 浏览器监听group-2频道的消息，也就是监听群组2的群消息\n  var group_channel = connection.subscribe('group-' + group_id);\n  // 当群组2有message消息事件时\n  group_channel.on('message', function (data) {\n    // data里是消息内容\n    console.log(data);\n  });\n\n\n})\n\n\u003c/script\u003e\n\n```\n\n### push-miniprogram.js 使用说明\n\n---\n\n1、将文件 push-miniprogram.js 复制到项目目录下，如：src/utils/push-miniprogram.js\n\n2、在 app.js内引入\n\n```js\n\n\nimport Push from '../utils/push-miniprogram'\n\nApp({\n\n  onLanuch(() =\u003e {\n\n    //实例化webman-push\n\n    // 建立连接\n    var connection = new Push({\n      url: 'ws://127.0.0.1:3131', // websocket地址\n      app_key: '\u003capp_key，在config/plugin/webman/push/app.php里获取\u003e',\n      auth: 'https://你的域名.com/plugin/webman/push/auth' // 订阅鉴权(仅限于私有频道)\n    });\n\n    // 假设用户uid为1\n    var uid = 1;\n    // 浏览器监听user-1频道的消息，也就是用户uid为1的用户消息\n    var user_channel = connection.subscribe('user-' + uid);\n\n    // 当user-1频道有message事件的消息时\n    user_channel.on('message', function (data) {\n      // data里是消息内容\n      console.log(data);\n    });\n    // 当user-1频道有friendApply事件时消息时\n    user_channel.on('friendApply', function (data) {\n      // data里是好友申请相关信息\n      console.log(data);\n    });\n\n    // 假设群组id为2\n    var group_id = 2;\n    // 浏览器监听group-2频道的消息，也就是监听群组2的群消息\n    var group_channel = connection.subscribe('group-' + group_id);\n    // 当群组2有message消息事件时\n    group_channel.on('message', function (data) {\n      // data里是消息内容\n      console.log(data);\n    });\n  })\n})\n```\n\n\n## 进度条\n\n### HTML部分\n\n```html\n\u003c!-- 顶 部 右 侧 菜 单 --\u003e\n\u003cli class=\"layui-nav-item layui-hide-xs\" title=\"长连接状态\"\u003e\n    \u003ca href=\"#\" class=\"layui-icon layui-icon-wifi\" style=\"color: #ff5722;\" id=\"websocket_state\"\u003e\u003c/a\u003e\n\u003c/li\u003e\n\n\u003c!-- 进度条 --\u003e\n\u003cdiv id=\"progress-layer-wrapper\" style=\"display: none;\"\u003e\n    \u003cdiv class=\"layui-card\"\u003e\n        \u003cdiv class=\"layui-card-header\"\u003e执行数：\u003cspan class=\"layui-badge-rim\"\n                                                    id=\"progress-layer-count\"\u003e0\u003c/span\u003e / 总数：\u003cspan\n                class=\"layui-badge-rim\" id=\"progress-layer-total\"\u003e0\u003c/span\u003e\u003c/div\u003e\n        \u003cdiv class=\"layui-card-body\"\u003e\n            \u003cdiv class=\"layui-progress layui-progress-big\" lay-filter=\"filter-progress\"\u003e\n                \u003cdiv class=\"layui-progress-bar\" lay-percent=\"0%\"\u003e\u003c/div\u003e\n            \u003c/div\u003e\n        \u003c/div\u003e\n    \u003c/div\u003e\n\u003c/div\u003e\n\u003cscript src=\"/plugin/ledc/push/push.js\"\u003e\u003c/script\u003e\n```\n\n### js部分\n\n```javascript\nlayui.use([\"jquery\", \"popup\", \"notice\", \"element\"], function () {\n    let $ = layui.$;\n    let notice = layui.notice;\n    let element = layui.element;\n    // 渲染进度条组件\n    element.render('progress', 'filter-progress');\n\n    \u003c?php\n    $app_key = config('plugin.ledc.push.app.app_key');\n    $websocket_port = parse_url(config('plugin.ledc.push.app.websocket'), PHP_URL_PORT);\n    $auth = config('plugin.ledc.push.app.auth'); \n    ?\u003e\n\n    const hostname = location.hostname;\n    const host = location.host;\n\n    /**\n     * 与服务器长链接通信\n     */\n    function connect() {\n        let connection = new Push({\n            url: (location.protocol === 'https:' ? 'wss://' : 'ws://') + (-1 !== host.indexOf(':') ? hostname + ':\u003c?=$websocket_port?\u003e' : hostname), // websocket地址\n            app_key: '\u003c?=$app_key?\u003e',\n            auth: '\u003c?=$auth?\u003e',\n        });\n        //长链接状态\n        setInterval(() =\u003e {\n            if (connection.connection.state === 'connected') {\n                document.getElementById('websocket_state').style.color = '#16b777';\n            } else {\n                document.getElementById('websocket_state').style.color = '#ff5722';\n                notice.error('长链接断线');\n            }\n        }, 1000);\n        let channel = connection.subscribe('private-webman-admin');\n        let dispatcher = connection.subscribe('dispatcher');\n        dispatcher.on('notify', function (data) {\n            console.info(data)\n        });\n\n        // 普通消息\n        channel.on('message', function (data) {\n            console.info(data)\n        });\n\n        // 进度条\n        channel.on('progress', function (data) {\n            const type = data.type;\n            const count = data.success + data.fail;\n            const total = data.total;\n            const percent = count + ' / ' + total;\n            // 设置进度值\n            element.progress('filter-progress', percent);\n            document.getElementById('progress-layer-count').innerText = count;\n            document.getElementById('progress-layer-total').innerText = total;\n            // 捕获页面元素，弹出进度条\n            layer.open({\n                type: 1,\n                id: 'progress-layer' + type,\n                title: '任务进度条',\n                area: '520px',\n                shade: false, // 不显示遮罩\n                content: $('#progress-layer-wrapper'), // 捕获的元素\n                success: function (layero, index, that) {\n                    // 弹层的最外层元素的 jQuery 对象\n                    console.log(layero);\n                    // 弹层的索引值\n                    console.log(index);\n                    // 弹层内部原型链中的 this --- 2.8+\n                    console.log(that);\n                },\n                end: function () {\n                    // layer.msg('关闭后的回调', {icon:6});\n                }\n            });\n        });\n        // 通知\n        channel.on('notify', function (data) {\n            switch (data.type) {\n                case 'success':\n                    notice.success(data.msg);\n                    break;\n                case 'error':\n                    notice.error(data.msg);\n                    break;\n                case 'warning':\n                    notice.warning(data.msg);\n                    break;\n                case 'info':\n                    notice.info(data.msg);\n                    break;\n                default:\n                    notice.clear();\n                    break;\n            }\n        });\n    }\n\n    connect();\n});\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fledccn%2Fledc-push","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fledccn%2Fledc-push","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fledccn%2Fledc-push/lists"}