需求

用户登陆后,服务器实时推送用户的订单提醒,用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') + "\t心跳事件....");
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;
});

  

websocket业务代码的更多相关文章

  1. Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码

    关于T4代码生成这块,我之前写过几篇帖子,如:<Magicodes.NET框架之路——让代码再飞一会(ASP.NET Scaffolding)>(http://www.cnblogs.co ...

  2. JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码

    本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...

  3. 唱吧DevOps的落地,微服务CI/CD的范本技术解读----最大的难点并不是实际业务代码的编写,而是服务的监控和调试以及容器的编排

    1.业务架构:从单体式到微服务 K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验.K歌亭在客户端有VOD.微信和Web共三个交互入口,业务复杂 ...

  4. golang写业务代码,用全局函数还是成员函数

    在golang中,函数划分为全局函数和成员函数,在使用的时候,有种情况,会产生一些疑惑的,就是在写业务代码的时候,使用全局函数好像会比较方便,一般业务代码,都不会复用,都是针对特定的业务进行编程,要复 ...

  5. 朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑

    我承认,本文的标题有一点标题党,特别是写业务代码,大家因为没有足够重视一些细节最容易调的坑(侧重Java,当然,本文说的这些点很多是不限制于语言的). 1.客户端的使用 我们在使用Redis.Elas ...

  6. 朱晔的互联网架构实践心得S2E1:业务代码究竟难不难写?

    注意,这是我的架构实践心得的第二季的系列文章,第一季有10篇你也可以回顾. 见https://www.cnblogs.com/lovecindywang/category/1296779.html 最 ...

  7. Serverless架构详解:开发者如何专注于业务代码本身?

    本文来自腾讯云技术沙龙,本次沙龙主题为Serverless架构开发与SCF部署实践 演讲嘉宾:黄文俊,曾负责企业级存储.企业级容器平台等产品的架构与开发,目前主要负责SCF腾讯无服务器云函数产品相关. ...

  8. 使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码 (jvm性能调优)

    技术交流群:233513714 本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 ...

  9. CSDN日报20170413 ——《天天写业务代码的那些年,我们是怎样成长过来的》

    [程序人生]天天写业务代码的那些年,我们是怎样成长过来的 作者:Phodal 比起写业务代码更不幸的是,主要工作是修 Bug , bug , buG , bUg. [Java 编程]Springboo ...

随机推荐

  1. SQL Server 2012附加数据库时,错误提示如下:尝试打开或创建物理时,CREATE FILE 遇到操作系统错误 5(拒绝访问。)

    错误提示:Create File遇到操作系统错误5(拒绝访问) 解决方案: 在所有程序-SQL Server 2012-"SQL Server 配置管理器",点击"SQL ...

  2. 求n!最后一位非零数

    引子:求n!末尾0的个数 n!末尾的0来源只有2,5两个质数相乘.所以只需要考察n!中包含多少个2和多少个5.然后取其较小值即为所求.即ans=min(cnt(2),cnt(5)).而转念一想,cnt ...

  3. mybatis generator maven插件自动生成代码

    如果你正为无聊Dao代码的编写感到苦恼,如果你正为怕一个单词拼错导致Dao操作失败而感到苦恼,那么就可以考虑一些Mybatis generator这个差价,它会帮我们自动生成代码,类似于Hiberna ...

  4. php 2038年问题

    在mysql中存放日期时可以存放整数 (int),  而int可以存放的数据最大为4294967295(无符号), 而php最大为2147483647, 要显示一个大于2038年日期,该如何处理 ? ...

  5. Android基础测试题(四)

    看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...

  6. Binary Agents

    FCC题目: 传入二进制字符串,翻译成英语句子并返回. 二进制字符串是以空格分隔的. 示例: binaryAgent("01000001 01110010 01100101 01101110 ...

  7. java socket API

    java.net类 Socket java.lang.Object java.net.Socket 直接已知子类: SSLSocket public class Socketextends Objec ...

  8. Mac OS使用brew安装Nginx、MySQL、PHP-FPM的LAMP开发环境

    准备工作 新版的 Mac OS 内置了Apache 和 PHP,我的系统版本是OS X 10.9.3,可以通过以下命令查看Apache和PHP的版本号: httpd -v Server version ...

  9. NOIp 1109

    停课后的第一场模拟赛,应该不会怎么说今天的模拟赛,除了第一题不知道那种筛法的复杂度是$log$的没敢写,其他都挺水的.另外,第三题的数据也弱化了,建议去这里再交一遍. 贴一下AC代码,有兴趣可以参考一 ...

  10. Python_猜大小

    # 需要在python3上执行 import random def game (capital = 1000): point1 = random.randrange(1,7) point2 = ran ...