<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
        主站蜘蛛池模板: 特级淫片国产免费高清视频| 亚洲精品免费视频| 免费无码一区二区三区蜜桃大| 亚洲精品美女久久久久| 午夜免费福利小电影| 亚洲AV日韩AV高潮无码专区| 成全动漫视频在线观看免费高清版下载 | 久久久久亚洲AV无码专区网站| 永久免费无码日韩视频| 国产91久久久久久久免费| 午夜在线亚洲男人午在线| 亚洲精品无码久久久| 人妻在线日韩免费视频| 亚洲成a人片在线观看无码| 久久午夜夜伦鲁鲁片无码免费| 亚洲麻豆精品果冻传媒| 91精品免费在线观看| 亚洲欧美日本韩国| 国产aa免费视频| 成全在线观看免费观看大全| 亚洲美女视频网站| 亚洲第一成年免费网站| 亚洲精品中文字幕| 亚洲区不卡顿区在线观看| 中文字幕视频在线免费观看| 亚洲视频免费在线看| 毛片a级毛片免费观看品善网| 国产亚洲精品AAAA片APP| 亚洲性日韩精品国产一区二区| 免费黄色电影在线观看| 亚洲一区动漫卡通在线播放| 夫妻免费无码V看片| a级毛片免费观看在线| 亚洲综合日韩中文字幕v在线| 成人免费无码视频在线网站| 一区免费在线观看| 亚洲视频一区在线| 亚洲国产中文字幕在线观看| 免费黄网站在线看| 亚洲AV无码专区亚洲AV桃| 亚洲永久精品ww47|