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

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

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
vue-element-admin中,注册和登录功能是通过/mock/user.js文件中的rest请求进行模拟的。具体来说,该文件定义了一个名为"/vue-element-admin/user/login"的post请求,参数为"loginname",返回一个包含"code"和"tokens"信息的嵌套JSON对象作为响应。"code"是请求的响应码,而"tokens"是用户的单一状态信息,以全局维护的方式存储。 在该文件中,还定义了两个角色和相应的token内容,分别为"admin"和"editor"。每个角色对应的token会在登录时返回给用户。同时,根据token参数,可以通过"user/getInfo"方法获取用户和角色的相关信息。后端需要提供相应的接口来支持这些功能。 注册和登录页面位于/views/login目录中,其中index.vue是登录界面,SocialSignin.vue是第三方登录页面。至于auth-redirect.vue文件的具体作用尚未明确。 在使用vue-element-admin开发时,使用mock.js模拟数据进行用户和权限验证是一项重要的工作。首先需要完成用户集成改造,使用本地测试环境中的用户和角色信息进行登录验证。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vue和Vue-Element-Admin(四):vue-element-admin的用户登录集成](https://blog.csdn.net/yezonggang/article/details/109850163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值