api.js 5.63 KB
/**
 * Created by goto9 on 2018/7/19.
 */
//接口地址,测试环境请修改以下地址
//const server_host='https://xt04.colorcun.com/?s=';
const api_timeout=2000; //接口超时时间,默认2s

//引入接口映射关系表
import api from './api.url'
import uri_dc from './uri'
const server_host=uri_dc.HOST__LINE;

/**
 *
 * @param act
 * @param data
 * @param fouce false|true 强制请求服务器,获取最新数据;默认优先使用缓存
 * @param header    追加header
 * @param silence    loading
 * @param cachetime    缓存时间
 * @param timeout    接口超时
 * @returns {Promise}
 */
function rpc(host='',act,data={},fouce=false,header={},silence=true,cachetime=0,timeout=api_timeout){
    host=host?host:server_host;
    let param="";
    for(let key in data){
        let val=data[key];
        if(val!=""){
            param+='&'+key+'='+val
        }
    }
    let cache_key=act;
    if(param){
        cache_key+='?'+param.substr((param.length-1)*-1);
    }
    if(fouce=='clear' || fouce=='clean'){
        return wx.removeStorageSync(cache_key);
    }
    if(!fouce && cachetime!=0){//优先使用缓存
        let getCache= cache(cache_key);
        if(getCache!=-99999){
            return new Promise((success,fail)=>{
                if(true){
                    getCache.isCache=true;
                    console.log(cache_key+'\nuse cache',getCache);
                    success(getCache);
                }else{
                    fail();
                }
            })
        }
    }
    if(!silence){
        wx.showLoading({
            title: '处理中',
            mask:true
        })
    }
    return new Promise((success,fail)=>{
        let openid = wx.getStorageSync('customer_openid');
        let formids = wx.getStorageSync('formids');
        if(formids){
            wx.removeStorage({key:'formids'});
        }

        wx.request({
            url: host+act,
            method: 'POST',
            data: data,
            header: {
                ...header,
                openid:openid,
                formids:formids.toString(),
                'content-type': 'application/x-www-form-urlencoded'
            },
            success: function (res) {
                console.log('request.api==>',host+cache_key+'\nrequest.success',res.data);
                // return;
                if(res.data){
                    if(cachetime!=0 && res.data.ret==200 && res.data.data){
                        cache(cache_key,res.data,cachetime);//.then().catch();
                    }
                    if(res.data.ret!==200){
                        try{
                            res.data.msg=res.data.msg.replace('非法请求:','');
                        }catch(e){
                            console.log('res-fail',res,e);
                        }
                    }
                }
                success(res.data);
            },
            fail: function (res) {
                console.log('request.api==>',host+cache_key+'\nrequest.fail',res);
                fail(res);
                // let query = wx.createSelectorQuery().selectComponent("#network");
                // let net=query.exec(function(){
                //     console.log('back=>',arguments);
                // });
                //query.show();
                //console.log('net',query);
            },
            complete:function(){
                wx.hideLoading();
            }
        })
    })
}

function __api(){
    let tmpApi={}
    let keys=[];
    for(let key in api){
        api[key]=api[key]||{};
        keys=key.split('.');
        tmpApi[keys[0]]=tmpApi[keys[0]]?tmpApi[keys[0]]:{};
        tmpApi[keys[0]][keys[1]]=tmpApi[keys[0]][keys[1]]?tmpApi[keys[0]][keys[1]]:{};
        tmpApi[keys[0]][keys[1]][keys[2]]=function(data,fouce=false,header){
            //console.log('api[key].host',api[key].host);
            return rpc(api[key].host,api[key].alias||key,data,fouce,header,
                api[key].silence,api[key].cachetime,api[key].timeout);
        }
    }
    for(let xkey in uri_dc){
        let key=uri_dc[xkey].toString();
        if(key.indexOf('App.')>-1){
            keys=key.split('.');
            try{
                if(typeof tmpApi[keys[0]][keys[1]][keys[2]]=='undefined'){
                    throw new Error('undefined');
                }
            }catch(e){
                api[key]=api[key]||{};
                tmpApi[keys[0]]=tmpApi[keys[0]]?tmpApi[keys[0]]:{};
                tmpApi[keys[0]][keys[1]]=tmpApi[keys[0]][keys[1]]?tmpApi[keys[0]][keys[1]]:{};
                tmpApi[keys[0]][keys[1]][keys[2]]=function(data,fouce=false,header){
                    //console.log('api[key].host',api[key]);
                    return rpc(api[key].host,api[key].alias||key,data,fouce,header,
                        api[key].silence,api[key].cachetime,api[key].timeout);
                }
            }
        }
    }
    //console.log(tmpApi[keys[0]]);
    return tmpApi[keys[0]];
}
function cache(key,val=-99999,timeout=-1){
    if(val!=-99999){//写入
        return new Promise((success,fail)=>{
            let data={
                data:val,
                timeout:timeout==-1?-1:(Date.parse(new Date())/1000+timeout)
            }
            wx.setStorage({
                key:key,
                data:data,
                success:()=>{
                    success()
                },
                fail:()=>{
                    fail()
                }
            });
        })
    }
    let res=wx.getStorageSync(key);
    let time=Date.parse(new Date())/1000;
    if(res && (res.timeout==-1 || res.timeout>time) && res.data.data){
        return res.data;
    }else{
        return -99999
    }
}
export default __api();