gxd-vue-library
Version:
依赖与element Ui插件库,聚福宝福利PC端插件库
87 lines (76 loc) • 2.1 kB
JavaScript
;
//https://www.jianshu.com/p/9b8f2cdfcbe1
//https://segmentfault.com/a/1190000014161454
const {pathToRegexp, match, parse, compile} = require("path-to-regexp");
/**
* @description 检查变量类型
* @param obj
* @returns {*}
*/
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}
*/
function hasSpecialPlaceholder(path) {
return /(:[a-zA-z0-9_]+)/g.test(path)
}
/**
* @description 解析字符操作带有 ":xxx" 的参数,并返回数组
* @param path {String} Api地址
* @returns {[]}
*/
function parsePathToParams(path){
return parse(path).filter(item=>{
return check(item) === 'object' && item['name'];
}).map(item=>{
return item['name']
})
}
/**
* @description 返回替换后带参数的api地址,并删除替换的参数
* @param path {String} Api地址
* @param params 参数对象
* @returns {{params: *, url: *}} 返回参数的api地址API
*/
function compilePath(path,params) {
let data = JSON.parse(JSON.stringify(params));
let paramsKey = parsePathToParams(path);
let compileObj = compile(path);
let paramLen = paramsKey.filter(key=>{
return params[key];
});
//传入需要替换参数小于需要替换参数个数报错
if(paramLen.length < paramsKey.length) {
throw new Error(JSON.stringify({message: '参数个数错误',source: params, target: paramsKey, path: path}))
}
let url = compileObj(data);
if(paramsKey.length >0) {
paramsKey.map(item=>{
delete data[item];
})
}
return {url, result: data};
}
module.exports = {
compilePath,
parsePathToParams,
check
}