首頁  >  文章  >  web前端  >  透過利用vue+vuex+axios這幾種技術實現登入、註冊頁權限攔截(詳細教學)

透過利用vue+vuex+axios這幾種技術實現登入、註冊頁權限攔截(詳細教學)

亚连
亚连原創
2018-05-31 15:56:374096瀏覽

下面我就為大家分享一篇vue vuex axios實現登入、註冊頁權限攔截,具有很好的參考價值,希望對大家有幫助。

在GitHub上有很多寫好的模板,這個專案也是基於模板做的。

現在錄下我做的過程

#1、修改config資料夾裡的dev.env.js裡的BASE_API,把位址改成請求後端的公共部分

BASE_API: '"http://192.168.xx.xx"',

2、接下來就是操作src文件,先在views裡寫好vew元件(login.vue,regist. vue),寫好到router裡的index.js裡設定好路徑

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>

router/index.js

{ path: &#39;/login&#39;, component: _import(&#39;Login/login&#39;), hidden: true }

#3、在api裡的login.js裡寫好與後端對接的介面位址,在stores裡的modules裡的user.js裡定義user,有state,mutations,action,具體的請求操作寫在action裡,login.vue或regist.vue呼叫user.js裡寫好的請求,getter.js裡定義store的getters

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
 } 
 })
}

##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

getter.js:

const getters={
 name:state=>state.user.name,
 token:state=>state.user.token
}
export default getter

4、在utils裡的auth.js裡對cookies進行操作,寫入,讀取,刪除使用者權限,是否登入的標誌等

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");
}

# #5、在permission.js裡寫白名單,對白名單以外的跳轉進行攔截然後跳轉登錄,同時判斷用戶權限,是否登錄,等

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
})

6、utils裡的request.js裡寫攔截碼,對後端返回的特定碼進行攔截然後做相應的操作

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

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

紅黑樹的插入詳解及Javascript實作方法範例


js canvas實作滑動拼圖驗證碼函數


JS從非陣列物件轉數組的方法小結


############### ####

以上是透過利用vue+vuex+axios這幾種技術實現登入、註冊頁權限攔截(詳細教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn