zoukankan      html  css  js  c++  java
  • 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进行了关联。对于不同的用户权限,会动态地生成选项。

  • 相关阅读:
    天梯赛 社交集群(并查集)
    蓝桥杯 正则问题(dfs)
    天梯赛L3-001. 凑零钱(01背包记录物品)
    天梯赛/PAT 二叉树总结
    GPLT天梯赛 L2-022. 重排链表
    蓝桥杯 2的次幂表示(递归)
    排列与组合的一些定理
    卡特兰数
    洛谷P1349 广义斐波那契数列(矩阵快速幂)
    Manacher's Algorithm 马拉车算法(最长回文串)
  • 原文地址:https://www.cnblogs.com/xiaoBay/p/14255668.html
Copyright © 2011-2022 走看看