litemall源码阅读3.04管理后台前端litemall-admin拉取用户信息与用户权限

在登录成功后,url会定向到之前的url,如果是/,则会定向到

 dashboard,接下来我们看这个过程发生了什么。

新的URL依旧会被全局前置导航守卫

拦截。

此时,我们已经有了登录后获取的token,所以getToken会返回true。最终,代码会执行

 该代码块。我们并没有获取到用户信息与权限,这时候会调用GetUserInfo来获取用户信息,之后又调用了GenerateRoutes

生成了权限信息。

我们先看GetUserInfo,进入函数,内部又调用了

litemall-admin/src/api/login.js中的

export function getUserInfo(token) {
return request({
url: '/auth/info',
method: 'get',
params: { token }
})
}

结合litemall-admin/src/utils/request.js

service.interceptors.request.use(
config => {
// Do something before request is sent
if (store.getters.token) {
// 让每个请求携带token-- ['X-Litemall-Admin-Token']为自定义key 请根据实际情况自行修改
config.headers['X-Litemall-Admin-Token'] = getToken()
}
return config
},
error => {
// Do something with request error
console.log(error) // for debug
Promise.reject(error)
}
)

即在本次登录中加入了登录中获取到的token。再结合springboot后台,将header中的

X-Litemall-Admin-Token

取出,作为sessionID。完成后台的登录验证。

之后等结果返回。

java后台会返回当前用户的

 姓名,头像,角色,权限等信息。

之后,在litemall-admin/src/store/modules/user.js的

 分别commit了三个字段。以avatar为例。

 设置了state.avatar的值。结合

 可知,当获取avatar时,获取到的为state.user.avatar的值。所以可知

在文件litemall-admin/src/views/layout/components/Navbar.vue中

 会显示avatar。

接下来,进入权限刷新。也就是GenerateRoutes。

通过登录,springboot已经返回了perms的信息。perms的信息包含在litemall_role与litemall_permission中。

 在该函数里,如果perms为*,则添加所有权限。如果不为*,则进入filterAsyncRoutes。

该函数用到了递归。routes参数为全部的动态权限。第二个参数为springboot返回的权限。

function filterAsyncRoutes(routes, perms) {
const res = []

routes.forEach(route => {
const tmp = { ...route }
if (tmp.children) {
tmp.children = filterAsyncRoutes(tmp.children, perms)
if (tmp.children && tmp.children.length > 0) {
res.push(tmp)
}
} else {
if (hasPermission(perms, tmp)) {
res.push(tmp)
}
}
})

return res
}
首先通过递归函数,逐步匹配每个route中的perms是否包含在perms中。如果包含则对返回值进行组合。
最终返回全部再routes中,与perms匹配的选项都被添加了进来。

最后再将动态生成的router添加到vuex中的SET_ROUTES。

 分别修改了addRoutes和routes。当然这里并不是真正的router对象。而是vuex中的数据。

最终在GenerateRoutes执行完毕后

 真正地将动态route添加到routers中。

接下来,根据返回的权限数据,调整sidebar-container的选项。

在litemall-admin/src/views/layout/Layout.vue中,包含了sidebar这个组件。

这个组件是定义在litemall-admin/src/views/layout/components/index.js中的。

指向了litemall-admin/src/views/layout/components/Sidebar/index.vue

在该文件中。组件代码

 将该组件的选项与当前的route进行了关联。对于不同的用户权限,会动态地生成选项。

原文地址:https://www.cnblogs.com/xiaoBay/p/14255668.html