day02-登錄模塊-主頁鑒權

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 1.分析登錄流程
    • 1.1傳統思路是登錄校驗通過之后,直接調用接口,獲取token之后,跳轉到主頁
    • 1.2vue-element-admin模板的登錄思路:
  • 2. Vuex中用戶模塊的實現
    • 2.1代碼位置src/store/modules/user.js
      • 2.1.1導出Vuex子模塊-聲明一個狀態token
      • 2.1.2實現token的Vue數據持久化
      • 2.1.3實現登錄的action方法
      • 2.1.4在登錄組件中調用該action方法 代碼位置 src/views/login/index.vue
      • 2.1.5注意:因為user模塊導出的時候namespaced為true,所以我們調用action的時候要加上模塊名稱如user/login
  • 3.Vue-cli代理解決跨域
    • 3.1請求模塊-axios封裝-跨域-區分環境
    • 3.2跨域問題解決才能考慮其他內容的開發
      • 3.2.1為什么會有跨域
      • 3.2.2直接使用前端向后端發請求(后端沒有開啟cors)
        • 3.2.1.1瀏覽器的同源策略會直接限制后端返回的數據給到前端。因為項目是前后端分離的,前端一個服務,后端一個服務,后端不開cors只能前端另想辦法了。
      • 3.2.2代理是怎么解決跨域的?
        • 前端不能直接請求后端服務,中間服務剛好和我們的前端服務同源,前端和中間服務可以通信,而中間服務是node,node后臺向后端發請求是不受同源策略影響的,因為同源策略只針對瀏覽器!!!,這樣就解決了問題,將前端的請求代理給了后端接口。
      • 具體怎么做?
        • 跨域有開發環境跨域和生產環境跨域,我們最后上線的時候要考慮生產環境跨域,目前只需要考慮開發環境。
        • 配置文件可以直接配置代理 vue.config.js
        • 注意:要去掉before這個選項,這個是mock數據,會影響到我們的請求,并且修改完成之后要重啟服務。
  • 4.axios封裝
  • 5.環境區分
        • Vue代碼中NODE_ENV之外,所有的變量必須以VUE_APP_開頭
  • 6.登錄聯調
        • 目前登錄功能只剩下紅色的部分
      • 首先封裝登錄的API請求-代碼位置(src/api/user.js)
      • Vuex中的用戶模塊調用登錄接口(src/store/modules/user.js)
      • 登錄成功后,跳轉到主頁(scr/views/login/index.vue)
      • 區分不同環境的數據-代碼位置(src/views/login/index.vue)
        • 開發環境為了便利,將用戶的賬戶信息和密碼都默認寫在了頁面上,但是真正的項目我們需要把手機號和密碼抹去
  • 7.主頁權限驗證-鑒權
        • 當前項目用戶是否有權限訪問主頁,要考慮當前有沒有token, 如果有token, 用戶還想去登錄頁,我們可以直接去主頁-這個就是免登錄功能。有token的情況下,直接到主頁。
        • 訪問主頁-有token放過,沒有token跳到登錄頁
        • 訪問登錄-有token跳到主頁,沒有token放過
        • src/pemission.js


1.分析登錄流程

在這里插入圖片描述

1.1傳統思路是登錄校驗通過之后,直接調用接口,獲取token之后,跳轉到主頁

1.2vue-element-admin模板的登錄思路:

  1. 首先校驗登錄表單通過
  2. 調用Vuex提供的登錄的action
  3. 登錄的Action中去調用接口
  4. 登錄接口如果成功執行,會返回token
  5. 利用Vuex的特性,將token共享的到Vuex中,這樣Vuex就統一管理了token,別的地方想要使用,直接通過Vuex就可以
  6. 登錄接口會調用單獨封裝的請求模塊(api)
  7. 請求模塊中又會使用到axios封裝的請求工具
  8. 而請求工具又要考慮區分 開發環境和生產環境的問題
  9. 請求時還要考慮前后分離項目產生的跨域問題,要使用代理解決跨域

2. Vuex中用戶模塊的實現

2.1代碼位置src/store/modules/user.js

2.1.1導出Vuex子模塊-聲明一個狀態token

const state = {token:null
}
const mutations = {};
const actions = {};
export default{namespaced:true,state,mutations,actions
}

2.1.2實現token的Vue數據持久化

import {getToken,setToken,removeToken } from '@/utils/auth'
const state = {token:getToken(),//從緩存中讀取初始值
}
const mutations = {setToken(state,token){state.token = token//同步到緩存setToken(token) },removeToken(state){//刪除Vuex的tokenstate.token = null;removeToken() }
}
export default{namespaced:true,//開啟命名空間state,mutations,actions
}

2.1.3實現登錄的action方法

const actions = {//context上下文,傳入參數async login(context,data){console.log(data)//todo:調用登錄接口const token = await login(data);//返回一個token context.commit('setToken',token) }
}

2.1.4在登錄組件中調用該action方法 代碼位置 src/views/login/index.vue

export default{methods:{login(){this.$refs.form.validate((isok)=>{if(isok){this.$store.dispatch("user/login",this.loginForm)} }) } }
}

2.1.5注意:因為user模塊導出的時候namespaced為true,所以我們調用action的時候要加上模塊名稱如user/login

3.Vue-cli代理解決跨域

3.1請求模塊-axios封裝-跨域-區分環境

在這里插入圖片描述

3.2跨域問題解決才能考慮其他內容的開發

3.2.1為什么會有跨域

3.2.2直接使用前端向后端發請求(后端沒有開啟cors)

3.2.1.1瀏覽器的同源策略會直接限制后端返回的數據給到前端。因為項目是前后端分離的,前端一個服務,后端一個服務,后端不開cors只能前端另想辦法了。

3.2.2代理是怎么解決跨域的?

在這里插入圖片描述

前端不能直接請求后端服務,中間服務剛好和我們的前端服務同源,前端和中間服務可以通信,而中間服務是node,node后臺向后端發請求是不受同源策略影響的,因為同源策略只針對瀏覽器!!!,這樣就解決了問題,將前端的請求代理給了后端接口。

具體怎么做?

跨域有開發環境跨域和生產環境跨域,我們最后上線的時候要考慮生產環境跨域,目前只需要考慮開發環境。
配置文件可以直接配置代理 vue.config.js
devServer:{port:port,open:true,overlay:{warnings:false,errors:true },proxy:{'/api':{target:'https://' } }
}
注意:要去掉before這個選項,這個是mock數據,會影響到我們的請求,并且修改完成之后要重啟服務。

4.axios封裝

  1. 完成了代理跨域,就可以考慮axios的封裝了
    在這里插入圖片描述

  2. axios封裝主要封裝做哪些

  3. 基礎地址,超時時間

  4. 請求攔截器-統一注入token

  5. 響應攔截器-解構數據-處理異常
    在這里插入圖片描述

  6. axios的基礎功能
    在這里插入圖片描述

  7. 位置 src/utils/request.js

import axios from 'axios'
import store from '@/store'
const service = axios.create({baseURL:'/api',timeout:1000,
})
service.interceptors.request.use((config)=>{//注入token//this.$store.getters//store.getters.token =>請求頭里面if(store.getters.token){config.headers.Authorization = `Bearer ${store.getters.token}`}return config
},(error)=>{//失敗執行promisereturn Promise.reject(error)
})
//響應攔截器
service.interceptors.response.use((response)=>{const {data,message,success} = response.data;//默認json格式if(success){return data}else{Message({type:'error',message})return Promise.reject(new Error(message))}
},async(error)=>{Message({type:'error',message:error.message})return Promise.reject(error)
})
export default service

5.環境區分

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

Vue代碼中NODE_ENV之外,所有的變量必須以VUE_APP_開頭

在這里插入圖片描述

6.登錄聯調

目前登錄功能只剩下紅色的部分

在這里插入圖片描述

首先封裝登錄的API請求-代碼位置(src/api/user.js)

import request from '@/utils/request'
export function login(data){return request({url:'/sys/login',method:'post',data})
}

Vuex中的用戶模塊調用登錄接口(src/store/modules/user.js)

const actions = {//context上下文,傳入參數async login(context,data){console.log(data);const token = await login(data)//返回一個token context.commit('setToken',token)}
}

登錄成功后,跳轉到主頁(scr/views/login/index.vue)

methods:{login(){this.$refs.form.validate((isok)=>{if(isok){await this.$store.dispatch('user/login',this.loginForm)//Vuex中的action 返回的promise//跳轉主頁this.$router.push('/')}})}
}

區分不同環境的數據-代碼位置(src/views/login/index.vue)

開發環境為了便利,將用戶的賬戶信息和密碼都默認寫在了頁面上,但是真正的項目我們需要把手機號和密碼抹去
export default{name:'Login',data(){return{loginForm:{mobile:process.env.NODE_ENV === 'development'? '13800000002':'',password:process.env.NODE_ENV === 'development'?'123456':'',isAgree:process.env. NODE_ENV === 'development'}} }
}

7.主頁權限驗證-鑒權

當前項目用戶是否有權限訪問主頁,要考慮當前有沒有token, 如果有token, 用戶還想去登錄頁,我們可以直接去主頁-這個就是免登錄功能。有token的情況下,直接到主頁。

在這里插入圖片描述

訪問主頁-有token放過,沒有token跳到登錄頁
訪問登錄-有token跳到主頁,沒有token放過
src/pemission.js
import router from '@/router'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
import store from '@/store'
//前置守衛
const whiteList = ['/login','/404']
router.beforeEach(async(to,from,next)=>{nprogress.start()if(store.getters.token){//存在tokenif(to.path === '/login'){//跳轉到主頁next('/');//并沒有執行后置守衛nprogress.done()}else{next()//放行}}else{//沒有tokenif(whiteList.includes(to.path)){next()}else{next('/login')//中轉到登錄頁 nprogress.done() }}
})
//后置守衛
router.afterEach(()=>{nprogress.done()
})

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36793.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36793.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信息(文字、圖像、音頻、視頻等)在計算機中是如何存儲及顯示的

信息(文字、圖像、音頻、視頻等)在計算機中是如何存儲及顯示的 圖片的存儲圖片的文件格式像素數據的二進制表示存儲和處理顯示總結 圖片的顯示4. 像素點控制具體的像素控制過程示例總結 如題,這里以圖片為例。 圖片的存儲 計算機桌面上的一…

基于盲信號處理的聲音分離-基于改進的信息最大化的ICA算法

基于信息最大化的ICA算法的主要依據是使輸入端與輸出端的互信息達到最大,且輸出各個分量之間的相關性最小化,即輸出各個分量之間互信息量最小化,其算法的系統框圖如圖所示。 基于信息最大化的ICA算法的主要依據是使輸入端與輸出端的互信息達到…

華僑大學24計算機考研數據速覽,專碩22408復試線290分,學碩11408接收調劑!

華僑大學計算機專業創建于1980年,是福建省最早設立計算機專業的高校之一。1982年成立計算機系,2008年成立計算機科學與技術學院。根據“華僑大學計算機科學與技術學院網站”資料,該院有計算機科學與技術、軟件工程、網絡工程3個本科專業&…

java中常見數據結構

ArrayList 是 Java 集合框架&#xff08;Java Collections Framework&#xff09;中的一個重要類&#xff0c;它實現了 List 接口&#xff0c;并提供了動態數組的功能。以下是 ArrayList 上的一些常用方法&#xff1a; 構造方法&#xff1a; ArrayList<E>(): 構造一個空的…

git基本使用(二):git分支的操作命令

Git 的多分支管理是指在同一個倉庫中創建和管理多個分支&#xff0c;每個分支可以獨立開發&#xff0c;互不干擾。分支是 Git 中的一種強大功能&#xff0c;允許開發人員同時在多個不同的功能、修復或實驗上工作&#xff0c;而不會影響主分支或其他分支。通過多分支管理&#x…

spring-boot-starter-json配置對象屬性為空不顯示

問題背景 在Spring Boot中使用spring-boot-starter-json&#xff08;通常是通過jackson實現的&#xff09;時&#xff0c;如果你希望在序列化對象時&#xff0c;如果某個屬性為空&#xff0c;則不顯示該屬性&#xff0c;你可以使用JsonInclude注解來實現這一點。 pom.xml <…

Java數據結構算法(最長遞增序列二分查找)

前言: 最長遞增子序列&#xff08;Longest Increasing Subsequence, LIS&#xff09;是指在一個給定的序列中&#xff0c;找到一個最長的子序列&#xff0c;使得這個子序列中的元素是單調遞增的。子序列不要求在原序列中連續。 實現原理 使用一個 tails 列表&#xff0c;其中…

Java對象集合按照指定元素順序排序

需求背景 最近在對一個集合列表的數據進行排序&#xff0c;需求是要集合數據按照一個排序狀態值進行排序&#xff0c;而這個狀態值&#xff0c;不是按照從小到大這樣的順序排序的&#xff0c;而是要按照特定的順序&#xff0c;比如按照1, 0, 2的順序排的&#xff0c;所以需要自…

clickhouse count和uniqCombined

count(distinct ) 和 uniqCombined 獲取去重后的總數。 去重&#xff1a;order by distinct argMax group by 哪個好&#xff1f;&#xff1f; clickhouse數據去重函數介紹&#xff08;count distinct&#xff09;_clickhouse distinct-CSDN博客

stm32-USART通信

什么是usart&#xff1f;和其他通信又有什么區別&#xff1f; 如下圖&#xff1a; USART是一種用于串行通信的設備&#xff0c;可以在同步和異步模式下工作。 usart有兩根數據線&#xff0c;一根發送線&#xff08;tx&#xff09;一根接收線&#xff08;rx&#xff09;&#x…

2D卷積核處理3D(時序)數據

2D卷積核處理3D&#xff08;時序&#xff09;數據 一、Make A Video的處理方法&#xff08;PseudoConv3d&#xff09;二、Tune A Video的處理方法&#xff08;InflatedConv3d&#xff09;比較與分析相似點不同點結論 Conv2D一般用于處理image&#xff0c;dim一般是4&#xff0c…

準備了一些簡單的面試題

當了一次面試官&#xff0c;主要是面試爬蟲崗位&#xff0c;具體涉及scrapy爬蟲框架和一些數據存儲的小問題。具體的問題如下&#xff1a; scrapy框架如何將單機版爬蟲改為分布式爬蟲【使用scrapy_redis】&#xff0c;具體來講需要修改哪幾個組件的哪些具體部分Spider 1. 如何…

python3 List常用函數詳細解釋

python中 列表&#xff08;list&#xff09;的copy辦法 1.先解決一個報錯。 a [1,2,3] b a.copy print( b)報錯&#xff1a; AttributeError: builtin_function_or_method object has no attribute copy這是因為a.copy語句并沒有執行copy函數&#xff0c;而是把a.copy這個函…

React Antd ProTable 如何設置類似于Excel的篩選框

React Antd ProTable 如何設置類似于Excel的篩選框 目標&#xff1a;在web頁面的table表格中完成類似于EXCEL的Filter篩選功能。 示例圖&#xff1a;點擊標題列上方的漏斗狀圖標&#xff0c;即可對數據進行篩選。 ProTable 前景提要 ProTable API中有說明&#xff0c;是有…

解決所有終端中文輸出亂碼的問題

一、系統自帶的cmd.exe 以及 Git的bash.exe、sh.exe、git-bash.exe和git-cmd.exe&#xff0c;和PowerShell默認使用“當前系統區域設置”設定好的936 (ANSI/OEM - 簡體中文 GBK)語言編碼。 1、[當前代碼頁] 的936 (ANSI/OEM - 簡體中文 GBK) 是導致中文亂碼的原因 在控制面板→…

網絡抓包分析工具

摘要 隨著網絡技術的快速發展&#xff0c;網絡數據的傳輸和處理變得日益復雜。網絡抓包分析工具作為網絡故障排查、性能優化以及安全審計的重要工具&#xff0c;對于提升網絡管理的效率和準確性具有重要意義。本文旨在設計并實現一款高效、易用的網絡抓包分析工具&#xff0c;…

期末測試一

字符數組的排序注意的問題 &#xff1a; 1.對于輸入字符的時候 如果給出了要輸入幾個字符 n >>>>> for ( i 0 ; i < n ;i ) { scanf("%c",&ch); } 如果說直到輸入到換行符結束 >>>>>>while ( ch! \ n ) 這個需要額…

CSS|04 復合選擇器偽類選擇器屬性選擇器美化超鏈接

基本選擇器&#xff1a;見上篇基本選擇器 復合選擇器選擇器1,選擇器2{屬性:值;} 多元素選擇器&#xff0c;同時匹配選擇器1和選擇器2&#xff0c;多個選擇器之間用逗號分隔舉例&#xff1a; p,h1,h2{margin:0px;}E F{屬性:值;} 后代元素選擇器&#xff0c;匹配所有屬于E元素后…

基于長短時記憶網絡LSTM的TE過程故障診斷(MATLAB R2021B)

實驗所用 TE 仿真過程的數據集是網上公開的數據集&#xff0c;該數據集中的訓練集和測試集分別包含 20 種故障工況和一種正常工況數據&#xff0c;其中所采集的每個樣本信號包含 41 個測量變量和 11 個控制變量&#xff0c;所以每個時刻采集到的樣本有 52 個觀測變量。 TE 仿真…

NoSQL之Redis配置與管理

目錄 一、關系型數據庫和非關系型數據庫 1.關系型數據庫 2.非關系型數據庫 3.關系型數據庫和非關系型數據庫區別 二、Redis 1.Redis簡介 2.Redis 的優點 3.Redis 使用場景 4.Redis的數據類型 5.哪些數據適合放入緩存中&#xff1f; 6.Redis為什么這么快&#xff1f;…