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 ...
随机推荐
- sublimelinter-php 错误代码提示
先安装 SublimeLinter 如同其他插件一样使用 Package Control 来安装. 按下 Ctrl+Shift+p 进入 Command Palette 输入install进入 Pac ...
- Win10资源管理器中的库文件夹按照修改日期排序
win7之后添加的库十分的好用,可以将下载,音乐,文档设置在我的电脑(win10叫此电脑)首页,快速进入. 我对文件夹设置了按照时间排序,这样进去就可以直接看到最近下载了什么文件.但是win10用时间 ...
- [CVE-2017-8464]Microsoft Windows远程命令执行漏洞复现
版权声明:本文为博主的原创文章,未经博主同意不得转载 前言 记录下自己的复现,保留意见 2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快 ...
- ASP.NET Core Web API + Angular 仿B站(三)后台配置 JWT 的基于 token 的验证
前言: 本系列文章主要为对所学 Angular 框架的一次微小的实践,对 b站页面作简单的模仿. 本系列文章主要参考资料: 微软文档: https://docs.microsoft.com/zh-cn ...
- lightoj 1422【区间DP·分类区间首元素的情况】
题意: 给你n天分别要穿的衣服种类,可以套着穿, 一旦脱下来就不能再穿,求n天至少要几件. 思路: 区间DP dp[i][j]代表i到j需要至少几件衣服 第i天的衣服在第i天穿上了,dp[i][j]= ...
- 51nod1093(推公式&找規律)
題目鏈接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1093 題意:中文題誒- 思路:xjb 一開始死活想不出怎麼將一 ...
- P5135 painting(组合数)
传送门 如果\(op==1\),那么每一个方案都可以看做从\(n\)个数里选出\(m\)个数,然后\(sort\)一下依次放到每列,方案数就是\({n\choose m}\).因为\(n\)很大,但是 ...
- 洛谷P2485 [SDOI2011]计算器(exgcd+BSGS)
传送门 一题更比三题强 1操作直接裸的快速幂 2操作用exgcd求出最小正整数解 3操作用BSGS硬上 然后没有然后了 //minamoto #include<cstdio> #inclu ...
- CSS中em,px区别(转)
这里向大家描述一下CSS中px和em的特点和区别,px像素(Pixel),相对长度单位,像素px是相对于显示器屏幕分辨率而言的,而em是相对长度单位,相对于当前对象内文本的字体尺寸,相信本文介绍一定会 ...
- 浅谈H5技术
1.什么是H5:HTML5将成为HTML.XHTML以及HTML DOM的新标准.目前仍处于完善之中.然而,大部分现代浏览器已经具备了某些HTML5支持. 2.背景:HTML5 是 W3C 与 WH ...