前端登录逻辑总结笔记

news/2024/7/10 0:58:01 标签: vue, 前端

前端登录逻辑总结笔记

在写后台管理系统的时候,学习了一下vue-element-admin的源码,总结了登录的大致逻辑

前端登录大致结构:

<el-form

  ref="loginForm"

  :rules='loginRules'

></el-form>



loginRules: {

    username: [

        { required: true, trigger: "blur", validator: validateUsername }

    ],

    password: [

        { required: true, trigger: "blur", validator: validatePassword }

    ]

  },

  

  

handleLogin() {

  this.$refs.loginForm.validate(valid => {

    if (valid) {

      this.loading = true

      this.$store.dispatch('user/login', this.loginForm)

        .then(() => {

          this.$router.push({ path: this.redirect || '/', query: this.otherQuery })

          this.loading = false

        })

        .catch(() => {

          this.loading = false

        })

    } else {

      console.log('error submit!!')

      return false

    }

  })

}

前端调用el-form的validate方法对rules进行验证,如果验证通过的话把用户登录信息交给vuex的user/loginaction方法进行登陆验证,登陆验证通过的话会重定向到redirect路由,如果redirect不存在则跳转到首页"/"

将用户登录信息交给vuex后,action方法拿到解构后的username和password,调用api中的login方法,将username和password传入,请求成功后获取response中的token,保存到vuex的state状态中,然后将token保存到Cookie中,如果失败则把err reject掉来处理异常

login({ commit }, userInfo) {

    const { username, password } = userInfo

    return new Promise((resolve, reject) => {

      login({ username: username.trim(), password: password }).then(response => {

        const { data } = response

        commit('SET_TOKEN', data.token)

        setToken(data.token)

        resolve()

      }).catch(error => {

        reject(error)

      })

    })

}

这里的login函数是被封装好的api,request方法是基于axios封装的库,vue-ele-admin是封装为service,这个后面再说

import request from '@/utils/request'



export function login(data) {

  return request({

    url: '后端登录接口',

    method: 'post',

    data

  })

}

axios封装为service库

axios有两种拦截,一种是request拦截(请求拦截器),一种是response拦截(响应拦截器)

const service = axios.create({

    baseURL: process.env.VUE_APP_BASE_API,

    timeout: 5000

})

// request拦截

service.interceptors.request.use(

    config => {

        if(store.getters.token) {

            // 定制headers

            config.headers['X-Token'] = getToken()

        }

        return config

    },

    error => {

        // 异常处理

        console.log(error)

        return Promise.reject(error)

    }

)

 //response拦截

service.interceptors.response.use(

response => {

  const res = response.data

  if (res.code !== 20000) {

    //如果状态码返回是错的  那这里会进行进一步判断并处理

   

    if (res.code === 50008 || res.code === 50012 || res.code === 50014) {

      // 50008: Illegal token;

      //50012: Other clients logged in;

      //50014: Token expired;

      // 弹出Message

      // to re-login

      }).then(() => {

        store.dispatch('user/resetToken').then(() => {

         // 如果token失效则刷新token,并

         //刷新页面

        location.reload()

        })

      })

}

    return Promise.reject(new Error(res.message || 'Error'))

  } else {

    return res

  }

},

  error => {

      return Promise.reject(error)

  }

)

首先创建axios示例,它帮助我们完成一些基本的请求功能,更重要的是它的两个拦截器:请求拦截器和响应拦截器,设置请求拦截器的好处是可以在这里添加全局统一的关卡 比如说token,判断是否拥有登录,有则添加到请求参数中去,这样只要请求就会带token,就不需要再在每个接口中写全局统一的参数。

config参数如下:

设置响应拦截器的好处是拦截响应,根据返回的状态码做不同的处理,不同的状态码有不同的意思,这里需要根据接口请求返回的状态码做不同的处理

最后总结一下流程:前端验证登录信息后将用户登录信息交给vuex的action方法,vuex拿到用户信息后调用登录api,成功后将用户token保存到state状态并保存到Cookie中,整个前端的登录逻辑大致就是这样了。虽然整个流程比较简单,但是非常实用!!而且适用面非常广,我在写项目用到登录的话基本上都是这么写的,所以了解上面写的整个前端登录的逻辑应该可以对自己的开发有一点帮助


http://www.niftyadmin.cn/n/1845994.html

相关文章

记录学习React

记录学习React React是什么 React是一个简单的javascript UI库&#xff0c;用于构建高效、快速的用户界面。 React的特点 声明式写法 你只需要描述UI&#xff08;HTML&#xff09;看起来是什么样&#xff0c;就跟写HTML一样&#xff0c;React负责将你写的HTML渲染出来 组…

Electron打包exe文件,node打包

Electron打包exe文件 前几天看了一篇文章&#xff0c;Electron打包exe文件&#xff0c;看评论下面很多小伙伴不理解&#xff0c;所以这里我自己根据自己写的小demo给大家示范一下&#xff0c;不喜勿喷。 认真的看完这篇文章你可能就能得到不小的收获。 开始 首先准备好要打包的…

electron学习笔记

electron学习笔记 electron Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架&#xff0c;它的出现让前端工程师能够用JavaScript写出跨平台的桌面应用&#xff0c;它几乎是前端开发人员开发桌面客户端的唯一途径&#xff0c;最重要的是&#xff0c;我们可…

JS事件循环以及宏任务与微任务

JS事件循环以及宏任务与微任务 先看一道简单题目 console.log(1)setTimeOut(() > console.log(2), 0);console.log(3)相信大部分人的回答都是1,3,2&#xff0c;那这是为什么呢&#xff1f; 其实这是JS的异步原理&#xff0c;先来看一下下面这张图… 我们都知道JavaScript…

axios请求前在header头里面添加token(“可作为用户的唯一标识”)

路由拦截在header头添加access_token&#xff0c;每次发送请求就会先获取session里面存的值&#xff0c;有的话就带着&#xff0c;没有就不带。 // 请求拦截器中统一的修改config.headers &#xff08;token来自登录的时候的返回值&#xff0c;或者单独的接口&#xff0c;取到…

返回上一层

document.referrer源页面信息var refer document.referrer;if(refer ! ""){history.back();}

OpenGL ES for Android 视频缩放、旋转、平移

在上一篇文章中我们介绍了如何使用OpenGL ES预览视频&#xff0c;在文章的末尾提到如果渲染视频的窗口宽高比和视频宽高比不一致会导致视频拉伸&#xff0c;这篇文章将会介绍如何通过视频的缩放来解决这个问题。 我们希望当视频的比例和窗口的比例不一样时&#xff0c;其中一边…

OpenGL ES for Android 相机预览

权限 Android上打开摄像头需要camera权限&#xff0c;在Android 6.0及以上的版本需要动态申请权限&#xff0c;在AndroidManifest.xml中添加camera权限&#xff1a; <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.arvr…