You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
453 lines
13 KiB
453 lines
13 KiB
var eonfox = function(config){
|
|
if( config ){
|
|
if( config.debug ){
|
|
eonfox.prototype.debug = true;
|
|
}
|
|
if( config.application ){
|
|
eonfox.prototype.application = config.application;
|
|
}
|
|
if( config.api_server_url ){
|
|
eonfox.prototype.api_server_url = config.api_server_url;
|
|
}
|
|
}
|
|
|
|
};
|
|
eonfox.prototype = {
|
|
|
|
constructor : eonfox,
|
|
|
|
//是否开启调试模式
|
|
debug : false,
|
|
|
|
|
|
//文件服务器URL
|
|
file_server_url : 'http://img.eonfox.cc/',
|
|
|
|
//接口地址 应用ID
|
|
api_server_url : 'http://server.test.eapie.com/',
|
|
application : "test",
|
|
|
|
//会话名称
|
|
session_name : 'Eonfox_API_Engine_Session',
|
|
|
|
/*
|
|
转换时间格式
|
|
*/
|
|
switchingTime: function(timestamp) {
|
|
var date = new Date(timestamp * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
|
|
var Y = date.getFullYear() + '-';
|
|
var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
|
|
var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ';
|
|
var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
|
|
var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
|
|
var s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
|
|
return Y + M + D + h + m + s;
|
|
},
|
|
|
|
|
|
//提交的有效等待时间
|
|
submit_sleep_expire_time : 30,
|
|
|
|
|
|
//请求任务
|
|
submit_task : null,
|
|
|
|
/**
|
|
* 提交队列
|
|
*/
|
|
submit_queue : [],
|
|
|
|
|
|
|
|
/**
|
|
* 提交登记
|
|
*/
|
|
submit_register : function( config ){
|
|
config.time = ((new Date()).getTime()/1000);//赋值是 时间戳 (秒),用于有效时间
|
|
eonfox.prototype.submit_queue.push(config);
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
* 运行提交
|
|
*/
|
|
submit_run : function(){
|
|
if( eonfox.prototype.submit_queue.length < 1 ){
|
|
return false;//没有执行的提交
|
|
}
|
|
if( eonfox.prototype.submit_queue[0].runtime ){
|
|
return false;//正在执行
|
|
}
|
|
|
|
//检查是否已经失效
|
|
if( (eonfox.prototype.submit_queue[0].time + eonfox.prototype.submit_sleep_expire_time) < ((new Date()).getTime()/1000) ){
|
|
//已经过了有效期
|
|
//删除第一个元素
|
|
eonfox.prototype.submit_queue.shift();
|
|
//再次提交
|
|
return eonfox.prototype.submit_run();
|
|
}
|
|
|
|
eonfox.prototype.submit_queue[0].runtime = true;
|
|
var config = eonfox.prototype.submit_queue[0];
|
|
|
|
//从本地缓存中同步获取指定 key 对应的内容。
|
|
var token = eonfox.prototype.token(function(e){
|
|
config.error(e);
|
|
});
|
|
|
|
if( !(function(){try{ return token['session_right_token'];}catch(e){return false;}}()) ){
|
|
config.right_data.session = "start";
|
|
config.right_data.application = this.application;
|
|
}else{
|
|
config.right_data.token = token['session_right_token'];
|
|
config.left_data.token = token['session_left_token'];
|
|
config.left_data.session = "start";
|
|
config.left_data.application = this.application;
|
|
}
|
|
|
|
var request = {
|
|
url : config.url,
|
|
method : "POST",
|
|
dataType : "json",
|
|
responseType : "text",
|
|
header: {"Content-Type":"application/x-www-form-urlencoded"},//跨域,防止请求options
|
|
complete : function(){
|
|
//当请求完成之后调用这个函数,无论成功或失败。执行时间比success晚
|
|
//删除第一个元素
|
|
eonfox.prototype.submit_queue.shift();
|
|
//再次提交
|
|
eonfox.prototype.submit_run();
|
|
},
|
|
success : function(){},
|
|
fail : function(err){
|
|
config.error(err);
|
|
}
|
|
}
|
|
|
|
//右令牌
|
|
var right_token_post = function(){
|
|
request.data = config.right_data;
|
|
request.success = function(success_data_all){
|
|
//这里要注意,这里是包含了 data
|
|
if(typeof success_data_all != 'object'){
|
|
success_data_all = (function(){try{ return JSON.parse(success_data_all);}catch(e){return false;}}());
|
|
}
|
|
var success_data = success_data_all.data? success_data_all.data : null;
|
|
if(typeof success_data != 'object'){
|
|
console.warn("应用接口响应异常");
|
|
return config.callback(false, success_data_all);
|
|
}
|
|
|
|
//如果存在请求令牌,直接返回数据
|
|
if( (function(){try{ return success_data['token'];}catch(e){return false;}}()) ){
|
|
//储存令牌
|
|
eonfox.prototype.storage_token(success_data);
|
|
//返回到回调函数
|
|
return config.callback(success_data, success_data_all);
|
|
}else{
|
|
//否则说明没有这个会话,再进行左令牌查询
|
|
return left_token_post();
|
|
}
|
|
};
|
|
if( eonfox.prototype.debug ){
|
|
console.log("post():右令牌提交:", request);
|
|
}
|
|
|
|
eonfox.prototype.submit_task = uni.request(request);
|
|
};
|
|
|
|
|
|
//左令牌
|
|
var left_token_post = function(){
|
|
request.data = config.left_data;
|
|
request.success = function(success_data_all){
|
|
//这里要注意,这里是包含了 data
|
|
if(typeof success_data_all != 'object'){
|
|
success_data_all = (function(){try{ return JSON.parse(success_data_all);}catch(e){return false;}}());
|
|
}
|
|
var success_data = success_data_all.data? success_data_all.data : null;
|
|
if(typeof success_data != 'object'){
|
|
console.warn("应用接口响应异常");
|
|
return config.callback(false, success_data_all);
|
|
}
|
|
|
|
//如果没有报错
|
|
if( (function(){try{ return success_data['token'];}catch(e){return false;}}()) ){
|
|
//储存令牌
|
|
eonfox.prototype.storage_token(success_data);
|
|
}
|
|
|
|
//返回到回调函数
|
|
return config.callback(success_data, success_data_all);
|
|
};
|
|
|
|
if( eonfox.prototype.debug ){
|
|
console.log("post():左令牌提交:", request);
|
|
}
|
|
|
|
eonfox.prototype.submit_task = uni.request(request);
|
|
};
|
|
|
|
|
|
return right_token_post();
|
|
},
|
|
/**
|
|
* 获取左token
|
|
* 如果没用传入回调函数,那么则直接返回当前左令牌,但是有可能会出现左令牌失效
|
|
* 正常操作是,传入一个回调函数,左令牌始终是保持最新的。
|
|
*
|
|
* @param {Function} #fn
|
|
*/
|
|
websocketToken : function(fn){
|
|
if(typeof fn != "function"){
|
|
var storage_token = eonfox.prototype.token();
|
|
if( (function(){try{ return storage_token['session_websocket_token'];}catch(e){return false;}}()) ){
|
|
return storage_token['session_websocket_token'];
|
|
}else{
|
|
return '';
|
|
}
|
|
}else{
|
|
eonfox.prototype.submit({
|
|
callback: function(){
|
|
//从本地缓存中同步获取指定 key 对应的内容。
|
|
var websocket_token = "";
|
|
var websocket_token = eonfox.prototype.token();
|
|
if( (function(){try{ return storage_token['session_websocket_token'];}catch(e){return false;}}()) ){
|
|
websocket_token = storage_token['session_websocket_token'];
|
|
}
|
|
fn(websocket_token);
|
|
}
|
|
});
|
|
return true;
|
|
}
|
|
},
|
|
|
|
|
|
|
|
/* 中断请求任务 */
|
|
abort : function(){
|
|
//清理等待的请求
|
|
eonfox.prototype.submit_queue = [];
|
|
//中断请求任务
|
|
if( eonfox.prototype.submit_task.abort ){
|
|
eonfox.prototype.submit_task.abort();
|
|
}
|
|
},
|
|
|
|
|
|
|
|
/* 提交请求
|
|
* 暂时只支持 POST
|
|
* {
|
|
* url : this.api_server_url,默认接口地址
|
|
* data : {},
|
|
* callback : 回调函数 第一个是单个 data,第二个是 全部的返回数据
|
|
* error : 错误回调函数
|
|
* }
|
|
*
|
|
*/
|
|
submit : function(config){
|
|
if( eonfox.prototype.debug ){
|
|
console.log("submit()传入参数:", config);
|
|
}
|
|
|
|
//回调函数
|
|
if( !config.callback || config.callback.constructor != Function ){
|
|
config.callback = function(){};
|
|
}
|
|
if( !config.error || config.error.constructor != Function ){
|
|
config.error = function(){};
|
|
}
|
|
|
|
//路由
|
|
if(typeof config.url == 'undefined' || typeof config.url != 'string'){
|
|
config.url = this.api_server_url;
|
|
}
|
|
|
|
config.right_data = {};
|
|
config.left_data = {};
|
|
//请求字符串
|
|
if( config.request ){
|
|
//如果是对象,则先转换为字符串
|
|
if(typeof config.request == "object"){
|
|
config.request = JSON.stringify(config.request)
|
|
}
|
|
if(typeof config.request == "string"){
|
|
config.right_data.data = config.request;
|
|
config.left_data.data = config.request;
|
|
}
|
|
}
|
|
|
|
//用户传入的data数据
|
|
if( config.data && typeof config.data == "object" ){
|
|
for(var i in config.data){
|
|
config.right_data[i] = config.data[i];
|
|
config.left_data[i] = config.data[i];
|
|
}
|
|
}
|
|
|
|
if( eonfox.prototype.debug ){
|
|
console.log("post():right_data、left_data:", config.right_data, config.left_data);
|
|
}
|
|
|
|
/*//是否强制提交
|
|
config.recursion = config.recursion? true : false;
|
|
//大于0,说明存在队列
|
|
if( this.submit_queue.length > 0 ){
|
|
//判断是否强制提交
|
|
if( config.recursion ){
|
|
//去登记注册
|
|
eonfox.prototype.submit_register(config);
|
|
}else{
|
|
//否则返回错误信息
|
|
console.warn("应用接口提交队列个数:", this.submit_queue.length);
|
|
return config.error("应用接口出现重复提交,前方正在提交队列个数:", this.submit_queue.length);
|
|
}
|
|
}else{
|
|
//去登记注册
|
|
eonfox.prototype.submit_register(config);
|
|
} */
|
|
|
|
//去登记注册
|
|
eonfox.prototype.submit_register(config);
|
|
//并且调用执行
|
|
eonfox.prototype.submit_run();
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
* 储存token
|
|
*
|
|
* @param {Object} data
|
|
*/
|
|
storage_token : function(data){
|
|
if( !data ){
|
|
return false;
|
|
}
|
|
|
|
var token_data = null;
|
|
var exist_right_token = false;
|
|
var exist_left_token = false;
|
|
|
|
exist_right_token = (function(){try{ return data['token']['session_right_token'];}catch(e){return false;}}());
|
|
exist_left_token = (function(){try{ return data['token']['session_left_token'];}catch(e){return false;}}());
|
|
if(exist_right_token && exist_left_token){
|
|
token_data = data['token'];
|
|
}else{
|
|
//有可能是顶级关联对象
|
|
exist_right_token = (function(){try{ return data['session_right_token'];}catch(e){return false;}}());
|
|
exist_left_token = (function(){try{ return data['session_left_token'];}catch(e){return false;}}());
|
|
if(exist_right_token && exist_left_token){
|
|
token_data = data;
|
|
}
|
|
}
|
|
|
|
if(!token_data){
|
|
return false;
|
|
}
|
|
|
|
//从本地缓存中同步获取指定 key 对应的内容。
|
|
var storage_token = eonfox.prototype.token();
|
|
if( (function(){try{ return storage_token['session_right_token'];}catch(e){return false;}}()) &&
|
|
(function(){try{ return storage_token['session_left_token'];}catch(e){return false;}}()) ){
|
|
|
|
if(storage_token['session_right_token'] == token_data['session_right_token'] ||
|
|
storage_token['session_left_token'] == token_data['session_left_token'] ){
|
|
if( eonfox.prototype.debug ){
|
|
console.log("需要对比旧token中的当前时间戳,为true则不需要更新token", storage_token['session_now_time'], token_data['session_now_time'], parseInt(storage_token['session_now_time']) > parseInt(token_data['session_now_time']));
|
|
}
|
|
if( parseInt(storage_token['session_now_time']) > parseInt(token_data['session_now_time']) ){
|
|
if( eonfox.prototype.debug ){
|
|
console.log("并发异步,不需要更新token" );
|
|
}
|
|
return false;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
//console.log( uni.setStorageSync );
|
|
|
|
try {
|
|
uni.setStorageSync(this.session_name +":"+ this.application, JSON.stringify(token_data));
|
|
} catch (e) {
|
|
console.warn(e);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
* 获取token
|
|
*
|
|
* @param {Function} error_function
|
|
*/
|
|
token : function(error_function){
|
|
//异步可能存在覆盖的问题,所以对比已存在的token,如果右左有一个相同则比较当前时间,即最大的当前时间是最新的。
|
|
var storage_token = false;
|
|
try {
|
|
storage_token = uni.getStorageSync(this.session_name +":"+ this.application);
|
|
if( storage_token ){
|
|
storage_token = (function(){try{ return JSON.parse(storage_token);}catch(e){return false;}}());
|
|
}
|
|
} catch (e) {
|
|
console.warn(e);
|
|
if(error_function){
|
|
error_function(e);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
return storage_token;
|
|
},
|
|
|
|
|
|
/**
|
|
* 获取左token
|
|
* 如果没用传入回调函数,那么则直接返回当前左令牌,但是有可能会出现左令牌失效
|
|
* 正常操作是,传入一个回调函数,左令牌始终是保持最新的。
|
|
*
|
|
* @param {Function} #fn
|
|
*/
|
|
left_token : function(fn){
|
|
if(typeof fn != "function"){
|
|
var storage_token = eonfox.prototype.token();
|
|
if( (function(){try{ return storage_token['session_left_token'];}catch(e){return false;}}()) ){
|
|
return storage_token['session_left_token'];
|
|
}else{
|
|
return '';
|
|
}
|
|
}else{
|
|
eonfox.prototype.submit({
|
|
callback: function(){
|
|
//从本地缓存中同步获取指定 key 对应的内容。
|
|
var left_token = "";
|
|
var storage_token = eonfox.prototype.token();
|
|
if( (function(){try{ return storage_token['session_left_token'];}catch(e){return false;}}()) ){
|
|
left_token = storage_token['session_left_token'];
|
|
}
|
|
fn(left_token);
|
|
}
|
|
});
|
|
return true;
|
|
}
|
|
},
|
|
/* 获取 websocket 数据 */
|
|
websocket_data : function(res){
|
|
console.log(res);
|
|
if( !res.data ){
|
|
|
|
return false;
|
|
}
|
|
|
|
return JSON.parse( res.data );
|
|
}
|
|
|
|
};
|
|
export default eonfox;
|