国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue+vuex+axios實現登錄、注冊頁權限攔截

2019-11-19 14:12:25
字體:
來源:轉載
供稿:網友

在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> <div 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>  </div></template><script> export default { name: 'login', data() {  const validateUsername = (rule, value, callback) => {  if (value.trim().length<1) {   callback(new Error('用戶名不能為空'))  } else {   callback()  }  };  const validatePass = (rule, value, callback) => {  if (value.trim().length < 1) {   callback(new Error('密碼不能為空'))  } else {   callback()  }  };  return {  loginForm: {   name: '',   password: ''  },  loginRules: {   name: [{required: true, trigger: 'blur', validator: validateUsername}],   password: [{required: true, trigger: 'blur', validator: validatePass}]  },  loading: false,  pwdType: 'password'  } }, methods: {  showPwd() {  if (this.pwdType === 'password') {   this.pwdType = ''  } else {   this.pwdType = 'password'  }  },  handleLogin() {  this.$refs.loginForm.validate(valid => {   if (valid) {   this.loading = true;   this.$store.dispatch('Login', this.loginForm).then(() => {    this.loading = false;    this.$router.push({path: '/'});   }).catch((e) => {    this.loading = false   })   } else {   console.log('error submit!!')   return false   }  })  } } }</script>

router/index.js

{ path: '/login', component: _import('Login/login'), 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 '@/utils/request'export function login(name,password) { return request({ url: '/XX/XX', method: 'post', data: {  name,  password }  })}

stores/modules/user.js

  import { login,regist,logout } from '@/api/login'  import { getToken,setToken } from '@/utils/auth'  const user = {  state: {   name:'',   token:''  },  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('SET_NAME', data.name);    commit('SET_TOKEN', 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('SET_NAME', data.name);     commit('SET_TOKEN', 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('SET_NAME', '');    commit('SET_TOKEN', '');    setName('');    setToken(false);    //removeName();    //removeToken();    resolve(response);   }).catch(error => {    reject(error)   })   })  },    // 前端 登出    FedLogOut({ commit }) {    return new Promise(resolve => {  setToken(false); commit('SET_TOKEN', 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 'js-cookies'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 './router'import store from './store'import NProgress from 'nprogress' // Progress 進度條import 'nprogress/nprogress.css'// Progress 進度條樣式import {Message} from 'element-ui'import {getName, getToken} from "@/utils/auth"; // 驗權const whiteList = ['/login', '/regist']; // 不重定向白名單router.beforeEach((to, from, next) => { NProgress.start(); if (whiteList.indexOf(to.path) !== -1) { next(); } else { if (getToken()==="true") {  next();  NProgress.done() } else {  next({path: '/login'});  NProgress.done() } }})router.afterEach(() => { NProgress.done() // 結束Progress})

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

import axios from 'axios'import { Message, MessageBox } from 'element-ui'import store from '../store'// 創建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 !== '200' && res.code !== 200) {  if (res.code === '4001' || res.code === 4001) {  MessageBox.confirm('用戶名或密碼錯誤,請重新登錄', '重新登錄', {   confirmButtonText: '重新登錄',   cancelButtonText: '取消',   type: 'warning'  }).then(() => {   store.dispatch('FedLogOut').then(() => {    location.reload()// 為了重新實例化vue-router對象 避免bug   })  })  }  if (res.code === '4009' || res.code === 4009) {  MessageBox.confirm('該用戶名已存在,請重新注冊!', '重新注冊', {   confirmButtonText: '重新注冊',   cancelButtonText: '取消',   type: 'warning'  }).then(() => {   store.dispatch('FedLogOut').then(() => {   location.reload()// 為了重新實例化vue-router對象 避免bug   })  })  }  return Promise.reject('error') } else {  return response.data } }, error => { Message({  message: error.message,  type: 'error',  duration: 5 * 1000 }); return Promise.reject(error) })export default service

以上就是登錄注冊的核心部分,寫的不對的地方請指教

這篇vue+vuex+axios實現登錄、注冊頁權限攔截就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 仁化县| 辉县市| 静乐县| 肥乡县| 高碑店市| 绵竹市| 阿克苏市| 东辽县| 海晏县| 安庆市| 郁南县| 日喀则市| 南川市| 广河县| 罗田县| 安乡县| 宁晋县| 湖口县| 贵德县| 清河县| 通辽市| 浏阳市| 平凉市| 乌兰浩特市| 绥阳县| 工布江达县| 黄山市| 龙江县| 竹北市| 南岸区| 浦东新区| 芦溪县| 镇雄县| 天门市| 咸宁市| 大方县| 莒南县| 华安县| 潍坊市| 固镇县| 深州市|