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插件了。

  1  var demand = {};
  2     demand.sid = ‘{$sid}‘;
  3     demand.remark = ‘‘;
  4     demand.latitude = 0;
  5     demand.longitude = 0;
  6     demand.isweixin = 1;
  7     demand.city = ‘‘;
  8     demand.location = ‘‘;
  9     demand.userid = ‘{$userid}‘;
 10     demand.labelid = ‘{$labelid}‘;
 11     demand.labelname = ‘{$labelname}‘;
 12     demand.token=‘{$token}‘;
 13     var domain = ‘{$domain}‘;
 14     var source = ‘{$source}‘;
 15     $(function () {
 16         $(‘#top_bar‘).hide();
 17         getLocation();
 18         if (connection == null && demand.userid != "") {
 19             login(demand.userid);
 20         }
 21     }); 30     /**
 31      * 获取当前位置
 32      */
 33     function getLocation() {
 34         if (navigator.geolocation) {
 35             navigator.geolocation.getCurrentPosition(gpsCallback);
 36         } else {
 37             alert("您的浏览器不支持地理定位,请手动修改位置");
 38         }
 39     }
 40     /**
 41      * 根据位置创建地图
 42      */
 43     function gpsCallback(position) {
 44         var lat = position.coords.latitude;
 45         var lon = position.coords.longitude;
 46         var gpsPoint = new BMap.Point(lon, lat);
 47         CreateMap("allmap", lon, lat, 14);
 48         //添加地图控件和事件 78     }
 79     /**
 80      * 获取位置
 81      * @param point 经纬度
 82      */
 83     function translateCallback(point) {
 84         demand.longitude = lon = point.lng.toFixed(6);
 85         demand.latitude = lat = point.lat.toFixed(6);
 86         getmerchants(2000);
 87         latlon = lat + ‘,‘ + lon;
 88         $.ajax({
 89             dataType: ‘jsonp‘,
 90             url: ‘http://api.map.baidu.com/geocoder/v2/‘,
 91             success: function (result) {
 92                 demand.city = result.result.addressComponent.city;
 93                 demand.location = result.result.formatted_address;
 94             }
 95         });
 96     }
 97     /**
 98      * 获取附近的商家
 99      */
100     function getmerchants(radius) {
101         $.post("/service/demand/nearmerchant/ran/" + Math.random(),
102                 {
103                     userid: demand.userid,
104                     sid: demand.sid,
105                     longitude: demand.longitude,
106                     latitude: demand.latitude,
107                     radius: radius,
108                     labelid: demand.labelid,
109                     isweixin: ‘1‘
110                 },
111                 function (data) {
112                     if (data.status == 1) {
113                         var result = data.data;
114                         var merchants = result.merchants;
115                         var temp = null;
116                         for (var i = 0, len = merchants.length; i < len; i++) {
117                            //地图标注126                         }
127                     } else {
128                         alert(data.info);
129                     }
130                 });
131     }
132     /**
133      * 发布需求
134      */
135     function releasedemand() {
136         if (demand.latitude == 0 || demand.longitude == 0) {
137             alert(‘请打开手机定位功能,然后重新进入本页面,再进行需求发布!‘);
138         } else {
139             if ($.trim($(‘#remark‘).val()) == ‘‘) {
140                 alert(‘请填写备注!‘);
141             } else {
142                 demand.remark = $(‘#remark‘).val();
143                 $.ajax({
144                     type: ‘POST‘,
145                     url: "/service/demand/release",
146                     data: demand,
147                     success: function (result) {
148                        //成功处理156                     }
157                 });
158             }
159         }
160     }
161     /**
162      * 返回
163      */
164     function back() {
165         if (connection.demand.DemandId > 0) {
166             var htmlStr = [];
167             htmlStr.push(‘<div class="am-modal am-modal-no-btn" tabindex="-1" id="cancel-modal">‘);
168             htmlStr.push(‘<img src="__PUBLIC__/web/demand/close_td.png" alt="关闭" style="height:29px;width:29px;"/>‘);
169             。。。。。。//组装相关弹框代码
170             $("#cancelmodal").html(htmlStr.join(‘‘));
171             $(‘#cancel-modal‘).modal({closeViaDimmer: 0});
172         }
173     }
174     /**
175      * 弹出发出需求的模态窗口
176      */
177     function publishModal() {
178         if (connection == null) {
179             login(demand.userid);
180             return false;
181         }
182         var htmlStr = [‘<div class="am-modal am-modal-no-btn" tabindex="-1" id="publish-modal">‘];
183         。。。。。。//组装相关弹框代码
184         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">‘);
185         htmlStr.push(‘确定发布‘);
186         htmlStr.push(‘</button></div></div>‘);
187         $("#modal").html(htmlStr.join(‘‘));
188         $("#publish-modal").modal({closeViaDimmer: 0});
189     }
190     /**
191      * 滑动
192      */
193     function startSlider() {
194         mySwiper = new Swiper(‘.shoplist‘, {
195             slideElement: ‘li‘,
196             onSlideChangeStart: function () {
197                 //滑动触发的事件
198             }
199         });
200     }
201     /**
202      * 添加商家选项卡
203      * @param mid 商家ID
204      * @param name 商家名称
205      * @param address 商家地址
206      * @param tel 电话
207      * @param grab 已经抢单数
208      * @param longitude 经度
209      * @param latitude 纬度
210      * @param stars 星级
211      */
212     function addShop(mid, name, address, tel, grab, longitude, latitude, stars) {
213         var distance = getDistance(latitude, longitude, demand.latitude, demand.longitude);
214         var htmlStr = [];
215         htmlStr.push(‘<div class="am-u-sm-11 am-u-sm-centered mask-r-white">‘);
216        。。。。。。//组装相关弹框代码
217         htmlStr.push(‘</div>‘);
218         mySwiper.appendSlide(htmlStr.join(‘‘));
219         var newSlide = mySwiper.getLastSlide();
220         newSlide.clone().prepend(); //添加到最前面
221         mySwiper.removeLastSlide(); //移除最后一个slide
222     }
223     /***
224      *  定它下单
225      */
226     function order(mid, name, address) {
227         var htmlStr = [‘<div class="am-modal am-modal-no-btn" tabindex="-1" id="order-modal">‘];
228         htmlStr.push(‘确认定TA‘);
229        。。。。。。//组装相关弹框代码
230         htmlStr.push(‘</button></div></div>‘);
231         $("#o-modal").html(htmlStr.join(‘‘));
232         $("#order-modal").modal({closeViaDimmer: 0});
233     }

页面加载之后获取当然的经纬度,地址,创建地图,顺便组装发布需求时所需要的demand对象,登录openfire,登录的用户名密码,直接从PHP变量分配得来。页面使用的是amazeui框架

demand插件:

  4 Demand = {
  5     NameSpaces: {
  6         Demand: ‘jabber:iq:demand‘//命名空间
  7     },
  8     Actions: {
  9         confirm: ‘confirm‘,
 10         cancel: ‘cancel‘,
 11         resultdemand: ‘resultdemand‘,
 12         verify: ‘verify‘
 13     }
 14 };
 15 Strophe.addConnectionPlugin(‘demand‘,
 16     {
 17         _connection: null,
 18
 19         count: null,
 20
 21         _feedbackCallback: [],
 22
 23         _grabCallback: [],
 24
 25         _verifyCallback: [],
 26
 27         loadPageB: 0,
 28
 29         Receive: 0,
 30
 31         DemandId: 0,
 32
 33         init: function (conn) {
 34             this._connection = conn;
 35             Strophe.addNamespace(‘demand‘, Demand.NameSpaces.Demand);
 36             conn.addHandler(this._onFeedback.bind(this), Demand.NameSpaces.Demand, ‘iq‘, ‘result‘, null, null);
 37         },
 38
 39         /**
 40          * 注册方法
 41          * @param type 类型
 42          * @param call_back 回调
 43          */
 44         registerCallback: function (type, call_back) {
 45             if (type === 1) {
 46                 this._feedbackCallback.push(call_back);
 47             } else if (type === 2) {
 48                 this._grabCallback.push(call_back);
 49             } else if (type === 3) {
 50                 this._verifyCallback.push(call_back);
 51             }
 52         },
 53
 54         /**
 55          * 回调
 56          */
 57         _call_backs: function (type, data) {
 58             if (type === 1) {
 59                 for (var i = 0; i < this._feedbackCallback.length; i++) {
 60                     this._feedbackCallback[i](data);
 61                 }
 62             } else if (type === 2) {
 63                 for (var i = 0; i < this._grabCallback.length; i++) {
 64                     this._grabCallback[i](data);
 65                 }
 66             } else if (type === 3) {
 67                 for (var i = 0; i < this._verifyCallback.length; i++) {
 68                     this._verifyCallback[i](data);
 69                 }
 70             }
 71         },
 72
 73         /**
 74          * 处理返回结果
 75          * @param iq
 76          * @returns {null}
 77          * @private
 78          */
 79         _onFeedback: function (iq) {
 80             log(‘RECV:‘ + iq.innerHTML);
 81             var node = iq.getElementsByTagName(‘demand‘)[0];
 82             if (node) {
 83                 var action = node.getAttribute(‘action‘);
 84                 switch (action) {
 85                     case Demand.Actions.resultdemand:                 //解析IQ代码省略
 86                        this._call_backs(1, node);
 89                         break;
 90                     case Demand.Actions.confirm:                 //过滤代码省略
 91                        var jid = fromJid.split(‘_‘)[0];
 99                             var self = this;
100                             $.ajax({
101                                 type: ‘POST‘,
102                                 url: ‘/service/merchant/merchantInfo‘,
103                                 data: {mid: jid},
104                                 success: function (data) {
105                                     if (data.status == 1) {
106                                         self.loadPageB++;
107                                         self._call_backs(2, data.data);
108                                     } else {
109                                         alert(data.info);
110                                     }
111                                 }
112                             });
113                         }
114                         break;
115                     case  Demand.Actions.verify:
116                         this._call_backs(3, node);
117                         break;
118                 }
119             }
120             return true;
121         }
122     });

时间: 2024-08-28 17:17:08

strophe.js 插件 XMPP openfire的相关文章

Strophe.js连接XMPP服务器Openfire、Tigase实现Web私聊、群聊(MUC)

XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件.网络游戏聊天.Web聊天及Web消息推送.移动设备的消息推送等场景,例如Google的GTalk.<英雄联盟LOL>游戏聊天模块. 由于在Web浏览器上的JavaScript不能直接处理TCP协议,所以XMPP服务器通常会提供BOSH(Bidirectional-streams Over Synchronous HTT

Eclipse安装Propedit插件、SVN插件、js插件

1.在线安装Propedit 打开Eclipse的在线安装界面,点击Add Name: propedit Location:http://propedit.sourceforge.jp/eclipse/updates/ 2.在线安装Subclipse Name: subclipse 1.6.x Location:http://subclipse.tigris.org/update_1.6.x 安装完成即可使用. 3.安装包安装 下载spket-1.6.23,解开压缩包以后,把最里面的featur

火狐不支持backgroundPosition的js插件

用js backgroundPositionX,backgroundPositionY设置在firefox下无法识别,用backgroundPosition同样在火狐无法识别.要识别只能用js插件来实现的,代码如下: /** * @author Alexander Farkas * v. 1.02 */ (function($) { $.extend($.fx.step,{ backgroundPosition: function(fx) { if (fx.state === 0 && t

前端js插件

jquery jquery官方 版本:v 2.1.0v 1.11.0 yquery 暂停更新 版本: v 1.6v 1.5 v 1.4v 1.3 v 1.2v 1.1 v 1.0 jQuery 原型插件(jquery-*) jquery-drag 版本: latestv 1.1 v 1.0 jquery-dialog 版本: latestv 1.5 v 1.4v 1.3 v 1.2v 1.1 v 1.0 样式:default jquery-scrollable 版本: latestv 1.0 j

多说【最近访客】JS插件通用代码使用方法

多说[最近访客]JS插件通用代码使用方法 多说[最近访客]JS插件可以显示近期访问过你的博客并且已经使用向多说授权过的社交网络账号登录的用户头像,效果如下图所示. 最近访客JS插件的添加步骤如下: 1. 添加多说公用JS代码,每个页面只需添加一次. <!--多说js加载开始,一个页面只需要加载一次 --> <script type="text/javascript"> var duoshuoQuery = {short_name:"您的多说二级域名&q

Bootstrap入门(二十九)JS插件6:弹出框

加入小覆盖的内容,像在iPad上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入CSS文件和JS文件 <link href="bootstrap.min.css" rel="stylesheet"> <script src="jquery-3.1.0.min.js" type="text/javascript"></script&

基于xmpp openfire smack开发之Android客户端开发[3]

在上两篇文章中,我们依次介绍openfire部署以及smack常用API的使用,这一节中我们着力介绍如何基于asmack开发一个Android的客户端,本篇的重点在实践,讲解和原理环节,大家可以参考前两篇的文章 基于xmpp openfire smack开发之openfire介绍和部署[1] 基于xmpp openfire smack开发之smack类库介绍和使用[2] 1.源码结构介绍 activity包下存放一些android页面交互相关的控制程序,还有一个些公共帮助类 db包为sqlite

学会读JQuery等JS插件源码

很多人觉得jquery.ext等一些开源js源代码 十分的晦涩,读不懂,遇到问题需要调试也很费劲.其实我个人感觉主要是有几个方面的原因: 1.对一些js不常用的语法.操作符不熟悉 2.某个function中又嵌套了一些内部的function,使得整个代码的层次结构不像java代码那么清晰. 3.js中允许变量先使用后定义,会造成我们看代码时候忽然冒出来一个变量.function,却找不到是在哪里定义的. 那么今天给大家分享一下我的经验,扫清你的障碍. 一.一些晦涩的操作符: 1.(functio

Intense Images – 全屏浏览图像的 JS 插件

Intense Images 是一个独立的 JavaScript 库,用于查看全屏图像.使用触摸/鼠标来实现图片位置的平移.图像元素的所有样式都是可以自定义的,Intense.js 只处理图像浏览器和字幕的制作. 您可能感兴趣的相关文章 12款经典的白富美型 jQuery 图片轮播插件 让网站动起来!12款优秀的 jQuery 动画插件 精心挑选的美轮美奂的 jQuery 图片特效插件 精心挑选的优秀jQuery Ajax分页插件和教程 精心挑选的优秀 jQuery 文本特效插件和教程 源码下载