在router文件夹下面的index.js中
由于vue中的接口请求封装成了异步,不能满足我们的要求,所以使用原生的XMLHttpRequest
//如果地址栏中有参数,处理数据存入store和session中
//没有获取store中的路由数据
if (decodeURI(location.search).indexOf("token") != -1) {
let backInfo = GetRequest();
store.commit("setToken", backInfo.token);
//根据token获取用户信息
let parameter = {
code: backInfo.token,
state: "1",
tenantId: ""
}
let oReq = new XMLHttpRequest();
oReq.open("POST", baseServerUrl+"api/services/app/Login_OAuth/GetUserInfoByToken", false); // 同步请求
// oReq.open("POST", "192.168.199.203:8099/api/services/app/Login_OAuth/GetUserInfoByToken", false); // 同步请求
oReq.setRequestHeader("Content-type", "application/json");
oReq.setRequestHeader("access_token", store.state.user.token);
oReq.send(JSON.stringify(parameter));//发送数据需要自定义,这里发送的是JSON结构
let res = oReq.responseText;//响应结果
let data = JSON.parse(JSON.parse(res).result).result;
store.commit("setUserInfo", JSON.stringify(data));
store.commit("setTenantId", data.userMsg.tenantId);
let routers = data.rightMsg.filter(e => e.systemName == "人事管理系统")[0].menus.filter(item => item.authority == true);
console.log(store);
store.commit("setRouters", JSON.stringify(routers));
getRouter();
} else {
console.log(store.state.user.routers);
if (store.state.user.routers) {
getRouter();
}else{
window.location.href=window.g.utilitySystemUrl;
}
}
根据接口返回的路由信息,整理成我们需要的路由格式
//处理路由数据
const getRouter = () => {
let routersList = JSON.parse(store.state.user.routers);
let addRouters = [];
console.log("routes222", routersList);
let isHome=routersList.filter(e=>e.path==='/home');
routersList.forEach((element, index) => {
let children = [];
element.sonMenus.forEach(ele => {
if (ele.authority) {
children.push({
path: ele.path,
name: ele.path,
meta: {
icon: `iconfont ${ele.icon}`,
title: ele.name
},
component: () => import(`@/${ele.component}`)
})
}
})
addRouters.push(
{
path: element.path === '/home' ? '/' : element.path,
name: element.path.substring(1),
meta: {
icon: `iconfont ${element.icon}`,
title: element.name,
hideInBread: true,
hideInMenu: !element.isshow
},
component: Main,
children: children
}
);
});
if(addRouters.length>0 && isHome.length>0){
addRouters.filter(e=>e.path === '/')[0].redirect='/home';
}else if(addRouters.length>0 && isHome.length==0){
addRouters.filter(e=>e.path === '/organization_position')[0].path='/';
addRouters.filter(e=>e.path === '/')[0].redirect='/organization_position_list';
}
routes.insertSome(0, addRouters);
// store.commit("setRouterReal", CircularJSON.stringify(routes));
console.log(routes)
}
是否需要重定向到首页
import Vue from 'vue'
import Router from 'vue-router'
import routes from './routers'
import store from '@/store'
import Main from '@/components/main'
// import CircularJSON from 'circular-json'
import iView from 'view-design'
import { setToken, getToken, canTurnTo, setTitle } from '@/libs/util'
import config from '@/config'
// const baseServerUrl = process.env.NODE_ENV === 'development' ? config.baseUrl.dev : config.baseUrl.pro
const baseServerUrl = 'http://192.168.199.203:8099/'
Array.prototype.insertSome = function (place, thing) {
// 向数组插入元素, place是位置(整数) thing是要插入的数据
if (thing instanceof Array) {
var allLen = this.length + thing.length; //合并数组后的长度
var thingLen = thing.length; //要插入的数组长度
var thisLen = this.length; //被插入数组的长度
for (var i = allLen; i > place + thingLen; i--) {
// 先把原来数组在place后面的元素移去后方;
this[i - 1] = this[thisLen - 1];
thisLen--;
}
for (var k = i - 1; k > thisLen - 1; k--) {
// 再把要插入的数组从尾到头插入原来的数组
this[k] = thing[thingLen - 1];
thingLen--;
}
} else {
// 如果thing不是个数组,那么用splice就行了
this.splice(place, 0, thing);
}
}
const { homeName } = config
//对地址栏的参数进行处理
const GetRequest = () => {
var url = decodeURI(location.search); //获取url中"?"符后的字串
var theRequest = new Object();
if (url.indexOf("?") != -1) {
var str = url.substr(1);
var strs = str.split("&");
for (var i = 0; i < strs.length; i++) {
theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
}
}
return theRequest;
}
//处理路由数据
const getRouter = () => {
let routersList = JSON.parse(store.state.user.routers);
let addRouters = [];
console.log("routes222", routersList);
let isHome=routersList.filter(e=>e.path==='/home');
routersList.forEach((element, index) => {
let children = [];
element.sonMenus.forEach(ele => {
if (ele.authority) {
children.push({
path: ele.path,
name: ele.path,
meta: {
icon: `iconfont ${ele.icon}`,
title: ele.name
},
component: () => import(`@/${ele.component}`)
})
}
})
addRouters.push(
{
path: element.path === '/home' ? '/' : element.path,
name: element.path.substring(1),
meta: {
icon: `iconfont ${element.icon}`,
title: element.name,
hideInBread: true,
hideInMenu: !element.isshow
},
component: Main,
children: children
}
);
});
//如果系统有首页,重定向到首页
if(addRouters.length>0 && isHome.length>0){
addRouters.filter(e=>e.path === '/')[0].redirect='/home';
}else if(addRouters.length>0 && isHome.length==0){
//没有首页重定向到需要定向的页面
addRouters.filter(e=>e.path === '/organization_position')[0].path='/';
addRouters.filter(e=>e.path === '/')[0].redirect='/organization_position_list';
}
routes.insertSome(0, addRouters);
// store.commit("setRouterReal", CircularJSON.stringify(routes));
console.log(routes)
}
//如果地址栏中有参数,处理数据存入store和session中
//没有获取store中的路由数据
if (decodeURI(location.search).indexOf("token") != -1) {
let backInfo = GetRequest();
store.commit("setToken", backInfo.token);
//根据token获取用户信息
let parameter = {
code: backInfo.token,
state: "1",
tenantId: ""
}
let oReq = new XMLHttpRequest();
oReq.open("POST", baseServerUrl+"api/services/app/Login_OAuth/GetUserInfoByToken", false); // 同步请求
// oReq.open("POST", "192.168.199.203:8099/api/services/app/Login_OAuth/GetUserInfoByToken", false); // 同步请求
oReq.setRequestHeader("Content-type", "application/json");
oReq.setRequestHeader("access_token", store.state.user.token);
oReq.send(JSON.stringify(parameter));//发送数据需要自定义,这里发送的是JSON结构
let res = oReq.responseText;//响应结果
let data = JSON.parse(JSON.parse(res).result).result;
store.commit("setUserInfo", JSON.stringify(data));
store.commit("setTenantId", data.userMsg.tenantId);
let routers = data.rightMsg.filter(e => e.systemName == "人事管理系统")[0].menus.filter(item => item.authority == true);
console.log(store);
store.commit("setRouters", JSON.stringify(routers));
getRouter();
} else {
console.log(store.state.user.routers);
if (store.state.user.routers) {
getRouter();
}else{
window.location.href=window.g.utilitySystemUrl;
}
}
// 解决ElementUI导航栏中的vue-router在3.0版本以上重复点菜单报错问题
const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
}
Vue.use(Router)
const router = new Router({
base: '/Staff/',
routes,
mode: 'history'
})
const LOGIN_PAGE_NAME = 'login'
const turnTo = (to, access, next) => {
if (canTurnTo(to.name, access, routes)) next() // 有权限,可访问
else next({ replace: true, name: 'error_401' }) // 无权限,重定向到401页面
}
router.beforeEach((to, from, next) => {
iView.LoadingBar.start()
const token = getToken()
if (!token && to.name !== LOGIN_PAGE_NAME) {
// 未登录且要跳转的页面不是登录页
next({
name: LOGIN_PAGE_NAME // 跳转到登录页
})
} else if (!token && to.name === LOGIN_PAGE_NAME) {
// 未登陆且要跳转的页面是登录页
next() // 跳转
} else if (token && to.name === LOGIN_PAGE_NAME) {
// 已登录且要跳转的页面是登录页
next({
name: homeName // 跳转到homeName页
})
} else {
//拉取数据字典
console.log(store.state.dic.hasGetDic);
if (!store.state.dic.hasGetDic) {
let oReq = new XMLHttpRequest();
oReq.open("get", baseServerUrl+"DataShare/api/services/app/CodeMain/GetCodeMainItems", false); // 同步请求
oReq.setRequestHeader("Content-type", "application/json");
oReq.setRequestHeader("access_token", store.state.user.token);
oReq.send();//发送数据需要自定义,这里发送的是JSON结构
let res = oReq.responseText;//响应结果
const data = JSON.parse(res).result;
let dicHash = new Map();
for (let index = 0; index < data.length; index++) {
const element = data[index];
let codeItemList = [];
element.codeItems.forEach(item => codeItemList.push(Object.values(item)));
dicHash.set(element.codeName,new Map(codeItemList));
}
store.commit('setDic', dicHash)
store.commit('setHasGetDic', true)
}
//连接SignalR
if (!store.state.signalr.hasConnected) {
store.dispatch('connect');
}
}
next() // 跳转
})
router.afterEach(to => {
setTitle(to, router.app)
iView.LoadingBar.finish()
window.scrollTo(0, 0)
})
export default router