大体流程

参考资料:

nx-admin项目地址

首先这里就不讲解vue和vuex之类的基础东西了 有兴趣的可以去官方文档了解。这里根据流程走向大概说说

路由配置

首先找到路由配置,路由配置放在了src/router/index.js路由配置里暴露了两个常量 一个是 constantRouterMap 另外一个是 asyncRouterMap 这里先说说constantRouterMap。 nx-admin的权限验证大概是

  • 1 默认大家都能访问的页面,不需要权限, 都访问的页面定义为 constantRouterMap
  • 2 需要登录或者需要权限的页面路由定义为 asyncRouterMap

根据后台获取到用户信息role(权限)的不同来动态加载asyncRouterMap中meta.role的权限对应的页面

登录成功后做的事情

点击登录以后 左侧的侧边栏有导航列表。 这里提出两个疑问?

  • 根据路由配置说的 动态加载对应的权限路由 那么侧边栏那么多路由 肯定不能写死吧?
  • 我点击登录后 那些登录流程怎么走的?用户权限存在哪里?token在哪里?

侧边栏的动态渲染

根据问题1来回答 首先我们找到layout也就是src/views/layout/Layout.vue
因为在路由配置文件我们看见asyncRouterMap中好多组件的父组件都是LayoutLayout中我们就可以看到有个组件sidebar
ok继续找sidebar这个组件 src/views/layout/components/Sidebar/index.vue,发现这里就是渲染侧边栏的,然后找到渲染的变量是permission_routers 这个变量是存在vuex里面的,也就是说路由是存在vuex的 所以咋们去vuex里面找找看 src/store/modules/permission.js

路由的动态加载

src/store/modules/permission.js 这个文件里面有个actions

 GenerateRoutes({ commit }, data) {return new Promise(resolve => {const { roles } = datalet accessedRoutersif (roles.indexOf('admin') >= 0) {accessedRouters = asyncRouterMap} else {accessedRouters = filterAsyncRouter(asyncRouterMap, roles)}commit('SET_ROUTERS', accessedRouters)resolve()})}

发现就是这一段代码更改了permission_routers,具体逻辑咱们不看 简单解释来说就是

 如果用户的权限是管理员把asyncRouterMap所有的路由页面都渲染出来,毕竟管理员嘛 你懂的权限嘛。否则 我不是管理员但是也不是游客就是一小市民 那么我要去asyncRouterMap中找找我小市民能够访问哪些页面。

看完这段逻辑咋们就知道了这个路由是如何动态更改的了,等等,是不是忘了啥? 虽然我知道这个actions,但是。。。在哪调用的? 经过深思熟虑的着想,在花了0.1s后 就得出,既然是路由嘛 肯定是有个全局的地方要做判断的 所以得出结论就是 router.beforeEach, 一开始去找那个啥src/main.js,发现beforeEach被分离在src/permission.js 打开这个文件。一切疑问都解开了。

用户权限的获取

说真的。。这个文件好长。。都不想看了。。。。 下图的代码这么长 看个毛啊。。于是我简单翻译了下

router.beforeEach((to, from, next) => {NProgress.start() // start progress bar if (getToken()) { // 判断是否有tokenif (to.path === '/login') {next({ path: '/' })NProgress.done() // router在hash模式下 手动改变hash 重定向回来 不会触发afterEach 暂时hack方案 ps:history模式下无问题,可删除该行!} else {if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息store.dispatch('GetUserInfo').then(res => { // 拉取user_infoconst roles = res.data.rolestore.dispatch('GenerateRoutes', { roles }).then(() => { // 生成可访问的路由表router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record})}).catch(() => {store.dispatch('FedLogOut').then(() => {Message.error('Verification failed, please login again')next({ path: '/login' })})})} else {// 没有动态改变权限的需求可直接next() 删除下方权限判断 ↓if (hasPermission(store.getters.roles, to.meta.role)) {next()//} else {next({ path: '/401', query: { noGoBack: true }})NProgress.done() // router在hash模式下 手动改变hash 重定向回来 不会触发afterEach 暂时hack方案 ps:history模式下无问题,可删除该行!}// 可删 ↑}}} else {if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入next()} else {next('/login') // 否则全部重定向到登录页NProgress.done() // router在hash模式下 手动改变hash 重定向回来 不会触发afterEach 暂时hack方案 ps:history模式下无问题,可删除该行!}}
})

请说人话,翻译成人话的版本。。。

  每次更改页面路由你有没有token啊?有啊好的,你的权限是默认的权限0么?是的。。我就是一游客系统获取我的信息..拿到权限值,动态加载路由(GenerateRoutes)...通行...不是。。我是权限汪(admin)等等..我看看作者有没有把你降级没有好了。。你还是权限汪 请进有滚吧,你已经不是权限汪了,作者已经把你写成战斗力只有5的渣渣了没有没有还敢闯这里?滚去关口(/login)

没错,就这么简单。整个权限验证流程就完整了。剩下的就是读读文档啊,看看如何使用组件之类的了。

参考 https://github.com/Relsoul

老板让我十分钟上手nx-admin相关推荐

  1. access 提供程序无法确定object 值_Python | 加一行注释,让你的程序提速10+倍!numba库十分钟上手指南...

    如果你在使用Python进行高性能计算,Numba提供的加速效果可以比肩原生的C/C++程序,只需要在函数上添加一行@jit的装饰.它支持CPU和GPU,是数据科学家必不可少的编程利器. 之前的文章 ...

  2. 十分钟上手2022latex安装与入门

    序言:本次下载是为美赛而用,因此我们选择的下载组合为texlive+texstudio,使用windows10安装.在此提醒大家,类似工具的下载建议大家亲历亲为,不要相信一些诱导性网站,都是非官方的安 ...

  3. 安卓开发 高德地图定位的封装 十分钟上手

    前言 地图作为开发中三方sdk中较常遇到的一项,集成起来并不麻烦但是不小心踩坑可能会浪费较多时间,如果项目中多处使用还容易造成代码大量冗余,今天我们来将高德地图定位功能集成一个功能化模块,只需两分钟应 ...

  4. 微软迷你服务器,十分钟上手 实测微软小企业专属服务器OS

    对于微小企业来说,使用什么样的服务器操作系统才简单.高效的.近日,编者电话调查了十家规模在50--500名员工的企业IT管理员,发现其中有8家企业选择了Windows Server,有两家企业选择了开 ...

  5. conda安装 sklearn_十分钟上手sklearn 安装,获取数据,数据预处理

    sklearn是机器学习中一个常用的python第三方模块,对常用的机器学习算法进行了封装 其中包括: 1.分类(Classification) 2.回归(Regression) 3.聚类(Clust ...

  6. 【链接保存】十分钟上手sklearn:安装,获取数据,数据预处理

    简书地址:https://www.jianshu.com/p/a9168803edc6 博主地址:http://blackblog.tech/2018/02/05/%E5%8D%81%E5%88%86 ...

  7. 【链接保存】十分钟上手sklearn:特征提取,常用模型,交叉验证

    原博客地址:http://blackblog.tech/2018/02/05/%E5%8D%81%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8Bsklearn-1/ 简书地址: ...

  8. 十分钟上手 ES 2020 新特性

    作者 | 浪里行舟 责编 | 郭芮 ES2020 是 ECMAScript 对应 2020 年的版本.这个版本不像 ES6 (ES2015)那样包含大量新特性.但也添加了许多有趣且有用的特性.本文的代 ...

  9. 十分钟上手 React+MirrorX,从此前端大神代码不再难懂 | 原力计划

    作者 | 杨若瑜 来源 | CSDN博客,责编 | 夕颜 头图 | 付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 随着React的普及,很多大厂的前端必备React相关知识,甚至已 ...

最新文章

  1. 经验分享:如何在自己的创业中,用上GPT-3等AI大模型
  2. Dubbo 3.0 前瞻:重塑 Spring Cloud 服务治理
  3. amazon php 空间,如何将PHP图像资源放入Amazon Web Services?
  4. 工业互联网联盟发布工业物联网安全框架
  5. 隐马尔科夫-维特比算法
  6. 发现同义词 python_查找相似/同义词/上下文单词Python
  7. java keytool 工具
  8. 80后小学计算机课上的游戏,80后最值得回味的经典课间游戏
  9. 如何使用Google图片反向搜索图片
  10. 看距离纪念日还有多少天的日历软件 便签自动计算距离纪念日剩余天数
  11. 【译】 SafetyNet: Google's tamper detection - Part 2
  12. 京东商城总架构师刘海锋:世界上本没有架构,建设的需求多了便有了架构
  13. AutoCAD套合(叠加)卫星影像和矢量路网数据-CAD配准
  14. Nginx服务器的使用
  15. markdown标签
  16. 抓手,赋能,勾兑,落盘,组合拳!你听过这些互联网黑话吗?
  17. 计算机版本歌曲,酷我音乐2017旧版大全
  18. Linux文件学习之write函数和写入操作
  19. 来自一位一年半Java开发程序员的忧郁。
  20. MHA+keepalive高可用环境搭建

热门文章

  1. 多线程下HttpContext.Current 的问题
  2. NSJSONSerialization介绍
  3. 使用 angular directive 和 json 数据的 D3 带标签 donut chart示例
  4. Rabbitmq java.util.concurrent.TimeoutException小问题解决
  5. android5.1.1移植教程,iTOP4412开发板Android5.1.1移植教程
  6. c语言考试常考试卷,c语言面试最必考的十道试题,求职必看!!!
  7. 小明一家过桥_【练习】用python解决小明一家过桥问题
  8. zemax设置 像方远心_ZEMAX相机标定非常不完全指南
  9. 电路 晶振频率_都说晶振是电路的心脏,你真的了解它吗?
  10. my-innodb-heavy-4G.cnf 配置文件参数介绍