国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

vue+vuex+axios實(shí)現(xiàn)登錄、注冊(cè)頁權(quán)限攔截

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:17:44
文檔

vue+vuex+axios實(shí)現(xiàn)登錄、注冊(cè)頁權(quán)限攔截

vue+vuex+axios實(shí)現(xiàn)登錄、注冊(cè)頁權(quán)限攔截:在GitHub上有很多寫好的模板,這個(gè)項(xiàng)目也是基于模板做的。 現(xiàn)在記錄一下我做的過程 1、修改config文件夾里的dev.env.js里的BASE_API,把地址改成請(qǐng)求后端的公共部分 BASE_API: 'http://192.168.xx.xx', 2、接下來就是操作src文件,先在
推薦度:
導(dǎo)讀vue+vuex+axios實(shí)現(xiàn)登錄、注冊(cè)頁權(quán)限攔截:在GitHub上有很多寫好的模板,這個(gè)項(xiàng)目也是基于模板做的。 現(xiàn)在記錄一下我做的過程 1、修改config文件夾里的dev.env.js里的BASE_API,把地址改成請(qǐng)求后端的公共部分 BASE_API: 'http://192.168.xx.xx', 2、接下來就是操作src文件,先在

在GitHub上有很多寫好的模板,這個(gè)項(xiàng)目也是基于模板做的。

現(xiàn)在記錄一下我做的過程

1、修改config文件夾里的dev.env.js里的BASE_API,把地址改成請(qǐng)求后端的公共部分

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里寫好與后端對(duì)接的接口地址,在stores里的modules里的user.js里定義user,有state,mutations,action,具體的請(qǐng)求操作寫在action里,login.vue或regist.vue調(diào)用user.js里寫好的請(qǐng)求,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) }) }) },
 // 注冊(cè) 
 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里對(duì)cookies進(jìn)行操作,寫入,讀取,刪除用戶權(quán)限,是否登錄的標(biāo)志等

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里寫白名單,對(duì)白名單以外的跳轉(zhuǎn)進(jìn)行攔截然后跳轉(zhuǎn)登錄,同時(shí)判斷用戶權(quán)限,是否登錄,等

import router from './router'
import store from './store'
import NProgress from 'nprogress' // Progress 進(jìn)度條
import 'nprogress/nprogress.css'// Progress 進(jìn)度條樣式
import {Message} from 'element-ui'
import {getName, getToken} from "@/utils/auth"; // 驗(yàn)權(quán)
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() // 結(jié)束Progress
})

6、utils里的request.js里寫攔截碼,對(duì)后端返回的特定碼進(jìn)行攔截然后做相應(yīng)的操作

import axios from 'axios'
import { Message, MessageBox } from 'element-ui'
import store from '../store'
// 創(chuàng)建axios實(shí)例
const service = axios.create({
 baseURL: process.env.BASE_API, // api的base_url
 timeout: 15000 // 請(qǐng)求超時(shí)時(shí)間
});
// respone攔截器
service.interceptors.response.use(
 response => {
 /**
 * code為非200是拋錯(cuò) 可結(jié)合自己業(yè)務(wù)進(jìn)行修改
 */
 const res = response.data;
 //const res = response;
 if (res.code !== '200' && res.code !== 200) {
 if (res.code === '4001' || res.code === 4001) {
 MessageBox.confirm('用戶名或密碼錯(cuò)誤,請(qǐng)重新登錄', '重新登錄', {
 confirmButtonText: '重新登錄',
 cancelButtonText: '取消',
 type: 'warning'
 }).then(() => {
 store.dispatch('FedLogOut').then(() => {
 location.reload()// 為了重新實(shí)例化vue-router對(duì)象 避免bug
 })
 })
 }
 if (res.code === '4009' || res.code === 4009) {
 MessageBox.confirm('該用戶名已存在,請(qǐng)重新注冊(cè)!', '重新注冊(cè)', {
 confirmButtonText: '重新注冊(cè)',
 cancelButtonText: '取消',
 type: 'warning'
 }).then(() => {
 store.dispatch('FedLogOut').then(() => {
 location.reload()// 為了重新實(shí)例化vue-router對(duì)象 避免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

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

vue+vuex+axios實(shí)現(xiàn)登錄、注冊(cè)頁權(quán)限攔截

vue+vuex+axios實(shí)現(xiàn)登錄、注冊(cè)頁權(quán)限攔截:在GitHub上有很多寫好的模板,這個(gè)項(xiàng)目也是基于模板做的。 現(xiàn)在記錄一下我做的過程 1、修改config文件夾里的dev.env.js里的BASE_API,把地址改成請(qǐng)求后端的公共部分 BASE_API: 'http://192.168.xx.xx', 2、接下來就是操作src文件,先在
推薦度:
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 日韩国产在线观看 | 在线观看亚洲 | 美日韩中文字幕 | 国产一区二区三区毛片 | 亚洲成人99| 亚洲精品乱码久久久久久v 亚洲精品免费观看 | 亚洲欧美日韩中文字幕在线 | 欧美亚洲综合在线观看 | 国内一区亚洲综合图区欧美 | 久久久久国产精品美女毛片 | 91精品一区二区三区久久久久 | 中文字幕一区二区三区四区 | 精品国产综合成人亚洲区 | 国产日韩一区 | 夜精品a一区二区三区 | 韩国精品一区二区 | 久久国产成人精品国产成人亚洲 | 精品视频二区 | 国产成人精品免费视频大全可播放的 | 日日久 | 日韩欧美亚洲国产高清在线 | 视频国产精品 | 日本成人一级 | 欧美日韩国产一区二区三区不卡 | 欧美日韩国产一区二区 | 成人a毛片免费视频观看 | 日韩欧美一区二区三区在线播放 | 亚洲欧美日韩中文字幕在线 | 久久久久久久国产精品 | 欧美日韩国产一区 | 国产成人麻豆精品video | 中文字幕日韩一区二区三区不卡 | 国产一区二区不卡 | 亚洲欧美国产精品 | 国产成人一区二区三区小说 | 亚洲伊人色 | 国产视频久久久 | 国产精品久久久久999 | 国产精品亚洲一区二区三区在线播放 | 亚洲伊人国产 | 欧美成人亚洲高清在线观看 |