Maison > interface Web > js tutoriel > le corps du texte

Implémenter l'interception des autorisations de la page de connexion et d'inscription en utilisant les technologies vue+vuex+axios (tutoriel détaillé)

亚连
Libérer: 2018-05-31 15:56:37
original
4101 Les gens l'ont consulté

Ci-dessous, je partagerai avec vous un article sur vue+vuex+axios pour implémenter l'interception des autorisations de connexion et d'inscription. Il a une bonne valeur de référence et j'espère qu'il sera utile à tout le monde.

Il existe de nombreux modèles écrits sur GitHub, et ce projet est également basé sur des modèles.

Enregistrez maintenant le processus que j'ai effectué

1 Modifiez BASE_API dans dev.env.js dans le dossier de configuration et changez l'adresse en Changer. la partie publique du backend de requête

BASE_API: '"http://192.168.xx.xx"',
Copier après la connexion

2. L'étape suivante consiste à utiliser le fichier src. Écrivez d'abord le composant view (login.vue, regist.vue), écrivez-le et configurez le chemin dans index.js dans le routeur

login.vue

<template>
 <p class="login-container">
  <el-form autoComplete="on" :model="loginForm" :rules="loginRules" ref="loginForm" label-position="left"
     label-width="0px"
     class="card-box login-form">
   <h3 class="title">登录</h3>
   <el-form-item prop="name">
  <span class="svg-container svg-container_login">
   <svg-icon icon-class="user"/>
  </span>
    <el-input name="name" disabled type="text" v-model="loginForm.name" autoComplete="on"
      placeholder="用户名"/>
   </el-form-item>
   <el-form-item prop="password">
  <span class="svg-container">
   <svg-icon icon-class="password"></svg-icon>
  </span>
    <el-input name="password" :type="pwdType" @keyup.enter.native="handleLogin" v-model="loginForm.password"
      autoComplete="on"
      placeholder="密码"></el-input>
    <span class="show-pwd" @click="showPwd"><svg-icon icon-class="eye"/></span>
   </el-form-item>
   <el-form-item>
    <el-button type="primary" style="width:100%;" :loading="loading" @click.native.prevent="handleLogin">
    登录
    </el-button>
   </el-form-item>
  </el-form>
  </p>
</template>
<script>
 export default {
 name: &#39;login&#39;,
 data() {
  const validateUsername = (rule, value, callback) => {
  if (value.trim().length<1) {
   callback(new Error(&#39;用户名不能为空&#39;))
  } else {
   callback()
  }
  };
  const validatePass = (rule, value, callback) => {
  if (value.trim().length < 1) {
   callback(new Error(&#39;密码不能为空&#39;))
  } else {
   callback()
  }
  };
  return {
  loginForm: {
   name: &#39;&#39;,
   password: &#39;&#39;
  },
  loginRules: {
   name: [{required: true, trigger: &#39;blur&#39;, validator: validateUsername}],
   password: [{required: true, trigger: &#39;blur&#39;, validator: validatePass}]
  },
  loading: false,
  pwdType: &#39;password&#39;
  }
 },
 methods: {
  showPwd() {
  if (this.pwdType === &#39;password&#39;) {
   this.pwdType = &#39;&#39;
  } else {
   this.pwdType = &#39;password&#39;
  }
  },
  handleLogin() {
  this.$refs.loginForm.validate(valid => {
   if (valid) {
   this.loading = true;
   this.$store.dispatch(&#39;Login&#39;, this.loginForm).then(() => {
    this.loading = false;
    this.$router.push({path: &#39;/&#39;});
   }).catch((e) => {
    this.loading = false
   })
   } else {
   console.log(&#39;error submit!!&#39;)
   return false
   }
  })
  }
 }
 }
</script>
Copier après la connexion

router/index.js

{ path: &#39;/login&#39;, component: _import(&#39;Login/login&#39;), hidden: true }
Copier après la connexion

3. Écrivez ce qui suit dans login.js dans l'API L'interface L'adresse d'accueil de bout en bout est définie dans user.js dans les modules des magasins, y compris l'état, les mutations et l'action. L'opération de requête spécifique est écrite en action Login.vue ou register.vue appelle user.js et l'écrit. dans la requête user.js, stockez les getters définis dans getter.js

api/login.js

import request from &#39;@/utils/request&#39;
export function login(name,password) {
 return request({
 url: &#39;/XX/XX&#39;,
 method: &#39;post&#39;,
 data: {
  name,
  password
 } 
 })
}
Copier après la connexion

stores/modules/user.js

  import { login,regist,logout } from &#39;@/api/login&#39;
  import { getToken,setToken } from &#39;@/utils/auth&#39;
  const user = {
  state: {
   name:&#39;&#39;,
   token:&#39;&#39;
  },
  mutations: {
   SET_NAME: (state, name) => {
   state.name = name;
   },
   SET_TOKEN: (state, token) => {
   state.token = token;
   setToken(token);
   }
  },
  actions: {
   // 登录
   Login({ commit }, userInfo) {
   const name = userInfo.name.trim();
   const password = userInfo.password.trim();
   return new Promise((resolve, reject) => {
    login(name, password).then(response => {
    const data = response.data;
    commit(&#39;SET_NAME&#39;, data.name);
    commit(&#39;SET_TOKEN&#39;, data.token);
    setName(data.name);
    setToken(data.token);
    resolve(response); }).catch(error => { reject(error) }) }) },
   // 注册 
   Regist({ commit }, userInfo) { 
   const name= userInfo.name.trim(); 
   const password = userInfo.password.trim(); 
   return new Promise((resolve, reject) => { 
    regist(name, password).then(response => { 
    const data = response.data; 
    commit(&#39;SET_NAME&#39;, data.name); 
    commit(&#39;SET_TOKEN&#39;, data.token);
    setName(data.name);setToken(data.token); 
    resolve(response);
    }).catch(error => { 
    reject(error) }) }) }, 
   // 登出 
   LogOut({ commit, state }) {
   return new Promise((resolve, reject) => {
   logout().then(response => {
    commit(&#39;SET_NAME&#39;, &#39;&#39;);
    commit(&#39;SET_TOKEN&#39;, &#39;&#39;);
    setName(&#39;&#39;);
    setToken(false);
    //removeName();
    //removeToken();
    resolve(response);
   }).catch(error => {
    reject(error)
   })
   })
  }, 
   // 前端 登出 
   FedLogOut({ commit }) { 
   return new Promise(resolve => {
  setToken(false);
 commit(&#39;SET_TOKEN&#39;, false);
 resolve()
   })
   }
  }
  }
  export default user
Copier après la connexion

getter.js :

const getters={
 name:state=>state.user.name,
 token:state=>state.user.token
}
export default getter
Copier après la connexion

4. Gérez les cookies dans auth.js dans les utilitaires, écrivez, lisez, supprimez les autorisations des utilisateurs, signez si vous devez vous connecter, etc.

import Cookies from &#39;js-cookies&#39;
export function setName(name) {
 return Cookies.set("name", name);
}
export function getName() {
 return Cookies.get("name");
}
export function setToken(token) {
 return Cookies.set("token", token);
}
export function getToken() {
 return Cookies.get("token");
}
Copier après la connexion

5. Écrivez une liste blanche dans permission.js, interceptez les sauts en dehors de la liste blanche, puis passez à la connexion, et en même temps déterminez les autorisations de l'utilisateur, s'il faut se connecter, etc.

import router from &#39;./router&#39;
import store from &#39;./store&#39;
import NProgress from &#39;nprogress&#39; // Progress 进度条
import &#39;nprogress/nprogress.css&#39;// Progress 进度条样式
import {Message} from &#39;element-ui&#39;
import {getName, getToken} from "@/utils/auth"; // 验权
const whiteList = [&#39;/login&#39;, &#39;/regist&#39;]; // 不重定向白名单
router.beforeEach((to, from, next) => {
 NProgress.start();
 if (whiteList.indexOf(to.path) !== -1) {
 next();
 } else {
 if (getToken()==="true") {
  next();
  NProgress.done()
 } else {
  next({path: &#39;/login&#39;});
  NProgress.done()
 }
 }
})
router.afterEach(() => {
 NProgress.done() // 结束Progress
})
Copier après la connexion

6. Écrivez le code d'interception dans request.js dans utils, interceptez le code spécifique renvoyé par le backend et effectuez les opérations correspondantes

import axios from &#39;axios&#39;
import { Message, MessageBox } from &#39;element-ui&#39;
import store from &#39;../store&#39;
// 创建axios实例
const service = axios.create({
 baseURL: process.env.BASE_API, // api的base_url
 timeout: 15000     // 请求超时时间
});
// respone拦截器
service.interceptors.response.use(
 response => {
 /**
 * code为非200是抛错 可结合自己业务进行修改
 */
 const res = response.data;
 //const res = response;
 if (res.code !== &#39;200&#39; && res.code !== 200) {
  if (res.code === &#39;4001&#39; || res.code === 4001) {
  MessageBox.confirm(&#39;用户名或密码错误,请重新登录&#39;, &#39;重新登录&#39;, {
   confirmButtonText: &#39;重新登录&#39;,
   cancelButtonText: &#39;取消&#39;,
   type: &#39;warning&#39;
  }).then(() => {
   store.dispatch(&#39;FedLogOut&#39;).then(() => {
    location.reload()// 为了重新实例化vue-router对象 避免bug
   })
  })
  }
  if (res.code === &#39;4009&#39; || res.code === 4009) {
  MessageBox.confirm(&#39;该用户名已存在,请重新注册!&#39;, &#39;重新注册&#39;, {
   confirmButtonText: &#39;重新注册&#39;,
   cancelButtonText: &#39;取消&#39;,
   type: &#39;warning&#39;
  }).then(() => {
   store.dispatch(&#39;FedLogOut&#39;).then(() => {
   location.reload()// 为了重新实例化vue-router对象 避免bug
   })
  })
  }
  return Promise.reject(&#39;error&#39;)
 } else {
  return response.data
 }
 },
 error => {
 Message({
  message: error.message,
  type: &#39;error&#39;,
  duration: 5 * 1000
 });
 return Promise.reject(error)
 }
)
export default service
Copier après la connexion

J'ai compilé ce qui précède pour vous, j'espère que cela vous sera utile à l'avenir.

Articles connexes :

Explication détaillée de l'insertion d'arbre rouge-noir et exemples de méthodes d'implémentation Javascript

js+canvas pour implémenter la fonction de code de vérification du puzzle coulissant

Résumé de la méthode JS de conversion d'objets non-tableaux en tableaux

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!