【VUE】实现一个常见的路由拦截表
我们经常需要根据路由表划定权限,在前端开发中,可以通过划定某种具体权限的路由表,来决定一些指定的路由是否应该应用某些操作
1 function checkRouteByRule(ruleRoute,path) { 2 let flag = false; 3 4 let metaList = ruleRoute.map(item => { 5 let perRouterMetaList = item.split("/").filter(function (s) { 6 //去除数组内元素为空的元素 7 return s && s.trim(); 8 }) 9 return perRouterMetaList 10 }) 11 12 let pathMeta = path.split("/").filter(function (s) { 13 //去除数组内元素为空的元素 14 return s && s.trim(); 15 }) 16 17 for (let i = 0; i < metaList.length; i++) { 18 let currentRouteLenth = metaList[i].length; 19 let cutLength = currentRouteLenth;//截断偏移量 20 let oneTimeCompare = true; 21 22 //规整化:确定*的位置,不比较*及以后的内容 23 for (let j = 0; j < currentRouteLenth; j++) { 24 if (metaList[i][j] == "*") { 25 cutLength = i; 26 break; 27 } 28 } 29 30 //如果现在正在识别的路由没有*,meta个数和待匹配的路由meta不一致,则直接判定不匹配 31 if(cutLength==currentRouteLenth){ 32 if(pathMeta.length!=currentRouteLenth){ 33 continue; 34 } 35 } 36 37 //ruleRoute表中的元素依次比对 38 for (let j = 0; j < cutLength; j++) { 39 let firstMetaChar = metaList[i][j][0]; 40 if (firstMetaChar != ":") { 41 if (pathMeta[j] != metaList[i][j]) { 42 oneTimeCompare = false; 43 break; 44 } 45 } else { 46 continue; 47 } 48 } 49 50 //如果匹配到一个OK的路由,则表示应该符合rule对应规则,退出大循环 51 if (oneTimeCompare == true) { 52 flag = true; 53 break; 54 } 55 } 56 57 return flag; 58 }
上述的函数接受两个参数 ruleRoute,path。其中,ruleRoute是需要进行遍历判定的路由表,如判定成功,则表示具有rule对应的权限。path是直接被进行判定的路由
例如定义规则hide路由表(名称为hide的一个字符串数组):
const hide = [
'/new-ticket/:id',
'new-ticket/:id'
]
若路由符合hide内任意一个元素规则,则表示该路由被触发后应该应用hide对应的规则。
上述匹配函数支持的路由表内元素写法:
/new-ticket/helx/fuck 常规路由
/heihei/mother/:id 带路由参数的路由
/shit/* *代表任意长度、内容
/shit/:id/* 既带路由参数,又带*指代某个位置后的任意内容