提交 cff4b6a7 编写于 作者: WodahsOrez's avatar WodahsOrez

fix: 路径计算

上级 7cbf7f5f
...@@ -55,7 +55,10 @@ export class RouteTool { ...@@ -55,7 +55,10 @@ export class RouteTool {
} }
/** /**
* 获取关系实体路径 * 获取关系实体路径(部分匹配)
* - 优先匹配路径节点数多的路径
* - 取最终匹配节点个数最多的组合
* - 路径节点必须从后往前连续匹配,中间缺失的舍弃前面匹配的节点
* *
* @static * @static
* @param {*} [viewParam={}] 视图上下文 * @param {*} [viewParam={}] 视图上下文
...@@ -101,6 +104,64 @@ export class RouteTool { ...@@ -101,6 +104,64 @@ export class RouteTool {
} }
}); });
// 如果一个匹配的没有,即没有任何主键匹配上,关系路径为实体自身的pathName
if(routePath == ''){
routePath = "/"+deResPaths[deResPaths.length -1][0].pathName;
}
return routePath;
}
/**
* 计算请求关系实体路径(全部匹配)
* - 优先匹配路径节点数多的路径
* - 取最终匹配节点个数最多的组合
* - 路径的每个节点必须全部匹配
*
* @static
* @param {*} [viewParam={}] 视图上下文
* @param {any[]} deResPaths 关系实体参数对象数组
* @returns {string}
* @memberof RouteTool
*/
public static buildDeResRequestPath(context: any = {}, deResPaths: any[]): string {
let routePath: string = '';
// 首先给deResPaths排序,关系多的排前面。
deResPaths.sort((a: any[], b: any[]) => a.length - b.length);
// 最多匹配路径节点数
let maxMatch: number = 0;
// 开始匹配,先遍历关系路径,在遍历关系路径的每个节点
deResPaths.some((deResPath: any[]) => {
// 如果节点个数小于最大匹配,则后面都无需在计算了。(省略多余运算)
if (maxMatch > deResPath.length) {
return true;
}
// 当前匹配路径节点数
let curMatch: number = 0;
let curRoutPath: string = '';
deResPath.some((deResNode: any, index: number) => {
let value: any = context[deResNode.parameterName];
if (notEmpty(value)) {
curMatch++;
curRoutPath += `/${deResNode.pathName}/${value}`;
} else {
// 只要有一个节点没值,则整个路径作废。
curMatch = 0;
curRoutPath = '';
return true
}
});
// 当前匹配个数大于最大匹配时,修改最大匹配和最终结果
if (curMatch > maxMatch) {
maxMatch = curMatch;
routePath = curRoutPath;
}
});
return routePath; return routePath;
} }
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册