gxd-vue-library
Version:
依赖与element Ui插件库,聚福宝福利PC端插件库
108 lines (91 loc) • 2.88 kB
JavaScript
;
//https://www.jianshu.com/p/9b8f2cdfcbe1
//https://segmentfault.com/a/1190000014161454
const {pathToRegexp, match, parse, compile} = require("path-to-regexp");
import store from './../store';
/**
* @description 检查变量类型
* @param obj
* @returns {*}
*/
export function check(obj) {
let toString = Object.prototype.toString;
let map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object',
'[object Error]': 'error'
};
return map[toString.call(obj)];
}
/**
* @description 是否有特殊字符
* @param path
* @returns {boolean}
*/
export function hasSpecialPlaceholder(path) {
return /(:[a-zA-z0-9_]+)/g.test(path)
}
/**
* @description 解析字符操作带有 ":xxx"并且不带"?" 的参数,并返回数组
* @param path {String} Api地址
* @param isAllParams {boolean} 是否返回所有带有":xxx" false => :xxx true=>:xxx or :xxx?
* @returns {[]}
*/
export function parsePathToParams(path, isAllParams = true){
return parse(path).filter(item=>{
if(isAllParams) return check(item) === 'object' && item['name'];
else return check(item) === 'object' && item['name'] && item['modifier'] !== '?';
}).map(item=>{
return item['name']
})
}
/**
* @description 返回替换后带参数的api地址,并删除替换的参数
* @param path {String} Api地址
* @param params 参数对象
* @returns {{params: *, url: *}} 返回参数的api地址API
*/
export function compilePath(path,params) {
let commonParams = store.state['commonParams'] || {};
params = {
...params,
...commonParams,
};
let data = JSON.parse(JSON.stringify(params));
let paramsKey = parsePathToParams(path, false);
let compileObj = compile(path);
let paramLen = paramsKey.filter(key=>{
return params[key];
});
console.log('compilePath',params)
//传入需要替换参数小于需要替换参数个数报错
if(paramLen.length < paramsKey.length) {
throw new Error(JSON.stringify({message: '参数个数错误',source: params, target: paramsKey, path: path}))
}
let url = compileObj(data);
if(parsePathToParams(path).length >0) {
parsePathToParams(path).map(item=>{
if(data[item]) delete data[item];
})
}
return {url, result: data};
}
/**
* @description 返回值统一处理
* @param res {Object}
* @param isOpenNoResultKey {Boolean}
*/
export function returnData(res, isOpenNoResultKey) {
res = (res.result && (res.code || res.msg)) ? res.result : res;
res = (res.data && (res.code || res.msg)) ? res.data : res;
if (isOpenNoResultKey) res = {data: res};
return res;
}