后台管理系统VUE框架从登陆到权限获取全流程分析

后台管理系统VUE框架从登陆到权限获取全流程分析

1.       首先将后台管理系统前端和后台分别跑起来

1、       前端端口为8080

img1

2、       后台API接口端口为8127

img2

3、       注意需要将后台管理系统前端的API接口的URL改为如下才能连到本地服务调试

img3

2.       我们先登录看能否正常访问后台服务

img4

img5

以上能正常登录到后台管理系统

OK,接下来正式分析整个流程

3.       先分析后台管理系统前端代码,记住我们用的VUE框架

1、       入口在哪儿?入口在“main.js”里面,所要做的工作为:初始化vue实例并使用需要的插件(引入公共element组件等、路由拦截、start登录、鉴权可以在这里统一处理)

img6

以上代码为:App.vue是主组件,所有页面都是在App.vue下进行切换的, router标示为App.vue的子组件所以实际我们将进入“router.js”的路由分析,这个才是整个流程代码的程序入口

2、       分析“router.js”

①        程序跳到入口“router.beforeEach”方法,由于初始化了router

img7

其第一个入口我们设置为:“/Login”登录入口,这个Login.vue的文件放在哪儿的呢?放在“views”->“Login.vue”下面的,那程序是如何找到的呢?

img8

②        还是需要先运行方法:

img9

方法内我做了一步一步的注释打印,从以下代码就可以看到先是找到路由“/Login”

img10

在第一次运行前端代码的时候是需要获取到动态菜单,并根据以上的path获取到页面的路径,代码如下:

img11

因此通过这个动态菜单我们就可以拿到“/Login”的路径在“/views/login”下面,因此整个前端代码初始化会直接跳到我们的登录页面,即如下:

img12

3、       OK,我们这时候跳到登录页面,带入用户名和密码,并调用接口:/admin/customer/login,将参数传到后台

4.       我们进入后台分析登录接口

1、       找到入口路径

img13

img14

由于是总平台,所需还需要带入一个参数:type=1,表示是总平台后台管理系统登录用户

2、       进入login的方法

①        首先我们通过登录的用户名即为手机号customer_phone的参数,并还要判断type=1,state状态是启用的,三个参数去查询用户表customer,取出登录的一条用户,当然如果用户没有查询到我们就提示“账号或密码错误”

img15

②        同时我们还需要进行密码对比判断密码是是否正确,如果不正确也提示“账号或密码错误”,但这个提示也需是我下面的研发人员不够仔细,其实应该分开提示

img16

③        如果以上账号及密码都没有问题的话,我们将调用方法:loginSuccess返回用户相关信息:token、用户手机号、用户头像,用户的roleId(这个是关键字段

img17

以上roleId的获取需要到customerRole用户权限表里面去获取,期获取的标志是“customer_id用户的ID

img18

5.       行了,我们获取到了用户的权限roleId,这个时候就需要重新回到后台管理系统前端代码的“router.js”里面,调用获取权限的方法“permission.init”

img19

这个方法在“permission.js”里面,我们进入“permisssion.js”

①        判断此时时候登陆,如果获取到token,那就表示已经登录,跳过以下代码img20

②        加载菜单,因为我们第一次登录成功后会去调用获取菜单接口的方法“menulist”,如下:

img21

而这个方法在:api/system的js文件里面

img22

即如下方法:

img23

6.       因此根据此接口:/sys/menu/list我们又去到后台服务代码,找到相关的接口文件在“SystemController.java”

 

img24

img25

将tpye=1总平台所有的菜单列表全部查出来

img26

①        传入token查询到customer后台用户表里面查到属于item_type=1的用户

img27

②        再通过item_type=1查询sys_menu系统所有该类型的菜单

img28

7.       再回到后台管理系统的前端代码

img29

通过第六步我们得到了全部菜单列表,并赋值给“_this.menulist”变量,之后我们再调用方法“getPromise”获取该用户的角色菜单,由于在登录后我们将用户的相关信息以上第四点的第2点返回的用户数据保存到了页面缓存里面,并赋值给token变量

img30

因此我们取出token.roleId=10这个权限ID

img31

我们再调用接口“info(roleId)”去后台服务取数据

img32

img33

去“api”->“role.js”里面找接口

img34

8.       我们再次去后台找接口数据:“RoleController.java”

img35

img36

以上我们是从前端传入了一个重要参数:roleId=10,传到后台的,看如下接口图:

img37

img38

①        我们先用roleId=10参数去查询数据库表role

img39

img40

这样能获取到所有该权限为管理员的所有菜单的ids,如上:“627,569...........”当然这个ids是在建立菜单管理就已经写入数据库表role里面了

img41

同样我们根据以上获取到的菜单ids,去数据库表sys_menu菜单管理表里面获取相关菜单所有信息,包括:菜单名字及下级菜单,相应菜单的按钮值等

img42

最后将菜单信息和相应按钮信息返回给前端

img43

img44

9.       前端拿到以上权限roleId=10的身份的菜单及相应按钮后将菜单缓存到变量“set_menu”里面

img45

至此整个该用户从登陆到拿到所属的权限菜单已经分析完毕,再登陆后进入首页或任何菜单切换都需要加载菜单,如下:

img46

从之前的缓冲变量取出菜单数据即可。OK,以上分析为完整流程分析。