理解vue-element-admin 的登录流程

2023-10-27

1.首先,点击登录按钮,触发handleLogin方法,通过 this.$store.dispatch(“user/login”, this.loginForm)调用vuex中login方法,此处user/login表示的是调用user文件下的login方法

 handleLogin() {
      this.$refs.loginForm.validate((valid) => {
        if (valid) {
          this.loading = true;
          this.$store
            .dispatch("user/login", this.loginForm)
            .then((v) => {
              this.$router.push({
                path: this.redirect || "/dashboard",
                query: this.otherQuery,
              });
              // this.loading = false;
            })
            .catch((e) => {
              // console.log(e);
              this.loading = false;
              if (e.response) {
                this.$message.closeAll();
                this.$message.warning("账号或者密码输入有误");
              }
            });
        } else {
          this.loading = false;
          console.log("error submit!!");
          return false;
        }
      });
    },

2.追踪到user文件下的login方法,开始登录,在login方法中commit mutation中的SET_TOKEN,把后端返回的sessionId作为参数传入。接下来看下mutation的SET_TOKEN

login({ commit }, userInfo) {
    const { username, password, tenant } = userInfo;

    return new Promise((resolve, reject) => {
      login({ username: username.trim(), password, tenant })
        .then(response => {
          console.log(response,'login-res');
          commit("SET_TOKEN", response.sessionId);
          setToken(response.sessionId);//把sessionId存入cookie,每次请求都要携带
          
          // Cookies.set("Authorization", "Bearer " + response.access_token);
          resolve();
        })
        .catch(error => {
          // console.log(error);
          reject(error);
        });
    });
  }, 
export function setToken(token) {
  return Cookies.set(TokenKey, token)
}

3.追踪到mutation下的SET_TOKEN,把传入的sessionId保存到state

SET_TOKEN: (state, token) => {
    state.token = token
  },

4.登录成功后,跳转到首页,路由跳转需要通过路由守卫判断是否登录,逻辑为
检查是否有token
1.1若有,则判断跳转的路由是否是登录页面
1.1.1若是,直接放行
1.1.2若不是,判断vuex里是否保存了当前账号的角色
1.1.2.1若有,直接放行
1.1.2.2若没有,则分别调用getUserInfo()、getInfo()、generateRoutes分别获取当 前账号的用户信息,角色信息,菜单数据等,并存入vuex
1.2若没有,强制跳转到登录页面
router.beforeEach(async(to, from, next) => {
// start progress bar
NProgress.start()

// set page title
document.title = getPageTitle(to.meta.title)

// determine whether the user has logged in
const hasToken = getToken()//获取token

//判断是否有token
if (hasToken) {
//若有,则判断是否跳转到登录
if (to.path === ‘/login’) {//若是跳转到登录,直接放行
// if is logged in, redirect to the home page
next({ path: ‘/’ })
NProgress.done() // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939
} else {//若不是跳转到登录,则需要判断当前账号的角色
// determine whether the user has obtained his permission roles through getInfo
const hasRoles = store.getters.roles && store.getters.roles.length > 0
console.log(store.getters.roles)
if (hasRoles) {//若vuex里已经保存了当前帐号的角色信息(所以在角色权限页面中保存了角色信息后,并没有把角色信息存入vuex,需要重新登录)
next()//直接放行
} else {//若vuex没有当前账号的角色信息
try {
// get info
// note: roles must be a object array! such as: [‘admin’] or ,[‘developer’,‘editor’]
const roles = await store.dispatch(‘user/getInfo’)//获取角色信息

      //get userInfo
      const userInfo = await store.dispatch('user/getuserInfo');//获取用户信息(用户名,电话等信息)
      // generate accessible routes map based on roles
      const accessRoutes = await store.dispatch('permission/generateRoutes', roles)//获取页面菜单信息

      // dynamically add accessible routes
      router.addRoutes(accessRoutes)//动态添加路由
      // hack method to ensure that addRoutes is complete
      // set the replace: true, so the navigation will not leave a history record
      next({ ...to, replace: true })
    } catch (error) {
      // remove token and go to login page to re-login
      await store.dispatch('user/resetToken')
      Message.error(error || 'Has Error')
      next(`/login`)
      NProgress.done()
    }
  }
}

} else {//没有token的话强制跳到登录页面
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
// in the free login whitelist, go directly
next()
} else {
// other pages that do not have permission to access are redirected to the login page.
next(/login)
// ?redirect=${to.path}
NProgress.done()
}
}
})

同理,退出登录的时候需要在state以及cookie中移除token

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解vue-element-admin 的登录流程 的相关文章

  • 在 JavaScript 中将函数映射到生成器上

    我有一个名为generateNumbers在 JavaScript 和另一个生成器中generateLargerNumbers它采用由生成的每个值generateNumbers并应用一个函数addOne对其而言 如下 function ad
  • 使用 React js 和 Express API 服务器通过 fetch 发布对象

    我在 fetch 中的 post 方法遇到麻烦 因为我的服务器从客户端接收到一个空对象 我已经检查了客户端 但无法发送我想要发送的值 这是我的服务器 const express require express const app expre
  • 使用正则表达式验证字符串是否安全

    我有一个网站 用户可以在其中选择用户名 目前 他们可以输入几乎任何字符 包括 ETC 我知道我可以使用正则表达式 这可能就是我的选择 我将使用否定集 我认为这是正确的工具 如下所示 那么 我怎样才能知道要放入该集合中的所有非法字符呢 我可以
  • 在 Cypress 中提取部分文本

    我是 Cypress 的新手 我需要从我的应用程序中提取文本的动态部分 div Hello World greeting number 9123 div 在此示例中 我需要从 div 中提取 9123 以便稍后在测试中使用 知道我应该怎么做
  • LeafletJs只显示一个国家

    我使用 Leafletjs 和 D3 来显示地图 我只想在地图上显示英国 Leaflet和D3是否可以只显示英国 这当然是可能的 现在的解决方案取决于您是想使用 D3 绘制英国 还是想从 Tile Server 获取它 在后一种情况下 有一
  • 如何在D3节点中放置图像?

    到目前为止 我已经创建了这些 D3 节点 用于创建可折叠的层次树 到目前为止 这些节点的颜色为 AA1C1C 深红色 以表明如果您单击它们 它们将扩展到更多节点 我想要做的是在节点中使用图像中的位置 这对于所有用户来说都是一个加号 以知道它
  • 代理阻止网络套接字?如何绕行

    我有一个用 Python 编写的正在运行的 websocket 服务器 来自https github com opiate SimpleWebSocketServer https github com opiate SimpleWebSoc
  • 如何按日期升序对对象进行排序?

    如果我有一个对象列表 var objectList LIST OF OBJECT each object列表中包含三个属性 name date gender 如何按 对列表中的对象进行排序date 属性升序 the date 属性包含字符串
  • Antd datepicker (date.clone/date.load 不是函数)

    我有一个反应应用程序 有一个复选框可以禁用日期选择器 但当我使用复选框禁用它时 我无法选择任何日期 如果我删除复选框及其功能 则不会出现错误 目前 我得到 date clone 不是函数 error const dateFormat YYY
  • 如何检查字符串中是否存在阿拉伯字符(javascript)

    如何用javascript语言检查字符串中是否存在阿拉伯字符 根据维基百科 http en wikipedia org wiki Basic Multilingual Plane 阿拉伯字符属于 Unicode 范围 0600 06FF 因
  • 在 Jscript 中实例化 System.Threading.Thread 对象

    我正在尝试使用 Jscript 创建一个新的 System Threading Thread 对象 但我无法让构造函数工作 如果我只是执行以下操作 var thread new Thread threadFunc function thre
  • 使用Doctype让scrollTop返回0,为什么?

    当我将此 Doctype 放入我的文档中时document body scrollTop返回零 这是为什么 当您使用该 Doctype 时 您会将每个当前浏览器放入所谓的几乎标准模式 http hsivonen iki fi doctype
  • javascript 中的自动转换:像 stringvar = 1+stringvar 这样完成时,不是应该将字符串转换为数字吗?

    火狐32 Win 7 使用暂存器时 var a 2 a 1 1 a console log a typeof a a 1 a 1 console log a typeof a 在控制台中导致 02 string 101 number 难道我
  • 使用 System.js 导入 Typescript 编译的模块时出错

    我最近正在学习使用 system js 导入由 Typescript 编译的模块 这些模块之前是为 require js 编译的 并且工作正常 但是合并到system js时 应用时无法导入模块系统生产 js 控制台说 Uncaught i
  • 输入号码时自动格式化 SSN

    我有一个文本字段 用户输入 SSN 号码 输入自身时 它应该格式化 就像关于文本字段的更改 它应该格式化999 999 999以这种方式在显示器本身上 kottenator 的脚本几乎已经完成 但它每隔 3 位数字就中断该值 而不是 3 位
  • EaselJS Alpha 遮罩滤镜

    我对 Canvas 还很陌生 我一直在尝试将图像颠倒过来EaselJS Alpha 蒙版 http www createjs com demos easeljs alphamaskreveal示例 以便初始图像清晰 并且您可以paint是模
  • 如何使 CSS 动画/过渡以固定速度而不是固定持续时间播放? [复制]

    这个问题在这里已经有答案了 我有一个 CSS 动画 可以使元素沿直线移动未定义的距离 据我所知 动画具有固定的持续时间 因此无论元素必须移动多远 动画始终需要相同的时间来运行 我该如何制作才能使动画没有固定的duration 但有固定的运动
  • Twitter 引导选项卡和 JavaScript 事件

    我正在一个项目中使用 twitter bootstrap 特别是它的选项卡功能 http twitter github com bootstrap javascript html tabs http twitter github com b
  • 如何从 vue 组件调用 App.vue 中的方法

    我有一个 vue 组件和一个 vue 元素声明 如下所示 Vue component todo item template li This is a todo li methods test function I am getting an
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public

随机推荐