【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/*  既带路由参数,又带*指代某个位置后的任意内容
 
 
posted @ 2020-07-22 17:53  黄烤鸭  阅读(252)  评论(0编辑  收藏  举报