<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 22:17:44
        文檔

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

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

        在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

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日韩免费观看一级毛片看看| 在线综合亚洲中文精品| 国产亚洲精品免费视频播放| 亚洲精品中文字幕乱码三区| 久久亚洲国产成人精品性色| 国产成人精品日本亚洲18图| 可以免费看黄视频的网站| 免费少妇a级毛片人成网| 亚洲AV成人片色在线观看| MM1313亚洲国产精品| 97超高清在线观看免费视频| 欧洲乱码伦视频免费| 亚洲综合无码无在线观看| a级毛片无码免费真人久久| 亚洲精品狼友在线播放| 无码免费一区二区三区免费播放| 国产一级淫片免费播放电影| 亚洲成AV人片久久| 99视频免费在线观看| 久久亚洲成a人片| 免费黄色网址网站| 亚洲AV无码欧洲AV无码网站| 成人精品国产亚洲欧洲| 亚洲成a人片在线观看日本麻豆| 亚洲一区二区影视| 美女视频黄的免费视频网页 | 一区二区三区AV高清免费波多| 国产99视频精品免费专区| 亚洲成AV人在线观看网址| 黄页免费在线观看| 亚洲欧洲精品在线| 亚洲精品免费观看| 77777亚洲午夜久久多喷| 亚洲精品无码永久在线观看 | 超清首页国产亚洲丝袜| 精品无码AV无码免费专区| 亚洲精品国产精品乱码不99| 99久久这里只精品国产免费| 亚洲视频手机在线| 18禁止看的免费污网站| 久久丫精品国产亚洲av不卡|