strophe.js 插件 XMPP openfire
参考资料:http://strophe.im/strophejs/
https://github.com/strophe/strophejs-plugins
http://amazeui.org/
最近公司要做一个微信关注号,用来推广一个关于收发需求的APP,用到了strophe.js,数据后台是PHP, 服务端使用的是openfire.
直接上图吧:

整个过程就是登录openfire的过程,整个过程的数据交换全部用body包裹起来,在服务端的
org.jivesoftware.openfire.http.HttpBindServlet 为入口进行处理的,

过程就略过了。直接说strophe.js插件了。
  var demand = {};
     demand.sid = '{$sid}';
     demand.remark = '';
     demand.latitude = 0;
     demand.longitude = 0;
     demand.isweixin = 1;
     demand.city = '';
     demand.location = '';
     demand.userid = '{$userid}';
     demand.labelid = '{$labelid}';
     demand.labelname = '{$labelname}';
     demand.token='{$token}';
     var domain = '{$domain}';
     var source = '{$source}';
     $(function () {
         $('#top_bar').hide();
         getLocation();
         if (connection == null && demand.userid != "") {
             login(demand.userid);
         }
     });     /**
      * 获取当前位置
      */
     function getLocation() {
         if (navigator.geolocation) {
             navigator.geolocation.getCurrentPosition(gpsCallback);
         } else {
             alert("您的浏览器不支持地理定位,请手动修改位置");
         }
     }
     /**
      * 根据位置创建地图
      */
     function gpsCallback(position) {
         var lat = position.coords.latitude;
         var lon = position.coords.longitude;
         var gpsPoint = new BMap.Point(lon, lat);
         CreateMap("allmap", lon, lat, 14);
         //添加地图控件和事件     }
     /**
      * 获取位置
      * @param point 经纬度
      */
     function translateCallback(point) {
         demand.longitude = lon = point.lng.toFixed(6);
         demand.latitude = lat = point.lat.toFixed(6);
         getmerchants(2000);
         latlon = lat + ',' + lon;
         $.ajax({
             dataType: 'jsonp',
             url: 'http://api.map.baidu.com/geocoder/v2/',
             success: function (result) {
                 demand.city = result.result.addressComponent.city;
                 demand.location = result.result.formatted_address;
             }
         });
     }
     /**
      * 获取附近的商家
      */
     function getmerchants(radius) {
         $.post("/service/demand/nearmerchant/ran/" + Math.random(),
                 {
                     userid: demand.userid,
                     sid: demand.sid,
                     longitude: demand.longitude,
                     latitude: demand.latitude,
                     radius: radius,
                     labelid: demand.labelid,
                     isweixin: '1'
                 },
                 function (data) {
                     if (data.status == 1) {
                         var result = data.data;
                         var merchants = result.merchants;
                         var temp = null;
                         for (var i = 0, len = merchants.length; i < len; i++) {
                            //地图标注                         }
                     } else {
                         alert(data.info);
                     }
                 });
     }
     /**
      * 发布需求
      */
     function releasedemand() {
         if (demand.latitude == 0 || demand.longitude == 0) {
             alert('请打开手机定位功能,然后重新进入本页面,再进行需求发布!');
         } else {
             if ($.trim($('#remark').val()) == '') {
                 alert('请填写备注!');
             } else {
                 demand.remark = $('#remark').val();
                 $.ajax({
                     type: 'POST',
                     url: "/service/demand/release",
                     data: demand,
                     success: function (result) {
                        //成功处理                     }
                 });
             }
         }
     }
     /**
      * 返回
      */
     function back() {
         if (connection.demand.DemandId > 0) {
             var htmlStr = [];
             htmlStr.push('<div class="am-modal am-modal-no-btn" tabindex="-1" id="cancel-modal">');
             htmlStr.push('<img src="__PUBLIC__/web/demand/close_td.png" alt="关闭" style="height:29px;width:29px;"/>');
             。。。。。。//组装相关弹框代码
             $("#cancelmodal").html(htmlStr.join(''));
             $('#cancel-modal').modal({closeViaDimmer: 0});
         }
     }
     /**
      * 弹出发出需求的模态窗口
      */
     function publishModal() {
         if (connection == null) {
             login(demand.userid);
             return false;
         }
         var htmlStr = ['<div class="am-modal am-modal-no-btn" tabindex="-1" id="publish-modal">'];
         。。。。。。//组装相关弹框代码
         htmlStr.push('<button type="button" class="am-btn am-btn-success am-btn-block" data-am-modal-close onclick="releasedemand();" style="margin-top: 10px; border-radius: 10px">');
         htmlStr.push('确定发布');
         htmlStr.push('</button></div></div>');
         $("#modal").html(htmlStr.join(''));
         $("#publish-modal").modal({closeViaDimmer: 0});
     }
     /**
      * 滑动
      */
     function startSlider() {
         mySwiper = new Swiper('.shoplist', {
             slideElement: 'li',
             onSlideChangeStart: function () {
                 //滑动触发的事件
             }
         });
     }
     /**
      * 添加商家选项卡
      * @param mid 商家ID
      * @param name 商家名称
      * @param address 商家地址
      * @param tel 电话
      * @param grab 已经抢单数
      * @param longitude 经度
      * @param latitude 纬度
      * @param stars 星级
      */
     function addShop(mid, name, address, tel, grab, longitude, latitude, stars) {
         var distance = getDistance(latitude, longitude, demand.latitude, demand.longitude);
         var htmlStr = [];
         htmlStr.push('<div class="am-u-sm-11 am-u-sm-centered mask-r-white">');
        。。。。。。//组装相关弹框代码
         htmlStr.push('</div>');
         mySwiper.appendSlide(htmlStr.join(''));
         var newSlide = mySwiper.getLastSlide();
         newSlide.clone().prepend(); //添加到最前面
         mySwiper.removeLastSlide(); //移除最后一个slide
     }
     /***
      *  定它下单
      */
     function order(mid, name, address) {
         var htmlStr = ['<div class="am-modal am-modal-no-btn" tabindex="-1" id="order-modal">'];
         htmlStr.push('确认定TA');
        。。。。。。//组装相关弹框代码
         htmlStr.push('</button></div></div>');
         $("#o-modal").html(htmlStr.join(''));
         $("#order-modal").modal({closeViaDimmer: 0});
     }
页面加载之后获取当然的经纬度,地址,创建地图,顺便组装发布需求时所需要的demand对象,登录openfire,登录的用户名密码,直接从PHP变量分配得来。页面使用的是amazeui框架
demand插件:
 Demand = {
     NameSpaces: {
         Demand: 'jabber:iq:demand'//命名空间
     },
     Actions: {
         confirm: 'confirm',
         cancel: 'cancel',
         resultdemand: 'resultdemand',
         verify: 'verify'
     }
 };
 Strophe.addConnectionPlugin('demand',
     {
         _connection: null,
         count: null,
         _feedbackCallback: [],
         _grabCallback: [],
         _verifyCallback: [],
         loadPageB: 0,
         Receive: 0,
         DemandId: 0,
         init: function (conn) {
             this._connection = conn;
             Strophe.addNamespace('demand', Demand.NameSpaces.Demand);
             conn.addHandler(this._onFeedback.bind(this), Demand.NameSpaces.Demand, 'iq', 'result', null, null);
         },
         /**
          * 注册方法
          * @param type 类型
          * @param call_back 回调
          */
         registerCallback: function (type, call_back) {
             if (type === 1) {
                 this._feedbackCallback.push(call_back);
             } else if (type === 2) {
                 this._grabCallback.push(call_back);
             } else if (type === 3) {
                 this._verifyCallback.push(call_back);
             }
         },
         /**
          * 回调
          */
         _call_backs: function (type, data) {
             if (type === 1) {
                 for (var i = 0; i < this._feedbackCallback.length; i++) {
                     this._feedbackCallback[i](data);
                 }
             } else if (type === 2) {
                 for (var i = 0; i < this._grabCallback.length; i++) {
                     this._grabCallback[i](data);
                 }
             } else if (type === 3) {
                 for (var i = 0; i < this._verifyCallback.length; i++) {
                     this._verifyCallback[i](data);
                 }
             }
         },
         /**
          * 处理返回结果
          * @param iq
          * @returns {null}
          * @private
          */
         _onFeedback: function (iq) {
             log('RECV:' + iq.innerHTML);
             var node = iq.getElementsByTagName('demand')[0];
             if (node) {
                 var action = node.getAttribute('action');
                 switch (action) {
                     case Demand.Actions.resultdemand:
                 //解析IQ代码省略
                        this._call_backs(1, node);
                         break;
                     case Demand.Actions.confirm:
                 //过滤代码省略
                        var jid = fromJid.split('_')[0];
                             var self = this;
                             $.ajax({
                                 type: 'POST',
                                 url: '/service/merchant/merchantInfo',
                                 data: {mid: jid},
                                 success: function (data) {
                                     if (data.status == 1) {
                                         self.loadPageB++;
                                         self._call_backs(2, data.data);
                                     } else {
                                         alert(data.info);
                                     }
                                 }
                             });
                         }
                         break;
                     case  Demand.Actions.verify:
                         this._call_backs(3, node);
                         break;
                 }
             }
             return true;
         }
     });

strophe.js 插件 XMPP openfire的更多相关文章
- Strophe.js连接XMPP服务器Openfire、Tigase实现Web私聊、群聊(MUC)
		
XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件.网络游戏聊天.Web聊 ...
 - XMPP即时通讯协议使用(七)——利用Strophe实现WebIM及strophe.plugins插件使用
		
Strophe简介与Openfire配置 Strophe.js是为XMPP写的一个js类库.因为http协议本身不能实现持久连接,所以strophe利用BOSH模拟实现持久连接. 官方文档: http ...
 - xmpp openfire smack 介绍和openfire安装及使用
		
前言 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也有其他的选择. Openfire是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使用 ...
 - 【jQuery小实例】js 插件 查看图片
		
---本系列文章所用使用js均可在本博客文件中找到. 像淘宝一样,鼠标放在某一件商品上,展示大图信息,甚至查看图片的具体部位.给人超炫的效果,这种效果实现基于js文件和js插件.大致可以分为三步,添加 ...
 - 【PC端】jQuery+PHP实现浏览更多内容(jquery.more.js插件)
		
参数说明: 'amount' : '10', //每次显示记录数 'address' : 'comments.php', //请求后台的地址 'format' : 'json', //数据传输格式 ' ...
 - chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]
		
chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文:http://bubuko.com/infodetail-328671.html 默认情况下如下图 Y轴并不是从0开始 ...
 - jQuery.cookie.js插件了解及使用方法
		
jquery.cookie.js插件实现浏览器的cookie存储,该插件是基于jquery开发,方便cookie使用. jquerycookie.js的下载地址 http://plugins.jque ...
 - Intense Images – 全屏浏览图像的 JS 插件
		
Intense Images 是一个独立的 JavaScript 库,用于查看全屏图像.使用触摸/鼠标来实现图片位置的平移.图像元素的所有样式都是可以自定义的,Intense.js 只处理图像浏览器和 ...
 - 购物车增加、减少商品时动画效果:jQuery.Fly.js插件使用方法
		
某些电商网站加入购物车和减少购物车商品数量时,有个小动画,以抛物线形式增减,如图: 这里用到了第三方jQuery.Fly.js插件(底层依赖Jquery库,地址:https://github ...
 
随机推荐
- 关于 jwTextFiled 的使用说明
			
我在些项目中多次对一些输入框做了相同的代码操作,终于有一天忍不住了,MD必须写一个小的框架解决这个搬砖的问题.经过一天的战斗,于是 jwTextFied 就默默的诞生了. 地址:https://git ...
 - python_学习笔记
			
1,多态:对不同类的对象使用同样的操作,但使用函数显示地检查类型能够毁掉多态(eg: type,isinstance,issubclass) 封装:多态让用户对于不知道是什么类的对象进行方法调用,而封 ...
 - Mina学习之---mina整体流程介绍
			
现在公司使用的NIO框架一直时候Mina,当然这也的框架还有Netty.虽然一直在用,但只是简单的停留在业务层面,最近面试的时候有问Mina相关的东西.在之前的博客中已经对BIO,NIO,AIO这三种 ...
 - 高级java工程师面试题-随笔
			
最近打算要换工作,也面试了几家,因为不是自己喜欢的所以拒了一些(当然也有人家不要我的.....).在面试的过程中发现对java高级程序员的考察基本上围绕知识面,知识深度两个方面来考察.下面是在面试过程 ...
 - python 之 staticmethod,classmethod,property的区别
			
绑定方法和非绑定方法: 普通def定义的都是绑定给对象的方法,对象调用时会自动传入对象本事,而类调用时需手动传入对象. 加上@classmethod装饰器就是绑定给类的方法,会自动传类本身 加上@st ...
 - c/c++面试30-38之指针
			
30 看代码写结果-----指针加减 #include <stdio.h> int main(void) { ] = { , , , , }; );//这里要特别注意,&a+1的值 ...
 - java集合框架之HashSet
			
参考http://how2j.cn/k/collection/collection-hashset/364.html#nowhere 元素不能重复 Set中的元素,不能重复重复判断标准是: 首先看ha ...
 - 1-2关键字 & 2-1什么是变量
			
2-1什么是变量 驼峰第一个字母首字母小写后面字母首字母大写 Pascal命名规范:
 - IT兄弟连 JavaWeb教程 JSTL常用标签
			
1.条件标签 条件标签能够实现Java语言中的if语句以及if-else语句的功能,它包括以下几种: <c:if>:用于实现Java语言中的if语句的功能. <c:choose> ...
 - docker Mac安装和使用
			
1.安装docker brew cask install docker 2.安装后可以用命令查看版本 docker --version 3.build java 项目(jar) docker buil ...