zoukankan      html  css  js  c++  java
  • websocket实现信息通知窗口

    需求

    用户登陆后,服务器实时推送用户的订单提醒,用websocket处理。

    方案

    两个js,notify-socket.js处理socket的连接,和socket的处理。

    nofify.js,做右下角弹窗处理,用到了layui的弹窗组件。

    notify-socket.js

    /**
     * Created by nuanfeng on 2016/9/20.
     */
    
    define(function(require, exports, module) {
        require('jQuery');
    
        var util = require('util'),
            jsonApi = require('jsonApi'),
            Notify = require('notify');
    
        var Elems = {
    
        };
    
        socketArea = {
            /**
             * 注册socket身份凭证
             */
            registerSocket: function(){
                var self = this,
                    uri = jsonApi.socketRegister;
                console.log('e');
                try {
                    util.ajaxFn(uri, {}, function (data) {
    
                        self.initSocket(data);
                    }, function () {
                        setTimeout(function () {
                            console.log("重新注册socket...");
                            self.registerSocket();
                        }, 5000);
                    });
                } catch (e) {
                    setTimeout(function () {
                        console.log("重新注册socket...");
                        self.registerSocket();
                    }, 5000);
                }
            },
    
            /**
             * 心跳事件
             */
            heartBeatEvent: function(socket, data) {
                window.setInterval(function () {
                    console.log((new Date()).Format('yyyy-MM-dd hh:mm:ss') + "	心跳事件....");
                    if (socket) {
                        data.dataType = 1000;
                        socket.send(JSON.stringify(data));
                    }
                }, 1000 * 60);
            },
    
            /**
             * 初始化socket
             * @param data
             */
            initSocket: function(data) {
                var self = this;
                var data = data.data;
                var socket = new WebSocket('ws://192.168.10.111:9092/websocket');
                //var socket = new WebSocket('ws://192.168.10.19:9092/websocket');
    
                //open socket
                socket.onopen = function (event) {
                    data.dataType = 1;
    
                    //send a init msg
                    socket.send(JSON.stringify(data));
    
                    //listen
                    socket.onmessage = function (event) {
                        var data = JSON.parse(event.data);
                        console.log("onmessage -->> ", event);
                        //self.msgHandle(JSON.parse(event.data));
                        var notify = new Notify();
                        notify.showMessage(JSON.parse(event.data));
                    };
    
                    socket.onclose = function (event) {
                        console.log("onclose -- >>>于" + new Date(), event);
                    }
                }
                self.heartBeatEvent(socket, data);
            },
    
            /**
             * 处理
             * @param data
             */
            msgHandle: function(data) {
                var self = this;
    
                if (data.flag == 1) { // success
                    switch (data.dataType) {
                        case 1: //注册
                            self.registerSocketEvent(data);
                            break;
                        case 2: // 支付
                            self.paySocketEvent(data);
                            break;
                        case 3: // 需求
                            self.needSocketEvent(data);
                            break;
                        case 4: // 下单
                            self.orderSocketEvent(data);
                            break;
                        case 5: // 新用户审核
                            self.userCheckSocketEvent(data);
                            break;
                        case 6: // 提现
                            self.withDrawSocketEvent(data);
                            break;
                        case 7: // 退款
                            self.refundSocketEvent(data);
                            break;
                        case 0: // default
                            break;
                    }
                }
            },
    
            /**
             * 注册事件
             * @param data
             */
            registerSocketEvent: function (data) {
                console.log("恭喜,于" + (new Date()).Format('yyyy-MM-dd hh:mm:ss') + "注册成功...");
            },
    
            /**
             * 支付事件
             * @param data
             */
            paySocketEvent: function (data) {
                console.log("您有新的订单已支付...");
                mallMenu.refreshShipStats(true);
            },
    
            /**
             * 需求事件
             * @param data
             */
            needSocketEvent: function (data) {
                console.log("您有新的需求需要报价...");
                mallMenu.refreshNeedStats(true);
            },
    
            /**
             * 下单事件
             * @param data
             */
            orderSocketEvent: function (data) {
                console.log("您有新的订单已生成");
            },
    
            /**
             * 用户审核事件
             * @param data
             */
            userCheckSocketEvent: function (data) {
                console.log("你有新的用户需要审核...");
                // TODO: 根据不同的data跳转不同的列表页面
                mallMenu.refreshUserStats(true);
            },
    
            /**
             * 提现申请事件
             * @param data
             */
            withDrawSocketEvent: function (data) {
                console.log("您有新的提现申请需要处理...");
                mallMenu.refreshFinance(true);
            },
    
            /**
             * 退款申请事件
             * @param data
             */
            refundSocketEvent: function (data) {
                console.log("您有新的退款申请需要处理...");
                mallMenu.refreshFinanceStats(true);
    
            }
    
        };
    
        module.exports = socketArea;
    
    });
    

      

    notify.js

    /**
     * Created by nuenfeng on 2016/9/20.
     */
    
    define(function(require, exports, module) {
        function Notify(params, callback) {
            this.init();
        }
    
        Notify.prototype.init = function () {
            console.log('notify init...')
        }
    
        Notify.prototype.showMessage = function(data){
            var msg;
            if (data.dataType==1 || data.dataType==8) {
                //return;
            } else {
                msg = data.data.message;
            }
    
            var html = '<div class="cont">';
            html += '<p>' + msg + '</p>';
            switch(data.dataType) {
                case 1:
                    //html += '<a load="./main-pages/goods/goods-list.html" class="sui-btn btn-primary btn-radius btn-small" id="J_NoticeBtn">立即查看</a>';
                    break;
                case 2:
                    html += '<a href="/seller/father/orders.html?orderStatus=1" class="sui-btn btn-primary btn-radius btn-small" id="J_NotifyBtn">立即查看</a>';
                    break;
                case 4:
                    html += '<a href="/seller/father/orders.html?orderStatus=0" class="sui-btn btn-primary btn-radius btn-small" id="J_NotifyBtn">立即查看</a>';
                    break;
            }
            html += '</div>';
            layer.open({
                type: 1,
                title: '通知',
                closeBtn: 1,
                shade: [0],
                area: ['340px', '215px'],
                offset: 'rb', //右下角弹出
                time: 5000, //5秒后自动关闭
                content: html,
                shift: 2,
                skin: 'notify-panel',
                move: false
            });
            voicePlay(data.dataType);
        }
    
        var voicePlay = function(dataType){
            var audio = new Audio("/js/components/notify/voice-newmsg.mp3");
            audio.play();
        }
    
        module.exports = Notify;
    });
    

      

  • 相关阅读:
    Kubernetes实战(第二版)--第六章 管理Pod容器的生命周期
    Kubernetes实战(第二版)--第五章 在Pods中运行应用程序
    Kubernetes实战(第二版)--第四章 介绍kubernetes API对象
    第三章 部署第一个应用程序
    Kubernetes实战(第二版)----第2章 理解容器
    dfs 例子演示
    Leetcode 135. 分发糖果
    mysql materialized_MySql优化- 执行计划解读与优化(二)
    说说Golang的使用心得
    最详细之教你Jenkins+github自动化部署.Net Core程序到Docker
  • 原文地址:https://www.cnblogs.com/woodk/p/5888362.html
Copyright © 2011-2022 走看看