WYB
2021-03-22 91b8cdad021ab052e4991f3d41834a6f0ddc36b8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
import router from '@/router/index'
import { resetRouter, filterAsyncRouter } from '@/router/index'
import Com from '@/com/global';
import { getNavigationBar, saveRefreshtime, LoginByJobNo, getUserByToken } from '@/api/api';
import store from "@/store";
import applicationUserManager from "./Auth/applicationusermanager";
 
let loadfns = window.LoadFns;
let user = null, groutes = null;
//检测是否自动跳转
let prms = Com.GetUrlParams();
let prm = prms["AutoLogin"];
if (prm) {
    loadfns.push(() => {
        return new Promise(rtn => {
            var prms = { JWTToken: prm };
            LoginByJobNo(prms).then(data => {
                if (!data.success) {
                    console.log(data.msg);
                    return;
                }
                var token = data.response.token;
                var curTime = new Date();
                var expiredate = new Date(curTime.setSeconds(curTime.getSeconds() + data.response.expires_in));
                store.commit("saveToken", token);
                store.commit("saveTokenExpire", expiredate);
                Com.SaveObj("Token", token);
                Com.SaveObj("TokenExpire", expiredate);
                Com.SaveObj("refreshtime", expiredate);
                Com.SaveObj("expires_in", data.response.expires_in);
                console.log(`成功获取令牌,项目初始化中...`);
                var loginParams = { token: token };
                getUserByToken(loginParams).then((data) => {
                    if (!data.success) {
                        console.log(data.msg);
                        return;
                    }
                    user = data.response;
                    console.log(`欢迎管理员:${user.uRealName} !`);
                    Com.SaveCfg("user", data.response);
                    Com.SaveCfg('router', null);
                    rtn();
                });
            });
        });
    });
}
 
//获取路由菜单
loadfns.push(() => {
    return new Promise(rtn => {
        groutes = Com.ReadCfg('router');
        if (groutes) {
            rtn(); return;
        }
        user = user || Com.ReadCfg("user");
        if (!user || user.uID < 0) {
            rtn(); return;
        }
        var loginParams = { uid: user.uID };
        getNavigationBar(loginParams).then(data => {
            if (data&&data.success) {
                console.info('菜单获取完成')
                groutes = data.response.children//后台拿到路由
                Com.SaveCfg('router', groutes) //存储路由到localStorage
            }
            location.replace("/");
            rtn();
        });
    });
});
 
//权限列表
window.DicLimit={};
function LoadDicLimit(Routes,Limits){
    if(!Limits)Limits=window.DicLimit;
    for(let i=0,c=Routes.length;i<c;i++){
        let route=Routes[i];
        let limit=Limits[route.name||"unname"];
        if(!limit)limit=Limits[route.name||"unname"]=[];
        let item={L:{},R:route};
        limit.push(item);
        if(route.children)LoadDicLimit(route.children,item.L);
    }
}
 
//用来分析菜单和路由
loadfns.push(() => {
    return new Promise(rtn => {
        if (!groutes) {
            groutes = Com.ReadCfg('router')//拿到路由
        }
        if (groutes) {
            LoadDicLimit(groutes);
            groutes = filterAsyncRouter(groutes) //过滤路由
            router.$addRoutes(groutes) //动态添加路由
            global.antRouter = groutes //将路由数据传递给全局变量,做侧边栏菜单渲染工作
        }
        var storeTemp = store;
        router.beforeEach((to, from, next) => {
            //验证Token
            {
                if (!storeTemp.state.token) {
                    storeTemp.commit("saveToken", window.localStorage.Token)
                }
                if (!storeTemp.state.tokenExpire) {
                    storeTemp.commit("saveTokenExpire", window.localStorage.TokenExpire)
                }
                saveRefreshtime();
                if (to.meta.requireAuth) {
                    // 判断该路由是否需要登录权限
                    var curTime = new Date()
                    var expiretime = new Date(Date.parse(window.localStorage.TokenExpire))
                    if (storeTemp.state.token && storeTemp.state.token != "undefined") {
                        // 通过vuex state获取当前的token是否存在
                        next();
                    } else {
                        store.commit("saveToken", "");
                        store.commit("saveTokenExpire", "");
                        store.commit("saveTagsData", "");
                        window.localStorage.removeItem('user');
                        window.localStorage.removeItem('NavigationBar');
                        window.localStorage.removeItem('router');
 
 
                        if (global.IS_IDS4) {
                            applicationUserManager.login();
                        } else {
                            next({
                                path: "/login",
                                query: { redirect: to.fullPath } // 将跳转的路由path作为参数,登录成功后跳转到该路由
                            });
 
                            window.location.reload()
                        }
 
                    }
                } else {
                    next();
                }
            }
 
            //动态添加路由
            {
                //不加这个判断,路由会陷入死循环
                if (groutes) {
                    if (to.name && to.name != 'login') {
                        global.antRouter = groutes
                        // routerGo(to, next)//执行路由跳转方法
                    }
                    next()
                }
            }
        });
        rtn();
    });
});
 
function routerGo(to, next, gs) {
    //过滤路由
    groutes = filterAsyncRouter(groutes || gs)
    resetRouter()
 
    //动态添加路由
    router.$addRoutes(groutes)
 
    //将路由数据传递给全局变量,做侧边栏菜单渲染工作
    global.antRouter = groutes
    next({ ...to, replace: true })
}
 
//获取按钮列表
var buttonList = [];
export const GetButtonList = (routePath, routers) => {
    routers.forEach(element => {
        if (routePath && element.path) {
            let path = routePath.toLowerCase();
            if (element.path && element.path.toLowerCase() === path) {
                buttonList = element.children;
                return;
            } else if (element.children) {
                getButtonList(path, element.children);
            }
        }
    });
    return buttonList;
};
export const getButtonList = GetButtonList;
//是否被限制操作
export const IsLimit=(NamePath,Limits,at)=>{
    debugger;
    if(!Limits)Limits=window.DicLimit;
    if(!at)at=0;
    let name=NamePath[at];
    let cfgs=Limits[name];
    if(!cfgs)return 0;
    for(let i=0,c=cfgs.length;i<c;i++){
        let cfg=cfgs[i];
        if(cfg&&at+1>=NamePath.length)return 1;
        if(IsLimit(NamePath,cfg.L,at+1))return 1;
    }
    return 0;
}